Compare commits

...

605 Commits

Author SHA1 Message Date
frappe-pr-bot
ee2034410f chore: update POT file 2024-05-12 09:35:37 +00:00
Frappe PR Bot
3fa8706f57 chore: update POT file (#41326) 2024-05-10 16:29:49 +02:00
Frappe PR Bot
f92aabd0f3 fix: sync translations from crowdin (#41262) 2024-05-10 16:28:17 +02:00
rehanrehman389
628d7e6458 chore: typo in Stock Settings (#41396) 2024-05-10 15:40:02 +05:30
Nihantra C. Patel
ba60b5911a fix: bold total in exponential smoothing forecasting (#41393)
* fix: bold total in exponential smoothing forecasting

* fix: bold total in exponential smoothing forecasting
2024-05-10 13:12:23 +05:30
ruthra kumar
08899d05fb Merge pull request #41040 from Nihantra-Patel/fix_quot_prospect
fix: address filter and quotation to for prospect
2024-05-09 12:14:41 +05:30
ruthra kumar
754c7f6d1c refactor: make use of doc.quotation_to 2024-05-09 11:58:33 +05:30
Nabin Hait
92673d706c Merge pull request #41024 from khushi8112/expense-account-based-on-asset-category
fix: expense account should be fetched from related asset category
2024-05-09 01:30:45 +05:30
Raffael Meyer
9c3a105f85 fix: consistent use of "Address & Contact" (#41386) 2024-05-08 16:20:35 +00:00
Khushi Rawat
272ce24016 style: code changes for better readability
Co-authored-by: Nabin Hait <nabinhait@gmail.com>
2024-05-08 19:17:09 +05:30
“Khushi
651e4696fd fix: expense account should be fetched from related asset category 2024-05-08 19:14:51 +05:30
rohitwaghchaure
5ed1b6b8fb fix: incorrect qty picked in the pick list (#41378) 2024-05-08 17:56:10 +05:30
Nabin Hait
cd5d244d2c Merge pull request #41236 from nabinhait/merge_gle_in_transaction_currency
fix: Merge debit and credit in transaction currency while merging gle with similar head
2024-05-08 17:50:56 +05:30
rohitwaghchaure
0887161f2a perf: index on item code for the Pick List Item doctype (#41357) 2024-05-07 16:29:20 +05:30
rohitwaghchaure
544fc60093 fix: filter validation for batch-wise balance history report (#41356)
fix: filter validation for batchwise balance history report
2024-05-07 16:29:08 +05:30
ruthra kumar
c50663c640 Merge pull request #41288 from ruthra-kumar/bug_in_promotional_scheme
fix: pricing rule rounding
2024-05-07 10:01:00 +05:30
ruthra kumar
c41a037174 refactor(test): test floor based rounding 2024-05-07 09:44:10 +05:30
Raffael Meyer
c710ad822c fix(Item): allow UOM conversion for non-stock items (#41267) 2024-05-06 18:50:30 +02:00
rohitwaghchaure
ebfbe94aaf fix: pick list with multiple batch issue (#41335)
fix: pick list with batchb issue
2024-05-06 13:17:07 +05:30
ruthra kumar
e51ccecd8a Merge pull request #41334 from ruthra-kumar/fix_gp_purchase_invoice_item
fix: incorrect query for Purchase Invoice rate in GP
2024-05-06 12:53:46 +05:30
ruthra kumar
bd8382c592 fix: incorrect query for Purchase Invoice rate in GP 2024-05-06 12:07:33 +05:30
Ankush Menat
6142d07f1a fix: update project URLs (#41331) 2024-05-06 06:02:57 +00:00
Deepesh Garg
ed5344d58b Merge pull request #41318 from deepeshgarg007/psoa_cost_center
fix: Cost center not getting saved in PSOA
2024-05-04 13:55:40 +05:30
Deepesh Garg
44228b754f Merge pull request #41314 from deepeshgarg007/tcs_opening
fix: Do not deduct TCS for opening invoices
2024-05-04 13:54:46 +05:30
Deepesh Garg
d19ae4ce4c Merge pull request #41279 from deepeshgarg007/order_advance
fix: GL Entries against orders as an advance
2024-05-03 19:41:24 +05:30
Deepesh Garg
58f7039630 fix: Cost center not getting saved in PSOA 2024-05-03 18:34:27 +05:30
Deepesh Garg
eac7be2d0f test: Add bank account 2024-05-03 18:30:47 +05:30
Deepesh Garg
42ef95759d test: Update failing tests 2024-05-03 17:04:37 +05:30
Deepesh Garg
eb31017058 fix: Add PO reference 2024-05-03 15:56:29 +05:30
Deepesh Garg
69d68592ad Merge pull request #41311 from deepeshgarg007/future_subscription_updates
fix: future subscription updates
2024-05-03 12:04:39 +05:30
Deepesh Garg
eb9f579b8f fix: Do not deduct TCS for opening invoices 2024-05-03 11:47:43 +05:30
Raffael Meyer
e4db0562ac fix: search for item price in stock UOM (#41075) 2024-05-03 10:06:52 +05:30
Raffael Meyer
a61148c464 feat(Item Price): make UOM mandatory (#40588) 2024-05-03 10:04:24 +05:30
Deepesh Garg
7fa22069d8 test: Add posting dates 2024-05-03 09:25:26 +05:30
Deepesh Garg
54a12c5186 Merge pull request #41260 from deepeshgarg007/pi_gl_entries_pi
fix: Purchase Invoice gain loss gl entry for periodic inventory
2024-05-03 08:54:57 +05:30
HENRY Florian
c8e92cb1b2 fix: missing Item Name on Save for Quotation created from Item (#41233)
* fix: missing Item Name on Save for Quotation created from Item

* fix: missing Item Name on Save for Quotation created from Item
2024-05-02 22:22:12 +05:30
Akhil Narang
93c6324115 Merge pull request #41299 from frappe/revert-41146-fix-add-import
Revert "fix(supplier): add back import that got removed by ruff"
2024-05-02 17:59:10 +05:30
Akhil Narang
f26be2a303 Revert "fix(supplier): add back import that got removed by ruff" 2024-05-02 17:42:33 +05:30
David Arnold
61f5ebd2dd feat: create delivery trip on draft notes (#38559)
feat: create draft delivery trips from draft delivery notes
2024-05-02 16:00:21 +05:30
Akhil Narang
22c345a24a Merge pull request #41146 from akhilnarang/fix-add-import
fix(supplier): add back import that got removed by ruff
2024-05-02 12:23:58 +05:30
ruthra kumar
9bf37426c1 fix: pricing rule rounding
Consider a pricing rule of 20:1 with recursion enabled, free items
should follow the below progression

|   Qty | Free item qty |
|-------+---------------|
|  0-19 |             0 |
| 20-39 |             1 |
| 40-59 |             2 |
2024-05-02 09:40:07 +05:30
rohitwaghchaure
1cbc200770 fix: added brand column in Warehouse wise Item Balance Age and Value … (#41280)
fix: added brand coulmn in Warehouse wise Item Balance Age and Value report
2024-05-01 15:46:43 +05:30
Deepesh Garg
8289f3c724 fix: GL Entries against orders as an advance 2024-05-01 12:17:08 +05:30
mergify[bot]
da3010a41f fix: multiple pricing rules with discount amount and discount percentage not working (backport #41211) (#41241)
fix: multiple pricing rules with discount amount and discount percentage not working (#41211)

(cherry picked from commit 54313b5db9)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2024-04-30 21:48:46 +05:30
ruthra kumar
ed9af7d12e Merge pull request #41268 from ruthra-kumar/validation_to_prevent_overallocation_on_reconciliation
fix: validation to prevent overallocation
2024-04-30 17:37:46 +05:30
ruthra kumar
bf755fab55 fix: validation to prevent overallocation 2024-04-30 17:19:41 +05:30
Deepesh Garg
2402447568 fix: Purchase Invoice gain loss gl entry for periodic inventory 2024-04-30 13:28:43 +05:30
Deepesh Garg
f77d5db38e Merge pull request #41258 from deepeshgarg007/psoa_ageing
fix: PSOA ageing
2024-04-30 13:10:12 +05:30
Deepesh Garg
fed2d11905 fix: PSOA ageing 2024-04-30 12:50:21 +05:30
ruthra kumar
8861a76bd0 Merge pull request #41252 from ruthra-kumar/permission_issue_on_tax_withholding_category
fix: permission issue when user permission restricts on company
2024-04-30 11:20:18 +05:30
Deepesh Garg
56f0b2628e Merge pull request #41171 from deepeshgarg007/deferred_revenue_expense_report
fix: Invoice with no GLEs in deferred report
2024-04-30 11:14:54 +05:30
ruthra kumar
7a6cc84d41 fix: permission issue when user permission restricts on company 2024-04-30 10:26:55 +05:30
Deepesh Garg
a34c99385c Merge pull request #41173 from deepeshgarg007/br_paid_amount
fix: paid amount in bank reconciliation tool
2024-04-30 10:25:03 +05:30
Deepesh Garg
94339c569e Merge pull request #41219 from deepeshgarg007/br_company_user_perm
fix: Ignore user perm in Bank Reco Tool for company
2024-04-30 10:22:27 +05:30
ruthra kumar
1df06efd97 Merge pull request #41240 from ruthra-kumar/fix_based_on_payment_term_for_single_term
fix: display term name for single term invoices in AR/AP
2024-04-30 07:09:00 +05:30
ruthra kumar
52e52e83a9 Merge pull request #41194 from ruthra-kumar/fix_incorrectly_applying_tds_when_advance_in_prev_fiscal_year
fix: TDS incorrectly applied when Advance is in previous FY
2024-04-30 06:56:49 +05:30
Frappe PR Bot
9f092dbe9f chore: update POT file (#41220) 2024-04-30 00:51:38 +02:00
Frappe PR Bot
b324a02fbb fix: sync translations from crowdin (#40965) 2024-04-30 00:50:41 +02:00
ruthra kumar
5fa4cfee04 fix: display term name for single term invoices 2024-04-29 19:31:21 +05:30
Deepesh Garg
5e48c1ac51 Merge pull request #41237 from nikkothari22/fix-party-type-label-on-accounting-preview
fix: party and party type label on accounting preview
2024-04-29 18:53:39 +05:30
Nabin Hait
e0d12ba4d0 fix: Patch to fix the incorrect debit and credit in transaction currency 2024-04-29 17:44:41 +05:30
Nikhil Kothari
f7f3b22786 fix: party and party type label on accounting preview 2024-04-29 17:31:39 +05:30
Nabin Hait
e43697d359 fix: Merge debit and credit in transaction currency while merging gle with similar head 2024-04-29 17:01:48 +05:30
ruthra kumar
2f9a144023 test: TDS deduction across fiscal year 2024-04-29 12:29:05 +05:30
Deepesh Garg
9e2ecd67f9 Merge pull request #40865 from rtdany10/def-expns
fix: missing def expense if no exp in first month
2024-04-29 10:24:35 +05:30
ruthra kumar
b195f519e2 fix: incorrectly applying TDS when Advance is in previous FY 2024-04-29 08:24:20 +05:30
Deepesh Garg
9f346e7ba0 fix: Ignore user perm in Bank Reco Tool for company 2024-04-28 14:41:34 +05:30
Deepesh Garg
8e30debc10 fix: future subscripition updates 2024-04-27 23:07:14 +05:30
ruthra kumar
41695e601d Merge pull request #41208 from ruthra-kumar/incorrect_receivable_account_handling_on_reconciliation_tool
fix: set receivable account based on response type
2024-04-26 14:12:02 +05:30
ruthra kumar
066859cca0 fix: handle and receivable accounts based on response type 2024-04-26 13:59:22 +05:30
rohitwaghchaure
44f9059338 Merge pull request #41165 from rohitwaghchaure/feat-allow-to-do-reposting-for-all-transactions
feat: allow to do reposting for all stock transactions (audit)
2024-04-26 13:43:34 +05:30
rohitwaghchaure
d95d00b7c8 Merge pull request #41167 from rohitwaghchaure/feat-warehouse-type-filter-for-reports
fix: warehouse type filter for stock reports
2024-04-26 13:10:25 +05:30
rohitwaghchaure
880d061164 Merge pull request #41182 from Nihantra-Patel/email_-rendering
fix: rendering the email template when user HTML
2024-04-26 13:09:53 +05:30
rohitwaghchaure
bb5f1dae75 Merge pull request #41185 from Nihantra-Patel/delivery_trip
fix: args when get the delivery note in delivery trip
2024-04-26 13:09:11 +05:30
Rushabh Mehta
1bb1b69dea Merge pull request #40716 from khushi8112/incorrect-cash-flow-report
Incorrect cash flow report
2024-04-26 12:52:57 +05:30
rohitwaghchaure
3562c2d1d1 Merge pull request #41195 from rohitwaghchaure/fixed-incorrect-basic-rate-13963
fix: basic rate for SABB
2024-04-26 12:49:46 +05:30
Khushi Rawat
46736a737f fix(minor): don't translate voucher type 2024-04-26 12:36:34 +05:30
Rushabh Mehta
5b1e860489 Merge pull request #40915 from khushi8112/company-field-should-be-fetch-from-parent-acc
fix: company field should be fetch from parent acc
2024-04-26 12:28:06 +05:30
rohitwaghchaure
8e095335be Merge pull request #41192 from rohitwaghchaure/fixed-13960
fix: duplicate column in the stock ledger report
2024-04-26 12:21:47 +05:30
Rohit Waghchaure
7fa94843aa fix: basic rate for SABB 2024-04-26 12:20:08 +05:30
Rohit Waghchaure
be7fd6bfb4 fix: duplicate column in the stock ledger report 2024-04-26 10:43:30 +05:30
ruthra kumar
90d1873ad0 Merge pull request #41183 from ruthra-kumar/disable_advance_for_non_customer_or_supplier
fix: restrict Advance in separate party to customer and supplier
2024-04-25 19:59:16 +05:30
Ankush Menat
341fb6d8f3 fix: handle stock balance unbuffered_cursor error (#41186) 2024-04-25 11:43:58 +00:00
Nihantra Patel
ca577f7aaa fix: args when get the delivery note in delivery trip 2024-04-25 16:46:29 +05:30
Nihantra Patel
2f359e201d fix: args when get the delivery note in delivery trip 2024-04-25 16:42:38 +05:30
ruthra kumar
3c1af2acf0 fix: enable advance in separate acc only for customer and Supplier 2024-04-25 13:26:15 +05:30
Nihantra C. Patel
7cb66f7fd3 fix: rendering the email template when user HTML 2024-04-25 12:01:28 +05:30
Deepesh Garg
a48966f08c fix: paid amount in bank reconciliation tool 2024-04-24 21:50:03 +05:30
Deepesh Garg
ecf07bd128 chore: remove debug flag 2024-04-24 19:44:47 +05:30
Deepesh Garg
1c613ada6f fix: Invoice with no GLEs in deferred report 2024-04-24 19:40:05 +05:30
Rohit Waghchaure
4250ac821f fix: warehouse type filter for stock reports 2024-04-24 14:41:10 +05:30
Rohit Waghchaure
aefbe21b46 feat: allow to do reposting for all transactions (audit) 2024-04-24 14:31:29 +05:30
Deepesh Garg
5f6bf4c369 Merge pull request #41106 from deepeshgarg007/heatmap_remove
chore: Remove heatmap from party dashboards
2024-04-24 12:01:14 +05:30
Deepesh Garg
cfa3c85f3c Merge pull request #41160 from ruchamahabal/cost-center-perm
fix: allow Employee role to select cost center & project (accounting dimensions)
2024-04-24 11:14:22 +05:30
Rucha Mahabal
d0d496a515 fix: allow Employee role to select cost center & project (accounting dimensions) 2024-04-24 10:57:41 +05:30
rohitwaghchaure
14bdd5da6e Merge pull request #41135 from rohitwaghchaure/available-batch-report
feat: Available batches as on specific date report
2024-04-23 22:17:08 +05:30
Rohit Waghchaure
b8f7979794 feat: Available batches report as on specific date 2024-04-23 17:18:31 +05:30
rohitwaghchaure
3bd598bd1b Merge pull request #41145 from rohitwaghchaure/fixed-13815
fix: incorrect stock posting for current qty
2024-04-23 16:50:09 +05:30
Rohit Waghchaure
d4fe313de2 fix: incorrect stock posting for current qty 2024-04-23 16:18:40 +05:30
ruthra kumar
6d51105082 Merge pull request #41147 from ruthra-kumar/better_description_and_validation
refactor: better description and pop up on Advance accounts
2024-04-23 14:45:04 +05:30
ruthra kumar
9dbd321133 refactor: popup to inform on limited support for Advance accounts 2024-04-23 13:57:12 +05:30
Akhil Narang
808dbfcade fix(supplier): add back import that got removed by ruff
It isn't unused, just isn't directly called

Fixes 3effaf21ef

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-04-23 13:26:05 +05:30
rohitwaghchaure
3b62237570 Merge pull request #41098 from rohitwaghchaure/fixed-stock-reco-negative-qty-validation-13584
fix: stock reconciliation negative qty validation
2024-04-23 13:08:41 +05:30
Rohit Waghchaure
289495c308 fix: stock reco negative qty validation 2024-04-23 12:45:33 +05:30
ruthra kumar
de9c8fc9d6 refactor: better description for advance account 2024-04-23 12:38:44 +05:30
ruthra kumar
6b8f65b7de Merge pull request #41142 from ruthra-kumar/toggle_auto_bank_account_update
fix: mode of payment has precedance in Payment Entry
2024-04-23 11:54:53 +05:30
rohitwaghchaure
eadd892b03 Merge pull request #41013 from Nihantra-Patel/fix_dc_qc
fix: inspection type when create a qc from dc
2024-04-23 11:33:43 +05:30
ruthra kumar
4aef969879 fix: mode of payment has precedance
Mode of Payment is given precedence over company/party bank account
2024-04-23 10:40:36 +05:30
Nabin Hait
4eee3f52a3 Merge pull request #41136 from nabinhait/installation-note-fix
fix: Missing args while fetching items from delivery note in Installation Note
2024-04-23 10:24:01 +05:30
ruthra kumar
3e7ccb24a6 Merge pull request #41086 from ruthra-kumar/prevent_multi_currency_advance_in_separate_party
fix: prevent foreign currency  accounts as advance accounts.
2024-04-23 07:14:16 +05:30
Nabin Hait
bbe323fbb4 fix: Missing args while fetching items from delivery note 2024-04-22 16:28:31 +05:30
Deepesh Garg
7286df86c5 Merge pull request #41104 from deepeshgarg007/payment_entry_test
fix: Payment entry against employee
2024-04-22 11:36:05 +05:30
Gursheen Kaur Anand
affe304d47 Merge pull request #40769 from GursheenK/budget-actual-expense
fix: budget validation for purchase orders
2024-04-21 16:54:44 +05:30
rohitwaghchaure
b4cbd5fafa Merge pull request #41120 from frappe/mergify/bp/develop/pr-36459
fix: search not working for so in the Production Plan (backport #36459)
2024-04-21 16:49:58 +05:30
rohitwaghchaure
9a6e762b8b fix: search not working for so in the Production Plan (#36459)
fix: search not working for so
(cherry picked from commit 8c57d56240)
2024-04-21 07:56:37 +00:00
rohitwaghchaure
41035ccba0 Merge pull request #41099 from rohitwaghchaure/fixed-report-13659
fix: not able to update default supplier from Supplier Quotation Comparison report
2024-04-20 11:20:31 +05:30
rohitwaghchaure
29153ed3b4 Merge pull request #41102 from rohitwaghchaure/fixed-stock-ledeger-report-balance-qty-13622
fix: balance qty for stock ledger report
2024-04-19 21:50:14 +05:30
Deepesh Garg
a8f03e8baa chore: Remove heatmap from party dashboards 2024-04-19 19:09:55 +05:30
Deepesh Garg
93e6c6ccab fix: Payment entry against employee 2024-04-19 17:38:11 +05:30
Rohit Waghchaure
f00ae0b92b fix: balance qty for stock ledger report 2024-04-19 17:30:27 +05:30
Deepesh Garg
a4b6eda8a9 Merge pull request #41085 from deepeshgarg007/ldc_permission
fix: Permission for lower deduction certificate
2024-04-19 15:39:35 +05:30
Rohit Waghchaure
ad8e189c26 fix: not able to update default supplier from Supplier Quotation Comparison report 2024-04-19 15:39:22 +05:30
rohitwaghchaure
7ad1bf5840 Merge pull request #41067 from rohitwaghchaure/fixed-validation-for-voucher-no-and-qty
fix: validation for zero qty in SABB
2024-04-19 15:10:19 +05:30
ruthra kumar
1ad065fc54 fix: advance account validation in company master 2024-04-18 17:15:52 +05:30
Rohit Waghchaure
497f560b4b fix: validation for zero qty in SABB 2024-04-18 15:53:42 +05:30
Deepesh Garg
f6f118855b fix: Permission for lower dedcution certificate 2024-04-18 15:26:03 +05:30
rohitwaghchaure
e706b4534c Merge pull request #41083 from rohitwaghchaure/fixed-work-order-qty-to-manuufacture
fix: validation for fraction number in Work Order
2024-04-18 14:44:18 +05:30
Rohit Waghchaure
f8305c2fc0 fix: validation for fraction number in Work Order 2024-04-18 14:24:51 +05:30
ruthra kumar
e3fc5990ee fix: validation to prevent foreign currency advance accounts in PE 2024-04-18 12:24:45 +05:30
s-aga-r
fb6b98c85d Merge pull request #41074 from s-aga-r/FIX-13339-2
fix: validate uom is integer for PR item
2024-04-17 22:29:38 +05:30
s-aga-r
9a290fdfc9 fix: validate uom is integer for PR item 2024-04-17 22:09:28 +05:30
Raffael Meyer
34fd290edb fix: don't attempt to set gender from salutation (#40997) 2024-04-17 17:26:08 +02:00
s-aga-r
244d62df70 Merge pull request #41061 from s-aga-r/FIX-13339
fix: do not add qty to supplied items
2024-04-17 16:33:38 +05:30
s-aga-r
8233c392fb fix: do not add qty to supplied items 2024-04-17 16:15:37 +05:30
rohitwaghchaure
e36f6453d5 Merge pull request #41053 from rohitwaghchaure/fixed-duplicate-serial-batch-in-stock-entry
fix: duplicate serial and batch bundle in stock entry and stock reco
2024-04-17 13:18:48 +05:30
Rohit Waghchaure
732b6e1417 fix: duplicate serial and batch bundle in stock entry and stock reco 2024-04-17 13:00:49 +05:30
Deepesh Garg
7ce6687b68 Merge pull request #40962 from deepeshgarg007/allow_on_submit_ad_v1
fix: Allow updating cost center and project for repostable doctypes
2024-04-17 11:21:50 +05:30
ruthra kumar
96d96bb500 Merge pull request #41047 from ruthra-kumar/incorrect_use_of_wildcard
fix: possible wildcard issue on variable name
2024-04-17 11:04:32 +05:30
ruthra kumar
5357b9e727 fix: possible wildcard issue on variable name 2024-04-17 10:46:00 +05:30
rohitwaghchaure
5b1493b56c fix: not able to submit subcontracting receipt (#41041) 2024-04-17 00:22:09 +05:30
Nihantra Patel
2896e3666c fix: address filter and quotation to for prospect 2024-04-16 18:13:49 +05:30
Nihantra Patel
24a68a79df fix: address filter and quotation to for prospect 2024-04-16 18:12:20 +05:30
Nihantra Patel
fe5b88522e fix: address filter and quotation to for prospect 2024-04-16 18:06:42 +05:30
rohitwaghchaure
d69a18b826 fix: Delayed Order Report not working (#41037) 2024-04-16 17:14:59 +05:30
ruthra kumar
42a5e61ac3 Merge pull request #40373 from Nihantra-Patel/fix_mutiple_address_so
fix: get address if multiple companies
2024-04-16 16:30:17 +05:30
rohitwaghchaure
03231e99ef fix: expense account set as COGS for stock entry Material Issue (#41026) 2024-04-16 13:55:35 +05:30
RitvikSardana
85c63f29c0 Merge pull request #41025 from RitvikSardana/develop-ritvik-remove-customer-check
fix: remove validate_name_in_customer function
2024-04-16 12:44:47 +05:30
RitvikSardana
2b32d3644f fix: remove validate_name_in_customer function 2024-04-16 12:20:16 +05:30
ruthra kumar
9445bd410c Merge pull request #41020 from ruthra-kumar/fix_incorrect_exc_gain_loss_for_pe_against_journals
fix: incorrect exc gain/loss for PE against JE for payable accounts
2024-04-16 10:58:49 +05:30
ruthra kumar
8821c98625 test: exc gain/loss journals booking in Payable accounts 2024-04-16 10:41:54 +05:30
ruthra kumar
81b574053f fix: incorrect exc gain/loss for PE against JE for payable accounts 2024-04-16 10:41:52 +05:30
Deepesh Garg
67a8f50711 Merge pull request #40812 from deepeshgarg007/multi_pr_pi
fix: Multiple partial payment requests against Purchase Invoice
2024-04-15 21:50:11 +05:30
Deepesh Garg
071e5ed648 fix: Test case 2024-04-15 20:49:40 +05:30
Deepesh Garg
b9243569ca Merge branch 'develop' of https://github.com/frappe/erpnext into multi_pr_pi 2024-04-15 19:58:48 +05:30
Nihantra Patel
098b62f0f6 fix: inspection type when create a qc from dc 2024-04-15 17:46:21 +05:30
Nabin Hait
760e341cd0 Merge pull request #40858 from nabinhait/quote-so-delivery-date
fix: Don't set delivery date as today while making SO from Quotation
2024-04-15 12:31:06 +05:30
Gursheen Anand
9a12376e29 refactor: show list for expense breakup 2024-04-14 17:06:01 +05:30
Gursheen Anand
59292a09c4 feat: show expense breakup 2024-04-14 17:03:22 +05:30
rohitwaghchaure
2d82631509 Merge pull request #40993 from rohitwaghchaure/fixed-get_link_to_form-for-SABB
fix: get_link_to_form for serial and batch bundle
2024-04-13 15:27:34 +05:30
Rohit Waghchaure
18ca953d5a fix: get_link_to_form for serial and batch bundle 2024-04-13 15:01:42 +05:30
rohitwaghchaure
a6ed77d378 Merge pull request #40986 from rohitwaghchaure/fixed-validation-to-check-type-of-transaction
fix: type of transaction validation for the stock entry
2024-04-13 14:33:15 +05:30
Rohit Waghchaure
8ad0295f1b fix: type of transaction validation for the stock entry 2024-04-13 13:38:33 +05:30
Deepesh Garg
8d94238db8 Merge pull request #40985 from ruthra-kumar/add_payment_request_to_dimension_list
fix: Add payment request to dimension list
2024-04-13 10:21:11 +05:30
ruthra kumar
3f8d785f02 chore: patch to setup exiting dimensions in Payment Request 2024-04-12 17:23:54 +05:30
ruthra kumar
e93b4a1f2c refactor: add payment request to dimension list 2024-04-12 16:51:11 +05:30
rohitwaghchaure
65bddd2930 Merge pull request #40975 from rohitwaghchaure/fixed-donot-validate-for-lcv
fix: do not validate batch qty for LCV
2024-04-12 14:04:11 +05:30
Rohit Waghchaure
baf0c83cc5 fix: do not validate batch qty for LCV 2024-04-12 13:29:45 +05:30
s-aga-r
bb46f2d8fb Merge pull request #40707 from s-aga-r/FIX-12241
fix(ux): Sales Order Stock Reservation Dialog
2024-04-12 13:20:28 +05:30
rohitwaghchaure
b04d0dfe70 Merge pull request #40773 from s-aga-r/FIX-12181
fix: Subcontracting Receipt GL Entries
2024-04-12 13:14:31 +05:30
ruthra kumar
140fdd4a7e Merge pull request #40973 from ruthra-kumar/fix_link_error_on_dunning_cancellation
fix: Link Validation Error on Dunning cancellation
2024-04-12 10:26:37 +05:30
ruthra kumar
205fd9888c fix: Link Validation Error on Dunning cancellation 2024-04-12 09:26:46 +05:30
rohitwaghchaure
773b63c691 Merge pull request #40967 from rohitwaghchaure/fixed-13250
fix: zero division error
2024-04-11 17:54:23 +05:30
rohitwaghchaure
fac69d852c Merge pull request #40966 from rohitwaghchaure/fixed-legacy-purchase-receipt-landed-cost-issue-13215
fix: landed cost voucher for legacy pr with batch
2024-04-11 17:41:38 +05:30
Rohit Waghchaure
f9e230e758 fix: zero division error 2024-04-11 17:35:06 +05:30
Rohit Waghchaure
fa91cda46c fix: landed cost voucher for legacy pr with batch 2024-04-11 16:49:01 +05:30
Deepesh Garg
c3845ac0f1 fix: Allow updating cost center and project for repostable doctypes 2024-04-11 11:30:56 +05:30
Nabin Hait
fc835ed6b1 Merge pull request #40920 from nabinhait/pe-fetch-reference-docs-amounts
fix: Fetch correct outstanding and total amount for reference journal entry
2024-04-11 11:04:05 +05:30
Nabin Hait
65c74fa3c7 fix: test cases 2024-04-11 11:01:28 +05:30
Nabin Hait
a70f3ef873 Merge pull request #40861 from nabinhait/default-bank-account
fix: Get default party bank account and company bank account for a party
2024-04-11 10:53:49 +05:30
Nabin Hait
6810227be0 Merge pull request #40886 from nabinhait/permission-issue
fix: Ignore permissions while fetching module settings properties
2024-04-11 10:53:22 +05:30
Nabin Hait
9aa361fe1f Merge pull request #40916 from nabinhait/existing-depr-schedule-check
fix: check if there is any existing depreciation schedule
2024-04-11 10:52:43 +05:30
Deepesh Garg
51baa95ad2 Merge pull request #40924 from khushi8112/indicate-correct-currency-code-for-the-payment
Fix: Indicate correct currency code for the payment
2024-04-10 22:22:28 +05:30
Deepesh Garg
f3ec4f1964 chore: remove unwanted changes 2024-04-10 22:06:03 +05:30
Deepesh Garg
b558a4c871 Merge pull request #40940 from Nihantra-Patel/fix_debit_creation_dev
fix: creation of return/debit note from purchase invoice
2024-04-10 21:39:08 +05:30
Deepesh Garg
eb241d0a86 Merge pull request #40941 from Nihantra-Patel/fix_credit_note_creation_dev
fix: creation of return/credit note from sales invoice
2024-04-10 21:38:57 +05:30
Deepesh Garg
8c0ea11f33 Merge pull request #40833 from HarryPaulo/fix-total-payment-decimal
fix: wrong value for total amount in payments
2024-04-10 21:26:00 +05:30
Deepesh Garg
165641e495 Merge pull request #40917 from frappe/l10n_develop
fix: sync translations from crowdin
2024-04-10 21:24:53 +05:30
Deepesh Garg
455565412f Merge pull request #40863 from nabinhait/gl-amount-in-transaction-currency
fix: Show amount in transaction currency in general ledger report
2024-04-10 20:54:01 +05:30
Deepesh Garg
6ab3527987 Merge pull request #40911 from nabinhait/itemised-tds-breakup
fix: Show itemised TDS breakup based on Apply TDS checkbox on item level
2024-04-10 20:51:33 +05:30
Deepesh Garg
c8ae124436 Merge pull request #40931 from cogk/fix-dont-call-get_fiscal_year-before-setup-is-done
fix: Don't call get_fiscal_year if setup is not done yet
2024-04-10 20:45:27 +05:30
Deepesh Garg
3e216e2f95 Merge pull request #40844 from HarryPaulo/notify-update-for-doc
fix: notify update when update outstanding amount
2024-04-10 20:43:49 +05:30
Deepesh Garg
20f20db179 Merge pull request #40849 from deepeshgarg007/transaction_currency_values
fix: Values in transaction currency
2024-04-10 20:42:08 +05:30
Nihantra C. Patel
78bef654ed fix: creation of return/credit note from sales invoice 2024-04-10 15:02:18 +05:30
Nihantra C. Patel
71f3883613 fix: creation of return/debit note from sales invoice prettier 2024-04-10 14:43:38 +05:30
Nihantra C. Patel
dd10087db6 fix: creation of return/debit note from sales invoice 2024-04-10 14:36:58 +05:30
Frappe PR Bot
6b8de22210 fix: Bosnian translations 2024-04-10 14:10:26 +05:30
Frappe PR Bot
2a3a35315b fix: Persian translations 2024-04-10 14:10:21 +05:30
ruthra kumar
9905b9e4b0 Merge pull request #40936 from ruthra-kumar/ignore_dimension_validation_on_pl
fix: ignore dimension validation for cancelled entries
2024-04-10 13:57:29 +05:30
ruthra kumar
971c867f29 fix: ignore dimension validation for cancelled entries 2024-04-10 13:21:24 +05:30
Corentin Flr
c203fafb1b fix: Don't call get_fiscal_year if setup is not done yet 2024-04-09 15:01:09 +02:00
ruthra kumar
5446ed7642 Merge pull request #40695 from ruthra-kumar/ledger_health_monitor
feat: Periodically monitor ledger health
2024-04-09 17:52:55 +05:30
ruthra kumar
3c3009f086 Merge pull request #40926 from ruthra-kumar/incorrect_currency_symbol_on_general_ledger_print
fix: incorrect currency symbol in General Ledger print
2024-04-09 17:45:47 +05:30
ruthra kumar
429e036e8c fix: incorrect currency symbol in General Ledger print 2024-04-09 17:39:32 +05:30
ruthra kumar
24d37d22a3 chore: use super() instead of super(__class__, self) 2024-04-09 17:35:15 +05:30
“Khushi
549ea8a63c fix: indicate correct currency code for the payment 2024-04-09 17:06:56 +05:30
rohitwaghchaure
b5e017a626 Merge pull request #40909 from rohitwaghchaure/fixed-13083
fix: pick list validation didn't consider existing draft pick list
2024-04-09 16:53:39 +05:30
Rohit Waghchaure
3bce4d92f6 fix: pick list validation didn't consider existing draft pick list 2024-04-09 15:36:21 +05:30
Nabin Hait
f331f9b15c fix: Fetch outstanding and total amount for reference journal entry 2024-04-09 15:25:36 +05:30
Khushi Rawat
5f7e06ba6f Merge branch 'develop' into company-field-should-be-fetch-from-parent-acc 2024-04-09 14:36:04 +05:30
Frappe PR Bot
0ade33dd1a fix: Bosnian translations 2024-04-09 13:19:31 +05:30
Frappe PR Bot
9f3a1567b5 fix: Esperanto translations 2024-04-09 13:19:28 +05:30
Frappe PR Bot
cf806fb2d4 fix: Turkish translations 2024-04-09 13:19:24 +05:30
Frappe PR Bot
680dfbfd2b fix: Arabic translations 2024-04-09 13:19:20 +05:30
Frappe PR Bot
6e2475a266 fix: French translations 2024-04-09 13:19:17 +05:30
Frappe PR Bot
f127c33acc fix: Persian translations 2024-04-09 13:19:12 +05:30
Frappe PR Bot
f529386b20 fix: Spanish translations 2024-04-09 13:19:09 +05:30
Frappe PR Bot
fd6195f8cd fix: German translations 2024-04-09 13:19:05 +05:30
Nabin Hait
433c8c450c fix: check if there is any existing depreciation schedule 2024-04-09 11:26:03 +05:30
ruthra kumar
dc79213bb3 chore: make ledger health doctype read_only 2024-04-09 11:18:53 +05:30
ruthra kumar
4776d660b5 test: ledger monitoring function 2024-04-09 11:18:49 +05:30
“Khushi
d791fa7460 fix: by default company field value is fetched from parent account 2024-04-09 11:18:33 +05:30
Raffael Meyer
10c5ed8a3c fix: make help items translatable (#40913) 2024-04-08 23:55:20 +00:00
Frappe PR Bot
b02d5a226c chore: update POT file (#40899) 2024-04-09 01:40:55 +02:00
Frappe PR Bot
6a8bd64c40 fix: sync translations from crowdin (#40772) 2024-04-09 01:40:28 +02:00
Nabin Hait
c66dde6318 fix: Show itemised TDS breakup based on Apply TDS checkbox on item level 2024-04-08 20:26:44 +05:30
Smit Vora
f7c9e1538b feat: new hook fields_for_group_similar_items to group additional fields for print formats (#40831) 2024-04-08 10:17:18 +00:00
ruthra kumar
503687a224 Merge pull request #40878 from ruthra-kumar/merge_taxes_from_DN_to_sales_invoice
refactor: merge taxes from delivery note to Sales Invoice
2024-04-08 14:37:44 +05:30
ruthra kumar
39a48a2e2a test: tax merging from 2 Delivery Note to Sales Invoice 2024-04-08 14:20:45 +05:30
ruthra kumar
286268567e Merge pull request #40876 from ruthra-kumar/fix_advance_against_reverse_advance_for_payable_types
fix: ledger entries for Payment against reverse payment reconciliation
2024-04-08 07:28:00 +05:30
Nabin Hait
219d5a5e8b Merge pull request #40900 from nabinhait/pro-rata-calc-fix
fix: pro-rata amount for straight line method
2024-04-07 15:37:42 +05:30
Nabin Hait
46a2d3cad9 fix: pro-rata amount for straight line method 2024-04-07 15:20:50 +05:30
rohitwaghchaure
4ded8ca07b Merge pull request #40827 from Nihantra-Patel/fix_po_quot_cre
fix: purchase order and quotation creation
2024-04-07 14:36:35 +05:30
rohitwaghchaure
3f6dcfe0a2 Merge pull request #40883 from rohitwaghchaure/fixed-13004
fix: incorrect operator causing incorrect validation
2024-04-07 12:03:03 +05:30
Nabin Hait
a180c502f9 Merge pull request #40698 from nabinhait/pro-rata-fix
fix: Get pro-rata amount based on correct days
2024-04-07 12:01:25 +05:30
rohitwaghchaure
c4ffeedffb Merge pull request #40887 from rohitwaghchaure/fixed-12539
fix: query_report.trigger_refresh is not a function
2024-04-07 11:56:38 +05:30
Rohit Waghchaure
30bbb58ca1 fix: query_report.trigger_refresh is not a function 2024-04-07 11:48:07 +05:30
Rohit Waghchaure
6b317b0c0d fix: incorrect operator causing incorrect validation 2024-04-07 11:43:55 +05:30
Nabin Hait
f61faa85a1 fix: Ignore permissions while fetching module settings properties 2024-04-07 11:33:40 +05:30
Dany Robert
01888c98bc fix: expense causing p&l test case to fail 2024-04-06 06:13:42 +00:00
Dany Robert
581af4eced chore: semgrep 2024-04-05 18:16:26 +00:00
Dany Robert
7ef4dbcaf6 fix: test case for zero deferred expense 2024-04-05 17:59:48 +00:00
ruthra kumar
550cbbd91c refactor: merge taxes from delivery note to Sales Invoice 2024-04-05 16:22:55 +05:30
ruthra kumar
64b7f624a5 refactor(test): include new fields in assertion 2024-04-05 15:31:57 +05:30
ruthra kumar
141f462368 test: advance payment against reverse payment reconciliation 2024-04-05 14:34:36 +05:30
ruthra kumar
248cc6105b test: reverse payment against payment for supplier 2024-04-05 14:06:11 +05:30
ruthra kumar
74bc38e0af fix(test): for reverse payments, only advance acc should have effect
This applies for Payments against Reverse-Payment reconcilition
2024-04-05 11:08:12 +05:30
ruthra kumar
bdd36b0001 refactor: supplementary field to better handle reverse payments 2024-04-05 10:58:02 +05:30
ruthra kumar
9fd2dddfde fix: invalid ledger entries on payment against reverse payments
On Advance payments booked on separate party account, reconciliation
against a reverse payment posted invalid ledger entries.
2024-04-05 10:39:16 +05:30
ruthra kumar
a75e095d00 fix(test): Advance Received should be under liability account 2024-04-05 10:39:16 +05:30
ruthra kumar
8b9079d62e Merge pull request #40856 from ruthra-kumar/better_approach_for_exc_rate_updating
fix: unwanted Exc Gain/Loss journals on Payment against Journal entry
2024-04-05 10:32:10 +05:30
s-aga-r
9808ae92a4 fix: Subcontracting Receipt GL Entries 2024-04-05 09:53:23 +05:30
Dany Robert
5c9ce575f6 fix: missing def expense if no exp in first month 2024-04-04 16:18:20 +00:00
ruthra kumar
fe84558b77 test: payment against JE reconciliation with different rates 2024-04-04 20:41:27 +05:30
ruthra kumar
c15690e475 fix: use reference type name to update exc rate 2024-04-04 20:41:24 +05:30
Nabin Hait
be0cb5289f fix:linter issue 2024-04-04 20:11:09 +05:30
Nabin Hait
d868122f12 fix: Show amount in transaction currency in general ledger report 2024-04-04 19:58:17 +05:30
Nabin Hait
68b076cb61 Merge branch 'develop' into pro-rata-fix 2024-04-04 18:19:33 +05:30
Nabin Hait
f87be1d96e fix: Get default party bank account and company bank account for a party 2024-04-04 16:54:42 +05:30
rohitwaghchaure
1816f1d5f0 Merge pull request #40848 from rohitwaghchaure/fixed-12763
fix: group warehouse added in the stock reconciliation
2024-04-04 15:38:58 +05:30
Nabin Hait
fec20decc1 fix: Don't set delivery date as today while making SO from Quotation 2024-04-04 15:25:46 +05:30
Rohit Waghchaure
8f53bc0096 fix: group warehouse added in the stock reconciliation 2024-04-04 15:01:06 +05:30
rohitwaghchaure
ea1b66931a Merge pull request #40852 from Nihantra-Patel/fix_workstation_refresh
fix: workstation refresh after prompt
2024-04-04 11:50:24 +05:30
Nihantra C. Patel
bed1af26e3 fix: workstation refresh after prompt 2024-04-04 10:58:36 +05:30
Deepesh Garg
a3c9fd6567 fix: Values in transaciton currency 2024-04-03 17:28:24 +05:30
ruthra kumar
7d22df2af5 Merge pull request #40643 from blaggacao/fix/adv-pay-status
fix(pr): set adv. pay. status base on PR stati
2024-04-03 15:05:25 +05:30
David
46e12e0981 chore: smaller loop; less indirection 2024-04-03 02:23:37 +02:00
David
b4c815b804 test: differentiate progressing and non progressing flows 2024-04-03 02:23:36 +02:00
David
a8cd850bb6 test: patch payments app interface 2024-04-03 02:23:36 +02:00
David
ec675ea3d8 fix(pr): set adv. pay. status base on pr stati 2024-04-03 02:09:56 +02:00
David
c9c6211009 test: trigger so to invoice flow (fails) 2024-04-03 02:09:56 +02:00
HarryPaulo
198b90eb01 fix: notify update when update outstanding amount - Linters 2024-04-02 18:50:51 -03:00
HarryPaulo
f67f163e7d fix: notify update when update outstanding amount 2024-04-02 18:42:30 -03:00
David
c705a393fe fix(pr): set adv. pay. status for po (still fails; differently) 2024-04-02 20:15:48 +02:00
David
bcdfbee23e test: correctly trigger po payment request ["Outward"] (fails) 2024-04-02 19:36:13 +02:00
David
3228841e68 fix: individual accounting tests
without this no 'run-tests' during development can be run
as soon as payment requests are involved
2024-04-02 19:36:13 +02:00
rohitwaghchaure
c3b2ed57f6 Merge pull request #40723 from rohitwaghchaure/fixed-allow-to-manually-pick-batches
feat: allow to pick manually qty / batches / serial nos
2024-04-02 22:13:50 +05:30
Rohit Waghchaure
50dd9fa8a3 feat: allow to pick manually qty / batches / serial nos 2024-04-02 21:08:04 +05:30
Raffael Meyer
f3bcdbe5bd fix: translatable web footer (#40834) 2024-04-02 15:14:38 +00:00
Nabin Hait
e8dcbe2625 fix: depr amount pro rata and related tests 2024-04-02 18:28:40 +05:30
HarryPaulo
bf88b8eb65 fix: wrong value for total amount in payments 2024-04-02 09:50:30 -03:00
rohitwaghchaure
1e4b920fd2 Merge pull request #40828 from rohitwaghchaure/chore-removed-manual-option-from-bom
chore: remove rate of material based on Manual
2024-04-02 18:10:32 +05:30
Rohit Waghchaure
0b63dbf221 chore: remove rate of material based on Manual 2024-04-02 16:32:03 +05:30
Nihantra C. Patel
7768544226 fix: purchase order and quotation creation upd 2024-04-02 16:18:19 +05:30
Nihantra C. Patel
7acbfc06a0 fix: purchase order and quotation creation 2024-04-02 16:15:27 +05:30
Nihantra C. Patel
f2b96869aa fix: purchase order and quotation creation 2024-04-02 16:06:38 +05:30
Nabin Hait
5281553b61 Merge pull request #40584 from nabinhait/fixed-asset-register-currency
fix: show currency symbol in base currency in fixed asset register report
2024-04-02 15:56:10 +05:30
Nabin Hait
21a40a2236 fix: linter issues 2024-04-02 15:35:06 +05:30
rohitwaghchaure
4c8dfb2e6a Merge pull request #40816 from rohitwaghchaure/fixed-12159
fix: added validation if parent id is missing in BOM Creator
2024-04-02 15:11:56 +05:30
rohitwaghchaure
271fea69b8 Merge pull request #40814 from rohitwaghchaure/fixed-barcode-not-fetch-on-stock-entry
fix: barcode not fetched on selection of item
2024-04-02 11:21:07 +05:30
Rohit Waghchaure
0a1fab762f fix: added validation if parent id is missing in BOM Creator 2024-04-02 11:19:31 +05:30
Rohit Waghchaure
b0730293e2 fix: barcode not fetched on selection of item 2024-04-02 10:39:48 +05:30
rohitwaghchaure
15c3f09898 Merge pull request #40720 from mmdanny89/warehouse-pos
Set default warehouse for pos invoice
2024-04-01 22:37:27 +05:30
Deepesh Garg
45d5f6e00a fix: Multiple partial payment requests against Purchase Invoice 2024-04-01 21:21:46 +05:30
Deepesh Garg
edf51c9ab9 Merge pull request #40797 from deepeshgarg007/po_filter
fix: Party type in Payment Order
2024-04-01 20:38:33 +05:30
Deepesh Garg
6416a6ad94 Merge pull request #40796 from deepeshgarg007/pe_default_company_bank_account
fix: Default company bank account
2024-04-01 20:38:17 +05:30
Deepesh Garg
4f8990602e Merge pull request #40770 from deepeshgarg007/so_commission_update
fix: Recalculate sales commission on item update
2024-04-01 20:37:57 +05:30
Deepesh Garg
81cf970883 Merge pull request #40755 from deepeshgarg007/employee_payment_entry_receive
fix: Receive payment entry from Employee
2024-04-01 20:37:40 +05:30
rohitwaghchaure
4c79d92faa Merge pull request #40735 from rohitwaghchaure/fixed-stock-balance-report
fix: Show Stock Ageing Data filter not working in stock balance report
2024-04-01 16:54:12 +05:30
Rohit Waghchaure
621421bda2 fix: Show Stock Ageing Data filter not working in stock balance report 2024-04-01 16:19:21 +05:30
ruthra kumar
2dd07d9292 Merge pull request #40790 from frappe/pot_develop_2024-03-31
chore: update POT file
2024-04-01 15:49:06 +05:30
ruthra kumar
d2b96b415c Merge pull request #40181 from pps190/fix-show-future-payments
fix: show future payments consider allocated sales returns
2024-04-01 13:03:23 +05:30
Deepesh Garg
91fa41c9ec fix: Party type in Payment Order 2024-03-31 20:08:39 +05:30
Deepesh Garg
7ac91deb83 fix: Default company bank account 2024-03-31 19:48:40 +05:30
Deepesh Garg
b542f21eea Merge pull request #40714 from khushi8112/general_ledger_report_voucher_no
fix: voucher no. is link field for non english user interface
2024-03-31 19:23:01 +05:30
frappe-pr-bot
6283ff5d52 chore: update POT file 2024-03-31 09:35:24 +00:00
rohitwaghchaure
9bacf53f04 Merge pull request #40786 from rtdany10/gp-wh-issue
fix(gp): SLEs not fetched for correct warehouse
2024-03-31 11:45:49 +05:30
rohitwaghchaure
4f91effca9 Merge pull request #40778 from blaggacao/chore/into-child-mapper
chore(stock): use the into child mapper mapper frappe/frappe#22592
2024-03-31 11:43:56 +05:30
Dany Robert
f958e8be06 fix(gp): SLEs not fetched for correct warehouse 2024-03-30 16:32:43 +05:30
rohitwaghchaure
3231ee4d9d Merge pull request #40783 from rohitwaghchaure/fixed-provision-to-add-serial-batch-bundle-in-subcontracting-receipt
fix: button to select serial / batch bundle in the subcontracting receipt
2024-03-30 11:23:20 +05:30
Rohit Waghchaure
d73b1f3e6a fix: button to select serial / batch bundle in the subcontracting receipt 2024-03-30 10:46:56 +05:30
jeshani
679aea607b fix: Warehouse linked company name in multicompany setup (#40779) 2024-03-30 10:16:22 +05:30
David Arnold
28c75b8f4d chore(stock): use the into child mapper mapper frappe/frappe#22592 2024-03-29 23:28:33 +01:00
Deepesh Garg
2a8a404c69 Merge branch 'develop' of https://github.com/frappe/erpnext into so_commission_update 2024-03-29 18:02:53 +05:30
Deepesh Garg
f76da50b7e fix: Recalculate sales commission on item update 2024-03-29 17:57:58 +05:30
Gursheen Anand
af26ac96e9 fix: do not add actual expense twice for validating budget 2024-03-29 17:22:48 +05:30
rohitwaghchaure
8e522183bc Merge pull request #40758 from ashish-greycube/patch-12
fix: payment_order_status should be no_copy
2024-03-29 13:25:13 +05:30
ruthra kumar
66a06ca1a5 Merge pull request #40760 from ruthra-kumar/fix_cost_center_update_in_gain_loss_journal
fix: cost center shouldn't update debit/credit in Exc gain/loss JV
2024-03-29 11:42:44 +05:30
rohitwaghchaure
a3fbeff333 Merge pull request #40757 from rohitwaghchaure/fixed-validation-message
chore: show item name in the validation message
2024-03-29 11:35:07 +05:30
ruthra kumar
398d3022ef fix: cost center shouldn't update debit/credit in Exc gain/loss JV 2024-03-29 11:32:34 +05:30
Rohit Waghchaure
d05412f96a chore: show item name in the validation message 2024-03-29 10:53:04 +05:30
Ashish Shah
adee2ba541 fix: payment_order_status should be no_copy
payment_order_status should be no_copy
2024-03-29 10:52:52 +05:30
rohitwaghchaure
ce2b9de9be Merge pull request #40752 from rohitwaghchaure/provision-to-override-batch-dialog
chore: allow to override serial batch selector using custom app
2024-03-29 09:10:36 +05:30
Deepesh Garg
29e5c6807e fix: Receive payment entry from Employee 2024-03-29 09:05:35 +05:30
Frappe PR Bot
10bf6529ef fix: sync translations from crowdin (#40717)
Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
2024-03-28 17:16:11 +01:00
Raffael Meyer
2e15b224aa Merge pull request #40749 from barredterra/crowdin-config 2024-03-28 14:31:51 +01:00
barredterra
e5f87ef8da chore: copy crowdin config from frappe 2024-03-28 14:14:50 +01:00
Raffael Meyer
a2961a427d Merge pull request #40725 from barredterra/in-context-translation 2024-03-28 14:11:54 +01:00
Deepesh Garg
fe1290a89a Merge pull request #40734 from deepeshgarg007/trend_report_filters
fix: Filters in trend reports
2024-03-28 18:16:14 +05:30
rohitwaghchaure
e04cad3368 Merge pull request #40741 from rohitwaghchaure/fixed-sales-purchase-return-validation-issue
fix: sales / purchase return validation issue
2024-03-28 17:52:55 +05:30
ruthra kumar
139c18f2cc Merge pull request #40739 from ruthra-kumar/use_sql_to_clear_comments_and_communications
refactor: use sql to clear comments
2024-03-28 17:40:54 +05:30
Rohit Waghchaure
59dc4a96e1 fix: sales / prchase return validation issue 2024-03-28 16:45:09 +05:30
ruthra kumar
1f46c1530e refactor: use sql to clear comments 2024-03-28 13:56:20 +05:30
Deepesh Garg
5a151189ad Merge pull request #40731 from Nihantra-Patel/fix_tax_format
fix: markdown to text editor set for supplier quotation
2024-03-28 12:44:45 +05:30
Deepesh Garg
c15a320940 chore: remove hardcoded FY 2024-03-28 12:25:42 +05:30
Deepesh Garg
87324c7349 fix: Filters in trend reports 2024-03-28 12:07:49 +05:30
rohitwaghchaure
4d41516abb Merge pull request #40713 from rohitwaghchaure/fixed-12091
fix: enable list view for the issues on the portal
2024-03-28 11:07:07 +05:30
Nihantra Patel
9828d34b19 fix: markdown to text editor set for supplier quotation 2024-03-28 10:30:13 +05:30
ruthra kumar
6b2f745afe Merge pull request #40719 from frappe/fix-ruff-qb-formatting
fix: exclude some query builder lines from ruff rules
2024-03-28 09:48:05 +05:30
ruthra kumar
eee86d2e4b fix: use 'eq' and isnull() on qb conditions 2024-03-28 09:18:33 +05:30
barredterra
04c91e263d chore: add crowin identifiers for in-context translation 2024-03-27 19:31:19 +01:00
rohitwaghchaure
9709a18ef5 Merge pull request #40718 from rohitwaghchaure/fixed-do-not-fetch-recived-items-12005
fix: do not fetch received items in purchase receipt
2024-03-27 22:40:18 +05:30
Danny
b156937254 fix: set default warehouse for pos invoice 2024-03-27 12:41:58 -04:00
Akhil Narang
ac69513f60 fix: exclude some query builder lines from ruff rules
`== None` and `== True` are intentional here

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-27 21:51:09 +05:30
Rohit Waghchaure
5bff434902 fix: do not fetch received items in purchase receipt 2024-03-27 20:05:27 +05:30
“Khushi
db1f7fcf63 fix: fixed incorrect cash flow data in finacial statement report 2024-03-27 16:48:49 +05:30
“Khushi
2b8928cae6 fix: voucher no. is link field for non english user interface 2024-03-27 16:25:13 +05:30
Akhil Narang
a4dd1c2bf6 Merge pull request #40681 from barredterra/ruff
chore: switch to ruff for python formatting/linting
2024-03-27 16:23:00 +05:30
Rohit Waghchaure
bddc1e3974 fix: enable list view for the issues on the portal 2024-03-27 16:17:22 +05:30
Akhil Narang
89b5e061af ci: sync up action versions with framework
Fixup some tests for py312

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-27 16:06:04 +05:30
Akhil Narang
54cd492217 chore: update list of revisions for git blame to ignore
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-27 16:06:04 +05:30
Akhil Narang
f63396ef47 fix(treewide): manual ruff fixes
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-27 16:06:04 +05:30
Akhil Narang
3effaf21ef refactor(treewide): formatting and ruff fixes, + manually enabled F401
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-27 16:06:04 +05:30
barredterra
8afb7790de chore: switch to ruff for python formatting/linting 2024-03-27 16:06:04 +05:30
rohitwaghchaure
8c7213ad7d Merge pull request #40708 from rohitwaghchaure/fixed-priority-has-not-copied-11942
fix: Priority not copied from project template
2024-03-27 15:43:30 +05:30
Rohit Waghchaure
33fd7b8a1f fix: Priority not copied from project template 2024-03-27 15:13:51 +05:30
s-aga-r
5daf19da40 fix(ux): Sales Order Stock Reservation Dialog 2024-03-27 14:52:05 +05:30
ruthra kumar
19e054c7a7 Merge pull request #40706 from ruthra-kumar/typeerror_in_purchase_order
fix: typeerror on Purchase Order form UI
2024-03-27 14:38:49 +05:30
ruthra kumar
57f67faba1 fix: typeerror on Purchase Order form UI 2024-03-27 14:28:37 +05:30
Ankush Menat
c2470ccc70 refactor: usage of modified ordering (#40705)
Audited some important code:
- general_ledger.py
- stock_ledger.py
2024-03-27 08:48:01 +00:00
Ankush Menat
dfde490c02 refactor!: switch to creation sort (#40699) 2024-03-27 13:45:34 +05:30
rohitwaghchaure
95dcb75e93 Merge pull request #40700 from rohitwaghchaure/fixed-rate-changing-on-qty-change-11659
fix: rate changed on changing of the qty
2024-03-27 13:36:22 +05:30
Rohit Waghchaure
cd36a1051f fix: rate changed on changing of the qty 2024-03-27 13:29:22 +05:30
Nabin Hait
6c1e9fab27 fix: Get pro-rata amount based on correct days 2024-03-27 12:24:20 +05:30
Rohit Waghchaure
0d9d42ae61 chore: allow to override serial batch selector 2024-03-27 11:52:06 +05:30
Deepesh Garg
1b0f95088a Merge pull request #40641 from deepeshgarg007/cur_frm_reduce
chore: Reduce usage of cur_frm
2024-03-27 11:45:26 +05:30
ruthra kumar
f96cf111ed chore: schedule job to run daily 2024-03-27 10:33:54 +05:30
ruthra kumar
1a43ed763b chore: permission and UI changes 2024-03-27 10:14:29 +05:30
ruthra kumar
00eeacd06a refactor: only run checks on specified companies 2024-03-27 10:10:55 +05:30
ruthra kumar
704925549b refactor: make health check configurable for companies 2024-03-27 10:08:17 +05:30
ruthra kumar
a42482ce35 refactor: control monitoring through settings page 2024-03-27 10:01:50 +05:30
ruthra kumar
b2fb7843d1 chore: settings page for health monitor 2024-03-27 09:53:27 +05:30
Raffael Meyer
652b4e5dcd Merge pull request #40663 from barredterra/uom-data 2024-03-27 00:28:21 +01:00
Frappe PR Bot
edced3fd21 fix: sync translations from crowdin (#40683) 2024-03-27 00:25:03 +01:00
“Khushi
f189be501b fix: default accounting dimension in journal entry child table 2024-03-27 00:08:39 +05:30
ruthra kumar
8c8d9be810 refactor: barebones method to run checks 2024-03-26 20:04:43 +05:30
ruthra kumar
d620b9eae8 refactor: flag for general and payment ledger mismatch 2024-03-26 20:04:43 +05:30
rohitwaghchaure
533627df3b Merge pull request #40685 from rohitwaghchaure/fixed-incorrect-validation-11901
fix: validation error for the subcontracting receipt
2024-03-26 19:54:55 +05:30
Rohit Waghchaure
016585c248 fix: validation error for the subcontracting receipt 2024-03-26 19:33:48 +05:30
rohitwaghchaure
683da71c5e Merge pull request #40684 from rohitwaghchaure/fixed-incorrect-total-qty
fix: incorrect total qty in job card
2024-03-26 19:32:04 +05:30
Rohit Waghchaure
c3546cf8e2 fix: incorrect total qty in job card 2024-03-26 18:16:37 +05:30
ruthra kumar
402ffc6d27 refactor: date on which vouchers was reported 2024-03-26 17:57:04 +05:30
ruthra kumar
9ed74dd8cc feat: ledger health doctype 2024-03-26 17:53:47 +05:30
rohitwaghchaure
2e30dda0cd Merge pull request #40674 from rohitwaghchaure/fixed-batch-queries-in-popup
fix: existing batch from different warehouse not showing in the dropdown
2024-03-26 16:04:14 +05:30
Rohit Waghchaure
662cf21afb fix: existing batch from different warehouse not showing in the dropdown 2024-03-26 14:31:18 +05:30
Nabin Hait
8b6220efd8 fix: show currency symbol in base currency in fixed asset register report 2024-03-26 12:54:50 +05:30
rohitwaghchaure
b3e163e9d8 Merge pull request #40672 from rohitwaghchaure/fixed-item-issue-11972
fix: item not coming in quick entry
2024-03-26 11:42:33 +05:30
Rohit Waghchaure
dcbb54c41f fix: item not coming in quick entry 2024-03-26 11:38:09 +05:30
ruthra kumar
064127935b Merge pull request #40634 from wojosc/patch-42
refactor: better pop up message for Internal Customer validation
2024-03-26 09:47:45 +05:30
Frappe PR Bot
5ed13fa913 chore: sync translations from crowdin (#40343)
chore: sync translations from crowdin
2024-03-26 09:06:11 +05:30
Deepesh Garg
d0e654528b Merge pull request #40431 from FHenry/dev_fix_opportunity_type_translatable
fix: Opportunity Type Doctype must be translatable
2024-03-26 09:04:39 +05:30
Raffael Meyer
1be2df81c9 Merge pull request #40586 from barredterra/validate-item-price-uom 2024-03-25 23:27:18 +01:00
barredterra
4d4d88ec5f fix: use untranslated UOM as default 2024-03-25 23:19:27 +01:00
barredterra
b49d64de63 feat: add translatable string extractor for UOM names 2024-03-25 23:19:13 +01:00
barredterra
8fa5707911 refactor: create UOMs during setup 2024-03-25 23:18:36 +01:00
barredterra
34344a062e fix: translate uom names 2024-03-25 22:59:22 +01:00
barredterra
679204ecb8 chore: enhance uom data
- sort by uom_name
- add common_code and symbol
2024-03-25 22:55:46 +01:00
Raffael Meyer
f20c54a6c1 Merge pull request #40593 from barredterra/uom-fields 2024-03-25 21:53:22 +01:00
Raffael Meyer
f316a29ba6 Merge pull request #40635 from frappe/pot_develop_2024-03-24 2024-03-25 21:41:07 +01:00
David Arnold
462204fc65 fix(Payment Entry): get contact details from existing contact (#40556) 2024-03-25 20:12:44 +01:00
Deepesh Garg
e04a3b107a Merge pull request #40627 from deepeshgarg007/da_code_cleanup
chore: Discount accounting code cleanup
2024-03-25 19:06:26 +05:30
Raffael Meyer
441969d7d6 Merge branch 'develop' into validate-item-price-uom 2024-03-25 14:25:54 +01:00
Deepesh Garg
7d7d10e422 Merge pull request #40577 from barredterra/one-item-price
perf: query one item price only
2024-03-25 17:22:49 +05:30
Deepesh Garg
12945341ce Merge pull request #40589 from barredterra/get_prices_as_dict
refactor: get prices as dict
2024-03-25 17:18:31 +05:30
Deepesh Garg
5ab9656e8f Merge pull request #40640 from deepeshgarg007/default_fb_pl
fix: Add default finance book check in P&L statement
2024-03-25 14:43:29 +05:30
Ankush Menat
e055147849 fix: address_display, text -> text editor (#40621)
* fix: address_display, text -> text editor

* fix: text -> text editor for shipping and dispatch_address
2024-03-25 05:46:16 +00:00
Wolfram Schmidt
b132892b25 refactor: better pop message for Internal Customer validation
-added more meaningful description to message when using "internal Customer" scenario
2024-03-25 09:35:32 +05:30
Deepesh Garg
e44809bcc9 chore: Reduce usage of cur_frm 2024-03-24 19:27:07 +05:30
Deepesh Garg
5be3417fdf fix: Add default finance book check in P&L statement 2024-03-24 19:02:38 +05:30
rohitwaghchaure
c89b0e37ab Merge pull request #40638 from rohitwaghchaure/fixed-40578
fix: Batch No is mandatory while making manufacture entry
2024-03-24 18:31:19 +05:30
Rohit Waghchaure
43fd60a877 fix: Batch No is mandatory while making manufacture entry 2024-03-24 17:44:37 +05:30
rohitwaghchaure
079cc8bd21 Merge pull request #40594 from rohitwaghchaure/fixed-serial-batch-bundle-scr
fix: use serial/batch fields for subcontracting receipt and in transit in stock entry
2024-03-24 16:03:46 +05:30
frappe-pr-bot
d47b87ba71 chore: update POT file 2024-03-24 09:35:26 +00:00
Deepesh Garg
ae31f2c5ad Merge pull request #40504 from khushi8112/selling-coupon-code
feat: Coupon code in sales invoice
2024-03-23 17:07:41 +05:30
Deepesh Garg
24e2672fde Merge branch 'develop' into selling-coupon-code 2024-03-23 14:42:47 +05:30
Deepesh Garg
aaa1df6a1f chore: Discount accounting code cleanup 2024-03-23 00:19:27 +05:30
Rohit Waghchaure
3423334e4f fix: use serial/batch fields for subcontracting receipt and in transit stock entry 2024-03-22 23:13:47 +05:30
ruthra kumar
b1a9b6d64a Merge pull request #40622 from ruthra-kumar/refactor_flag_update_patch
refactor: reset update_outstanding_for_self flag for old records
2024-03-22 20:22:14 +05:30
ruthra kumar
fdcdc8a56e refactor: hide on print formats 2024-03-22 17:50:51 +05:30
ruthra kumar
a88bf8419e refactor: reset flag for old records 2024-03-22 16:16:07 +05:30
rohitwaghchaure
6d603cc35f Merge pull request #40616 from rohitwaghchaure/fixed-rate-reset-to-zero-11988
fix: rate reset to zero
2024-03-22 15:19:54 +05:30
Rohit Waghchaure
6821baa850 fix: rate reset to zero 2024-03-22 15:03:38 +05:30
ruthra kumar
844ad405ff Merge pull request #40509 from blaggacao/fix/cutoff-date-implementation
fix: permissions sales user for selling settings
2024-03-22 10:13:58 +05:30
ruthra kumar
6940c2b0aa Merge pull request #40520 from blaggacao/fix/bulk-tx-log-permissions
fix: permissions during bulk transaction logs
2024-03-22 10:07:08 +05:30
ruthra kumar
f30e5eab11 fix: query 'Selling Settings' 2024-03-22 09:55:47 +05:30
ruthra kumar
4972f6b66f Merge pull request #40208 from barredterra/refactor-semgrep
refactor: reduce usage of `cur_frm`
2024-03-22 09:28:19 +05:30
Akhil Narang
1cd38c860a perf: add in some indexes (#40590)
`Sales Invoice Item.purchase_order`
`Delivery Note Item.purchase_order`

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
2024-03-22 08:47:03 +05:30
rohitwaghchaure
eb45a71997 Merge pull request #40595 from rohitwaghchaure/fixed-rate-not-fetch-from-item-price
fix: rate not fetching from the item price
2024-03-21 22:18:28 +05:30
ruthra kumar
2bd9c5b001 Merge pull request #40386 from rtdany10/gp-report-rate
fix: wrong buying amount if delivered and billed qty varies
2024-03-21 21:13:32 +05:30
Rohit Waghchaure
d893a465d7 fix: rate not fetching from the item price 2024-03-21 21:04:03 +05:30
ruthra kumar
ccb51ded95 test: buying amt calculation if DN and SI differ in qty 2024-03-21 20:57:52 +05:30
barredterra
4a49618cd7 feat(UOM): add common code, symbol and description 2024-03-21 15:49:45 +01:00
Raffael Meyer
9fcddc3378 Merge pull request #40587 from barredterra/validate-price-dates 2024-03-21 14:12:37 +01:00
barredterra
58b3ce6a19 refactor: get prices as dict 2024-03-21 13:48:05 +01:00
barredterra
cbcc47b5c4 refactor(Item Price): validate dates 2024-03-21 11:57:22 +01:00
barredterra
69824eff80 feat(Item Price): validate UOM 2024-03-21 11:52:10 +01:00
ruthra kumar
64f686d943 Merge pull request #40580 from ruthra-kumar/config_changes_in_transaction_deletion_record
refactor: config changes in Transaction Deletion Record
2024-03-21 10:45:54 +05:30
ruthra kumar
4ba67fb3ec refactor: config changes in Transaction Deletion Record 2024-03-21 10:29:56 +05:30
barredterra
be9fe7331a perf: query one item price only 2024-03-20 19:37:34 +01:00
Deepesh Garg
1714ac6587 Merge pull request #40572 from GursheenK/pcv-validate-only-valid-gles
fix: PCV validation for previous fiscal year
2024-03-20 20:55:08 +05:30
ruthra kumar
0a495bf65e Merge pull request #39717 from ruthra-kumar/redesign_transaction_deletion_record
refactor: Transaction Deletion record for large volumes
2024-03-20 19:41:39 +05:30
Gursheen Anand
a1d108c062 fix: validate gl for previous fiscal year 2024-03-20 18:45:04 +05:30
Deepesh Garg
986357428d Merge pull request #40563 from GursheenK/tax-breakup-table-docfield
fix: use `Text Editor` for rendering tax breakup table
2024-03-20 18:32:38 +05:30
Ankush Menat
967540da18 fix: style for tax breakup 2024-03-20 16:56:30 +05:30
rohitwaghchaure
e1ce7bfb11 Merge pull request #40545 from barredterra/bom-configurator-labels
fix: translatability of bom configurator labels
2024-03-20 16:18:22 +05:30
Gursheen Anand
1c63983873 fix: use Text Editor for rendering tax breakup table 2024-03-20 16:09:14 +05:30
ruthra kumar
02c522b7cd chore: fix linting issue in JS 2024-03-20 16:01:09 +05:30
ruthra kumar
81309576b0 refactor(test): test cases modified to handle new approach 2024-03-20 15:16:33 +05:30
ruthra kumar
a158b825d7 refactor: ability to process in single transaction 2024-03-20 15:12:26 +05:30
rohitwaghchaure
50bfb8eaa9 Merge pull request #40561 from rohitwaghchaure/fixed-11260
fix: Cannot read properties of undefined (reading 'rate')
2024-03-20 15:00:14 +05:30
Rohit Waghchaure
ac92a22914 fix: Cannot read properties of undefined (reading 'rate') 2024-03-20 14:56:07 +05:30
ruthra kumar
5a3afea8c7 refactor: link running doc validation to company master 2024-03-20 14:47:11 +05:30
ruthra kumar
5fe0b20be1 chore: rename entry point 2024-03-20 14:10:08 +05:30
rohitwaghchaure
dfffaddf03 Merge pull request #40559 from rohitwaghchaure/fixed-pick-list-issue-11688
fix: pick list not picked materials having required qty less than 1
2024-03-20 13:51:43 +05:30
Rohit Waghchaure
1a9ae33110 fix: pick list not picked qty less than 1 2024-03-20 13:18:23 +05:30
Nabin Hait
1d91e1788c Merge pull request #40549 from nabinhait/provisional-entry-fix2
fix: provisional entry for non-stock item
2024-03-19 21:59:11 +05:30
Nabin Hait
b73f51a9bd fix: get unique provisional accounts 2024-03-19 21:06:46 +05:30
rohitwaghchaure
0725707cb1 fix: currency symbol for Landed Cost Voucher Amount (#40550) 2024-03-19 20:15:36 +05:30
Nabin Hait
9996d6b7e6 fix: provisional entry for non-stock item 2024-03-19 18:44:13 +05:30
ruthra kumar
3cec62d4f8 chore: move status and error log to their own section 2024-03-19 17:49:05 +05:30
ruthra kumar
0455d0c46c refactor: minor UI tweaks 2024-03-19 17:41:37 +05:30
ruthra kumar
4a55240e63 refactor: exception propogation 2024-03-19 17:39:20 +05:30
Raffael Meyer
815df8e795 Merge pull request #40546 from barredterra/fix-group-by 2024-03-19 12:50:37 +01:00
barredterra
87e36d290e fix(Supplier Quotation Comparison): group by options 2024-03-19 12:34:23 +01:00
barredterra
4cfe99d74f fix: translatability of bom configurator labels 2024-03-19 12:29:50 +01:00
barredterra
e9e985aea0 refactor: use this.frm instead of cur_frm 2024-03-19 12:26:54 +01:00
barredterra
775e8db04e refactor: reduce usage of cur_frm 2024-03-19 12:26:50 +01:00
Raffael Meyer
a8d458b979 Merge pull request #40542 from barredterra/remove-in-list 2024-03-19 12:11:16 +01:00
barredterra
d238751e6b refactor: usage of in_list 2024-03-19 12:03:36 +01:00
Nabin Hait
5691cc6323 Merge pull request #40456 from nabinhait/pi-optimization-dev
perf: Performance optimization for Purchase Invoice submission
2024-03-19 16:09:17 +05:30
rohitwaghchaure
8136954484 fix: rate changing while making PR (negative discount) (#40539) 2024-03-19 15:26:09 +05:30
rohitwaghchaure
a64c2ecf39 fix: stock reco negative batch (#40533) 2024-03-19 14:54:17 +05:30
Gursheen Kaur Anand
5a8004bc58 Merge pull request #40528 from GursheenK/add-range-for-psoa
fix(minor): missing range for ageing summary in PSOA
2024-03-19 12:39:47 +05:30
Gursheen Anand
643cc022fd fix: missing range for ageing summary 2024-03-19 12:12:26 +05:30
rohitwaghchaure
09ea7edb86 fix: Update Existing Price List Rate not working (#40333) 2024-03-19 12:10:24 +05:30
ruthra kumar
eea260b9f9 chore: code cleanup 2024-03-19 11:18:11 +05:30
ruthra kumar
0182713dd6 Merge pull request #40502 from ruthra-kumar/toggle_http_and_https_on_currency_exchange_settings
refactor: toggle between 'http' and 'https' on exchange rate API
2024-03-19 09:59:16 +05:30
Raffael Meyer
12f97e3c63 Merge pull request #40521 from barredterra/rfq-supplier-count 2024-03-19 02:33:52 +01:00
barredterra
8d1b530070 fix(RFQ): load up to 100 suppliers 2024-03-19 02:22:52 +01:00
David
49dd4c1ef3 fix: permissions during bulk transaction logs 2024-03-18 23:08:38 +01:00
David
2f3d6cd304 fix: permissions for selling settings 2024-03-18 19:52:24 +01:00
Nabin Hait
e43beac086 fix: provisional entry for non-stock item 2024-03-18 22:07:12 +05:30
ruthra kumar
3dd6686d8a Merge pull request #40511 from ruthra-kumar/incorrect_exc_gain_loss
fix: invalid exchange loss booking on invoice against base accounts
2024-03-18 20:39:40 +05:30
ruthra kumar
e1c2d006ca refactor(test): ensure Exchange gain/loss journals aren't created 2024-03-18 20:24:05 +05:30
ruthra kumar
3d5dba6976 fix: invalid exchange loss booking on invoice againts base accounts 2024-03-18 15:34:21 +05:30
rohitwaghchaure
7695759f3c fix: not able to delete cancelled delivery note (#40508) 2024-03-18 15:09:55 +05:30
rohitwaghchaure
00de529a1e fix: balance qty in the stock ledger report (#40506) 2024-03-18 12:41:43 +05:30
“Khushi
08893d1f75 chore: fixed merged conflicts 2024-03-18 11:46:17 +05:30
“Khushi
11616bec26 style: removed print statement 2024-03-18 11:18:14 +05:30
ruthra kumar
8b81274769 refactor: toggle between 'http' and 'https' on exchange rate API 2024-03-18 09:26:27 +05:30
Deepesh Garg
6d47b8a24e Merge pull request #40459 from Nihantra-Patel/fix_sp_address
fix: sales partner address display Issue
2024-03-17 11:05:48 +05:30
Nihantra C. Patel
cefb8f69e5 chore: minor cleanup | add comma 2024-03-17 10:51:34 +05:30
ruthra kumar
1fc099dacf Merge pull request #40494 from ruthra-kumar/bank_statement_import_error
fix: AttributeError in Bank Statement Import
2024-03-17 07:52:19 +05:30
ruthra kumar
c46c329ed8 Merge pull request #40495 from ruthra-kumar/indexerror_on_err_creation
fix: index error on Exchange Rate Revaluation creation
2024-03-17 07:50:21 +05:30
ruthra kumar
bb279e368c fix: index error on Exchange Rate Revaluation creation 2024-03-17 07:32:13 +05:30
ruthra kumar
aec630c74f fix: attribute error on Bank Statement Import retry 2024-03-17 06:46:06 +05:30
ruthra kumar
3cde81be65 fix: don't validate for currency, if account is unavailable 2024-03-17 06:35:31 +05:30
Devin Slauenwhite
3381d0d945 fix: show future payments allocated sales returns is considered as payment 2024-03-16 15:24:12 -04:00
Devin Slauenwhite
daaa00bd4a test: show future payments allocated sales returns is considered as payment 2024-03-16 15:24:12 -04:00
Deepesh Garg
2fadfd7cfc Merge pull request #40428 from deepeshgarg007/search_field_fix
chore: Remove custom party queries
2024-03-16 20:03:31 +05:30
Deepesh Garg
60ba25caf2 fix: Remove custom queries for customer 2024-03-16 19:47:39 +05:30
Deepesh Garg
f3f6bc8042 chore: minor cleanup 2024-03-16 19:15:59 +05:30
Ankush Menat
b171784d85 Merge pull request #40491 from frappe/make_bom_tests_work
test: fix bom test
2024-03-16 19:12:29 +05:30
Ankush Menat
c80356c7c9 test: remove broken bom test
These variables never existed, the test was passing because of a bug in
timeout decorator https://github.com/frappe/frappe/pull/25491
2024-03-16 18:58:19 +05:30
ruthra kumar
c9039d767b Merge pull request #40485 from ruthra-kumar/prevent_partial_links_between_so_and_dn
refactor: validate SO and SI references in Delivery Notes
2024-03-16 14:57:41 +05:30
ruthra kumar
4f396d3049 test: SO reference validation 2024-03-16 14:39:57 +05:30
ruthra kumar
4d090bd3b8 refactor: validate SO and SI references 2024-03-16 14:28:14 +05:30
ruthra kumar
30463657bf refactor: better method naming 2024-03-16 10:41:05 +05:30
ruthra kumar
ec194ef076 refactor: barebones hook on all doctypes with 'company' field 2024-03-16 10:41:05 +05:30
ruthra kumar
78c9cc63b1 refactor: make sure only one task is running for doc 2024-03-16 10:41:05 +05:30
ruthra kumar
98afb4d468 chore: hide docfield in list view 2024-03-16 10:41:05 +05:30
ruthra kumar
31a2da552b refactor: validations to prevent duplicate jobs 2024-03-16 10:41:05 +05:30
ruthra kumar
55e93b3fe1 refactor: no copy on summary table and more validations 2024-03-16 10:41:05 +05:30
ruthra kumar
2dbe68a09d refactor: reset all flags and remove unwanted code 2024-03-16 10:41:05 +05:30
ruthra kumar
1014940953 chore: show correct status in list view 2024-03-16 10:41:04 +05:30
ruthra kumar
86b5e2e277 refactor: validate status before running events 2024-03-16 10:40:26 +05:30
ruthra kumar
7c4cff2649 refactor: make Excluded doctype table read only 2024-03-16 10:40:24 +05:30
ruthra kumar
b98a5e4edc chore: remove unwanted UI code 2024-03-16 10:40:06 +05:30
ruthra kumar
49d3bcbc8d refactor: use separate child table for summary 2024-03-16 10:39:17 +05:30
ruthra kumar
b12ca65fcc refactor: chained callback 2024-03-16 10:38:32 +05:30
ruthra kumar
cccb2d5141 refactor: reorder flags in Tasks section 2024-03-16 10:38:32 +05:30
ruthra kumar
6a77d86a53 refactor: use flags to decide on current stage 2024-03-16 10:38:31 +05:30
ruthra kumar
8944ab8b6a refactor: UI trigger 2024-03-16 10:37:18 +05:30
ruthra kumar
d0dc2c6e77 refactor: tasks section and UI niceties 2024-03-16 10:35:59 +05:30
ruthra kumar
6fbb67b1d2 refactor: set status and trigger job on submit 2024-03-16 10:35:59 +05:30
ruthra kumar
0d65d878de refactor: more options for 'status' and move it to top 2024-03-16 10:35:59 +05:30
rohitwaghchaure
1ff8a6f24f fix: stopped mr showing in the popup (#40478) 2024-03-15 18:20:09 +05:30
rohitwaghchaure
59222813af fix: serial and batch for internal transfer (#40467)
* fix: serial and batch for internal transfer

* chore: fix test cases
2024-03-15 17:55:41 +05:30
ruthra kumar
a84b9434a9 Merge pull request #40473 from ruthra-kumar/config_changes_on_cr_note_self_update_flag
refactor: enable no-copy for update_outstanding_for_self
2024-03-15 17:01:41 +05:30
ruthra kumar
a1e8caa5c1 refactor: enable no-copy for update_outstanding_for_self 2024-03-15 16:44:54 +05:30
ruthra kumar
ec55831440 Merge pull request #40260 from ruthra-kumar/support_payment_against_payment
refactor: support payment against reverse payment reconciliation
2024-03-15 12:51:38 +05:30
Gursheen Kaur Anand
a06c3e9f9f Merge pull request #40429 from GursheenK/sales-partner-targets-achieved
fix: achieved targets for territory / partners
2024-03-15 12:45:01 +05:30
Gursheen Kaur Anand
80d3dd2846 Merge pull request #40198 from GursheenK/due-date-for-invoices-via-data-import
fix: auto-update due date for invoices via data import
2024-03-15 12:44:36 +05:30
ruthra kumar
a3d4aff29c refactor(test): generate and use unique party 2024-03-15 12:10:57 +05:30
Gursheen Anand
3e0c798cca chore: merge upstream 2024-03-15 12:08:33 +05:30
Gursheen Anand
f504f2caf3 fix: use in_import flag for checking imported records 2024-03-15 12:00:38 +05:30
ruthra kumar
ad42389352 Merge pull request #40461 from ruthra-kumar/prevent_zero_qty_cr_note_on_stock_items
refactor: disallow '0' qty return invoices with stock effect
2024-03-15 11:06:05 +05:30
ruthra kumar
2a08072443 test: advance payment reconciliation against payment
'advance' payments booked in separate party account
2024-03-15 10:55:00 +05:30
ruthra kumar
6d9074d585 test: reverse payment reconciliation 2024-03-15 10:55:00 +05:30
ruthra kumar
5f15297f28 refactor: support payment against reverse payment reconciliation 2024-03-15 10:55:00 +05:30
ruthra kumar
647bba0f00 test: validation to prevent '0' qty return with stock effect 2024-03-15 10:47:32 +05:30
ruthra kumar
898affbee9 refactor: disallow '0' qty return invoices with stock effect 2024-03-14 16:48:55 +05:30
ruthra kumar
4ed7e3eacd Merge pull request #40420 from ruthra-kumar/fix_advance_journal_fixing_logic
fix: advance journal fetching logic in Advances section
2024-03-14 15:35:06 +05:30
ruthra kumar
12029557fe Merge pull request #40445 from ruthra-kumar/fix_flaky_ar_test
fix: flaky Accounts Receivable test case
2024-03-14 15:31:22 +05:30
Nihantra C. Patel
b62a6b6ab0 fix: sales partner address display Issue --upd 2024-03-14 15:21:28 +05:30
ruthra kumar
a9a9b1297e fix(test): manually filter rows and assert 2024-03-14 15:16:29 +05:30
ruthra kumar
437bdc2d8c fix: flaky Accounts Receivable test case 2024-03-14 15:16:29 +05:30
Nihantra Patel
62d2fe50d2 fix: sales partner address display Issue 2024-03-14 15:12:25 +05:30
Nabin Hait
26202d90cb Merge pull request #40263 from nabinhait/pi-optimization
perf: Performance optmization for Purchase Invoice submission
2024-03-14 14:19:24 +05:30
Nabin Hait
c417e7d800 Merge pull request #40457 from rohitwaghchaure/fixed-test-case-closing-stock-balance
chore: fix test case
2024-03-14 14:17:35 +05:30
Rohit Waghchaure
ec83d54826 chore: fix test case 2024-03-14 13:48:51 +05:30
Gursheen Anand
4cda88690f fix: show correct variance for durations with no vouchers 2024-03-14 12:51:51 +05:30
Deepesh Garg
d15cdd9190 Merge pull request #40433 from deepeshgarg007/client_side_tax_updates
fix: Taxes not getting updated on change
2024-03-14 12:13:16 +05:30
“Khushi
a0247d11bd feat: added coupon code functionality onsales invoice 2024-03-14 12:04:09 +05:30
rohitwaghchaure
cd79dcccb6 fix: Data too long for column 'stock_queue' (#40436) 2024-03-14 11:19:57 +05:30
rohitwaghchaure
f4a945aee4 fix: incorrect gross profit on the quotation (#40438) 2024-03-13 17:48:06 +05:30
“Khushi
10bb1c31a2 feat: added coupon code functionality onsales invoice 2024-03-13 17:47:40 +05:30
Deepesh Garg
65ae9616ba fix: Taxes not getting updated on change 2024-03-13 13:59:50 +05:30
Florian HENRY
560eb174f1 fix: Opportunity Type must be translatable 2024-03-13 09:11:14 +01:00
Gursheen Anand
9f3a310300 test: sales partner targets with invoices 2024-03-13 13:35:24 +05:30
Nabin Hait
8d405684ce Merge pull request #40385 from nabinhait/depreciation-asset-sale-dev
fix: Book depreciation until the asset disposal date and removed unwanted commits
2024-03-13 13:17:23 +05:30
Nabin Hait
d7a4c0dfde Merge pull request #40126 from nabinhait/document-modified-error-dev
fix: Reload document on cancel to avoid document modified error
2024-03-13 13:17:13 +05:30
Gursheen Anand
7690a40ebb fix: achieved targets for sales partners 2024-03-13 12:18:25 +05:30
Deepesh Garg
effc9d1492 chore: Add supplier query back 2024-03-13 12:06:32 +05:30
Deepesh Garg
e87b44f758 chore: remove invalid comment 2024-03-13 12:02:06 +05:30
Deepesh Garg
c9623b6fd6 chore: Remove custom party queries 2024-03-13 11:59:43 +05:30
ruthra kumar
83d48ca8d7 Merge pull request #40372 from ruthra-kumar/toggle_for_standalone_cr_dr_notes
refactor: checkbox to toggle standalone Credit/Debit note behaviour
2024-03-13 11:41:44 +05:30
ruthra kumar
445d2acf50 chore: better popup message 2024-03-13 11:04:09 +05:30
ruthra kumar
ce3b1f09f5 test: cr note flag to update self 2024-03-13 10:57:12 +05:30
ruthra kumar
4d0c2d8e82 refactor: make AR/AP report aware of always standalone cr/dr notes 2024-03-13 09:55:23 +05:30
Raffael Meyer
98a12dd66f Merge pull request #39748 from blaggacao/fix/pe-fill-in-contact-fields 2024-03-13 00:40:41 +01:00
David Arnold
98c7f44280 fix(pe): set contact fields 2024-03-12 23:39:20 +01:00
HENRY Florian
f24f51b7de fix: if input manualy material request on WO the material_request_item is not set so validate WO give error (#40180) 2024-03-12 21:53:21 +05:30
ruthra kumar
e786a93c2e fix: advance journal fetching logic in Advances section 2024-03-12 21:29:44 +05:30
Ernesto Ruiz
f3b4237ab6 chore: Add translation to buttons in Update stock_summary_template.html (#40099)
chore: Add translation to buttons in Update stock_summary_template.html
2024-03-12 21:28:07 +05:30
ruthra kumar
849f478894 chore: patch for updating flag in Cr/Dr notes 2024-03-12 20:41:37 +05:30
Rucha Mahabal
daf4ae2a6b fix: conditionally apply is_group filter in accounting dimension query (#40414) 2024-03-12 14:46:59 +00:00
rohitwaghchaure
f8a1a7f515 fix: qc created for raw materials during manufacture entry (#40408) 2024-03-12 18:11:12 +05:30
rohitwaghchaure
948297692e fix: incorrect work order status (#40407) 2024-03-12 18:11:00 +05:30
Raffael Meyer
79a0473705 fix: error message wording (#40403) 2024-03-12 11:24:49 +00:00
rohitwaghchaure
72614bb8ff fix: recursion issue while submitting work order (#40400) 2024-03-12 16:27:49 +05:30
ruthra kumar
77aac6f571 refactor: post ledger entries based on toggle 2024-03-12 15:58:26 +05:30
rohitwaghchaure
4a02d1497c fix: decimal issue while making the stock entry (#40394) 2024-03-12 15:15:31 +05:30
Gursheen Kaur Anand
5ac5b7f258 Merge pull request #40388 from GursheenK/promotional-scheme-recurse-for
feat: add recursion qty field in promotional scheme
2024-03-12 14:28:17 +05:30
rohitwaghchaure
a419812864 fix: negative stock error for the batch (#40389) 2024-03-12 14:18:39 +05:30
Gursheen Anand
0ffc5cf012 test: pricing rule for product discounts 2024-03-12 13:55:43 +05:30
Gursheen Anand
7075c50b85 feat: add recursion qty field in promotional scheme 2024-03-12 13:16:39 +05:30
Dany Robert
b8da0d9334 fix: wrong buying amount if delivered and billed qty varies 2024-03-12 12:52:19 +05:30
Nabin Hait
dedae4fecf fix: Book depreciation until the asset disposal date and removed unwanted commits 2024-03-12 12:32:57 +05:30
rohitwaghchaure
0da19a40a7 fix: barcode field on line item not working (#40381) 2024-03-12 12:27:21 +05:30
Nabin Hait
7e301f02df fix: convert str to date 2024-03-12 12:25:01 +05:30
rohitwaghchaure
b9a8dd468b fix: Use serial/batch fields for delivery note return (#40374)
fix: User serial/batch fields for delivery note return
2024-03-11 17:06:24 +05:30
Nihantra C. Patel
655a1797be fix: get address if multiple companies 2024-03-11 16:46:00 +05:30
ruthra kumar
a97a851333 Merge pull request #40299 from ruthra-kumar/rewrite_fetch_query_on_bank_reconciliation_tool
refactor: run qb directly instead of converting to sql
2024-03-11 16:44:32 +05:30
Nihantra Patel
c6cf1bec76 fix: get address if multiple companies 2024-03-11 16:34:44 +05:30
ruthra kumar
0344ff2aac chore: replace parameter with qb conditions 2024-03-11 16:01:42 +05:30
ruthra kumar
767f2157e6 refactor: checkbox in purchase invoice 2024-03-11 15:00:26 +05:30
ruthra kumar
adf13a19c4 chore: update popup message 2024-03-11 15:00:26 +05:30
ruthra kumar
2cefe2a20e refactor: checkbox to toggle always standalone credit note 2024-03-11 15:00:24 +05:30
Nabin Hait
d2b34ea05d Merge pull request #40121 from nabinhait/asset-cancel-deletion
fix: Patch to remove cancelled asset capitalization from asset
2024-03-11 12:28:55 +05:30
Rushabh Mehta
cde5b934e5 Merge pull request #40368 from frappe/fix-chore-sales-order
fix(chore): remove inscrutable message via DOM injection (via Sentry)
2024-03-11 12:25:35 +05:30
Rushabh Mehta
c4570ccfad fix(chore): remove inscrutable message via DOM injection (via Sentry) 2024-03-11 12:17:22 +05:30
ruthra kumar
711b72b26c refactor: run qb directly instead of converting to sql 2024-03-06 12:05:11 +05:30
Gursheen Anand
c096133897 fix: auto-update due date for invoices via data import 2024-02-29 17:42:25 +05:30
Nabin Hait
287eff533a fix: Reload document on cancel to avoid document modified error 2024-02-26 14:55:06 +05:30
Nabin Hait
1951f71eeb fix: Patch to remove cancelled asset capitalization from asset 2024-02-26 12:57:19 +05:30
1218 changed files with 256547 additions and 78241 deletions

View File

@@ -35,3 +35,6 @@ eb9ee3f79b94e594fc6dfa4f6514580e125eee8c
# js formatting
ec74a5e56617bbd76ac402451468fd4668af543d
# ruff formatting
a308792ee7fda18a681e9181f4fd00b36385bc23

View File

@@ -1,7 +1,7 @@
import sys
import requests
from urllib.parse import urlparse
import requests
WEBSITE_REPOS = [
"erpnext_com",
@@ -36,11 +36,7 @@ def is_documentation_link(word: str) -> bool:
def contains_documentation_link(body: str) -> bool:
return any(
is_documentation_link(word)
for line in body.splitlines()
for word in line.split()
)
return any(is_documentation_link(word) for line in body.splitlines() for word in line.split())
def check_pull_request(number: str) -> "tuple[int, str]":
@@ -53,12 +49,7 @@ def check_pull_request(number: str) -> "tuple[int, str]":
head_sha = (payload.get("head") or {}).get("sha")
body = (payload.get("body") or "").lower()
if (
not title.startswith("feat")
or not head_sha
or "no-docs" in body
or "backport" in body
):
if not title.startswith("feat") or not head_sha or "no-docs" in body or "backport" in body:
return 0, "Skipping documentation checks... 🏃"
if contains_documentation_link(body):

View File

@@ -2,7 +2,9 @@ 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)*)*\)")
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[\"']")
@@ -10,14 +12,14 @@ 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'))]
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}')
with open(_file) 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:
if "frappe-lint: disable-translate" in line:
continue
start_matches = start_pattern.search(line)
@@ -28,7 +30,9 @@ for _file in files_to_scan:
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]}')
print(
f"\nF-strings are not supported for translations at line number {line_number}\n{line.strip()[:100]}"
)
continue
else:
continue
@@ -36,25 +40,29 @@ for _file in files_to_scan:
match = pattern.search(line)
error_found = False
if not match and line.endswith((',\n', '[\n')):
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:]
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]}')
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]}')
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.')
print(
'\nVisit "https://frappeframework.com/docs/user/en/translations" to learn about valid translation strings.'
)
sys.exit(1)
else:
print('\nGood To Go!')
print("\nGood To Go!")

View File

@@ -32,7 +32,7 @@ jobs:
steps:
- name: Clone
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Check for valid Python & Merge Conflicts
run: |
@@ -43,12 +43,12 @@ jobs:
fi
- name: Setup Python
uses: "actions/setup-python@v4"
uses: actions/setup-python@v5
with:
python-version: '3.10'
python-version: '3.11'
- name: Setup Node
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: 18
check-latest: true
@@ -57,7 +57,7 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -66,7 +66,7 @@ jobs:
${{ runner.os }}-
- name: Cache node modules
uses: actions/cache@v2
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
@@ -81,7 +81,7 @@ jobs:
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
- uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}

View File

@@ -54,12 +54,12 @@ jobs:
steps:
- name: Clone
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v2
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.12'
- name: Check for valid Python & Merge Conflicts
run: |
@@ -70,7 +70,7 @@ jobs:
fi
- name: Setup Node
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: 18
check-latest: true
@@ -79,7 +79,7 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -88,7 +88,7 @@ jobs:
${{ runner.os }}-
- name: Cache node modules
uses: actions/cache@v2
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
@@ -103,7 +103,7 @@ jobs:
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
- uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
@@ -144,13 +144,13 @@ jobs:
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Clone
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v3
- name: Upload coverage data
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v4
with:
name: MariaDB
token: ${{ secrets.CODECOV_TOKEN }}

View File

@@ -41,12 +41,12 @@ jobs:
steps:
- name: Clone
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v2
uses: actions/setup-python@v5
with:
python-version: '3.10'
python-version: '3.12'
- name: Check for valid Python & Merge Conflicts
run: |
@@ -57,7 +57,7 @@ jobs:
fi
- name: Setup Node
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: 18
check-latest: true
@@ -66,7 +66,7 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -75,7 +75,7 @@ jobs:
${{ runner.os }}-
- name: Cache node modules
uses: actions/cache@v2
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
@@ -90,7 +90,7 @@ jobs:
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
- uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}

View File

@@ -55,28 +55,15 @@ repos:
erpnext/templates/includes/.*
)$
- repo: https://github.com/PyCQA/flake8
rev: 6.0.0
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.2.0
hooks:
- id: flake8
additional_dependencies: [
'flake8-bugbear',
'flake8-tuple',
]
args: ['--config', '.github/helper/.flake8_strict']
exclude: ".*setup.py$"
- id: ruff
name: "Run ruff linter and apply fixes"
args: ["--fix"]
- repo: https://github.com/adityahase/black
rev: 9cb0a69f4d0030cdf687eddf314468b39ed54119
hooks:
- id: black
additional_dependencies: ['click==8.0.4']
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort
exclude: ".*setup.py$"
- id: ruff-format
name: "Format Python code"
ci:

1
babel_extractors.csv Normal file
View File

@@ -0,0 +1 @@
**/setup/setup_wizard/data/uom_data.json,erpnext.gettext.extractors.uom_data.extract
1 **/setup/setup_wizard/data/uom_data.json erpnext.gettext.extractors.uom_data.extract

View File

@@ -1,4 +1,8 @@
files:
- source: /erpnext/locale/main.pot
translation: /erpnext/locale/%two_letters_code%.po
pull_request_title: "chore: sync translations from crowdin"
pull_request_title: "fix: sync translations from crowdin"
pull_request_labels:
- translation
commit_message: "fix: %language% translations"
append_commit_message: false

View File

@@ -37,9 +37,7 @@ def get_default_cost_center(company):
if not frappe.flags.company_cost_center:
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"
)
frappe.flags.company_cost_center[company] = frappe.get_cached_value("Company", company, "cost_center")
return frappe.flags.company_cost_center[company]

View File

@@ -11,14 +11,14 @@ class ERPNextAddress(Address):
def validate(self):
self.validate_reference()
self.update_compnay_address()
super(ERPNextAddress, self).validate()
super().validate()
def link_address(self):
"""Link address based on owner"""
if self.is_your_company_address:
return
return super(ERPNextAddress, self).link_address()
return super().link_address()
def update_compnay_address(self):
for link in self.get("links"):
@@ -26,11 +26,11 @@ class ERPNextAddress(Address):
self.is_your_company_address = 1
def validate_reference(self):
if self.is_your_company_address and not [
row for row in self.links if row.link_doctype == "Company"
]:
if self.is_your_company_address and not [row for row in self.links if row.link_doctype == "Company"]:
frappe.throw(
_("Address needs to be linked to a Company. Please add a row for Company in the Links table."),
_(
"Address needs to be linked to a Company. Please add a row for Company in the Links table."
),
title=_("Company Not Linked"),
)

View File

@@ -37,7 +37,7 @@ def get(
filters = frappe.parse_json(filters) or frappe.parse_json(chart.filters_json)
account = filters.get("account")
company = filters.get("company")
filters.get("company")
if not account and chart_name:
frappe.throw(
@@ -83,7 +83,6 @@ def build_result(account, dates, gl_entries):
# get balances in debit
for entry in gl_entries:
# entry date is after the current pointer, so move the pointer forward
while getdate(entry.posting_date) > result[date_index][0]:
date_index += 1
@@ -133,8 +132,6 @@ def get_dates_from_timegrain(from_date, to_date, timegrain):
dates = [get_period_ending(from_date, timegrain)]
while getdate(dates[-1]) < getdate(to_date):
date = get_period_ending(
add_to_date(dates[-1], years=years, months=months, days=days), timegrain
)
date = get_period_ending(add_to_date(dates[-1], years=years, months=months, days=days), timegrain)
dates.append(date)
return dates

View File

@@ -24,14 +24,10 @@ from erpnext.accounts.utils import get_account_currency
def validate_service_stop_date(doc):
"""Validates service_stop_date for Purchase Invoice and Sales Invoice"""
enable_check = (
"enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
)
enable_check = "enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
old_stop_dates = {}
old_doc = frappe.db.get_all(
"{0} Item".format(doc.doctype), {"parent": doc.name}, ["name", "service_stop_date"]
)
old_doc = frappe.db.get_all(f"{doc.doctype} Item", {"parent": doc.name}, ["name", "service_stop_date"])
for d in old_doc:
old_stop_dates[d.name] = d.service_stop_date or ""
@@ -62,16 +58,14 @@ def build_conditions(process_type, account, company):
)
if account:
conditions += "AND %s='%s'" % (deferred_account, account)
conditions += f"AND {deferred_account}='{account}'"
elif company:
conditions += f"AND p.company = {frappe.db.escape(company)}"
return conditions
def convert_deferred_expense_to_expense(
deferred_process, start_date=None, end_date=None, conditions=""
):
def convert_deferred_expense_to_expense(deferred_process, start_date=None, end_date=None, conditions=""):
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
if not start_date:
@@ -81,16 +75,14 @@ def convert_deferred_expense_to_expense(
# check for the purchase invoice for which GL entries has to be done
invoices = frappe.db.sql_list(
"""
f"""
select distinct item.parent
from `tabPurchase Invoice Item` item, `tabPurchase Invoice` p
where item.service_start_date<=%s and item.service_end_date>=%s
and item.enable_deferred_expense = 1 and item.parent=p.name
and item.docstatus = 1 and ifnull(item.amount, 0) > 0
{0}
""".format(
conditions
),
{conditions}
""",
(end_date, start_date),
) # nosec
@@ -103,9 +95,7 @@ def convert_deferred_expense_to_expense(
send_mail(deferred_process)
def convert_deferred_revenue_to_income(
deferred_process, start_date=None, end_date=None, conditions=""
):
def convert_deferred_revenue_to_income(deferred_process, start_date=None, end_date=None, conditions=""):
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
if not start_date:
@@ -115,16 +105,14 @@ def convert_deferred_revenue_to_income(
# check for the sales invoice for which GL entries has to be done
invoices = frappe.db.sql_list(
"""
f"""
select distinct item.parent
from `tabSales Invoice Item` item, `tabSales Invoice` p
where item.service_start_date<=%s and item.service_end_date>=%s
and item.enable_deferred_revenue = 1 and item.parent=p.name
and item.docstatus = 1 and ifnull(item.amount, 0) > 0
{0}
""".format(
conditions
),
{conditions}
""",
(end_date, start_date),
) # nosec
@@ -243,9 +231,7 @@ def calculate_monthly_amount(
already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(
doc, item
)
base_amount = flt(
item.base_net_amount - already_booked_amount, item.precision("base_net_amount")
)
base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
if account_currency == doc.company_currency:
amount = base_amount
else:
@@ -265,17 +251,13 @@ def calculate_amount(doc, item, last_gl_entry, total_days, total_booking_days, a
if account_currency == doc.company_currency:
amount = base_amount
else:
amount = flt(
item.net_amount * total_booking_days / flt(total_days), item.precision("net_amount")
)
amount = flt(item.net_amount * total_booking_days / flt(total_days), item.precision("net_amount"))
else:
already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(
doc, item
)
base_amount = flt(
item.base_net_amount - already_booked_amount, item.precision("base_net_amount")
)
base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
if account_currency == doc.company_currency:
amount = base_amount
else:
@@ -296,26 +278,22 @@ def get_already_booked_amount(doc, item):
gl_entries_details = frappe.db.sql(
"""
select sum({0}) as total_credit, sum({1}) as total_credit_in_account_currency, voucher_detail_no
select sum({}) as total_credit, sum({}) as total_credit_in_account_currency, voucher_detail_no
from `tabGL Entry` where company=%s and account=%s and voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
and is_cancelled = 0
group by voucher_detail_no
""".format(
total_credit_debit, total_credit_debit_currency
),
""".format(total_credit_debit, total_credit_debit_currency),
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
journal_entry_details = frappe.db.sql(
"""
SELECT sum(c.{0}) as total_credit, sum(c.{1}) as total_credit_in_account_currency, reference_detail_no
SELECT sum(c.{}) as total_credit, sum(c.{}) as total_credit_in_account_currency, reference_detail_no
FROM `tabJournal Entry` p , `tabJournal Entry Account` c WHERE p.name = c.parent and
p.company = %s and c.account=%s and c.reference_type=%s and c.reference_name=%s and c.reference_detail_no=%s
and p.docstatus < 2 group by reference_detail_no
""".format(
total_credit_debit, total_credit_debit_currency
),
""".format(total_credit_debit, total_credit_debit_currency),
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
@@ -337,9 +315,7 @@ def get_already_booked_amount(doc, item):
def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
enable_check = (
"enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
)
enable_check = "enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
accounts_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
@@ -384,45 +360,45 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
)
if not amount:
return
gl_posting_date = end_date
prev_posting_date = None
# check if books nor frozen till endate:
if accounts_frozen_upto and getdate(end_date) <= getdate(accounts_frozen_upto):
gl_posting_date = get_last_day(add_days(accounts_frozen_upto, 1))
prev_posting_date = end_date
if via_journal_entry:
book_revenue_via_journal_entry(
doc,
credit_account,
debit_account,
amount,
base_amount,
gl_posting_date,
project,
account_currency,
item.cost_center,
item,
deferred_process,
submit_journal_entry,
)
else:
make_gl_entries(
doc,
credit_account,
debit_account,
against,
amount,
base_amount,
gl_posting_date,
project,
account_currency,
item.cost_center,
item,
deferred_process,
)
gl_posting_date = end_date
prev_posting_date = None
# check if books nor frozen till endate:
if accounts_frozen_upto and getdate(end_date) <= getdate(accounts_frozen_upto):
gl_posting_date = get_last_day(add_days(accounts_frozen_upto, 1))
prev_posting_date = end_date
if via_journal_entry:
book_revenue_via_journal_entry(
doc,
credit_account,
debit_account,
amount,
base_amount,
gl_posting_date,
project,
account_currency,
item.cost_center,
item,
deferred_process,
submit_journal_entry,
)
else:
make_gl_entries(
doc,
credit_account,
debit_account,
against,
amount,
base_amount,
gl_posting_date,
project,
account_currency,
item.cost_center,
item,
deferred_process,
)
# Returned in case of any errors because it tries to submit the same record again and again in case of errors
if frappe.flags.deferred_accounting_error:
@@ -440,9 +416,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
via_journal_entry = cint(
frappe.db.get_singles_value("Accounts Settings", "book_deferred_entries_via_journal_entry")
)
submit_journal_entry = cint(
frappe.db.get_singles_value("Accounts Settings", "submit_journal_entries")
)
submit_journal_entry = cint(frappe.db.get_singles_value("Accounts Settings", "submit_journal_entries"))
book_deferred_entries_based_on = frappe.db.get_singles_value(
"Accounts Settings", "book_deferred_entries_based_on"
)
@@ -462,9 +436,7 @@ def process_deferred_accounting(posting_date=None):
posting_date = today()
if not cint(
frappe.db.get_singles_value(
"Accounts Settings", "automatically_process_deferred_accounting_entry"
)
frappe.db.get_singles_value("Accounts Settings", "automatically_process_deferred_accounting_entry")
):
return
@@ -587,16 +559,13 @@ def book_revenue_via_journal_entry(
deferred_process=None,
submit="No",
):
if amount == 0:
return
journal_entry = frappe.new_doc("Journal Entry")
journal_entry.posting_date = posting_date
journal_entry.company = doc.company
journal_entry.voucher_type = (
"Deferred Revenue" if doc.doctype == "Sales Invoice" else "Deferred Expense"
)
journal_entry.voucher_type = "Deferred Revenue" if doc.doctype == "Sales Invoice" else "Deferred Expense"
journal_entry.process_deferred_accounting = deferred_process
debit_entry = {
@@ -645,7 +614,6 @@ def book_revenue_via_journal_entry(
def get_deferred_booking_accounts(doctype, voucher_detail_no, dr_or_cr):
if doctype == "Sales Invoice":
credit_account, debit_account = frappe.db.get_value(
"Sales Invoice Item",

View File

@@ -65,6 +65,8 @@
"label": "Is Group"
},
{
"fetch_from": "parent_account.company",
"fetch_if_empty": 1,
"fieldname": "company",
"fieldtype": "Link",
"in_standard_filter": 1,
@@ -193,7 +195,7 @@
"idx": 1,
"is_tree": 1,
"links": [],
"modified": "2024-01-10 04:57:33.681676",
"modified": "2024-03-27 13:05:55.866034",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
@@ -251,7 +253,7 @@
"search_fields": "account_number",
"show_name_in_global_search": 1,
"show_preview_popup": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"track_changes": 1

View File

@@ -88,12 +88,10 @@ class Account(NestedSet):
if frappe.local.flags.ignore_update_nsm:
return
else:
super(Account, self).on_update()
super().on_update()
def onload(self):
frozen_accounts_modifier = frappe.db.get_single_value(
"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)
@@ -218,9 +216,7 @@ class Account(NestedSet):
def validate_root_company_and_sync_account_to_children(self):
# ignore validation while creating new compnay or while syncing to child companies
if (
frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation
):
if frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation:
return
ancestors = get_root_company(self.company)
if ancestors:
@@ -418,7 +414,7 @@ class Account(NestedSet):
if self.check_gle_exists():
throw(_("Account with existing transaction can not be deleted"))
super(Account, self).on_trash(True)
super().on_trash(True)
@frappe.whitelist()
@@ -426,9 +422,8 @@ class Account(NestedSet):
def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
return frappe.db.sql(
"""select name from tabAccount
where is_group = 1 and docstatus != 2 and company = %s
and %s like %s order by name limit %s offset %s"""
% ("%s", searchfield, "%s", "%s", "%s"),
where is_group = 1 and docstatus != 2 and company = {}
and {} like {} order by name limit {} offset {}""".format("%s", searchfield, "%s", "%s", "%s"),
(filters["company"], "%%%s%%" % txt, page_len, start),
as_list=1,
)
@@ -594,7 +589,5 @@ def sync_update_account_number_in_child(
if old_acc_number:
filters["account_number"] = old_acc_number
for d in frappe.db.get_values(
"Account", filters=filters, fieldname=["company", "name"], as_dict=True
):
for d in frappe.db.get_values("Account", filters=filters, fieldname=["company", "name"], as_dict=True):
update_account_number(d["name"], account_name, account_number, from_descendant=True)

View File

@@ -31,7 +31,6 @@ def create_charts(
"tax_rate",
"account_currency",
]:
account_number = cstr(child.get("account_number")).strip()
account_name, account_name_in_db = add_suffix_if_duplicate(
account_name, account_number, accounts
@@ -39,7 +38,9 @@ def create_charts(
is_group = identify_is_group(child)
report_type = (
"Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] else "Profit and Loss"
"Balance Sheet"
if root_type in ["Asset", "Liability", "Equity"]
else "Profit and Loss"
)
account = frappe.get_doc(
@@ -141,7 +142,7 @@ def get_chart(chart_template, existing_company=None):
for fname in os.listdir(path):
fname = frappe.as_unicode(fname)
if fname.endswith(".json"):
with open(os.path.join(path, fname), "r") as f:
with open(os.path.join(path, fname)) as f:
chart = f.read()
if chart and json.loads(chart).get("name") == chart_template:
return json.loads(chart).get("tree")
@@ -173,7 +174,7 @@ def get_charts_for_country(country, with_standard=False):
for fname in os.listdir(path):
fname = frappe.as_unicode(fname)
if (fname.startswith(country_code) or fname.startswith(country)) and fname.endswith(".json"):
with open(os.path.join(path, fname), "r") as f:
with open(os.path.join(path, fname)) as f:
_get_chart_name(f.read())
# if more than one charts, returned then add the standard
@@ -249,7 +250,13 @@ def validate_bank_account(coa, bank_account):
def _get_account_names(account_master):
for account_name, child in account_master.items():
if account_name not in ["account_number", "account_type", "root_type", "is_group", "tax_rate"]:
if account_name not in [
"account_number",
"account_type",
"root_type",
"is_group",
"tax_rate",
]:
accounts.append(account_name)
_get_account_names(child)

View File

@@ -261,28 +261,20 @@ class TestAccount(unittest.TestCase):
acc.insert()
self.assertTrue(
frappe.db.exists(
"Account", {"account_name": "Test Group Account", "company": "_Test Company 4"}
)
frappe.db.exists("Account", {"account_name": "Test Group Account", "company": "_Test Company 4"})
)
self.assertTrue(
frappe.db.exists(
"Account", {"account_name": "Test Group Account", "company": "_Test Company 5"}
)
frappe.db.exists("Account", {"account_name": "Test Group Account", "company": "_Test Company 5"})
)
# Try renaming child company account
acc_tc_5 = frappe.db.get_value(
"Account", {"account_name": "Test Group Account", "company": "_Test Company 5"}
)
self.assertRaises(
frappe.ValidationError, update_account_number, acc_tc_5, "Test Modified Account"
)
self.assertRaises(frappe.ValidationError, update_account_number, acc_tc_5, "Test Modified Account")
# Rename child company account with allow_account_creation_against_child_company enabled
frappe.db.set_value(
"Company", "_Test Company 5", "allow_account_creation_against_child_company", 1
)
frappe.db.set_value("Company", "_Test Company 5", "allow_account_creation_against_child_company", 1)
update_account_number(acc_tc_5, "Test Modified Account")
self.assertTrue(
@@ -291,9 +283,7 @@ class TestAccount(unittest.TestCase):
)
)
frappe.db.set_value(
"Company", "_Test Company 5", "allow_account_creation_against_child_company", 0
)
frappe.db.set_value("Company", "_Test Company 5", "allow_account_creation_against_child_company", 0)
to_delete = [
"Test Group Account - _TC3",
@@ -318,9 +308,7 @@ class TestAccount(unittest.TestCase):
self.assertEqual(acc.account_currency, "INR")
# Make a JV against this account
make_journal_entry(
"Test Currency Account - _TC", "Miscellaneous Expenses - _TC", 100, submit=True
)
make_journal_entry("Test Currency Account - _TC", "Miscellaneous Expenses - _TC", 100, submit=True)
acc.account_currency = "USD"
self.assertRaises(frappe.ValidationError, acc.save)

View File

@@ -129,7 +129,7 @@
"icon": "fa fa-list",
"in_create": 1,
"links": [],
"modified": "2023-03-06 08:56:36.393237",
"modified": "2024-03-27 13:05:56.710541",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account Closing Balance",
@@ -158,7 +158,7 @@
"role": "Auditor"
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -40,16 +40,12 @@ class AccountClosingBalance(Document):
def make_closing_entries(closing_entries, voucher_name, company, closing_date):
accounting_dimensions = get_accounting_dimensions()
previous_closing_entries = get_previous_closing_entries(
company, closing_date, accounting_dimensions
)
previous_closing_entries = get_previous_closing_entries(company, closing_date, accounting_dimensions)
combined_entries = closing_entries + previous_closing_entries
merged_entries = aggregate_with_last_account_closing_balance(
combined_entries, accounting_dimensions
)
merged_entries = aggregate_with_last_account_closing_balance(combined_entries, accounting_dimensions)
for key, value in merged_entries.items():
for _key, value in merged_entries.items():
cle = frappe.new_doc("Account Closing Balance")
cle.update(value)
cle.update(value["dimensions"])

View File

@@ -57,9 +57,12 @@ frappe.ui.form.on("Accounting Dimension", {
}
},
label: function (frm) {
frm.set_value("fieldname", frappe.model.scrub(frm.doc.label));
},
document_type: function (frm) {
frm.set_value("label", frm.doc.document_type);
frm.set_value("fieldname", frappe.model.scrub(frm.doc.document_type));
frappe.db.get_value(
"Accounting Dimension",

View File

@@ -49,7 +49,7 @@
}
],
"links": [],
"modified": "2021-02-08 16:37:53.936656",
"modified": "2024-03-27 13:05:56.890002",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Dimension",
@@ -80,7 +80,8 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"track_changes": 1
}

View File

@@ -40,7 +40,8 @@ class AccountingDimension(Document):
self.set_fieldname_and_label()
def validate(self):
if self.document_type in core_doctypes_list + (
if self.document_type in (
*core_doctypes_list,
"Accounting Dimension",
"Project",
"Cost Center",
@@ -48,13 +49,10 @@ class AccountingDimension(Document):
"Company",
"Account",
):
msg = _("Not allowed to create accounting dimension for {0}").format(self.document_type)
frappe.throw(msg)
exists = frappe.db.get_value(
"Accounting Dimension", {"document_type": self.document_type}, ["name"]
)
exists = frappe.db.get_value("Accounting Dimension", {"document_type": self.document_type}, ["name"])
if exists and self.is_new():
frappe.throw(_("Document Type already used as a dimension"))
@@ -113,7 +111,6 @@ def make_dimension_in_accounting_doctypes(doc, doclist=None):
repostable_doctypes = get_allowed_types_from_settings()
for doctype in doclist:
if (doc_count + 1) % 2 == 0:
insert_after_field = "dimension_col_break"
else:
@@ -148,7 +145,7 @@ def add_dimension_to_budget_doctype(df, doc):
df.update(
{
"insert_after": "cost_center",
"depends_on": "eval:doc.budget_against == '{0}'".format(doc.document_type),
"depends_on": f"eval:doc.budget_against == '{doc.document_type}'",
}
)
@@ -182,19 +179,17 @@ def delete_accounting_dimension(doc):
frappe.db.sql(
"""
DELETE FROM `tabCustom Field`
WHERE fieldname = %s
AND dt IN (%s)"""
% ("%s", ", ".join(["%s"] * len(doclist))), # nosec
tuple([doc.fieldname] + doclist),
WHERE fieldname = {}
AND dt IN ({})""".format("%s", ", ".join(["%s"] * len(doclist))), # nosec
tuple([doc.fieldname, *doclist]),
)
frappe.db.sql(
"""
DELETE FROM `tabProperty Setter`
WHERE field_name = %s
AND doc_type IN (%s)"""
% ("%s", ", ".join(["%s"] * len(doclist))), # nosec
tuple([doc.fieldname] + doclist),
WHERE field_name = {}
AND doc_type IN ({})""".format("%s", ", ".join(["%s"] * len(doclist))), # nosec
tuple([doc.fieldname, *doclist]),
)
budget_against_property = frappe.get_doc("Property Setter", "Budget-budget_against-options")
@@ -243,7 +238,6 @@ def get_doctypes_with_dimensions():
def get_accounting_dimensions(as_list=True, filters=None):
if not filters:
filters = {"disabled": 0}
@@ -261,18 +255,19 @@ def get_accounting_dimensions(as_list=True, filters=None):
def get_checks_for_pl_and_bs_accounts():
dimensions = frappe.db.sql(
"""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c
WHERE p.name = c.parent""",
as_dict=1,
)
if frappe.flags.accounting_dimensions_details is None:
# nosemgrep
frappe.flags.accounting_dimensions_details = frappe.db.sql(
"""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c
WHERE p.name = c.parent""",
as_dict=1,
)
return dimensions
return frappe.flags.accounting_dimensions_details
def get_dimension_with_children(doctype, dimensions):
if isinstance(dimensions, str):
dimensions = [dimensions]
@@ -280,9 +275,7 @@ def get_dimension_with_children(doctype, dimensions):
for dimension in dimensions:
lft, rgt = frappe.db.get_value(doctype, dimension, ["lft", "rgt"])
children = frappe.get_all(
doctype, filters={"lft": [">=", lft], "rgt": ["<=", rgt]}, order_by="lft"
)
children = frappe.get_all(doctype, filters={"lft": [">=", lft], "rgt": ["<=", rgt]}, order_by="lft")
all_dimensions += [c.name for c in children]
return all_dimensions
@@ -290,14 +283,10 @@ def get_dimension_with_children(doctype, dimensions):
@frappe.whitelist()
def get_dimensions(with_cost_center_and_project=False):
c = frappe.qb.DocType("Accounting Dimension Detail")
p = frappe.qb.DocType("Accounting Dimension")
dimension_filters = (
frappe.qb.from_(p)
.select(p.label, p.fieldname, p.document_type)
.where(p.disabled == 0)
.run(as_dict=1)
frappe.qb.from_(p).select(p.label, p.fieldname, p.document_type).where(p.disabled == 0).run(as_dict=1)
)
default_dimensions = (
frappe.qb.from_(c)

View File

@@ -78,6 +78,8 @@ class TestAccountingDimension(unittest.TestCase):
def tearDown(self):
disable_dimension()
frappe.flags.accounting_dimensions_details = None
frappe.flags.dimension_filter_map = None
def create_dimension():

View File

@@ -1,4 +1,5 @@
{
"actions": [],
"creation": "2019-07-16 17:53:18.718831",
"doctype": "DocType",
"editable_grid": 1,
@@ -73,13 +74,15 @@
}
],
"istable": 1,
"modified": "2019-08-15 11:59:09.389891",
"links": [],
"modified": "2024-03-27 13:05:57.056874",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Dimension Detail",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -94,7 +94,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-06-07 14:59:41.869117",
"modified": "2024-03-27 13:05:57.199186",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Dimension Filter",
@@ -139,7 +139,7 @@
}
],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

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

View File

@@ -47,6 +47,8 @@ class TestAccountingDimensionFilter(unittest.TestCase):
def tearDown(self):
disable_dimension_filter()
disable_dimension()
frappe.flags.accounting_dimensions_details = None
frappe.flags.dimension_filter_map = None
for si in self.invoice_list:
si.load_from_db()
@@ -55,9 +57,7 @@ class TestAccountingDimensionFilter(unittest.TestCase):
def create_accounting_dimension_filter():
if not frappe.db.get_value(
"Accounting Dimension Filter", {"accounting_dimension": "Cost Center"}
):
if not frappe.db.get_value("Accounting Dimension Filter", {"accounting_dimension": "Cost Center"}):
frappe.get_doc(
{
"doctype": "Accounting Dimension Filter",

View File

@@ -1,317 +1,112 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"actions": [],
"autoname": "field:period_name",
"beta": 0,
"creation": "2018-04-13 18:50:14.672323",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"period_name",
"start_date",
"end_date",
"column_break_4",
"company",
"section_break_7",
"closed_documents"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "period_name",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Period Name",
"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
"unique": 1
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "start_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Start Date",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "end_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "End Date",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_4",
"fieldtype": "Column Break",
"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,
"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
"fieldtype": "Column Break"
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_7",
"fieldtype": "Section Break",
"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,
"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
"fieldtype": "Section Break"
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "closed_documents",
"fieldtype": "Table",
"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": "Closed Documents",
"length": 0,
"no_copy": 0,
"options": "Closed Document",
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-08-01 19:14:47.593753",
"links": [],
"modified": "2024-03-27 13:05:57.388109",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Period",
"name_case": "",
"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": 0,
"write": 1
},
{
"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": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"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": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
"states": [],
"track_changes": 1
}

View File

@@ -84,7 +84,10 @@ class AccountingPeriod(Document):
for doctype_for_closing in self.get_doctypes_for_closing():
self.append(
"closed_documents",
{"document_type": doctype_for_closing.document_type, "closed": doctype_for_closing.closed},
{
"document_type": doctype_for_closing.document_type,
"closed": doctype_for_closing.closed,
},
)

View File

@@ -34,9 +34,7 @@ class TestAccountingPeriod(unittest.TestCase):
ap1 = create_accounting_period(period_name="Test Accounting Period 2")
ap1.save()
doc = create_sales_invoice(
do_not_save=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC"
)
doc = create_sales_invoice(do_not_save=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC")
self.assertRaises(ClosedAccountingPeriod, doc.save)
def tearDown(self):

View File

@@ -461,7 +461,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2024-01-30 14:04:26.553554",
"modified": "2024-03-27 13:05:57.568638",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",
@@ -486,7 +486,7 @@
}
],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"track_changes": 1

View File

@@ -45,12 +45,13 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-11-25 10:27:51.712286",
"modified": "2024-03-27 13:05:58.308002",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Advance Tax",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC"
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -179,12 +179,13 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-11-25 11:10:10.945027",
"modified": "2024-03-27 13:05:58.437605",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Advance Taxes and Charges",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_order": "ASC"
"sort_field": "creation",
"sort_order": "ASC",
"states": []
}

View File

@@ -14,30 +14,27 @@
"fieldtype": "Link",
"label": "Accounting Dimension",
"options": "DocType",
"read_only": 1,
"show_days": 1,
"show_seconds": 1
"read_only": 1
},
{
"fieldname": "dimension_value",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"options": "accounting_dimension",
"show_days": 1,
"show_seconds": 1
"options": "accounting_dimension"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2020-11-23 09:56:19.744200",
"modified": "2024-03-27 13:05:58.587487",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Allowed Dimension",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -20,14 +20,14 @@
],
"istable": 1,
"links": [],
"modified": "2024-01-03 11:13:02.669632",
"modified": "2024-03-27 13:05:58.698893",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Allowed To Transact With",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -15,9 +15,7 @@
"in_list_view": 1,
"label": "Accounts",
"options": "Account",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"columns": 2,
@@ -25,22 +23,21 @@
"fieldname": "is_mandatory",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Is Mandatory",
"show_days": 1,
"show_seconds": 1
"label": "Is Mandatory"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2020-11-22 19:55:13.324136",
"modified": "2024-03-27 13:05:59.168897",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Applicable On Account",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -101,7 +101,7 @@
}
],
"links": [],
"modified": "2020-07-17 14:00:13.105433",
"modified": "2024-03-27 13:06:36.896195",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank",
@@ -121,7 +121,8 @@
}
],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -209,7 +209,7 @@
}
],
"links": [],
"modified": "2023-09-22 21:31:34.763977",
"modified": "2024-03-27 13:06:37.049542",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Account",
@@ -242,7 +242,7 @@
}
],
"search_fields": "bank,account",
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -54,6 +54,7 @@ class BankAccount(Document):
self.validate_company()
self.validate_iban()
self.validate_account()
self.update_default_bank_account()
def validate_account(self):
if self.account:
@@ -100,19 +101,51 @@ class BankAccount(Document):
if to_check % 97 != 1:
frappe.throw(_("IBAN is not valid"))
def update_default_bank_account(self):
if self.is_default and not self.disabled:
frappe.db.set_value(
"Bank Account",
{
"party_type": self.party_type,
"party": self.party,
"is_company_account": self.is_company_account,
"is_default": 1,
"disabled": 0,
},
"is_default",
0,
)
@frappe.whitelist()
def make_bank_account(doctype, docname):
doc = frappe.new_doc("Bank Account")
doc.party_type = doctype
doc.party = docname
doc.is_default = 1
return doc
def get_party_bank_account(party_type, party):
return frappe.db.get_value(party_type, party, "default_bank_account")
return frappe.db.get_value(
"Bank Account",
{"party_type": party_type, "party": party, "is_default": 1, "disabled": 0},
"name",
)
def get_default_company_bank_account(company, party_type, party):
default_company_bank_account = frappe.db.get_value(party_type, party, "default_bank_account")
if default_company_bank_account:
if company != frappe.get_cached_value("Bank Account", default_company_bank_account, "company"):
default_company_bank_account = None
if not default_company_bank_account:
default_company_bank_account = frappe.db.get_value(
"Bank Account", {"company": company, "is_company_account": 1, "is_default": 1}
)
return default_company_bank_account
@frappe.whitelist()

View File

@@ -37,11 +37,11 @@ class TestBankAccount(unittest.TestCase):
try:
bank_account.validate_iban()
except ValidationError:
msg = "BankAccount.validate_iban() failed for valid IBAN {}".format(iban)
msg = f"BankAccount.validate_iban() failed for valid IBAN {iban}"
self.fail(msg=msg)
for not_iban in invalid_ibans:
bank_account.iban = not_iban
msg = "BankAccount.validate_iban() accepted invalid IBAN {}".format(not_iban)
msg = f"BankAccount.validate_iban() accepted invalid IBAN {not_iban}"
with self.assertRaises(ValidationError, msg=msg):
bank_account.validate_iban()

View File

@@ -1,134 +1,69 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"actions": [],
"allow_import": 1,
"allow_rename": 1,
"autoname": "field:account_subtype",
"beta": 0,
"creation": "2018-10-25 15:46:08.054586",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"account_subtype"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_subtype",
"fieldtype": "Data",
"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": "Account Subtype",
"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": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-10-25 15:47:03.841390",
"links": [],
"modified": "2024-03-27 13:06:37.221876",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Account Subtype",
"name_case": "",
"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": 0,
"write": 1
},
{
"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": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"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": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
"states": []
}

View File

@@ -19,7 +19,7 @@
}
],
"links": [],
"modified": "2020-04-10 21:13:09.137898",
"modified": "2024-03-27 13:06:37.347035",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Account Type",
@@ -63,6 +63,7 @@
}
],
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC"
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -91,7 +91,7 @@
"idx": 1,
"issingle": 1,
"links": [],
"modified": "2022-11-28 17:24:13.008692",
"modified": "2024-03-27 13:06:37.477927",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Clearance",
@@ -107,7 +107,7 @@
],
"quick_entry": 1,
"read_only": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": []
}

View File

@@ -127,7 +127,7 @@ def get_payment_entries_for_bank_clearance(
condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')"
journal_entries = frappe.db.sql(
"""
f"""
select
"Journal Entry" as payment_document, t1.name as payment_entry,
t1.cheque_no as cheque_number, t1.cheque_date,
@@ -141,9 +141,7 @@ def get_payment_entries_for_bank_clearance(
and ifnull(t1.is_opening, 'No') = 'No' {condition}
group by t2.account, t1.name
order by t1.posting_date ASC, t1.name DESC
""".format(
condition=condition
),
""",
{"account": account, "from": from_date, "to": to_date},
as_dict=1,
)
@@ -152,7 +150,7 @@ def get_payment_entries_for_bank_clearance(
condition += "and bank_account = %(bank_account)s"
payment_entries = frappe.db.sql(
"""
f"""
select
"Payment Entry" as payment_document, name as payment_entry,
reference_no as cheque_number, reference_date as cheque_date,
@@ -167,9 +165,7 @@ def get_payment_entries_for_bank_clearance(
{condition}
order by
posting_date ASC, name DESC
""".format(
condition=condition
),
""",
{
"account": account,
"from": from_date,
@@ -239,10 +235,7 @@ def get_payment_entries_for_bank_clearance(
).run(as_dict=True)
entries = (
list(payment_entries)
+ list(journal_entries)
+ list(pos_sales_invoices)
+ list(pos_purchase_invoices)
list(payment_entries) + list(journal_entries) + list(pos_sales_invoices) + list(pos_purchase_invoices)
)
return entries

View File

@@ -68,9 +68,7 @@ class TestBankClearance(unittest.TestCase):
)
loan.submit()
make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=getdate())
repayment_entry = create_repayment_entry(
loan.name, "_Test Customer", getdate(), loan.loan_amount
)
repayment_entry = create_repayment_entry(loan.name, "_Test Customer", getdate(), loan.loan_amount)
repayment_entry.save()
repayment_entry.submit()

View File

@@ -1,340 +1,112 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2013-02-22 01:27:37",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"payment_document",
"payment_entry",
"against_account",
"amount",
"column_break_5",
"posting_date",
"cheque_number",
"cheque_date",
"clearance_date"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_document",
"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": "Payment Document",
"length": 0,
"no_copy": 0,
"options": "DocType",
"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": "DocType"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 2,
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Payment Entry",
"length": 0,
"no_copy": 0,
"oldfieldname": "voucher_id",
"oldfieldtype": "Link",
"options": "payment_document",
"permlevel": 0,
"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,
"width": "50"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 2,
"fieldname": "against_account",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Against Account",
"length": 0,
"no_copy": 0,
"oldfieldname": "against_account",
"oldfieldtype": "Data",
"permlevel": 0,
"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,
"width": "15"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 2,
"fieldname": "amount",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Amount",
"length": 0,
"no_copy": 0,
"oldfieldname": "debit",
"oldfieldtype": "Currency",
"options": "",
"permlevel": 0,
"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": "column_break_5",
"fieldtype": "Column Break",
"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,
"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,
"width": "50%"
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 2,
"fieldname": "posting_date",
"fieldtype": "Date",
"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": "Posting Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "posting_date",
"oldfieldtype": "Date",
"permlevel": 0,
"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": 2,
"fieldname": "cheque_number",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Cheque Number",
"length": 0,
"no_copy": 0,
"oldfieldname": "cheque_number",
"oldfieldtype": "Data",
"permlevel": 0,
"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": "cheque_date",
"fieldtype": "Date",
"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": "Cheque Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "cheque_date",
"oldfieldtype": "Date",
"permlevel": 0,
"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": 2,
"fieldname": "clearance_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Clearance Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "clearance_date",
"oldfieldtype": "Date",
"permlevel": 0,
"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
"oldfieldtype": "Date"
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 1,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"menu_index": 0,
"modified": "2019-01-07 16:52:07.174687",
"links": [],
"modified": "2024-03-27 13:06:37.609319",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Clearance Detail",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "creation",
"sort_order": "ASC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
"states": []
}

File diff suppressed because it is too large Load Diff

View File

@@ -26,6 +26,7 @@
{
"fieldname": "company",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Company",
"options": "Company"
},
@@ -118,7 +119,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-03-07 11:02:24.535714",
"modified": "2024-04-28 14:40:50.910884",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Reconciliation Tool",
@@ -136,7 +137,7 @@
}
],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -9,7 +9,6 @@ from frappe import _
from frappe.model.document import Document
from frappe.query_builder.custom import ConstantColumn
from frappe.utils import cint, flt
from pypika.terms import Parameter
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.bank_transaction.bank_transaction import get_total_allocated_amount
@@ -82,9 +81,7 @@ def get_bank_transactions(bank_account, from_date=None, to_date=None):
def get_account_balance(bank_account, till_date):
# returns account balance till the specified date
account = frappe.db.get_value("Bank Account", bank_account, "account")
filters = frappe._dict(
{"account": account, "report_date": till_date, "include_pos_transactions": 1}
)
filters = frappe._dict({"account": account, "report_date": till_date, "include_pos_transactions": 1})
data = get_entries(filters)
balance_as_per_system = get_balance_on(filters["account"], filters["report_date"])
@@ -97,10 +94,7 @@ def get_account_balance(bank_account, till_date):
amounts_not_reflected_in_system = get_amounts_not_reflected_in_system(filters)
bank_bal = (
flt(balance_as_per_system)
- flt(total_debit)
+ flt(total_credit)
+ amounts_not_reflected_in_system
flt(balance_as_per_system) - flt(total_debit) + flt(total_credit) + amounts_not_reflected_in_system
)
return bank_bal
@@ -509,6 +503,18 @@ def check_matching(
to_reference_date,
):
exact_match = True if "exact_match" in document_types else False
common_filters = frappe._dict(
{
"amount": transaction.unallocated_amount,
"payment_type": "Receive" if transaction.deposit > 0.0 else "Pay",
"reference_no": transaction.reference_number,
"party_type": transaction.party_type,
"party": transaction.party,
"bank_account": bank_account,
}
)
queries = get_queries(
bank_account,
company,
@@ -520,24 +526,14 @@ def check_matching(
from_reference_date,
to_reference_date,
exact_match,
common_filters,
)
filters = {
"amount": transaction.unallocated_amount,
"payment_type": "Receive" if transaction.deposit > 0.0 else "Pay",
"reference_no": transaction.reference_number,
"party_type": transaction.party_type,
"party": transaction.party,
"bank_account": bank_account,
}
matching_vouchers = []
for query in queries:
matching_vouchers.extend(frappe.db.sql(query, filters, as_dict=True))
matching_vouchers.extend(query.run(as_dict=True))
return (
sorted(matching_vouchers, key=lambda x: x["rank"], reverse=True) if matching_vouchers else []
)
return sorted(matching_vouchers, key=lambda x: x["rank"], reverse=True) if matching_vouchers else []
def get_queries(
@@ -551,6 +547,7 @@ def get_queries(
from_reference_date,
to_reference_date,
exact_match,
common_filters,
):
# get queries to get matching vouchers
account_from_to = "paid_to" if transaction.deposit > 0.0 else "paid_from"
@@ -571,6 +568,7 @@ def get_queries(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
)
or []
)
@@ -590,6 +588,7 @@ def get_matching_queries(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
):
queries = []
currency = get_account_currency(bank_account)
@@ -604,6 +603,7 @@ def get_matching_queries(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
)
queries.append(query)
@@ -616,16 +616,17 @@ def get_matching_queries(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
)
queries.append(query)
if transaction.deposit > 0.0 and "sales_invoice" in document_types:
query = get_si_matching_query(exact_match, currency)
query = get_si_matching_query(exact_match, currency, common_filters)
queries.append(query)
if transaction.withdrawal > 0.0:
if "purchase_invoice" in document_types:
query = get_pi_matching_query(exact_match, currency)
query = get_pi_matching_query(exact_match, currency, common_filters)
queries.append(query)
if "bank_transaction" in document_types:
@@ -646,17 +647,13 @@ def get_bt_matching_query(exact_match, transaction):
amount_rank = frappe.qb.terms.Case().when(amount_equality, 1).else_(0)
amount_condition = amount_equality if exact_match else getattr(bt, field) > 0.0
ref_rank = (
frappe.qb.terms.Case().when(bt.reference_number == transaction.reference_number, 1).else_(0)
)
ref_rank = frappe.qb.terms.Case().when(bt.reference_number == transaction.reference_number, 1).else_(0)
unallocated_rank = (
frappe.qb.terms.Case().when(bt.unallocated_amount == transaction.unallocated_amount, 1).else_(0)
)
party_condition = (
(bt.party_type == transaction.party_type)
& (bt.party == transaction.party)
& bt.party.isnotnull()
(bt.party_type == transaction.party_type) & (bt.party == transaction.party) & bt.party.isnotnull()
)
party_rank = frappe.qb.terms.Case().when(party_condition, 1).else_(0)
@@ -680,7 +677,7 @@ def get_bt_matching_query(exact_match, transaction):
.where(amount_condition)
.where(bt.docstatus == 1)
)
return str(query)
return query
def get_pe_matching_query(
@@ -692,6 +689,7 @@ def get_pe_matching_query(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
):
# get matching payment entries query
to_from = "to" if transaction.deposit > 0.0 else "from"
@@ -707,9 +705,7 @@ def get_pe_matching_query(
amount_condition = amount_equality if exact_match else pe.paid_amount > 0.0
party_condition = (
(pe.party_type == transaction.party_type)
& (pe.party == transaction.party)
& pe.party.isnotnull()
(pe.party_type == transaction.party_type) & (pe.party == transaction.party) & pe.party.isnotnull()
)
party_rank = frappe.qb.terms.Case().when(party_condition, 1).else_(0)
@@ -723,7 +719,7 @@ def get_pe_matching_query(
(ref_rank + amount_rank + party_rank + 1).as_("rank"),
ConstantColumn("Payment Entry").as_("doctype"),
pe.name,
pe.paid_amount,
pe.paid_amount_after_tax.as_("paid_amount"),
pe.reference_no,
pe.reference_date,
pe.party,
@@ -734,16 +730,16 @@ def get_pe_matching_query(
.where(pe.docstatus == 1)
.where(pe.payment_type.isin([payment_type, "Internal Transfer"]))
.where(pe.clearance_date.isnull())
.where(getattr(pe, account_from_to) == Parameter("%(bank_account)s"))
.where(getattr(pe, account_from_to) == common_filters.bank_account)
.where(amount_condition)
.where(filter_by_date)
.orderby(pe.reference_date if cint(filter_by_reference_date) else pe.posting_date)
)
if frappe.flags.auto_reconcile_vouchers == True:
if frappe.flags.auto_reconcile_vouchers is True:
query = query.where(ref_condition)
return str(query)
return query
def get_je_matching_query(
@@ -754,6 +750,7 @@ def get_je_matching_query(
filter_by_reference_date,
from_reference_date,
to_reference_date,
common_filters,
):
# get matching journal entry query
# We have mapping at the bank level
@@ -793,29 +790,29 @@ def get_je_matching_query(
.where(je.docstatus == 1)
.where(je.voucher_type != "Opening Entry")
.where(je.clearance_date.isnull())
.where(jea.account == Parameter("%(bank_account)s"))
.where(jea.account == common_filters.bank_account)
.where(amount_equality if exact_match else getattr(jea, amount_field) > 0.0)
.where(je.docstatus == 1)
.where(filter_by_date)
.orderby(je.cheque_date if cint(filter_by_reference_date) else je.posting_date)
)
if frappe.flags.auto_reconcile_vouchers == True:
if frappe.flags.auto_reconcile_vouchers is True:
query = query.where(ref_condition)
return str(query)
return query
def get_si_matching_query(exact_match, currency):
def get_si_matching_query(exact_match, currency, common_filters):
# get matching sales invoice query
si = frappe.qb.DocType("Sales Invoice")
sip = frappe.qb.DocType("Sales Invoice Payment")
amount_equality = sip.amount == Parameter("%(amount)s")
amount_equality = sip.amount == common_filters.amount
amount_rank = frappe.qb.terms.Case().when(amount_equality, 1).else_(0)
amount_condition = amount_equality if exact_match else sip.amount > 0.0
party_condition = si.customer == Parameter("%(party)s")
party_condition = si.customer == common_filters.party
party_rank = frappe.qb.terms.Case().when(party_condition, 1).else_(0)
query = (
@@ -836,23 +833,23 @@ def get_si_matching_query(exact_match, currency):
)
.where(si.docstatus == 1)
.where(sip.clearance_date.isnull())
.where(sip.account == Parameter("%(bank_account)s"))
.where(sip.account == common_filters.bank_account)
.where(amount_condition)
.where(si.currency == currency)
)
return str(query)
return query
def get_pi_matching_query(exact_match, currency):
def get_pi_matching_query(exact_match, currency, common_filters):
# get matching purchase invoice query when they are also used as payment entries (is_paid)
purchase_invoice = frappe.qb.DocType("Purchase Invoice")
amount_equality = purchase_invoice.paid_amount == Parameter("%(amount)s")
amount_equality = purchase_invoice.paid_amount == common_filters.amount
amount_rank = frappe.qb.terms.Case().when(amount_equality, 1).else_(0)
amount_condition = amount_equality if exact_match else purchase_invoice.paid_amount > 0.0
party_condition = purchase_invoice.supplier == Parameter("%(party)s")
party_condition = purchase_invoice.supplier == common_filters.party
party_rank = frappe.qb.terms.Case().when(party_condition, 1).else_(0)
query = (
@@ -872,9 +869,9 @@ def get_pi_matching_query(exact_match, currency):
.where(purchase_invoice.docstatus == 1)
.where(purchase_invoice.is_paid == 1)
.where(purchase_invoice.clearance_date.isnull())
.where(purchase_invoice.cash_bank_account == Parameter("%(bank_account)s"))
.where(purchase_invoice.cash_bank_account == common_filters.bank_account)
.where(amount_condition)
.where(purchase_invoice.currency == currency)
)
return str(query)
return query

View File

@@ -1,12 +1,11 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
import frappe
from frappe import qb
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, getdate, today
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, today
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
auto_reconcile_vouchers,
@@ -22,7 +21,7 @@ class TestBankReconciliationTool(AccountsTestMixin, FrappeTestCase):
self.create_customer()
self.clear_old_entries()
bank_dt = qb.DocType("Bank")
q = qb.from_(bank_dt).delete().where(bank_dt.name == "HDFC").run()
qb.from_(bank_dt).delete().where(bank_dt.name == "HDFC").run()
self.create_bank_account()
def tearDown(self):

View File

@@ -202,7 +202,7 @@
],
"hide_toolbar": 1,
"links": [],
"modified": "2022-09-07 11:11:40.293317",
"modified": "2024-03-27 13:06:38.098765",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Statement Import",
@@ -221,7 +221,8 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -45,7 +45,7 @@ class BankStatementImport(DataImport):
# end: auto-generated types
def __init__(self, *args, **kwargs):
super(BankStatementImport, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
def validate(self):
doc_before_save = self.get_doc_before_save()
@@ -54,7 +54,6 @@ class BankStatementImport(DataImport):
or (doc_before_save and doc_before_save.import_file != self.import_file)
or (doc_before_save and doc_before_save.google_sheets_url != self.google_sheets_url)
):
template_options_dict = {}
column_to_field_map = {}
bank = frappe.get_doc("Bank", self.bank)
@@ -69,7 +68,6 @@ class BankStatementImport(DataImport):
self.validate_google_sheets_url()
def start_import(self):
preview = frappe.get_doc("Bank Statement Import", self.name).get_preview_from_template(
self.import_file, self.google_sheets_url
)
@@ -126,7 +124,7 @@ def download_errored_template(data_import_name):
def parse_data_from_template(raw_data):
data = []
for i, row in enumerate(raw_data):
for _i, row in enumerate(raw_data):
if all(v in INVALID_VALUES for v in row):
# empty row
continue
@@ -136,9 +134,7 @@ def parse_data_from_template(raw_data):
return data
def start_import(
data_import, bank_account, import_file_path, google_sheets_url, bank, template_options
):
def start_import(data_import, bank_account, import_file_path, google_sheets_url, bank, template_options):
"""This method runs in background job"""
update_mapping_db(bank, template_options)
@@ -149,6 +145,9 @@ def start_import(
import_file = ImportFile("Bank Transaction", file=file, import_type="Insert New Records")
data = parse_data_from_template(import_file.raw_data)
# Importer expects 'Data Import' class, which has 'payload_count' attribute
if not data_import.get("payload_count"):
data_import.payload_count = len(data) - 1
if import_file_path:
add_bank_account(data, bank_account)

View File

@@ -1,5 +1,3 @@
from typing import Tuple, Union
import frappe
from frappe.utils import flt
from rapidfuzz import fuzz, process
@@ -19,7 +17,7 @@ class AutoMatchParty:
def get(self, key):
return self.__dict__.get(key, None)
def match(self) -> Union[Tuple, None]:
def match(self) -> tuple | None:
result = None
result = AutoMatchbyAccountIBAN(
bank_party_account_number=self.bank_party_account_number,
@@ -50,7 +48,7 @@ class AutoMatchbyAccountIBAN:
result = self.match_account_in_party()
return result
def match_account_in_party(self) -> Union[Tuple, None]:
def match_account_in_party(self) -> tuple | None:
"""Check if there is a IBAN/Account No. match in Customer/Supplier/Employee"""
result = None
parties = get_parties_in_order(self.deposit)
@@ -97,7 +95,7 @@ class AutoMatchbyPartyNameDescription:
def get(self, key):
return self.__dict__.get(key, None)
def match(self) -> Union[Tuple, None]:
def match(self) -> tuple | None:
# fuzzy search by customer/supplier & employee
if not (self.bank_party_name or self.description):
return None
@@ -105,7 +103,7 @@ class AutoMatchbyPartyNameDescription:
result = self.match_party_name_desc_in_party()
return result
def match_party_name_desc_in_party(self) -> Union[Tuple, None]:
def match_party_name_desc_in_party(self) -> tuple | None:
"""Fuzzy search party name and/or description against parties in the system"""
result = None
parties = get_parties_in_order(self.deposit)
@@ -130,7 +128,7 @@ class AutoMatchbyPartyNameDescription:
return result
def fuzzy_search_and_return_result(self, party, names, field) -> Union[Tuple, None]:
def fuzzy_search_and_return_result(self, party, names, field) -> tuple | None:
skip = False
result = process.extract(
query=self.get(field),
@@ -147,7 +145,7 @@ class AutoMatchbyPartyNameDescription:
party_name,
), skip
def process_fuzzy_result(self, result: Union[list, None]):
def process_fuzzy_result(self, result: list | None):
"""
If there are multiple valid close matches return None as result may be faulty.
Return the result only if one accurate match stands out.

View File

@@ -56,17 +56,19 @@ class BankTransaction(Document):
Bank Transaction should be on the same currency as the Bank Account.
"""
if self.currency and self.bank_account:
account = frappe.get_cached_value("Bank Account", self.bank_account, "account")
account_currency = frappe.get_cached_value("Account", account, "account_currency")
if account := frappe.get_cached_value("Bank Account", self.bank_account, "account"):
account_currency = frappe.get_cached_value("Account", account, "account_currency")
if self.currency != account_currency:
frappe.throw(
_(
"Transaction currency: {0} cannot be different from Bank Account({1}) currency: {2}"
).format(
frappe.bold(self.currency), frappe.bold(self.bank_account), frappe.bold(account_currency)
if self.currency != account_currency:
frappe.throw(
_(
"Transaction currency: {0} cannot be different from Bank Account({1}) currency: {2}"
).format(
frappe.bold(self.currency),
frappe.bold(self.bank_account),
frappe.bold(account_currency),
)
)
)
def set_status(self):
if self.docstatus == 2:
@@ -180,7 +182,7 @@ class BankTransaction(Document):
frappe.throw(_("Voucher {0} is over-allocated by {1}").format(unallocated_amount))
for payment_entry in to_remove:
self.remove(to_remove)
self.remove(payment_entry)
@frappe.whitelist()
def remove_payment_entries(self):
@@ -235,9 +237,7 @@ def get_clearance_details(transaction, payment_entry):
"""
gl_bank_account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
gles = get_related_bank_gl_entries(payment_entry.payment_document, payment_entry.payment_entry)
bt_allocations = get_total_allocated_amount(
payment_entry.payment_document, payment_entry.payment_entry
)
bt_allocations = get_total_allocated_amount(payment_entry.payment_document, payment_entry.payment_entry)
unallocated_amount = min(
transaction.unallocated_amount,
@@ -332,7 +332,6 @@ def get_total_allocated_amount(doctype, docname):
def get_paid_amount(payment_entry, currency, gl_bank_account):
if payment_entry.payment_document in ["Payment Entry", "Sales Invoice", "Purchase Invoice"]:
paid_amount_field = "paid_amount"
if payment_entry.payment_document == "Payment Entry":
doc = frappe.get_doc("Payment Entry", payment_entry.payment_entry)
@@ -371,9 +370,7 @@ def get_paid_amount(payment_entry, currency, gl_bank_account):
)
elif payment_entry.payment_document == "Loan Repayment":
return frappe.db.get_value(
payment_entry.payment_document, payment_entry.payment_entry, "amount_paid"
)
return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "amount_paid")
elif payment_entry.payment_document == "Bank Transaction":
dep, wth = frappe.db.get_value(
@@ -383,9 +380,7 @@ def get_paid_amount(payment_entry, currency, gl_bank_account):
else:
frappe.throw(
"Please reconcile {0}: {1} manually".format(
payment_entry.payment_document, payment_entry.payment_entry
)
f"Please reconcile {payment_entry.payment_document}: {payment_entry.payment_entry} manually"
)

View File

@@ -18,12 +18,12 @@ def upload_bank_statement():
fcontent = frappe.local.uploaded_file
fname = frappe.local.uploaded_filename
if frappe.safe_encode(fname).lower().endswith("csv".encode("utf-8")):
if frappe.safe_encode(fname).lower().endswith(b"csv"):
from frappe.utils.csvutils import read_csv_content
rows = read_csv_content(fcontent, False)
elif frappe.safe_encode(fname).lower().endswith("xlsx".encode("utf-8")):
elif frappe.safe_encode(fname).lower().endswith(b"xlsx"):
from frappe.utils.xlsxutils import read_xlsx_file_from_attached_file
rows = read_xlsx_file_from_attached_file(fcontent=fcontent)

View File

@@ -436,9 +436,7 @@ def add_vouchers(gl_account="_Test Bank - _TC"):
mode_of_payment = frappe.get_doc({"doctype": "Mode of Payment", "name": "Cash"})
if not frappe.db.get_value(
"Mode of Payment Account", {"company": "_Test Company", "parent": "Cash"}
):
if not frappe.db.get_value("Mode of Payment Account", {"company": "_Test Company", "parent": "Cash"}):
mode_of_payment.append("accounts", {"company": "_Test Company", "default_account": gl_account})
mode_of_payment.save()

View File

@@ -1,107 +1,38 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2018-10-24 15:24:56.713277",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"bank_transaction_field",
"file_field"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "bank_transaction_field",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Field in Bank Transaction",
"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,
"fieldname": "file_field",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Column in Bank File",
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-10-24 15:24:56.713277",
"links": [],
"modified": "2024-03-27 13:06:38.436517",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Mapping",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
"states": []
}

View File

@@ -1,115 +1,38 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2018-11-28 08:55:40.815355",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"payment_document",
"payment_entry",
"allocated_amount",
"clearance_date"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_document",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Payment Document",
"length": 0,
"no_copy": 0,
"options": "DocType",
"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,
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Payment Entry",
"length": 0,
"no_copy": 0,
"options": "payment_document",
"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,
"fieldname": "allocated_amount",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Allocated Amount",
"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
},
{
"depends_on": "eval:doc.docstatus==1",
@@ -121,30 +44,17 @@
"read_only": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2020-01-22 00:00:00.000000",
"links": [],
"modified": "2024-03-27 13:06:38.549438",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Payments",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
"states": [],
"track_changes": 1
}

View File

@@ -170,7 +170,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-12-01 16:49:54.073890",
"modified": "2024-03-27 13:06:39.619458",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bisect Accounting Statements",
@@ -188,7 +188,7 @@
}
],
"read_only": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -70,7 +70,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-12-01 17:46:12.437996",
"modified": "2024-03-27 13:06:39.766063",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bisect Nodes",
@@ -91,7 +91,7 @@
}
],
"read_only": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -207,7 +207,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-10-10 22:14:36.361509",
"modified": "2024-03-27 13:06:42.675933",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget",
@@ -231,7 +231,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -70,10 +70,11 @@ class Budget(Document):
select
b.name, ba.account from `tabBudget` b, `tabBudget Account` ba
where
ba.parent = b.name and b.docstatus < 2 and b.company = %s and %s=%s and
b.fiscal_year=%s and b.name != %s and ba.account in (%s) """
% ("%s", budget_against_field, "%s", "%s", "%s", ",".join(["%s"] * len(accounts))),
(self.company, budget_against, self.fiscal_year, self.name) + tuple(accounts),
ba.parent = b.name and b.docstatus < 2 and b.company = {} and {}={} and
b.fiscal_year={} and b.name != {} and ba.account in ({}) """.format(
"%s", budget_against_field, "%s", "%s", "%s", ",".join(["%s"] * len(accounts))
),
(self.company, budget_against, self.fiscal_year, self.name, *tuple(accounts)),
as_dict=1,
)
@@ -96,12 +97,14 @@ class Budget(Document):
if account_details.is_group:
frappe.throw(_("Budget cannot be assigned against Group Account {0}").format(d.account))
elif account_details.company != self.company:
frappe.throw(_("Account {0} does not belongs to company {1}").format(d.account, self.company))
frappe.throw(
_("Account {0} does not belongs to company {1}").format(d.account, self.company)
)
elif account_details.report_type != "Profit and Loss":
frappe.throw(
_("Budget cannot be assigned against {0}, as it's not an Income or Expense account").format(
d.account
)
_(
"Budget cannot be assigned against {0}, as it's not an Income or Expense account"
).format(d.account)
)
if d.account in account_list:
@@ -139,6 +142,8 @@ class Budget(Document):
def validate_expense_against_budget(args, expense_amount=0):
args = frappe._dict(args)
if not frappe.get_all("Budget", limit=1):
return
if args.get("company") and not args.fiscal_year:
args.fiscal_year = get_fiscal_year(args.get("posting_date"), company=args.get("company"))[0]
@@ -146,6 +151,9 @@ def validate_expense_against_budget(args, expense_amount=0):
"Company", args.get("company"), "exception_budget_approver_role"
)
if not frappe.get_cached_value("Budget", {"fiscal_year": args.fiscal_year, "company": args.company}): # nosec
return
if not args.account:
args.account = args.get("expense_account")
@@ -172,32 +180,26 @@ def validate_expense_against_budget(args, expense_amount=0):
if (
args.get(budget_against)
and args.account
and frappe.db.get_value("Account", {"name": args.account, "root_type": "Expense"})
and (frappe.get_cached_value("Account", args.account, "root_type") == "Expense")
):
doctype = dimension.get("document_type")
if frappe.get_cached_value("DocType", doctype, "is_tree"):
lft, rgt = frappe.db.get_value(doctype, args.get(budget_against), ["lft", "rgt"])
condition = """and exists(select name from `tab%s`
where lft<=%s and rgt>=%s and name=b.%s)""" % (
doctype,
lft,
rgt,
budget_against,
) # nosec
lft, rgt = frappe.get_cached_value(doctype, args.get(budget_against), ["lft", "rgt"])
condition = f"""and exists(select name from `tab{doctype}`
where lft<={lft} and rgt>={rgt} and name=b.{budget_against})""" # nosec
args.is_tree = True
else:
condition = "and b.%s=%s" % (budget_against, frappe.db.escape(args.get(budget_against)))
condition = f"and b.{budget_against}={frappe.db.escape(args.get(budget_against))}"
args.is_tree = False
args.budget_against_field = budget_against
args.budget_against_doctype = doctype
budget_records = frappe.db.sql(
"""
f"""
select
b.{budget_against_field} as budget_against, ba.budget_amount, b.monthly_distribution,
b.{budget_against} as budget_against, ba.budget_amount, b.monthly_distribution,
ifnull(b.applicable_on_material_request, 0) as for_material_request,
ifnull(applicable_on_purchase_order, 0) as for_purchase_order,
ifnull(applicable_on_booking_actual_expenses,0) as for_actual_expenses,
@@ -210,9 +212,7 @@ def validate_expense_against_budget(args, expense_amount=0):
b.name=ba.parent and b.fiscal_year=%s
and ba.account=%s and b.docstatus=1
{condition}
""".format(
condition=condition, budget_against_field=budget_against
),
""",
(args.fiscal_year, args.account),
as_dict=True,
) # nosec
@@ -224,12 +224,18 @@ def validate_expense_against_budget(args, expense_amount=0):
def validate_budget_records(args, budget_records, expense_amount):
for budget in budget_records:
if flt(budget.budget_amount):
amount = expense_amount or get_amount(args, budget)
yearly_action, monthly_action = get_actions(args, budget)
args["for_material_request"] = budget.for_material_request
args["for_purchase_order"] = budget.for_purchase_order
if yearly_action in ("Stop", "Warn"):
compare_expense_with_budget(
args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount
args,
flt(budget.budget_amount),
_("Annual"),
yearly_action,
budget.budget_against,
expense_amount,
)
if monthly_action in ["Stop", "Warn"]:
@@ -240,18 +246,32 @@ def validate_budget_records(args, budget_records, expense_amount):
args["month_end_date"] = get_last_day(args.posting_date)
compare_expense_with_budget(
args, budget_amount, _("Accumulated Monthly"), monthly_action, budget.budget_against, amount
args,
budget_amount,
_("Accumulated Monthly"),
monthly_action,
budget.budget_against,
expense_amount,
)
def compare_expense_with_budget(args, budget_amount, action_for, action, budget_against, amount=0):
actual_expense = get_actual_expense(args)
total_expense = actual_expense + amount
args.actual_expense, args.requested_amount, args.ordered_amount = get_actual_expense(args), 0, 0
if not amount:
args.requested_amount, args.ordered_amount = get_requested_amount(args), get_ordered_amount(args)
if args.get("doctype") == "Material Request" and args.for_material_request:
amount = args.requested_amount + args.ordered_amount
elif args.get("doctype") == "Purchase Order" and args.for_purchase_order:
amount = args.ordered_amount
total_expense = args.actual_expense + amount
if total_expense > budget_amount:
if actual_expense > budget_amount:
if args.actual_expense > budget_amount:
error_tense = _("is already")
diff = actual_expense - budget_amount
diff = args.actual_expense - budget_amount
else:
error_tense = _("will be")
diff = total_expense - budget_amount
@@ -268,9 +288,10 @@ def compare_expense_with_budget(args, budget_amount, action_for, action, budget_
frappe.bold(fmt_money(diff, currency=currency)),
)
if (
frappe.flags.exception_approver_role
and frappe.flags.exception_approver_role in frappe.get_roles(frappe.session.user)
msg += get_expense_breakup(args, currency, budget_against)
if frappe.flags.exception_approver_role and frappe.flags.exception_approver_role in frappe.get_roles(
frappe.session.user
):
action = "Warn"
@@ -280,6 +301,83 @@ def compare_expense_with_budget(args, budget_amount, action_for, action, budget_
frappe.msgprint(msg, indicator="orange", title=_("Budget Exceeded"))
def get_expense_breakup(args, currency, budget_against):
msg = "<hr>Total Expenses booked through - <ul>"
common_filters = frappe._dict(
{
args.budget_against_field: budget_against,
"account": args.account,
"company": args.company,
}
)
msg += (
"<li>"
+ frappe.utils.get_link_to_report(
"General Ledger",
label="Actual Expenses",
filters=common_filters.copy().update(
{
"from_date": frappe.get_cached_value("Fiscal Year", args.fiscal_year, "year_start_date"),
"to_date": frappe.get_cached_value("Fiscal Year", args.fiscal_year, "year_end_date"),
"is_cancelled": 0,
}
),
)
+ " - "
+ frappe.bold(fmt_money(args.actual_expense, currency=currency))
+ "</li>"
)
msg += (
"<li>"
+ frappe.utils.get_link_to_report(
"Material Request",
label="Material Requests",
report_type="Report Builder",
doctype="Material Request",
filters=common_filters.copy().update(
{
"status": [["!=", "Stopped"]],
"docstatus": 1,
"material_request_type": "Purchase",
"schedule_date": [["fiscal year", "2023-2024"]],
"item_code": args.item_code,
"per_ordered": [["<", 100]],
}
),
)
+ " - "
+ frappe.bold(fmt_money(args.requested_amount, currency=currency))
+ "</li>"
)
msg += (
"<li>"
+ frappe.utils.get_link_to_report(
"Purchase Order",
label="Unbilled Orders",
report_type="Report Builder",
doctype="Purchase Order",
filters=common_filters.copy().update(
{
"status": [["!=", "Closed"]],
"docstatus": 1,
"transaction_date": [["fiscal year", "2023-2024"]],
"item_code": args.item_code,
"per_billed": [["<", 100]],
}
),
)
+ " - "
+ frappe.bold(fmt_money(args.ordered_amount, currency=currency))
+ "</li></ul>"
)
return msg
def get_actions(args, budget):
yearly_action = budget.action_if_annual_budget_exceeded
monthly_action = budget.action_if_accumulated_monthly_budget_exceeded
@@ -295,31 +393,15 @@ def get_actions(args, budget):
return yearly_action, monthly_action
def get_amount(args, budget):
amount = 0
if args.get("doctype") == "Material Request" and budget.for_material_request:
amount = (
get_requested_amount(args, budget) + get_ordered_amount(args, budget) + get_actual_expense(args)
)
elif args.get("doctype") == "Purchase Order" and budget.for_purchase_order:
amount = get_ordered_amount(args, budget) + get_actual_expense(args)
return amount
def get_requested_amount(args, budget):
def get_requested_amount(args):
item_code = args.get("item_code")
condition = get_other_condition(args, budget, "Material Request")
condition = get_other_condition(args, "Material Request")
data = frappe.db.sql(
""" select ifnull((sum(child.stock_qty - child.ordered_qty) * rate), 0) as amount
from `tabMaterial Request Item` child, `tabMaterial Request` parent where parent.name = child.parent and
child.item_code = %s and parent.docstatus = 1 and child.stock_qty > child.ordered_qty and {0} and
parent.material_request_type = 'Purchase' and parent.status != 'Stopped'""".format(
condition
),
child.item_code = %s and parent.docstatus = 1 and child.stock_qty > child.ordered_qty and {} and
parent.material_request_type = 'Purchase' and parent.status != 'Stopped'""".format(condition),
item_code,
as_list=1,
)
@@ -327,17 +409,15 @@ def get_requested_amount(args, budget):
return data[0][0] if data else 0
def get_ordered_amount(args, budget):
def get_ordered_amount(args):
item_code = args.get("item_code")
condition = get_other_condition(args, budget, "Purchase Order")
condition = get_other_condition(args, "Purchase Order")
data = frappe.db.sql(
""" select ifnull(sum(child.amount - child.billed_amt), 0) as amount
f""" select ifnull(sum(child.amount - child.billed_amt), 0) as amount
from `tabPurchase Order Item` child, `tabPurchase Order` parent where
parent.name = child.parent and child.item_code = %s and parent.docstatus = 1 and child.amount > child.billed_amt
and parent.status != 'Closed' and {0}""".format(
condition
),
and parent.status != 'Closed' and {condition}""",
item_code,
as_list=1,
)
@@ -345,12 +425,12 @@ def get_ordered_amount(args, budget):
return data[0][0] if data else 0
def get_other_condition(args, budget, for_doc):
def get_other_condition(args, for_doc):
condition = "expense_account = '%s'" % (args.expense_account)
budget_against_field = args.get("budget_against_field")
if budget_against_field and args.get(budget_against_field):
condition += " and child.%s = '%s'" % (budget_against_field, args.get(budget_against_field))
condition += f" and child.{budget_against_field} = '{args.get(budget_against_field)}'"
if args.get("fiscal_year"):
date_field = "schedule_date" if for_doc == "Material Request" else "transaction_date"
@@ -358,12 +438,8 @@ def get_other_condition(args, budget, for_doc):
"Fiscal Year", args.get("fiscal_year"), ["year_start_date", "year_end_date"]
)
condition += """ and parent.%s
between '%s' and '%s' """ % (
date_field,
start_date,
end_date,
)
condition += f""" and parent.{date_field}
between '{start_date}' and '{end_date}' """
return condition
@@ -382,21 +458,17 @@ def get_actual_expense(args):
args.update(lft_rgt)
condition2 = """and exists(select name from `tab{doctype}`
condition2 = f"""and exists(select name from `tab{args.budget_against_doctype}`
where lft>=%(lft)s and rgt<=%(rgt)s
and name=gle.{budget_against_field})""".format(
doctype=args.budget_against_doctype, budget_against_field=budget_against_field # nosec
)
and name=gle.{budget_against_field})"""
else:
condition2 = """and exists(select name from `tab{doctype}`
where name=gle.{budget_against} and
gle.{budget_against} = %({budget_against})s)""".format(
doctype=args.budget_against_doctype, budget_against=budget_against_field
)
condition2 = f"""and exists(select name from `tab{args.budget_against_doctype}`
where name=gle.{budget_against_field} and
gle.{budget_against_field} = %({budget_against_field})s)"""
amount = flt(
frappe.db.sql(
"""
f"""
select sum(gle.debit) - sum(gle.credit)
from `tabGL Entry` gle
where
@@ -407,9 +479,7 @@ def get_actual_expense(args):
and gle.company=%(company)s
and gle.docstatus=1
{condition2}
""".format(
condition1=condition1, condition2=condition2
),
""",
(args),
)[0][0]
) # nosec

View File

@@ -41,9 +41,7 @@ class TestBudget(unittest.TestCase):
budget = make_budget(budget_against="Cost Center")
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
@@ -63,9 +61,7 @@ class TestBudget(unittest.TestCase):
budget = make_budget(budget_against="Cost Center")
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
@@ -97,9 +93,7 @@ class TestBudget(unittest.TestCase):
)
fiscal_year = get_fiscal_year(nowdate())[0]
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
frappe.db.set_value("Budget", budget.name, "fiscal_year", fiscal_year)
mr = frappe.get_doc(
@@ -138,9 +132,7 @@ class TestBudget(unittest.TestCase):
)
fiscal_year = get_fiscal_year(nowdate())[0]
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
frappe.db.set_value("Budget", budget.name, "fiscal_year", fiscal_year)
po = create_purchase_order(transaction_date=nowdate(), do_not_submit=True)
@@ -158,9 +150,7 @@ class TestBudget(unittest.TestCase):
budget = make_budget(budget_against="Project")
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
project = frappe.get_value("Project", {"project_name": "_Test Project"})
@@ -223,7 +213,7 @@ class TestBudget(unittest.TestCase):
if month > 9:
month = 9
for i in range(month + 1):
for _i in range(month + 1):
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
"_Test Bank - _TC",
@@ -237,9 +227,7 @@ class TestBudget(unittest.TestCase):
frappe.db.get_value("GL Entry", {"voucher_type": "Journal Entry", "voucher_no": jv.name})
)
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
self.assertRaises(BudgetError, jv.cancel)
@@ -255,7 +243,7 @@ class TestBudget(unittest.TestCase):
month = 9
project = frappe.get_value("Project", {"project_name": "_Test Project"})
for i in range(month + 1):
for _i in range(month + 1):
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
"_Test Bank - _TC",
@@ -270,9 +258,7 @@ class TestBudget(unittest.TestCase):
frappe.db.get_value("GL Entry", {"voucher_type": "Journal Entry", "voucher_no": jv.name})
)
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
self.assertRaises(BudgetError, jv.cancel)
@@ -284,9 +270,7 @@ class TestBudget(unittest.TestCase):
set_total_expense_zero(nowdate(), "cost_center", "_Test Cost Center 2 - _TC")
budget = make_budget(budget_against="Cost Center", cost_center="_Test Company - _TC")
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
@@ -316,9 +300,7 @@ class TestBudget(unittest.TestCase):
).insert(ignore_permissions=True)
budget = make_budget(budget_against="Cost Center", cost_center=cost_center)
frappe.db.set_value(
"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
)
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
jv = make_journal_entry(
"_Test Account Cost for Goods Sold - _TC",
@@ -423,13 +405,11 @@ def make_budget(**args):
fiscal_year = get_fiscal_year(nowdate())[0]
if budget_against == "Project":
project_name = "{0}%".format("_Test Project/" + fiscal_year)
project_name = "{}%".format("_Test Project/" + fiscal_year)
budget_list = frappe.get_all("Budget", fields=["name"], filters={"name": ("like", project_name)})
else:
cost_center_name = "{0}%".format(cost_center or "_Test Cost Center - _TC/" + fiscal_year)
budget_list = frappe.get_all(
"Budget", fields=["name"], filters={"name": ("like", cost_center_name)}
)
cost_center_name = "{}%".format(cost_center or "_Test Cost Center - _TC/" + fiscal_year)
budget_list = frappe.get_all("Budget", fields=["name"], filters={"name": ("like", cost_center_name)})
for d in budget_list:
frappe.db.sql("delete from `tabBudget` where name = %(name)s", d)
frappe.db.sql("delete from `tabBudget Account` where parent = %(name)s", d)
@@ -451,24 +431,18 @@ def make_budget(**args):
budget.action_if_annual_budget_exceeded = "Stop"
budget.action_if_accumulated_monthly_budget_exceeded = "Ignore"
budget.budget_against = budget_against
budget.append(
"accounts", {"account": "_Test Account Cost for Goods Sold - _TC", "budget_amount": 200000}
)
budget.append("accounts", {"account": "_Test Account Cost for Goods Sold - _TC", "budget_amount": 200000})
if args.applicable_on_material_request:
budget.applicable_on_material_request = 1
budget.action_if_annual_budget_exceeded_on_mr = (
args.action_if_annual_budget_exceeded_on_mr or "Warn"
)
budget.action_if_annual_budget_exceeded_on_mr = args.action_if_annual_budget_exceeded_on_mr or "Warn"
budget.action_if_accumulated_monthly_budget_exceeded_on_mr = (
args.action_if_accumulated_monthly_budget_exceeded_on_mr or "Warn"
)
if args.applicable_on_purchase_order:
budget.applicable_on_purchase_order = 1
budget.action_if_annual_budget_exceeded_on_po = (
args.action_if_annual_budget_exceeded_on_po or "Warn"
)
budget.action_if_annual_budget_exceeded_on_po = args.action_if_annual_budget_exceeded_on_po or "Warn"
budget.action_if_accumulated_monthly_budget_exceeded_on_po = (
args.action_if_accumulated_monthly_budget_exceeded_on_po or "Warn"
)

View File

@@ -1,94 +1,42 @@
{
"allow_copy": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2016-05-16 11:54:09.286135",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"account",
"budget_amount"
],
"fields": [
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Account",
"length": 0,
"no_copy": 0,
"options": "Account",
"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,
"unique": 0
"search_index": 1
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "budget_amount",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Budget Amount",
"length": 0,
"no_copy": 0,
"options": "Company:company:default_currency",
"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,
"unique": 0
"reqd": 1
}
],
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2017-01-02 17:02:53.339420",
"links": [],
"modified": "2024-03-27 13:06:42.854458",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget Account",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_seen": 0
"states": []
}

View File

@@ -19,13 +19,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-05-07 10:43:49.717633",
"modified": "2024-03-27 13:06:44.142625",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Campaign Item",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -124,7 +124,7 @@
],
"is_submittable": 1,
"links": [],
"modified": "2023-12-28 13:15:46.858427",
"modified": "2024-03-27 13:06:44.260440",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing",
@@ -145,7 +145,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -1,109 +1,43 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2018-09-02 14:45:36.303520",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"mode_of_payment",
"amount"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "mode_of_payment",
"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": "Mode of Payment",
"length": 0,
"no_copy": 0,
"options": "Mode of Payment",
"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": "amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Amount",
"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": "Amount"
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2019-02-19 08:34:20.268037",
"links": [],
"modified": "2024-03-27 13:06:44.414987",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing Payments",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
"states": [],
"track_changes": 1
}

View File

@@ -50,7 +50,7 @@
"in_create": 1,
"issingle": 1,
"links": [],
"modified": "2020-02-28 08:49:11.422846",
"modified": "2024-03-27 13:06:44.535780",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Chart of Accounts Importer",
@@ -66,6 +66,7 @@
],
"quick_entry": 1,
"read_only": 1,
"sort_field": "modified",
"sort_order": "DESC"
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -38,9 +38,7 @@ class ChartofAccountsImporter(Document):
def validate(self):
if self.import_file:
get_coa(
"Chart of Accounts Importer", "All Accounts", file_name=self.import_file, for_validate=1
)
get_coa("Chart of Accounts Importer", "All Accounts", file_name=self.import_file, for_validate=1)
def validate_columns(data):
@@ -116,7 +114,7 @@ def generate_data_from_csv(file_doc, as_dict=False):
file_path = file_doc.get_full_path()
data = []
with open(file_path, "r") as in_file:
with open(file_path) as in_file:
csv_reader = list(csv.reader(in_file))
headers = csv_reader[0]
del csv_reader[0] # delete top row and headers row
@@ -215,10 +213,10 @@ def build_forest(data):
for row in data:
account_name, parent_account, account_number, parent_account_number = row[0:4]
if account_number:
account_name = "{} - {}".format(account_number, account_name)
account_name = f"{account_number} - {account_name}"
if parent_account_number:
parent_account_number = cstr(parent_account_number).strip()
parent_account = "{} - {}".format(parent_account_number, parent_account)
parent_account = f"{parent_account_number} - {parent_account}"
if parent_account == account_name == child:
return [parent_account]
@@ -230,7 +228,7 @@ def build_forest(data):
frappe.bold(parent_account)
)
)
return [child] + parent_account_list
return [child, *parent_account_list]
charts_map, paths = {}, []
@@ -250,12 +248,12 @@ def build_forest(data):
) = i
if not account_name:
error_messages.append("Row {0}: Please enter Account Name".format(line_no))
error_messages.append(f"Row {line_no}: Please enter Account Name")
name = account_name
if account_number:
account_number = cstr(account_number).strip()
account_name = "{} - {}".format(account_number, account_name)
account_name = f"{account_number} - {account_name}"
charts_map[account_name] = {}
charts_map[account_name]["account_name"] = name
@@ -352,9 +350,9 @@ def get_template(template_type, company):
def get_sample_template(writer, company):
currency = frappe.db.get_value("Company", company, "default_currency")
with open(os.path.join(os.path.dirname(__file__), "coa_sample_template.csv"), "r") as f:
with open(os.path.join(os.path.dirname(__file__), "coa_sample_template.csv")) as f:
for row in f:
row = row.strip().split(",") + [currency]
row = [*row.strip().split(","), currency]
writer.writerow(row)
return writer
@@ -463,7 +461,7 @@ def unset_existing_data(company):
"Purchase Taxes and Charges Template",
]:
frappe.db.sql(
'''delete from `tab{0}` where `company`="%s"'''.format(doctype) % (company) # nosec
f'''delete from `tab{doctype}` where `company`="%s"''' % (company) # nosec
)

View File

@@ -66,71 +66,71 @@ def create_or_update_cheque_print_format(template_name):
cheque_print.html = """
<style>
.print-format {
.print-format {{
padding: 0px;
}
@media screen {
.print-format {
}}
@media screen {{
.print-format {{
padding: 0in;
}
}
}}
}}
</style>
<div style="position: relative; top:%(starting_position_from_top_edge)scm">
<div style="width:%(cheque_width)scm;height:%(cheque_height)scm;">
<span style="top:%(acc_pay_dist_from_top_edge)scm; left:%(acc_pay_dist_from_left_edge)scm;
<div style="position: relative; top:{starting_position_from_top_edge}cm">
<div style="width:{cheque_width}cm;height:{cheque_height}cm;">
<span style="top:{acc_pay_dist_from_top_edge}cm; left:{acc_pay_dist_from_left_edge}cm;
border-bottom: solid 1px;border-top:solid 1px; width:2cm;text-align: center; position: absolute;">
%(message_to_show)s
{message_to_show}
</span>
<span style="top:%(date_dist_from_top_edge)scm; left:%(date_dist_from_left_edge)scm;
<span style="top:{date_dist_from_top_edge}cm; left:{date_dist_from_left_edge}cm;
position: absolute;">
{{ frappe.utils.formatdate(doc.reference_date) or '' }}
{{{{ frappe.utils.formatdate(doc.reference_date) or '' }}}}
</span>
<span style="top:%(acc_no_dist_from_top_edge)scm;left:%(acc_no_dist_from_left_edge)scm;
<span style="top:{acc_no_dist_from_top_edge}cm;left:{acc_no_dist_from_left_edge}cm;
position: absolute; min-width: 6cm;">
{{ doc.account_no or '' }}
{{{{ doc.account_no or '' }}}}
</span>
<span style="top:%(payer_name_from_top_edge)scm;left: %(payer_name_from_left_edge)scm;
<span style="top:{payer_name_from_top_edge}cm;left: {payer_name_from_left_edge}cm;
position: absolute; min-width: 6cm;">
{{doc.party_name}}
{{{{doc.party_name}}}}
</span>
<span style="top:%(amt_in_words_from_top_edge)scm; left:%(amt_in_words_from_left_edge)scm;
position: absolute; display: block; width: %(amt_in_word_width)scm;
line-height:%(amt_in_words_line_spacing)scm; word-wrap: break-word;">
{{frappe.utils.money_in_words(doc.base_paid_amount or doc.base_received_amount)}}
<span style="top:{amt_in_words_from_top_edge}cm; left:{amt_in_words_from_left_edge}cm;
position: absolute; display: block; width: {amt_in_word_width}cm;
line-height:{amt_in_words_line_spacing}cm; word-wrap: break-word;">
{{{{frappe.utils.money_in_words(doc.base_paid_amount or doc.base_received_amount)}}}}
</span>
<span style="top:%(amt_in_figures_from_top_edge)scm;left: %(amt_in_figures_from_left_edge)scm;
<span style="top:{amt_in_figures_from_top_edge}cm;left: {amt_in_figures_from_left_edge}cm;
position: absolute; min-width: 4cm;">
{{doc.get_formatted("base_paid_amount") or doc.get_formatted("base_received_amount")}}
{{{{doc.get_formatted("base_paid_amount") or doc.get_formatted("base_received_amount")}}}}
</span>
<span style="top:%(signatory_from_top_edge)scm;left: %(signatory_from_left_edge)scm;
<span style="top:{signatory_from_top_edge}cm;left: {signatory_from_left_edge}cm;
position: absolute; min-width: 6cm;">
{{doc.company}}
{{{{doc.company}}}}
</span>
</div>
</div>""" % {
"starting_position_from_top_edge": doc.starting_position_from_top_edge
</div>""".format(
starting_position_from_top_edge=doc.starting_position_from_top_edge
if doc.cheque_size == "A4"
else 0.0,
"cheque_width": doc.cheque_width,
"cheque_height": doc.cheque_height,
"acc_pay_dist_from_top_edge": doc.acc_pay_dist_from_top_edge,
"acc_pay_dist_from_left_edge": doc.acc_pay_dist_from_left_edge,
"message_to_show": doc.message_to_show if doc.message_to_show else _("Account Pay Only"),
"date_dist_from_top_edge": doc.date_dist_from_top_edge,
"date_dist_from_left_edge": doc.date_dist_from_left_edge,
"acc_no_dist_from_top_edge": doc.acc_no_dist_from_top_edge,
"acc_no_dist_from_left_edge": doc.acc_no_dist_from_left_edge,
"payer_name_from_top_edge": doc.payer_name_from_top_edge,
"payer_name_from_left_edge": doc.payer_name_from_left_edge,
"amt_in_words_from_top_edge": doc.amt_in_words_from_top_edge,
"amt_in_words_from_left_edge": doc.amt_in_words_from_left_edge,
"amt_in_word_width": doc.amt_in_word_width,
"amt_in_words_line_spacing": doc.amt_in_words_line_spacing,
"amt_in_figures_from_top_edge": doc.amt_in_figures_from_top_edge,
"amt_in_figures_from_left_edge": doc.amt_in_figures_from_left_edge,
"signatory_from_top_edge": doc.signatory_from_top_edge,
"signatory_from_left_edge": doc.signatory_from_left_edge,
}
cheque_width=doc.cheque_width,
cheque_height=doc.cheque_height,
acc_pay_dist_from_top_edge=doc.acc_pay_dist_from_top_edge,
acc_pay_dist_from_left_edge=doc.acc_pay_dist_from_left_edge,
message_to_show=doc.message_to_show if doc.message_to_show else _("Account Pay Only"),
date_dist_from_top_edge=doc.date_dist_from_top_edge,
date_dist_from_left_edge=doc.date_dist_from_left_edge,
acc_no_dist_from_top_edge=doc.acc_no_dist_from_top_edge,
acc_no_dist_from_left_edge=doc.acc_no_dist_from_left_edge,
payer_name_from_top_edge=doc.payer_name_from_top_edge,
payer_name_from_left_edge=doc.payer_name_from_left_edge,
amt_in_words_from_top_edge=doc.amt_in_words_from_top_edge,
amt_in_words_from_left_edge=doc.amt_in_words_from_left_edge,
amt_in_word_width=doc.amt_in_word_width,
amt_in_words_line_spacing=doc.amt_in_words_line_spacing,
amt_in_figures_from_top_edge=doc.amt_in_figures_from_top_edge,
amt_in_figures_from_left_edge=doc.amt_in_figures_from_left_edge,
signatory_from_top_edge=doc.signatory_from_top_edge,
signatory_from_left_edge=doc.signatory_from_left_edge,
)
cheque_print.save(ignore_permissions=True)

View File

@@ -1,104 +1,41 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"actions": [],
"creation": "2018-04-13 18:51:29.720606",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"document_type",
"closed"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "document_type",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Document Type",
"length": 0,
"no_copy": 0,
"options": "DocType",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "closed",
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Closed",
"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": "Closed"
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-04-13 18:51:41.118025",
"links": [],
"modified": "2024-03-27 13:06:44.854280",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Closed Document",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
"states": [],
"track_changes": 1
}

View File

@@ -125,7 +125,7 @@
"idx": 1,
"is_tree": 1,
"links": [],
"modified": "2022-01-31 13:22:58.916273",
"modified": "2024-04-24 10:55:54.083042",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cost Center",
@@ -163,11 +163,20 @@
{
"read": 1,
"role": "Purchase User"
},
{
"email": 1,
"export": 1,
"print": 1,
"report": 1,
"role": "Employee",
"select": 1,
"share": 1
}
],
"search_fields": "parent_cost_center, is_group",
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": []
}

View File

@@ -34,9 +34,7 @@ class CostCenter(NestedSet):
def autoname(self):
from erpnext.accounts.utils import get_autoname_with_number
self.name = get_autoname_with_number(
self.cost_center_number, self.cost_center_name, self.company
)
self.name = get_autoname_with_number(self.cost_center_number, self.cost_center_name, self.company)
def validate(self):
self.validate_mandatory()
@@ -109,14 +107,14 @@ class CostCenter(NestedSet):
new_cost_center = get_name_with_abbr(newdn, self.company)
# Validate properties before merging
super(CostCenter, self).before_rename(olddn, new_cost_center, merge, "is_group")
super().before_rename(olddn, new_cost_center, merge, "is_group")
if not merge:
new_cost_center = get_name_with_number(new_cost_center, self.cost_center_number)
return new_cost_center
def after_rename(self, olddn, newdn, merge=False):
super(CostCenter, self).after_rename(olddn, newdn, merge)
super().after_rename(olddn, newdn, merge)
if not merge:
new_cost_center = frappe.db.get_value(

View File

@@ -10,7 +10,6 @@ test_records = frappe.get_test_records("Cost Center")
class TestCostCenter(unittest.TestCase):
def test_cost_center_creation_against_child_node(self):
if not frappe.db.get_value("Cost Center", {"name": "_Test Cost Center 2 - _TC"}):
frappe.get_doc(test_records[1]).insert()

View File

@@ -68,11 +68,10 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-01-31 11:47:12.086253",
"modified": "2024-03-27 13:06:46.938642",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cost Center Allocation",
"name_case": "UPPER CASE",
"naming_rule": "Expression (old style)",
"owner": "Administrator",
"permissions": [
@@ -122,7 +121,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -48,7 +48,7 @@ class CostCenterAllocation(Document):
# end: auto-generated types
def __init__(self, *args, **kwargs):
super(CostCenterAllocation, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self._skip_from_date_validation = False
def validate(self):
@@ -63,9 +63,7 @@ class CostCenterAllocation(Document):
total_percentage = sum([d.percentage for d in self.get("allocation_percentages", [])])
if total_percentage != 100:
frappe.throw(
_("Total percentage against cost centers should be 100"), WrongPercentageAllocation
)
frappe.throw(_("Total percentage against cost centers should be 100"), WrongPercentageAllocation)
def validate_from_date_based_on_existing_gle(self):
# Check if GLE exists against the main cost center

View File

@@ -29,13 +29,13 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2022-02-01 22:22:31.589523",
"modified": "2024-03-27 13:06:47.100633",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cost Center Allocation Percentage",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}

View File

@@ -1,4 +1,5 @@
{
"actions": [],
"allow_import": 1,
"autoname": "field:coupon_name",
"creation": "2018-01-22 14:34:39.701832",
@@ -115,7 +116,8 @@
"read_only": 1
}
],
"modified": "2024-01-24 02:20:26.145996",
"links": [],
"modified": "2024-03-27 13:06:47.220931",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Coupon Code",
@@ -170,8 +172,9 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"title_field": "coupon_name",
"track_changes": 1
}

View File

@@ -3,22 +3,36 @@
frappe.ui.form.on("Currency Exchange Settings", {
service_provider: function (frm) {
if (frm.doc.service_provider == "exchangerate.host") {
let result = ["result"];
let params = {
date: "{transaction_date}",
from: "{from_currency}",
to: "{to_currency}",
};
add_param(frm, "https://api.exchangerate.host/convert", params, result);
} else if (frm.doc.service_provider == "frankfurter.app") {
let result = ["rates", "{to_currency}"];
let params = {
base: "{from_currency}",
symbols: "{to_currency}",
};
add_param(frm, "https://frankfurter.app/{transaction_date}", params, result);
}
frm.call({
method: "erpnext.accounts.doctype.currency_exchange_settings.currency_exchange_settings.get_api_endpoint",
args: {
service_provider: frm.doc.service_provider,
use_http: frm.doc.use_http,
},
callback: function (r) {
if (r && r.message) {
if (frm.doc.service_provider == "exchangerate.host") {
let result = ["result"];
let params = {
date: "{transaction_date}",
from: "{from_currency}",
to: "{to_currency}",
};
add_param(frm, r.message, params, result);
} else if (frm.doc.service_provider == "frankfurter.app") {
let result = ["rates", "{to_currency}"];
let params = {
base: "{from_currency}",
symbols: "{to_currency}",
};
add_param(frm, r.message, params, result);
}
}
},
});
},
use_http: function (frm) {
frm.trigger("service_provider");
},
});

View File

@@ -9,6 +9,7 @@
"disabled",
"service_provider",
"api_endpoint",
"use_http",
"access_key",
"url",
"column_break_3",
@@ -91,12 +92,19 @@
"fieldname": "access_key",
"fieldtype": "Data",
"label": "Access Key"
},
{
"default": "0",
"depends_on": "eval: doc.service_provider != \"Custom\"",
"fieldname": "use_http",
"fieldtype": "Check",
"label": "Use HTTP Protocol"
}
],
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-10-04 15:30:25.333860",
"modified": "2024-03-27 13:06:47.653110",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Currency Exchange Settings",
@@ -133,7 +141,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -31,6 +31,7 @@ class CurrencyExchangeSettings(Document):
result_key: DF.Table[CurrencyExchangeSettingsResult]
service_provider: DF.Literal["frankfurter.app", "exchangerate.host", "Custom"]
url: DF.Data | None
use_http: DF.Check
# end: auto-generated types
def validate(self):
@@ -42,7 +43,6 @@ class CurrencyExchangeSettings(Document):
def set_parameters_and_result(self):
if self.service_provider == "exchangerate.host":
if not self.access_key:
frappe.throw(
_("Access Key is required for Service Provider: {0}").format(
@@ -53,7 +53,7 @@ class CurrencyExchangeSettings(Document):
self.set("result_key", [])
self.set("req_params", [])
self.api_endpoint = "https://api.exchangerate.host/convert"
self.api_endpoint = get_api_endpoint(self.service_provider, self.use_http)
self.append("result_key", {"key": "result"})
self.append("req_params", {"key": "access_key", "value": self.access_key})
self.append("req_params", {"key": "amount", "value": "1"})
@@ -64,7 +64,7 @@ class CurrencyExchangeSettings(Document):
self.set("result_key", [])
self.set("req_params", [])
self.api_endpoint = "https://frankfurter.app/{transaction_date}"
self.api_endpoint = get_api_endpoint(self.service_provider, self.use_http)
self.append("result_key", {"key": "rates"})
self.append("result_key", {"key": "{to_currency}"})
self.append("req_params", {"key": "base", "value": "{from_currency}"})
@@ -77,9 +77,7 @@ class CurrencyExchangeSettings(Document):
transaction_date=nowdate(), to_currency="INR", from_currency="USD"
)
api_url = self.api_endpoint.format(
transaction_date=nowdate(), to_currency="INR", from_currency="USD"
)
api_url = self.api_endpoint.format(transaction_date=nowdate(), to_currency="INR", from_currency="USD")
try:
response = requests.get(api_url, params=params)
@@ -99,7 +97,23 @@ class CurrencyExchangeSettings(Document):
]
except Exception:
frappe.throw(_("Invalid result key. Response:") + " " + response.text)
if not isinstance(value, (int, float)):
if not isinstance(value, int | float):
frappe.throw(_("Returned exchange rate is neither integer not float."))
self.url = response.url
@frappe.whitelist()
def get_api_endpoint(service_provider: str | None = None, use_http: bool = False):
if service_provider and service_provider in ["exchangerate.host", "frankfurter.app"]:
if service_provider == "exchangerate.host":
api = "api.exchangerate.host/convert"
elif service_provider == "frankfurter.app":
api = "frankfurter.app/{transaction_date}"
protocol = "https://"
if use_http:
protocol = "http://"
return protocol + api
return None

View File

@@ -27,13 +27,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-11-03 19:14:55.889037",
"modified": "2024-03-27 13:06:47.819210",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Currency Exchange Settings Details",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -19,13 +19,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-11-03 19:14:40.054245",
"modified": "2024-03-27 13:06:47.937025",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Currency Exchange Settings Result",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -19,13 +19,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-05-07 10:39:21.563506",
"modified": "2024-03-27 13:06:48.735688",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Customer Group Item",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -19,13 +19,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-05-06 10:02:32.967841",
"modified": "2024-03-27 13:06:48.844074",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Customer Item",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -1,4 +1,5 @@
{
"actions": [],
"creation": "2019-03-07 12:07:09.416101",
"doctype": "DocType",
"editable_grid": 1,
@@ -61,14 +62,16 @@
}
],
"istable": 1,
"modified": "2020-02-20 16:16:20.724620",
"links": [],
"modified": "2024-03-27 13:06:51.610919",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Discounted Invoice",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -185,7 +185,7 @@
},
{
"fieldname": "address_display",
"fieldtype": "Small Text",
"fieldtype": "Text Editor",
"label": "Address",
"read_only": 1
},
@@ -204,7 +204,7 @@
},
{
"fieldname": "company_address_display",
"fieldtype": "Small Text",
"fieldtype": "Text Editor",
"label": "Company Address Display",
"read_only": 1
},
@@ -381,7 +381,7 @@
],
"is_submittable": 1,
"links": [],
"modified": "2023-06-15 15:46:53.865712",
"modified": "2024-03-27 13:08:19.176146",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Dunning",
@@ -430,7 +430,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"title_field": "customer_name",

View File

@@ -32,14 +32,14 @@ class Dunning(AccountsController):
from erpnext.accounts.doctype.overdue_payment.overdue_payment import OverduePayment
address_display: DF.SmallText | None
address_display: DF.TextEditor | None
amended_from: DF.Link | None
base_dunning_amount: DF.Currency
body_text: DF.TextEditor | None
closing_text: DF.TextEditor | None
company: DF.Link
company_address: DF.Link | None
company_address_display: DF.SmallText | None
company_address_display: DF.TextEditor | None
contact_display: DF.SmallText | None
contact_email: DF.Data | None
contact_mobile: DF.SmallText | None
@@ -146,6 +146,10 @@ class Dunning(AccountsController):
)
row.dunning_level = len(past_dunnings) + 1
def on_cancel(self):
super().on_cancel()
self.ignore_linked_doctypes = ["GL Entry"]
def resolve_dunning(doc, state):
"""

View File

@@ -109,9 +109,7 @@ class TestDunning(FrappeTestCase):
def create_dunning(overdue_days, dunning_type_name=None):
posting_date = add_days(today(), -1 * overdue_days)
sales_invoice = create_sales_invoice_against_cost_center(
posting_date=posting_date, qty=1, rate=100
)
sales_invoice = create_sales_invoice_against_cost_center(posting_date=posting_date, qty=1, rate=100)
dunning = create_dunning_from_sales_invoice(sales_invoice.name)
if dunning_type_name:

View File

@@ -58,13 +58,14 @@
],
"istable": 1,
"links": [],
"modified": "2020-07-14 18:02:35.988958",
"modified": "2024-03-27 13:08:19.435616",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Dunning Letter Text",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -107,7 +107,7 @@
"link_fieldname": "dunning_type"
}
],
"modified": "2021-11-13 00:25:35.659283",
"modified": "2024-03-27 13:08:19.584112",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Dunning Type",
@@ -151,7 +151,8 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -57,13 +57,13 @@ frappe.ui.form.on("Exchange Rate Revaluation", {
get_entries: function (frm, account) {
frappe.call({
method: "get_accounts_data",
doc: cur_frm.doc,
doc: frm.doc,
account: account,
callback: function (r) {
frappe.model.clear_table(frm.doc, "accounts");
if (r.message) {
r.message.forEach((d) => {
cur_frm.add_child("accounts", d);
frm.add_child("accounts", d);
});
frm.events.get_total_gain_loss(frm);
refresh_field("accounts");

View File

@@ -109,7 +109,7 @@
],
"is_submittable": 1,
"links": [],
"modified": "2023-06-20 07:29:06.972434",
"modified": "2024-03-27 13:09:42.951164",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation",
@@ -162,7 +162,7 @@
"write": 1
}
],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -268,7 +268,6 @@ class ExchangeRateRevaluation(Document):
# Handle Accounts with '0' balance in Account/Base Currency
for d in [x for x in account_details if x.zero_balance]:
if d.balance != 0:
current_exchange_rate = new_exchange_rate = 0
@@ -281,7 +280,8 @@ class ExchangeRateRevaluation(Document):
new_balance_in_account_currency = 0
current_exchange_rate = (
calculate_exchange_rate_using_last_gle(company, d.account, d.party_type, d.party) or 0.0
calculate_exchange_rate_using_last_gle(company, d.account, d.party_type, d.party)
or 0.0
)
gain_loss = new_balance_in_account_currency - (
@@ -335,9 +335,7 @@ class ExchangeRateRevaluation(Document):
revaluation_jv = self.make_jv_for_revaluation()
if revaluation_jv:
frappe.msgprint(
f"Revaluation Journal: {get_link_to_form('Journal Entry', revaluation_jv.name)}"
)
frappe.msgprint(f"Revaluation Journal: {get_link_to_form('Journal Entry', revaluation_jv.name)}")
return {
"revaluation_jv": revaluation_jv.name if revaluation_jv else None,
@@ -394,7 +392,8 @@ class ExchangeRateRevaluation(Document):
journal_account.update(
{
dr_or_cr: flt(
abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
abs(d.get("balance_in_account_currency")),
d.precision("balance_in_account_currency"),
),
reverse_dr_or_cr: 0,
"debit": 0,
@@ -520,7 +519,9 @@ class ExchangeRateRevaluation(Document):
abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
),
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": flt(d.get("current_exchange_rate"), d.precision("current_exchange_rate")),
"exchange_rate": flt(
d.get("current_exchange_rate"), d.precision("current_exchange_rate")
),
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
@@ -598,7 +599,7 @@ def calculate_exchange_rate_using_last_gle(company, account, party_type, party):
@frappe.whitelist()
def get_account_details(
company, posting_date, account, party_type=None, party=None, rounding_loss_allowance: float = None
company, posting_date, account, party_type=None, party=None, rounding_loss_allowance: float | None = None
):
if not (company and posting_date):
frappe.throw(_("Company and Posting Date is mandatory"))
@@ -611,7 +612,7 @@ def get_account_details(
frappe.throw(_("Party Type and Party is mandatory for {0} account").format(account_type))
account_details = {}
company_currency = erpnext.get_company_currency(company)
erpnext.get_company_currency(company)
account_details = {
"account_currency": account_currency,
@@ -625,24 +626,22 @@ def get_account_details(
rounding_loss_allowance=rounding_loss_allowance,
)
if account_balance and (
account_balance[0].balance or account_balance[0].balance_in_account_currency
):
account_with_new_balance = ExchangeRateRevaluation.calculate_new_account_balance(
if account_balance and (account_balance[0].balance or account_balance[0].balance_in_account_currency):
if account_with_new_balance := ExchangeRateRevaluation.calculate_new_account_balance(
company, posting_date, account_balance
)
row = account_with_new_balance[0]
account_details.update(
{
"balance_in_base_currency": row["balance_in_base_currency"],
"balance_in_account_currency": row["balance_in_account_currency"],
"current_exchange_rate": row["current_exchange_rate"],
"new_exchange_rate": row["new_exchange_rate"],
"new_balance_in_base_currency": row["new_balance_in_base_currency"],
"new_balance_in_account_currency": row["new_balance_in_account_currency"],
"zero_balance": row["zero_balance"],
"gain_loss": row["gain_loss"],
}
)
):
row = account_with_new_balance[0]
account_details.update(
{
"balance_in_base_currency": row["balance_in_base_currency"],
"balance_in_account_currency": row["balance_in_account_currency"],
"current_exchange_rate": row["current_exchange_rate"],
"new_exchange_rate": row["new_exchange_rate"],
"new_balance_in_base_currency": row["new_balance_in_base_currency"],
"new_balance_in_account_currency": row["new_balance_in_account_currency"],
"zero_balance": row["zero_balance"],
"gain_loss": row["gain_loss"],
}
)
return account_details

View File

@@ -1,21 +1,14 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
import frappe
from frappe import qb
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, today
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.party import get_party_account
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.stock.doctype.item.test_item import create_item
class TestExchangeRateRevaluation(AccountsTestMixin, FrappeTestCase):
@@ -73,9 +66,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, FrappeTestCase):
err.extend("accounts", accounts)
row = err.accounts[0]
row.new_exchange_rate = 85
row.new_balance_in_base_currency = flt(
row.new_exchange_rate * flt(row.balance_in_account_currency)
)
row.new_balance_in_base_currency = flt(row.new_exchange_rate * flt(row.balance_in_account_currency))
row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency)
err.set_total_gain_loss()
err = err.save().submit()
@@ -127,9 +118,9 @@ class TestExchangeRateRevaluation(AccountsTestMixin, FrappeTestCase):
pe.save().submit()
# Cancel the auto created gain/loss JE to simulate balance only in base currency
je = frappe.db.get_all(
"Journal Entry Account", filters={"reference_name": si.name}, pluck="parent"
)[0]
je = frappe.db.get_all("Journal Entry Account", filters={"reference_name": si.name}, pluck="parent")[
0
]
frappe.get_doc("Journal Entry", je).cancel()
err = frappe.new_doc("Exchange Rate Revaluation")
@@ -235,9 +226,9 @@ class TestExchangeRateRevaluation(AccountsTestMixin, FrappeTestCase):
self.assertEqual(flt(acc.debit, precision), 0.0)
self.assertEqual(flt(acc.credit, precision), 0.0)
row = [x for x in je.accounts if x.account == self.debtors_usd][0]
row = next(x for x in je.accounts if x.account == self.debtors_usd)
self.assertEqual(flt(row.credit_in_account_currency, precision), 5.0) # in USD
row = [x for x in je.accounts if x.account != self.debtors_usd][0]
row = next(x for x in je.accounts if x.account != self.debtors_usd)
self.assertEqual(flt(row.debit_in_account_currency, precision), 421.06) # in INR
# total_debit and total_credit will be 0.0, as JV is posting only to account currency fields
@@ -294,5 +285,5 @@ class TestExchangeRateRevaluation(AccountsTestMixin, FrappeTestCase):
"new_balance_in_account_currency": 100.0,
}
for key, val in expected_data.items():
for key, _val in expected_data.items():
self.assertEqual(expected_data.get(key), account_details.get(key))

View File

@@ -149,14 +149,14 @@
],
"istable": 1,
"links": [],
"modified": "2023-06-22 12:39:56.446722",
"modified": "2024-03-27 13:09:43.128675",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation Account",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1

View File

@@ -1,133 +1,67 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"actions": [],
"allow_import": 1,
"allow_rename": 0,
"autoname": "field:finance_book_name",
"beta": 0,
"creation": "2018-04-13 17:42:43.252224",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"finance_book_name"
],
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "finance_book_name",
"fieldtype": "Data",
"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": "Name",
"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
"unique": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"icon": "fa fa-book",
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-05-09 14:55:01.394387",
"links": [],
"modified": "2024-03-27 13:09:44.514241",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Finance Book",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 0
"share": 1
},
{
"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": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Auditor",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 0
"share": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"search_fields": "finance_book_name",
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1,
"track_seen": 1
}

View File

@@ -108,9 +108,9 @@ class FiscalYear(Document):
if overlap:
frappe.throw(
_("Year start date or end date is overlapping with {0}. To avoid please set company").format(
existing.name
),
_(
"Year start date or end date is overlapping with {0}. To avoid please set company"
).format(existing.name),
frappe.NameError,
)
@@ -126,9 +126,9 @@ def check_duplicate_fiscal_year(doc):
not frappe.flags.in_test
):
frappe.throw(
_("Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}").format(
fiscal_year
)
_(
"Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}"
).format(fiscal_year)
)

View File

@@ -21,13 +21,14 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-09-28 18:01:53.495929",
"modified": "2024-03-27 13:09:44.659251",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Fiscal Year Company",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

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