Compare commits

..

883 Commits

Author SHA1 Message Date
Ankush Menat
0255642deb Merge branch 'develop' into fix-get_single_value 2024-01-10 10:42:12 +05:30
Ankush Menat
2178fdc65a fix: get_single_value doesn't support multiple fields 2024-01-10 10:39:45 +05:30
0xD0M1M0
eabf706f37 fix: projects website list visible for guests and all logged in customers (#39164)
* fix: projects website list visible for guests

fix: projects website list visible for guests and all logged in customers

see the issue for details

fixes issue #39009

* fix: remove user = frappe.session.user
2024-01-10 10:29:38 +05:30
barredterra
d4d9e6c6fa test: fix wrong fieldname 2024-01-10 01:25:24 +01:00
barredterra
2eb318a5ce fix: wrong usage of get_single_value 2024-01-10 00:53:05 +01:00
Ankush Menat
b897225136 fix: Remove reference to non-existing doctype 2024-01-09 22:04:24 +05:30
Ankush Menat
bb18ae82cf refactor: use db.get_single_value 2024-01-09 21:57:50 +05:30
s-aga-r
74ceb6da5e Merge pull request #39242 from s-aga-r/FIX-8184
fix: skip rate validation for return `DN Items` with `Moving Average` valuation
2024-01-09 21:45:45 +05:30
s-aga-r
e0ad52b500 fix: skip rate validation for return DN Items with Moving Average valuation 2024-01-09 21:18:19 +05:30
s-aga-r
8252d92e6a Merge pull request #39262 from s-aga-r/FIX-8208
fix: Duplicate Closing Stock Balance
2024-01-09 19:31:53 +05:30
s-aga-r
b15795392b fix: Duplicate Closing Stock Balance 2024-01-09 19:03:06 +05:30
rohitwaghchaure
274c65c451 fix: TypeError is pricing rules (#39252) 2024-01-09 16:20:42 +05:30
s-aga-r
1b4fbbb115 Merge pull request #39158 from s-aga-r/FIX-8011
fix: add read permission to Buying Settings
2024-01-09 16:13:04 +05:30
ruthra kumar
f95403d1dc Merge pull request #39251 from ruthra-kumar/continues_pr_39196
fix: update status on manual allocation
2024-01-09 15:59:03 +05:30
rohitwaghchaure
2d2ff7cf52 fix: incorrect indicator title for portal sales order (#39247) 2024-01-09 15:37:46 +05:30
ruthra kumar
d32a407e08 fix: update status on manual allocation 2024-01-09 15:35:42 +05:30
rohitwaghchaure
5e0d017497 fix: BOM replace tool does not update exploded items of root (#39244) 2024-01-09 15:32:45 +05:30
Nabin Hait
ec07b42ea2 Merge pull request #38530 from bosue/duplicate_zero_quantity_check2
refactor: Consolidate duplicate zero-quantity Items checks for transactions.
2024-01-09 13:12:25 +05:30
ruthra kumar
3b861798e6 Merge pull request #39237 from ruthra-kumar/github_issue_38868
fix: sales team commission overallocation on fetching items from multiple quotations to Sales Order
2024-01-09 13:06:28 +05:30
ruthra kumar
b498094a97 fix: total allocated percentage for sales team issue 2024-01-09 12:40:41 +05:30
Nabin Hait
62bbcbc7ef Merge pull request #39202 from GursheenK/fiscal-year-naming-keyerror
fix: parse naming series with FY name
2024-01-08 21:48:39 +05:30
Nabin Hait
96530b9c0b Merge pull request #39193 from GursheenK/coa-from-existing-company
fix: account currency from existing company COA
2024-01-08 21:46:52 +05:30
Nabin Hait
0cbcc55d9a Merge pull request #39195 from GursheenK/no-copy-party-balance
fix: avoid copying party balance on duplication of PE
2024-01-08 21:38:53 +05:30
Nabin Hait
6b5c54bcbc Merge pull request #39209 from nabinhait/asset-depreciation-currency
fix: Introduced company field to show amounts in company currency
2024-01-08 21:37:57 +05:30
Nabin Hait
c2dde04aa2 Merge pull request #39214 from nabinhait/item-quick-entry
fix: Show maintain-stock and is-fixed-asset checkbox in item quick entry dialog
2024-01-08 21:35:55 +05:30
Nabin Hait
c14986f9e6 fix: Show maintain-stock and is-fixed-asset checkbox in item quick entry dialog 2024-01-08 18:15:55 +05:30
ruthra kumar
62a6945bd2 Merge pull request #39196 from ruthra-kumar/incorrect_status_in_bank_transaction
fix: bank transaction status upon reconciliation
2024-01-08 18:06:30 +05:30
Shariq Ansari
be8bb235dc chore: linter fix 2024-01-08 18:00:02 +05:30
Shariq Ansari
498bf15ecd chore: linter fix 2024-01-08 17:58:59 +05:30
ruthra kumar
210d7711b4 Merge pull request #39212 from ruthra-kumar/make_use_of_doc_level_proj_filter
fix: project filters on Delivery Note and Sales Order
2024-01-08 17:37:57 +05:30
ruthra kumar
cf988434e9 refactor: remove 'Bank Trasaction' logic from status_update 2024-01-08 17:32:22 +05:30
rohitwaghchaure
466625213b fix: FG Item incorrect qty in the work order (#39200) 2024-01-08 17:18:29 +05:30
ruthra kumar
9ba6ff67d5 fix: project filters on Delivery Note and Sales Order 2024-01-08 17:11:26 +05:30
Nabin Hait
eab22eb282 fix: Introduced company field to show amounts in company currency 2024-01-08 16:35:45 +05:30
Shariq Ansari
7e198ccb21 Merge pull request #39204 from shariquerik/add-expected-start-date-in-sort
fix: add expected_start_date in sort by
2024-01-08 16:09:13 +05:30
Shariq Ansari
3d54fd8389 fix: add expected_start_date in sort by 2024-01-08 16:04:40 +05:30
Gursheen Anand
d0ea598cdf fix: fetch name for fy 2024-01-08 15:50:50 +05:30
ruthra kumar
6de8c18f98 fix: bank transction status upon reconciliation 2024-01-08 15:38:43 +05:30
Gursheen Anand
5923b48ede fix: avoid copying party balance 2024-01-08 13:18:01 +05:30
Gursheen Anand
7d264696f3 fix: account currency from existing company coa 2024-01-08 13:07:42 +05:30
rohitwaghchaure
b96c063c93 fix: duplicate entry for serial / batch creation (#39188) 2024-01-08 12:51:14 +05:30
Nabin Hait
2bad706dcf Merge pull request #39163 from nabinhait/asset-fix1
fix: Purchase information is not required for creating a composite asset
2024-01-08 12:21:35 +05:30
s-aga-r
7fa3e82ac7 Merge pull request #39167 from s-aga-r/FIX-7864
fix: update Maintenance Schedule status on Maintenance Visit submit
2024-01-08 11:49:36 +05:30
ruthra kumar
7ddbfa10c9 Merge pull request #39161 from ruthra-kumar/allow_sales_invoice_in_bank_reconciliation
refactor: allow sales invoice in Bank Reconciliation tool
2024-01-08 10:31:31 +05:30
ruthra kumar
4bd437b59d Merge pull request #39165 from ruthra-kumar/bug_in_payment_entry_outstanding_reference
fix: incorrect outstanding amt validation on advance as liability
2024-01-08 10:14:15 +05:30
ruthra kumar
fca8028e3c Merge pull request #39159 from ruthra-kumar/testing_bulk_transaction_permissions
refactor: prevent permission error by always processing bulk transaction in background
2024-01-08 10:11:47 +05:30
s-aga-r
cd293a5173 fix: update Maintenance Schedule status on Maintenance Visit submit 2024-01-06 11:36:22 +05:30
Raffael Meyer
07b605a287 fix: make Dr/Cr in CoA translatable (#39033)
* fix: make Dr/Cr in CoA translatable

* fix: german translations
2024-01-05 23:33:42 +05:30
s-aga-r
54383cfb55 Merge pull request #39140 from s-aga-r/FIX-8018
fix: don't set rate for non-stock item in Internal Transfer
2024-01-05 22:51:47 +05:30
ruthra kumar
4cc3c1b765 fix: incorrect outstanding amt validation on advance as liability 2024-01-05 20:42:38 +05:30
s-aga-r
4d56f725fe fix: make Sales Person non-mandatory 2024-01-05 18:44:06 +05:30
Nabin Hait
c34f09c503 fix: Purchase date and amount is not mandatory for composite asset creation 2024-01-05 17:38:51 +05:30
Nabin Hait
fe43dab4d7 fix: improved validation message 2024-01-05 17:12:08 +05:30
ruthra kumar
b69cdeb4a6 refactor: allow sales invoice in Bank Reconciliation tool 2024-01-05 16:13:49 +05:30
ruthra kumar
15dc5c7e99 refactor: prevent permissions by always processing in background 2024-01-05 15:47:02 +05:30
s-aga-r
e05bf9d32a fix: add read permission to Buying Settings 2024-01-05 15:35:14 +05:30
mergify[bot]
3fb7886418 fix: Creating Asset Activity while Importing Asset (backport #39113) (#39156)
fix: Creating Asset Activity while Importing Asset (#39113)

* fix: import asset not working on activity

* chore: fix linting issue in asset_activity.py

---------

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

Co-authored-by: Aulia Bismar <auliabismar@yahoo.com>
2024-01-05 10:50:49 +05:30
rohitwaghchaure
bae7c64964 fix: inventory dimension negative stock validation (#39149) 2024-01-04 18:47:06 +05:30
Raffael Meyer
68c0e188e8 fix: remove parent_field parameter from calls to rebuild_tree (#39146)
fix: remove parent_field parameter from calls to rebuild_tree

The parent_field parameter became redundant with https://github.com/frappe/frappe/pull/24107
2024-01-04 18:12:41 +05:30
Raffael Meyer
e912e9597d fix(Employee): treeview (#39126) 2024-01-04 18:03:28 +05:30
s-aga-r
610d4f5cb6 Merge pull request #39127 from s-aga-r/FIX-38702
feat: provision to close SCO
2024-01-04 16:38:21 +05:30
s-aga-r
cdd5441435 fix(text): test_update_status 2024-01-04 15:52:11 +05:30
rohitwaghchaure
f09e2130a1 fix: serial / batch barcode scanner (#39114) 2024-01-04 14:58:02 +05:30
s-aga-r
0819675fce fix: auto close and reopen SCO based on PO status 2024-01-04 13:44:53 +05:30
s-aga-r
784b6dcfea fix: don't allow to reopen SCO if PO is closed 2024-01-04 13:05:17 +05:30
s-aga-r
245effcccd fix: update qty on SCO status change 2024-01-04 12:56:57 +05:30
s-aga-r
0d01bd8a5a fix: don't close PO on SCO close 2024-01-04 12:34:25 +05:30
s-aga-r
57b6a98703 test: internal transfer for non-stock item 2024-01-04 12:20:53 +05:30
s-aga-r
e1b0fffd0c fix: don't set rate for non-stock item in Internal Transfer 2024-01-04 11:43:02 +05:30
Deepesh Garg
c2f88f29dc Merge pull request #39138 from deepeshgarg007/subscription_patch_fix
fix: Subscription update patch
2024-01-04 11:23:33 +05:30
Deepesh Garg
277dade9f9 fix: Subscription update patch 2024-01-04 11:22:42 +05:30
Deepesh Garg
e2cf1ea73e Merge pull request #39125 from ruthra-kumar/ignore_cancelled_payment_in_sales_register
fix: ignore cancelled payments in Sales/Purchase Register
2024-01-04 11:14:25 +05:30
Deepesh Garg
df409d80e0 Merge pull request #39135 from deepeshgarg007/demo_test_case
fix: flaky demo test case
2024-01-04 11:14:08 +05:30
Deepesh Garg
5b1571879c fix: flaky demo test case 2024-01-04 10:48:01 +05:30
s-aga-r
bb839b2924 fix(ux): filter closed SCO in Get Items From dialog 2024-01-03 22:37:01 +05:30
s-aga-r
5bc2035bd0 fix: don't allow to submit/cancel SE against a closed SCO 2024-01-03 22:20:06 +05:30
s-aga-r
9e973476b2 fix: don't allow to submit/cancel SCR against a closed SCO 2024-01-03 22:13:37 +05:30
s-aga-r
5e2669f4b6 feat: provision to close SCO 2024-01-03 21:43:38 +05:30
ruthra kumar
0f1be03faf fix: ignore cancelled payments in Sales/Purchase Register 2024-01-03 20:57:01 +05:30
ruthra kumar
351ee5b8fe Merge pull request #39116 from ruthra-kumar/fix_multi_select_dialog_for_invoices
fix: typerror on multi select dialog
2024-01-03 20:53:46 +05:30
Ankush Menat
e84c9f7c51 fix(UX): dont override framework's permission check messages (#39118) 2024-01-03 20:10:19 +05:30
ruthra kumar
7da9ffa3bd fix: typerror on multi select dialog 2024-01-03 17:59:15 +05:30
Ankush Menat
4415212a2d chore: use diff secret 2024-01-03 12:50:25 +05:30
Ankush Menat
6401908f41 fix: Ignore UP on "allowed to transact with" (#39103)
If a customer is allowed to transact with some company it usually
doesn't imply that customer is somehow "linked with" that company.
2024-01-03 11:15:34 +05:30
Deepesh Garg
beee98da6d feat: Against voucher filter in General Ledger (#39100) 2024-01-03 10:03:27 +05:30
ruthra kumar
60c33ac3e6 Merge pull request #39097 from ruthra-kumar/make_loyalty_program_editable
refactor: flag to control loyalty point creation at invoice level
2024-01-03 09:46:43 +05:30
ruthra kumar
1bc74bde29 refactor: flag to control loyalty point creation at invoice level 2024-01-02 17:26:39 +05:30
Rushabh Mehta
12c40ef2e4 Merge pull request #39093 from rmehta/rename-workspace
fix(minor): Rename "ERPNext Settings" to "Settings" and remove "ERPNe…
2024-01-02 15:52:45 +05:30
Rushabh Mehta
b250a21a2b fix(minor): remove "hide_workspaces" from erpnext/install.py 2024-01-02 15:50:54 +05:30
Rushabh Mehta
4e28b5a199 fix(minor): Rename "ERPNext Settings" to "Settings" and remove "ERPNext Integrations" workspace 2024-01-02 15:27:41 +05:30
Ankush Menat
739434b727 perf: index item_code in bom explosion item (#39085) 2024-01-02 14:31:41 +05:30
Parameshwari Palanisamy
9ea963bfe9 fix: Variant Items, List View Enabled to Variant Status Change (#38468)
* feat: Purchase Register Report Supplier Group filter Adding

* fix: Variant Items, List View Enabled to Variant Status Change

* Update purchase_register.js

* Update purchase_register.py
2024-01-02 14:04:56 +05:30
rohitwaghchaure
6e5484ea03 fix: on cancellation of document cancel the serial and batch bundle (#39076) 2024-01-02 12:54:18 +05:30
ruthra kumar
d048644327 Merge pull request #39067 from ruthra-kumar/fix_undefined_error_in_budget_variance_report
fix: undefined error in Budget Variance and Profitability report
2024-01-01 17:37:07 +05:30
ruthra kumar
1a9e091d12 fix: select options should dynamically load dimensions 2024-01-01 17:32:33 +05:30
ruthra kumar
1b0d9643cd Merge pull request #39023 from ruthra-kumar/refactor_customer_ledger_summary
refactor(perf): replace account subquery with 'in' condition
2024-01-01 15:42:24 +05:30
ruthra kumar
92bc962f60 fix: undefined error in Budget Variance and Profitability report
'Budget' and 'Budget Account' doesn't have support for dynamic
dimension. It only supports hard-coded ones -  Project and Cost Center
2024-01-01 15:30:35 +05:30
Anand Baburajan
a9576f0cf6 feat: group by Asset in Asset Depreciations and Balances report (#38923)
feat: group by asset in asset depreciations and balances report
2024-01-01 15:03:21 +05:30
David Arnold
4f8a16848f chore: default_roles hook doesn't exist anymore (#39032) 2024-01-01 13:34:36 +05:30
Deepesh Garg
bacf2b7431 fix: Unable to save Sales Invoice (#39059) 2024-01-01 13:23:26 +05:30
Ankush Menat
34d8bc4701 chore: disable v13 auto releases 2024-01-01 13:13:25 +05:30
Ankush Menat
510fdf7bf6 fix(DX): capture tracebacks with context (#39060) 2024-01-01 13:10:03 +05:30
Anand Baburajan
0346f47c1d fix: take quantity into account when setting asset's gross purchase amt (#39056)
fix: take quantity into account when setting asset's gross purchase amount
2024-01-01 11:24:42 +05:30
Deepesh Garg
3f9693b31f fix: GL values in transaction currency via JV (#38914) 2023-12-31 20:00:03 +05:30
Smit Vora
877cc7255d fix: enqueue demo data setup on setup complete (#39043) 2023-12-31 10:54:07 +05:30
rohitwaghchaure
70abedc57a fix: work order with multi level, fetch operting cost from sub-assembly (#38992) 2023-12-29 16:50:31 +05:30
rohitwaghchaure
0c6de4ecb2 fix: non stock uom validation for serial and batch (#39018)
* fix: non stock uom validation for serial and batch

* test: delivery note for batch with non stock uom
2023-12-29 16:50:01 +05:30
ruthra kumar
a517125d64 refactor(perf): replace account subquery with 'in' condition 2023-12-29 14:57:16 +05:30
Gursheen Kaur Anand
b7f283b2f0 feat: skip disabled accounts in COA (#38551)
* feat: skip disabled accounts in coa

* fix: add parameter to other tree doctype utils
2023-12-29 12:55:37 +05:30
Deepesh Garg
cd37fd790b fix: Validate account in Sales/Purchase Taxes and Charges Template (#39013) 2023-12-29 12:52:22 +05:30
rohitwaghchaure
f983e09f92 fix: purchase return without item code not working (#39014) 2023-12-29 12:06:04 +05:30
Deepesh Garg
3b4b2275de fix: Multiple subscription fixes (#39005) 2023-12-29 08:25:38 +05:30
rohitwaghchaure
b5340c5ec0 fix: auto fetch not working if bundle exists (#39002) 2023-12-28 18:32:27 +05:30
rohitwaghchaure
10074e9980 fix: serial and batch bundle company mandatory error (#38994) 2023-12-28 17:56:24 +05:30
Deepesh Garg
bbee9b5637 fix: Opening balance in bank reconciliation tool (#38977) 2023-12-28 17:50:16 +05:30
ruthra kumar
915d864166 Merge pull request #38969 from ruthra-kumar/bug_in_p_l_report
fix: incorrect net profit in Profit and Loss Statement
2023-12-28 16:23:21 +05:30
ruthra kumar
8555617295 test: profit and loss report output 2023-12-28 15:56:35 +05:30
Ankush Menat
b71b0d5997 fix: remove bad defaults (#38986)
Child tables can't have a default.
2023-12-28 08:45:40 +00:00
rohitwaghchaure
a117ef3cb8 fix: not able to cancel sales invoice (#38979) 2023-12-28 11:14:27 +05:30
Raffael Meyer
33b631e395 Merge pull request #38805 from barredterra/remove-unused-coa 2023-12-28 00:06:50 +01:00
Deepesh Garg
9b1c22250f feat: Merge taxes from mapped docs (#38346)
* feat: Merge taxes from mapped docs

* chore: ci failures
2023-12-27 22:37:01 +05:30
Ankush Menat
4feecb69d8 ci: lock old resolved issue/PRs 2023-12-27 19:31:45 +05:30
ruthra kumar
12560e2407 Merge pull request #38496 from ruthra-kumar/bisect_accounting_reports
feat: utility to debug financial reports
2023-12-27 17:54:36 +05:30
ruthra kumar
0890b414b1 chore: resolve linter issues 2023-12-27 17:31:34 +05:30
ruthra kumar
d54f8318fb fix: incorrect total when Accumulating values 2023-12-27 16:50:07 +05:30
VihangT
fe77b9d633 fix : correct logic for overlap error (#38967)
fixing overlap error logic with taking care of sequential time job cards in overlap job card list
2023-12-27 16:11:29 +05:30
rohitwaghchaure
47ee801d37 fix: incorrect qty in serial batch bundle against pick list (#38964) 2023-12-27 13:09:23 +05:30
s-aga-r
705ae7da14 Merge pull request #38962 from s-aga-r/FIX-38781
fix: use `Stock Qty` while getting `POS Reserved Qty`
2023-12-27 12:50:37 +05:30
s-aga-r
7223106417 fix: use Stock Qty while getting POS Reserved Qty 2023-12-27 10:32:13 +05:30
barredterra
5a5758423e Merge remote-tracking branch 'upstream/develop' into remove-unused-coa 2023-12-26 16:06:43 +01:00
rohitwaghchaure
b09c9354fb fix: min order qty optional in production plan (#38956)
* fix: min order qty optional in production plan

* fix: test cases
2023-12-26 20:11:58 +05:30
rohitwaghchaure
d00f6672a8 fix: not able to import serial batch bundle using csv (#38950) 2023-12-26 15:24:04 +05:30
rohitwaghchaure
06d6220a2a fix: do not make serial batch bundle for zero qty (#38949) 2023-12-26 15:23:32 +05:30
ruthra kumar
3011322b22 Merge pull request #38891 from ruthra-kumar/customer_wise_report_price_issue
fix: incorrect price list in customer-wise item price report
2023-12-26 11:27:20 +05:30
s-aga-r
e560029736 Merge pull request #38942 from s-aga-r/FIX-38151-2
fix(ux): make PR and PI Item rate field readonly based on `Maintain Same Rate`
2023-12-26 10:20:34 +05:30
s-aga-r
b1ba210332 fix(ux): make PR Item rate field readonly based on Maintain Same Rate 2023-12-25 22:41:18 +05:30
s-aga-r
cb9114442b fix(ux): make PI Item rate field readonly based on Maintain Same Rate 2023-12-25 22:29:17 +05:30
s-aga-r
eb5bb9f9a9 fix(ux): make PI Item rate field editable 2023-12-25 22:05:02 +05:30
Wolfram Schmidt
87ba3b64f7 chore: german translation for actual time (#38837)
chore: german translation for actual time
2023-12-24 16:22:26 +05:30
Gursheen Kaur Anand
47f7b65058 feat: voucher subtype for general ledger (#38822)
* feat: add voucher subtype column to gle

* feat: add logic to set voucher subtypes

* feat: fetch voucher subtype in ledger report

* fix: order of conditions
2023-12-24 16:13:31 +05:30
rohitwaghchaure
161ae1edd1 fix: reset the incoming rate on changing of the warehouse (#38925) 2023-12-22 17:37:17 +05:30
s-aga-r
d097ad6c19 Merge pull request #38922 from s-aga-r/FIX-38558
fix: `Reserved Stock` report
2023-12-22 16:27:27 +05:30
s-aga-r
a5d5223c0e fix: Reserved Stock report 2023-12-22 15:46:06 +05:30
s-aga-r
1a1629196d chore: improve Allowed Qty error msg 2023-12-22 15:29:56 +05:30
s-aga-r
d0ed8ef83b Merge pull request #38558 from s-aga-r/ADD-ITEMS-STOCK-RESERVATION-DIALOG
feat: provision to add items in Stock Reservation dialog
2023-12-22 12:15:07 +05:30
hyaray
0773f66feb chore: Update company.py (#38660)
chore: Update company.py
2023-12-22 08:41:51 +05:30
Ankush Menat
2dc49c834a chore: fixup broken JSON files (#38915) 2023-12-22 07:36:27 +05:30
Ankush Menat
787333896c perf: Drop unused/duplicate/sub-optimal indexes (#38884)
* ci: enable more checks

* perf: Drop unused/duplicate indexes
2023-12-21 20:09:10 +05:30
Anand Baburajan
283763dfb2 chore: additional_asset_cost field (#38904) 2023-12-21 16:52:25 +05:30
mergify[bot]
07175367d8 fix: reposting not fixing valuation rate for sales return using movin… (backport #38895) (#38897)
* fix: reposting not fixing valuation rate for sales return using movin… (#38895)

fix: reposting not fixing valuation rate for sales return using moving average method
(cherry picked from commit 3a668bbe96)

# Conflicts:
#	erpnext/stock/stock_ledger.py

* chore: fix conflicts

---------

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-21 14:40:52 +05:30
mergify[bot]
61219ca4ce fix: do not reset the basic rate for the material receipt stock entry (backport #38896) (#38898)
fix: do not reset the basic rate for the material receipt stock entry (#38896)

(cherry picked from commit 98bfcc4c75)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-21 14:23:08 +05:30
ruthra kumar
c20995ec2f Merge pull request #38893 from ruthra-kumar/typeerror_in_pos
fix: typeerror on pos order summary to new order screen
2023-12-21 12:21:59 +05:30
ruthra kumar
6a0a08b59c fix: typeerror on pos order summary to new order screen 2023-12-21 12:13:33 +05:30
Anand Baburajan
d370c60a6c feat: total_asset_cost field (#38879) 2023-12-20 19:02:32 +05:30
mergify[bot]
a6ab53236e fix: allow to set rate manually for service item in BOM (backport #38880) (#38882)
fix: allow to set rate manually for service item in BOM (#38880)

(cherry picked from commit c2f692a4e4)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-20 18:33:26 +05:30
ruthra kumar
9a00edb031 fix: incorrect price list in customer-wise item price report 2023-12-20 17:47:31 +05:30
NIYAZ RAZAK
ae353398d9 fix: local reference error in BOM (#38850)
fix: local reference error
2023-12-20 14:34:38 +05:30
Ankush Menat
9983283f95 perf: use estimated rows instead of actual rows (#38830) 2023-12-20 13:16:09 +05:30
ruthra kumar
6d5bdc6c68 fix: typerror on tree doctypes - Item Group, Customer Group, Supplier Group and Territory (#38870)
* refactor: typerror on set_root_readonly

* refactor: remove 'cur_frm' usage in supplier_group

* refactor: remove 'cur_frm' usage in territory.js

* refactor: remove 'cur_frm' from sales_person.js
2023-12-20 12:30:10 +05:30
ruthra kumar
80e69210db Merge pull request #38838 from pps190/fix-use-party-account-currency
fix: use party account currency when party account is specified
2023-12-20 12:29:04 +05:30
mergify[bot]
793e3ad78e fix: if not budget then don't validate (backport #38861) (#38864)
fix: if not budget then don't validate (#38861)

(cherry picked from commit d375164100)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-19 18:31:18 +05:30
mergify[bot]
4057682c87 fix: incoming rate for sales return with Moving Average valuation method (backport #38849) (#38863)
* fix: incoming rate for sales return with Moving Average valuation method (#38849)

(cherry picked from commit 7fdac62393)

# Conflicts:
#	erpnext/stock/doctype/delivery_note/test_delivery_note.py

* chore: fix conflicts

---------

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-19 18:29:56 +05:30
mergify[bot]
5e68b7e3a6 fix: on closed unreserved the production plan qty (backport #38848) (#38859)
fix: on closed unreserved the production plan qty (#38848)

(cherry picked from commit 2184e8ef58)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-19 18:01:37 +05:30
s-aga-r
495b47db16 Merge pull request #38842 from SvbZ3r0/po-get-fg-item-qty
fix: set `fg-itm-qty` based on `qty` instead of the other way round in Subcontracting POs
2023-12-19 15:23:30 +05:30
mergify[bot]
4aa960b744 fix: item variant with manufacturer (backport #38845) (#38847)
* fix: item variant with manufacturer (#38845)

(cherry picked from commit e0c8ff10da)

* chore: fix test case

---------

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-19 14:59:33 +05:30
ruthra kumar
dd6c192695 Merge pull request #38797 from rtdany10/ar-credit-note-fix
fix: wrong paid and cn amount on pos invoice
2023-12-19 11:02:01 +05:30
Dany Robert
8772628912 test: partial payment for pos invoice 2023-12-19 10:00:51 +05:30
Gughan Ravikumar
a99d0a65b0 fix: set fg-itm-qty based on qty instead of the other way round 2023-12-19 07:56:02 +05:30
Devin Slauenwhite
a09241e3c7 fix(test): expect account currency when party account is specified. 2023-12-18 19:09:25 +00:00
Devin Slauenwhite
c7b961ffa2 fix: use party account currency when party account is specified 2023-12-18 18:03:53 +00:00
mergify[bot]
32a608f948 fix: not able to make inter-company po from so (backport #38826) (#38828)
fix: not able to make inter-company po from so (#38826)

(cherry picked from commit 23042dfc3c)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-18 18:13:47 +05:30
Ankush Menat
8d79365e0d perf: index return_against on delivery note (#38827)
There's a multi-column index but that's useful IFF all parts of column
are part of query.

return against on it's own is VERY unique because it's a primary key, we
don't need a multi-column index here.
2023-12-18 18:06:44 +05:30
mergify[bot]
71e833c3f2 fix: not able to cancel SCR with Batch (backport #38817) (#38821)
* fix: not able to cancel SCR with Batch (#38817)

(cherry picked from commit fb5090fd3f)

# Conflicts:
#	erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py

* chore: fix test case

* chore: fix test case

* chore: fix test case

* chore: fix test case

---------

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-12-18 17:56:05 +05:30
ruthra kumar
b5f3013005 Merge pull request #38820 from ruthra-kumar/ignore_err_in_statements
refactor: ignore ERR journals in Statment of Accounts
2023-12-18 15:55:11 +05:30
ruthra kumar
39ef75e2d0 refactor: ignore ERR journals in Statment of Accounts 2023-12-18 13:39:26 +05:30
Raffael Meyer
42813d38c3 Merge pull request #38803 from barredterra/group-current-accounts 2023-12-17 19:23:01 +01:00
Deepesh Garg
55147781f3 Merge pull request #38807 from deepeshgarg007/canada_demo
fix(demo): Demo setup for Canadian COA
2023-12-17 14:05:07 +05:30
Deepesh Garg
c9fd182268 fix(demo): Demo setup for canadian COA 2023-12-17 13:36:58 +05:30
rohitwaghchaure
0743289925 fix: serial and batch bundle return not working (#38754)
* fix: serial and batch bundle return not working

* test: added test case for delivery note return against denormalized serial no
2023-12-17 12:42:07 +05:30
barredterra
4d75159247 chore: consistent naming for German CoA files 2023-12-16 21:27:38 +01:00
barredterra
baa1978128 feat: remove german CoA "SKR04 ohne Kontonummern"
To the best of my knwoledge, this is outdated, unused and not maintained.
2023-12-16 21:27:09 +01:00
barredterra
259f313af7 fix: groups for current accounts in German CoAs 2023-12-16 21:11:54 +01:00
Deepesh Garg
863116f1cd Merge pull request #37232 from GursheenK/make-against-field-dynamic
fix: make GL and JV against fields dynamic links
2023-12-16 22:27:50 +05:30
Dany Robert
5cb5e09dbb fix: wrong paid and cn amount on pos invoice 2023-12-16 04:35:43 +00:00
Ankush Menat
fa1c7b663c fix: Reset SLA on issue doesn't work (#38789)
This was broken since last refactor where it was spun off to work with
all types of doctypes but client side code was never adapted.
2023-12-15 22:00:01 +05:30
Raffael Meyer
a9a84cc7d4 Merge pull request #38742 from ljain112/fix-pur-reg 2023-12-15 15:22:19 +01:00
Deepesh Garg
ff967c45f7 Merge pull request #38691 from deepeshgarg007/init_values
fix: Init internal child table values
2023-12-15 18:14:45 +05:30
s-aga-r
9a5c422074 Merge pull request #38778 from s-aga-r/FIX-7327
fix: wrong currency in Stock Balance report
2023-12-15 15:28:52 +05:30
s-aga-r
5a83a16e60 fix: wrong currency in Stock Balance report 2023-12-15 14:45:09 +05:30
Anand Baburajan
1704180f38 fix: asset patch failure due to missing shift_based column (#38776)
* fix: add missing daily_prorata_based in get_asset_finance_books_map

* fix: reload Asset Finance Book doctype
2023-12-15 14:43:33 +05:30
ruthra kumar
0cf9ff0a04 Merge pull request #38766 from ruthra-kumar/7101_only_treat_none
fix: validation error on reconciling PE to Journals as Invoice
2023-12-15 13:09:06 +05:30
Gursheen Kaur Anand
41ae2a2dc5 Merge pull request #38767 from GursheenK/skip-bank-jvs-in-tax-report
fix: skip JVs against bank accounts in tax report
2023-12-15 12:57:40 +05:30
Gursheen Anand
f7b2380ec1 fix: skip jvs against bank accounts 2023-12-15 12:30:15 +05:30
ruthra kumar
5eeb650dfd fix: validation error on reconciling PE to Journals as Invoice
With the same exchange rate on Journal Entry and Payment Entry,
reconcilition should not post exc gain/loss journal and should not
throw validation error
2023-12-15 11:46:12 +05:30
s-aga-r
a1b95606b1 Merge pull request #38720 from s-aga-r/FIX-6545
fix(ux): don't override Item Name and Description in MR
2023-12-15 10:57:24 +05:30
s-aga-r
726ac6bda1 fix(ux): don't override Item Name and Description in MR 2023-12-15 10:56:54 +05:30
rohitwaghchaure
d6201ce5c7 fix: homepage not working (#38755) 2023-12-14 22:47:32 +05:30
Raffael Meyer
e7e23fbc96 Merge pull request #38533 from barredterra/date-format-system-settings 2023-12-14 16:38:00 +01:00
Raffael Meyer
e7544e9fc1 Merge pull request #38505 from barredterra/lead_name_from_email 2023-12-14 13:48:19 +01:00
Ankush Menat
eaf86a6461 fix: timezone aware SLA banner (#38745) 2023-12-14 15:53:57 +05:30
ljain112
f53ba178a8 fix: show bill_date and bill_no in Purchase Register 2023-12-14 12:28:32 +05:30
ruthra kumar
c68ad73c6e Merge pull request #38717 from ruthra-kumar/7101_payment_reconciiation_bug
fix: fetch exc rate of multi currency journals on reconciliation
2023-12-14 09:35:12 +05:30
Ankush Menat
6851c5042f Revert "fix(ux): don't update qty blindly" (#38728) 2023-12-13 23:14:20 +05:30
Raffael Meyer
da96578afb Merge pull request #38725 from barredterra/preview-rfq 2023-12-13 17:31:08 +01:00
barredterra
27f05145ae feat: RFQ print preview 2023-12-13 17:00:58 +01:00
ruthra kumar
1b3ba25220 fix: fetch exc rate of multi currency journals 2023-12-13 16:39:42 +05:30
rohitwaghchaure
13cba5068b fix: barcode scanning for the stock entry (#38716) 2023-12-13 15:08:16 +05:30
rohitwaghchaure
db24e24882 fix: supplier removed on selection of item (#38712) 2023-12-13 14:06:45 +05:30
Anand Baburajan
e7984b3ef9 fix: 1st row depr. sch. value of asset put to less than 180 days acc. to I.T. S. 32 (#38696)
fix: 1st row value of asset put to less than 180 days acc. to IT S. 32
2023-12-12 20:53:37 +05:30
rohitwaghchaure
b562b4cf99 fix: show stock qty in popup (#38698) 2023-12-12 16:41:10 +05:30
rohitwaghchaure
69d7a640ee fix: negative batch issue (#38688) 2023-12-12 16:18:32 +05:30
ruthra kumar
fa2d33cb50 fix: typeerror on new sites (#38692) 2023-12-12 15:43:39 +05:30
Deepesh Garg
2588970d55 fix: Init internal child table values 2023-12-12 15:18:54 +05:30
ruthra kumar
d4ac57704c Merge pull request #38685 from ruthra-kumar/get_list_for_virtual_child_doctypes
refactor: add `get_list` for virtual child doctypes
2023-12-12 14:40:43 +05:30
ruthra kumar
15c90551b6 refactor: add get_list for virtual child doctypes 2023-12-12 13:36:03 +05:30
ruthra kumar
0acd0f50c5 Merge pull request #38679 from ruthra-kumar/refactor_repost_test
refactor(test): repost utility deletion flag test
2023-12-12 12:43:58 +05:30
ruthra kumar
acb6e8e120 refactor(test): update repost settings before test case 2023-12-12 11:39:55 +05:30
ruthra kumar
ccff588563 refactor: increase limit and remove explicit call to start_repost 2023-12-12 11:30:33 +05:30
rohitwaghchaure
780c4278e6 fix: serial no filter in the Serial No Ledger report (#38669) 2023-12-12 11:24:07 +05:30
s-aga-r
2d6506ecec Merge pull request #38667 from s-aga-r/FIX-38658
fix: close PO on SCO close
2023-12-12 10:54:46 +05:30
ruthra kumar
a97b3db749 refactor: remove explicit commit on repost 2023-12-12 10:34:51 +05:30
ruthra kumar
cc15f695b4 refactor(test): repost utility deletion flag test 2023-12-12 10:24:24 +05:30
s-aga-r
c41cbb3e29 Merge pull request #38644 from barredterra/fix-attribute-error
fix: attribute error
2023-12-12 10:02:16 +05:30
Raffael Meyer
6ad298adfc fix: typo in unittest (#38673) 2023-12-12 09:55:15 +05:30
Ankush Menat
db9829e83f Merge pull request #38672 from barredterra/fix-leaderboard
fix: get data for leaderboard
2023-12-12 09:53:23 +05:30
barredterra
956c3c50a0 chore: deprecate unused method 2023-12-11 19:46:37 +01:00
barredterra
40c1acc961 fix: get sales partner for leaderboard 2023-12-11 19:45:32 +01:00
barredterra
7babfd4ac4 fix: get sales person for leaderboard 2023-12-11 19:44:24 +01:00
barredterra
65df4b6aa8 fix: get suppliers for leaderboard 2023-12-11 19:34:54 +01:00
barredterra
2721ee3a8d fix: get items for leaderboard 2023-12-11 19:34:24 +01:00
barredterra
137b5a6108 fix: get customers for leaderboard 2023-12-11 18:32:49 +01:00
s-aga-r
b023e5d6b3 fix: close PO on SCO close 2023-12-11 12:36:08 +05:30
rohitwaghchaure
89a0e9c245 fix: not able to make serial and batch using csv import (#38659) 2023-12-11 10:35:31 +05:30
rohitwaghchaure
89326bd657 fix: auto delete draft serial and batch bundle (#38637) 2023-12-10 11:05:58 +05:30
s-aga-r
8ddc26eb2e Merge pull request #38634 from creative-paramu/shipping_address_link
fix: Shipping Address Link Showing in Buying
2023-12-08 18:59:26 +05:30
creative-paramu
ca0c3eb184 fix(ux): Shipping Address Link 2023-12-08 18:57:31 +05:30
barredterra
0465c9aabb fix: attribute error 2023-12-08 14:15:26 +01:00
s-aga-r
a045916aca Merge pull request #38608 from s-aga-r/FIX-6766
fix(ux): don't update qty blindly
2023-12-08 16:30:42 +05:30
Shariq Ansari
be312cea4c Merge pull request #38623 from shariquerik/bypass-unnessary-formatting 2023-12-07 20:46:26 +05:30
Ankush Menat
9611e9bd7f fix: ignore non-existing regional customizations (#38621) 2023-12-07 14:12:40 +00:00
Shariq Ansari
08ed3cd313 fix: format only if searched text contain link value text 2023-12-07 19:39:24 +05:30
rohitwaghchaure
231ab83562 fix: serial and batch bundle permission (#38618) 2023-12-07 18:00:07 +05:30
rohitwaghchaure
f45dd740c5 chore: minor code cleanup (#38615) 2023-12-07 15:29:50 +05:30
s-aga-r
0156339f34 fix(ux): don't update qty blindly 2023-12-07 10:16:46 +05:30
Raffael Meyer
f99bb61181 Merge pull request #38591 from barredterra/de-morgan 2023-12-06 22:30:03 +01:00
Ankush Menat
6a47a2ceaf chore: remove unused cache=True 2023-12-06 20:53:55 +05:30
Richard Case
525f656cc1 feat: add employee number to client user bootinfo (#38477) 2023-12-06 20:48:13 +05:30
sandratridz
d34787cf6d fix: only highest eligible coupon applied (#38416)
* fix: application of pricing rule when coupon is used
2023-12-06 14:41:02 +05:30
s-aga-r
9424bbc01c Merge pull request #38592 from s-aga-r/FIX-STOCK-VARIANCE
fix: consider the `Valuation Method` while picking incorrect SLE
2023-12-05 18:08:01 +05:30
s-aga-r
16c297c2ec feat: add Valuation Method column in Stock Ledger Variance report 2023-12-05 18:06:14 +05:30
s-aga-r
8beec58670 fix: incorrect SLE for Moving Average valuation method 2023-12-05 17:51:01 +05:30
barredterra
bac811bd5e chore: git blame ignore rev 2023-12-05 11:23:58 +01:00
barredterra
eb9ee3f79b refactor: simplify conditional logic
Command: `sourcery review --fix --enable de-morgan .`
2023-12-05 11:22:55 +01:00
ruthra kumar
5da3e532c9 Merge pull request #38580 from ruthra-kumar/finance_book_filter_bug_in_general_ledger
fix: sql error while filtering on finance book in GL
2023-12-05 14:40:34 +05:30
ruthra kumar
b1d9f3132d fix: sql error while filtering on finance book in GL 2023-12-05 14:06:15 +05:30
rohitwaghchaure
aaa9036eca fix: incorrect material request quantity in Production Plan (#38566) 2023-12-05 13:34:54 +05:30
Gursheen Anand
005c5a587f chore: orderby in gle 2023-12-05 13:16:54 +05:30
Gursheen Anand
47c78a5a73 fix: check for unmerged gle in purchase receipt test 2023-12-05 12:48:25 +05:30
Gursheen Anand
24ccb3eb78 fix: subcontracting receipt gle test 2023-12-05 12:47:06 +05:30
Gursheen Anand
a56b79cc72 fix: check for split entries in stock entry test 2023-12-05 12:46:22 +05:30
ruthra kumar
84ee50e492 Merge pull request #38570 from ruthra-kumar/ignore_unreconcile_on_pi_cancel
refactor: ignore unreconcile doc on PI cancel/delete
2023-12-05 12:02:44 +05:30
s-aga-r
16b7401d4c Merge pull request #38553 from s-aga-r/STOCK-VARIANCE-COMPANY
feat: `Company` filter in `Stock Ledger Variance` report
2023-12-05 11:56:17 +05:30
ruthra kumar
1a5d56977e refactor: ingore on JE cancel as well 2023-12-05 11:34:25 +05:30
Gursheen Kaur Anand
6812e91893 Merge pull request #38556 from GursheenK/period-end-date-for-financial-statements
fix(minor): financial statements period end date
2023-12-05 11:22:08 +05:30
ruthra kumar
4ca84eadb6 refactor: ignore unreconcile doc on PI cancel/delete 2023-12-05 10:14:44 +05:30
Shariq Ansari
27aba02d16 Merge pull request #38562 from shariquerik/existing-customer-issue-in-lead 2023-12-04 19:20:29 +05:30
Shariq Ansari
3d7ad71b22 fix: get dynamic link with parenttype contact 2023-12-04 19:19:09 +05:30
s-aga-r
8d5045ef4c feat: provision to add items in Stock Reservation dialog 2023-12-04 18:03:22 +05:30
s-aga-r
00261094c8 fix(ux): show row index and field label while selecting the Sales Order Item 2023-12-04 18:00:06 +05:30
s-aga-r
9471d8fff9 feat: provision to update items in Stock Reservation dialog 2023-12-04 17:56:32 +05:30
Gursheen Anand
ab6e92aae1 fix: limit end date to current date 2023-12-04 16:47:28 +05:30
s-aga-r
fb3421fcce feat: Company filter in Stock Ledger Variance report 2023-12-04 15:39:25 +05:30
rohitwaghchaure
c8693cdf37 fix: scan for serial or batch in bundle (#38534) 2023-12-04 15:02:47 +05:30
NIYAZ RAZAK
3df1d75bdd fix: incorrect customer outstanding amount (#38475)
* fix: incorrect customer outstanding amount

* chore: resolve linting error

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

---------

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-12-04 13:39:49 +05:30
s-aga-r
fc12238fcc Merge pull request #38543 from s-aga-r/FIX-6734
fix: don't show non-stock items in Stock Analytics report
2023-12-04 12:08:07 +05:30
s-aga-r
15fff84bb5 fix: linter 2023-12-04 12:05:27 +05:30
s-aga-r
01aadbef85 fix: don't show non-stock items in Stock Analytics report 2023-12-04 12:00:36 +05:30
s-aga-r
ccdcb7dfcc fix(ux): stock-item filter for Item Code field 2023-12-04 11:58:44 +05:30
ruthra kumar
94fabe0321 Merge pull request #38220 from rtdany10/wrong-advance
fix: exclude `invoice_doctypes` from party advance
2023-12-04 10:57:15 +05:30
ruthra kumar
dd39da0b77 fix: incorrectly treating normal payment as advance (#38437)
fix: treating normal payment as advance
2023-12-04 10:08:37 +05:30
Bernd Oliver Sünderhauf
3688d9412e chore: Adapt translations to reworded message. 2023-12-03 22:55:58 +01:00
Bernd Oliver Sünderhauf
4918aeb4c6 refactor: Consolidate duplicate zero-quantity transaction Items checks. 2023-12-03 19:57:32 +01:00
Nihantra C. Patel
d659d407a0 fix: Group By in Item-wise Purchase Register (#38503) 2023-12-03 23:22:04 +05:30
Gursheen Anand
262cafc430 fix: query for against types 2023-12-03 22:36:54 +05:30
Gursheen Anand
11190aac4c fix: unhide against type field 2023-12-03 22:35:01 +05:30
Gursheen Anand
6d31563920 feat: auto set against accounts for value pairs 2023-12-03 22:33:21 +05:30
barredterra
b6957ddac2 fix: set date format from system settings 2023-12-03 17:21:48 +01:00
Bernd Oliver Sünderhauf
b2d8a44199 test: Add, expand and refine test-cases for zero-quantity transactions. 2023-12-03 16:33:29 +01:00
ruthra kumar
2815d196de Merge pull request #38525 from ruthra-kumar/multiple_minor_fixes
fix: multiple minor fixes in report and Exchange Rate Revaluation
2023-12-03 16:43:01 +05:30
ruthra kumar
64266c4d38 fix: remove hardcoded, implicit rounding loss allowance 2023-12-03 10:58:14 +05:30
ruthra kumar
f4d418ea6d fix: item group filter in sales person wise report 2023-12-03 10:58:10 +05:30
s-aga-r
a008f5f611 Merge pull request #38493 from s-aga-r/FIX-6325
fix: don't update previous doc on rate change
2023-12-03 10:08:44 +05:30
rohitwaghchaure
74eab91042 fix: better overlap logic for job card (#38432) 2023-12-02 23:12:12 +05:30
Gursheen Anand
9aeb3932d0 fix: fetch against link value in gl report 2023-12-02 20:30:38 +05:30
Sagar Vora
b6a7549407 fix: use predefined onload property load_after_mapping (#38209) 2023-12-02 20:06:19 +05:30
Gursheen Kaur Anand
9087e1443e fix: SO ordered qty on PO item removal (#38378)
* fix: update ordered_qty for SO when PO items removed

* refactor: use cached value

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-12-02 19:53:00 +05:30
Raffael Meyer
5952cfa673 fix: german translations for Lost Quotations (#38435) 2023-12-02 19:52:11 +05:30
noec764
a1e0197a8b fix: Add missing french translations (#38368)
fix: Add missing french translation

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
2023-12-02 19:49:13 +05:30
Deepesh Garg
af7bc4f178 Merge pull request #38401 from pps190/fix-pe-jv-outstanding
fix: don't consider cancelled entries
2023-12-02 19:44:10 +05:30
Corin Wenger
023bc36592 fix: Move SMS Log module from ERPNext to Frappe (#38506)
Move SMS Log module from ERPNext to Frappe

SMS Log module moved to Frappe Core from ERPNext Utilities so that Frappe send_sms() works sans-ERPNext.
2023-12-02 19:24:46 +05:30
barredterra
ceeb724acc feat: set lead name from email 2023-12-01 20:10:51 +01:00
rohitwaghchaure
5e9016ffab fix: validation error has not throw for the batch (#38494)
* fix: validation error has not throw for the batch

* chore: fix test cases
2023-12-01 21:42:22 +05:30
Sherin KR
6bc40373f2 chore: changed sort_order to DESC for customer (#38498) 2023-12-01 19:07:28 +05:30
ruthra kumar
14c8c8c33d refactor: cache results 2023-12-01 18:01:58 +05:30
ruthra kumar
0925706d5e refactor: flag to differentiate generated and default values 2023-12-01 17:46:28 +05:30
ruthra kumar
ca14ae8f1b refactor: save results in node 2023-12-01 17:07:39 +05:30
ruthra kumar
90c6d4dc85 chore: restrict only to administrator and type info 2023-12-01 16:50:17 +05:30
ruthra kumar
228aa1a244 chore: change data type for summary fields 2023-12-01 16:42:15 +05:30
ruthra kumar
993e2bfbf9 refactor: adding labels to important section 2023-12-01 16:42:15 +05:30
ruthra kumar
ea3071db66 chore: UI cleanup 2023-12-01 16:42:15 +05:30
ruthra kumar
395299803f chore: add screen freeze on wait 2023-12-01 16:42:15 +05:30
ruthra kumar
5e2d21c033 chore: code cleanup 2023-12-01 16:42:15 +05:30
ruthra kumar
c4c3090f46 chore: hide internal variables section 2023-12-01 16:42:15 +05:30
ruthra kumar
6492019383 chore: rename btree and remove debugging statements 2023-12-01 16:42:15 +05:30
ruthra kumar
f6831fba13 chore: hide internal fields and better painting logic for heatmap 2023-12-01 16:42:15 +05:30
ruthra kumar
16db6c2f47 refactor: working heatmap 2023-12-01 16:42:15 +05:30
ruthra kumar
bd3dc6482e chore: hide some internal fields 2023-12-01 16:42:15 +05:30
ruthra kumar
f7b7b2b438 refactor: calculate summary on tree navigation 2023-12-01 16:42:15 +05:30
ruthra kumar
99fbd8ad18 refactor: use DB to store tree and state 2023-12-01 16:42:15 +05:30
ruthra kumar
9d20256366 chore: use doctype as btree 2023-12-01 16:42:15 +05:30
ruthra kumar
85f2a6dd54 feat: nodes doctype 2023-12-01 16:42:15 +05:30
ruthra kumar
de2eba0d98 chore: remove unwanted code 2023-12-01 16:42:15 +05:30
ruthra kumar
705ef4f5a3 refactor: add basic navigation
1. remove unnecessary columns
2. added basic tree navigation
2023-12-01 16:42:15 +05:30
ruthra kumar
b2dde55f2c refactor: ability to build and load tree from DB 2023-12-01 16:42:15 +05:30
ruthra kumar
d53b34c0ce refactor: introduce node class 2023-12-01 16:42:15 +05:30
ruthra kumar
a427029151 refactor: more buttons 2023-12-01 16:42:15 +05:30
ruthra kumar
2de3e6ce6d refactor: date validation 2023-12-01 16:42:15 +05:30
ruthra kumar
03a38ed025 refactor: support for BFS and DFS 2023-12-01 16:42:15 +05:30
ruthra kumar
26503a205f refactor: simplify DFS 2023-12-01 16:42:15 +05:30
ruthra kumar
5a25c80f2e refactor: Depth First Search(DFS) 2023-12-01 16:42:15 +05:30
ruthra kumar
4c8a8c3bcd refactor: some logic 2023-12-01 16:42:15 +05:30
ruthra kumar
decdbd2782 feat: bisect doctype 2023-12-01 16:42:15 +05:30
ruthra kumar
eb4c476490 refactor: primitive summary for p&l and balance sheet 2023-12-01 16:42:15 +05:30
s-aga-r
68f5dd3e7b fix: don't update previous doc on rate change 2023-12-01 14:45:01 +05:30
s-aga-r
68aee8c144 Merge pull request #38482 from s-aga-r/FIX-38476
fix: `AttributeError` while saving Purchase Invoice
2023-12-01 13:54:42 +05:30
Ernesto Ruiz
b24e28953b chore: add translate function to email subject in digest frecuency (#38474)
chore: add translate function to email subject in digest frecuency
2023-12-01 12:41:14 +05:30
ruthra kumar
9656412bba Merge pull request #38440 from rtdany10/pe-split-message
fix(pe): show split alert only on splitting
2023-12-01 12:39:39 +05:30
ruthra kumar
61280117eb Merge pull request #38393 from ruthra-kumar/refactor_advance_as_liability
refactor: GL entries build logic for `Advance in Separate Party Account` option.
2023-12-01 12:36:59 +05:30
ruthra kumar
961bdf0d24 refactor: handle forex payment advance entries 2023-12-01 12:13:00 +05:30
ruthra kumar
080aa30407 refactor(test): filter on document names 2023-12-01 12:09:37 +05:30
ruthra kumar
eecf9cd1d8 fix(test): use correct account type for testing 2023-12-01 11:43:57 +05:30
NandhiniDevi
e2a519464b add supplier group filter in purchase register (#38421)
* add supplier group field in purchase register

* Update purchase_register.js
2023-12-01 11:34:38 +05:30
s-aga-r
60a81a563e fix: AttributeError while saving Purchase Invoice 2023-12-01 11:27:54 +05:30
Gughan Ravikumar
3a66aefd2c fix: show item name as title instead of item group in BOM (#38478)
Item fields in BOM used to show Item Group when Items were set to show title as link fields. Now they show Item Name instead
2023-12-01 11:07:17 +05:30
Ankush Menat
54f7cf59fd chore: version bump 2023-12-01 10:37:35 +05:30
rohitwaghchaure
ba10f7d04c Merge pull request #38455 from rohitwaghchaure/fixed-incorrect-requested-qty-in-mr-for-sco
fix: incorrect requested quantity for the subcontracting order
2023-11-30 19:07:55 +05:30
Rohit Waghchaure
691e3bb24f fix: incorrect requested quantity for the subcontracting order 2023-11-30 17:32:55 +05:30
s-aga-r
832734ff4c Merge pull request #38450 from s-aga-r/FIX-38151
fix(ux): make valuation field read only when it can't be modified
2023-11-30 17:22:54 +05:30
s-aga-r
3d4156cc7d fix(ux): make PI rate field read-only having PR ref 2023-11-30 16:28:03 +05:30
ruthra kumar
cc053ad894 Merge pull request #38457 from ruthra-kumar/use_flt_on_outstanding_on_ar_ap_summary
refactor: use flt on outstanding on AR/AP summary report
2023-11-30 16:23:28 +05:30
s-aga-r
ae294ee470 fix(ux): make PR rate field read-only having PO ref 2023-11-30 16:16:12 +05:30
ruthra kumar
e4bdd3a28d refactor: use flt on outstanding on AR/AP summary report 2023-11-30 15:57:57 +05:30
Ankush Menat
63313eef6f feat: enable automatic type annotations (#38452) 2023-11-30 08:23:48 +00:00
Ankush Menat
1da9087cc4 refactor: Simpler log settings setup (#38449)
Depends on https://github.com/frappe/frappe/pull/23507
2023-11-30 07:58:55 +00:00
ruthra kumar
de3795a7d4 Merge pull request #38446 from ruthra-kumar/filter_bug_on_payment_reconciliation
refactor: pass on filter to up front outstanding query as well
2023-11-30 12:54:46 +05:30
ruthra kumar
cfd3230c75 refactor: pass on filter to upfront outstanding query as well 2023-11-30 12:22:55 +05:30
s-aga-r
e38b06bf2d Merge pull request #38441 from s-aga-r/FIX-38434
fix: exploded items in Subcontracting Receipt
2023-11-30 12:10:18 +05:30
s-aga-r
7cb0b1b7c3 Merge pull request #38439 from s-aga-r/FIX-38433
fix: use `docstatus` instead of `status`
2023-11-30 12:09:43 +05:30
s-aga-r
62b4a263f8 fix: exploded items in Subcontracting Receipt 2023-11-30 12:07:52 +05:30
Dany Robert
96b13c59c1 fix(pe): show split alert only on splitting 2023-11-30 06:20:15 +00:00
s-aga-r
1423b38d50 fix: use docstatus instead of status 2023-11-30 11:43:28 +05:30
Devin Slauenwhite
ff27cccff4 refactor: get outstanding journal entry using query builder 2023-11-29 21:44:56 +00:00
s-aga-r
abc7d30024 fix(ux): make basic_rate field read-only based on purpose 2023-11-29 19:49:58 +05:30
Deepesh Garg
591f4ebdca Merge pull request #38429 from GursheenK/set-cwip-account-for-asset-tests
fix(minor): set capital WIP account before asset tests
2023-11-29 18:50:05 +05:30
Gursheen Anand
ef8e4191cd fix: set cwip account before asset tests 2023-11-29 18:25:52 +05:30
rohitwaghchaure
cf97e3c21f Merge pull request #38427 from Nandhinidevi123/stock_entry
Update Serial No issue
2023-11-29 18:11:22 +05:30
s-aga-r
2e8739fff7 Merge pull request #38290 from s-aga-r/FIX-36704
feat: auto create PR on SCR submission
2023-11-29 17:57:11 +05:30
s-aga-r
3da0aa6a0b fix(test): test_auto_create_purchase_receipt 2023-11-29 17:35:21 +05:30
Nandhinidevi123
97be527ee9 fix:change default qty 2023-11-29 17:21:51 +05:30
Nandhinidevi123
cac3b4a0d8 Merge branch 'develop' of https://github.com/Nandhinidevi123/erpnext into develop 2023-11-29 17:20:38 +05:30
Gursheen Anand
96f31847b2 fix: set cwip account for company before tests 2023-11-29 16:04:36 +05:30
Deepesh Garg
85f9f8d176 Merge pull request #38250 from GursheenK/unset-discount-amount-based-on-coupon-code
fix: unset discount amount based on coupon code
2023-11-29 15:53:46 +05:30
s-aga-r
7b0cd03f88 test: auto create PR on SCR submit 2023-11-29 14:10:48 +05:30
s-aga-r
68585f6f2b test: auto create SCO on PO submit 2023-11-29 13:58:36 +05:30
s-aga-r
857f2b5a01 chore: linter 2023-11-29 13:39:14 +05:30
rohitwaghchaure
258148b615 Merge pull request #38365 from Nandhinidevi123/sales_register
feat:add customer group filter in sales register
2023-11-29 13:37:22 +05:30
s-aga-r
7145b040f1 fix(ux): hide Create Purchase Receipt button for Subcontract Return 2023-11-29 13:21:24 +05:30
s-aga-r
874766a82f fix: map warehouses in return SCR 2023-11-29 13:07:39 +05:30
s-aga-r
096a2c8cd0 chore: PR ref in SCR connections 2023-11-29 12:46:31 +05:30
Gursheen Kaur Anand
4a047fefb8 Merge branch 'develop' into make-against-field-dynamic 2023-11-29 12:30:20 +05:30
rohitwaghchaure
fddf341f44 fix: incorrect ordered qty for Subcontracting Order (#38415) 2023-11-29 12:21:11 +05:30
Anand Baburajan
fe5fc5bd3a feat: shift depreciation for assets (#38327)
* feat: shift depreciation for assets

* chore: create new asset depr schedule on shift change

* refactor: move create_depr_schedule to after_insert

* fix: args in get_depreciation_amount test

* refactor: rename shift adjustment to shift allocation

* chore: asset shift factor doctype and auto allocate shift diff

* chore: use check instead of depr type, and add tests

* chore: make linter happy

* chore: give permissions to accounts users
2023-11-29 12:14:12 +05:30
ruthra kumar
0255e09285 test: ledger pre and post reconciliation on advance as liability 2023-11-29 10:57:28 +05:30
s-aga-r
2b0b15f4d1 Merge pull request #38394 from s-aga-r/FIX-38330
fix: `OperationalError` while selecting Serial No in `Warranty Claim`
2023-11-29 10:37:07 +05:30
Patrick Eissler
8e4b591ea2 fix: make create button translatable (#38165)
* fix: make all create buttons translatable

* style: use double quotes

---------

Co-authored-by: PatrickDenis-stack <77415730+PatrickDenis-stack@users.noreply.github.com>
Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-11-29 10:22:47 +05:30
Dany Robert
663bb8726c fix(regional): use net figures for sales calc (#38260) 2023-11-29 09:03:47 +05:30
ruthra kumar
2add802d0d refactor(test): advance allocation on purchase invoice 2023-11-29 08:59:14 +05:30
Devin Slauenwhite
adfcdb3b65 fix: don't consider cancelled entries 2023-11-28 13:19:49 -05:00
s-aga-r
9fadf5f426 refactor: don't use cur_frm 2023-11-28 21:34:07 +05:30
ruthra kumar
3e6306348a refactor: redefine dr_or_cr for unallocated amount 2023-11-28 20:04:47 +05:30
Shariq Ansari
458dd51af7 Merge pull request #38398 from shariquerik/create-contact-only-if-not-exist 2023-11-28 19:49:22 +05:30
Shariq Ansari
23b0b8ba36 fix: create contact if existing customer doesn't have contact 2023-11-28 19:24:15 +05:30
rohitwaghchaure
592fc81260 fix: serial no status (#38391) 2023-11-28 18:28:48 +05:30
Gursheen Kaur Anand
c232acbe9b Merge pull request #38392 from GursheenK/report-rename-import
fix: imports for renamed report
2023-11-28 18:22:59 +05:30
s-aga-r
640dfab827 refactor: use frm.set_query to add filters 2023-11-28 17:45:17 +05:30
s-aga-r
01044ca8e9 refactor: use DocType Fetch From instead of frm.add_fetch 2023-11-28 17:33:27 +05:30
ruthra kumar
2633d7dca3 refactor: 'partial' flag to only cancel unlinked ledger entries 2023-11-28 17:28:31 +05:30
ruthra kumar
ecb533c4d1 refactor: return the newly added reference upon reconciliation 2023-11-28 17:27:49 +05:30
ruthra kumar
5fc19dab54 refactor: 'make_advance_gl_entries' method
make_advance_gl_entries -> add_advance_gl_entries -> add_advance_gl_for_reference

'make_advance_gl_entries' - main method thats builds and post GL
entries for all or one specific reference based on parameters

'add_advance_gl_entries' - build GL map for all or one specific
reference. Return an array of dict.

'add_advance_gl_for_reference' - utility function to build gl
entries. returns dict.
2023-11-28 17:26:06 +05:30
ruthra kumar
58114e7b24 refactor: use different GL build logic for advance as liability 2023-11-28 17:25:28 +05:30
s-aga-r
1763824e5f refactor: use arrow function 2023-11-28 17:20:05 +05:30
Gursheen Anand
aee2e12f39 chore: fix imports for renamed report 2023-11-28 17:11:35 +05:30
s-aga-r
500573067a Merge branch 'develop' into FIX-36704 2023-11-28 17:01:48 +05:30
s-aga-r
8052103197 feat: provision to create PR from SCR 2023-11-28 16:28:54 +05:30
ruthra kumar
78ab11f991 refactor: post to GL and Payment Ledger on advance as liability 2023-11-28 16:25:55 +05:30
ruthra kumar
3263f2023c test: assert ledger entries on partial reconciliation
with `Advance as Liability`, partial reconciliation should not post
duplicate ledger entries for same reference
2023-11-28 16:16:24 +05:30
Raffael Meyer
8f00481c5f fix: no fstring in translation (#38381) 2023-11-28 09:35:28 +00:00
s-aga-r
9872e371a2 Merge pull request #38377 from s-aga-r/FIX-PB-SEARCH-INPUT
fix: Product Bundle Parent Item input
2023-11-28 14:34:26 +05:30
s-aga-r
37b3ac7952 feat: SCR Item ref in PR Item 2023-11-28 13:39:15 +05:30
s-aga-r
d891bd7fac feat: Subcontracting Receipt ref in Purchase Receipt 2023-11-28 13:27:27 +05:30
s-aga-r
d366a91d9e fix: use checkbox instead of select field 2023-11-28 13:06:52 +05:30
s-aga-r
8c3713b649 fix: don't select all fields 2023-11-28 11:12:55 +05:30
s-aga-r
729fc738af fix: product bundle search input 2023-11-28 11:08:52 +05:30
Deepesh Garg
add238c892 fix: debit credit mismatch in multi-currecy asset purchase receipt (#38342)
* fix: Debit credit mimatch in multicurrecy asset purchase receipt

* test: multi currency purchase receipt

* chore: update init files

* test: roolback
2023-11-28 08:21:45 +05:30
rohitwaghchaure
ad3634be7c chore: fix flaky test case (#38369) 2023-11-28 06:24:21 +05:30
Sagar Vora
5a53a4b044 fix: make parameters of create_subscription_process optional (and other minor fixes) (#38360) 2023-11-27 20:21:19 +05:30
Nandhinidevi123
5a97fa6336 feat:add customer group filter in sales register 2023-11-27 19:51:05 +05:30
ruthra kumar
657bb9d682 Merge pull request #38354 from ruthra-kumar/handle_rounding_loss_on_ar_ap
refactor: handle rounding loss on AR/AP reports
2023-11-27 11:51:46 +05:30
Marica
b9f5a1c85d fix: Negative Qty and Rates in SO/PO (#38252)
* fix: Don't allow negative qty in SO/PO

* fix: Type casting for safe comparisons

* fix: Grammar in error message

* fix: Negative rates should be allowed via Update Items in SO/PO

* fix: Use `non_negative` property in docfield & emove code validation
2023-11-27 09:05:22 +05:30
ruthra kumar
592ce45da7 refactor: handle rounding loss on AR/AP reports 2023-11-27 08:51:22 +05:30
NandhiniDevi
d9b3b95854 fix : Payment Reco Issue and chart of account importer (#38321)
fix : Payment Reco Issue and chart of account importer
2023-11-26 18:40:31 +05:30
Raffael Meyer
5426b93387 refactor: bank transaction (#38182) 2023-11-26 18:37:55 +05:30
Monolithon Administrator
284a40aa63 fix: Add name to Hungary - Chart of Accounts for Microenterprises json (#38278)
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-11-26 18:17:10 +05:30
Deepesh Garg
2989e36b1d Merge pull request #38284 from vorasmit/fetch-item-tax-values
fix: fetch item_tax_template values if fields with fetch_from exisit
2023-11-26 17:54:35 +05:30
rohitwaghchaure
d8245cef72 fix: job card overlap validation (#38345) 2023-11-26 16:13:39 +05:30
s-aga-r
edf4514d8b Merge pull request #38261 from s-aga-r/FIX-STOCK-RESERVATION-DIALOG-BOX
fix(ux): Sales Order Stock Reservation Dialog
2023-11-26 11:02:02 +05:30
Raffael Meyer
477d9fa87e feat: new Report "Lost Quotations" (#38309) 2023-11-24 22:27:01 +01:00
Gursheen Kaur Anand
01f133f8c8 Merge branch 'develop' into make-against-field-dynamic 2023-11-24 15:23:44 +05:30
Gursheen Kaur Anand
d32147f8fe Merge pull request #38273 from GursheenK/email-digest-annual-income-expense
fix: annual income and expenses in email digest
2023-11-24 15:19:09 +05:30
NandhiniDevi
86aeacf393 add condition 2023-11-24 14:18:44 +05:30
s-aga-r
dd80d3b9b9 fix: dont show View button on cancelled SCR 2023-11-24 12:17:05 +05:30
s-aga-r
98cba5ed30 feat: add Subcontracting Receipt link in PO connections 2023-11-24 12:14:38 +05:30
s-aga-r
ca8a5b45ba feat: add Purchase Order link in SCR connections 2023-11-24 12:09:21 +05:30
ruthra kumar
9d6a06aec5 Merge pull request #38298 from ruthra-kumar/simplied_purchase_cost_update
perf: optimize update_purchase_cost method
2023-11-24 11:48:36 +05:30
ruthra kumar
dd016e6ced refactor: update project costing based on frequency 2023-11-24 11:18:51 +05:30
ruthra kumar
0fe6dcd742 refactor: make update_project_cost optional through Buying Settings 2023-11-24 11:18:51 +05:30
ruthra kumar
bcbe6c4a53 refactor: provide UI button to recalculate when needed 2023-11-24 11:18:48 +05:30
NandhiniDevi
f09c5f32cf add flt() for None type error 2023-11-24 11:17:35 +05:30
ruthra kumar
3ca7e442bc Merge pull request #38283 from ruthra-kumar/move_patch_to_pre_model
chore: move reconciliation cleanup patch to pre-model
2023-11-24 10:06:46 +05:30
Deepesh Garg
8ac647ece7 Merge pull request #38269 from GursheenK/skip-fixed-assets-in-product-bundle
fix: skip fixed assets in product bundle
2023-11-24 09:59:35 +05:30
ruthra kumar
4307d3b5c9 Merge pull request #38296 from ruthra-kumar/indexes_on_journal_entry_child_tables
chore: index to speed up basic submit/cancel functions on purchase invoice
2023-11-24 09:45:14 +05:30
ruthra kumar
aa17110bde perf: optimize total_purchase_cost update 2023-11-24 09:41:38 +05:30
Devin Slauenwhite
3f6d805033 fix: display all item rate stop messages (#38289) 2023-11-23 22:42:12 +05:30
NandhiniDevi
64b44a360a add flt() for None type error (#38299) 2023-11-23 22:40:17 +05:30
s-aga-r
040cc8d22f feat: auto create PR on SCR submission 2023-11-23 22:16:27 +05:30
Raffael Meyer
3be345e605 feat: add Bank Transaction to connections in Journal and Payment Entry (#38297)
* feat(Payment Entry): Bank Transaction connection

* feat(Journal Entry): Bank Transaction connection
2023-11-23 14:02:27 +01:00
s-aga-r
e1cea25781 fix: maintain PO and PO Item ref in SCR Item 2023-11-23 17:48:34 +05:30
s-aga-r
a2ede7d6d5 feat: add field Purchase Order Item in SCO Item 2023-11-23 17:06:13 +05:30
s-aga-r
7e4dd33ab0 fix: hold PO item ref in SCO Service Item 2023-11-23 17:06:13 +05:30
s-aga-r
45d5cff47d feat: add field Purchase Order Item in SCO Service Item 2023-11-23 17:06:09 +05:30
s-aga-r
745e3bfb73 chore: notify user on SCO creation 2023-11-23 17:04:19 +05:30
s-aga-r
762906f240 feat: add field Action on Subcontracting Receipt Submission 2023-11-23 17:04:13 +05:30
s-aga-r
9ec6f1e1d6 feat: auto create SCO on PO submission 2023-11-23 17:04:07 +05:30
s-aga-r
628ea42b63 feat: add field Action on Purchase Order Submission 2023-11-23 17:03:59 +05:30
ruthra kumar
1efff268b0 chore: speed up Purchase Invoice cancellation 2023-11-23 16:56:35 +05:30
Smit Vora
b206b0583b fix: fetch item_tax_template values if fields with fetch_from exisit 2023-11-23 15:10:47 +05:30
Anand Baburajan
816b1b6bd5 fix: don't depreciate assets with no schedule on scrapping (#38276)
fix: don't depreciate non-depreciable assets on scrapping
2023-11-23 13:48:46 +05:30
ruthra kumar
24fcd67f8b chore: index to speed up queries on JE child table reference 2023-11-23 11:44:34 +05:30
s-aga-r
c99c805743 Merge pull request #38268 from s-aga-r/FIX-38222
fix: Supplier `Primary Contact`
2023-11-23 11:07:30 +05:30
ruthra kumar
f258ab5e98 chore: move reconciliation cleanup patch to pre-model 2023-11-23 10:39:41 +05:30
ruthra kumar
880a85d2af Merge pull request #38148 from ruthra-kumar/prevent_lock_on_reconciliation
refactor: convert Payment Reconciliation to virtual doctype
2023-11-23 10:16:55 +05:30
ruthra kumar
efd31a429c Merge pull request #38257 from ruthra-kumar/optimize_ple_outstanding_query
refactor: optmize outstanding amount query
2023-11-23 09:41:21 +05:30
Gursheen Anand
728cc9f725 fix: fiscal year using future date 2023-11-22 19:28:57 +05:30
Gursheen Anand
52305e3000 fix: annual income and expenses in digest 2023-11-22 18:38:33 +05:30
Gursheen Anand
1657337887 chore: linting issues 2023-11-22 16:45:14 +05:30
Gursheen Anand
362f377f61 fix: skip disabled bundles for non-report utils 2023-11-22 16:26:09 +05:30
Gursheen Anand
8bdb61cb87 fix: condition in other bundle utils 2023-11-22 16:17:23 +05:30
Gursheen Anand
67f43d37df fix: validation for existing bundles 2023-11-22 16:10:49 +05:30
Gursheen Anand
3543f86c63 fix: has_product_bundle util to only check for enabled bundles 2023-11-22 16:04:05 +05:30
s-aga-r
627165dc7c fix: Supplier Primary Contact 2023-11-22 15:27:07 +05:30
Gursheen Anand
874774fe6c fix: filter bundle items based on disabled check 2023-11-22 15:24:56 +05:30
Gursheen Anand
ee76af7681 feat: add disabled field in product bundle 2023-11-22 15:23:17 +05:30
Gursheen Anand
f9713eeb56 fix: skip fixed assets in parent 2023-11-22 15:22:42 +05:30
rohitwaghchaure
0ca7527f7a fix: patch - Duplicate entry quality inspection parameter (#38262) 2023-11-22 14:02:01 +05:30
s-aga-r
2a41da94d4 fix(ux): no need to select rows to unreserve the stock 2023-11-22 11:38:08 +05:30
s-aga-r
73586fd9b2 fix: use field sales_order_item instead name 2023-11-22 11:37:14 +05:30
s-aga-r
9c889b37fb fix(ux): no need to select rows to reserve the stock 2023-11-22 11:27:58 +05:30
Ankush Menat
b11ae4b54c chore: remove dead link 2023-11-22 10:26:50 +05:30
ruthra kumar
e3af1dc864 Merge pull request #38258 from ruthra-kumar/rename_unreconcile
refactor: rename 'Unreconcile Payments' doctype to singular 'Unreconcile Payment'
2023-11-22 10:03:13 +05:30
ruthra kumar
8b04c1d4f6 refactor: optimize outstanding vouchers query 2023-11-22 10:00:12 +05:30
ruthra kumar
74f9e34182 chore: update new unreconcile doctype name in JS and PY files 2023-11-22 05:59:20 +05:30
ruthra kumar
1fddc30350 Merge pull request #38081 from GursheenK/validate-repost-ledger-settings-for-editable-invoices
fix: check reposting ledger settings before setting repost flag
2023-11-22 05:22:59 +05:30
Anand Baburajan
e2bb4e2baa fix: set asset's valuation_rate according to asset quantity (#38254) 2023-11-21 22:32:43 +05:30
ruthra kumar
9006c9b747 chore: rename 'unreconcile payments' to 'unreconcile payment' 2023-11-21 16:44:01 +05:30
Gursheen Anand
6518582ed3 fix: unset discount amount based on coupon code 2023-11-21 15:14:55 +05:30
rohitwaghchaure
5c308a4f9a fix: valuation rate for FG item for subcontracting receipt (#38244) 2023-11-21 14:42:26 +05:30
Rucha Mahabal
ac91030b31 fix(Timesheet): warn user if billing hours > actual hours instead of resetting (#38239)
* revert: "fix(Timesheet): reset billing hours equal to hours if they exceed actual hours"

This reverts commit 0ec8034507.

* fix: warn user if billing hours > actual hours
2023-11-21 13:18:34 +05:30
ruthra kumar
9680edfcc3 Merge pull request #38234 from ruthra-kumar/test_case_for_rounding_issue
test: prevent rounding loss based validation error
2023-11-21 12:09:54 +05:30
ruthra kumar
56e991b7f4 test: prevent rounding loss based validation error 2023-11-21 11:46:45 +05:30
Anand Baburajan
9903049c7a fix: set default asset quantity as 1 [dev] (#38223)
* fix: make default asset quantity as 1

* fix: get rate_of_depreciation from asset category for asset auto-creation

* chore: create asset depr schedules on PR submit, not asset submit

* fix: set default asset quantity as 1

* chore: move patch from v15 to v14
2023-11-20 22:27:16 +05:30
Dany Robert
f34ffc2062 fix: exclude invoice_doctypes from party advance 2023-11-20 11:10:56 +00:00
ruthra kumar
f50d933a25 Merge pull request #38212 from ruthra-kumar/update_hook
refactor: update scheduled job for bulk transaction
2023-11-20 14:16:11 +05:30
ruthra kumar
ce092bf23b Merge pull request #38210 from ruthra-kumar/set_default_on_billed_amt_update
refactor: extend billed amount update flag to POS Invoice as well
2023-11-20 14:05:45 +05:30
ruthra kumar
fb06ad7330 refactor: update scheduled job for bulk transaction 2023-11-20 13:28:55 +05:30
s-aga-r
80ab4eea8c Merge pull request #38207 from s-aga-r/FIX-37809
fix(ux): `Task` creation from `Timesheet`
2023-11-20 12:39:30 +05:30
ruthra kumar
83a13e22b7 refactor: add flag to POS Invoice 2023-11-20 12:29:37 +05:30
ruthra kumar
ee0c64215d refactor: set default for 'update_billed_amount_in_delivery_note' 2023-11-20 12:29:35 +05:30
s-aga-r
5ac8bd7f08 Merge pull request #38200 from s-aga-r/FIX-38188
fix: TypeError in Subcontracting Receipt
2023-11-20 12:14:23 +05:30
s-aga-r
2f3fc12c08 fix: add route options for new Task 2023-11-20 12:05:25 +05:30
s-aga-r
331ad62f3c fix(ux): enable Quick Entry for Task 2023-11-20 12:04:03 +05:30
s-aga-r
f6e93f084a fix: TypeError in Subcontracting Receipt 2023-11-20 10:23:57 +05:30
ruthra kumar
7b2eacd4d8 Merge pull request #38159 from ruthra-kumar/provision_to_truncate_remarks
refactor: provision to truncate `remarks` in General Ledger and Accounts Receivable/Payable reports
2023-11-20 10:07:10 +05:30
ruthra kumar
a9bf906545 refactor: add substring logic in ar/ap report 2023-11-20 09:38:26 +05:30
ruthra kumar
97090ff367 refactor: provision to set remarks length in accounts settings 2023-11-20 09:38:23 +05:30
Deepesh Garg
6c8b6de4c9 Merge pull request #38171 from rtdany10/rounded-total
fix: wrong round off and rounded total
2023-11-19 19:18:38 +05:30
Deepesh Garg
f91752cad2 Merge pull request #38177 from pps190/fix-pe-precision
fix: payment entry rounding error
2023-11-19 18:46:00 +05:30
Dany Robert
cc60c328fe fix: test case for rounded total with cash disc 2023-11-19 02:53:09 +00:00
Raffael Meyer
ff5b1b7ded style: remove trailing whitespace (#38183) 2023-11-18 17:45:14 +00:00
Raffael Meyer
a1ff7cab7e Merge pull request #38178 from barredterra/item-modified-timestamp 2023-11-18 18:07:11 +01:00
Patrick Eissler
32f622ef80 fix: valuation rate in report Item Prices (#38161)
Co-authored-by: PatrickDenis-stack <77415730+PatrickDenis-stack@users.noreply.github.com>
2023-11-18 15:54:34 +01:00
barredterra
969616ed09 fix: update modified timestamp
Was missing in 434c2a1815
2023-11-18 15:43:23 +01:00
Raffael Meyer
ca62cde9aa Merge pull request #38163 from PatrickDEissler/fix/table-was-mandatory-for-manufacturer 2023-11-18 15:37:51 +01:00
Devin Slauenwhite
3d1e3a9cde fix: payment entry rounding error 2023-11-18 14:36:20 +00:00
Deepesh Garg
184848edf9 Merge pull request #38147 from kunhimohamed/develop
fix: issue occured when creating supplier with contact details
2023-11-18 19:47:38 +05:30
Deepesh Garg
65ba5b3000 Merge pull request #38142 from deepeshgarg007/supplier_quotation_ad
feat: Add accounting dimensions to Supplier Quotation
2023-11-18 19:40:42 +05:30
Dany Robert
3a487bd33a fix: wrong round off and rounded total 2023-11-18 13:32:04 +00:00
Sagar Vora
56e92b702c Merge pull request #38167 from vishakhdesai/perm-check-fix 2023-11-18 17:37:34 +05:30
Vishakh Desai
45299fe4b3 fix: pass check permission in render_address 2023-11-18 17:10:01 +05:30
PatrickDenis-stack
434c2a1815 fix: attributes were mandatory for manufacturers 2023-11-18 11:16:06 +01:00
ruthra kumar
f31002636b chore: clear singles table and reconciliation related tables 2023-11-18 09:28:02 +05:30
ruthra kumar
b5dd0c8630 chore: remove reconciliation defaults from patch 2023-11-18 09:28:02 +05:30
ruthra kumar
9c7b19e0b7 refactor: virtual doctype methods 2023-11-18 09:27:59 +05:30
ruthra kumar
3a51a3f37e refactor: convert payment reconciliation tool to virtual doctype 2023-11-18 08:06:44 +05:30
s-aga-r
a5a5341643 Merge pull request #38127 from s-aga-r/FIX-37162
feat: add `Supplier Delivery Note` field in SCR
2023-11-17 18:46:58 +05:30
Rucha Mahabal
20c6e9fca2 fix(Timesheet): reset billing hours equal to hours if they exceed actual hours (#38134) 2023-11-17 18:08:55 +05:30
Gursheen Kaur Anand
5b3eba7bee Merge branch 'develop' into validate-repost-ledger-settings-for-editable-invoices 2023-11-17 14:21:02 +05:30
Gursheen Kaur Anand
8c6e341a71 Merge pull request #38144 from GursheenK/tax-report-party-without-naming-series
fix(minor): show party instead of party name where naming series not set
2023-11-17 14:18:16 +05:30
Kunhi
545ef3c234 fix: Suppier name was not taken when creating address from supplier 2023-11-17 11:43:36 +04:00
kunhi
7842c9fba8 fix: issue occured when creating supplier with contact details 2023-11-17 11:22:08 +04:00
Smit Vora
7e43d7b131 fix: allow regional gl in payment entry for gl preview (#38136) 2023-11-17 12:38:08 +05:30
Deepesh Garg
089da459f7 feat: Add accounting dimensions to Supplier Quotation 2023-11-17 12:37:14 +05:30
Gursheen Anand
b27af6b5c8 fix: show party instead of party name where naming series not set 2023-11-17 12:36:57 +05:30
ruthra kumar
c69fb80222 Merge pull request #38119 from ruthra-kumar/missing_filter_in_payable_report
fix: add revaluation journal filter in Payable report
2023-11-17 09:56:51 +05:30
ruthra kumar
134201794a fix: add revaluation journal filter in Payable report 2023-11-17 09:48:17 +05:30
rohitwaghchaure
2df767f596 fix: bom creator not able to amend / duplicate (#38128)
fix: bom creator not able to amend
2023-11-16 16:01:35 +05:30
s-aga-r
da80e4dbce feat: add Supplier Delivery Note field in SCR 2023-11-16 13:05:49 +05:30
s-aga-r
5cc8603cff Merge pull request #38090 from blaggacao/fix/dn-mapper
fix(dn): regression from bulk transaction fix
2023-11-16 12:42:25 +05:30
David Arnold
426c245032 fix(dn): regression from bulk transaction fix 2023-11-16 12:21:23 +05:30
Deepesh Garg
9731b74ad3 Merge pull request #38071 from GursheenK/unequal-dr-cr-for-payments-with-partial-credit-note
fix: handle partial return against invoices in payment entries
2023-11-16 10:35:55 +05:30
ruthra kumar
ee29526bbe Merge pull request #38038 from ruthra-kumar/refactor_bulk_transaction
refactor: supercharge Bulk actions
2023-11-16 09:51:34 +05:30
ruthra kumar
3e884d347a Merge pull request #38082 from ruthra-kumar/fix_fy_exception
refactor: use 'boolean' parameter while fetching FY year
2023-11-16 09:47:30 +05:30
Anand Baburajan
6e0362dee8 chore: change read only condition of asset quantity field (#38111)
chore: change read only condition of asset quantity
2023-11-15 17:58:37 +05:30
Gursheen Anand
2499675ad1 fix: test total unallocated amount in payment 2023-11-15 13:32:23 +05:30
Arjun
908b21f7fd fix: duplicate field in Closing Stock Balance (#38105) 2023-11-15 12:34:38 +05:30
Anand Baburajan
e93a19ffb5 chore: refetch item images on transaction save (#38095)
chore: re fetch item images on transaction save
2023-11-14 19:38:15 +05:30
rohitwaghchaure
3e77c0b564 fix: valuation rate for the subcontracting receipt supplied items with Serial and Batch Bundle (#38094)
fix: valuation rate for the subcontracting receipt supplied items with batch
2023-11-14 19:27:41 +05:30
rohitwaghchaure
e769e750ec fix: Not able to save subcontracting receipt (#38085) 2023-11-14 15:08:37 +05:30
ruthra kumar
c31ee8ea33 refactor: use 'boolean' parameter while fetching FY year 2023-11-14 07:25:10 +05:30
Gursheen Anand
894ae1fe0f fix: check reposting settings before allowing editable si 2023-11-13 20:28:44 +05:30
Gursheen Anand
5fae2f6d57 fix: allow on submit for child table fields 2023-11-13 20:27:09 +05:30
Gursheen Anand
ad5edbb1de fix: do not set repost flag without validating voucher 2023-11-13 20:25:26 +05:30
Gursheen Anand
780b827adc refactor: validate reposting settings for editables inv 2023-11-13 20:24:32 +05:30
Anand Baburajan
8e010ef063 Merge pull request #38077 from anandbaburajan/trans_delete_att_comm
chore: delete comments and unlink attachments on company transactions deletion
2023-11-13 18:55:44 +05:30
Gursheen Anand
09f9764bbd test: payment against partial return invoices 2023-11-13 18:11:00 +05:30
Gursheen Anand
a59c942cd4 fix: reset dr_or_cr for every reference 2023-11-13 18:09:49 +05:30
anandbaburajan
b097bb20d9 fix: unrelated transation date typo 2023-11-13 18:09:09 +05:30
anandbaburajan
2f9e96e324 chore: delete comments and unlink attachments on company transactions deletion 2023-11-13 18:03:33 +05:30
Dany Robert
56b8d1b927 fix: remove ESS role when not mapped to employee (#37867)
* fix: remove ESS role when not mapped to employee

* fix: emp role removal on unlinking

* fix: test case for user employee role mapping

* fix: mapped employee and user on creation
2023-11-13 17:00:02 +05:30
Gursheen Anand
5b446d4575 fix: handle partial return against invoices 2023-11-13 15:05:34 +05:30
mergify[bot]
9ae5c979e8 fix: Identical items are added line by line instead of grouped together in POS (#37986)
fix: Identical items are added line by line instead of grouped together in POS (#37986)

fix: Identical items are added line by line instead of grouped together in POS (#37986)
(cherry picked from commit 011cf3d73e)

Co-authored-by: bVisible <info@bvisible.ch>
2023-11-13 14:43:46 +05:30
David Arnold
ea7565889f feat(customer): add button to quick-create sales order and quotation (#37320)
* feat(customer): add button to quick-create sales order and quotation

* fix: create buttons in customer

* refactor: don't repeat yourself

---------

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
2023-11-13 14:19:22 +05:30
rohitwaghchaure
4a111f7362 fix: indentation issue in the Production Plan Summary report (#38019)
fix: Production Plan Summary report
2023-11-13 13:26:55 +05:30
ruthra kumar
ffd171a26b Merge pull request #38064 from ruthra-kumar/revaluation_checkbox_for_ar_summary
refactor: add revaluation journal checkbox in AR/AP summary reports
2023-11-13 12:07:33 +05:30
ruthra kumar
95edd82638 refactor: add revaluation journal checkbox in AR/AP summary reports 2023-11-13 11:56:43 +05:30
Raffael Meyer
e07c3aad6b Merge pull request #38063 from barredterra/remove-create-contact 2023-11-13 06:25:30 +01:00
ruthra kumar
a393a6b76c refactor: raise exception on invalid date 2023-11-13 10:39:40 +05:30
barredterra
d380bf8179 feat: remove unused method create_contact 2023-11-12 20:04:38 +01:00
Raffael Meyer
8062d2be3b Merge pull request #38060 from barredterra/refactor-fullname-parsing
refactor: parse full name
2023-11-12 16:16:15 +01:00
barredterra
d17e37c581 test: parse full name 2023-11-12 14:51:40 +01:00
barredterra
6f432b8e45 refactor: parse full name 2023-11-12 14:48:18 +01:00
Arjun
94faa44697 fix: close Credit Limit Crossed dialog (#38052) 2023-11-12 18:02:13 +05:30
David Arnold
9fde782403 fix(customer): contact creation for companies (#38055) 2023-11-12 17:51:18 +05:30
ViralKansodiya
ecc305dd59 fix: add customer name and supplier name columns (#37557)
fix: add customer name and supplier name columns
2023-11-12 17:48:37 +05:30
Niraj Gautam
6f6d5cb4cf fix(POS): 100 % Discount on Point of Sales (#37411)
fix: Allow 100% discount in POS
2023-11-12 11:52:35 +05:30
Deepesh Garg
8634abc021 fix: COA Importer app related issues (#37238)
* fix: COA Importer app related issues

* fix: Clear all account links fields befor import

* fix: Attribute error
2023-11-12 11:42:26 +05:30
David Arnold
a74e1f1600 fix(crm): ensure primary address and contact follows customer setting (#37710)
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-11-11 20:20:21 +05:30
hyaray
59438ee8d4 chore: Add missing translations (#38043)
chore: Add missing translations
2023-11-11 19:38:24 +05:30
David Arnold
4ed9927a30 fix(patch): to migrate properly in post section (#38045) 2023-11-11 19:37:23 +05:30
David Arnold
ae508144cd fix(customer): quick form and integration fixes (#37386) 2023-11-11 19:35:07 +05:30
ruthra kumar
a52a1b49af refactor: update traceback on retry 2023-11-11 05:20:27 +05:30
ruthra kumar
93295bf25b refactor: support list view filters 2023-11-11 05:10:16 +05:30
ruthra kumar
73639db910 chore: resolve linting issue 2023-11-10 15:27:28 +05:30
ruthra kumar
c320288690 refactor: rollback for retries and UI alerts 2023-11-10 13:45:52 +05:30
ruthra kumar
0aa1636d04 refactor: barebones retry functionality 2023-11-10 13:18:41 +05:30
ruthra kumar
194d70f8a0 chore: show retried in list view 2023-11-10 13:18:41 +05:30
ruthra kumar
af35590549 refactor: add basic functionalities 2023-11-10 13:18:41 +05:30
ruthra kumar
a248b13cc3 feat: virtual parent doctype 2023-11-10 13:18:41 +05:30
ruthra kumar
b0dfc936a1 chore: make from_doctype readonly 2023-11-10 13:18:41 +05:30
ruthra kumar
73090fa130 chore: add indexes 2023-11-10 13:18:41 +05:30
ruthra kumar
ade09bc709 chore: add list view filters 2023-11-10 13:18:33 +05:30
ruthra kumar
8d9f391309 Merge pull request #38004 from ruthra-kumar/ar_report_refactor_in_handling_gain_loss
fix: handling of exchange rate journals in AR/AP
2023-11-10 11:06:03 +05:30
ruthra kumar
ebd74a4e5b refactor: simplify logging logic bulk_transaction 2023-11-10 10:33:32 +05:30
ruthra kumar
c4f8f3613f chore: rearrange fields 2023-11-10 10:33:31 +05:30
ruthra kumar
e5a8ad54e2 chore: convert child to normal table 2023-11-10 10:33:31 +05:30
ruthra kumar
815c616f18 chore: remove 'Bulk Transaction Log' doctype 2023-11-10 10:33:31 +05:30
ruthra kumar
1d8fcd66e6 fix: new logic for handling revaluation journals 2023-11-10 10:31:39 +05:30
ruthra kumar
6ca3b26820 Merge pull request #37859 from marination/split-invoice-refactor
fix: `split_invoices_based_on_payment_terms`
2023-11-10 10:22:37 +05:30
s-aga-r
18a2e6ecb2 Merge pull request #38010 from s-aga-r/FIX-ITEM-READ-ONLY
fix: make item field read-only in batch
2023-11-10 10:21:20 +05:30
David Arnold
922fffda1f fix(payments): incoming payment requests aren't supposed to be in 'initiated' state (only outgoing are) (#37447)
* fix(payments): incoming payment requests aren't supposed to be in 'initiated' state (only outgoing are)

* fixup! fix(payments): incoming payment requests aren't supposed to be in 'initiated' state (only outgoing are)
2023-11-09 22:04:27 +05:30
marination
1fc5844025 fix: Re-add no.of rows split in alert message 2023-11-09 15:01:58 +01:00
jabir-elat
45b4bfc947 fix: sales order not assigned to territory orders (#37905)
filtered sales order are not assigned to 'territory_orders' which results in 0 order amount and 0 billing amount in the output
2023-11-09 18:30:00 +05:30
Sympatron GmbH
92f6d2c87c chore: Update de.csv (#37810)
chore: chore: Update de.csv
2023-11-09 18:27:11 +05:30
Vishakh Desai
c2bda2c705 fix: Supplier Quotation fields (#37963) 2023-11-09 18:26:34 +05:30
marination
4b4b176fcf style: Remove spaces introduced via merge conflict 2023-11-09 13:03:52 +01:00
Marica
a27374fd8f Merge branch 'develop' into split-invoice-refactor 2023-11-09 17:28:01 +05:30
marination
56ac3424d2 fix: Alert message and make sure invoice due dates are different for effective test
- Make invoice due dates are different so that the invoice with the earliest due date is allocated first in the test
- Translate voucher type, simplify alert message. The invoice could be "split" into 1 row, no. of rows in the message seems unnecessary.
2023-11-09 12:50:44 +01:00
ruthra kumar
696e2108ac Merge pull request #37746 from casesolved-co-uk/ar_billed_cur
feat: in_party_currency option for AR/AP reports
2023-11-09 13:04:47 +05:30
ruthra kumar
89612f2605 Merge pull request #37716 from vishdha/ar_report
feat: multi-select customer group in AR Report
2023-11-09 13:04:01 +05:30
rohitwaghchaure
a8216b9727 fix: make adjustment entry using stock reconciliation (#37995)
fix: do adjustment entry using stock reconciliation
2023-11-09 12:22:26 +05:30
s-aga-r
779260fb49 fix: make item field read-only in batch 2023-11-09 12:19:45 +05:30
Deepesh Garg
860b67e9c0 Merge pull request #37828 from GursheenK/payments-irrespective-of-party-types
fix: payments irrespective of party types
2023-11-09 12:14:58 +05:30
Deepesh Garg
47ba357bea Merge pull request #38000 from bosue/payment_entry_status
fix: Mark Status field in Payment Entry 'no_copy'.
2023-11-09 12:14:02 +05:30
ruthra kumar
3502c01aa4 Merge pull request #37860 from ruthra-kumar/filter_disable_accounts
refactor: ignore disabled account while selecting Income Accounts
2023-11-09 10:14:10 +05:30
ruthra kumar
6e3e094c95 refactor: ignore disabled account while selecting Income Accounts 2023-11-09 09:39:39 +05:30
Bernd Oliver Sünderhauf
a89afb65d7 fix: Mark Status field in Payment Entry 'no_copy'. 2023-11-08 21:52:32 +01:00
Anand Baburajan
9a171db97f fix: asset depreciation ledger (#37991)
* fix: include opening acc depr while calculating asset depr ledger report

* chore: include opening acc depr properly in acc depr amt

* chore: add cost_center in asset depr ledger report

* fix: handle finance books properly in asset depr ledger report

* chore: rename 'include default book entries' to 'include default FB entries'
2023-11-08 22:02:09 +05:30
s-aga-r
48567ef755 Merge pull request #37979 from s-aga-r/FIX-STOCK-RESERVATION
fix: ignore Stock Reservation for future dated PR
2023-11-08 19:45:15 +05:30
Deepesh Garg
b57eba6eaf Merge pull request #37987 from frappe/revert-37496-reset-tax-template-in-item-details
Revert "fix: set empty value for tax template in item details"
2023-11-08 19:13:30 +05:30
Deepesh Garg
70d99eebc0 Revert "fix: set empty value for tax template in item details (#37496)"
This reverts commit b0d440c34b.
2023-11-08 18:38:39 +05:30
Wolfram Schmidt
4783e4beee Update de.csv (#37981)
added translation for DocType Competitor https://www.duden.de/rechtschreibung/Konkurrent
2023-11-08 15:12:47 +05:30
Gursheen Anand
450c2470e9 refactor: set against account link for jv 2023-11-08 14:08:57 +05:30
Gursheen Anand
09439334ca refactor: use both fields to store against values 2023-11-08 12:57:00 +05:30
Gursheen Anand
f9c88ea7bc refactor: keep old against fields intact 2023-11-08 12:55:41 +05:30
s-aga-r
33eedb97dc fix: ignore Stock Reservation for future dated PR 2023-11-08 12:38:09 +05:30
Gursheen Anand
2984a86f37 fix: use get_all instead of get_list 2023-11-08 12:30:24 +05:30
Gursheen Anand
5f5d75a0bb chore: linting issues 2023-11-08 11:19:45 +05:30
ruthra kumar
6f231e4c83 Merge branch 'develop' into ar_billed_cur 2023-11-08 10:30:15 +05:30
ruthra kumar
c750e4d7ef Merge pull request #37971 from ruthra-kumar/performance_optimization_on_bulk_transaction_processing
refactor: optimize bulk transaction for speed
2023-11-08 06:32:23 +05:30
Gursheen Anand
291a499124 fix: split expected jv entries for scrap asset 2023-11-08 00:46:52 +05:30
s-aga-r
67b36a0823 Merge pull request #37970 from s-aga-r/FIX-5528
chore: typo in `Stock Entry` enqueue msg
2023-11-07 20:57:45 +05:30
marination
162c0497d1 test: get_outstanding_reference_documents (triggered via UI) 2023-11-07 14:44:04 +01:00
ruthra kumar
416bd400bb refactor: optimize for speed 2023-11-07 17:57:20 +05:30
s-aga-r
ee60fa940c chore: typo in Stock Entry enqueue msg 2023-11-07 17:33:29 +05:30
ruthra kumar
6210b24c64 Merge pull request #37954 from ruthra-kumar/expense_claim_repost
refactor: expand repost to `Expense Claim` and make it configurable
2023-11-07 15:40:55 +05:30
Gursheen Anand
68c6ad6036 fix: test for balance in forex account after revaluation 2023-11-07 15:31:52 +05:30
ruthra kumar
10b9570429 refactor: update permissions for repost settings 2023-11-07 14:30:06 +05:30
ruthra kumar
11c8d9fcf1 refactor(test): repost test case for purchase invoice 2023-11-07 14:18:07 +05:30
ruthra kumar
61705047b0 refactor: select distinct types 2023-11-07 13:42:09 +05:30
Gursheen Anand
ea4b6ff27b fix: remove string from against field in loyalty point entry 2023-11-07 13:05:38 +05:30
Gursheen Anand
5ce395a60a fix: purchase receipt test 2023-11-07 12:52:49 +05:30
ruthra kumar
ac79b8483f refactor(test): update repost settings for test cases 2023-11-07 12:46:06 +05:30
ruthra kumar
0135293127 Merge pull request #37956 from ruthra-kumar/type_error_on_payment_entry
fix: type error on new payment entry
2023-11-07 12:21:29 +05:30
ruthra kumar
adff287160 fix: type error on new payment entry 2023-11-07 12:15:25 +05:30
ruthra kumar
b651b36fff refactor: support for expense claim repost 2023-11-07 11:59:33 +05:30
ruthra kumar
5a068410c6 refactor: configurable repost settings 2023-11-07 11:59:33 +05:30
ruthra kumar
ebb186c8df chore: patch to update default repost settings value 2023-11-07 11:59:30 +05:30
ruthra kumar
d582a73795 feat: settings page for repost 2023-11-07 10:12:12 +05:30
Gursheen Anand
e845b63228 fix: single dr cr entries 2023-11-06 20:37:05 +05:30
ruthra kumar
cfe0479dfb Merge pull request #37948 from ruthra-kumar/typo_in_ar_report
fix: typo in AR report
2023-11-06 20:25:10 +05:30
ruthra kumar
67e74d03ed fix: typo in AR report 2023-11-06 20:23:26 +05:30
hyaray
8722318081 fix: add translation wrapper 2023-11-06 19:49:45 +05:30
s-aga-r
2d272fa51c Merge pull request #37903 from s-aga-r/FIX-5333
fix: link between parent and child procedure
2023-11-06 19:26:05 +05:30
s-aga-r
15840d408b Merge pull request #37935 from s-aga-r/FIX-5365
fix: don't reset rate if greater than zero in standalone debit note
2023-11-06 19:25:42 +05:30
s-aga-r
f9fc6c9c9d fix(test): test_gl_entries_for_standalone_debit_note 2023-11-06 19:02:01 +05:30
s-aga-r
30c6b83a10 test: add test case for Quality Procedure` 2023-11-06 18:55:06 +05:30
s-aga-r
1754d027b3 Merge pull request #37928 from s-aga-r/FIX-5227
fix: make `Material Request Item` required if `Material Request` is set in PO
2023-11-06 17:22:27 +05:30
Gursheen Anand
a1f8595a6a chore: linting issue 2023-11-06 17:20:11 +05:30
s-aga-r
5cce522ecd fix: don't reset rate if greater than zero in standalone debit note 2023-11-06 17:18:33 +05:30
Gursheen Anand
758ec720de fix: remove join for against in purchase receipt 2023-11-06 17:14:55 +05:30
Gursheen Kaur Anand
6280031722 Merge branch 'develop' into make-against-field-dynamic 2023-11-06 17:06:03 +05:30
Gursheen Anand
ff0343d2cc fix: auto separate against accounts 2023-11-06 16:46:43 +05:30
Gursheen Anand
3d00d74fed fix: combine jv entries for rate revaluation 2023-11-06 16:45:56 +05:30
vishal
30402033bc fix: minor change added to test_case 2023-11-06 13:02:04 +05:30
vishal
de445b32f5 feat(accounts_receivable): test_case added for multi-select customer group 2023-11-06 12:39:11 +05:30
rohitwaghchaure
34d3eb88b3 feat: reserved production plan sub assembly items (#37884) 2023-11-06 11:07:09 +05:30
s-aga-r
a9d91189b0 fix: make Material Request Item required if Material Request is set in PO 2023-11-06 11:05:04 +05:30
Gursheen Anand
84f0d1ff1f chore: linting issues 2023-11-06 10:30:49 +05:30
Gursheen Anand
98a8288da2 fix: handle gle for standalone credit and debit notes 2023-11-06 09:53:11 +05:30
Gursheen Anand
0e100cd451 fix: skip check for removed validation 2023-11-06 09:51:26 +05:30
ruthra kumar
e5a018f84c Merge pull request #37879 from ruthra-kumar/flag_to_toggle_dn_update_on_cr_note
refactor: flag to toggle billed amy update in DN for Credit Note
2023-11-06 08:40:27 +05:30
Deepesh Garg
2b02ef0066 fix: POS change amount gl entry with no amount (#37799) 2023-11-05 17:25:05 +05:30
viralkansodiya15
e5bc8fccb1 fix: list index out of range (#37890)
* fix: list index out of range

* fix: solve linter test failing
2023-11-05 11:54:35 +05:30
ruthra kumar
0c5bdbdcf3 refactor(test): enable billed amt update on Sales Return(Cr Note) 2023-11-05 08:32:27 +05:30
ruthra kumar
a3191f1c8c refactor: flag to toggle billed amy update in DN for Credit Note 2023-11-05 08:16:13 +05:30
ruthra kumar
787784e937 Merge pull request #37886 from ruthra-kumar/add_rounding_effect_in_reconciliation_tool
refactor: avoid precision based validation error while reconciling
2023-11-05 05:16:31 +05:30
Raffael Meyer
539ff03a7e Merge pull request #37299 from marination/party-name-match 2023-11-04 16:47:26 +01:00
s-aga-r
e42a3e0084 Merge pull request #37754 from s-aga-r/VALIDATE-RESERVED-STOCK
fix: consider reserved stock while cancelling a stock transaction
2023-11-04 15:36:49 +05:30
s-aga-r
8fbd4cea5b chore: add missing filters for Parent Procedure 2023-11-04 14:17:26 +05:30
s-aga-r
05f24ede96 fix: link between parent and child procedure 2023-11-04 14:17:24 +05:30
s-aga-r
54b323e557 test: add test case for stock stock reservation 2023-11-04 14:15:21 +05:30
s-aga-r
9231706227 fix: qty based check for stock reservation of serial-batch items based on qty 2023-11-04 14:15:21 +05:30
s-aga-r
1f88b1ef84 chore: patch to set reserved stock in Bin 2023-11-04 14:15:19 +05:30
s-aga-r
10242235bc fix(test): test_stock_reservation_against_sales_order 2023-11-04 14:14:58 +05:30
s-aga-r
73b65ac82e fix: consider reserved stock while cancelling a stock transaction 2023-11-04 14:14:58 +05:30
s-aga-r
f52916a2c3 feat: maintain Reserved Stock in Bin 2023-11-04 14:14:58 +05:30
s-aga-r
98d6cdd53c feat: add field reserved_stock in Bin 2023-11-04 14:14:58 +05:30
s-aga-r
e1a87a802d fix: consider reserved batches while cancelling a stock transaction 2023-11-04 14:14:58 +05:30
s-aga-r
d9e284366d fix: consider reserved serial nos while cancelling a stock transaction 2023-11-04 14:14:58 +05:30
ruthra kumar
56e9a46c17 Merge pull request #37887 from ruthra-kumar/add_index_to_payment_ledger
chore: performance optimization on payment ledger entry doctype
2023-11-04 08:56:52 +05:30
Anand Baburajan
2ce6bbf291 chore: rename depreciation_amount_based_on_num_days_in_month to daily_prorata_based [dev] (#37897)
chore: rename depreciation_amount_based_on_num_days_in_month to daily_prorata_based
2023-11-03 20:11:46 +00:00
Anand Baburajan
568d5bfbe8 chore: rename daily_depreciation in asset to depreciation_amount_based_on_num_days_in_month [dev] (#37893)
* chore: rename daily_depreciation to depreciation_based_on_num_days_in_month

* chore: add patch

* chore: remove unnecessary files

* chore: add amount in field name

* chore: add amount in label
2023-11-03 22:35:08 +05:30
ruthra kumar
60435daba3 refactor: avoid precision based validation error while reconciling 2023-11-03 17:58:19 +05:30
ruthra kumar
f14d1eb871 chore: performance optimization on payment ledger entry doctype 2023-11-03 17:56:40 +05:30
rohitwaghchaure
d4c0dbfacc fix: incorrect available qty for backdated stock reco with batch (#37858)
* fix: incorrect available qty for backdated stock reco with batch

* test: added test case
2023-11-03 17:19:06 +05:30
Ankush Menat
469ae2c7f1 perf: index return against for purchase invoice (#37881) 2023-11-03 15:57:52 +05:30
ruthra kumar
a9372c42cd Merge pull request #37869 from ruthra-kumar/reconcile_only_on_voucher
refactor: 'group only by voucher' flag in AR/AP report
2023-11-03 12:29:33 +05:30
ruthra kumar
edf67444ea Merge pull request #37852 from ruthra-kumar/better_gl_and_pl_comparision_report
refactor: better ledger comparision report
2023-11-03 12:29:18 +05:30
Gursheen Anand
4867ca353c refactor: move common util for fetching party types using account type 2023-11-03 12:00:56 +05:30
Gursheen Anand
4015723591 fix: credit note receive payment entry 2023-11-03 11:58:25 +05:30
s-aga-r
f70d779034 Merge pull request #37864 from s-aga-r/FIX-5139
fix: permission error while creating Supplier Quotation from Portal
2023-11-03 11:57:06 +05:30
ruthra kumar
23beb46d15 refactor: group only by voucher flag in AR/AP report 2023-11-03 11:47:02 +05:30
s-aga-r
e019d43d0b fix: permission error while creating Supplier Quotation from Portal 2023-11-03 00:53:30 +05:30
Deepesh Garg
c37e374fdd fix: Add index to supplier invoice field (#37861)
* fix: Add index to supplier invoice field

* chore: remove unintetional changes
2023-11-02 21:00:45 +05:30
Gursheen Anand
cd1e016163 test: receive payments from payable party 2023-11-02 17:39:27 +05:30
Gursheen Anand
1f4b381748 fix: test for invoice returns 2023-11-02 17:38:43 +05:30
rohitwaghchaure
fb9a80923b Merge pull request #37856 from rohitwaghchaure/fixed-test-cases-reposting-valuation
chore: fix test cases related repost item valuation
2023-11-02 14:52:15 +05:30
Rohit Waghchaure
ed1c198897 chore: fix test cases 2023-11-02 14:21:16 +05:30
Gursheen Kaur Anand
1b808e1d7c fix: standard submit perm in repost ledger for editable invoices (#37826)
* fix: ignore perm while reposting ledger

* fix: use flag in save

* fix: remove unnecessary save
2023-11-02 14:01:26 +05:30
ruthra kumar
639f427d6d refactor(test): for ledger comparision report 2023-11-02 13:40:40 +05:30
ruthra kumar
539f0251d9 refactor: better output on gl and pl comparison report 2023-11-02 13:37:25 +05:30
rohitwaghchaure
d91d9b02d4 Merge pull request #37849 from rohitwaghchaure/fixed-remove-voucher_type_no
fix: remove voucher type and no for Item and Warehouse based reposting
2023-11-02 13:26:44 +05:30
Rohit Waghchaure
0104897d69 fix: remove voucher type and no for Item and Warehouse based reposting 2023-11-02 13:24:56 +05:30
ruthra kumar
5530a5b303 Merge pull request #37845 from ruthra-kumar/std_permissions_for_process_payment_reconciliation_log
chore: add std permissions for Process Payment Reconciilation log
2023-11-02 12:10:19 +05:30
ruthra kumar
a9fceeb00f chore: std permissions for Process Payment Reconciilation log 2023-11-02 11:32:24 +05:30
ruthra kumar
34e3538b55 Merge pull request #37838 from ruthra-kumar/pass_limits_to_je_and_pe_queries
refactor: pass limits to JE and PE queries in reconciliation tool
2023-11-02 10:42:11 +05:30
s-aga-r
851a234988 Merge pull request #37819 from s-aga-r/FIX-5274
fix: `TypeError` in PR for non-stock item
2023-11-02 10:39:35 +05:30
s-aga-r
17893eff59 Merge pull request #37836 from barredterra/filters-from-route-in-stock-balance
feat(Stock Balance): add filters from route
2023-11-02 10:12:48 +05:30
ruthra kumar
54e8ce1ac5 refactor: pass limits to JE and PE queries in reconciliation tool 2023-11-02 09:16:26 +05:30
barredterra
38e5e4a893 feat(Stock Balance): add filters from route 2023-11-01 18:05:50 +01:00
ruthra kumar
65cc804186 Merge pull request #37832 from ruthra-kumar/checkbox_to_toggle_remarks_in_general_ledger
refactor: checkbox to toggle remarks in General Ledger
2023-11-01 21:15:47 +05:30
ruthra kumar
8fa677b8e8 refactor: checkbox to toggle remarks in General Ledger 2023-11-01 20:30:16 +05:30
marination
6bd56d2d5f refactor: split_invoices_based_on_payment_terms
- Invoices were in the wrong order due to the logic. The invoices with payment terms were added first and the rest after.
- Overly long function with unnecessary loops (reduced to one main loop) and complexity
- The split row as per payment terms was not ordered. So the second installment was allocated first
2023-11-01 20:11:00 +05:30
s-aga-r
204face50d Merge pull request #37827 from s-aga-r/REFACTOR-BIN
refactor: update fields label and remove unused fields from BIN
2023-11-01 16:25:40 +05:30
Raffael Meyer
c5f5aa8208 feat: report Timesheet Billing Summary (#37451) 2023-11-01 15:49:21 +05:30
Gursheen Anand
3d9938221a fix: remove validation for negative outstanding invoices 2023-11-01 15:40:54 +05:30
s-aga-r
f0a1f4ac7c refactor: remove unused fields fcfs_rate and ma_rate from Bin 2023-11-01 15:36:41 +05:30
s-aga-r
ec1a7869f8 refactor: rearrange fields and update label 2023-11-01 15:35:18 +05:30
mrchenxxx
7e67d42d1d chore: Update translations
chore: Update translations
2023-11-01 15:25:36 +05:30
Deepesh Garg
da9a7ff63d Merge pull request #37278 from barredterra/translate-accounts-settings-de
fix: german translations of Accounts Settings
2023-11-01 15:11:52 +05:30
Deepesh Garg
47f913abcb Merge pull request #37694 from viralpatel15/develop
fix: set docstatus filter to ignore cancel document
2023-11-01 14:16:31 +05:30
Deepesh Garg
fc4199504f Merge pull request #37590 from GursheenK/gov-compliance-for-tax-withholding-report
fix: gov compliance for tax withholding report
2023-11-01 14:09:29 +05:30
Deepesh Garg
0fc14b72ca Merge pull request #37635 from GursheenK/validation-for-order-item-from-qtn
fix: validate sales order item with quotation
2023-11-01 14:03:41 +05:30
Deepesh Garg
804ed0d26a Merge pull request #37680 from GursheenK/workaround-for-SO-status-updater
fix: status when over delivery or billing in SO
2023-11-01 12:29:28 +05:30
s-aga-r
028b3e2fbf fix: TypeError in PR for non-stock item 2023-11-01 11:48:27 +05:30
marination
e0a03789ae fix: Use process.extract to get the corresponding party doc name of the result
- rapidfuzz accepts an iterable or a dict. dict input gives the dict key and value in the result
2023-10-31 16:53:08 +01:00
s-aga-r
7a3e4a8a05 Merge pull request #37742 from aadhilpm/patch-1
fix: remove GoCardless Settings and Mpesa Settings from Workspace
2023-10-31 20:02:39 +05:30
Aadhil
e16cc38b70 fix: remove GoCardless Settings and Mpesa Settings from Workspace 2023-10-31 19:59:52 +05:30
ruthra kumar
c43b30cf36 Merge pull request #37795 from ruthra-kumar/patch_for_reconciliation_limits
chore: update default limit values in reconciliation tool
2023-10-31 19:51:13 +05:30
ruthra kumar
07a8024b45 Merge pull request #37793 from ruthra-kumar/refactor_ar_remarks_fetching
refactor: pull remarks only if needed on AR/AP report
2023-10-31 19:50:38 +05:30
s-aga-r
b64147cce9 Merge pull request #37644 from bosue/fix_typo_overrridden
chore: Fix typo followup to #37636
2023-10-31 19:45:37 +05:30
s-aga-r
058bb95171 Merge pull request #37743 from barredterra/translate-project-page
fix: make project page translatable
2023-10-31 19:41:02 +05:30
hyaray
daf2ec063c fix: In-Transit Warehouse company filter (#37796) 2023-10-31 18:51:27 +05:30
rohitwaghchaure
77af247450 chore: fixed test cases (#37792) 2023-10-31 18:02:24 +05:30
ruthra kumar
1fd888175f chore: update default limit values in reconciliation tool 2023-10-31 17:47:55 +05:30
David Arnold
fb0ec74d08 fix(packed_item): ensure proper names for ref integrity (#37597) 2023-10-31 17:41:44 +05:30
ruthra kumar
eb73017798 refactor: pull remarks only if needed on AR/AP report 2023-10-31 17:31:28 +05:30
David Arnold
139a68fd0f test: fix bad test data (#37773)
* test(stock): fix bad test data

* test(asset): fix bad test data

* test(stock): fix bad test data

* test(manufacturing): fix bad test data
2023-10-31 16:50:09 +05:30
mergify[bot]
d758fc1b89 fix: incorrect material request quantity in production plan (backport #37785) (#37789)
fix: incorrect material request quantity in production plan (#37785)

(cherry picked from commit 25718d9f1b)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-10-31 16:28:27 +05:30
rohitwaghchaure
056b74b162 fix: indexing on Delivery Note Item (#37766)
fix: added indexing on Delivery Note Item
2023-10-31 12:32:52 +05:30
s-aga-r
e752f8f0ef Merge pull request #37758 from s-aga-r/FIX-37566
fix: `PermissionError` while creating DN from SO
2023-10-30 18:08:27 +05:30
ruthra kumar
54a32adef3 Merge pull request #37761 from ruthra-kumar/add_index_to_posting_date_in_ple
chore: add index to posting_date in PLE
2023-10-30 16:48:46 +05:30
ruthra kumar
ca69845238 chore: add index to posting_date in PLE 2023-10-30 16:15:05 +05:30
ruthra kumar
d2fdda8bcd Merge pull request #37720 from ruthra-kumar/ignore_cancelled_entries_while_looking_for_currency
refactor: ignore cancelled GLE's while looking for currency of existing entries
2023-10-30 16:11:05 +05:30
s-aga-r
afc64ed9ee fix: ignore permissions while mapping DN Item 2023-10-30 15:39:11 +05:30
Didiman1998
500435b856 fix: make changes that enable gantt view for job cards (#37661)
* fix: make changes that enable gantt view for job cards

* fix: add fields on listview and remove from json file

* fix: undo modified date

---------

Co-authored-by: Dietmar Fischer <fischer@kk-software.de>
2023-10-30 15:18:41 +05:30
viralkansodiya15
a15484fe3d fix: solve linter test and update 2023-10-30 13:01:25 +05:30
viralkansodiya15
76c61c1b04 Merge branch 'frappe:develop' into develop 2023-10-30 12:12:47 +05:30
viralkansodiya15
de58c67991 fix: linter test solve 2023-10-30 10:44:17 +05:30
s-aga-r
8a34a4ba68 Merge pull request #37732 from bosue/remove_extraneous_disabled_filters
refactor: remove extraneous disabled filters
2023-10-30 09:54:05 +05:30
Richard Case
208d5042ee chore: update tests 2023-10-30 00:48:17 +00:00
Richard Case
ece7049390 feat: in_party_currency option for AR/AP reports 2023-10-30 00:15:05 +00:00
barredterra
e72afd0bd6 fix: make project page translatable 2023-10-29 17:48:48 +01:00
Deepesh Garg
83db7c6a65 Merge pull request #37737 from deepeshgarg007/arbnb_account_fetch
fix: fetch asset received but not billed account only when needed
2023-10-29 13:55:24 +05:30
s-aga-r
62384e9321 Merge pull request #37722 from s-aga-r/FIX-TYPO
fix: typo in function name and msg
2023-10-29 12:17:27 +05:30
Deepesh Garg
1081df3d7e Merge pull request #37674 from GursheenK/item-variant-tax-template
fix(minor): set tax values for item variants
2023-10-29 10:33:03 +05:30
Deepesh Garg
3a8736374c fix: fetch asset received but not billed account only when needed 2023-10-29 10:18:47 +05:30
Bernd Oliver Sünderhauf
f276fbba4f refactor: remove extraneous disabled filters 2023-10-28 02:10:28 +02:00
rohitwaghchaure
fd78f868e1 fix: unsupported operand type(s) for serial and batch bundle in POS Invoice (#37721) 2023-10-27 23:33:04 +05:30
Anand Baburajan
d99a56bc27 chore: allow wip_composite_asset in the MR PO PR PI flow (#37723) 2023-10-27 18:54:36 +05:30
s-aga-r
48c66b68ab fix: typo in function name and msg 2023-10-27 17:07:16 +05:30
ruthra kumar
8d9b90f3f5 refactor: ignore cancelled GLE's while looking for currency 2023-10-27 13:58:44 +05:30
Deepesh Garg
4a86375e89 Merge pull request #37690 from deepeshgarg007/plaid_fixes
fix(plaid): Do not sync pending transactions
2023-10-27 11:37:33 +05:30
vishal
b60c57a97d fix: minor issue 2023-10-27 11:22:55 +05:30
vishal
8903c1bc6f feat: multi-select customer group in AR Report 2023-10-27 11:12:55 +05:30
ruthra kumar
e33fd450fd Merge pull request #37707 from ruthra-kumar/typeerror_on_tds_payable_monthly
fix: typeerror on TDS payable monthly report
2023-10-27 07:36:19 +05:30
ruthra kumar
dc5d2c7406 fix: typerror on TDS payable monthly report 2023-10-26 20:36:52 +05:30
David Arnold
1612d7ba3f fix(defaults): apply discount and provisonal defaults from item group and brand if available (#37466) 2023-10-26 12:03:22 +00:00
David Arnold
681782121c fix: avoid name clash in delivery stop (#37306)
* fix(stock): avoid name clash in delivery stop with Document.lock()

* chore(stock): format delivery stop json according to doctype builder
2023-10-26 11:46:50 +00:00
s-aga-r
35cf944cb7 Merge pull request #37604 from blaggacao/feat/link-dn-list-from-dt-form
feat(delivery): link to delivery notes list view from delivery trip
2023-10-26 13:01:55 +05:30
viralkansodiya15
4bbad7f448 fix: set docstatus filter to ignore cancel document 2023-10-26 11:45:47 +05:30
s-aga-r
74b6bfb9eb Merge pull request #37686 from s-aga-r/FIX-37423
feat: allow return of components for SCO that don't have SCR created
2023-10-26 11:15:36 +05:30
Deepesh Garg
46ea868559 fix(plaid): Do not sync pending transactions 2023-10-25 22:58:24 +05:30
s-aga-r
3290df5593 fix: consider returned qty while calculating unsupplied qty 2023-10-25 19:08:51 +05:30
s-aga-r
8e3b9ec879 feat: allow return of components for SCO that don't have SCR created 2023-10-25 18:06:23 +05:30
s-aga-r
787fc8737f Merge pull request #37669 from s-aga-r/FIX-37664
refactor: rename field `Over Order Allowance` to `Blanket Order Allowance`
2023-10-25 14:53:25 +05:30
s-aga-r
fcfcf6957e chore: patch to rename field over_order_allowance 2023-10-25 14:03:53 +05:30
s-aga-r
8ffa2bfe25 refactor: rename field Over Order Allowance to Blanket Order Allowance 2023-10-25 14:03:51 +05:30
Gursheen Anand
d69b0d76dd fix: status for over delivery or billing 2023-10-25 13:59:37 +05:30
rohitwaghchaure
2bcff4c7f2 chore: fixed test case non_internal_transfer_delivery_note (#37671) 2023-10-25 13:24:34 +05:30
Gursheen Anand
d436a40739 fix: only update if variant table empty 2023-10-25 13:06:03 +05:30
Gursheen Anand
5deba1b6f9 fix: copy all child fields to item variant 2023-10-25 12:50:16 +05:30
mergify[bot]
886102d462 chore: fixed test cases related to Internal Transfer (backport #37659) (#37662)
* chore: fixed test cases related to Internal Transfer (#37659)

(cherry picked from commit 72d32a4901)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
#	erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py

* chore: fix conflicts

* chore: fix conflicts

* chore: fix test cases

---------

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-10-25 12:46:39 +05:30
Ankush Menat
7be578485e fix: force delete removed report (#37668) 2023-10-25 07:12:35 +00:00
ruthra kumar
7c1b990c55 Merge pull request #37625 from ruthra-kumar/set_multi_currency_fields_for_je_in_bank_reconciliation
refactor: set exchange rate on foreign currency JE from Bank Reconciliation
2023-10-25 11:08:55 +05:30
ruthra kumar
74a0d6408a refactor: handle bank transaction in foreign currency 2023-10-25 09:45:05 +05:30
rohitwaghchaure
92cbe580e6 fix: incorrect process loss validation for multiple finished items (#37576) 2023-10-24 15:28:55 +05:30
Ankush Menat
d92eb0c603 Update initiate_release.yml 2023-10-24 15:25:03 +05:30
Deepesh Garg
11d956fa18 fix: Purchase Receipt GL Entries (#37642)
* fix: Purchase Receipt GL Entries

* chore: cleanup

* test: set cwip account
2023-10-24 14:28:19 +05:30
s-aga-r
8e523961dc fix(patch): update_sre_from_voucher_details (#37649) 2023-10-24 14:13:26 +05:30
s-aga-r
cdbe1c87d4 Merge pull request #37603 from s-aga-r/AUTO-RESERVATION
feat: auto reserve stock for Sales Order on purchase
2023-10-24 10:14:18 +05:30
ruthra kumar
3f42128fff Merge pull request #37586 from ruthra-kumar/overallocation_on_po_to_multiple_invoices
fix: overallocation on purchase order to multiple invoices
2023-10-24 08:44:00 +05:30
ruthra kumar
4dff2c7a0d chore: fix flakiness test_sales_order_partial_advance_payment 2023-10-24 08:09:22 +05:30
ruthra kumar
547993f801 refactor(test): make use of utility methods 2023-10-24 06:40:14 +05:30
ruthra kumar
946228d783 test: overalloction on reconciliation when PO is involved 2023-10-24 06:40:14 +05:30
ruthra kumar
23df4205f8 fix: overallocation on Payment with PO/SO 2023-10-24 06:40:14 +05:30
ruthra kumar
89f484282a refactor: exc rate on foreign currency JE from Bank Reconciliation 2023-10-24 06:39:37 +05:30
Bernd Oliver Sünderhauf
9ef26e1df0 chore: Fix typo followup to #37636 2023-10-23 19:41:55 +02:00
ruthra kumar
025acc0e48 Merge pull request #37630 from ruthra-kumar/provision_to_set_for_gain_loss_journal
refactor: configurable exchange gain or loss posting date
2023-10-23 21:25:48 +05:30
s-aga-r
6942ab1012 chore: patch to update From Voucher details 2023-10-23 19:12:55 +05:30
Deepesh Garg
3bfb7b79f2 refactor: Remove expense included in valuation accounts (#37632)
* refactor: Remove expense included in valuation accounts

* test: Deprecate tests

* test: Depricate tests

* test: Depricate tests
2023-10-23 18:23:45 +05:30
s-aga-r
24788ddcc0 chore: add SRE link in PR Connections 2023-10-23 18:00:58 +05:30
s-aga-r
adf313a6d3 test: add test case for auto-reservation from PR 2023-10-23 17:52:59 +05:30
Raffael Meyer
7f39318340 Merge branch 'develop' into translate-accounts-settings-de 2023-10-23 13:24:27 +02:00
s-aga-r
a432290a82 fix: ignore qty msg if From Voucher is set 2023-10-23 16:26:00 +05:30
Imesha Sudasingha
2b64e1ca8b chore: typo in description (#37636)
chore: typo in description
2023-10-23 15:28:52 +05:30
ruthra kumar
514d5434a3 test: varying posting date for gain loss journal 2023-10-23 12:32:10 +05:30
ruthra kumar
7e600a6494 refactor: pass gain loss posting date to controller 2023-10-23 12:12:59 +05:30
Gursheen Anand
17ebc1ea80 fix: validate so item with qtn 2023-10-23 11:56:28 +05:30
Richard Case
b099590b2c fix: Quality Inspection Parameter migration - DuplicateEntryError due to case sensitivity (#37499)
* fix: account for case-insensitive database primary key for parameter names

* chore: linting
2023-10-23 11:40:07 +05:30
ruthra kumar
5323bb7bee refactor: introduce fields in popup 2023-10-23 10:45:21 +05:30
ruthra kumar
55dbcee36a refactor: gain_loss posting date fields in the allocation table 2023-10-23 10:45:17 +05:30
HENRY Florian
ec9434aae3 refactor: remove fr translation duplicate in frappe app (#37288) 2023-10-23 10:15:23 +05:30
Deepesh Garg
d1ec0a6093 chore: Add missing commits back (#37618)
* chore: Add missing commits back

* test: cwip accounting unit tests

* chore: Attribute error

* chore: Purchase Invoice tests

* chore: Missing asset account

* chore: Missing asset account

* chore: update tests

* fix: Internal transfer GL Entries
2023-10-23 00:16:40 +05:30
rohitwaghchaure
5136fe196b fix: remove from or target warehouse for non internal transfer entries (#37612) 2023-10-22 20:03:02 +05:30
Niraj Gautam
4aa841786f fix: Update user profile picture, if employee profile pic is changed (#37483)
* fix: Update user pic if employee pic is changed.

* fix: Update condition
2023-10-21 18:13:53 +05:30
Vishnu VS
98cc7434d2 feat(Supplier Scorecard): added method for invoiced quantity in supplier scorecard (#37580)
feat(Supplier Scorecard): added method for invoiced quantity in supplier scorecard

Co-authored-by: vishnu <vishnuviswambara2002@gmail.com>
2023-10-21 18:04:54 +05:30
Vishnu VS
35020a9423 fix: error while loading Financial Ratios report (#37613) 2023-10-21 18:02:32 +05:30
William Moreno
1cc1c9aa38 fix: Typo in Nicaraguan chart of accounts (#37620)
fix: Typo in Nicaraguan chart of accounts
2023-10-21 18:02:02 +05:30
Gursheen Kaur Anand
9d392970f0 fix(minor): filter bank accounts in bank statement import (#37525)
fix: filter by company in bank account
2023-10-21 17:59:12 +05:30
Gursheen Kaur Anand
b0d440c34b fix: set empty value for tax template in item details (#37496)
* fix: empty tax template for items with invalid templates

* fix: test for empty tax template

* fix: test for item tax template calculation

* fix: test for pos inv tax template calculation
2023-10-21 17:58:43 +05:30
Akhil Narang
21c3d9c371 refactor: use gzip library's compress() and decompress() methods directly (#37611)
The util methods in framework were added for python2.7 compat, so can be removed

Signed-off-by: Akhil Narang <me@akhilnarang.dev>

[skip ci]
2023-10-21 11:19:45 +05:30
Deepesh Garg
dae66eab36 Merge branch 'develop' of https://github.com/frappe/erpnext into asset_purchase_receipt_gl 2023-10-20 20:12:43 +05:30
Deepesh Garg
9474908449 fix: Purchase Invoice GL entires for assets 2023-10-20 19:49:41 +05:30
Deepesh Garg
eec4057e8d fix: Purchase Invoice GL entires for assets 2023-10-20 19:42:14 +05:30
Ankush Menat
08bc77fb95 Merge pull request #37614 from maharshivpatel/fix-new-logo
chore: new erpnext logo as per espresso
2023-10-20 17:53:41 +05:30
Maharshi Patel
fff97b1cd2 chore: new erpnext logo as per espresso 2023-10-20 17:34:57 +05:30
Deepesh Garg
2a7d1c4c8d Merge pull request #37595 from vorasmit/purchase-gl
fix: add regional support to extend purchase gl entries
2023-10-20 16:51:58 +05:30
Deepesh Garg
0b674b608b Merge branch 'develop' of https://github.com/frappe/erpnext into asset_purchase_receipt_gl 2023-10-20 16:50:52 +05:30
rohitwaghchaure
14b009b093 fix: incorrect cost center in the purchase invoice (#37591) 2023-10-20 16:22:29 +05:30
s-aga-r
530922848f Merge pull request #37605 from blaggacao/fix/rename-dt-fetch-stop-link-action
fix(delivery): rename dt fetch stop action
2023-10-20 16:08:44 +05:30
David Arnold
79d51a0a0b fix(delivery): rename dt fetch stop action 2023-10-20 12:31:46 +02:00
David Arnold
85488cd0dc feat(delivery): link to delivery notes list view from delivery trip 2023-10-20 12:25:19 +02:00
Ankush Menat
ce7ac29d06 fix: Correctly extract last message (#37602)
frappe.message_log now contains plain dictionary and not JSON strings,
so no need to load them.
2023-10-20 10:20:40 +00:00
s-aga-r
4f363f5bf3 fix: partial reservation against SBB 2023-10-20 15:46:06 +05:30
Smit Vora
ff7108a3b1 fix: update existing doc if possible 2023-10-20 09:33:37 +05:30
Smit Vora
77cc91d06b fix: add regional support to extend purchase gl entries 2023-10-19 22:35:55 +05:30
s-aga-r
45395027d3 fix: incorrect serial and batch get reserved 2023-10-19 19:57:50 +05:30
Gursheen Anand
6d5ccde864 feat: add cols for supplier inv details 2023-10-19 17:55:24 +05:30
s-aga-r
961d2d9926 refactor: rename field against_pick_list 2023-10-19 17:51:34 +05:30
Gursheen Anand
75441017c6 chore: linting issues 2023-10-19 17:13:58 +05:30
Gursheen Anand
ed2457bddf feat: proprietorship & partnership options in entity type 2023-10-19 16:59:49 +05:30
Gursheen Anand
4471ad581e fix: sort by section code 2023-10-19 16:54:10 +05:30
Gursheen Anand
7ecc0d5a04 chore: change column order 2023-10-19 16:44:08 +05:30
s-aga-r
78fe567419 refactor: rename field against_pick_list_item 2023-10-19 16:38:43 +05:30
s-aga-r
5ae9c2f62b feat: add field From Voucher Type in SRE 2023-10-19 16:21:32 +05:30
Gursheen Anand
705dadae8e refactor: avoid relying only on against in tds docs query 2023-10-19 16:21:15 +05:30
Ankush Menat
40cdde8820 ci: seutp v15 config
https://github.com/frappe/frappe/issues/22817
2023-10-19 15:55:02 +05:30
s-aga-r
64497c9228 feat: reserve stock for SO on PR submission 2023-10-19 15:53:38 +05:30
s-aga-r
188175be84 feat: add fields to hold SO and SO Item ref in PR Item 2023-10-19 14:50:38 +05:30
s-aga-r
2b4fa98941 refactor: rename field Auto Reserve Stock for Sales Order 2023-10-19 14:50:35 +05:30
s-aga-r
36a996d704 chore: make Reserve Stock checkbox visible in SO 2023-10-18 12:42:25 +05:30
Deepesh Garg
7f1d916f04 chore: rearrange functions 2023-10-18 08:59:28 +05:30
Deepesh Garg
e15546b42f chore: rearrange functions 2023-10-17 21:28:59 +05:30
Deepesh Garg
8c61fe2ca5 fix: rearrange functions 2023-10-17 20:36:09 +05:30
Deepesh Garg
7f865492d0 chore: pass stock value diff 2023-10-17 17:14:37 +05:30
Deepesh Garg
726fba61f3 Merge branch 'develop' of https://github.com/frappe/erpnext into asset_purchase_receipt_gl 2023-10-17 15:59:16 +05:30
Deepesh Garg
0b85a525fb fix: GL Entries for receiving non CWIP assets using Purchase Receipt 2023-10-17 13:28:56 +05:30
Gursheen Anand
35d92abe73 fix: remove multiple against account values from gle 2023-10-11 15:56:59 +05:30
Gursheen Anand
28445058ef fix: split exchange gain loss account entries 2023-10-11 15:56:13 +05:30
Gursheen Anand
aab5737ff3 fix: make JV account against field a dynamic link 2023-10-11 15:55:02 +05:30
barredterra
115f024260 fix(translations): suggestions from review 2023-10-03 23:06:48 +02:00
Gursheen Anand
952e8cf60c fix: asset capitalization tests 2023-10-03 15:55:34 +05:30
Gursheen Anand
fcfdb9b566 fix: purchase receipt tests 2023-10-03 15:19:33 +05:30
marination
ff1dc72d74 fix: Set right party name in bank transaction
- If party name and docname are different, set the docname in Bank Transaction
2023-09-29 15:19:09 +05:30
barredterra
b3486b43c4 fix: german translations of Accounts Settings 2023-09-27 18:51:09 +02:00
Gursheen Anand
f705bf2efe fix: remove multiple accounts from against in capitalization 2023-09-25 20:10:01 +05:30
Gursheen Anand
6e1565c32c fix: set against type in asset 2023-09-25 20:08:42 +05:30
Gursheen Anand
4ea43ebc5d fix: set against type in stock controller 2023-09-25 20:01:13 +05:30
Gursheen Anand
f292a0cc4c fix: set against type in utils 2023-09-25 19:58:12 +05:30
Gursheen Anand
4c5a83d6cf fix: set against type in controllers 2023-09-25 19:55:40 +05:30
Gursheen Anand
82774f89b1 fix: set against type in deferred revenue 2023-09-25 19:50:47 +05:30
Gursheen Anand
19b220f39c fix: set against type in inv gl dict 2023-09-25 19:49:17 +05:30
Gursheen Anand
725a7f90e9 fix: use dynamic link for against field 2023-09-25 19:45:19 +05:30
336 changed files with 8764 additions and 8938 deletions

View File

@@ -28,4 +28,7 @@ b147b85e6ac19a9220cd1e2958a6ebd99373283a
494bd9ef78313436f0424b918f200dab8fc7c20b
# bulk format python code with black
baec607ff5905b1c67531096a9cf50ec7ff00a5d
baec607ff5905b1c67531096a9cf50ec7ff00a5d
# bulk refactor with sourcery
eb9ee3f79b94e594fc6dfa4f6514580e125eee8c

60
.github/helper/translation.py vendored Normal file
View File

@@ -0,0 +1,60 @@
import re
import sys
errors_encounter = 0
pattern = re.compile(r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,(\s*?.*?\n*?)*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)")
words_pattern = re.compile(r"_{1,2}\([\"'`]{1,3}.*?[a-zA-Z]")
start_pattern = re.compile(r"_{1,2}\([f\"'`]{1,3}")
f_string_pattern = re.compile(r"_\(f[\"']")
starts_with_f_pattern = re.compile(r"_\(f")
# skip first argument
files = sys.argv[1:]
files_to_scan = [_file for _file in files if _file.endswith(('.py', '.js'))]
for _file in files_to_scan:
with open(_file, 'r') as f:
print(f'Checking: {_file}')
file_lines = f.readlines()
for line_number, line in enumerate(file_lines, 1):
if 'frappe-lint: disable-translate' in line:
continue
start_matches = start_pattern.search(line)
if start_matches:
starts_with_f = starts_with_f_pattern.search(line)
if starts_with_f:
has_f_string = f_string_pattern.search(line)
if has_f_string:
errors_encounter += 1
print(f'\nF-strings are not supported for translations at line number {line_number}\n{line.strip()[:100]}')
continue
else:
continue
match = pattern.search(line)
error_found = False
if not match and line.endswith((',\n', '[\n')):
# concat remaining text to validate multiline pattern
line = "".join(file_lines[line_number - 1:])
line = line[start_matches.start() + 1:]
match = pattern.match(line)
if not match:
error_found = True
print(f'\nTranslation syntax error at line number {line_number}\n{line.strip()[:100]}')
if not error_found and not words_pattern.search(line):
error_found = True
print(f'\nTranslation is useless because it has no words at line number {line_number}\n{line.strip()[:100]}')
if error_found:
errors_encounter += 1
if errors_encounter > 0:
print('\nVisit "https://frappeframework.com/docs/user/en/translations" to learn about valid translation strings.')
sys.exit(1)
else:
print('\nGood To Go!')

26
.github/workflows/backport.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Backport
on:
pull_request_target:
types:
- closed
- labeled
jobs:
main:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout Actions
uses: actions/checkout@v2
with:
repository: "frappe/backport"
path: ./actions
ref: develop
- name: Install Actions
run: npm install --production --prefix ./actions
- name: Run backport
uses: ./actions/backport
with:
token: ${{secrets.RELEASE_TOKEN}}
labelsToAdd: "backport"
title: "{{originalTitle}}"

32
.github/workflows/initiate_release.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
# This workflow is agnostic to branches. Only maintain on develop branch.
# To add/remove versions just modify the matrix.
name: Create weekly release pull requests
on:
schedule:
# 9:30 UTC => 3 PM IST Tuesday
- cron: "30 9 * * 2"
workflow_dispatch:
jobs:
stable-release:
name: Release
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version: ["14", "15"]
steps:
- uses: octokit/request-action@v2.x
with:
route: POST /repos/{owner}/{repo}/pulls
owner: frappe
repo: erpnext
title: |-
"chore: release v${{ matrix.version }}"
body: "Automated weekly release."
base: version-${{ matrix.version }}
head: version-${{ matrix.version }}-hotfix
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

21
.github/workflows/lock.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-inactive-days: 14
pr-inactive-days: 14

View File

@@ -134,6 +134,7 @@ jobs:
}
update_to_version 14
update_to_version 15
echo "Updating to latest version"
git -C "apps/frappe" checkout -q -f "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"

View File

@@ -2,23 +2,21 @@ name: Generate Semantic Release
on:
push:
branches:
- version-15
- version-13
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout Entire Repository
uses: actions/checkout@v4
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18
- name: Setup dependencies
run: |
npm install @semantic-release/git @semantic-release/exec --no-save

View File

@@ -117,7 +117,7 @@ jobs:
FRAPPE_BRANCH: ${{ github.event.inputs.branch }}
- name: Run Tests
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --total-builds 4 --build-number ${{ matrix.container }}'
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --with-coverage --total-builds 4 --build-number ${{ matrix.container }}'
env:
TYPE: server
CI_BUILD_ID: ${{ github.run_id }}
@@ -126,3 +126,27 @@ jobs:
- name: Show bench output
if: ${{ always() }}
run: cat ~/frappe-bench/bench_start.log || true
- name: Upload coverage data
uses: actions/upload-artifact@v3
with:
name: coverage-${{ matrix.container }}
path: /home/runner/frappe-bench/sites/coverage.xml
coverage:
name: Coverage Wrap Up
needs: test
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v2
- name: Download artifacts
uses: actions/download-artifact@v3
- name: Upload coverage data
uses: codecov/codecov-action@v2
with:
name: MariaDB
fail_ci_if_error: true
verbose: true

View File

@@ -17,6 +17,7 @@ pull_request_rules:
- base=version-12
- base=version-14
- base=version-15
- base=version-16
actions:
close:
comment:
@@ -24,16 +25,6 @@ pull_request_rules:
@{{author}}, thanks for the contribution, but we do not accept pull requests on a stable branch. Please raise PR on an appropriate hotfix branch.
https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist#which-branch
- name: Auto-close PRs on pre-release branch
conditions:
- base=version-13-pre-release
actions:
close:
comment:
message: |
@{{author}}, pre-release branch is not maintained anymore. Releases are directly done by merging hotfix branch to stable branches.
- name: backport to develop
conditions:
- label="backport develop"
@@ -54,13 +45,13 @@ pull_request_rules:
assignees:
- "{{ author }}"
- name: backport to version-14-pre-release
- name: backport to version-15-hotfix
conditions:
- label="backport version-14-pre-release"
- label="backport version-15-hotfix"
actions:
backport:
branches:
- version-14-pre-release
- version-15-hotfix
assignees:
- "{{ author }}"
@@ -74,35 +65,6 @@ pull_request_rules:
assignees:
- "{{ author }}"
- name: backport to version-13-pre-release
conditions:
- label="backport version-13-pre-release"
actions:
backport:
branches:
- version-13-pre-release
assignees:
- "{{ author }}"
- name: backport to version-12-hotfix
conditions:
- label="backport version-12-hotfix"
actions:
backport:
branches:
- version-12-hotfix
assignees:
- "{{ author }}"
- name: backport to version-12-pre-release
conditions:
- label="backport version-12-pre-release"
actions:
backport:
branches:
- version-12-pre-release
assignees:
- "{{ author }}"
- name: Automatic merge on CI success and review
conditions:

View File

@@ -1,5 +1,5 @@
{
"branches": ["version-15"],
"branches": ["version-13"],
"plugins": [
"@semantic-release/commit-analyzer", {
"preset": "angular",
@@ -21,4 +21,4 @@
],
"@semantic-release/github"
]
}
}

View File

@@ -73,8 +73,6 @@ New passwords will be created for the ERPNext "Administrator" user, the MariaDB
1. [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines)
1. [Report Security Vulnerabilities](https://erpnext.com/security)
1. [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines)
1. [Translations](https://translate.erpnext.com)
## License

View File

@@ -3,7 +3,7 @@ import inspect
import frappe
__version__ = "15.8.2"
__version__ = "16.0.0-dev"
def get_default_company(user=None):
@@ -36,7 +36,7 @@ def get_default_cost_center(company):
if not frappe.flags.company_cost_center:
frappe.flags.company_cost_center = {}
if not company in frappe.flags.company_cost_center:
if company not in frappe.flags.company_cost_center:
frappe.flags.company_cost_center[company] = frappe.get_cached_value(
"Company", company, "cost_center"
)
@@ -47,7 +47,7 @@ def get_company_currency(company):
"""Returns the default company currency"""
if not frappe.flags.company_currency:
frappe.flags.company_currency = {}
if not company in frappe.flags.company_currency:
if company not in frappe.flags.company_currency:
frappe.flags.company_currency[company] = frappe.db.get_value(
"Company", company, "default_currency", cache=True
)
@@ -81,7 +81,7 @@ def is_perpetual_inventory_enabled(company):
if not hasattr(frappe.local, "enable_perpetual_inventory"):
frappe.local.enable_perpetual_inventory = {}
if not company in frappe.local.enable_perpetual_inventory:
if company not in frappe.local.enable_perpetual_inventory:
frappe.local.enable_perpetual_inventory[company] = (
frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
)
@@ -96,7 +96,7 @@ def get_default_finance_book(company=None):
if not hasattr(frappe.local, "default_finance_book"):
frappe.local.default_finance_book = {}
if not company in frappe.local.default_finance_book:
if company not in frappe.local.default_finance_book:
frappe.local.default_finance_book[company] = frappe.get_cached_value(
"Company", company, "default_finance_book"
)
@@ -108,7 +108,7 @@ def get_party_account_type(party_type):
if not hasattr(frappe.local, "party_account_types"):
frappe.local.party_account_types = {}
if not party_type in frappe.local.party_account_types:
if party_type not in frappe.local.party_account_types:
frappe.local.party_account_types[party_type] = (
frappe.db.get_value("Party Type", party_type, "account_type") or ""
)

View File

@@ -232,7 +232,7 @@ def calculate_monthly_amount(
if amount + already_booked_amount_in_account_currency > item.net_amount:
amount = item.net_amount - already_booked_amount_in_account_currency
if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date))
)
@@ -358,9 +358,11 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
account_currency = get_account_currency(item.expense_account or item.income_account)
if doc.doctype == "Sales Invoice":
against_type = "Customer"
against, project = doc.customer, doc.project
credit_account, debit_account = item.income_account, item.deferred_revenue_account
else:
against_type = "Supplier"
against, project = doc.supplier, item.project
credit_account, debit_account = item.deferred_expense_account, item.expense_account
@@ -413,6 +415,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
doc,
credit_account,
debit_account,
against_type,
against,
amount,
base_amount,
@@ -494,6 +497,7 @@ def make_gl_entries(
doc,
credit_account,
debit_account,
against_type,
against,
amount,
base_amount,
@@ -515,7 +519,9 @@ def make_gl_entries(
doc.get_gl_dict(
{
"account": credit_account,
"against_type": against_type,
"against": against,
"against_link": against,
"credit": base_amount,
"credit_in_account_currency": amount,
"cost_center": cost_center,
@@ -534,7 +540,9 @@ def make_gl_entries(
doc.get_gl_dict(
{
"account": debit_account,
"against_type": against_type,
"against": against,
"against_link": against,
"debit": base_amount,
"debit_in_account_currency": amount,
"cost_center": cost_center,

View File

@@ -91,8 +91,8 @@ class Account(NestedSet):
super(Account, self).on_update()
def onload(self):
frozen_accounts_modifier = frappe.db.get_value(
"Accounts Settings", "Accounts Settings", "frozen_accounts_modifier"
frozen_accounts_modifier = frappe.db.get_single_value(
"Accounts Settings", "frozen_accounts_modifier"
)
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
self.set_onload("can_freeze_account", True)

View File

@@ -77,7 +77,7 @@ frappe.treeview_settings["Account"] = {
// show Dr if positive since balance is calculated as debit - credit else show Cr
const balance = account.balance_in_account_currency || account.balance;
const dr_or_cr = balance > 0 ? "Dr": "Cr";
const dr_or_cr = balance > 0 ? __("Dr"): __("Cr");
const format = (value, currency) => format_currency(Math.abs(value), currency);
if (account.balance!==undefined) {

View File

@@ -74,7 +74,7 @@ def create_charts(
# after all accounts are already inserted.
frappe.local.flags.ignore_update_nsm = True
_import_accounts(chart, None, None, root_account=True)
rebuild_tree("Account", "parent_account")
rebuild_tree("Account")
frappe.local.flags.ignore_update_nsm = False
@@ -231,6 +231,8 @@ def build_account_tree(tree, parent, all_accounts):
tree[child.account_name]["account_type"] = child.account_type
if child.tax_rate:
tree[child.account_name]["tax_rate"] = child.tax_rate
if child.account_currency:
tree[child.account_name]["account_currency"] = child.account_currency
if not parent:
tree[child.account_name]["root_type"] = child.root_type

View File

@@ -1,4 +1,6 @@
{
"country_code": "hu",
"name": "Hungary - Chart of Accounts for Microenterprises",
"tree": {
"SZ\u00c1MLAOSZT\u00c1LY BEFEKTETETT ESZK\u00d6Z\u00d6K": {
"account_number": 1,
@@ -1651,4 +1653,4 @@
}
}
}
}
}

View File

@@ -1,6 +1,6 @@
{
"country_code": "ni",
"name": "Nicaragua - Catalogo de Cuentas",
"name": "Nicaragua - Catálogo de Cuentas",
"tree": {
"Activo": {
"Activo Corriente": {
@@ -491,4 +491,4 @@
"root_type": "Liability"
}
}
}
}

View File

@@ -11,6 +11,7 @@
{
"fieldname": "company",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"in_list_view": 1,
"label": "Company",
"options": "Company",
@@ -19,7 +20,7 @@
],
"istable": 1,
"links": [],
"modified": "2020-05-01 12:32:34.044911",
"modified": "2024-01-03 11:13:02.669632",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Allowed To Transact With",
@@ -28,5 +29,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -137,7 +137,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
"erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool.get_account_balance",
args: {
bank_account: frm.doc.bank_account,
till_date: frm.doc.bank_statement_from_date,
till_date: frappe.datetime.add_days(frm.doc.bank_statement_from_date, -1)
},
callback: (response) => {
frm.set_value("account_opening_balance", response.message);

View File

@@ -444,6 +444,10 @@ def reconcile_vouchers(bank_transaction_name, vouchers):
vouchers = json.loads(vouchers)
transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
transaction.add_payment_entries(vouchers)
transaction.validate_duplicate_references()
transaction.allocate_payment_entries()
transaction.update_allocated_amount()
transaction.set_status()
transaction.save()
return transaction

View File

@@ -2,6 +2,16 @@
// For license information, please see license.txt
frappe.ui.form.on("Bank Statement Import", {
onload(frm) {
frm.set_query("bank_account", function (doc) {
return {
filters: {
company: doc.company,
},
};
});
},
setup(frm) {
frappe.realtime.on("data_import_refresh", ({ data_import }) => {
frm.import_in_progress = false;

View File

@@ -112,7 +112,8 @@ class AutoMatchbyPartyNameDescription:
for party in parties:
filters = {"status": "Active"} if party == "Employee" else {"disabled": 0}
names = frappe.get_all(party, filters=filters, pluck=party.lower() + "_name")
field = party.lower() + "_name"
names = frappe.get_all(party, filters=filters, fields=[f"{field} as party_name", "name"])
for field in ["bank_party_name", "description"]:
if not self.get(field):
@@ -131,7 +132,11 @@ class AutoMatchbyPartyNameDescription:
def fuzzy_search_and_return_result(self, party, names, field) -> Union[Tuple, None]:
skip = False
result = process.extract(query=self.get(field), choices=names, scorer=fuzz.token_set_ratio)
result = process.extract(
query=self.get(field),
choices={row.get("name"): row.get("party_name") for row in names},
scorer=fuzz.token_set_ratio,
)
party_name, skip = self.process_fuzzy_result(result)
if not party_name:
@@ -149,14 +154,14 @@ class AutoMatchbyPartyNameDescription:
Returns: Result, Skip (whether or not to discontinue matching)
"""
PARTY, SCORE, CUTOFF = 0, 1, 80
SCORE, PARTY_ID, CUTOFF = 1, 2, 80
if not result or not len(result):
return None, False
first_result = result[0]
if len(result) == 1:
return (first_result[PARTY] if first_result[SCORE] > CUTOFF else None), True
return (first_result[PARTY_ID] if first_result[SCORE] > CUTOFF else None), True
second_result = result[1]
if first_result[SCORE] > CUTOFF:
@@ -165,7 +170,7 @@ class AutoMatchbyPartyNameDescription:
if first_result[SCORE] == second_result[SCORE]:
return None, True
return first_result[PARTY], True
return first_result[PARTY_ID], True
else:
return None, False

View File

@@ -3,12 +3,11 @@
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.utils import flt
from erpnext.controllers.status_updater import StatusUpdater
class BankTransaction(StatusUpdater):
class BankTransaction(Document):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
@@ -50,6 +49,15 @@ class BankTransaction(StatusUpdater):
def validate(self):
self.validate_duplicate_references()
def set_status(self):
if self.docstatus == 2:
self.db_set("status", "Cancelled")
elif self.docstatus == 1:
if self.unallocated_amount > 0:
self.db_set("status", "Unreconciled")
elif self.unallocated_amount <= 0:
self.db_set("status", "Reconciled")
def validate_duplicate_references(self):
"""Make sure the same voucher is not allocated twice within the same Bank Transaction"""
if not self.payment_entries:
@@ -83,12 +91,13 @@ class BankTransaction(StatusUpdater):
self.validate_duplicate_references()
self.allocate_payment_entries()
self.update_allocated_amount()
self.set_status()
def on_cancel(self):
for payment_entry in self.payment_entries:
self.clear_linked_payment_entry(payment_entry, for_cancel=True)
self.set_status(update=True)
self.set_status()
def add_payment_entries(self, vouchers):
"Add the vouchers with zero allocation. Save() will perform the allocations and clearance"
@@ -366,15 +375,17 @@ def set_voucher_clearance(doctype, docname, clearance_date, self):
and len(get_reconciled_bank_transactions(doctype, docname)) < 2
):
return
frappe.db.set_value(doctype, docname, "clearance_date", clearance_date)
elif doctype == "Sales Invoice":
frappe.db.set_value(
"Sales Invoice Payment",
dict(parenttype=doctype, parent=docname),
"clearance_date",
clearance_date,
)
if doctype == "Sales Invoice":
frappe.db.set_value(
"Sales Invoice Payment",
dict(parenttype=doctype, parent=docname),
"clearance_date",
clearance_date,
)
return
frappe.db.set_value(doctype, docname, "clearance_date", clearance_date)
elif doctype == "Bank Transaction":
# For when a second bank transaction has fixed another, e.g. refund

View File

@@ -0,0 +1,100 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on("Bisect Accounting Statements", {
onload(frm) {
frm.trigger("render_heatmap");
},
refresh(frm) {
frm.add_custom_button(__('Bisect Left'), () => {
frm.trigger("bisect_left");
});
frm.add_custom_button(__('Bisect Right'), () => {
frm.trigger("bisect_right");
});
frm.add_custom_button(__('Up'), () => {
frm.trigger("move_up");
});
frm.add_custom_button(__('Build Tree'), () => {
frm.trigger("build_tree");
});
},
render_heatmap(frm) {
let bisect_heatmap = frm.get_field("bisect_heatmap").$wrapper;
bisect_heatmap.addClass("bisect_heatmap_location");
// milliseconds in a day
let msiad=24*60*60*1000;
let datapoints = {};
let fr_dt = new Date(frm.doc.from_date).getTime();
let to_dt = new Date(frm.doc.to_date).getTime();
let bisect_start = new Date(frm.doc.current_from_date).getTime();
let bisect_end = new Date(frm.doc.current_to_date).getTime();
for(let x=fr_dt; x <= to_dt; x+=msiad){
let epoch_in_seconds = x/1000;
if ((bisect_start <= x) && (x <= bisect_end )) {
datapoints[epoch_in_seconds] = 1.0;
} else {
datapoints[epoch_in_seconds] = 0.0;
}
}
new frappe.Chart(".bisect_heatmap_location", {
type: "heatmap",
data: {
dataPoints: datapoints,
start: new Date(frm.doc.from_date),
end: new Date(frm.doc.to_date),
},
countLabel: 'Bisecting',
discreteDomains: 1,
});
},
bisect_left(frm) {
frm.call({
doc: frm.doc,
method: 'bisect_left',
freeze: true,
freeze_message: __("Bisecting Left ..."),
callback: (r) => {
frm.trigger("render_heatmap");
}
});
},
bisect_right(frm) {
frm.call({
doc: frm.doc,
freeze: true,
freeze_message: __("Bisecting Right ..."),
method: 'bisect_right',
callback: (r) => {
frm.trigger("render_heatmap");
}
});
},
move_up(frm) {
frm.call({
doc: frm.doc,
freeze: true,
freeze_message: __("Moving up in tree ..."),
method: 'move_up',
callback: (r) => {
frm.trigger("render_heatmap");
}
});
},
build_tree(frm) {
frm.call({
doc: frm.doc,
freeze: true,
freeze_message: __("Rebuilding BTree for period ..."),
method: 'build_tree',
callback: (r) => {
frm.trigger("render_heatmap");
}
});
},
});

View File

@@ -0,0 +1,194 @@
{
"actions": [],
"allow_rename": 1,
"creation": "2023-09-15 21:28:28.054773",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"section_break_cvfg",
"company",
"column_break_hcam",
"from_date",
"column_break_qxbi",
"to_date",
"column_break_iwny",
"algorithm",
"section_break_8ph9",
"current_node",
"section_break_ngid",
"bisect_heatmap",
"section_break_hmsy",
"bisecting_from",
"current_from_date",
"column_break_uqyd",
"bisecting_to",
"current_to_date",
"section_break_hbyo",
"heading_cppb",
"p_l_summary",
"column_break_aivo",
"balance_sheet_summary",
"b_s_summary",
"column_break_gvwx",
"difference_heading",
"difference"
],
"fields": [
{
"fieldname": "column_break_qxbi",
"fieldtype": "Column Break"
},
{
"fieldname": "from_date",
"fieldtype": "Datetime",
"label": "From Date"
},
{
"fieldname": "to_date",
"fieldtype": "Datetime",
"label": "To Date"
},
{
"default": "BFS",
"fieldname": "algorithm",
"fieldtype": "Select",
"label": "Algorithm",
"options": "BFS\nDFS"
},
{
"fieldname": "column_break_iwny",
"fieldtype": "Column Break"
},
{
"fieldname": "current_node",
"fieldtype": "Link",
"label": "Current Node",
"options": "Bisect Nodes"
},
{
"fieldname": "section_break_hmsy",
"fieldtype": "Section Break"
},
{
"fieldname": "current_from_date",
"fieldtype": "Datetime",
"read_only": 1
},
{
"fieldname": "current_to_date",
"fieldtype": "Datetime",
"read_only": 1
},
{
"fieldname": "column_break_uqyd",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_hbyo",
"fieldtype": "Section Break"
},
{
"fieldname": "p_l_summary",
"fieldtype": "Float",
"read_only": 1
},
{
"fieldname": "b_s_summary",
"fieldtype": "Float",
"read_only": 1
},
{
"fieldname": "difference",
"fieldtype": "Float",
"read_only": 1
},
{
"fieldname": "column_break_aivo",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_gvwx",
"fieldtype": "Column Break"
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company"
},
{
"fieldname": "column_break_hcam",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_ngid",
"fieldtype": "Section Break"
},
{
"fieldname": "section_break_8ph9",
"fieldtype": "Section Break",
"hidden": 1
},
{
"fieldname": "bisect_heatmap",
"fieldtype": "HTML",
"label": "Heatmap"
},
{
"fieldname": "heading_cppb",
"fieldtype": "Heading",
"label": "Profit and Loss Summary"
},
{
"fieldname": "balance_sheet_summary",
"fieldtype": "Heading",
"label": "Balance Sheet Summary"
},
{
"fieldname": "difference_heading",
"fieldtype": "Heading",
"label": "Difference"
},
{
"fieldname": "bisecting_from",
"fieldtype": "Heading",
"label": "Bisecting From"
},
{
"fieldname": "bisecting_to",
"fieldtype": "Heading",
"label": "Bisecting To"
},
{
"fieldname": "section_break_cvfg",
"fieldtype": "Section Break"
}
],
"hide_toolbar": 1,
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-12-01 16:49:54.073890",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bisect Accounting Statements",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"print": 1,
"read": 1,
"role": "Administrator",
"share": 1,
"write": 1
}
],
"read_only": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": []
}

View File

@@ -0,0 +1,226 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import datetime
from collections import deque
from math import floor
import frappe
from dateutil.relativedelta import relativedelta
from frappe import _
from frappe.model.document import Document
from frappe.utils import getdate
from frappe.utils.data import guess_date_format
class BisectAccountingStatements(Document):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from frappe.types import DF
algorithm: DF.Literal["BFS", "DFS"]
b_s_summary: DF.Float
company: DF.Link | None
current_from_date: DF.Datetime | None
current_node: DF.Link | None
current_to_date: DF.Datetime | None
difference: DF.Float
from_date: DF.Datetime | None
p_l_summary: DF.Float
to_date: DF.Datetime | None
# end: auto-generated types
def validate(self):
self.validate_dates()
def validate_dates(self):
if getdate(self.from_date) > getdate(self.to_date):
frappe.throw(
_("From Date: {0} cannot be greater than To date: {1}").format(
frappe.bold(self.from_date), frappe.bold(self.to_date)
)
)
def bfs(self, from_date: datetime, to_date: datetime):
# Make Root node
node = frappe.new_doc("Bisect Nodes")
node.root = None
node.period_from_date = from_date
node.period_to_date = to_date
node.insert()
period_queue = deque([node])
while period_queue:
cur_node = period_queue.popleft()
delta = cur_node.period_to_date - cur_node.period_from_date
if delta.days == 0:
continue
else:
cur_floor = floor(delta.days / 2)
next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor)
left_node = frappe.new_doc("Bisect Nodes")
left_node.period_from_date = cur_node.period_from_date
left_node.period_to_date = next_to_date
left_node.root = cur_node.name
left_node.generated = False
left_node.insert()
cur_node.left_child = left_node.name
period_queue.append(left_node)
next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))
right_node = frappe.new_doc("Bisect Nodes")
right_node.period_from_date = next_from_date
right_node.period_to_date = cur_node.period_to_date
right_node.root = cur_node.name
right_node.generated = False
right_node.insert()
cur_node.right_child = right_node.name
period_queue.append(right_node)
cur_node.save()
def dfs(self, from_date: datetime, to_date: datetime):
# Make Root node
node = frappe.new_doc("Bisect Nodes")
node.root = None
node.period_from_date = from_date
node.period_to_date = to_date
node.insert()
period_stack = [node]
while period_stack:
cur_node = period_stack.pop()
delta = cur_node.period_to_date - cur_node.period_from_date
if delta.days == 0:
continue
else:
cur_floor = floor(delta.days / 2)
next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor)
left_node = frappe.new_doc("Bisect Nodes")
left_node.period_from_date = cur_node.period_from_date
left_node.period_to_date = next_to_date
left_node.root = cur_node.name
left_node.generated = False
left_node.insert()
cur_node.left_child = left_node.name
period_stack.append(left_node)
next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))
right_node = frappe.new_doc("Bisect Nodes")
right_node.period_from_date = next_from_date
right_node.period_to_date = cur_node.period_to_date
right_node.root = cur_node.name
right_node.generated = False
right_node.insert()
cur_node.right_child = right_node.name
period_stack.append(right_node)
cur_node.save()
@frappe.whitelist()
def build_tree(self):
frappe.db.delete("Bisect Nodes")
# Convert str to datetime format
dt_format = guess_date_format(self.from_date)
from_date = datetime.datetime.strptime(self.from_date, dt_format)
to_date = datetime.datetime.strptime(self.to_date, dt_format)
if self.algorithm == "BFS":
self.bfs(from_date, to_date)
if self.algorithm == "DFS":
self.dfs(from_date, to_date)
# set root as current node
root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0]
self.get_report_summary()
self.current_node = root.name
self.current_from_date = self.from_date
self.current_to_date = self.to_date
self.save()
def get_report_summary(self):
filters = {
"company": self.company,
"filter_based_on": "Date Range",
"period_start_date": self.current_from_date,
"period_end_date": self.current_to_date,
"periodicity": "Yearly",
}
pl_summary = frappe.get_doc("Report", "Profit and Loss Statement")
self.p_l_summary = pl_summary.execute_script_report(filters=filters)[5]
bs_summary = frappe.get_doc("Report", "Balance Sheet")
self.b_s_summary = bs_summary.execute_script_report(filters=filters)[5]
self.difference = abs(self.p_l_summary - self.b_s_summary)
def update_node(self):
current_node = frappe.get_doc("Bisect Nodes", self.current_node)
current_node.balance_sheet_summary = self.b_s_summary
current_node.profit_loss_summary = self.p_l_summary
current_node.difference = self.difference
current_node.generated = True
current_node.save()
def current_node_has_summary_info(self):
"Assertion method"
return frappe.db.get_value("Bisect Nodes", self.current_node, "generated")
def fetch_summary_info_from_current_node(self):
current_node = frappe.get_doc("Bisect Nodes", self.current_node)
self.p_l_summary = current_node.balance_sheet_summary
self.b_s_summary = current_node.profit_loss_summary
self.difference = abs(self.p_l_summary - self.b_s_summary)
def fetch_or_calculate(self):
if self.current_node_has_summary_info():
self.fetch_summary_info_from_current_node()
else:
self.get_report_summary()
self.update_node()
@frappe.whitelist()
def bisect_left(self):
if self.current_node is not None:
cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
if cur_node.left_child is not None:
lft_node = frappe.get_doc("Bisect Nodes", cur_node.left_child)
self.current_node = cur_node.left_child
self.current_from_date = lft_node.period_from_date
self.current_to_date = lft_node.period_to_date
self.fetch_or_calculate()
self.save()
else:
frappe.msgprint(_("No more children on Left"))
@frappe.whitelist()
def bisect_right(self):
if self.current_node is not None:
cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
if cur_node.right_child is not None:
rgt_node = frappe.get_doc("Bisect Nodes", cur_node.right_child)
self.current_node = cur_node.right_child
self.current_from_date = rgt_node.period_from_date
self.current_to_date = rgt_node.period_to_date
self.fetch_or_calculate()
self.save()
else:
frappe.msgprint(_("No more children on Right"))
@frappe.whitelist()
def move_up(self):
if self.current_node is not None:
cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
if cur_node.root is not None:
root = frappe.get_doc("Bisect Nodes", cur_node.root)
self.current_node = cur_node.root
self.current_from_date = root.period_from_date
self.current_to_date = root.period_to_date
self.fetch_or_calculate()
self.save()
else:
frappe.msgprint(_("Reached Root"))

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 TestBisectAccountingStatements(FrappeTestCase):
pass

View File

@@ -0,0 +1,8 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
// frappe.ui.form.on("Bisect Nodes", {
// refresh(frm) {
// },
// });

View File

@@ -0,0 +1,97 @@
{
"actions": [],
"autoname": "autoincrement",
"creation": "2023-09-27 14:56:38.112462",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"root",
"left_child",
"right_child",
"period_from_date",
"period_to_date",
"difference",
"balance_sheet_summary",
"profit_loss_summary",
"generated"
],
"fields": [
{
"fieldname": "root",
"fieldtype": "Link",
"label": "Root",
"options": "Bisect Nodes"
},
{
"fieldname": "left_child",
"fieldtype": "Link",
"label": "Left Child",
"options": "Bisect Nodes"
},
{
"fieldname": "right_child",
"fieldtype": "Link",
"label": "Right Child",
"options": "Bisect Nodes"
},
{
"fieldname": "period_from_date",
"fieldtype": "Datetime",
"label": "Period_from_date"
},
{
"fieldname": "period_to_date",
"fieldtype": "Datetime",
"label": "Period To Date"
},
{
"fieldname": "difference",
"fieldtype": "Float",
"label": "Difference"
},
{
"fieldname": "balance_sheet_summary",
"fieldtype": "Float",
"label": "Balance Sheet Summary"
},
{
"fieldname": "profit_loss_summary",
"fieldtype": "Float",
"label": "Profit and Loss Summary"
},
{
"default": "0",
"fieldname": "generated",
"fieldtype": "Check",
"label": "Generated"
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-12-01 17:46:12.437996",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bisect Nodes",
"naming_rule": "Autoincrement",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Administrator",
"share": 1,
"write": 1
}
],
"read_only": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": []
}

View File

@@ -0,0 +1,29 @@
# 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 BisectNodes(Document):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from frappe.types import DF
balance_sheet_summary: DF.Float
difference: DF.Float
generated: DF.Check
left_child: DF.Link | None
name: DF.Int | None
period_from_date: DF.Datetime | None
period_to_date: DF.Datetime | None
profit_loss_summary: DF.Float
right_child: DF.Link | None
root: DF.Link | None
# end: auto-generated types
pass

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 TestBisectNodes(FrappeTestCase):
pass

View File

@@ -1,457 +1,152 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"actions": [],
"autoname": "naming_series:",
"beta": 0,
"creation": "2018-06-18 16:51:49.994750",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"naming_series",
"user",
"date",
"from_time",
"time",
"expense",
"custody",
"returns",
"outstanding_amount",
"payments",
"net_amount",
"amended_from"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "POS-CLO-",
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 1,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Series",
"length": 0,
"no_copy": 0,
"options": "POS-CLO-",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"read_only": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "user",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "User",
"length": 0,
"no_copy": 0,
"options": "User",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"reqd": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Today",
"fieldname": "date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"read_only": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "From Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"reqd": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "",
"fieldname": "time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "To Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"reqd": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "expense",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Expense",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"label": "Expense"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "custody",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Custody",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"label": "Custody"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "returns",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Returns",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
"precision": "2"
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "outstanding_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Outstanding Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"read_only": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.0",
"fieldname": "payments",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Payments",
"length": 0,
"no_copy": 0,
"options": "Cashier Closing Payments",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"options": "Cashier Closing Payments"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "net_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Net Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"read_only": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Cashier Closing",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
"read_only": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-02-19 08:35:24.157327",
"links": [],
"modified": "2023-12-28 13:15:46.858427",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing",
"name_case": "",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
}
"states": [],
"track_changes": 1
}

View File

@@ -44,7 +44,7 @@ class ExchangeRateRevaluation(Document):
self.set_total_gain_loss()
def validate_rounding_loss_allowance(self):
if not (self.rounding_loss_allowance >= 0 and self.rounding_loss_allowance < 1):
if self.rounding_loss_allowance < 0 or self.rounding_loss_allowance >= 1:
frappe.throw(_("Rounding Loss Allowance should be between 0 and 1"))
def set_total_gain_loss(self):

View File

@@ -17,10 +17,13 @@
"account_currency",
"debit_in_account_currency",
"credit_in_account_currency",
"against_type",
"against",
"against_link",
"against_voucher_type",
"against_voucher",
"voucher_type",
"voucher_subtype",
"voucher_no",
"voucher_detail_no",
"project",
@@ -128,6 +131,13 @@
"label": "Credit Amount in Account Currency",
"options": "account_currency"
},
{
"fieldname": "against_type",
"fieldtype": "Link",
"in_filter": 1,
"label": "Against Type",
"options": "DocType"
},
{
"fieldname": "against",
"fieldtype": "Text",
@@ -136,6 +146,13 @@
"oldfieldname": "against",
"oldfieldtype": "Text"
},
{
"fieldname": "against_link",
"fieldtype": "Dynamic Link",
"in_filter": 1,
"label": "Against",
"options": "against_type"
},
{
"fieldname": "against_voucher_type",
"fieldtype": "Link",
@@ -278,13 +295,18 @@
"fieldtype": "Currency",
"label": "Credit Amount in Transaction Currency",
"options": "transaction_currency"
},
{
"fieldname": "voucher_subtype",
"fieldtype": "Small Text",
"label": "Voucher Subtype"
}
],
"icon": "fa fa-list",
"idx": 1,
"in_create": 1,
"links": [],
"modified": "2023-08-16 21:38:44.072267",
"modified": "2023-12-18 15:38:14.006208",
"modified_by": "Administrator",
"module": "Accounts",
"name": "GL Entry",

View File

@@ -39,6 +39,8 @@ class GLEntry(Document):
account: DF.Link | None
account_currency: DF.Link | None
against: DF.Text | None
against_link: DF.DynamicLink | None
against_type: DF.Link | None
against_voucher: DF.DynamicLink | None
against_voucher_type: DF.Link | None
company: DF.Link | None
@@ -66,6 +68,7 @@ class GLEntry(Document):
transaction_exchange_rate: DF.Float
voucher_detail_no: DF.Data | None
voucher_no: DF.DynamicLink | None
voucher_subtype: DF.SmallText | None
voucher_type: DF.Link | None
# end: auto-generated types
@@ -432,8 +435,8 @@ def update_outstanding_amt(
def validate_frozen_account(account, adv_adj=None):
frozen_account = frappe.get_cached_value("Account", account, "freeze_account")
if frozen_account == "Yes" and not adv_adj:
frozen_accounts_modifier = frappe.db.get_value(
"Accounts Settings", None, "frozen_accounts_modifier"
frozen_accounts_modifier = frappe.db.get_single_value(
"Accounts Settings", "frozen_accounts_modifier"
)
if not frozen_accounts_modifier:

View File

@@ -153,7 +153,9 @@ class InvoiceDiscounting(AccountsController):
"account": inv.debit_to,
"party_type": "Customer",
"party": d.customer,
"against_type": "Account",
"against": self.accounts_receivable_credit,
"against_link": self.accounts_receivable_credit,
"credit": outstanding_in_company_currency,
"credit_in_account_currency": outstanding_in_company_currency
if inv.party_account_currency == company_currency
@@ -173,7 +175,9 @@ class InvoiceDiscounting(AccountsController):
"account": self.accounts_receivable_credit,
"party_type": "Customer",
"party": d.customer,
"against_type": "Account",
"against": inv.debit_to,
"against_link": inv.debit_to,
"debit": outstanding_in_company_currency,
"debit_in_account_currency": outstanding_in_company_currency
if ar_credit_account_currency == company_currency

View File

@@ -220,6 +220,16 @@ erpnext.accounts.JournalEntry = class JournalEntry extends frappe.ui.form.Contro
return erpnext.journal_entry.account_query(me.frm);
});
me.frm.set_query("against_account_link", "accounts", function(doc, cdt, cdn) {
return erpnext.journal_entry.against_account_query(me.frm);
});
me.frm.set_query("against_type", "accounts", function(){
return {
query: "erpnext.accounts.doctype.journal_entry.journal_entry.get_against_type",
}
})
me.frm.set_query("party_type", "accounts", function(doc, cdt, cdn) {
const row = locals[cdt][cdn];
@@ -591,6 +601,21 @@ $.extend(erpnext.journal_entry, {
return { filters: filters };
},
against_account_query: function(frm) {
if (frm.doc.against_type != "Account"){
return { filters: {} };
}
else {
let filters = { company: frm.doc.company, is_group: 0 };
if(!frm.doc.multi_currency) {
$.extend(filters, {
account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
});
}
return { filters: filters };
}
},
reverse_journal_entry: function() {
frappe.model.open_mapped_doc({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.make_reverse_journal_entry",

View File

@@ -304,6 +304,7 @@ class JournalEntry(AccountsController):
"account": tax_withholding_details.get("account_head"),
rev_debit_or_credit: tax_withholding_details.get("tax_amount"),
"against_account": parties[0],
"against_account_link": parties[0],
},
)
@@ -631,7 +632,7 @@ class JournalEntry(AccountsController):
)
# set totals
if not d.reference_name in self.reference_totals:
if d.reference_name not in self.reference_totals:
self.reference_totals[d.reference_name] = 0.0
if self.voucher_type not in ("Deferred Revenue", "Deferred Expense"):
@@ -750,27 +751,90 @@ class JournalEntry(AccountsController):
)
def set_against_account(self):
accounts_debited, accounts_credited = [], []
if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
for d in self.get("accounts"):
if d.reference_type == "Sales Invoice":
field = "customer"
against_type = "Customer"
else:
field = "supplier"
against_type = "Supplier"
d.against_account = frappe.db.get_value(d.reference_type, d.reference_name, field)
against_account = frappe.db.get_value(d.reference_type, d.reference_name, against_type.lower())
d.against_type = against_type
d.against_account_link = against_account
else:
for d in self.get("accounts"):
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)
self.get_debited_credited_accounts()
if len(self.accounts_credited) > 1 and len(self.accounts_debited) > 1:
self.auto_set_against_accounts()
return
self.get_against_accounts()
for d in self.get("accounts"):
if flt(d.debit) > 0:
d.against_account = ", ".join(list(set(accounts_credited)))
if flt(d.credit) > 0:
d.against_account = ", ".join(list(set(accounts_debited)))
def auto_set_against_accounts(self):
for i in range(0, len(self.accounts), 2):
acc = self.accounts[i]
against_acc = self.accounts[i + 1]
if acc.debit_in_account_currency > 0:
current_val = acc.debit_in_account_currency * flt(acc.exchange_rate)
against_val = against_acc.credit_in_account_currency * flt(against_acc.exchange_rate)
else:
current_val = acc.credit_in_account_currency * flt(acc.exchange_rate)
against_val = against_acc.debit_in_account_currency * flt(against_acc.exchange_rate)
if current_val == against_val:
acc.against_type = against_acc.party_type or "Account"
against_acc.against_type = acc.party_type or "Account"
acc.against_account_link = against_acc.party or against_acc.account
against_acc.against_account_link = acc.party or acc.account
else:
frappe.msgprint(
_(
"Unable to automatically determine {0} accounts. Set them up in the {1} table if needed."
).format(frappe.bold("against"), frappe.bold("Accounting Entries")),
alert=True,
)
break
def get_against_accounts(self):
self.against_accounts = []
self.split_account = {}
self.get_debited_credited_accounts()
if self.separate_against_account_entries:
no_of_credited_acc, no_of_debited_acc = len(self.accounts_credited), len(self.accounts_debited)
if no_of_credited_acc <= 1 and no_of_debited_acc <= 1:
self.set_against_accounts_for_single_dr_cr()
self.separate_against_account_entries = 0
elif no_of_credited_acc == 1:
self.against_accounts = self.accounts_debited
self.split_account = self.accounts_credited[0]
elif no_of_debited_acc == 1:
self.against_accounts = self.accounts_credited
self.split_account = self.accounts_debited[0]
def get_debited_credited_accounts(self):
self.accounts_debited, self.accounts_credited = [], []
self.separate_against_account_entries = 1
for d in self.get("accounts"):
if flt(d.debit) > 0:
self.accounts_debited.append(d)
elif flt(d.credit) > 0:
self.accounts_credited.append(d)
if d.against_account_link:
self.separate_against_account_entries = 0
break
def set_against_accounts_for_single_dr_cr(self):
against_account = None
for d in self.accounts:
if flt(d.debit) > 0:
against_account = self.accounts_credited[0]
elif flt(d.credit) > 0:
against_account = self.accounts_debited[0]
if against_account:
d.against_type = against_account.party_type or "Account"
d.against_account = against_account.party or against_account.account
d.against_account_link = against_account.party or against_account.account
def validate_debit_credit_amount(self):
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
@@ -967,42 +1031,108 @@ class JournalEntry(AccountsController):
def build_gl_map(self):
gl_map = []
conversion_rate_map = self.get_conversion_rate_map()
transaction_currency_map = self.get_transaction_currency_map()
company_currency = erpnext.get_company_currency(self.company)
self.get_against_accounts()
for d in self.get("accounts"):
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)
gl_map.append(
self.get_gl_dict(
{
"account": d.account,
"party_type": d.party_type,
"due_date": self.due_date,
"party": d.party,
"against": d.against_account,
"debit": flt(d.debit, d.precision("debit")),
"credit": flt(d.credit, d.precision("credit")),
"account_currency": d.account_currency,
"debit_in_account_currency": flt(
d.debit_in_account_currency, d.precision("debit_in_account_currency")
),
"credit_in_account_currency": flt(
d.credit_in_account_currency, d.precision("credit_in_account_currency")
),
"against_voucher_type": d.reference_type,
"against_voucher": d.reference_name,
"remarks": remarks,
"voucher_detail_no": d.reference_detail_no,
"cost_center": d.cost_center,
"project": d.project,
"finance_book": self.finance_book,
},
item=d,
)
gl_dict = self.get_gl_dict(
{
"account": d.account,
"party_type": d.party_type,
"due_date": self.due_date,
"party": d.party,
"debit": flt(d.debit, d.precision("debit")),
"credit": flt(d.credit, d.precision("credit")),
"account_currency": d.account_currency,
"debit_in_account_currency": flt(
d.debit_in_account_currency, d.precision("debit_in_account_currency")
),
"credit_in_account_currency": flt(
d.credit_in_account_currency, d.precision("credit_in_account_currency")
),
"against_voucher_type": d.reference_type,
"against_voucher": d.reference_name,
"remarks": remarks,
"voucher_detail_no": d.reference_detail_no,
"cost_center": d.cost_center,
"project": d.project,
"finance_book": self.finance_book,
"conversion_rate": conversion_rate_map.get(d.against_account_link, 1)
if d.account_currency == company_currency
else 1,
"currency": transaction_currency_map.get(d.against_account_link, d.account_currency)
if d.account_currency == company_currency
else d.account_currency,
},
item=d,
)
if not self.separate_against_account_entries:
gl_dict.update(
{
"against_type": d.against_type,
"against_link": d.against_account_link,
}
)
gl_map.append(gl_dict)
elif d in self.against_accounts:
gl_dict.update(
{
"against_type": self.split_account.get("party_type") or "Account",
"against": self.split_account.get("party") or self.split_account.get("account"),
"against_link": self.split_account.get("party") or self.split_account.get("account"),
}
)
gl_map.append(gl_dict)
else:
for against_account in self.against_accounts:
against_account = against_account.as_dict()
debit = against_account.credit or against_account.credit_in_account_currency
credit = against_account.debit or against_account.debit_in_account_currency
gl_dict = gl_dict.copy()
gl_dict.update(
{
"against_type": against_account.party_type or "Account",
"against": against_account.party or against_account.account,
"against_link": against_account.party or against_account.account,
"debit": flt(debit, d.precision("debit")),
"credit": flt(credit, d.precision("credit")),
"account_currency": d.account_currency,
"debit_in_account_currency": flt(
debit / d.exchange_rate, d.precision("debit_in_account_currency")
),
"credit_in_account_currency": flt(
credit / d.exchange_rate, d.precision("credit_in_account_currency")
),
}
)
gl_map.append(gl_dict)
return gl_map
def get_transaction_currency_map(self):
transaction_currency_map = {}
for account in self.get("accounts"):
transaction_currency_map.setdefault(account.party or account.account, account.account_currency)
return transaction_currency_map
def get_conversion_rate_map(self):
conversion_rate_map = {}
for account in self.get("accounts"):
conversion_rate_map.setdefault(account.party or account.account, account.exchange_rate)
return conversion_rate_map
def make_gl_entries(self, cancel=0, adv_adj=0):
from erpnext.accounts.general_ledger import make_gl_entries
@@ -1625,3 +1755,10 @@ def make_reverse_journal_entry(source_name, target_doc=None):
)
return doclist
@frappe.whitelist()
def get_against_type(doctype, txt, searchfield, start, page_len, filters):
against_types = frappe.db.get_list("Party Type", pluck="name") + ["Account"]
doctype = frappe.qb.DocType("DocType")
return frappe.qb.from_(doctype).select(doctype.name).where(doctype.name.isin(against_types)).run()

View File

@@ -37,7 +37,9 @@
"col_break3",
"is_advance",
"user_remark",
"against_account"
"against_type",
"against_account",
"against_account_link"
],
"fields": [
{
@@ -250,14 +252,21 @@
"print_hide": 1
},
{
"fieldname": "against_account",
"fieldtype": "Text",
"hidden": 1,
"fieldname": "against_account",
"fieldtype": "Text",
"hidden": 1,
"label": "Against Account",
"no_copy": 1,
"oldfieldname": "against_account",
"oldfieldtype": "Text",
"print_hide": 1
},
{
"fieldname": "against_account_link",
"fieldtype": "Dynamic Link",
"label": "Against Account",
"no_copy": 1,
"oldfieldname": "against_account",
"oldfieldtype": "Text",
"print_hide": 1
"options": "against_type"
},
{
"collapsible": 1,
@@ -280,14 +289,19 @@
"fieldtype": "Data",
"hidden": 1,
"label": "Reference Detail No",
"no_copy": 1,
"search_index": 1
"no_copy": 1
},
{
"fieldname": "against_type",
"fieldtype": "Link",
"label": "Against Type",
"options": "DocType"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2023-11-23 11:44:25.841187",
"modified": "2023-12-02 23:21:22.205409",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry Account",

View File

@@ -140,7 +140,7 @@ class TestLoyaltyProgram(unittest.TestCase):
"Loyalty Point Entry",
{"invoice_type": "Sales Invoice", "invoice": si.name, "customer": si.customer},
)
self.assertEqual(True, not (lpe is None))
self.assertEqual(True, lpe is not None)
# cancelling sales invoice
si.cancel()

View File

@@ -747,6 +747,10 @@ frappe.ui.form.on('Payment Entry', {
args["get_orders_to_be_billed"] = true;
}
if (frm.doc.book_advance_payments_in_separate_party_account) {
args["book_advance_payments_in_separate_party_account"] = true;
}
frappe.flags.allocate_payment_amount = filters['allocate_payment_amount'];
return frappe.call({

View File

@@ -223,6 +223,7 @@
"fieldname": "party_balance",
"fieldtype": "Currency",
"label": "Party Balance",
"no_copy": 1,
"print_hide": 1,
"read_only": 1
},
@@ -759,7 +760,7 @@
"table_fieldname": "payment_entries"
}
],
"modified": "2023-11-23 12:07:20.887885",
"modified": "2024-01-08 13:17:15.744754",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",

View File

@@ -50,6 +50,88 @@ class InvalidPaymentEntry(ValidationError):
class PaymentEntry(AccountsController):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from frappe.types import DF
from erpnext.accounts.doctype.advance_taxes_and_charges.advance_taxes_and_charges import (
AdvanceTaxesandCharges,
)
from erpnext.accounts.doctype.payment_entry_deduction.payment_entry_deduction import (
PaymentEntryDeduction,
)
from erpnext.accounts.doctype.payment_entry_reference.payment_entry_reference import (
PaymentEntryReference,
)
amended_from: DF.Link | None
apply_tax_withholding_amount: DF.Check
auto_repeat: DF.Link | None
bank: DF.ReadOnly | None
bank_account: DF.Link | None
bank_account_no: DF.ReadOnly | None
base_paid_amount: DF.Currency
base_paid_amount_after_tax: DF.Currency
base_received_amount: DF.Currency
base_received_amount_after_tax: DF.Currency
base_total_allocated_amount: DF.Currency
base_total_taxes_and_charges: DF.Currency
book_advance_payments_in_separate_party_account: DF.Check
clearance_date: DF.Date | None
company: DF.Link
contact_email: DF.Data | None
contact_person: DF.Link | None
cost_center: DF.Link | None
custom_remarks: DF.Check
deductions: DF.Table[PaymentEntryDeduction]
difference_amount: DF.Currency
letter_head: DF.Link | None
mode_of_payment: DF.Link | None
naming_series: DF.Literal["ACC-PAY-.YYYY.-"]
paid_amount: DF.Currency
paid_amount_after_tax: DF.Currency
paid_from: DF.Link
paid_from_account_balance: DF.Currency
paid_from_account_currency: DF.Link
paid_from_account_type: DF.Data | None
paid_to: DF.Link
paid_to_account_balance: DF.Currency
paid_to_account_currency: DF.Link
paid_to_account_type: DF.Data | None
party: DF.DynamicLink | None
party_balance: DF.Currency
party_bank_account: DF.Link | None
party_name: DF.Data | None
party_type: DF.Link | None
payment_order: DF.Link | None
payment_order_status: DF.Literal["Initiated", "Payment Ordered"]
payment_type: DF.Literal["Receive", "Pay", "Internal Transfer"]
posting_date: DF.Date
print_heading: DF.Link | None
project: DF.Link | None
purchase_taxes_and_charges_template: DF.Link | None
received_amount: DF.Currency
received_amount_after_tax: DF.Currency
reference_date: DF.Date | None
reference_no: DF.Data | None
references: DF.Table[PaymentEntryReference]
remarks: DF.SmallText | None
sales_taxes_and_charges_template: DF.Link | None
source_exchange_rate: DF.Float
status: DF.Literal["", "Draft", "Submitted", "Cancelled"]
target_exchange_rate: DF.Float
tax_withholding_category: DF.Link | None
taxes: DF.Table[AdvanceTaxesandCharges]
title: DF.Data | None
total_allocated_amount: DF.Currency
total_taxes_and_charges: DF.Currency
unallocated_amount: DF.Currency
# end: auto-generated types
def __init__(self, *args, **kwargs):
super(PaymentEntry, self).__init__(*args, **kwargs)
if not self.is_new():
@@ -256,6 +338,7 @@ class PaymentEntry(AccountsController):
"get_outstanding_invoices": True,
"get_orders_to_be_billed": True,
"vouchers": vouchers,
"book_advance_payments_in_separate_party_account": self.book_advance_payments_in_separate_party_account,
},
validate=True,
)
@@ -369,12 +452,12 @@ class PaymentEntry(AccountsController):
self.set(self.party_account_field, party_account)
self.party_account = party_account
if self.paid_from and not (self.paid_from_account_currency or self.paid_from_account_balance):
if self.paid_from and not self.paid_from_account_currency and not self.paid_from_account_balance:
acc = get_account_details(self.paid_from, self.posting_date, self.cost_center)
self.paid_from_account_currency = acc.account_currency
self.paid_from_account_balance = acc.account_balance
if self.paid_to and not (self.paid_to_account_currency or self.paid_to_account_balance):
if self.paid_to and not self.paid_to_account_currency and not self.paid_to_account_balance:
acc = get_account_details(self.paid_to, self.posting_date, self.cost_center)
self.paid_to_account_currency = acc.account_currency
self.paid_to_account_balance = acc.account_balance
@@ -390,8 +473,9 @@ class PaymentEntry(AccountsController):
) -> 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
if (
update_ref_details_only_for
and (d.reference_doctype, d.reference_name) not in update_ref_details_only_for
):
continue
@@ -702,7 +786,7 @@ class PaymentEntry(AccountsController):
self.db_set("status", self.status, update_modified=True)
def set_tax_withholding(self):
if not self.party_type == "Supplier":
if self.party_type != "Supplier":
return
if not self.apply_tax_withholding_amount:
@@ -793,7 +877,7 @@ class PaymentEntry(AccountsController):
self.base_received_amount = self.base_paid_amount
if (
self.paid_from_account_currency == self.paid_to_account_currency
and not self.payment_type == "Internal Transfer"
and self.payment_type != "Internal Transfer"
):
self.received_amount = self.paid_amount
@@ -1060,7 +1144,9 @@ class PaymentEntry(AccountsController):
"account": self.party_account,
"party_type": self.party_type,
"party": self.party,
"against_type": "Account",
"against": against_account,
"against_link": against_account,
"account_currency": self.party_account_currency,
"cost_center": self.cost_center,
},
@@ -1225,7 +1311,9 @@ class PaymentEntry(AccountsController):
{
"account": self.paid_from,
"account_currency": self.paid_from_account_currency,
"against_type": self.party_type if self.payment_type == "Pay" else "Account",
"against": self.party if self.payment_type == "Pay" else self.paid_to,
"against_link": self.party if self.payment_type == "Pay" else self.paid_to,
"credit_in_account_currency": self.paid_amount,
"credit": self.base_paid_amount,
"cost_center": self.cost_center,
@@ -1240,7 +1328,9 @@ class PaymentEntry(AccountsController):
{
"account": self.paid_to,
"account_currency": self.paid_to_account_currency,
"against_type": self.party_type if self.payment_type == "Receive" else "Account",
"against": self.party if self.payment_type == "Receive" else self.paid_from,
"against_link": self.party if self.payment_type == "Receive" else self.paid_from,
"debit_in_account_currency": self.received_amount,
"debit": self.base_received_amount,
"cost_center": self.cost_center,
@@ -1264,6 +1354,7 @@ class PaymentEntry(AccountsController):
rev_dr_or_cr = "credit" if dr_or_cr == "debit" else "debit"
against = self.party or self.paid_to
against_type = self.party_type or "Account"
payment_account = self.get_party_account_for_taxes()
tax_amount = d.tax_amount
base_tax_amount = d.base_tax_amount
@@ -1272,7 +1363,9 @@ class PaymentEntry(AccountsController):
self.get_gl_dict(
{
"account": d.account_head,
"against_type": against_type,
"against": against,
"against_link": against,
dr_or_cr: tax_amount,
dr_or_cr + "_in_account_currency": base_tax_amount
if account_currency == self.company_currency
@@ -1297,7 +1390,9 @@ class PaymentEntry(AccountsController):
self.get_gl_dict(
{
"account": payment_account,
"against_type": against_type,
"against": against,
"against_link": against,
rev_dr_or_cr: tax_amount,
rev_dr_or_cr + "_in_account_currency": base_tax_amount
if account_currency == self.company_currency
@@ -1322,7 +1417,9 @@ class PaymentEntry(AccountsController):
{
"account": d.account,
"account_currency": account_currency,
"against_type": self.party_type or "Account",
"against": self.party or self.paid_from,
"against_link": self.party or self.paid_from,
"debit_in_account_currency": d.amount,
"debit": d.amount,
"cost_center": d.cost_center,
@@ -1614,11 +1711,16 @@ def get_outstanding_reference_documents(args, validate=False):
outstanding_invoices = []
negative_outstanding_invoices = []
if args.get("book_advance_payments_in_separate_party_account"):
party_account = get_party_account(args.get("party_type"), args.get("party"), args.get("company"))
else:
party_account = args.get("party_account")
if args.get("get_outstanding_invoices"):
outstanding_invoices = get_outstanding_invoices(
args.get("party_type"),
args.get("party"),
get_party_account(args.get("party_type"), args.get("party"), args.get("company")),
party_account,
common_filter=common_filter,
posting_date=posting_and_due_date,
min_outstanding=args.get("outstanding_amt_greater_than"),
@@ -1757,7 +1859,7 @@ def get_split_invoice_rows(invoice: dict, payment_term_template: str, exc_rates:
"Payment Schedule", filters={"parent": invoice.voucher_no}, fields=["*"], order_by="due_date"
)
for payment_term in payment_schedule:
if not payment_term.outstanding > 0.1:
if payment_term.outstanding <= 0.1:
continue
doc_details = exc_rates.get(payment_term.parent, None)

View File

@@ -1251,6 +1251,45 @@ class TestPaymentEntry(FrappeTestCase):
so.reload()
self.assertEqual(so.advance_paid, so.rounded_total)
def test_outstanding_invoices_api(self):
"""
Test if `get_outstanding_reference_documents` fetches invoices in the right order.
"""
customer = create_customer("Max Mustermann", "INR")
create_payment_terms_template()
# SI has an earlier due date and SI2 has a later due date
si = create_sales_invoice(
qty=1, rate=100, customer=customer, posting_date=add_days(nowdate(), -4)
)
si2 = create_sales_invoice(do_not_save=1, qty=1, rate=100, customer=customer)
si2.payment_terms_template = "Test Receivable Template"
si2.submit()
args = {
"posting_date": nowdate(),
"company": "_Test Company",
"party_type": "Customer",
"payment_type": "Pay",
"party": customer,
"party_account": "Debtors - _TC",
}
args.update(
{
"get_outstanding_invoices": True,
"from_posting_date": add_days(nowdate(), -4),
"to_posting_date": add_days(nowdate(), 2),
}
)
references = get_outstanding_reference_documents(args)
self.assertEqual(len(references), 3)
self.assertEqual(references[0].voucher_no, si.name)
self.assertEqual(references[1].voucher_no, si2.name)
self.assertEqual(references[2].voucher_no, si2.name)
self.assertEqual(references[1].payment_term, "Basic Amount Receivable")
self.assertEqual(references[2].payment_term, "Tax Receivable")
def test_receive_payment_from_payable_party_type(self):
"""
Checks GL entries generated while receiving payments from a Payable Party Type.
@@ -1472,45 +1511,6 @@ class TestPaymentEntry(FrappeTestCase):
for field in ["account", "debit", "credit"]:
self.assertEqual(self.expected_gle[row][field], gl_entries[row][field])
def test_outstanding_invoices_api(self):
"""
Test if `get_outstanding_reference_documents` fetches invoices in the right order.
"""
customer = create_customer("Max Mustermann", "INR")
create_payment_terms_template()
# SI has an earlier due date and SI2 has a later due date
si = create_sales_invoice(
qty=1, rate=100, customer=customer, posting_date=add_days(nowdate(), -4)
)
si2 = create_sales_invoice(do_not_save=1, qty=1, rate=100, customer=customer)
si2.payment_terms_template = "Test Receivable Template"
si2.submit()
args = {
"posting_date": nowdate(),
"company": "_Test Company",
"party_type": "Customer",
"payment_type": "Pay",
"party": customer,
"party_account": "Debtors - _TC",
}
args.update(
{
"get_outstanding_invoices": True,
"from_posting_date": add_days(nowdate(), -4),
"to_posting_date": add_days(nowdate(), 2),
}
)
references = get_outstanding_reference_documents(args)
self.assertEqual(len(references), 3)
self.assertEqual(references[0].voucher_no, si.name)
self.assertEqual(references[1].voucher_no, si2.name)
self.assertEqual(references[2].voucher_no, si2.name)
self.assertEqual(references[1].payment_term, "Basic Amount Receivable")
self.assertEqual(references[2].payment_term, "Tax Receivable")
def create_payment_entry(**args):
payment_entry = frappe.new_doc("Payment Entry")

View File

@@ -229,6 +229,7 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
this.data = [];
const dialog = new frappe.ui.Dialog({
title: __("Select Difference Account"),
size: 'extra-large',
fields: [
{
fieldname: "allocation",
@@ -252,6 +253,13 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
in_list_view: 1,
read_only: 1
}, {
fieldtype:'Date',
fieldname:"gain_loss_posting_date",
label: __("Posting Date"),
in_list_view: 1,
reqd: 1,
}, {
fieldtype:'Link',
options: 'Account',
in_list_view: 1,
@@ -285,6 +293,9 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
args.forEach(d => {
frappe.model.set_value("Payment Reconciliation Allocation", d.docname,
"difference_account", d.difference_account);
frappe.model.set_value("Payment Reconciliation Allocation", d.docname,
"gain_loss_posting_date", d.gain_loss_posting_date);
});
this.reconcile_payment_entries();
@@ -300,6 +311,7 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
'reference_name': d.reference_name,
'difference_amount': d.difference_amount,
'difference_account': d.difference_account,
'gain_loss_posting_date': d.gain_loss_posting_date
});
}
});

View File

@@ -429,6 +429,7 @@ class PaymentReconciliation(Document):
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")
res.update({"gain_loss_posting_date": pay.get("posting_date")})
if pay.get("amount") == 0:
entries.append(res)
@@ -535,6 +536,7 @@ class PaymentReconciliation(Document):
"allocated_amount": flt(row.get("allocated_amount")),
"difference_amount": flt(row.get("difference_amount")),
"difference_account": row.get("difference_account"),
"difference_posting_date": row.get("gain_loss_posting_date"),
"cost_center": row.get("cost_center"),
}
)

View File

@@ -19,6 +19,7 @@
"is_advance",
"section_break_5",
"difference_amount",
"gain_loss_posting_date",
"column_break_7",
"difference_account",
"exchange_rate",
@@ -151,6 +152,11 @@
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
},
{
"fieldname": "gain_loss_posting_date",
"fieldtype": "Date",
"label": "Difference Posting Date"
}
],
"is_virtual": 1,

View File

@@ -234,13 +234,6 @@ class PaymentRequest(Document):
if self.payment_url:
self.db_set("payment_url", self.payment_url)
if (
self.payment_url
or not self.payment_gateway_account
or (self.payment_gateway_account and self.payment_channel == "Phone")
):
self.db_set("status", "Initiated")
def get_payment_url(self):
if self.reference_doctype != "Fees":
data = frappe.db.get_value(

View File

@@ -765,7 +765,7 @@ def get_pos_reserved_qty(item_code, warehouse):
reserved_qty = (
frappe.qb.from_(p_inv)
.from_(p_item)
.select(Sum(p_item.qty).as_("qty"))
.select(Sum(p_item.stock_qty).as_("stock_qty"))
.where(
(p_inv.name == p_item.parent)
& (IfNull(p_inv.consolidated_invoice, "") == "")
@@ -775,7 +775,7 @@ def get_pos_reserved_qty(item_code, warehouse):
)
).run(as_dict=True)
return reserved_qty[0].qty or 0 if reserved_qty else 0
return flt(reserved_qty[0].stock_qty) if reserved_qty else 0
@frappe.whitelist()

View File

@@ -286,7 +286,7 @@ class PricingRule(Document):
def validate_price_list_with_currency(self):
if self.currency and self.for_price_list:
price_list_currency = frappe.db.get_value("Price List", self.for_price_list, "currency", True)
if not self.currency == price_list_currency:
if self.currency != price_list_currency:
throw(_("Currency should be same as Price List Currency: {0}").format(price_list_currency))
def validate_dates(self):

View File

@@ -527,7 +527,7 @@ def get_qty_amount_data_for_cumulative(pr_doc, doc, items=None):
values.extend(warehouses)
if items:
condition = " and `tab{child_doc}`.{apply_on} in ({items})".format(
condition += " and `tab{child_doc}`.{apply_on} in ({items})".format(
child_doc=child_doctype, apply_on=apply_on, items=",".join(["%s"] * len(items))
)

View File

@@ -440,7 +440,7 @@ def reconcile(doc: None | str = None) -> None:
# Update the parent doc about the exception
frappe.db.rollback()
traceback = frappe.get_traceback()
traceback = frappe.get_traceback(with_context=True)
if traceback:
message = "Traceback: <br>" + traceback
frappe.db.set_value("Process Payment Reconciliation Log", log, "error_log", message)
@@ -475,7 +475,7 @@ def reconcile(doc: None | str = None) -> None:
frappe.db.set_value("Process Payment Reconciliation", doc, "status", "Completed")
else:
if not (frappe.db.get_value("Process Payment Reconciliation", doc, "status") == "Paused"):
if frappe.db.get_value("Process Payment Reconciliation", doc, "status") != "Paused":
# trigger next batch in job
# generate reconcile job name
allocation = get_next_allocation(log)

View File

@@ -371,7 +371,7 @@ class PurchaseInvoice(BuyingController):
check_list = []
for d in self.get("items"):
if d.purchase_order and not d.purchase_order in check_list and not d.purchase_receipt:
if d.purchase_order and d.purchase_order not in check_list and not d.purchase_receipt:
check_list.append(d.purchase_order)
check_on_hold_or_closed_status("Purchase Order", d.purchase_order)
@@ -552,7 +552,7 @@ class PurchaseInvoice(BuyingController):
self.against_expense_account = ",".join(against_accounts)
def po_required(self):
if frappe.db.get_value("Buying Settings", None, "po_required") == "Yes":
if frappe.db.get_single_value("Buying Settings", "po_required") == "Yes":
if frappe.get_value(
"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_order"
@@ -572,7 +572,7 @@ class PurchaseInvoice(BuyingController):
def pr_required(self):
stock_items = self.get_stock_items()
if frappe.db.get_value("Buying Settings", None, "pr_required") == "Yes":
if frappe.db.get_single_value("Buying Settings", "pr_required") == "Yes":
if frappe.get_value(
"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_receipt"
@@ -815,7 +815,9 @@ class PurchaseInvoice(BuyingController):
"party_type": "Supplier",
"party": self.supplier,
"due_date": self.due_date,
"against_type": "Account",
"against": self.against_expense_account,
"against_link": self.against_expense_account,
"credit": base_grand_total,
"credit_in_account_currency": base_grand_total
if self.party_account_currency == self.company_currency
@@ -888,7 +890,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": warehouse_account[item.warehouse]["account"],
"against_type": "Account",
"against": warehouse_account[item.from_warehouse]["account"],
"against_link": warehouse_account[item.from_warehouse]["account"],
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -908,7 +912,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": warehouse_account[item.from_warehouse]["account"],
"against_type": "Account",
"against": warehouse_account[item.warehouse]["account"],
"against_link": warehouse_account[item.warehouse]["account"],
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -925,7 +931,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": item.expense_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit": flt(item.base_net_amount, item.precision("base_net_amount")),
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"cost_center": item.cost_center,
@@ -942,7 +950,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": item.expense_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit": warehouse_debit_amount,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"cost_center": item.cost_center,
@@ -961,7 +971,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": account,
"against_type": "Account",
"against": item.expense_account,
"against_link": item.expense_account,
"cost_center": item.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": flt(amount["base_amount"]),
@@ -981,7 +993,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": supplier_warehouse_account,
"against_type": "Account",
"against": item.expense_account,
"against_link": item.expense_account,
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -1036,7 +1050,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": expense_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit": amount,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1062,7 +1078,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": expense_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit": discrepancy_caused_by_exchange_rate_difference,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1075,7 +1093,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.get_company_default("exchange_gain_loss_account"),
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"credit": discrepancy_caused_by_exchange_rate_difference,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1120,7 +1140,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": stock_rbnb,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit": flt(item.item_tax_amount, item.precision("item_tax_amount")),
"remarks": self.remarks or _("Accounting Entry for Stock"),
"cost_center": self.cost_center,
@@ -1135,11 +1157,17 @@ class PurchaseInvoice(BuyingController):
)
assets = frappe.db.get_all(
"Asset", filters={"purchase_invoice": self.name, "item_code": item.item_code}
"Asset",
filters={"purchase_invoice": self.name, "item_code": item.item_code},
fields=["name", "asset_quantity"],
)
for asset in assets:
frappe.db.set_value("Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate))
frappe.db.set_value("Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate))
frappe.db.set_value(
"Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate) * asset.asset_quantity
)
frappe.db.set_value(
"Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate) * asset.asset_quantity
)
def make_stock_adjustment_entry(
self, gl_entries, item, voucher_wise_stock_value, account_currency
@@ -1168,7 +1196,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": cost_of_goods_sold_account,
"against_type": "Account",
"against": item.expense_account,
"against_link": item.expense_account,
"debit": stock_adjustment_amt,
"remarks": self.get("remarks") or _("Stock Adjustment"),
"cost_center": item.cost_center,
@@ -1198,7 +1228,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": tax.account_head,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
dr_or_cr: base_amount,
dr_or_cr + "_in_account_currency": base_amount
if account_currency == self.company_currency
@@ -1246,8 +1278,10 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": tax.account_head,
"against_type": "Supplier",
"cost_center": tax.cost_center,
"against": self.supplier,
"against_link": self.supplier,
"credit": applicable_amount,
"remarks": self.remarks or _("Accounting Entry for Stock"),
},
@@ -1265,7 +1299,9 @@ class PurchaseInvoice(BuyingController):
{
"account": tax.account_head,
"cost_center": tax.cost_center,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"credit": valuation_tax[tax.name],
"remarks": self.remarks or _("Accounting Entry for Stock"),
},
@@ -1280,7 +1316,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.unrealized_profit_loss_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"credit": flt(self.total_taxes_and_charges),
"credit_in_account_currency": flt(self.base_total_taxes_and_charges),
"cost_center": self.cost_center,
@@ -1301,7 +1339,9 @@ class PurchaseInvoice(BuyingController):
"account": self.credit_to,
"party_type": "Supplier",
"party": self.supplier,
"against_type": "Account",
"against": self.cash_bank_account,
"against_link": self.cash_bank_account,
"debit": self.base_paid_amount,
"debit_in_account_currency": self.base_paid_amount
if self.party_account_currency == self.company_currency
@@ -1322,7 +1362,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.cash_bank_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"credit": self.base_paid_amount,
"credit_in_account_currency": self.base_paid_amount
if bank_account_currency == self.company_currency
@@ -1346,7 +1388,9 @@ class PurchaseInvoice(BuyingController):
"account": self.credit_to,
"party_type": "Supplier",
"party": self.supplier,
"against_type": "Account",
"against": self.write_off_account,
"against_link": self.write_off_account,
"debit": self.base_write_off_amount,
"debit_in_account_currency": self.base_write_off_amount
if self.party_account_currency == self.company_currency
@@ -1366,7 +1410,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.write_off_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"credit": flt(self.base_write_off_amount),
"credit_in_account_currency": self.base_write_off_amount
if write_off_account_currency == self.company_currency
@@ -1393,7 +1439,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": round_off_account,
"against_type": "Supplier",
"against": self.supplier,
"against_link": self.supplier,
"debit_in_account_currency": self.rounding_adjustment,
"debit": self.base_rounding_adjustment,
"cost_center": round_off_cost_center

View File

@@ -14,7 +14,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent
from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
from erpnext.buying.doctype.supplier.test_supplier import create_supplier
from erpnext.controllers.accounts_controller import get_payment_terms
from erpnext.controllers.accounts_controller import InvalidQtyError, get_payment_terms
from erpnext.controllers.buying_controller import QtyMismatchError
from erpnext.exceptions import InvalidCurrency
from erpnext.projects.doctype.project.test_project import make_project
@@ -51,6 +51,16 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
def tearDown(self):
frappe.db.rollback()
def test_purchase_invoice_qty(self):
pi = make_purchase_invoice(qty=0, do_not_save=True)
with self.assertRaises(InvalidQtyError):
pi.save()
# No error with qty=1
pi.items[0].qty = 1
pi.save()
self.assertEqual(pi.items[0].qty, 1)
def test_purchase_invoice_received_qty(self):
"""
1. Test if received qty is validated against accepted + rejected
@@ -1227,11 +1237,11 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
@change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1})
def test_gain_loss_with_advance_entry(self):
unlink_enabled = frappe.db.get_value(
"Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice"
unlink_enabled = frappe.db.get_single_value(
"Accounts Settings", "unlink_payment_on_cancellation_of_invoice"
)
frappe.db.set_single_value("Accounts Settings", "unlink_payment_on_cancel_of_invoice", 1)
frappe.db.set_single_value("Accounts Settings", "unlink_payment_on_cancellation_of_invoice", 1)
original_account = frappe.db.get_value("Company", "_Test Company", "exchange_gain_loss_account")
frappe.db.set_value(
@@ -1422,7 +1432,7 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
pay.cancel()
frappe.db.set_single_value(
"Accounts Settings", "unlink_payment_on_cancel_of_invoice", unlink_enabled
"Accounts Settings", "unlink_payment_on_cancellation_of_invoice", unlink_enabled
)
frappe.db.set_value("Company", "_Test Company", "exchange_gain_loss_account", original_account)
@@ -1985,6 +1995,26 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
self.assertEqual(pi.items[0].cost_center, "_Test Cost Center Buying - _TC")
def test_debit_note_without_item(self):
pi = make_purchase_invoice(item_name="_Test Item", qty=10, do_not_submit=True)
pi.items[0].item_code = ""
pi.save()
self.assertFalse(pi.items[0].item_code)
pi.submit()
return_pi = make_purchase_invoice(
item_name="_Test Item",
is_return=1,
return_against=pi.name,
qty=-10,
do_not_save=True,
)
return_pi.items[0].item_code = ""
return_pi.save()
return_pi.submit()
self.assertEqual(return_pi.docstatus, 1)
def set_advance_flag(company, flag, default_account):
frappe.db.set_value(
@@ -2094,7 +2124,7 @@ def make_purchase_invoice(**args):
bundle_id = None
if args.get("batch_no") or args.get("serial_no"):
batches = {}
qty = args.qty or 5
qty = args.qty if args.qty is not None else 5
item_code = args.item or args.item_code or "_Test Item"
if args.get("batch_no"):
batches = frappe._dict({args.batch_no: qty})
@@ -2121,8 +2151,9 @@ def make_purchase_invoice(**args):
"items",
{
"item_code": args.item or args.item_code or "_Test Item",
"item_name": args.item_name,
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"qty": args.qty or 5,
"qty": args.qty if args.qty is not None else 5,
"received_qty": args.received_qty or 0,
"rejected_qty": args.rejected_qty or 0,
"rate": args.rate or 50,

View File

@@ -43,7 +43,7 @@ def start_payment_ledger_repost(docname=None):
except Exception as e:
frappe.db.rollback()
traceback = frappe.get_traceback()
traceback = frappe.get_traceback(with_context=True)
if traceback:
message = "Traceback: <br>" + traceback
frappe.db.set_value(repost_doc.doctype, repost_doc.name, "repost_error_log", message)

View File

@@ -138,6 +138,7 @@
"loyalty_amount",
"column_break_77",
"loyalty_program",
"dont_create_loyalty_points",
"loyalty_redemption_account",
"loyalty_redemption_cost_center",
"contact_and_address_tab",
@@ -1041,8 +1042,7 @@
"label": "Loyalty Program",
"no_copy": 1,
"options": "Loyalty Program",
"print_hide": 1,
"read_only": 1
"print_hide": 1
},
{
"allow_on_submit": 1,
@@ -2162,6 +2162,14 @@
"fieldname": "update_billed_amount_in_delivery_note",
"fieldtype": "Check",
"label": "Update Billed Amount in Delivery Note"
},
{
"default": "0",
"depends_on": "loyalty_program",
"fieldname": "dont_create_loyalty_points",
"fieldtype": "Check",
"label": "Don't Create Loyalty Points",
"no_copy": 1
}
],
"icon": "fa fa-file-text",
@@ -2174,7 +2182,7 @@
"link_fieldname": "consolidated_invoice"
}
],
"modified": "2023-11-23 16:56:29.679499",
"modified": "2024-01-02 17:25:46.027523",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",

View File

@@ -7,7 +7,7 @@ from frappe import _, msgprint, throw
from frappe.contacts.doctype.address.address import get_address_display
from frappe.model.mapper import get_mapped_doc
from frappe.model.utils import get_fetch_values
from frappe.utils import add_days, cint, cstr, flt, formatdate, get_link_to_form, getdate, nowdate
from frappe.utils import add_days, cint, flt, formatdate, get_link_to_form, getdate, nowdate
import erpnext
from erpnext.accounts.deferred_revenue import validate_service_stop_date
@@ -117,6 +117,7 @@ class SalesInvoice(SellingController):
discount_amount: DF.Currency
dispatch_address: DF.SmallText | None
dispatch_address_name: DF.Link | None
dont_create_loyalty_points: DF.Check
due_date: DF.Date | None
from_date: DF.Date | None
grand_total: DF.Currency
@@ -458,7 +459,7 @@ class SalesInvoice(SellingController):
self.update_billing_status_for_zero_amount_refdoc("Sales Order")
self.check_credit_limit()
if not cint(self.is_pos) == 1 and not self.is_return:
if cint(self.is_pos) != 1 and not self.is_return:
self.update_against_document_in_jv()
self.update_time_sheet(self.name)
@@ -471,7 +472,12 @@ class SalesInvoice(SellingController):
update_linked_doc(self.doctype, self.name, self.inter_company_invoice_reference)
# create the loyalty point ledger entry if the customer is enrolled in any loyalty program
if not self.is_return and not self.is_consolidated and self.loyalty_program:
if (
not self.is_return
and not self.is_consolidated
and self.loyalty_program
and not self.dont_create_loyalty_points
):
self.make_loyalty_point_entry()
elif (
self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program
@@ -586,6 +592,8 @@ class SalesInvoice(SellingController):
"Serial and Batch Bundle",
)
self.delete_auto_created_batches()
def update_status_updater_args(self):
if cint(self.update_stock):
self.status_updater.append(
@@ -1225,7 +1233,9 @@ class SalesInvoice(SellingController):
"party_type": "Customer",
"party": self.customer,
"due_date": self.due_date,
"against_type": "Account",
"against": self.against_income_account,
"against_link": self.against_income_account,
"debit": base_grand_total,
"debit_in_account_currency": base_grand_total
if self.party_account_currency == self.company_currency
@@ -1254,7 +1264,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": tax.account_head,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"credit": flt(base_amount, tax.precision("tax_amount_after_discount_amount")),
"credit_in_account_currency": (
flt(base_amount, tax.precision("base_tax_amount_after_discount_amount"))
@@ -1275,7 +1287,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.unrealized_profit_loss_account,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"debit": flt(self.total_taxes_and_charges),
"debit_in_account_currency": flt(self.base_total_taxes_and_charges),
"cost_center": self.cost_center,
@@ -1343,7 +1357,9 @@ class SalesInvoice(SellingController):
add_asset_activity(asset.name, _("Asset sold"))
for gle in fixed_asset_gl_entries:
gle["against_type"] = "Customer"
gle["against"] = self.customer
gle["against_link"] = self.customer
gl_entries.append(self.get_gl_dict(gle, item=item))
self.set_asset_status(asset)
@@ -1364,7 +1380,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": income_account,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"credit": flt(base_amount, item.precision("base_net_amount")),
"credit_in_account_currency": (
flt(base_amount, item.precision("base_net_amount"))
@@ -1418,9 +1436,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against": "Expense account - "
+ cstr(self.loyalty_redemption_account)
+ " for the Loyalty Program",
"against_type": "Account",
"against": self.loyalty_redemption_account,
"against_link": self.loyalty_redemption_account,
"credit": self.loyalty_amount,
"against_voucher": self.return_against if cint(self.is_return) else self.name,
"against_voucher_type": self.doctype,
@@ -1434,7 +1452,9 @@ class SalesInvoice(SellingController):
{
"account": self.loyalty_redemption_account,
"cost_center": self.cost_center or self.loyalty_redemption_cost_center,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"debit": self.loyalty_amount,
"remark": "Loyalty Points redeemed by the customer",
},
@@ -1461,7 +1481,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against_type": "Account",
"against": payment_mode.account,
"against_link": payment_mode.account,
"credit": payment_mode.base_amount,
"credit_in_account_currency": payment_mode.base_amount
if self.party_account_currency == self.company_currency
@@ -1482,7 +1504,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": payment_mode.account,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"debit": payment_mode.base_amount,
"debit_in_account_currency": payment_mode.base_amount
if payment_mode_account_currency == self.company_currency
@@ -1506,7 +1530,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against_type": "Account",
"against": self.account_for_change_amount,
"against_link": self.account_for_change_amount,
"debit": flt(self.base_change_amount),
"debit_in_account_currency": flt(self.base_change_amount)
if self.party_account_currency == self.company_currency
@@ -1527,7 +1553,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.account_for_change_amount,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"credit": self.base_change_amount,
"cost_center": self.cost_center,
},
@@ -1553,7 +1581,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against_type": "Account",
"against": self.write_off_account,
"against_link": self.write_off_account,
"credit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
"credit_in_account_currency": (
flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
@@ -1573,7 +1603,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.write_off_account,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"debit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
"debit_in_account_currency": (
flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
@@ -1601,7 +1633,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": round_off_account,
"against_type": "Customer",
"against": self.customer,
"against_link": self.customer,
"credit_in_account_currency": flt(
self.rounding_adjustment, self.precision("rounding_adjustment")
),
@@ -1960,9 +1994,9 @@ def validate_inter_company_party(doctype, party, company, inter_company_referenc
if inter_company_reference:
doc = frappe.get_doc(ref_doc, inter_company_reference)
ref_party = doc.supplier if doctype in ["Sales Invoice", "Sales Order"] else doc.customer
if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
if frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") != party:
frappe.throw(_("Invalid {0} for Inter Company Transaction.").format(_(partytype)))
if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company:
if frappe.get_cached_value(ref_partytype, ref_party, "represents_company") != company:
frappe.throw(_("Invalid Company for Inter Company Transaction."))
elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
@@ -1972,7 +2006,7 @@ def validate_inter_company_party(doctype, party, company, inter_company_referenc
filters={"parenttype": partytype, "parent": party},
)
companies = [d.company for d in companies]
if not company in companies:
if company not in companies:
frappe.throw(
_("{0} not allowed to transact with {1}. Please change the Company.").format(
_(partytype), company

View File

@@ -23,7 +23,7 @@ from erpnext.assets.doctype.asset.test_asset import create_asset, create_asset_d
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
get_depr_schedule,
)
from erpnext.controllers.accounts_controller import update_invoice_status
from erpnext.controllers.accounts_controller import InvalidQtyError, update_invoice_status
from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data
from erpnext.exceptions import InvalidAccountCurrency, InvalidCurrency
from erpnext.selling.doctype.customer.test_customer import get_customer_dict
@@ -72,6 +72,16 @@ class TestSalesInvoice(FrappeTestCase):
def tearDownClass(self):
unlink_payment_on_cancel_of_invoice(0)
def test_sales_invoice_qty(self):
si = create_sales_invoice(qty=0, do_not_save=True)
with self.assertRaises(InvalidQtyError):
si.save()
# No error with qty=1
si.items[0].qty = 1
si.save()
self.assertEqual(si.items[0].qty, 1)
def test_timestamp_change(self):
w = frappe.copy_doc(test_records[0])
w.docstatus = 0
@@ -1414,10 +1424,11 @@ class TestSalesInvoice(FrappeTestCase):
def test_serialized_cancel(self):
si = self.test_serialized()
si.cancel()
si.reload()
serial_nos = get_serial_nos_from_bundle(si.get("items")[0].serial_and_batch_bundle)
si.cancel()
self.assertEqual(
frappe.db.get_value("Serial No", serial_nos[0], "warehouse"), "_Test Warehouse - _TC"
)
@@ -2520,12 +2531,6 @@ class TestSalesInvoice(FrappeTestCase):
"stock_received_but_not_billed",
"Stock Received But Not Billed - _TC1",
)
frappe.db.set_value(
"Company",
"_Test Company 1",
"expenses_included_in_valuation",
"Expenses Included In Valuation - _TC1",
)
# begin test
si = create_sales_invoice(
@@ -3641,7 +3646,7 @@ def create_sales_invoice(**args):
bundle_id = None
if si.update_stock and (args.get("batch_no") or args.get("serial_no")):
batches = {}
qty = args.qty or 1
qty = args.qty if args.qty is not None else 1
item_code = args.item or args.item_code or "_Test Item"
if args.get("batch_no"):
batches = frappe._dict({args.batch_no: qty})
@@ -3673,7 +3678,7 @@ def create_sales_invoice(**args):
"description": args.description or "_Test Item",
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"target_warehouse": args.target_warehouse,
"qty": args.qty or 1,
"qty": args.qty if args.qty is not None else 1,
"uom": args.uom or "Nos",
"stock_uom": args.uom or "Nos",
"rate": args.rate if args.get("rate") is not None else 100,

View File

@@ -81,6 +81,7 @@
"warehouse",
"target_warehouse",
"quality_inspection",
"pick_serial_and_batch",
"serial_and_batch_bundle",
"batch_no",
"incoming_rate",
@@ -897,12 +898,18 @@
"options": "Serial and Batch Bundle",
"print_hide": 1,
"search_index": 1
},
{
"depends_on": "eval:parent.update_stock === 1",
"fieldname": "pick_serial_and_batch",
"fieldtype": "Button",
"label": "Pick Serial / Batch No"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2023-11-14 18:34:10.479329",
"modified": "2023-12-29 13:03:14.121298",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",

View File

@@ -142,12 +142,12 @@ class ShippingRule(Document):
}
if self.shipping_rule_type == "Selling":
# check if not applied on purchase
if not doc.meta.get_field("taxes").options == "Sales Taxes and Charges":
if doc.meta.get_field("taxes").options != "Sales Taxes and Charges":
frappe.throw(_("Shipping rule only applicable for Selling"))
shipping_charge["doctype"] = "Sales Taxes and Charges"
else:
# check if not applied on sales
if not doc.meta.get_field("taxes").options == "Purchase Taxes and Charges":
if doc.meta.get_field("taxes").options != "Purchase Taxes and Charges":
frappe.throw(_("Shipping rule only applicable for Buying"))
shipping_charge["doctype"] = "Purchase Taxes and Charges"

View File

@@ -148,13 +148,13 @@
{
"fieldname": "additional_discount_percentage",
"fieldtype": "Percent",
"label": "Additional DIscount Percentage"
"label": "Additional Discount Percentage"
},
{
"collapsible": 1,
"fieldname": "additional_discount_amount",
"fieldtype": "Currency",
"label": "Additional DIscount Amount"
"label": "Additional Discount Amount"
},
{
"collapsible": 1,
@@ -267,7 +267,7 @@
"link_fieldname": "subscription"
}
],
"modified": "2023-09-18 17:48:21.900252",
"modified": "2023-12-28 17:20:42.687789",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Subscription",

View File

@@ -356,18 +356,20 @@ class Subscription(Document):
self,
from_date: Optional[Union[str, datetime.date]] = None,
to_date: Optional[Union[str, datetime.date]] = None,
posting_date: Optional[Union[str, datetime.date]] = None,
) -> Document:
"""
Creates a `Invoice` for the `Subscription`, updates `self.invoices` and
saves the `Subscription`.
Backwards compatibility
"""
return self.create_invoice(from_date=from_date, to_date=to_date)
return self.create_invoice(from_date=from_date, to_date=to_date, posting_date=posting_date)
def create_invoice(
self,
from_date: Optional[Union[str, datetime.date]] = None,
to_date: Optional[Union[str, datetime.date]] = None,
posting_date: Optional[Union[str, datetime.date]] = None,
) -> Document:
"""
Creates a `Invoice`, submits it and returns it
@@ -385,11 +387,13 @@ class Subscription(Document):
invoice = frappe.new_doc(self.invoice_document_type)
invoice.company = company
invoice.set_posting_time = 1
invoice.posting_date = (
self.current_invoice_start
if self.generate_invoice_at == "Beginning of the current subscription period"
else self.current_invoice_end
)
if self.generate_invoice_at == "Beginning of the current subscription period":
invoice.posting_date = self.current_invoice_start
elif self.generate_invoice_at == "Days before the current subscription period":
invoice.posting_date = posting_date or self.current_invoice_start
else:
invoice.posting_date = self.current_invoice_end
invoice.cost_center = self.cost_center
@@ -413,6 +417,7 @@ class Subscription(Document):
# Subscription is better suited for service items. I won't update `update_stock`
# for that reason
items_list = self.get_items_from_plans(self.plans, is_prorate())
for item in items_list:
item["cost_center"] = self.cost_center
invoice.append("items", item)
@@ -556,7 +561,7 @@ class Subscription(Document):
if not self.is_current_invoice_generated(
self.current_invoice_start, self.current_invoice_end
) and self.can_generate_new_invoice(posting_date):
self.generate_invoice()
self.generate_invoice(posting_date=posting_date)
self.update_subscription_period(add_days(self.current_invoice_end, 1))
if self.cancel_at_period_end and (
@@ -676,7 +681,7 @@ class Subscription(Document):
to_generate_invoice = (
True
if self.status == "Active"
and not self.generate_invoice_at == "Beginning of the current subscription period"
and self.generate_invoice_at != "Beginning of the current subscription period"
else False
)
self.status = "Cancelled"
@@ -694,7 +699,7 @@ class Subscription(Document):
subscription and the `Subscription` will lose all the history of generated invoices
it has.
"""
if not self.status == "Cancelled":
if self.status != "Cancelled":
frappe.throw(_("You cannot restart a Subscription that is not cancelled."), InvoiceNotCancelled)
self.status = "Active"

View File

@@ -37,7 +37,7 @@ class UnreconcilePayment(Document):
def validate(self):
self.supported_types = ["Payment Entry", "Journal Entry"]
if not self.voucher_type in self.supported_types:
if self.voucher_type not in self.supported_types:
frappe.throw(_("Only {0} are supported").format(comma_and(self.supported_types)))
@frappe.whitelist()

View File

@@ -41,7 +41,7 @@ def make_gl_entries(
from_repost=from_repost,
)
save_entries(gl_map, adv_adj, update_outstanding, from_repost)
# Post GL Map proccess there may no be any GL Entries
# Post GL Map process there may no be any GL Entries
elif gl_map:
frappe.throw(
_(
@@ -280,6 +280,7 @@ def check_if_in_list(gle, gl_map, dimensions=None):
"project",
"finance_book",
"voucher_no",
"against_link",
]
if dimensions:
@@ -653,10 +654,10 @@ def check_freezing_date(posting_date, adv_adj=False):
Hence stop admin to bypass if accounts are freezed
"""
if not adv_adj:
acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
acc_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
if acc_frozen_upto:
frozen_accounts_modifier = frappe.db.get_value(
"Accounts Settings", None, "frozen_accounts_modifier"
frozen_accounts_modifier = frappe.db.get_single_value(
"Accounts Settings", "frozen_accounts_modifier"
)
if getdate(posting_date) <= getdate(acc_frozen_upto) and (
frozen_accounts_modifier not in frappe.get_roles() or frappe.session.user == "Administrator"

View File

@@ -114,14 +114,12 @@ def _get_party_details(
set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype)
)
party = party_details[party_type.lower()]
if not ignore_permissions and not (
frappe.has_permission(party_type, "read", party)
or frappe.has_permission(party_type, "select", party)
):
frappe.throw(_("Not permitted for {0}").format(party), frappe.PermissionError)
party = frappe.get_doc(party_type, party)
if not ignore_permissions:
ptype = "select" if frappe.only_has_select_perm(party_type) else "read"
frappe.has_permission(party_type, ptype, party, throw=True)
currency = party.get("default_currency") or currency or get_company_currency(company)
party_address, shipping_address = set_address_details(
@@ -637,9 +635,7 @@ def get_due_date_from_template(template_name, posting_date, bill_date):
return due_date
def validate_due_date(
posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None
):
def validate_due_date(posting_date, due_date, bill_date=None, template_name=None):
if getdate(due_date) < getdate(posting_date):
frappe.throw(_("Due Date cannot be before Posting / Supplier Invoice Date"))
else:
@@ -775,7 +771,7 @@ def validate_party_frozen_disabled(party_type, party_name):
frozen_accounts_modifier = frappe.db.get_single_value(
"Accounts Settings", "frozen_accounts_modifier"
)
if not frozen_accounts_modifier in frappe.get_roles():
if frozen_accounts_modifier not in frappe.get_roles():
frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen)
elif party_type == "Employee":

View File

@@ -144,6 +144,11 @@ frappe.query_reports["Accounts Payable"] = {
"label": __("Show Future Payments"),
"fieldtype": "Check",
},
{
"fieldname": "in_party_currency",
"label": __("In Party Currency"),
"fieldtype": "Check",
},
{
"fieldname": "for_revaluation_journals",
"label": __("Revaluation Journals"),
@@ -153,12 +158,8 @@ frappe.query_reports["Accounts Payable"] = {
"fieldname": "ignore_accounts",
"label": __("Group by Voucher"),
"fieldtype": "Check",
},
{
"fieldname": "in_party_currency",
"label": __("In Party Currency"),
"fieldtype": "Check",
}
],
"formatter": function(value, row, column, data, default_formatter) {

View File

@@ -176,6 +176,11 @@ frappe.query_reports["Accounts Receivable"] = {
"label": __("Show Remarks"),
"fieldtype": "Check",
},
{
"fieldname": "in_party_currency",
"label": __("In Party Currency"),
"fieldtype": "Check",
},
{
"fieldname": "for_revaluation_journals",
"label": __("Revaluation Journals"),
@@ -185,12 +190,9 @@ frappe.query_reports["Accounts Receivable"] = {
"fieldname": "ignore_accounts",
"label": __("Group by Voucher"),
"fieldtype": "Check",
},
{
"fieldname": "in_party_currency",
"label": __("In Party Currency"),
"fieldtype": "Check",
}
],
"formatter": function(value, row, column, data, default_formatter) {

View File

@@ -55,8 +55,8 @@ class ReceivablePayableReport(object):
def run(self, args):
self.filters.update(args)
self.set_defaults()
self.party_naming_by = frappe.db.get_value(
args.get("naming_by")[0], None, args.get("naming_by")[1]
self.party_naming_by = frappe.db.get_single_value(
args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_columns()
self.get_data()
@@ -123,7 +123,7 @@ class ReceivablePayableReport(object):
else:
key = (ple.account, ple.voucher_type, ple.voucher_no, ple.party)
if not key in self.voucher_balance:
if key not in self.voucher_balance:
self.voucher_balance[key] = frappe._dict(
voucher_type=ple.voucher_type,
voucher_no=ple.voucher_no,
@@ -942,7 +942,7 @@ class ReceivablePayableReport(object):
return True
def get_party_details(self, party):
if not party in self.party_details:
if party not in self.party_details:
if self.account_type == "Receivable":
fields = ["customer_name", "territory", "customer_group", "customer_primary_contact"]

View File

@@ -24,8 +24,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
def run(self, args):
self.account_type = args.get("account_type")
self.party_type = get_party_types_from_account_type(self.account_type)
self.party_naming_by = frappe.db.get_value(
args.get("naming_by")[0], None, args.get("naming_by")[1]
self.party_naming_by = frappe.db.get_single_value(
args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_columns()
self.get_data(args)

View File

@@ -25,11 +25,26 @@ frappe.query_reports["Asset Depreciations and Balances"] = {
"default": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
"reqd": 1
},
{
"fieldname":"group_by",
"label": __("Group By"),
"fieldtype": "Select",
"options": ["Asset Category", "Asset"],
"default": "Asset Category",
},
{
"fieldname":"asset_category",
"label": __("Asset Category"),
"fieldtype": "Link",
"options": "Asset Category"
}
"options": "Asset Category",
"depends_on": "eval: doc.group_by == 'Asset Category'",
},
{
"fieldname":"asset",
"label": __("Asset"),
"fieldtype": "Link",
"options": "Asset",
"depends_on": "eval: doc.group_by == 'Asset'",
},
]
}

View File

@@ -14,10 +14,17 @@ def execute(filters=None):
def get_data(filters):
if filters.get("group_by") == "Asset Category":
return get_group_by_asset_category_data(filters)
elif filters.get("group_by") == "Asset":
return get_group_by_asset_data(filters)
def get_group_by_asset_category_data(filters):
data = []
asset_categories = get_asset_categories(filters)
assets = get_assets(filters)
asset_categories = get_asset_categories_for_grouped_by_category(filters)
assets = get_assets_for_grouped_by_category(filters)
for asset_category in asset_categories:
row = frappe._dict()
@@ -38,6 +45,7 @@ def get_data(filters):
if asset["asset_category"] == asset_category.get("asset_category", "")
)
)
row.accumulated_depreciation_as_on_to_date = (
flt(row.accumulated_depreciation_as_on_from_date)
+ flt(row.depreciation_amount_during_the_period)
@@ -57,7 +65,7 @@ def get_data(filters):
return data
def get_asset_categories(filters):
def get_asset_categories_for_grouped_by_category(filters):
condition = ""
if filters.get("asset_category"):
condition += " and asset_category = %(asset_category)s"
@@ -116,7 +124,105 @@ def get_asset_categories(filters):
)
def get_assets(filters):
def get_asset_details_for_grouped_by_category(filters):
condition = ""
if filters.get("asset"):
condition += " and name = %(asset)s"
return frappe.db.sql(
"""
SELECT name,
ifnull(sum(case when purchase_date < %(from_date)s then
case when ifnull(disposal_date, 0) = 0 or disposal_date >= %(from_date)s then
gross_purchase_amount
else
0
end
else
0
end), 0) as cost_as_on_from_date,
ifnull(sum(case when purchase_date >= %(from_date)s then
gross_purchase_amount
else
0
end), 0) as cost_of_new_purchase,
ifnull(sum(case when ifnull(disposal_date, 0) != 0
and disposal_date >= %(from_date)s
and disposal_date <= %(to_date)s then
case when status = "Sold" then
gross_purchase_amount
else
0
end
else
0
end), 0) as cost_of_sold_asset,
ifnull(sum(case when ifnull(disposal_date, 0) != 0
and disposal_date >= %(from_date)s
and disposal_date <= %(to_date)s then
case when status = "Scrapped" then
gross_purchase_amount
else
0
end
else
0
end), 0) as cost_of_scrapped_asset
from `tabAsset`
where docstatus=1 and company=%(company)s and purchase_date <= %(to_date)s {}
group by name
""".format(
condition
),
{
"to_date": filters.to_date,
"from_date": filters.from_date,
"company": filters.company,
"asset": filters.get("asset"),
},
as_dict=1,
)
def get_group_by_asset_data(filters):
data = []
asset_details = get_asset_details_for_grouped_by_category(filters)
assets = get_assets_for_grouped_by_asset(filters)
for asset_detail in asset_details:
row = frappe._dict()
# row.asset_category = asset_category
row.update(asset_detail)
row.cost_as_on_to_date = (
flt(row.cost_as_on_from_date)
+ flt(row.cost_of_new_purchase)
- flt(row.cost_of_sold_asset)
- flt(row.cost_of_scrapped_asset)
)
row.update(next(asset for asset in assets if asset["asset"] == asset_detail.get("name", "")))
row.accumulated_depreciation_as_on_to_date = (
flt(row.accumulated_depreciation_as_on_from_date)
+ flt(row.depreciation_amount_during_the_period)
- flt(row.depreciation_eliminated_during_the_period)
)
row.net_asset_value_as_on_from_date = flt(row.cost_as_on_from_date) - flt(
row.accumulated_depreciation_as_on_from_date
)
row.net_asset_value_as_on_to_date = flt(row.cost_as_on_to_date) - flt(
row.accumulated_depreciation_as_on_to_date
)
data.append(row)
return data
def get_assets_for_grouped_by_category(filters):
condition = ""
if filters.get("asset_category"):
condition = " and a.asset_category = '{}'".format(filters.get("asset_category"))
@@ -178,15 +284,93 @@ def get_assets(filters):
)
def get_assets_for_grouped_by_asset(filters):
condition = ""
if filters.get("asset"):
condition = " and a.name = '{}'".format(filters.get("asset"))
return frappe.db.sql(
"""
SELECT results.name as asset,
sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date,
sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period,
sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period
from (SELECT a.name as name,
ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then
gle.debit
else
0
end), 0) as accumulated_depreciation_as_on_from_date,
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s
and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then
gle.debit
else
0
end), 0) as depreciation_eliminated_during_the_period,
ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s
and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then
gle.debit
else
0
end), 0) as depreciation_amount_during_the_period
from `tabGL Entry` gle
join `tabAsset` a on
gle.against_voucher = a.name
join `tabAsset Category Account` aca on
aca.parent = a.asset_category and aca.company_name = %(company)s
join `tabCompany` company on
company.name = %(company)s
where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s and gle.debit != 0 and gle.is_cancelled = 0 and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) {0}
group by a.name
union
SELECT a.name as name,
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and (a.disposal_date < %(from_date)s or a.disposal_date > %(to_date)s) then
0
else
a.opening_accumulated_depreciation
end), 0) as accumulated_depreciation_as_on_from_date,
ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then
a.opening_accumulated_depreciation
else
0
end), 0) as depreciation_eliminated_during_the_period,
0 as depreciation_amount_during_the_period
from `tabAsset` a
where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {0}
group by a.name) as results
group by results.name
""".format(
condition
),
{"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company},
as_dict=1,
)
def get_columns(filters):
return [
{
"label": _("Asset Category"),
"fieldname": "asset_category",
"fieldtype": "Link",
"options": "Asset Category",
"width": 120,
},
columns = []
if filters.get("group_by") == "Asset Category":
columns.append(
{
"label": _("Asset Category"),
"fieldname": "asset_category",
"fieldtype": "Link",
"options": "Asset Category",
"width": 120,
}
)
elif filters.get("group_by") == "Asset":
columns.append(
{
"label": _("Asset"),
"fieldname": "asset",
"fieldtype": "Link",
"options": "Asset",
"width": 120,
}
)
columns += [
{
"label": _("Cost as on") + " " + formatdate(filters.day_before_from_date),
"fieldname": "cost_as_on_from_date",
@@ -254,3 +438,5 @@ def get_columns(filters):
"width": 200,
},
]
return columns

View File

@@ -97,11 +97,11 @@ def execute(filters=None):
chart = get_chart_data(filters, columns, asset, liability, equity)
report_summary = get_report_summary(
report_summary, primitive_summary = get_report_summary(
period_list, asset, liability, equity, provisional_profit_loss, currency, filters
)
return columns, data, message, chart, report_summary
return columns, data, message, chart, report_summary, primitive_summary
def get_provisional_profit_loss(
@@ -217,7 +217,7 @@ def get_report_summary(
"datatype": "Currency",
"currency": currency,
},
]
], (net_asset - net_liability + net_equity)
def get_chart_data(filters, columns, asset, liability, equity):

View File

@@ -2,7 +2,44 @@
// License: GNU General Public License v3. See license.txt
frappe.query_reports["Budget Variance Report"] = {
"filters": [
"filters": get_filters(),
"formatter": function (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
if (column.fieldname.includes(__("variance"))) {
if (data[column.fieldname] < 0) {
value = "<span style='color:red'>" + value + "</span>";
}
else if (data[column.fieldname] > 0) {
value = "<span style='color:green'>" + value + "</span>";
}
}
return value;
}
}
function get_filters() {
function get_dimensions() {
let result = [];
frappe.call({
method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimensions",
args: {
'with_cost_center_and_project': true
},
async: false,
callback: function(r) {
if(!r.exc) {
result = r.message[0].map(elem => elem.document_type);
}
}
});
return result;
}
let budget_against_options = get_dimensions();
let filters = [
{
fieldname: "from_fiscal_year",
label: __("From Fiscal Year"),
@@ -44,9 +81,13 @@ frappe.query_reports["Budget Variance Report"] = {
fieldname: "budget_against",
label: __("Budget Against"),
fieldtype: "Select",
options: ["Cost Center", "Project"],
options: budget_against_options,
default: "Cost Center",
reqd: 1,
get_data: function() {
console.log(this.options);
return ["Emacs", "Rocks"];
},
on_change: function() {
frappe.query_report.set_filter_value("budget_against_filter", []);
frappe.query_report.refresh();
@@ -71,24 +112,8 @@ frappe.query_reports["Budget Variance Report"] = {
fieldtype: "Check",
default: 0,
},
],
"formatter": function (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
]
if (column.fieldname.includes(__("variance"))) {
if (data[column.fieldname] < 0) {
value = "<span style='color:red'>" + value + "</span>";
}
else if (data[column.fieldname] > 0) {
value = "<span style='color:green'>" + value + "</span>";
}
}
return value;
}
return filters;
}
erpnext.dimension_filters.forEach((dimension) => {
frappe.query_reports["Budget Variance Report"].filters[4].options.push(dimension["document_type"]);
});

View File

@@ -128,7 +128,7 @@ frappe.query_reports["Consolidated Financial Statement"] = {
}
value = default_formatter(value, row, column, data);
if (data && !data.parent_account) {
if (!data.parent_account) {
value = $(`<span>${value}</span>`);
var $value = $(value).css("font-weight", "bold");

View File

@@ -3,7 +3,7 @@
import frappe
from frappe import _, scrub
from frappe import _, qb, scrub
from frappe.utils import getdate, nowdate
@@ -21,8 +21,8 @@ class PartyLedgerSummaryReport(object):
frappe.throw(_("From Date must be before To Date"))
self.filters.party_type = args.get("party_type")
self.party_naming_by = frappe.db.get_value(
args.get("naming_by")[0], None, args.get("naming_by")[1]
self.party_naming_by = frappe.db.get_single_value(
args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_gl_entries()
@@ -38,7 +38,6 @@ class PartyLedgerSummaryReport(object):
"""
Additional Columns for 'User Permission' based access control
"""
from frappe import qb
if self.filters.party_type == "Customer":
self.territories = frappe._dict({})
@@ -365,13 +364,29 @@ class PartyLedgerSummaryReport(object):
def get_party_adjustment_amounts(self):
conditions = self.prepare_conditions()
income_or_expense = (
"Expense Account" if self.filters.party_type == "Customer" else "Income Account"
account_type = "Expense Account" if self.filters.party_type == "Customer" else "Income Account"
income_or_expense_accounts = frappe.db.get_all(
"Account", filters={"account_type": account_type, "company": self.filters.company}, pluck="name"
)
invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
round_off_account = frappe.get_cached_value("Company", self.filters.company, "round_off_account")
gl = qb.DocType("GL Entry")
if not income_or_expense_accounts:
# prevent empty 'in' condition
income_or_expense_accounts.append("")
accounts_query = (
qb.from_(gl)
.select(gl.voucher_type, gl.voucher_no)
.where(
(gl.account.isin(income_or_expense_accounts))
& (gl.posting_date.gte(self.filters.from_date))
& (gl.posting_date.lte(self.filters.to_date))
)
)
gl_entries = frappe.db.sql(
"""
select
@@ -381,16 +396,15 @@ class PartyLedgerSummaryReport(object):
where
docstatus < 2 and is_cancelled = 0
and (voucher_type, voucher_no) in (
select voucher_type, voucher_no from `tabGL Entry` gle, `tabAccount` acc
where acc.name = gle.account and acc.account_type = '{income_or_expense}'
and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2
{accounts_query}
) and (voucher_type, voucher_no) in (
select voucher_type, voucher_no from `tabGL Entry` gle
where gle.party_type=%(party_type)s and ifnull(party, '') != ''
and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2 {conditions}
)
""".format(
conditions=conditions, income_or_expense=income_or_expense
""".format(
accounts_query=accounts_query,
conditions=conditions,
),
self.filters,
as_dict=True,
@@ -414,7 +428,7 @@ class PartyLedgerSummaryReport(object):
elif gle.party:
parties.setdefault(gle.party, 0)
parties[gle.party] += gle.get(reverse_dr_or_cr) - gle.get(invoice_dr_or_cr)
elif frappe.get_cached_value("Account", gle.account, "account_type") == income_or_expense:
elif frappe.get_cached_value("Account", gle.account, "account_type") == account_type:
accounts.setdefault(gle.account, 0)
accounts[gle.account] += gle.get(invoice_dr_or_cr) - gle.get(reverse_dr_or_cr)
else:

View File

@@ -97,7 +97,7 @@ class Deferred_Item(object):
if base_amount + already_booked_amount > self.base_net_amount:
base_amount = self.base_net_amount - already_booked_amount
if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date))
)

View File

@@ -177,8 +177,8 @@ def add_solvency_ratios(
return_on_equity_ratio = {"ratio": "Return on Equity Ratio"}
for year in years:
profit_after_tax = total_income[year] + total_expense[year]
share_holder_fund = total_asset[year] - total_liability[year]
profit_after_tax = flt(total_income.get(year)) + flt(total_expense.get(year))
share_holder_fund = flt(total_asset.get(year)) - flt(total_liability.get(year))
debt_equity_ratio[year] = calculate_ratio(
total_liability.get(year), share_holder_fund, precision

View File

@@ -211,7 +211,13 @@ def get_data(
ignore_accumulated_values_for_fy,
)
accumulate_values_into_parents(accounts, accounts_by_name, period_list)
out = prepare_data(accounts, balance_must_be, period_list, company_currency)
out = prepare_data(
accounts,
balance_must_be,
period_list,
company_currency,
accumulated_values=filters.accumulated_values,
)
out = filter_out_zero_value_rows(out, parent_children_map)
if out and total:
@@ -270,7 +276,7 @@ def accumulate_values_into_parents(accounts, accounts_by_name, period_list):
) + d.get("opening_balance", 0.0)
def prepare_data(accounts, balance_must_be, period_list, company_currency):
def prepare_data(accounts, balance_must_be, period_list, company_currency, accumulated_values):
data = []
year_start_date = period_list[0]["year_start_date"].strftime("%Y-%m-%d")
year_end_date = period_list[-1]["year_end_date"].strftime("%Y-%m-%d")
@@ -310,8 +316,14 @@ def prepare_data(accounts, balance_must_be, period_list, company_currency):
has_value = True
total += flt(row[period.key])
row["has_value"] = has_value
row["total"] = total
if accumulated_values:
# when 'accumulated_values' is enabled, periods have running balance.
# so, last period will have the net amount.
row["has_value"] = has_value
row["total"] = flt(d.get(period_list[-1].key, 0.0), 3)
else:
row["has_value"] = has_value
row["total"] = total
data.append(row)
return data

View File

@@ -52,6 +52,11 @@ frappe.query_reports["General Ledger"] = {
frappe.query_report.set_filter_value('group_by', "Group by Voucher (Consolidated)");
}
},
{
"fieldname":"against_voucher_no",
"label": __("Against Voucher No"),
"fieldtype": "Data",
},
{
"fieldtype": "Break",
},

View File

@@ -200,10 +200,10 @@ def get_gl_entries(filters, accounting_dimensions):
"""
select
name as gl_entry, posting_date, account, party_type, party,
voucher_type, voucher_no, {dimension_fields}
voucher_type, voucher_subtype, voucher_no, {dimension_fields}
cost_center, project, {transaction_currency_fields}
against_voucher_type, against_voucher, account_currency,
against, is_opening, creation {select_fields}
against_link, against, is_opening, creation {select_fields}
from `tabGL Entry`
where company=%(company)s {conditions}
{order_by_statement}
@@ -238,6 +238,9 @@ def get_conditions(filters):
if filters.get("voucher_no"):
conditions.append("voucher_no=%(voucher_no)s")
if filters.get("against_voucher_no"):
conditions.append("against_voucher=%(against_voucher_no)s")
if filters.get("voucher_no_not_in"):
conditions.append("voucher_no not in %(voucher_no_not_in)s")
@@ -395,6 +398,7 @@ def initialize_gle_map(gl_entries, filters):
group_by = group_by_field(filters.get("group_by"))
for gle in gl_entries:
gle.against = gle.get("against_link") or gle.get("against")
gle_map.setdefault(gle.get(group_by), _dict(totals=get_totals_dict(), entries=[]))
return gle_map
@@ -608,6 +612,12 @@ def get_columns(filters):
columns += [
{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": 120},
{
"label": _("Voucher Subtype"),
"fieldname": "voucher_subtype",
"fieldtype": "Data",
"width": 180,
},
{
"label": _("Voucher No"),
"fieldname": "voucher_no",

View File

@@ -170,7 +170,7 @@ def set_total(node, value, complete_list, totals):
totals[node["account"]] += value
parent = node["parent_account"]
if not parent == "":
if parent != "":
return set_total(
next(item for item in complete_list if item["account"] == parent), value, complete_list, totals
)

View File

@@ -695,7 +695,7 @@ class GrossProfitGenerator(object):
def get_average_buying_rate(self, row, item_code):
args = row
if not item_code in self.average_buying_rate:
if item_code not in self.average_buying_rate:
args.update(
{
"voucher_type": row.parenttype,

View File

@@ -319,7 +319,7 @@ def get_items(filters, additional_query_columns):
`tabPurchase Invoice`.posting_date, `tabPurchase Invoice`.credit_to, `tabPurchase Invoice`.company,
`tabPurchase Invoice`.supplier, `tabPurchase Invoice`.remarks, `tabPurchase Invoice`.base_net_total,
`tabPurchase Invoice`.unrealized_profit_loss_account,
`tabPurchase Invoice Item`.`item_code`, `tabPurchase Invoice Item`.description,
`tabPurchase Invoice Item`.`item_code`, `tabPurchase Invoice Item`.description, `tabPurchase Invoice Item`.`item_group`,
`tabPurchase Invoice Item`.`item_name` as pi_item_name, `tabPurchase Invoice Item`.`item_group` as pi_item_group,
`tabItem`.`item_name` as i_item_name, `tabItem`.`item_group` as i_item_group,
`tabPurchase Invoice Item`.`project`, `tabPurchase Invoice Item`.`purchase_order`,

View File

@@ -66,11 +66,11 @@ def execute(filters=None):
currency = filters.presentation_currency or frappe.get_cached_value(
"Company", filters.company, "default_currency"
)
report_summary = get_report_summary(
report_summary, primitive_summary = get_report_summary(
period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters
)
return columns, data, None, chart, report_summary
return columns, data, None, chart, report_summary, primitive_summary
def get_report_summary(
@@ -82,14 +82,25 @@ def get_report_summary(
if filters.get("accumulated_in_group_company"):
period_list = get_filtered_list_for_consolidated_report(filters, period_list)
for period in period_list:
key = period if consolidated else period.key
if filters.accumulated_values:
# when 'accumulated_values' is enabled, periods have running balance.
# so, last period will have the net amount.
key = period_list[-1].key
if income:
net_income += income[-2].get(key)
net_income = income[-2].get(key)
if expense:
net_expense += expense[-2].get(key)
net_expense = expense[-2].get(key)
if net_profit_loss:
net_profit += net_profit_loss.get(key)
net_profit = net_profit_loss.get(key)
else:
for period in period_list:
key = period if consolidated else period.key
if income:
net_income += income[-2].get(key)
if expense:
net_expense += expense[-2].get(key)
if net_profit_loss:
net_profit += net_profit_loss.get(key)
if len(period_list) == 1 and periodicity == "Yearly":
profit_label = _("Profit This Year")
@@ -112,7 +123,7 @@ def get_report_summary(
"datatype": "Currency",
"currency": currency,
},
]
], net_profit
def get_net_profit_loss(income, expense, period_list, company, currency=None, consolidated=False):

View File

@@ -0,0 +1,94 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, getdate, today
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.report.financial_statements import get_period_list
from erpnext.accounts.report.profit_and_loss_statement.profit_and_loss_statement import execute
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
class TestProfitAndLossStatement(AccountsTestMixin, FrappeTestCase):
def setUp(self):
self.create_company()
self.create_customer()
self.create_item()
def tearDown(self):
frappe.db.rollback()
def create_sales_invoice(self, qty=1, rate=150, no_payment_schedule=False, do_not_submit=False):
frappe.set_user("Administrator")
si = create_sales_invoice(
item=self.item,
company=self.company,
customer=self.customer,
debit_to=self.debit_to,
posting_date=today(),
parent_cost_center=self.cost_center,
cost_center=self.cost_center,
rate=rate,
price_list_rate=rate,
qty=qty,
do_not_save=1,
)
si = si.save()
if not do_not_submit:
si = si.submit()
return si
def get_fiscal_year(self):
active_fy = frappe.db.get_all(
"Fiscal Year",
filters={"disabled": 0, "year_start_date": ("<=", today()), "year_end_date": (">=", today())},
)[0]
return frappe.get_doc("Fiscal Year", active_fy.name)
def get_report_filters(self):
fy = self.get_fiscal_year()
return frappe._dict(
company=self.company,
from_fiscal_year=fy.name,
to_fiscal_year=fy.name,
period_start_date=fy.year_start_date,
period_end_date=fy.year_end_date,
filter_based_on="Fiscal Year",
periodicity="Monthly",
accumulated_vallues=True,
)
def test_profit_and_loss_output_and_summary(self):
si = self.create_sales_invoice(qty=1, rate=150)
filters = self.get_report_filters()
period_list = get_period_list(
filters.from_fiscal_year,
filters.to_fiscal_year,
filters.period_start_date,
filters.period_end_date,
filters.filter_based_on,
filters.periodicity,
company=filters.company,
)
result = execute(filters)[1]
current_period = [x for x in period_list if x.from_date <= getdate() and x.to_date >= getdate()][
0
]
current_period_key = current_period.key
without_current_period = [x for x in period_list if x.key != current_period.key]
# all period except current period(whence invoice was posted), should be '0'
for acc in result:
if acc:
with self.subTest(acc=acc):
for period in without_current_period:
self.assertEqual(acc[period.key], 0)
for acc in result:
if acc:
with self.subTest(current_period_key=current_period_key):
self.assertEqual(acc[current_period_key], 150)
self.assertEqual(acc["total"], 150)

View File

@@ -117,8 +117,3 @@ frappe.query_reports["Profitability Analysis"] = {
"parent_field": "parent_account",
"initial_depth": 3
}
erpnext.dimension_filters.forEach((dimension) => {
frappe.query_reports["Profitability Analysis"].filters[1].options.push(dimension["document_type"]);
});

View File

@@ -69,7 +69,7 @@ def get_result(
tax_amount += entry.credit - entry.debit
if net_total_map.get(name):
if voucher_type == "Journal Entry":
if voucher_type == "Journal Entry" and tax_amount and rate:
# back calcalute total amount from rate and tax_amount
if rate:
total_amount = grand_total = base_total = tax_amount / (rate / 100)
@@ -154,7 +154,7 @@ def get_gle_map(documents):
)
for d in gle:
if not d.voucher_no in gle_map:
if d.voucher_no not in gle_map:
gle_map[d.voucher_no] = [d]
else:
gle_map[d.voucher_no].append(d)

View File

@@ -251,6 +251,7 @@ def get_journal_entries(filters, args):
)
.where(
(je.voucher_type == "Journal Entry")
& (je.docstatus == 1)
& (journal_account.party == filters.get(args.party))
& (journal_account.account.isin(args.party_account))
)
@@ -281,7 +282,9 @@ def get_payment_entries(filters, args):
pe.cost_center,
)
.where(
(pe.party == filters.get(args.party)) & (pe[args.account_fieldname].isin(args.party_account))
(pe.docstatus == 1)
& (pe.party == filters.get(args.party))
& (pe[args.account_fieldname].isin(args.party_account))
)
.orderby(pe.posting_date, pe.name, order=Order.desc)
)

View File

@@ -10,7 +10,7 @@ import frappe.defaults
from frappe import _, qb, throw
from frappe.model.meta import get_field_precision
from frappe.query_builder import AliasedQuery, Criterion, Table
from frappe.query_builder.functions import Sum
from frappe.query_builder.functions import Round, Sum
from frappe.query_builder.utils import DocType
from frappe.utils import (
cint,
@@ -549,6 +549,8 @@ def check_if_advance_entry_modified(args):
)
else:
precision = frappe.get_precision("Payment Entry", "unallocated_amount")
payment_entry = frappe.qb.DocType("Payment Entry")
payment_ref = frappe.qb.DocType("Payment Entry Reference")
@@ -570,7 +572,10 @@ def check_if_advance_entry_modified(args):
.where(payment_ref.allocated_amount == args.get("unreconciled_amount"))
)
else:
q = q.where(payment_entry.unallocated_amount == args.get("unreconciled_amount"))
q = q.where(
Round(payment_entry.unallocated_amount, precision)
== Round(args.get("unreconciled_amount"), precision)
)
ret = q.run(as_dict=True)
@@ -637,6 +642,7 @@ def update_reference_in_journal_entry(d, journal_entry, do_not_save=False):
new_row.set("reference_name", d["against_voucher"])
new_row.against_account = cstr(jv_detail.against_account)
new_row.against_account_link = cstr(jv_detail.against_account)
new_row.is_advance = cstr(jv_detail.is_advance)
new_row.docstatus = 1
@@ -694,7 +700,9 @@ def update_reference_in_payment_entry(
if not skip_ref_details_update_for_pe:
payment_entry.set_missing_ref_details()
payment_entry.set_amounts()
payment_entry.make_exchange_gain_loss_journal()
payment_entry.make_exchange_gain_loss_journal(
frappe._dict({"difference_posting_date": d.difference_posting_date})
)
if not do_not_save:
payment_entry.save(ignore_permissions=True)
@@ -1057,11 +1065,11 @@ def get_outstanding_invoices(
if (
min_outstanding
and max_outstanding
and not (outstanding_amount >= min_outstanding and outstanding_amount <= max_outstanding)
and (outstanding_amount < min_outstanding or outstanding_amount > max_outstanding)
):
continue
if not d.voucher_type == "Purchase Invoice" or d.voucher_no not in held_invoices:
if d.voucher_type != "Purchase Invoice" or d.voucher_no not in held_invoices:
outstanding_invoices.append(
frappe._dict(
{
@@ -1108,12 +1116,16 @@ def get_companies():
@frappe.whitelist()
def get_children(doctype, parent, company, is_root=False):
def get_children(doctype, parent, company, is_root=False, include_disabled=False):
if isinstance(include_disabled, str):
include_disabled = frappe.json.loads(include_disabled)
from erpnext.accounts.report.financial_statements import sort_accounts
parent_fieldname = "parent_" + doctype.lower().replace(" ", "_")
fields = ["name as value", "is_group as expandable"]
filters = [["docstatus", "<", 2]]
if frappe.db.has_column(doctype, "disabled") and not include_disabled:
filters.append(["disabled", "=", False])
filters.append(['ifnull(`{0}`,"")'.format(parent_fieldname), "=", "" if is_root else parent])
@@ -1268,7 +1280,7 @@ def parse_naming_series_variable(doc, variable):
else:
date = getdate()
company = None
return get_fiscal_year(date=date, company=company)[0]
return get_fiscal_year(date=date, company=company).name
@frappe.whitelist()

View File

@@ -5,7 +5,7 @@
"label": "Profit and Loss"
}
],
"content": "[{\"id\":\"MmUf9abwxg\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"id\":\"VVvJ1lUcfc\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Bills\",\"col\":3}},{\"id\":\"Vlj2FZtlHV\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Bills\",\"col\":3}},{\"id\":\"VVVjQVAhPf\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Payment\",\"col\":3}},{\"id\":\"DySNdlysIW\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Payment\",\"col\":3}},{\"id\":\"i0EtSjDAXq\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"id\":\"X78jcbq1u3\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"vikWSkNm6_\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts</b></span>\",\"col\":12}},{\"id\":\"pMywM0nhlj\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"id\":\"_pRdD6kqUG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"G984SgVRJN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"id\":\"1ArNvt9qhz\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"id\":\"F9f4I1viNr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"id\":\"4IBBOIxfqW\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"id\":\"El2anpPaFY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"id\":\"1nwcM9upJo\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"id\":\"OF9WOi1Ppc\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"iAwpe-Chra\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Accounting\",\"col\":3}},{\"id\":\"B7-uxs8tkU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"tHb3yxthkR\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Reports &amp; Masters</b></span>\",\"col\":12}},{\"id\":\"DnNtsmxpty\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"id\":\"nKKr6fjgjb\",\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"id\":\"xOHTyD8b5l\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"id\":\"_Cb7C8XdJJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"id\":\"p7NY6MHe2Y\",\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"id\":\"KlqilF5R_V\",\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"id\":\"jTUy8LB0uw\",\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"id\":\"Wn2lhs7WLn\",\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"id\":\"PAQMqqNkBM\",\"type\":\"card\",\"data\":{\"card_name\":\"Bank Statement\",\"col\":4}},{\"id\":\"Q_hBCnSeJY\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"3AK1Zf0oew\",\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}},{\"id\":\"kxhoaiqdLq\",\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"id\":\"q0MAlU2j_Z\",\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"id\":\"ptm7T6Hwu-\",\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"id\":\"OX7lZHbiTr\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
"content": "[{\"id\":\"MmUf9abwxg\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"id\":\"VVvJ1lUcfc\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Bills\",\"col\":3}},{\"id\":\"Vlj2FZtlHV\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Bills\",\"col\":3}},{\"id\":\"VVVjQVAhPf\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Payment\",\"col\":3}},{\"id\":\"DySNdlysIW\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Payment\",\"col\":3}},{\"id\":\"i0EtSjDAXq\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"id\":\"X78jcbq1u3\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"vikWSkNm6_\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts</b></span>\",\"col\":12}},{\"id\":\"pMywM0nhlj\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"id\":\"_pRdD6kqUG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"G984SgVRJN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"id\":\"1ArNvt9qhz\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"id\":\"F9f4I1viNr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"id\":\"4IBBOIxfqW\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"id\":\"El2anpPaFY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"id\":\"1nwcM9upJo\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"id\":\"OF9WOi1Ppc\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"iAwpe-Chra\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Accounting\",\"col\":3}},{\"id\":\"B7-uxs8tkU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"tHb3yxthkR\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Reports &amp; Masters</b></span>\",\"col\":12}},{\"id\":\"DnNtsmxpty\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"id\":\"nKKr6fjgjb\",\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"id\":\"xOHTyD8b5l\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"id\":\"_Cb7C8XdJJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"id\":\"p7NY6MHe2Y\",\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"id\":\"KlqilF5R_V\",\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"id\":\"jTUy8LB0uw\",\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"id\":\"Wn2lhs7WLn\",\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"id\":\"PAQMqqNkBM\",\"type\":\"card\",\"data\":{\"card_name\":\"Banking\",\"col\":4}},{\"id\":\"Q_hBCnSeJY\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"3AK1Zf0oew\",\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}},{\"id\":\"kxhoaiqdLq\",\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"id\":\"q0MAlU2j_Z\",\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"id\":\"ptm7T6Hwu-\",\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"id\":\"OX7lZHbiTr\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
"creation": "2020-03-02 15:41:59.515192",
"custom_blocks": [],
"docstatus": 0,
@@ -652,14 +652,6 @@
"onboard": 0,
"type": "Link"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "Bank Statement",
"link_count": 0,
"onboard": 0,
"type": "Card Break"
},
{
"dependencies": "",
"hidden": 0,
@@ -1059,9 +1051,83 @@
"link_type": "Report",
"onboard": 0,
"type": "Link"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "Banking",
"link_count": 6,
"link_type": "DocType",
"onboard": 0,
"type": "Card Break"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Bank",
"link_count": 0,
"link_to": "Bank",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Bank Account",
"link_count": 0,
"link_to": "Bank Account",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Bank Clearance",
"link_count": 0,
"link_to": "Bank Clearance",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Bank Reconciliation Tool",
"link_count": 0,
"link_to": "Bank Reconciliation Tool",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "GL Entry",
"hidden": 0,
"is_query_report": 1,
"label": "Bank Reconciliation Statement",
"link_count": 0,
"link_to": "Bank Reconciliation Statement",
"link_type": "Report",
"onboard": 0,
"type": "Link"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "Plaid Settings",
"link_count": 0,
"link_to": "Plaid Settings",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
}
],
"modified": "2023-08-10 17:41:14.059005",
"modified": "2024-01-02 15:21:09.895531",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting",

View File

@@ -202,9 +202,9 @@
"fieldname": "purchase_date",
"fieldtype": "Date",
"label": "Purchase Date",
"mandatory_depends_on": "eval:!doc.is_existing_asset",
"read_only": 1,
"read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset",
"reqd": 1
"read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset"
},
{
"fieldname": "disposal_date",
@@ -227,15 +227,15 @@
"fieldname": "gross_purchase_amount",
"fieldtype": "Currency",
"label": "Gross Purchase Amount",
"mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)",
"options": "Company:company:default_currency",
"read_only_depends_on": "eval:!doc.is_existing_asset",
"reqd": 1
"read_only_depends_on": "eval:!doc.is_existing_asset"
},
{
"fieldname": "available_for_use_date",
"fieldtype": "Date",
"label": "Available-for-use Date",
"reqd": 1
"mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)"
},
{
"default": "0",
@@ -590,7 +590,7 @@
"link_fieldname": "target_asset"
}
],
"modified": "2023-12-21 16:46:20.732869",
"modified": "2024-01-05 17:36:53.131512",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",

View File

@@ -57,7 +57,7 @@ class Asset(AccountsController):
asset_owner: DF.Literal["", "Company", "Supplier", "Customer"]
asset_owner_company: DF.Link | None
asset_quantity: DF.Int
available_for_use_date: DF.Date
available_for_use_date: DF.Date | None
booked_fixed_asset: DF.Check
calculate_depreciation: DF.Check
capitalized_in: DF.Link | None
@@ -92,7 +92,7 @@ class Asset(AccountsController):
number_of_depreciations_booked: DF.Int
opening_accumulated_depreciation: DF.Currency
policy_number: DF.Data | None
purchase_date: DF.Date
purchase_date: DF.Date | None
purchase_invoice: DF.Link | None
purchase_receipt: DF.Link | None
purchase_receipt_amount: DF.Currency
@@ -316,7 +316,12 @@ class Asset(AccountsController):
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
if is_cwip_accounting_enabled(self.asset_category):
if not self.is_existing_asset and not (self.purchase_receipt or self.purchase_invoice):
if (
not self.is_existing_asset
and not self.is_composite_asset
and not self.purchase_receipt
and not self.purchase_invoice
):
frappe.throw(
_("Please create purchase receipt or purchase invoice for the item {0}").format(
self.item_code
@@ -329,7 +334,7 @@ class Asset(AccountsController):
and not frappe.db.get_value("Purchase Invoice", self.purchase_invoice, "update_stock")
):
frappe.throw(
_("Update stock must be enable for the purchase invoice {0}").format(self.purchase_invoice)
_("Update stock must be enabled for the purchase invoice {0}").format(self.purchase_invoice)
)
if not self.calculate_depreciation:
@@ -692,7 +697,9 @@ class Asset(AccountsController):
self.get_gl_dict(
{
"account": cwip_account,
"against_type": "Account",
"against": fixed_asset_account,
"against_link": fixed_asset_account,
"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
"posting_date": self.available_for_use_date,
"credit": self.purchase_receipt_amount,
@@ -707,7 +714,9 @@ class Asset(AccountsController):
self.get_gl_dict(
{
"account": fixed_asset_account,
"against_type": "Account",
"against": cwip_account,
"against_link": cwip_account,
"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
"posting_date": self.available_for_use_date,
"debit": self.purchase_receipt_amount,

View File

@@ -35,7 +35,7 @@ from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_sched
def post_depreciation_entries(date=None):
# Return if automatic booking of asset depreciation is disabled
if not cint(
frappe.db.get_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically")
frappe.db.get_single_value("Accounts Settings", "book_asset_depreciation_entry_automatically")
):
return

View File

@@ -251,7 +251,16 @@ class TestAsset(AssetSetup):
flt(18000.0 + pro_rata_amount, asset.precision("gross_purchase_amount")),
0.0,
),
("_Test Fixed Asset - _TC", 0.0, 100000.0),
(
"_Test Fixed Asset - _TC",
0.0,
flt(18000.0 + pro_rata_amount, asset.precision("gross_purchase_amount")),
),
(
"_Test Fixed Asset - _TC",
0.0,
flt(82000.0 - pro_rata_amount, asset.precision("gross_purchase_amount")),
),
(
"_Test Gain/Loss on Asset Disposal - _TC",
flt(82000.0 - pro_rata_amount, asset.precision("gross_purchase_amount")),

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