Compare commits

...

1162 Commits

Author SHA1 Message Date
Ankush Menat
f784b17564 perf: avoid full table scan in sle count check 2023-07-31 20:06:46 +05:30
rohitwaghchaure
f83a100a8d fix: not able to make material request (#36416) 2023-07-31 19:13:23 +05:30
Devin Slauenwhite
e8eeeb16e2 fix: group item reorder by (warehouse, material_request_type) (#35818)
* fix: group item reorder by (warehouse, material_request_type)

* fix: update reorder error message

* chore: linter

* fix: correct error message

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>

* chore: linter

---------

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-07-31 12:47:14 +00:00
xdlumertz
652398fad2 fix: Defined "Open" Status as default (#36421)
Defined "Open" Status as default of the child doctype (Quality Review Objective), because without it the main doctype (Quality Review) has "Passed" status.
This happens because in the "set_status" function, the status is updated according to the status of the child records.
2023-07-31 12:34:33 +00:00
Vimal
ce36d1f668 fix: job card suggest holiday as start date (#35958) 2023-07-31 17:51:31 +05:30
xdlumertz
05b07e098a fix: process_owner is not link User (#36420)
-Changed "fetch from" since field is not a binding field
-Change field "full_name" from Hidden to Read Only
2023-07-31 17:34:55 +05:30
Gursheen Kaur Anand
1ddfaa7605 fix: ignore cancelled gle in voucher-wise balance report (#36417)
fix: ignore cancelled gle
2023-07-31 14:29:20 +05:30
Deepesh Garg
c6d8f15b10 Merge pull request #36389 from AlexandreLumertz/patch-2
fix: Party type translation in error message
2023-07-30 18:42:01 +05:30
Deepesh Garg
c6b024c34b Merge pull request #36167 from barredterra/percentage-rounding
fix: rounding of percentage fields
2023-07-30 14:41:30 +05:30
Deepesh Garg
b38d300a92 Merge pull request #36320 from barredterra/german-translation-supplier
fix(Supplier): german translations
2023-07-30 14:40:15 +05:30
Deepesh Garg
eeddeeeeb3 Merge pull request #36369 from ashish-greycube/patch-11
fix: in payment_entry 'Unallocated Amount' cal is broken
2023-07-30 14:37:24 +05:30
Ankush Menat
c0642cf528 fix: only publish repost progress to doc subscriber (#36400)
Huge size of string gets blasted to everyone on site. Due to some memory
leak (cause unknown) till sockets are open the strings are also in
process' memory.

related https://github.com/frappe/frappe/issues/21863
2023-07-29 09:32:11 +00:00
rohitwaghchaure
b71dafd1f1 Merge pull request #36375 from ramonus/job-card-fix
fix: Job Card validation fixed when displaying total completed quantity
2023-07-29 15:01:16 +05:30
Deepesh Garg
caad4537c5 Merge pull request #36149 from GursheenK/balancing-accounting-dimensions
fix: make offsetting entry for acc dimensions in general ledger
2023-07-29 12:29:03 +05:30
Deepesh Garg
f999b75ed6 Merge branch 'develop' of https://github.com/frappe/erpnext into balancing-accounting-dimensions 2023-07-29 11:53:03 +05:30
Deepesh Garg
ecca9cb023 fix: Add company filters for account 2023-07-29 11:52:54 +05:30
Deepesh Garg
3173546d5c Merge pull request #36198 from HarryPaulo/fix-pricing-rule-on-point-of-sale
fix: inserting of items with pricing rule with qty range
2023-07-29 09:58:05 +05:30
ruthra kumar
3b58055410 refactor(test): introduce and make use of mixins in unit tests (#36382)
* refactor(test): create and use test mixin

* chore(test): replace get_user_default with variable
2023-07-28 21:02:21 +05:30
xdlumertz
bc470591ac fix: translate
fix: translate
2023-07-28 12:31:29 -03:00
rohitwaghchaure
ee7da639e7 Merge pull request #36380 from rohitwaghchaure/fixed-fieldtype-from-currency-to-flt
fix: change fieldtype from Currency to Float for the valuation rate in reports
2023-07-28 20:35:46 +05:30
s-aga-r
bc6cbb9e25 Merge pull request #36365 from AlexandreLumertz/patch-1
fix: removed "fetch_from"
2023-07-28 18:12:21 +05:30
xdlumertz
1c687a4afd fix: removed "fetch_from"
* fix: removed ("fetch_from": "goal.objective")
The field ended up being disabled because of this.
2023-07-28 18:10:45 +05:30
s-aga-r
d9ac7f9b87 Merge pull request #36221 from s-aga-r/FIX-ISS-23-24-02079
perf: use `LEFT JOIN` instead of `NOT EXISTS`
2023-07-28 17:51:24 +05:30
rohitwaghchaure
4e58503075 Merge pull request #36377 from rohitwaghchaure/fixed-pp-sub-assembly-available-items
fix: multiple issues related to Production Plan
2023-07-28 17:26:06 +05:30
Rohit Waghchaure
c82cb379a5 fix: change fieldtype from Currency to Float for the valuation rate in the stock report 2023-07-28 17:21:05 +05:30
s-aga-r
148d466ae5 fix: long queue process_boms_cost_level_wise 2023-07-28 17:05:17 +05:30
s-aga-r
58d867503b perf: use LEFT JOIN instead of NOT EXISTS 2023-07-28 16:44:41 +05:30
Rohit Waghchaure
1c2148b637 fix: multiple issues related to Production Plan 2023-07-28 15:38:00 +05:30
ramonalmato
49981fecc7 fix: Job Card validation fixed when displaying total completed quantity 2023-07-28 10:57:31 +02:00
Ankush Menat
e36c8ce5be perf: move project status reminder to hourly (#36372)
Only used for sending daily/weekly/bi-daily

[skip ci]
2023-07-28 12:53:22 +05:30
Ashish Shah
f9fa34ff40 fix: in payment_entry 'Unallocated Amount' cal is broken 2023-07-28 11:10:51 +05:30
ruthra kumar
50d294fd1e Merge pull request #36126 from ruthra-kumar/idx_issue_upon_journal_reconciliation
fix: incorrect `idx` on Journals after reconciliation
2023-07-28 09:33:29 +05:30
rohitwaghchaure
dac9fd64a8 Merge pull request #36328 from rohitwaghchaure/fixed-purchase-receipt-timeout-on-cancel-develop
fix: timeout error while cancelling the Purchase Receipt
2023-07-27 23:26:59 +05:30
Deepesh Garg
829387c2bc Merge pull request #36360 from deepeshgarg007/fy_default_dates
fix: Default year start and end dates in reports
2023-07-27 22:35:35 +05:30
Deepesh Garg
fff83bc847 Merge pull request #36092 from HarryPaulo/fix-paid-amount-payment-method-group
fix: paid_amount when the group is mode of payment
2023-07-27 21:21:52 +05:30
Deepesh Garg
ebdf1959fd Merge pull request #36254 from deepeshgarg007/remove_auto_repeat
fix: Remove auto repeat (subscription) button from Sales and Purchase documents
2023-07-27 21:18:03 +05:30
Deepesh Garg
a25f34c3d5 Merge pull request #36313 from barredterra/delete-root-item-group
fix(Item Group): allow root deletion
2023-07-27 21:14:44 +05:30
Deepesh Garg
2341061852 fix: Default year start and end date in reports 2023-07-27 21:03:32 +05:30
Deepesh Garg
4496a6760e fix: Default year start and end dates in reports 2023-07-27 20:54:55 +05:30
Deepesh Garg
dacf013170 Merge pull request #36347 from deepeshgarg007/ac_ignore
fix: Ignore account closing balance for financial statement
2023-07-27 19:54:01 +05:30
Deepesh Garg
523d2c38eb Merge pull request #36356 from frappe/revert-36249-default_dates
Revert "fix: Default year start and end dates in reports"
2023-07-27 19:15:00 +05:30
Deepesh Garg
cf50bb45ad Revert "fix: Default year start and end dates in reports" 2023-07-27 19:13:11 +05:30
Deepesh Garg
3db6ac5ac9 Merge pull request #36069 from GursheenK/purchase-sales-register-with-PE/JE
feat: include payments in purchase / sales register report
2023-07-27 18:13:37 +05:30
Gursheen Anand
4f9242d699 fix: dimension name in remark 2023-07-27 15:45:48 +05:30
Deepesh Garg
ccf1920a78 fix: Ignore account closing balance for financial statement 2023-07-27 15:40:36 +05:30
Rucha Mahabal
5d87c06332 refactor: remove hrms app translations (#36343) 2023-07-27 12:30:23 +05:30
Deepesh Garg
5dc8195d91 Merge pull request #36249 from deepeshgarg007/default_dates
fix: Default year start and end dates in reports
2023-07-27 12:19:44 +05:30
Ankush Menat
1d7dbd3456 perf: don't use ifnull where it's not required (#36336)
ifnull isn't really required when doing `!= 'anything'` because if it's null then value will be falsy.
ifnull is only required when checking `= ''` if you treat `null = ''`

Actuall better fix would be make things explcitly non-nullable, then we won't ever have to add this on such fields.

ref: https://github.com/frappe/frappe/pull/21822
2023-07-27 06:06:07 +00:00
Nabin Hait
56e7cc7e05 Merge pull request #36327 from nabinhait/pcv-fix
fix: GL Entries should not be split based on cost center allocation in PCV
2023-07-27 11:33:06 +05:30
Gursheen Anand
b1818137e7 fix: PE in sales register 2023-07-27 10:08:26 +05:30
Anand Baburajan
5e7b05e566 chore: adding totals in asset reports (#36334) 2023-07-26 21:57:18 +05:30
ruthra kumar
e79f80331d Merge pull request #36322 from frappe/mergify/bp/develop/pr-36298
fix: show invoices name instead of object address (backport #36298)
2023-07-26 16:11:56 +05:30
Anand Baburajan
f28f8dc596 fix: show depr schedule table in asset doc (#36332) 2023-07-26 15:59:37 +05:30
Deepesh Garg
f368894d22 Merge pull request #36238 from RitvikSardana/develop-ritvik-pos-dark
fix: POS closing with item name
2023-07-26 15:33:44 +05:30
gouravengineer
a5b626420d fix: show invoices name instead of object address
comma_and function in expecting a list but it gets a tuple so it is returning a object instead of a string

(cherry picked from commit cf93714a7c)
2023-07-26 15:30:03 +05:30
Nabin Hait
666d961875 fix: GL Entries should not be splitted based on cost center allocation in PCV 2023-07-26 13:03:29 +05:30
Rohit Waghchaure
1c2da92233 fix: timeout error while cancelling the Purchase Receipt 2023-07-26 13:03:23 +05:30
Deepesh Garg
89aa6f0269 Merge pull request #36318 from barredterra/remove-autoname
chore(Item Group): remove redundant autoname
2023-07-26 09:44:37 +05:30
Deepesh Garg
3fe75ce7d4 Merge pull request #36319 from cogk/fix-taxes-controller-after-refactor
fix: Fix initialize_taxes
2023-07-26 09:41:02 +05:30
barredterra
3558c3d24e fix: german translations 2023-07-25 21:42:01 +02:00
Corentin Flr
d69af741c8 fix(taxes_and_totals.js): Fix initialize_taxes incorrect refactor
Following changes from PR #36147, `cur_frm.cscript.validate_taxes_and_charges` is not a method anymore and should be replaced with the `erpnext.accounts.taxes.validate_taxes_and_charges` function.
2023-07-25 21:12:14 +02:00
rohitwaghchaure
17d4ab36c0 Merge pull request #36304 from frappe/mergify/bp/develop/pr-36300
fix: added missing option Partially Received in the status field (backport #36300)
2023-07-25 22:49:51 +05:30
Anand Baburajan
11a9d4124f fix: apply discount on item after applying price list (#36317) 2023-07-25 21:55:17 +05:30
barredterra
1691eee26e chore(Item Group): remove redundant autoname 2023-07-25 18:05:41 +02:00
mergify[bot]
eead2bba9f fix: group by in fixed asset register (copy #36310) (#36311)
fix: group by in fixed asset register

(cherry picked from commit 1151e47f46)

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-07-25 20:58:41 +05:30
barredterra
fd2c272bed fix(Item Group): allow root deletion
It was not possible to delete an empty, unused Item Group without any
children, if it was one of possibly multiple roots of the Item Group tree.
This fix allows deleting a root Item Group.
2023-07-25 17:01:57 +02:00
Rohit Waghchaure
55a9537220 fix: added missing option Partially Received in the status dropdown field
(cherry picked from commit 4fa93b05c6)
2023-07-25 12:39:07 +00:00
Gursheen Anand
341709aa0a fix: additional query cols for sales register 2023-07-25 15:57:17 +05:30
Deepesh Garg
2c1943c7e6 Merge pull request #36246 from blaggacao/bump-tweepy
build(deps): update tweepy 3.10.0 -> 4.14.0
2023-07-25 15:06:48 +05:30
Deepesh Garg
6830a8737a Merge pull request #36196 from GursheenK/customer-details-in-tax-withholding-category-report
fix: show tax withholding category details for customers
2023-07-25 14:48:15 +05:30
Deepesh Garg
8c410c617c chore: Add default value 2023-07-25 14:47:46 +05:30
Deepesh Garg
e1d6bf364e Merge branch 'develop' of https://github.com/frappe/erpnext into customer-details-in-tax-withholding-category-report 2023-07-25 14:45:36 +05:30
Gursheen Anand
95c6f4d40d fix: additional query cols for gst itemised registers 2023-07-25 14:32:24 +05:30
Deepesh Garg
61be373800 Merge pull request #36107 from GursheenK/accounting_dimension_in_based_on_filter
feat: filtering based on accounting dimensions in profitability analysis
2023-07-25 14:28:46 +05:30
RitvikSardana
62ca89b10f fix: POS background color optimized in dark mode (#36287)
fix: POS dark theme compatability

Co-authored-by: Ritvik Sardana <ritviksardana@Ritviks-MacBook-Air.local>
2023-07-25 13:01:10 +05:30
Gursheen Anand
e6d66fe5b0 fix: gst itemised registers for india compliance api call 2023-07-25 12:14:37 +05:30
Deepesh Garg
30554301c9 Merge pull request #36235 from resilient-tech/fix-tax-breakup-for-diff-tax-rates
fix: Correct Tax Breakup for different tax rates for same hsn code
2023-07-24 20:57:26 +05:30
Deepesh Garg
3f81e15672 Merge pull request #36147 from deepeshgarg007/eslint
refactor(ci): add eslint and update linting confs
2023-07-24 20:55:07 +05:30
Smit Vora
1b8490dc98 Merge branch 'develop' into fix-tax-breakup-for-diff-tax-rates 2023-07-24 20:20:19 +05:30
mergify[bot]
1bc87a970a fix: set new purchase_receipt_amount on asset split (copy #36272) (#36280)
fix: set new purchase_receipt_amount on asset split

(cherry picked from commit 7fd9b489ee)

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-07-24 19:37:07 +05:30
Deepesh Garg
4867a767a2 Merge pull request #36278 from resilient-tech/set-company-flag
fix(regional): set `frappe.flags.company` temporarily, where required
2023-07-24 19:34:29 +05:30
Sagar Vora
4205f564a0 fix(regional): set frappe.flags.company temporarily, where required 2023-07-24 18:37:58 +05:30
DaizyModi
6f376cf103 fix: remove unused params 2023-07-24 18:02:42 +05:30
Gursheen Anand
db49d53aaf fix: running balance after sorting 2023-07-24 17:42:13 +05:30
Deepesh Garg
164df33419 Merge pull request #36274 from GursheenK/process-soa-customer-filter
fix: customer filter in process soa
2023-07-24 17:32:17 +05:30
Gursheen Anand
5224f13db2 fix: add patch for renaming tds payable report 2023-07-24 17:11:05 +05:30
Gursheen Anand
34d7fb388d fix: customer filter in process soa 2023-07-24 16:47:06 +05:30
mergify[bot]
1436040d4c fix: allow both custodian and location while creating asset (copy #36263) (#36264)
fix: allow both custodian and location while creating asset

(cherry picked from commit bff00bc8b2)

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-07-24 15:51:24 +05:30
ruthra kumar
4464b2a21b Merge pull request #36261 from ruthra-kumar/possible_missing_field_error_on_payment_entry
refactor: apply terms based validation only on sales/purchase doctypes
2023-07-24 15:22:15 +05:30
rohitwaghchaure
7f4dda1b06 Merge pull request #36259 from rohitwaghchaure/fixed-report-default-email-outgoing-error
fix: no default email account causing reposting issue
2023-07-24 15:03:09 +05:30
ruthra kumar
3dd119eeea refactor: apply terms based validation only on sales/purchase doctyp 2023-07-24 14:50:11 +05:30
ruthra kumar
a785a6054e Merge pull request #36251 from ruthra-kumar/performance_tune_timsheet_adding_logic
fix: unresponsive sales invoice page
2023-07-24 14:01:07 +05:30
Rohit Waghchaure
efb51526a9 fix: no default email account causing reposting issue 2023-07-24 14:00:20 +05:30
Ritvik Sardana
8b4228d616 fix: removed duplicate code 2023-07-24 13:59:24 +05:30
Ritvik Sardana
5389dabe19 Merge branch 'develop' of https://github.com/frappe/erpnext into develop-ritvik-pos-dark 2023-07-24 12:48:58 +05:30
Ritvik Sardana
82b36e2ec8 fix: added test for pos closing without item code 2023-07-24 12:47:29 +05:30
Deepesh Garg
203b8ec872 Merge pull request #36220 from marination/dunning-patch-acc-frozen
fix: Patch Dunnings after accounts were frozen
2023-07-24 12:46:32 +05:30
ruthra kumar
740f283ec1 Merge pull request #36241 from ruthra-kumar/fix_allocation_logic_in_get_outstanding_invoices
fix: multiple fixes on payment terms based issues in payment entry
2023-07-24 12:35:25 +05:30
Deepesh Garg
4bb6db86f8 fix: Remove auto repeat (subscription) button from Sales and Purchase documents 2023-07-24 12:29:57 +05:30
Gursheen Anand
2f6d0bdcee fix: col names for party types 2023-07-24 12:20:58 +05:30
Gursheen Anand
38b501e004 fix: make party type filter mandatory 2023-07-24 12:13:47 +05:30
Deepesh Garg
3c92686f0a fix: Default year start and end dates in reports 2023-07-24 11:58:16 +05:30
David Arnold
b740cdfc00 build(deps): update tweepy 3.10.0 -> 4.14.0 2023-07-23 23:14:58 -05:00
Deepesh Garg
cdc9b62688 chore: Remove cur_frm from sales_invoice.js 2023-07-23 22:44:18 +05:30
Deepesh Garg
8d3d9493f0 chore: linting issues 2023-07-23 20:06:41 +05:30
ruthra kumar
d048365da3 refactor: refresh table once after loop ends 2023-07-23 19:56:30 +05:30
Deepesh Garg
0d70ae2a21 chore: Ingnore issues 2023-07-23 19:34:08 +05:30
Deepesh Garg
8ccb8e3c5b chore: Move buying controller to utils 2023-07-23 18:50:44 +05:30
Deepesh Garg
7205fb9b97 chore: convert sales common to utils 2023-07-23 12:07:21 +05:30
ruthra kumar
ec7558b9e0 refactor: handle references without any template and payment_term 2023-07-23 11:55:16 +05:30
ruthra kumar
662ccd467c fix: allocation logic on 'Get Outstanding Invoices' btn in PE
1. fixed broken `payment_term` filter in Payment References section
2. Throw error if user fails to select 'Payment Term' for an invoice
with 'Payment Term based allocation' enabled.
2023-07-23 11:37:27 +05:30
Deepesh Garg
4077254b01 chore: resolve undefined variables issue 2023-07-22 23:07:18 +05:30
Deepesh Garg
0b1e78e127 chore: Add landed cost taxes and charges common in bundles 2023-07-22 21:19:48 +05:30
ruthra kumar
e6abe1b77f Merge pull request #36206 from ruthra-kumar/test_cases_for_payment_term_overallocation
test: overallocation validation in payment entry
2023-07-22 10:41:01 +05:30
ruthra kumar
93246043ec chore(test): enable multi-currency party for testing 2023-07-22 10:01:59 +05:30
ruthra kumar
8f9ef4ef5b chore: validation on multi-currency tran on company curtency account 2023-07-22 09:20:55 +05:30
ruthra kumar
5b37919574 chore: use flt for currency 2023-07-22 09:20:55 +05:30
ruthra kumar
6b4a81ee48 chore: test more scenarios 2023-07-22 09:20:44 +05:30
DaizyModi
653117c2a9 test: fix test case for itemised tax breakup 2023-07-21 17:56:33 +05:30
DaizyModi
b84deec601 fix: Correct Tax Breakup for different tax rates for same hsn code 2023-07-21 17:43:27 +05:30
Ritvik Sardana
7069e2a5a0 fix: removed validate_item_code function in sales_invoice 2023-07-21 17:18:35 +05:30
Deepesh Garg
cc36af57bd Merge pull request #36229 from deepeshgarg007/naming_in_order
fix: FY in naming series variable for orders
2023-07-21 16:05:31 +05:30
Deepesh Garg
7a7d32db81 fix: FY in naming series variable for orders 2023-07-21 16:03:17 +05:30
Gursheen Anand
ec80dc6f09 fix: make column names more general 2023-07-21 15:55:31 +05:30
Gursheen Anand
1c5c310f5a fix: fetch acc dimension fieldname 2023-07-21 13:37:48 +05:30
Gursheen Anand
59a2a04fcc fix: check gl entry status using is_cancelled 2023-07-21 13:22:01 +05:30
Gursheen Anand
1c033ce635 chore: change column format for report 2023-07-21 11:00:19 +05:30
Gursheen Anand
33f8f7d7b3 fix: exclude cancelled gl entries for opening balance 2023-07-21 10:57:55 +05:30
marination
17ff395f9a fix: Reverse GL entries only for submitted Dunnings 2023-07-20 20:54:43 +05:30
Deepesh Garg
de189c5f18 Merge pull request #35950 from FHenry/dev_feat_adress_contact_report
feat: add Lead to Address And Contact report
2023-07-20 20:26:38 +05:30
marination
aeae8d646a fix: Patch dunnings made after accounts were frozen
- Consider "Accounts Frozen Until" and Period Closing Voucher
2023-07-20 19:55:57 +05:30
Deepesh Garg
76db0b63ba Merge pull request #36214 from deepeshgarg007/tb_cancelled_entries
fix: Trial Balance report considering cancelled entries
2023-07-20 18:48:03 +05:30
rohitwaghchaure
1084f0d97f Merge pull request #36209 from mohsinalimat/patch-2
fix: Ambiguous column error while submitting stock entry
2023-07-20 18:03:27 +05:30
rohitwaghchaure
9a9939cfb3 Merge pull request #36208 from rohitwaghchaure/fixed-filter-mandatory-for-batch-wise-balance-report
fix: made item or warehouse filter mandatory
2023-07-20 18:02:37 +05:30
Deepesh Garg
fd58bbff6b fix: Trial Balance report considering cancelled entries 2023-07-20 17:51:54 +05:30
MohsinAli
c21fd45883 fix: Ambiguous column error while submitting stock entry
Stock Entry Type=Manufacture

request.js:457 Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 94, in application
    response = frappe.api.handle()
  File "apps/frappe/frappe/api.py", line 54, in handle
    return frappe.handler.handle()
  File "apps/frappe/frappe/handler.py", line 47, in handle
    data = execute_cmd(cmd)
  File "apps/frappe/frappe/handler.py", line 85, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "apps/frappe/frappe/__init__.py", line 1610, in call
    return fn(*args, **newargs)
  File "apps/frappe/frappe/desk/form/save.py", line 28, in savedocs
    doc.save()
  File "apps/frappe/frappe/model/document.py", line 305, in save
    return self._save(*args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 327, in _save
    return self.insert()
  File "apps/frappe/frappe/model/document.py", line 259, in insert
    self.run_before_save_methods()
  File "apps/frappe/frappe/model/document.py", line 1045, in run_before_save_methods
    self.run_method("validate")
  File "apps/frappe/frappe/model/document.py", line 914, in run_method
    out = Document.hook(fn)(self, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1264, in composer
    return composed(self, method, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1246, in runner
    add_to_return_value(self, fn(self, *args, **kwargs))
  File "apps/frappe/frappe/model/document.py", line 911, in fn
    return method_object(*args, **kwargs)
  File "apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py", line 122, in validate
    self.validate_qty()
  File "apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py", line 433, in validate_qty
    transferred_materials = frappe.db.sql(
  File "apps/frappe/frappe/database/database.py", line 220, in sql
    self._cursor.execute(query, values)
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 158, in execute
    result = self._query(query)
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 325, in _query
    conn.query(q)
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 549, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 779, in _read_query_result
    result.read()
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 1157, in read
    first_packet = self.connection._read_packet()
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 729, in _read_packet
    packet.raise_for_error()
  File "env/lib/python3.10/site-packages/pymysql/protocol.py", line 221, in raise_for_error
    err.raise_mysql_exception(self._data)
  File "env/lib/python3.10/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.OperationalError: (1052, "Column 'qty' in field list is ambiguous")
2023-07-20 13:51:17 +05:30
Rohit Waghchaure
16498627ce fix: made item or warehouse filter mandatory 2023-07-20 13:00:05 +05:30
Deepesh Garg
3bc79eebe3 Merge pull request #35689 from marination/payments-based-dunning
feat: Payments based dunning
2023-07-20 12:06:36 +05:30
ruthra kumar
e7e3853f81 test: overallocation validation in payment entry 2023-07-20 09:08:55 +05:30
HarryPaulo
4b4d828260 fix: inserting of items with pricing rule with qty range 2023-07-19 13:02:55 -03:00
Gursheen Anand
3f5afb9cac fix: reset dimension defaults when company changedin test 2023-07-19 18:15:59 +05:30
Gursheen Anand
23e56d3ec1 fix: clear dimension defaults after test 2023-07-19 16:07:32 +05:30
Deepesh Garg
781e57f5bf Merge pull request #36189 from deepeshgarg007/default_dashboard_dates
fix: Default fiscal year in accounting, buying and selling charts
2023-07-19 13:28:04 +05:30
Deepesh Garg
3759a41b83 fix: Default fiscal year in accounting, buying and sellingcharts 2023-07-19 13:17:12 +05:30
Gursheen Anand
2f7b112736 fix: filter by party in opening row calculation 2023-07-19 12:36:44 +05:30
Gursheen Anand
e19a6f5dcb fix: fetch acc dimensions correctly when fieldname is different from name 2023-07-19 12:26:57 +05:30
Ankush Menat
0218f11f47 ci: dont run tests on branch
6dda420176
2023-07-19 12:17:32 +05:30
Gursheen Anand
b3f6d991b5 fix: duplicate acc dimension in test 2023-07-19 12:02:26 +05:30
Gursheen Anand
dd37f6cbd6 fix: show tax withholding category details for customers 2023-07-19 11:51:45 +05:30
ruthra kumar
bccfd22fc0 Merge pull request #36181 from ruthra-kumar/fix_broken_overallocation_validation_on_multi_term_payment_against_invoice
fix: broken overallocation validation in payment entry
2023-07-19 10:46:41 +05:30
ruthra kumar
ee83f94bb0 refactor: payment term outstanding in party account currency 2023-07-19 10:06:49 +05:30
ruthra kumar
f8d4b19cb9 fix: broken overallocation validation in payment entry
In a multi term payment schedule, overallocation logic broke. Fixing
it using individual term outstanding amount in references. this should
work for the simple, one term payment schedule as well
2023-07-18 21:04:13 +05:30
mergify[bot]
b4db5e9561 fix: validate docs in closed accounting period on save (#36157)
fix: validate docs in closed accounting period on save (#36157)

(cherry picked from commit 5985e02574)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-07-18 17:40:49 +05:30
Gursheen Anand
77deac4fb9 test: PI offsetting entry for accounting dimension 2023-07-18 15:51:01 +05:30
Deepesh Garg
fbea61bbc6 fix: Trailing opening entries in Accounts closing balance (#36175) 2023-07-18 15:16:52 +05:30
Ankush Menat
07d2b896c1 fix: log error during exotel migration 2023-07-18 13:01:33 +05:30
Gursheen Anand
3a3ffa2307 fix: divide offsetting amount only when account exists 2023-07-18 12:51:09 +05:30
Deepesh Garg
cfae52a40a fix: Opening balance in TB report (#36171) 2023-07-18 12:26:19 +05:30
Gursheen Anand
1e1e4b93c1 fix: divide offsetting amount for multiple dimensions 2023-07-18 12:12:24 +05:30
s-aga-r
9fb1533b8f fix(test): test_stock_reservation_against_sales_order (#36166) 2023-07-18 08:31:02 +05:30
rohitwaghchaure
55d5469740 Merge pull request #36168 from frappe/mergify/bp/develop/pr-36162
fix: incorrect Reserved Qty for Production Plan in BIN for the multi-uom case (backport #36162)
2023-07-17 22:44:02 +05:30
Deepesh Garg
9e791efc82 refactor: client side accounts controller 2023-07-17 21:44:43 +05:30
Deepesh Garg
43e65d91ea chore: Remove unused files 2023-07-17 21:26:40 +05:30
Rohit Waghchaure
7af3c3d0b6 fix: incorrect Reserved Qty for Production Plan in BIN for multi-uom case
(cherry picked from commit 2f632d031a)
2023-07-17 15:11:13 +00:00
barredterra
ecaf0aba3c fix: rounding of percentage fields
Always round with precision of 2
2023-07-17 16:45:11 +02:00
Gursheen Anand
ed3bef1840 fix: dict value for dimension for gl entries defined without the dimension 2023-07-17 18:40:52 +05:30
Gursheen Anand
4004427892 test: TB report balanced whenfiltered using acc dimension 2023-07-17 17:57:03 +05:30
Sagar Vora
3b246fd7e6 Merge pull request #36163 from resilient-tech/consistent-quotes 2023-07-17 15:46:40 +05:30
Sagar Vora
bccb718cc2 chore: use consistent quotes 2023-07-17 15:45:36 +05:30
Gursheen Anand
22ba12172f fix: make offsetting entry for all doctypes 2023-07-17 15:17:53 +05:30
Marica
1c1e7380e3 Merge branch 'develop' into payments-based-dunning 2023-07-17 12:33:19 +05:30
Deepesh Garg
ef19634a13 chore: fix build 2023-07-17 12:25:56 +05:30
Gursheen Anand
4e09de4db2 fix: fetch accounting dimension details specific to company 2023-07-17 11:47:33 +05:30
Anand Baburajan
305c37917f chore: add validation for account type of party type and account (#36141)
chore: add validation to check if account type of party type and account match
2023-07-17 11:00:19 +05:30
Kitti U. @ Ecosoft
2607847061 refactor: Leave Application should not be in hook.py (#36008) 2023-07-17 10:14:37 +05:30
rohitwaghchaure
a0742c52bb Merge pull request #36151 from rohitwaghchaure/table-for-serial-and-batch
fix: Added report 'Serial and Batch Summary' to view serial / batch nos
2023-07-16 19:50:15 +05:30
Florian HENRY
e48dc0808d Merge branch 'develop' of https://github.com/frappe/erpnext into dev_feat_adress_contact_report 2023-07-16 11:28:59 +02:00
Rohit Waghchaure
708eefb383 fix: Added report 'Serial and Batch Summary' to view serial / batch nos 2023-07-16 13:28:08 +05:30
Deepesh Garg
6270607c6d fix: Remove current fiscal year from Global Defaults (#35960)
* fix: Remove current fiscal year from Global Defaults

* fix: Remove button to set default

* fix: Add utils to get fiscal year

* fix: Incorrect import

* feat: Add hook for naming series parser
2023-07-16 12:58:42 +05:30
Ankush Menat
c545399b96 Merge pull request #36150 from ankush/perf/desk_requests
perf: send SLA doctypes in boot
2023-07-16 12:30:40 +05:30
Ankush Menat
bd9ef74ef7 perf: send SLA doctypes in boot
This request is fired on every load, data rarely if ever changes though.
2023-07-16 11:38:54 +05:30
Deepesh Garg
f0d4c4c180 Merge branch 'develop' of https://github.com/frappe/erpnext into eslint 2023-07-15 20:29:14 +05:30
Deepesh Garg
a6ce20a0fc chore: Remove domain related files 2023-07-15 19:40:53 +05:30
Gursheen Anand
d3759b3971 fix: make offsetting entry for acc dimensions 2023-07-15 19:32:56 +05:30
Deepesh Garg
3fa2a8c2d8 chore: fix linting issues 2023-07-15 18:03:16 +05:30
s-aga-r
6daaf42b38 Merge pull request #36133 from s-aga-r/FIX-ISS-23-24-02011
perf: index in `Item` and `Item Variant Attribute`
2023-07-15 10:09:27 +05:30
Deepesh Garg
924cdef6d9 ci: add eslint and update linting confs 2023-07-14 18:53:02 +05:30
Deepesh Garg
297c7e833c fix: Opening entries showing up incorrectly in TB report (#36135)
* fix: Opening entries showing up incorrectly in TB report

* chore: Linting Issue
2023-07-14 18:39:37 +05:30
Ankush Menat
6b0b6404fc Merge pull request #36131 from surajshetty3416/move-exotel-to-separate-app
refactor!: Remove exotel
2023-07-14 18:23:00 +05:30
s-aga-r
8f5b94f5fd fix: TypeError while creating WO from PP (#36136) 2023-07-14 18:01:11 +05:30
Rucha Mahabal
692bfccb6e Merge pull request #36116 from barredterra/local-holidays 2023-07-14 17:46:18 +05:30
Ankush Menat
41b6b739c0 fix: touch modified to migrate 2023-07-14 17:39:25 +05:30
Ankush Menat
d95559a53c fix: patch for exotel 2023-07-14 17:39:22 +05:30
s-aga-r
04400eb2e4 perf: index disabled in Item 2023-07-14 17:18:55 +05:30
s-aga-r
e4128a5c91 perf: index variant_of and attribute in Item Variant Attribute 2023-07-14 17:17:24 +05:30
Gursheen Anand
a93d7633d4 test: purchase register and ledger view 2023-07-14 17:16:39 +05:30
barredterra
dab9688410 refactor(Holiday List): use autocomplete fieldtype 2023-07-14 13:33:55 +02:00
Gursheen Anand
b8a83f57b7 chore: fix typo 2023-07-14 16:25:58 +05:30
Suraj Shetty
23bc87f2aa Merge branch 'develop' of https://github.com/frappe/erpnext into move-exotel-to-separate-app 2023-07-14 16:21:48 +05:30
barredterra
8aff5a1dab fix(Holiday List): allow empty value 2023-07-14 12:33:27 +02:00
Deepesh Garg
ac9ad8ec36 fix: Handle multi-company in patch (#36127)
fix: Handle multi-compnay in patch
2023-07-14 15:56:59 +05:30
barredterra
8271a39cdb fix(Holiday List): use current user's language
For consistency with "weekly off" descriptions
2023-07-14 12:16:49 +02:00
barredterra
509061f05b fix: German translations of Holiday List 2023-07-14 12:14:01 +02:00
barredterra
4888d75e72 feat(Holiday List): display localized country name 2023-07-14 11:59:45 +02:00
Gursheen Anand
0d89bfacdb fix: show additional table cols from india compliance api call 2023-07-14 13:03:22 +05:30
Kitti U. @ Ecosoft
3b884efca9 fix: get_dimension with_cost_center_and_project=false is not working. (#35974)
* fix: get_dimension with_cost_center_and_project=false is not working.

with_cost_center_and_project is no python str, and it always evaluated as True, despite JS call it with false

* chore: Linting Issues

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-07-14 13:03:00 +05:30
Raffael Meyer
d5fe1432f8 fix: improve "Update Items" modal (#36105)
* fix: make "Update Items" modal larger

* fix: remove conversion factor from overview

Conversion factor doesn't make much sense without two different UOMs
next to it, hence moving it to row detail view
2023-07-14 12:27:35 +05:30
Gursheen Anand
c084fe6b3f refactor: filter accounting dimensions using qb 2023-07-14 11:05:50 +05:30
Gursheen Anand
944244ceff fix: modify rows and columns for ledger view 2023-07-14 10:50:12 +05:30
Deepesh Garg
b4bd978791 fix: Account balance patch and query fixes (#36117) 2023-07-14 10:28:36 +05:30
Ankush Menat
b5f6a1cc20 ci: fix repo name in relase notes workflow
[skip ci]
2023-07-13 21:04:09 +05:30
barredterra
fd23bd0434 test(Holiday List): weekly off and local holidays 2023-07-13 14:13:33 +02:00
barredterra
aa18b25a71 feat: add local holidays 2023-07-13 13:29:07 +02:00
Deepesh Garg
d631c7dffa fix: Accounts closing balance patch (#36113) 2023-07-13 16:10:05 +05:30
ruthra kumar
72f577aad2 fix: incorrect idx on JE's after reconciliation 2023-07-13 15:12:58 +05:30
s-aga-r
5f307f92e0 refactor: Batch Item Expiry Status report (#36106) 2023-07-13 05:44:58 +05:30
Gursheen Anand
21c993a7b3 fix: clear accounting dimension value when based on field changes 2023-07-12 20:32:08 +05:30
Gursheen Anand
c973e3c746 chore: remove debugging print statements 2023-07-12 17:40:27 +05:30
Gursheen Anand
bf08aa7529 fix: filtering through accounting dimensions 2023-07-12 17:17:58 +05:30
Gursheen Anand
f5027fdcaf refactor: move fn to fetch advance taxes to utils & use qb 2023-07-12 16:42:58 +05:30
Gursheen Kaur Anand
596a14e34f feat: add project filter in reports importing financial statements js file (#36097)
feat: add project filter in financial statements js file
2023-07-12 15:49:17 +05:30
Gursheen Anand
6c11ca1b75 refactor: use qb to fetch PE JV and Inv 2023-07-12 14:43:18 +05:30
Ankush Menat
0340bfc90d ci: regen release notes with GH API (#36098)
[skip ci]
2023-07-12 12:17:20 +05:30
Gursheen Anand
1e8b8b5b29 fix: linting issues 2023-07-12 11:14:03 +05:30
Gursheen Kaur Anand
1094319e3e Merge branch 'develop' into purchase-sales-register-with-PE/JE 2023-07-12 11:00:35 +05:30
Deepesh Garg
0a6c565eb3 fix: Ambiguous column error while submitting stock entry
fix: Ambiguous column error while submitting stock entry
2023-07-12 10:18:38 +05:30
Gursheen Anand
dd8c3d5462 feat: filter based on accounting dimension in profitability analysis 2023-07-12 10:00:18 +05:30
mergify[bot]
8580287092 fix: allow manual asset receipt mov from nowhere (backport #36093) (#36094)
fix: allow manual asset receipt mov from nowhere (#36093)

(cherry picked from commit 4aaa1a15d7)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-07-12 08:26:49 +05:30
HarryPaulo
2268f7db43 fix: paid_amount when the group is mode of payment 2023-07-11 11:35:37 -03:00
rohitwaghchaure
59e54eabef Merge pull request #36088 from rohitwaghchaure/fixed-reposting-circulr-dependecy
fix: circular dependency during reposting causing timeout error
2023-07-11 18:28:39 +05:30
Ankush Menat
7e4b6683e6 fix: Dont bold URL parts
closes https://github.com/frappe/frappe/issues/21445
2023-07-11 18:19:50 +05:30
Rohit Waghchaure
c16a5814d4 fix: circular dependency during reposting causing timeout error 2023-07-11 17:51:44 +05:30
s-aga-r
be5881280f fix: incorrect status in MR created from PP (#36085) 2023-07-11 17:09:23 +05:30
Gursheen Anand
7650b0073a fix: validate party filter for fetching payments 2023-07-11 15:18:28 +05:30
Gursheen Anand
d5aa0e325e feat: fetch JV with PE 2023-07-11 14:47:23 +05:30
Deepesh Garg
ce9164ec69 fix: Validate for missing expense account (#36078)
* fix: Validate for missing expense account

* fix: Validate for missing expense account
2023-07-11 12:03:38 +05:30
ruthra kumar
e44615f52b Merge pull request #36076 from ruthra-kumar/possible_type_error_on_err_creation
fix: possible type error on ERR creation
2023-07-11 10:37:37 +05:30
ruthra kumar
176966daab fix: possible type error on ERR creation 2023-07-11 10:04:17 +05:30
Raffael Meyer
bf84e0d441 refactor: remove frappe.dynamic_link (#35096) 2023-07-10 21:22:06 +05:30
mergify[bot]
872a23c77d fix: also check on_hold (#35910)
fix: also check on_hold (#35910)

(cherry picked from commit 5aa02b8571)

Co-authored-by: RJPvT <48353029+RJPvT@users.noreply.github.com>
2023-07-10 20:34:54 +05:30
Dany Robert
361a357088 fix: payment entry voucher_type error (#35779)
* fix: payment entry `voucher_type` error

* chore: linters
2023-07-10 19:32:59 +05:30
Gursheen Anand
9c87997dae fix: fetch cost center for PE 2023-07-10 19:12:19 +05:30
Gursheen Anand
cbef6c30c3 refactor: move repeating code to common controller 2023-07-10 18:39:35 +05:30
Gursheen Anand
d7ffad1dd3 feat: fetch PE along with SI 2023-07-10 18:07:55 +05:30
Wolfram Schmidt
49c61e7ebb fix: Add company filter in list view (#36047)
fix: Add company filter in list view
2023-07-10 18:03:50 +05:30
rohitwaghchaure
06dcc4ed96 Merge pull request #36063 from rohitwaghchaure/fixed-valuation-for-dn-return
fix: Delivery Note return valuation
2023-07-10 17:48:41 +05:30
Rohit Waghchaure
6a10ae662c fix: Delivery Note return valuation 2023-07-10 17:06:02 +05:30
Dany Robert
5c820ecc20 fix: precision causing outstanding issue on partly paid invoices (#36030)
* fix: precision causing outstanding issue on partly paid invoices

* chore: linters
2023-07-10 16:20:45 +05:30
Gursheen Anand
44493707e2 refactor: use single qb query for PE and PI 2023-07-10 14:37:33 +05:30
mergify[bot]
b3a99e38cc chore: add asset depr posting error in error log (backport #36052) (#36055)
chore: add asset depr posting error in error log (#36052)

(cherry picked from commit 0f9a6ee70a)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-07-10 14:31:19 +05:30
MohsinAli
2816076789 1052, "Column 'qty' in field list is ambiguous in work_order.py 2023-07-10 14:09:41 +05:30
rohitwaghchaure
22eee472dd Merge pull request #36001 from rohitwaghchaure/fixed-added-validation-for-rejected-warerhouse
fix: accepted warehouse and rejected warehouse can't be same
2023-07-10 13:55:20 +05:30
Gursheen Anand
4f0aa54c09 feat: add check for fetching PE along with Invoice details in Purchase Register 2023-07-10 13:38:30 +05:30
rohitwaghchaure
b16f364866 Merge pull request #36054 from rohitwaghchaure/fixed-incorrect-stock-levels
fix: incorrect stock levels in the Batch
2023-07-10 13:35:59 +05:30
Rohit Waghchaure
d618aaef32 fix: accepted warehouse and rejected warehouse can't be same 2023-07-10 13:19:17 +05:30
Rohit Waghchaure
aeaf8fd89c fix: incorrect stock levels in the Batch 2023-07-10 13:03:10 +05:30
ruthra kumar
3ef034dda8 Merge pull request #36051 from ruthra-kumar/auto_exchange_rate_revaluation_creation
feat: Provision to auto create Exchange Rate Revaluation
2023-07-10 12:59:23 +05:30
Ankush Menat
407642869a ci: auto release beta version
[skip ci]
2023-07-10 12:48:47 +05:30
aioaccount
46fe9ac5cd fix: labels and translations (#35963)
fix: labels and translations
* fix: Vietnamese translation of customer
* fix: Vietnamese translation of bill
2023-07-09 20:41:52 +05:30
Gursheen Kaur Anand
674af15696 fix: deferred accounting entries on accounts frozen (#35978)
* fix: accounts frozen entries in deferred accounting

* test: accounts frozen date in deferred accounting

* fix: reset account settings after running test

* fix: resolve conflicts

* fix: modify expected gle when deferred accounting is disabled through JE

* fix: change posting date when accounts not frozen
2023-07-09 20:41:12 +05:30
Raffael Meyer
af28f95c60 refactor(Payment Entry): translatable strings (#36017)
* refactor(Payment Entry): translatable strings

* fix: German translations
2023-07-09 20:19:53 +05:30
aioaccount
ef7fd7548c fix: Vietnamese translation of "Company" (#35887)
fix: Vietnamese translation of "Company"
2023-07-09 20:17:35 +05:30
Deepesh Garg
4d07e20b05 fix: Opening balance in presentation currency in Trial Balance report (#36036) 2023-07-09 20:16:12 +05:30
Raffael Meyer
353d765140 fix: German translations (#35990)
* fix: add missing German translation

* fix: wrong German translation
2023-07-09 14:14:34 +05:30
Navin Balaji
828e647019 fix: bank reconciliation tool variable issue (#36022)
fix: bank reconciliation tool variable issue (#36022)
2023-07-09 14:13:48 +05:30
ruthra kumar
4f51c5a433 refactor: submit and make JV through background job 2023-07-07 05:49:53 +05:30
Raffael Meyer
4badac8e9e fix(Payment Entry): compare rounded amount (#36011) 2023-07-05 21:35:41 +05:30
mergify[bot]
98281341b9 fix: handle loan_repayment's posting_date datetime in bank_clearance_summary report (backport #36004) (#36005)
* fix: handle loan_repayment's posting_date datetime in bank_clearance_summary report (#36004)

(cherry picked from commit 937e1fb024)

# Conflicts:
#	erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py

* chore: resolving conflicts

---------

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-07-04 22:46:00 +05:30
Deepesh Garg
0a17c78a36 fix: Share ledger showing cancelled docs (#35993) 2023-07-04 17:49:07 +05:30
Sagar Vora
30e4052a76 feat(accounts): standardize additional columns implementation for sales/purchase reports (#36000) 2023-07-04 17:41:30 +05:30
Deepesh Garg
2f169575e9 fix: Netherlands - Grootboekschema COA structure (#35991)
fix: Netherlands - Grootboekschema coa structure
2023-07-04 15:30:27 +05:30
Ankush Menat
a449a4be29 chore: Add frappe school links (#35995)
Frappe School provides plenty of free tutorial for learning ERPNext.
2023-07-04 14:58:45 +05:30
barredterra
a939431d48 fix: german translations 2023-07-03 21:03:24 +02:00
barredterra
e686bb0739 Merge remote-tracking branch 'upstream/develop' into payments-based-dunning 2023-07-03 19:56:42 +02:00
rohitwaghchaure
8179d6a30d Merge pull request #35977 from rohitwaghchaure/reserve-pos-invoice-batches
fix: reserve the pos invoice batches
2023-07-03 22:33:45 +05:30
Rohit Waghchaure
1e8f6c0840 fix: reserve the pos invoice batches 2023-07-03 17:38:48 +05:30
ruthra kumar
6644311c8b refactor: checkbox for enabling auto ERR creation 2023-07-03 14:31:13 +05:30
Anand Baburajan
dedb5e23f7 fix: delete loan module workspace properly after separation (#35971)
* fix: delete loan module workspace properly after separation

* chore: run remove_loan_management_module patch again
2023-07-03 13:06:46 +05:30
Deepesh Garg
5448859254 fix: Update no copy for received_qty field (#35965) 2023-07-03 13:03:52 +05:30
Vishnu VS
e05b33a6c2 feat: add method for ordered quantity in supplier scorecard (#35930)
fix: add method for getting ordered quantity in the supplier scorecard variable.

Co-authored-by: vishnu <vishnuviswambara2002@gmail.com>
2023-07-03 09:23:27 +05:30
rohitwaghchaure
ab58c01a0f Merge pull request #35961 from frappe/mergify/bp/develop/pr-35955
fix: incorrect reposting causing stock adjustment entry (backport #35955)
2023-07-02 11:17:37 +05:30
rohitwaghchaure
232dfad13a fix: conflicts 2023-07-02 10:45:12 +05:30
Rohit Waghchaure
b77a808921 fix: reposting has not changed valuation rate
(cherry picked from commit c0c693d8b0)

# Conflicts:
#	erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
2023-07-02 05:13:29 +00:00
Deepesh Garg
3df0c5e32f Merge pull request #35609 from GursheenK/#34282-Record-advance-payment-as-a-liability
feat: Record Advance Payment as a liability
2023-07-01 17:49:49 +05:30
Deepesh Garg
d54f52474a fix: Expense Account filter in Sales Invoice (#35944) 2023-06-30 20:02:46 +05:30
Deepesh Garg
be5cb1aa17 Merge pull request #35943 from GursheenK/company-specific-proj-filtering
fix: project filtering based on company in P&L Report
2023-06-30 20:01:24 +05:30
Deepesh Garg
fda2d2bd59 Merge branch 'develop' of https://github.com/frappe/erpnext into #34282-Record-advance-payment-as-a-liability 2023-06-30 19:35:34 +05:30
Deepesh Garg
80e6c90740 chore: precision in test 2023-06-30 19:35:22 +05:30
Florian HENRY
da72bd9819 feat: add Lead to Adresse And contact report 2023-06-30 15:11:45 +02:00
Deepesh Garg
7e7737d692 test: Update test account 2023-06-30 18:37:52 +05:30
Deepesh Garg
0a49213338 test: Update test records 2023-06-30 17:32:42 +05:30
s-aga-r
fa3ab678e1 Merge pull request #35945 from s-aga-r/BATCH-DISABLE-FILTER
fix: add filter for disabled batch
2023-06-30 13:39:11 +05:30
Marica
0a67a3a9c4 Merge branch 'develop' into payments-based-dunning 2023-06-30 13:32:50 +05:30
Deepesh Garg
bbb6ebb84e fix: Outstanding amount validation 2023-06-30 13:25:22 +05:30
Gursheen Anand
84d4888f5f fix: make company field mandatory in project doctype 2023-06-30 12:54:45 +05:30
Gursheen Anand
ce252a0d45 fix: show projects with no company value set 2023-06-30 12:42:19 +05:30
s-aga-r
90a77030a7 fix: add filter for disabled batch 2023-06-30 12:34:39 +05:30
Gursheen Anand
904ca746a6 fix: project filtering in P&L Report 2023-06-30 12:11:23 +05:30
Anand Baburajan
988d755906 refactor!: removing loan management module (#35522)
* chore: resolving conflicts

* refactor: bank_clearance and add hook for get_payment_entries_for_bank_clearance

* refactor: bank_reconciliation_tool and add hook for get_matching_vouchers_for_bank_reconciliation

* fix: remove sales invoice from bank_reconciliation_doctypes and use hook for voucher clearance

* refactor: remove loan tests from test_bank_transaction

* refactor: bank_clearance_summary and add hook for get_entries_for_bank_clearance_summary

* refactor: removed test_bank_reconciliation_statement

* refactor: bank_reconciliation_statement and add hook for get_amounts_not_reflected_in_system_for_bank_reconciliation_statement

* refactor: add missing hook and patches for module removal and deprecation warning

* refactor: remove loan management translations

* chore: add erpnext tests dependent on lending
2023-06-30 11:02:49 +05:30
rohitwaghchaure
9f1cf0bbb0 Merge pull request #35921 from rohitwaghchaure/fixed-seperate-table-for-schedule
refactor: separate table added to track scheduling in the job card.
2023-06-29 22:24:47 +05:30
s-aga-r
fe4161e4d7 Merge pull request #35935 from s-aga-r/FIX-35898
feat: allow the partial return of components against SCO
2023-06-29 21:20:59 +05:30
Rohit Waghchaure
497c83eb7e refactor: separate table added to track scheduling in the job card 2023-06-29 20:51:44 +05:30
s-aga-r
2a60884abc fix: reduce return qty while calculating transferred qty 2023-06-29 18:59:18 +05:30
s-aga-r
2f6d56dd62 fix: don't update SCO status to closed until full return 2023-06-29 18:44:40 +05:30
Deepesh Garg
0408b6d655 Merge branch 'develop' of https://github.com/frappe/erpnext into #34282-Record-advance-payment-as-a-liability 2023-06-29 12:19:42 +05:30
Deepesh Garg
1e078d03bb fix: Partial PLE cancellation 2023-06-29 12:18:25 +05:30
RJPvT
1d1103f39c chore: update translations
chore: update translations
2023-06-29 11:02:08 +05:30
Deepesh Garg
06821f9781 Merge pull request #35904 from GursheenK/voucher-wise-balance-report
feat: add voucher-wise balance report for unequal dr/cr GL entries
2023-06-29 09:07:45 +05:30
Anand Baburajan
50cbdc778f Merge pull request #35923 from frappe/mergify/bp/develop/pr-35918
fix: asset movement (backport #35918)
2023-06-28 20:59:50 +05:30
Anand Baburajan
a4d6f2eba6 fix: asset movement (#35918)
fix: asset movement fixes
(cherry picked from commit e16c14863b)
2023-06-28 14:46:27 +00:00
Ankush Menat
86f453593a perf: avoid perm checks from background jobs 2023-06-28 20:15:29 +05:30
Ankush Menat
9e1736e027 fix: index collect_progress and project date (#35920)
There's background job to send progress update, this ends up scanning
entire table.
2023-06-28 19:19:14 +05:30
marination
5a952987a3 fix: Use this.frm (Linter) 2023-06-28 17:13:34 +05:30
Marica
0498a31c42 Merge branch 'develop' into payments-based-dunning 2023-06-28 16:48:22 +05:30
Gursheen Kaur Anand
b9e9204e52 fix: create multiple variants button count and status (#35915)
fix: change class for fetching columns in multiple variants
2023-06-28 15:39:00 +05:30
Gursheen Kaur Anand
5113a417a1 fix!: UX of supplier linking with supplier users on portal pages (#35836)
* fix: create and add Portal Users child table in Supplier/Customer

Issue #35772

* fix: modify the original permission check hook

* fix: auto-add role for portal users

* fix: added patch for auto-populating portal users

* fix: modify patch to fetch users correctly

* fix: remove unnecessary code for updating naming_series

* fix(UX): show portal user in list view

Also split columns to reduce whitespace.

* refactor: simpler role checking

* fix: consider parenttype while fetching portal user

* refactor: simpler code, rename variable

* test: supplier portal user can access their docs

* refactor: only add role if not added

* refactor: rename and move patch to supplier

* refactor: dont add role if no perm or existing doc

* fix: add role before save

* refactor: run query directly

* refactor: split patch and apply roles

- if role isn't present dont add portal user
- ignore failure as it's not critical

* test: fix permission creation for webform test

---------

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-06-28 11:22:40 +05:30
mergify[bot]
e832455790 perf: improve item wise register reports (backport #35908) (#35911)
perf: improve item wise register reports (#35908)

(cherry picked from commit 33ee01174b)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-06-28 10:25:03 +05:30
Gursheen Anand
6b9f9f9b0e fix: remove debug flag from sql 2023-06-27 21:59:35 +05:30
Deepesh Garg
7312827d4d fix: On cancel flow 2023-06-27 18:25:10 +05:30
Deepesh Garg
f2edc91dc6 fix: Multi invoice reconciliation 2023-06-27 18:11:47 +05:30
Gursheen Anand
5d726ef037 feat: add voucher-wise balance report logic 2023-06-27 16:49:28 +05:30
HLD
af418d2342 fix: filter parent warehouses not showing (#35897) 2023-06-27 13:17:52 +05:30
s-aga-r
77d08b6dbe Merge pull request #35894 from s-aga-r/FIX-35888
fix(ux): PO Get Items From Open Material Requests
2023-06-27 11:56:46 +05:30
s-aga-r
3a00bf83d6 fix(ux): PO Get Items From Open Material Requests 2023-06-27 11:55:45 +05:30
David Arnold
742df8a25e fix: delivery trip driver is only required on submit (#35876)
This allows drafting trips and stops without yet deciding on the
assignable driver which, in real life, may well be decided on after
preparing and planning the trip.
2023-06-27 11:36:44 +05:30
Deepesh Garg
2d2f0f02d6 Merge pull request #35886 from deepeshgarg007/ldc_breach_fix
fix: TDS amount calculation post LDC breach
2023-06-27 09:39:06 +05:30
Deepesh Garg
62c3ca8286 fix: Paid invoice in AR report 2023-06-26 23:53:55 +05:30
Deepesh Garg
1f9ef6c48f fix: TDS amount calculation post LDC breach 2023-06-26 22:01:12 +05:30
ruthra kumar
84ea0a828c Merge pull request #35882 from ruthra-kumar/refactor_cr_note_reconciliation_with_exchange_gain_loss
refactor: simplify exchange logic on cr/dr note reconciliation
2023-06-26 17:32:12 +05:30
rohitwaghchaure
0e14ea4e32 Merge pull request #35881 from rohitwaghchaure/fixed-serial-batch-bundle-print
fix: serial and batch bundle values in the standard print format
2023-06-26 16:21:34 +05:30
ruthra kumar
af75f6cea7 refactor: simplify exchange logic on cr/dr note reconciliation 2023-06-26 16:09:54 +05:30
Rohit Waghchaure
9cf645e07f fix: serial and batch bundle values in the standard print format 2023-06-26 16:00:53 +05:30
Suraj Shetty
f0a0f078fc Merge pull request #35880 from surajshetty3416/update-node-version 2023-06-26 13:10:30 +05:30
Suraj Shetty
881e95b440 chore: Update required node version to v18 2023-06-26 13:02:08 +05:30
Anand Baburajan
36d26d40a0 perf: improve asset depr schedule creation patch (#35867) 2023-06-26 10:58:36 +05:30
ruthra kumar
a90fe25cc4 Merge pull request #35868 from ruthra-kumar/get_base_grand_total_while_pulling_reference_details
fix: incorrect outstanding and total amount in reference table of payment entry
2023-06-25 18:29:54 +05:30
Deepesh Garg
ebeb5e0cb7 Merge pull request #35594 from nikkothari22/make-accounting-dimension-filter-values-optional
feat: added support for mandatory dimensions per account without applying restrictions on dimension values
2023-06-25 17:55:26 +05:30
Deepesh Garg
63b126967e chore: Linting Issues 2023-06-25 16:24:22 +05:30
Deepesh Garg
bcff4b0e5a chore: linting issues 2023-06-25 16:03:58 +05:30
Deepesh Garg
c7186ff95c Merge pull request #35789 from GursheenK/Provision-to-send-Accounts-Receivable-Reports
feat: Provision to send Accounts Receivable Reports using Process SOA
2023-06-24 17:10:50 +05:30
Patrick Eissler
feafa956f7 feat: add German translations for new email template feature (#35865) 2023-06-24 16:35:52 +05:30
HarryPaulo
1e20016059 fix: POS Closing Entry load all invoices with one request on save (#35819)
fix: load all invoices with one request
2023-06-24 16:34:24 +05:30
Deepesh Garg
4de7a4c571 chore: update typo in patch 2023-06-24 16:31:19 +05:30
Devin Slauenwhite
f9ed8c10ab fix: make reorder_level not required (#35831)
* fix: make reorder_level not required

* fix: allow material request to be made if projected_qty <= reorder_level
2023-06-24 16:03:15 +05:30
Devin Slauenwhite
802c89ffb3 feat: allow Sales Invoice as data source (#35855)
* feat: allow Sales Invoice as data source

* chore: linter
2023-06-24 12:31:16 +05:30
Deepesh Garg
1894dc8197 fix: Test case and code cleanup 2023-06-23 21:53:34 +05:30
Deepesh Garg
da6bc1a13e refactor: Redo workflows 2023-06-23 20:57:51 +05:30
ruthra kumar
2f638ae32a Merge pull request #35604 from pps190/fix-reconcile-invoice-return
fix: reconcile invoice against credit note.
2023-06-23 17:44:25 +05:30
ruthra kumar
9655d78642 test: test reference details response 2023-06-23 17:24:19 +05:30
Marica
2868baebab fix: Payment Term must be mandatory if Allocate Payment based on .. is checked (#35798)
- Front and Back end validation of condition
- Fix test to accomodate fix
2023-06-23 16:00:20 +05:30
Deepesh Garg
df035f6b19 Merge branch 'develop' into Provision-to-send-Accounts-Receivable-Reports 2023-06-23 15:58:38 +05:30
ruthra kumar
9e73af891d fix: get base grand total while pulling reference details in PE 2023-06-23 14:50:14 +05:30
Gursheen Anand
cde82bc0cc fix: modify patch 2023-06-23 12:12:32 +05:30
Gursheen Anand
555c126eb9 fix: add patch for setting default value of report field 2023-06-23 10:52:25 +05:30
mergify[bot]
9a993b0364 fix: show non-depreciable assets in fixed asset register (backport #35858) (#35860)
fix: show non-depreciable assets in fixed asset register (#35858)

fix: show non-depr assets in fixed asset register
(cherry picked from commit 42d09448ee)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-06-23 08:25:00 +05:30
Anand Baburajan
f37484c6fe chore: better err msg on cancelling JE for asset scrap [dev] (#35850)
chore: better err msg on cancelling JE for asset scrap
2023-06-22 22:32:06 +05:30
rohitwaghchaure
f4f8df6cfe Merge pull request #35842 from rohitwaghchaure/fixed-multiple-work-orders-against-sigle-production-order
fix: multiple Work Orders against same production plan
2023-06-22 22:11:09 +05:30
Deepesh Garg
904f835d4a Merge pull request #35602 from deepeshgarg007/pl_account_balance
fix: Remove special treatment for P&L Accounts
2023-06-22 21:11:23 +05:30
Deepesh Garg
05c2198569 test: Update order 2023-06-22 21:08:58 +05:30
Deepesh Garg
13c0c129df Merge pull request #35828 from phot0n/pr-fieldname-item-wise-purchase-register
fix: use correct fieldname for purchase receipt column in item_wise_purchase_register report
2023-06-22 20:40:14 +05:30
Deepesh Garg
e8dff30973 Merge pull request #35846 from deepeshgarg007/patch_workflow_update
ci: use multiple python version in patch test
2023-06-22 20:38:05 +05:30
Deepesh Garg
11a9bd523d test: Add posting date parameter 2023-06-22 20:26:12 +05:30
Deepesh Garg
56e81ada56 ci: use multiple python version in patch test 2023-06-22 19:57:23 +05:30
Deepesh Garg
b101dceb2a test: GL Entry order 2023-06-22 19:38:33 +05:30
mergify[bot]
e745312a10 fix: asset capitalization (backport #35832) (#35843)
* fix: asset capitalization (#35832)

* fix: misc asset capitalisation fixes

* chore: add location in tests and remove unnecessary code

* chore: more fixes and removals

* chore: show company and fix tests

* chore: make target qty read only on capitalization

(cherry picked from commit fb823b53d1)

# Conflicts:
#	erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
#	erpnext/assets/doctype/asset_capitalization/asset_capitalization.py

* chore: fixing conflicts

---------

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-06-22 19:21:52 +05:30
Deepesh Garg
754eb6bdb6 Merge pull request #35650 from deepeshgarg007/ledger_preview
feat: Ledger Preview
2023-06-22 18:30:03 +05:30
Deepesh Garg
d81d6069fb fix: JV query 2023-06-22 18:28:16 +05:30
Deepesh Garg
d9e7bc545e fix: Do full rollback 2023-06-22 16:07:32 +05:30
Deepesh Garg
5c6e3269fb fix: Use GET request 2023-06-22 15:58:41 +05:30
Rohit Waghchaure
80fffbd64b fix: multiple Work Orders agaist same production plan 2023-06-22 15:57:28 +05:30
Deepesh Garg
b523c779f5 Merge branch 'develop' of https://github.com/frappe/erpnext into ledger_preview 2023-06-22 15:43:43 +05:30
Deepesh Garg
0e68da5a2a feat: Show stock ledger preview 2023-06-22 15:43:32 +05:30
ruthra kumar
dde09cb959 Merge pull request #35837 from ruthra-kumar/increase_precision_on_exchange_rate_revaluation
refactor: increase precision for current exc rate in Exchange Rate Revaluation
2023-06-22 13:39:51 +05:30
Deepesh Garg
6d121ae6e4 chore: fix typo 2023-06-22 13:03:09 +05:30
ruthra kumar
b4db25dd18 refactor: increase precision for current exc rate in ERR 2023-06-22 12:40:02 +05:30
rohitwaghchaure
d1bccc8c65 Merge pull request #35829 from rohitwaghchaure/refactor-returned-from-rejected-warehouse
fix: return against rejected warehouse (UX Issue)
2023-06-22 12:03:38 +05:30
Deepesh Garg
3aead05f42 fix: Test related errors 2023-06-22 11:41:43 +05:30
ruthra kumar
4e7deba2ad Merge pull request #35825 from ruthra-kumar/convert_db_call_to_whitelisted_method
fix: multiple fixes in reconciliation tools
2023-06-22 11:27:04 +05:30
ruthra kumar
41b9e92868 fix: incorrect cost center error in bank reconciliation 2023-06-22 10:43:13 +05:30
Deepesh Garg
b64ebc6fcc test: fix payment reco tests 2023-06-21 17:49:45 +05:30
Rohit Waghchaure
756dbe7ce8 refactor: return against rejected warehouse 2023-06-21 17:40:48 +05:30
Deepesh Garg
e7d2bcf108 Merge branch 'develop' of https://github.com/frappe/erpnext into ledger_preview 2023-06-21 17:16:46 +05:30
Deepesh Garg
ed76ee3e16 fix: Move ledger display to dialog 2023-06-21 17:15:46 +05:30
phot0n
dcfc86e3af fix: use correct fieldname for purchase receipt column in item_wise_purcchase_register report 2023-06-21 16:49:54 +05:30
mergify[bot]
39a1f4a4c1 fix: issue of asset value_after_depreciation field getting updated twice if workflow is enabled in Journal Entry (backport #35821) (#35826)
* Fixes issue of asset value_after_depreciation field getting updated twice if workflow is enabled in Journal Entry (#35821)

* Fixes issue of asset value_after_depreciation field getting updated twice if workflow is enabled in Journal Entry

* chore: remove unnecessary line break

* chore: formatting

---------

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

# Conflicts:
#	erpnext/assets/doctype/asset/depreciation.py

* chore: resolve conflicts

---------

Co-authored-by: saeedkola <mohammedsaeedk@gmail.com>
Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-06-21 15:38:06 +05:30
ruthra kumar
ad758b8d85 fix: no permission for accounts settings on payment reconciliation 2023-06-21 14:19:02 +05:30
rohitwaghchaure
edc38edabf Merge pull request #35611 from rohitwaghchaure/fix-dont-allow-to-create-reposting-entry-for-closing-stock-balance
fix: don't allow to make reposting entry for closing stock balance period
2023-06-21 14:15:40 +05:30
Deepesh Garg
92f845c0e1 chore: Advance fetching order 2023-06-21 12:21:19 +05:30
Rohit Waghchaure
96c5c7b1df fix: don't allow to make reposting entry for closing stock balance period 2023-06-21 11:55:51 +05:30
Deepesh Garg
ddbd7d8bbc Merge pull request #35591 from resilient-tech/remove-whitelisting
chore: remove whitelisting for methods not accessed from UI
2023-06-20 20:29:49 +05:30
rohitwaghchaure
8816039bd9 Merge pull request #35810 from rohitwaghchaure/stock-error-for-service-item
fix: stock error for service item
2023-06-20 17:20:26 +05:30
rohitwaghchaure
79e41e329e Merge pull request #35809 from rohitwaghchaure/fixed-key-error-in-stock-balance-report
fix: key error while checking the stock balance report
2023-06-20 17:00:44 +05:30
Rohit Waghchaure
32965f1af9 fix: stock error for service item 2023-06-20 16:27:23 +05:30
Rohit Waghchaure
a627d2a38c fix: keyerror while checking the stock balance report 2023-06-20 15:55:18 +05:30
ruthra kumar
8aa47a13e3 Merge pull request #35794 from ruthra-kumar/exchange_revaluation_only_post_on_account_currency_based_on_scenario
fix: Exchange Rate Revaluation should only post on the currency that has balance in a 'zero' balance account
2023-06-20 13:58:54 +05:30
Deepesh Garg
98cfea6f63 Merge branch 'develop' of https://github.com/frappe/erpnext into #34282-Record-advance-payment-as-a-liability 2023-06-20 13:26:14 +05:30
Deepesh Garg
32c35b87f9 Merge pull request #34675 from frappe/bank-trans-party-automatch
feat: Auto set Party in Bank Transaction
2023-06-20 13:24:44 +05:30
Deepesh Garg
016ed951da test: Update tests 2023-06-20 13:22:32 +05:30
Anand Baburajan
df090cbe87 chore: minor typo in fixed asset register (#35801)
chore: renaming entries to assets
2023-06-20 13:03:15 +05:30
ruthra kumar
6694175a51 refactor: higher precision for rounding loss and allow '0' 2023-06-20 12:44:08 +05:30
ruthra kumar
4567474418 refactor: allow '0' rounding allowance 2023-06-20 12:44:08 +05:30
ruthra kumar
9d04af9ecc refactor: allow higher precision for new exchange rate 2023-06-20 12:44:08 +05:30
ruthra kumar
1b33afd699 fix: for zero bal accounts, dr/cr only on currency that has balance 2023-06-20 12:44:04 +05:30
Anand Baburajan
0d12588583 fix: date and finance book fixes in fixed asset register (#35751)
* fix: handle finance books properly and show all assets by default in fixed asset register

* chore: rename value to depr amount

* chore: get asset value for correct fb properly

* chore: rename include_default_book_entries to include_default_book_assets
2023-06-20 12:06:27 +05:30
marination
8f2e5288ff test: Dunning and PE against partially due invoice
- Check if the right payment portion is picked
- Check if the SI and Dunning are updated on submission and cancellation of PE
2023-06-20 11:47:04 +05:30
Deepesh Garg
175a7baa60 Merge branch 'develop' of https://github.com/frappe/erpnext into #34282-Record-advance-payment-as-a-liability 2023-06-19 21:39:01 +05:30
Smit Vora
4fbff20954 fix: make credit note and debit note exclusive (#35781) 2023-06-19 21:14:42 +05:30
Gursheen Anand
b3d565c91f feat: Provision to send Accounts Receivable Reports using Process Statement of Accounts
Issue #35707
2023-06-19 19:59:24 +05:30
Anand Baburajan
c1da3ddbbf fix: fix get outstanding invoices btn and add get outstanding orders btn (#35776)
* fix: fix get outstanding invoices btn and add get outstanding orders btn

* chore: remove unnecessary arg
2023-06-19 19:53:05 +05:30
Marica
8ab8230adf Merge branch 'develop' into bank-trans-party-automatch 2023-06-19 19:19:15 +05:30
Sagar Sharma
b26d70b527 Merge pull request #35782 from s-aga-r/SE-PURPOSE-INDEX
perf: index `purpose` in `Stock Entry`
2023-06-19 18:43:02 +05:30
s-aga-r
4f941ac5c0 perf: index purpose in Stock Entry 2023-06-19 18:42:25 +05:30
Raffael Meyer
11126521c9 Merge branch 'develop' into bank-trans-party-automatch 2023-06-19 15:04:37 +02:00
Deepesh Garg
9d27a25e5f fix: Allocated amount validation for other party types (#35741)
* fix: Allocated amount validation for other party types

* chore: Validation for return allocations

* chore: minor typo

---------

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-06-19 11:04:50 +05:30
Deepesh Garg
7ec9d76545 Merge branch 'develop' of https://github.com/frappe/erpnext into #34282-Record-advance-payment-as-a-liability 2023-06-19 09:48:01 +05:30
Deepesh Garg
5e9014be8c Merge branch 'develop' into make-accounting-dimension-filter-values-optional 2023-06-19 09:21:04 +05:30
mergify[bot]
78fbd6452b fix: unsupported operand type(s) for //: 'float' and 'NoneType' for POS Barcode search (#35710)
* fix: unsupported operand type(s) for //: 'float' and 'NoneType' for POS Barcode search (#35710)

(cherry picked from commit 58a6bbcf6d)

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

* chore: resolve conflicts

---------

Co-authored-by: Vishal Dhayagude <vishdha@users.noreply.github.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-06-19 09:14:43 +05:30
Abhinav Raut
2a24423ad2 fix: loan interest accrual date (#35695)
fix: loan interest accrual date

---------

Co-authored-by: Abhinav Raut <abhinav.raut@zerodha.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-06-18 23:11:52 +05:30
HENRY Florian
d12c9b434e chore: fr translation lead vs prospect (#35697)
chore: fr translation lead vs prospect
2023-06-18 22:30:15 +05:30
Türker Tunalı
507c966aa7 chore: Make material request title translatable (#35764)
chore: Make material request title translatable
2023-06-18 22:29:42 +05:30
Lakshit Jain
93c0c26843 fix: modify filters for account in journal entry (#35626) 2023-06-18 22:25:28 +05:30
David Arnold
0444b98802 feat: add verified chart of accounts for colombia in two variants (#34508)
This information is scraped from the in Colombia widely trusted site
dedicated to the plan unico de cuentas (PUC): puc.com.co

feat(accounts): add account_type overlay to colombian CoA

Add account_type overlay with a most significant number matching
strategy and a hand-crafted dictionary based on the erpnext
documentation and the corresponding account description from puc.com.co

Script used for scraping:
https://gist.github.com/blaggacao/d45a454d27556f41fef88833937088f1
2023-06-18 22:17:31 +05:30
Sagar Sharma
b5c1c725be Merge pull request #35739 from s-aga-r/FIX-35493
fix(ux): set route options for new `SBB`
2023-06-18 15:13:15 +05:30
rohitwaghchaure
c51e6dba8d Merge pull request #35756 from rohitwaghchaure/fixed-stock-entry-not-able-to-save
fix: validation of job card in stock entry
2023-06-17 13:32:20 +05:30
Rohit Waghchaure
df8c3f0888 fix: validation of job card in stock entry 2023-06-17 12:45:55 +05:30
Sagar Sharma
9fb6fc5b9a Merge pull request #35677 from s-aga-r/FIX-ISS-23-24-01397
fix: add validation for QI in PR
2023-06-17 12:19:07 +05:30
mergify[bot]
e3afcc6945 fix: cannot start / stop Job Card (backport #35753) (#35755)
fix: cannot start / stop jobs

(cherry picked from commit 53ec2a9268)

Co-authored-by: Anoop Kurungadam <anoop@earthianslive.com>
2023-06-17 12:15:47 +05:30
rohitwaghchaure
86612b6c05 Merge pull request #35747 from rohitwaghchaure/fixed-incorrect-stock-value-for-pr-return
fix: incorrect stock value for purchase returned with rejected qty
2023-06-16 23:08:17 +05:30
Marica
05e64b342a Merge branch 'develop' into payments-based-dunning 2023-06-16 19:20:18 +05:30
Ankush Menat
6086d1a99d perf: duplicate queries while checking prevdoc (#35746)
These values can't change durning DB transaction AFAIK
2023-06-16 18:25:58 +05:30
Rohit Waghchaure
28dd758aa3 fix: incorrect stock value for purchase returned with rejected qty 2023-06-16 16:44:56 +05:30
Ankush Menat
29da1db516 perf: Duplicate queries for UOM (#35744)
This query repeats for every item, UOMs rarely if ever change
2023-06-16 16:38:30 +05:30
Ankush Menat
433489a9e6 perf: Index pick list field in stock entry and DN (#35738)
We check if pick list is created against them but there's no index so we
end up reading entire table.

```
+------+-------------+------------------+-------+---------------+----------+---------+------+--------+-----------+----------+------------+-------------+
| id   | select_type | table            | type  | possible_keys | key      | key_len | ref  | rows   | r_rows    | filtered | r_filtered | Extra       |
+------+-------------+------------------+-------+---------------+----------+---------+------+--------+-----------+----------+------------+-------------+
|    1 | SIMPLE      | tabDelivery Note | index | NULL          | modified | 9       | NULL | 207015 | 348940.00 |   100.00 |       0.00 | Using where |
+------+-------------+------------------+-------+---------------+----------+---------+------+--------+-----------+----------+------------+-------------+
```

After

```
+------+-------------+------------------+------+-----------------+-----------------+---------+-------+------+--------+----------+------------+------------------------------->
| id   | select_type | table            | type | possible_keys   | key             | key_len | ref   | rows | r_rows | filtered | r_filtered | Extra                         >
+------+-------------+------------------+------+-----------------+-----------------+---------+-------+------+--------+----------+------------+------------------------------->
|    1 | SIMPLE      | tabDelivery Note | ref  | pick_list_index | pick_list_index | 563     | const | 1    | 0.00   |   100.00 |     100.00 | Using index condition; Using w>
+------+-------------+------------------+------+-----------------+-----------------+---------+-------+------+--------+----------+------------+------------------------------->
```
2023-06-16 15:26:40 +05:30
Ankush Menat
81f916b7d3 perf: Ignore cancelled pick lists while fetching picked items (#35737) 2023-06-16 15:26:01 +05:30
s-aga-r
4b5454c752 fix(ux): set route options for new SBB 2023-06-16 15:04:37 +05:30
marination
47852803f0 fix: Set Address via JS and Py files (for API usecases) 2023-06-16 14:10:07 +05:30
Ankush Menat
07d748c290 perf: Index sales_order_item in Pick list item (#35735)
- `get_picked_items_qty` does full table scan
- because it also locks, it does full table lock.
2023-06-16 14:06:24 +05:30
Gursheen Anand
442e3f2aa2 fix: update outstanding amount and unpaid status on cancellation of payment entry 2023-06-16 13:38:47 +05:30
mergify[bot]
50f83859db fix: consider field precision while setting sle actual_qty (backport #35717) (#35720)
* fix: consider field precision while setting sle actual_qty (#35717)

(cherry picked from commit 3f62e854e5)

# Conflicts:
#	erpnext/controllers/buying_controller.py

* chore: `conflicts`

---------

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
2023-06-15 20:18:17 +05:30
Raffael Meyer
51848ee9d7 Merge branch 'develop' into bank-trans-party-automatch 2023-06-15 16:36:17 +02:00
marination
c32113918e fix: Updation of dunning on PE cancellation 2023-06-15 20:04:54 +05:30
Rucha Mahabal
6dd5117f61 Merge pull request #35709 from ruchamahabal/remove-hierarchy-chart 2023-06-15 19:15:39 +05:30
rohitwaghchaure
6cb31a9770 Merge pull request #35712 from s-aga-r/FIX-ISS-23-24-01470
fix: `Process Loss Report`
2023-06-15 19:13:08 +05:30
rohitwaghchaure
fc38d45c35 Merge pull request #35711 from rohitwaghchaure/fixed-incorrect-gl-for-debit-note
fix: incorrect gl entries for standalone debit note
2023-06-15 19:12:29 +05:30
marination
254bab33da fix: Consider installments/partial payments while back updating Dunning
- Also use data from Overdue Payment table and not just Dunning parent document
2023-06-15 19:00:24 +05:30
Rohit Waghchaure
f9f662679f test: added test case 2023-06-15 18:09:56 +05:30
Anand Baburajan
bb39a2cac7 fix: don't add GL Entry for Acc. Depr. while scrapping non-depreciable assets (#35714)
fix: on asset scrap, don't add gl entry for acc. depr. if no acc. depr.
2023-06-15 17:12:59 +05:30
s-aga-r
d176d86e2c fix: Process Loss Report 2023-06-15 16:01:08 +05:30
marination
4673aa412e fix: Broken pop-up and references to non-existent field
- `child_fieldname` misspelled causing broken pop up to fetch overdue payments
- `sales_invoice` referenced in dunning fields, which has been removed
- Fetch `customer_name` from `customer` link field
2023-06-15 15:48:50 +05:30
Rohit Waghchaure
6e198188ff fix: incorrect gl entries for standalone debit note with update stock 2023-06-15 14:45:27 +05:30
rohitwaghchaure
24d1bf275a Merge pull request #35699 from rohitwaghchaure/fixed-added-validation-for-incorrect-type
fix: added validation for incorrect type
2023-06-15 14:17:04 +05:30
Rucha Mahabal
8c374f57ed chore: remove html2canvas from dependencies
- was used for hierarchy charts (org charts)
2023-06-15 13:56:05 +05:30
Marica
b497436d4f Merge branch 'develop' into payments-based-dunning 2023-06-15 13:12:34 +05:30
Rucha Mahabal
520268002f refactor!: remove hierarchy charts 2023-06-15 13:10:19 +05:30
Rohit Waghchaure
1c2fe085b5 fix: test case and removed outward field 2023-06-15 12:56:41 +05:30
ruthra kumar
490ec63114 Merge pull request #35701 from ruthra-kumar/typeerror_on_exchange_rate_revaluation
fix: typeerror on exchange rate revaluation
2023-06-15 12:24:07 +05:30
Sagar Sharma
ccdf2e6340 Merge pull request #35700 from s-aga-r/FIX-SR-DIFF-QTY
fix: update `Stock Reconciliation` diff qty while reposting
2023-06-15 11:42:24 +05:30
s-aga-r
6a1b0a2fab fix: update Stock Reconciliation diff qty while reposting 2023-06-15 11:39:22 +05:30
ruthra kumar
f8273f7db6 fix: typeerror on exchange rate revaluation 2023-06-15 11:37:59 +05:30
Rohit Waghchaure
f968f0f257 fix: added validation for incorrect type 2023-06-14 23:26:35 +05:30
ruthra kumar
be78ae72ef Merge pull request #35694 from ruthra-kumar/reference_error_on_err
fix: reference error while using exchange rate revaluation
2023-06-14 20:44:16 +05:30
ruthra kumar
cd538e138a fix: reference error while using exchange rate revaluation 2023-06-14 20:28:28 +05:30
marination
772f6ffd21 fix: Linter and incorrect cost center in test records 2023-06-14 16:48:18 +05:30
rohitwaghchaure
4820221a41 Merge pull request #35636 from s-aga-r/FIX-SBB-AttributeError
fix: miscellaneous
2023-06-14 16:02:04 +05:30
Suraj Shetty
afaa85fbde fix(telephony): Check if setup_phone method exists
We are just overriding Data control. 

This fails if other field type like "Small Text" has option set as "Phone"
2023-06-14 15:54:27 +05:30
s-aga-r
2c1ab569a7 fix: add validation for QI in PR 2023-06-14 15:37:28 +05:30
s-aga-r
7549a5c371 fix(ux): add filters for SBB 2023-06-14 15:04:51 +05:30
s-aga-r
5c805db573 fix(ux): add is_cancelled=0 filter for SBB 2023-06-14 15:04:51 +05:30
s-aga-r
fe054508f1 fix: 'NoneType' object has no attribute 'precision' for Job Card 2023-06-14 15:04:36 +05:30
Gursheen Anand
033e4e84f5 fix: modify voucher details for liability entries 2023-06-14 14:20:42 +05:30
barredterra
18495ed624 fix: semgrep issues 2023-06-14 13:53:05 +05:30
barredterra
15816c8afd test: test records for dunning type 2023-06-14 13:52:47 +05:30
barredterra
315df7b2cf test: fix dunning test 2023-06-14 13:52:47 +05:30
barredterra
04aaadcb39 style: sider issues 2023-06-14 13:52:46 +05:30
barredterra
4911c3b5b7 fix: precision for interst 2023-06-14 13:47:16 +05:30
barredterra
ccefe96665 fix: map only overdue payments 2023-06-14 13:47:16 +05:30
barredterra
88f67e4786 fix: set income account and cost center 2023-06-14 13:41:04 +05:30
barredterra
fd6d86eefc fix: show "Create Dunning" when any scheduled payment is overdue 2023-06-14 13:41:04 +05:30
barredterra
028d19f32d test: link Dunning Type to COmpany 2023-06-14 13:41:03 +05:30
Raffael Meyer
d790710ae7 refactor: apply suggestions from code review
Co-authored-by: Himanshu <himanshuwarekar@yahoo.com>
2023-06-14 13:41:03 +05:30
barredterra
28dfbdda93 feat: fetch income account and cost center from dunning type 2023-06-14 13:41:03 +05:30
barredterra
60b6afb470 fix: fetch overdue payments 2023-06-14 13:40:51 +05:30
barredterra
8bfe865759 fix: ignore cancelled dunnings 2023-06-14 13:40:50 +05:30
barredterra
0a06241e7c test: refactor, fix missing income account 2023-06-14 13:40:50 +05:30
barredterra
d55c59f298 test: make failing tests work 2023-06-14 13:40:50 +05:30
barredterra
84459c7196 fix: create payment entry 2023-06-14 13:40:50 +05:30
barredterra
e37f98267b fix: resolve dunning 2023-06-14 13:38:53 +05:30
barredterra
8652331d1c Revert "feat: remove dunning as possible reference from payment entry"
This reverts commit b774d8d0e3.
2023-06-14 13:38:53 +05:30
barredterra
9eeaac0c3e feat: remove dunning as possible reference from payment entry 2023-06-14 13:29:21 +05:30
barredterra
c17ccb455d refactor: run pre-commit 2023-06-14 13:08:56 +05:30
barredterra
24f400b123 feat: remove Dunning dashboard as there are no incoming links 2023-06-14 13:08:55 +05:30
barredterra
1250e56dd6 feat: add Dunning to Dunning Type's dashboard 2023-06-14 13:07:48 +05:30
barredterra
0990011e74 feat: add patch for dunning 2023-06-14 13:07:47 +05:30
barredterra
fd7be5da99 feat: remove obsolete "debit_to" field 2023-06-14 13:01:28 +05:30
barredterra
c142d89952 tests: remove obsolete test 2023-06-14 13:01:14 +05:30
barredterra
ac8b6bba5c feat: resolve dunning on payment entry 2023-06-14 13:00:47 +05:30
barredterra
270040303c refactor: make sider happy 2023-06-14 12:59:27 +05:30
barredterra
6b6f4dd017 refactor: run pre-commit 2023-06-14 12:59:26 +05:30
barredterra
ff7ec977e6 feat: more info for payment deductions 2023-06-14 12:59:26 +05:30
barredterra
16a23d9f0f refactor: dunning 2023-06-14 12:59:26 +05:30
barredterra
603117eb6b feat: change print format to reflect doctype changes 2023-06-14 12:56:28 +05:30
barredterra
3895c03ba9 feat: change make_gl_entries to work with new data structure 2023-06-14 12:56:28 +05:30
barredterra
bc40f3f425 refactor: rename interest_amount to interest, dunning_level 2023-06-14 12:54:17 +05:30
barredterra
be5fb94837 feat: currency section , debit_to, base_dunning_amount 2023-06-14 12:54:14 +05:30
barredterra
df840cca75 refactor: validate totals 2023-06-14 12:54:01 +05:30
barredterra
24e7a21839 refactor: remove redndant argument 2023-06-14 12:54:00 +05:30
barredterra
f143fe7dcc refactor: tests 2023-06-14 12:53:56 +05:30
barredterra
676ed6b881 feat: hide fields in print 2023-06-14 12:50:57 +05:30
barredterra
043066a2c8 style: use double quotes 2023-06-14 12:50:41 +05:30
barredterra
938f7d2266 reafctor: validate instead of postprocess 2023-06-14 12:42:21 +05:30
barredterra
9016baddca feat: company address query + style 2023-06-14 12:42:21 +05:30
barredterra
b07620aacf feat: child table triggers calculation of totals 2023-06-14 12:42:20 +05:30
barredterra
b186f8e9d7 feat: address display 2023-06-14 12:42:17 +05:30
barredterra
db47e1b69c feat: address and contact queries 2023-06-14 12:42:02 +05:30
barredterra
4f51dfe4c5 refactor: remove unnecessary code 2023-06-14 12:42:02 +05:30
barredterra
2d0dadd9ac feat: rework dunning backend 2023-06-14 12:41:59 +05:30
Gursheen Anand
ba4ab06ae3 fix: changed account types in controller method 2023-06-14 12:39:16 +05:30
barredterra
2ee919220a feat: rework dunning frontend 2023-06-14 12:37:58 +05:30
barredterra
8976e94a1d feat: rework doctypes 2023-06-14 12:37:55 +05:30
barredterra
86a8b0b30f refactor: doctype naming
Overdue Payments -> Overdue Payment
2023-06-14 12:37:31 +05:30
barredterra
487c6018bf feat: restructure dunning doctype 2023-06-14 12:37:02 +05:30
barredterra
e7705327f0 feat: filter invoices 2023-06-14 12:35:30 +05:30
barredterra
e5b57ec965 feat: Overdue Payments table 2023-06-14 12:35:29 +05:30
Deepesh Garg
984f89d274 fix: Validation for delivery date in Sales Order (#35597)
* fix: Validation for delivery date in Sales Order

* chore: update utils

* chore: revert

* chore: Add default delivery date
2023-06-13 21:35:52 +05:30
Deepesh Garg
937c0feefe fix: Lower deduction certificate not getting applied (#35667) 2023-06-13 20:06:36 +05:30
Anand Baburajan
491a50a027 fix: make showing taxes as table in print configurable (#35672) 2023-06-13 19:42:56 +05:30
Hossein Yousefian
9f669d4c2f Stock aging report fix when called in dashboard chart (#35671)
fix: get_range_age conditions fixed

see https://github.com/frappe/erpnext/issues/35669
2023-06-13 19:20:07 +05:30
Devin Slauenwhite
20de27d480 fix(accounts): validate payment entry references with latest data. (#31166)
* test: payment entry over allocation.

* fix: validate allocated_amount against latest outstanding amount.

* fix: payment entry get outstanding documents for advance payments

* fix: only fetch latest outstanding_amount.

* fix: throw if reference is allocated

* test: throw error if a reference has been partially allocated after inital creation.

* chore: test name

* fix: remove unused part of test

* chore: linter

* chore: more user friendly error messages

* fix: only validate outstanding amount if partly paid and don't filter by cost center

* chore: minor refactor for doc.cost_center

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

---------

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-06-13 19:06:53 +05:30
Ankush Menat
a3ea985348 refactor: Use db.set_single_value (#35668)
I just applied semgrep autofix. Untested completed, review before merging.

```yaml
- id: frappe-set-value-semantics
  patterns:
    - pattern-either:
      - pattern: frappe.db.set_value($DOCTYPE, None, $...AFTER)
      - pattern: frappe.db.set_value($DOCTYPE, $DOCTYPE, $...AFTER)
  fix: frappe.db.set_single_value($DOCTYPE, $...AFTER)
  message: |
    If $DOCTYPE is a single doctype then using `frappe.db.set_value` is discouraged for setting values in DB. Use db.set_single_value for single doctype instead.
  languages: [python]
  severity: ERROR
```
2023-06-13 17:30:38 +05:30
Gursheen Anand
17341adf1c fix: calculate outstanding amount on reconcile correctly 2023-06-13 15:00:46 +05:30
ruthra kumar
b43e068852 Merge pull request #35659 from ruthra-kumar/fix_attribute_error_in_payment_reconciliation
fix: attribute error on payment reconciliation tool
2023-06-13 10:16:26 +05:30
ruthra kumar
b672616617 Merge pull request #35620 from ruthra-kumar/err_higher_allowance_for_debit_credit_diff
fix: allow custom rounding loss allowance in Exchange Rate Revaluation
2023-06-13 09:46:08 +05:30
ruthra kumar
bada5796fa fix: attribute error on payment reconciliation tool 2023-06-13 09:32:24 +05:30
rohitwaghchaure
4ee08b92ae Merge pull request #35629 from rohitwaghchaure/fixed-process-loss-in-job-card
fix: added process loss in job card
2023-06-12 23:29:15 +05:30
ruthra kumar
96a0132501 fix: allow user to set rounding loss allowance for accounts balance 2023-06-12 22:05:08 +05:30
Ankush Menat
f957a84830 build!: update deps and drop setup.py (#35653) 2023-06-12 21:46:06 +05:30
rohitwaghchaure
64586187de Merge branch 'develop' into fixed-process-loss-in-job-card 2023-06-12 21:39:29 +05:30
rohitwaghchaure
62011410b2 fix: test case PyPDF2 (#35652)
fix: test case
2023-06-12 19:22:55 +05:30
Ankush Menat
1e8ee9354a fix(DX): Check Frappe and ERPNext major versions (#35651) 2023-06-12 19:20:52 +05:30
rohitwaghchaure
93fe923e2a Merge branch 'develop' into fixed-process-loss-in-job-card 2023-06-12 19:04:19 +05:30
mergify[bot]
4f3d531f35 fix: don't set default payment amount in case of invoice return (backport #35645) (#35647)
fix: don't set default payment amount in case of invoice return (#35645)

(cherry picked from commit 79483cc90e)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-06-12 18:43:26 +05:30
Deepesh Garg
011ac131cf fix: Add column values 2023-06-12 18:42:49 +05:30
Sagar Sharma
f1e902be5c Merge pull request #35646 from s-aga-r/FIX-ISS-23-24-01138-1
fix: Stock Reconciliation document update while reposting
2023-06-12 18:42:34 +05:30
s-aga-r
db159dd11f fix: Stock Reconciliation document update while reposting 2023-06-12 18:28:16 +05:30
Rohit Waghchaure
0382eecff4 fix: test case 2023-06-12 18:20:38 +05:30
Gursheen Anand
5e9821dce2 test: modify test to check posting date 2023-06-12 18:00:15 +05:30
ruthra kumar
42f4f80e0c fix: Payment against credit notes will be considered as payment against parent invoice in Accounts Receivable/Payable report (#35642)
* fix: payment against credit note should be linked to parent invoice

* test: AR/AP report for payment against cr note scenario

* fix: cr_note shows up as outstanding invoice

Payment made against cr_note causes it be reported as outstanding invoice
2023-06-12 17:35:13 +05:30
Gursheen Anand
a06017c2c3 fix: Use advance account from Reconciliation document for fetching Payment Entries 2023-06-12 15:24:53 +05:30
Deepesh Garg
2f24546b21 fix: Make difference entry button not working (#35622) 2023-06-12 15:20:28 +05:30
s-aga-r
c9923e4996 fix: 'NoneType' object has no attribute 'precision' 2023-06-12 12:33:13 +05:30
s-aga-r
c6acb0d200 fix: DocType not found 2023-06-12 12:33:13 +05:30
s-aga-r
0b009da122 fix(ux): only list related DocTypes 2023-06-12 12:33:13 +05:30
s-aga-r
9a12545ac3 fix(ux): add filter disabled=0 for batch no 2023-06-12 12:33:07 +05:30
Deepesh Garg
e30c3eafef fix: Stock ledger preview 2023-06-12 11:46:51 +05:30
Gursheen Anand
7591f1010b fix: Make get party account method return a list instead of a single default account. 2023-06-12 11:06:03 +05:30
David Arnold
c1b42b858d fix: set Phone and Email option in doctypes (#35549) 2023-06-11 19:34:41 +05:30
ruthra kumar
dcbd7d5f1f fix: incorrect TCS amount while customer has advance payment (#35397)
* fix: incorrect TCS amount while customer has advance payment

* test: only unallocated advance should for threshold breach validation
2023-06-10 20:55:30 +05:30
Rohit Waghchaure
e9a6191af9 fix: added process loss in job card 2023-06-09 20:33:46 +05:30
Sagar Sharma
e3802d1c3f Merge pull request #35618 from s-aga-r/FIX-SBB-SERIAL-NO-QTY
fix: reset entries qty to `1` for serial item
2023-06-09 13:01:01 +05:30
Anand Baburajan
7bd369c49b fix: calculate wdv depr schedule properly for existing assets [dev] (#35614)
* fix: calculate wdv depr schedule properly for existing assets

* fix: calculate wdv depr schedule properly for existing assets properly

* chore: properly call _get_pro_rata_amt
2023-06-09 12:53:10 +05:30
s-aga-r
b5c5a90f71 fix(ux): set warehouse for new row 2023-06-09 12:22:24 +05:30
s-aga-r
1f28ca717e fix(ux): set entries qty to 1 before making the field read-only 2023-06-09 12:06:46 +05:30
s-aga-r
1d904c0a86 fix(ux): make qty field read-only for serial item 2023-06-09 12:05:02 +05:30
Sagar Sharma
9a819103a7 Merge pull request #35617 from s-aga-r/FIX-CBAL-TypeError
fix: `TypeError` in Closing Stock Balance
2023-06-09 11:36:20 +05:30
s-aga-r
93e3fe8445 fix: reset entries qty to 1 for serial item 2023-06-09 11:10:47 +05:30
s-aga-r
446253ff39 fix: TypeError in Closing Stock Balance 2023-06-09 09:30:24 +05:30
Christian Werner
65b2e1fc33 fix: set parent_project when creating a new timesheet (#35607)
fix "When Creating a new Timesheet from an Task - parent_project is empty" #35578
2023-06-08 20:00:40 +05:30
Raffael Meyer
b91bb17779 refactor: get default contact or address (#35248)
* refactor: get_party_shipping_address

* refactor: get_default_contact

* chore: adding docstrings

* fix: keep original order

* fix: use get_all instead of get_list

---------

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-06-08 19:49:09 +05:30
Gursheen Anand
b65e58c1ae test: add tests for advance liability entries
Add Sales and Purchase Invoice Tests to check if GL entries and Outstanding Amount are generated correctly when advance entries are recorded as liability.

Few changes to return value of added column in Payment Entry References.
2023-06-08 18:15:37 +05:30
ruthra kumar
9cd982aa54 Merge pull request #35610 from ruthra-kumar/fix_travis
chore: fix travis
2023-06-08 15:53:50 +05:30
ruthra kumar
992d61bd90 chore: fix travis 2023-06-08 15:11:46 +05:30
Gursheen Anand
4ee163742a fix: Using one field for both advance liability accounts 2023-06-08 13:15:23 +05:30
Devin Slauenwhite
54935438e1 fix: reconcile invoice against credit note 2023-06-07 15:55:37 -04:00
Devin Slauenwhite
7973951c37 fix: missing attribute error 2023-06-07 15:55:16 -04:00
Devin Slauenwhite
f68ab3dfff test: reconcile credit against invoice 2023-06-07 15:14:24 -04:00
Didiman1998
0c12d4d3c5 fix: remove code that causes upscrolling (#35140)
Co-authored-by: Dietmar Fischer <fischer@kk-software.de>
2023-06-07 22:35:44 +05:30
Deepesh Garg
0bd4de4504 fix: Remove special treatment for P&L Accounts 2023-06-07 22:33:35 +05:30
Trusted Computer
781548e46e Fix: CSS not applied to product title (#35582)
In an erpnext website, the /all-products route shows website items that have been published to the web site.

In the list view (erpnext/e_commerce/product_ui/list.js), the css class is null for the product title. Instead, inline style statements have been added in that can not be modified by overriding CSS.

This fix uses a similar approach to that which is taken in the grid view (erpnext/e_commerce/product_ui/grid.js). It removes the null CSS parameter in the product title link as well as the inline style statement. Then, as in the grid view, the product title is wrapped in a div tag with the product_title CSS class.

This makes it possible to style the product title as desired with a CSS override.

Closes #35580
2023-06-07 22:11:49 +05:30
Deepesh Garg
f732cac678 fix: Project in item-wise sales register (#35596) 2023-06-07 22:06:05 +05:30
Raffael Meyer
0dde4d4c69 refactor: use delete_contact_and_address (#34497)
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-06-07 22:02:38 +05:30
Dirk van der Laarse
3b409af9a0 fix: exclude disabled customers when fetching customers on process statement of accounts (#35539)
fix: exclude disabled when fetching customers
2023-06-07 22:01:44 +05:30
Raffael Meyer
e9d7b9f0f4 fix: column formatting in Bank Reconciliation Tool (#35540)
* fix(Bank Reconciliation): format Date column

* fix(Bank Reconciliation): format Party column

* fix(Bank Reconciliation): actions button

- wrong closing tag
- explicitly quote data-name

* fix(Bank Reco): format date and link in dialog
2023-06-07 21:51:49 +05:30
Raffael Meyer
e1f3b7cbc8 fix: pass translated label to change button type (#35564)
fix: change button type for translated labels

Co-authored-by: Marica <maricadsouza221197@gmail.com>
2023-06-07 21:49:02 +05:30
HarryPaulo
a9a47a51e4 fix: based on status_update.py update opportunity status to converted… (#35145)
fix: based on status_update.py update opportunity status to converted on sales submit
2023-06-07 21:35:52 +05:30
Deepesh Garg
0108b1abe2 fix: Improve validation message (#35489)
* fix: Improve validation message

* Update erpnext/selling/doctype/customer/customer.py

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

---------

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-06-07 21:33:36 +05:30
Ankush Menat
0166f69b31 chore: extend default role profiles 2023-06-07 15:09:49 +05:30
Nikhil Kothari
83a7584475 fix: tests now create filters with checkbox enabled 2023-06-07 15:00:05 +05:30
rohitwaghchaure
930a107af8 Merge pull request #35567 from s-aga-r/FIX-SBB-STATUS
fix(ux): serial and batch bundle status
2023-06-07 14:49:43 +05:30
Nikhil Kothari
e1116bbbbb fix: added server side check for allow/restrict 2023-06-07 14:20:42 +05:30
Nikhil Kothari
83c46085fb feat: added support for mandatory dimensions per account 2023-06-07 14:14:57 +05:30
DaizyModi
5155d5bfb2 chore: remove whitelisting for methods not accessed from UI 2023-06-07 12:05:17 +05:30
Ankush Menat
4507cb3cd7 fix: enqueue_after_commit wherever it makes sense (#35588) 2023-06-07 11:58:36 +05:30
marination
eb1db5eaa3 chore: Remove instances of bank_party_mapper and use new_doc 2023-06-07 11:54:51 +05:30
Deepesh Garg
76197cc437 chore: Default role profiles (#35584) 2023-06-07 10:11:32 +05:30
Deepesh Garg
2ffcca6f10 fix: Interest Accrual on Loan Topup (#35555)
* fix: Interest Accrual on Loan Topup

* chore: CI

* chore: Ignore test
2023-06-07 10:06:13 +05:30
Nabin Hait
1cf1c7943f Merge pull request #35572 from nabinhait/quotation-fix
feat: ability to create quotation against a prospect
2023-06-06 21:54:24 +05:30
Marica
75387bbaef Merge branch 'develop' into bank-trans-party-automatch 2023-06-06 19:03:26 +05:30
marination
752a92bd8b chore: Remove Bank Party Mapper implementation
- Matching by Acc No/IBAN can easily happen with Bank Accounts. It's not a tedious query
- Historical lookups for  Party Name/Desc match are very tricky. The user could have manually set a match and we would not know. Also this leaves the Bank Party Mapper only useful for Party Name/Desc lookups, which feels excessive.
- We want to reduce the number of places the same data is stored and reduce confusion
- The Party Name/Desc will optionally happen fuzzily, or not at all
- There will be no Mapper lookups
2023-06-06 18:59:07 +05:30
Sagar Sharma
a14a08dcb4 Merge pull request #35569 from s-aga-r/FIX-SO-SR-TEST
fix(test): `test_stock_reservation_against_sales_order`
2023-06-06 16:13:22 +05:30
Nabin Hait
5a0aacc0b6 fix: get party details 2023-06-06 15:39:22 +05:30
Nabin Hait
47ce6de57d feat: ability to create quotation against a prospect 2023-06-06 15:19:04 +05:30
s-aga-r
8fe1904f3f fix(test): test_stock_reservation_against_sales_order 2023-06-06 14:59:17 +05:30
s-aga-r
d6208d2e45 fix(ux): serial and batch bundle status 2023-06-06 12:07:46 +05:30
rohitwaghchaure
9e650a004a Merge pull request #35562 from rohitwaghchaure/fixed-validation-for-stock-entry
fix: added validation for insufficient stock during stock transfer
2023-06-05 19:42:03 +05:30
Rohit Waghchaure
dcb0462d51 fix: added validation for insufficient stock during stock transfer 2023-06-05 16:58:54 +05:30
Smit Vora
b1ef19a0cd fix(regional): allow regional override for updating gl_dict (#35550) 2023-06-05 01:43:26 +05:30
Deepesh Garg
2e52a63b0d feat: Accounting Ledger Preview 2023-06-04 19:20:28 +05:30
rohitwaghchaure
64f767b95d Merge pull request #35552 from rohitwaghchaure/fixed-serial-batch-get-query
fix: get_query for batch number and incorrect batch qty
2023-06-04 16:56:46 +05:30
Rohit Waghchaure
acd12c5830 fix: get_query for batch number and incorrect batch qty 2023-06-04 16:09:01 +05:30
Sagar Sharma
5ebf46a1b5 Merge pull request #35510 from s-aga-r/FIX-ISS-23-24-01141
fix: ignore `Non-Stock Item` while calculating `% Picked` in Sales Order
2023-06-03 11:18:05 +05:30
rohitwaghchaure
14292ffc6f Merge pull request #34564 from rohitwaghchaure/serial-no-normalization
Feat: Serial No Normalization and Serial Batch Bundle
2023-06-02 18:13:02 +05:30
Deepesh Garg
abc6fe0b06 refactor!: Remove custom cashflow report mapper (#35523)
* refactor: Remove custom cashflow mapper

* chore: patch to delete docs

* fix: Cleanup defaults during install

* fix: Remove custom cashflow mapper from consolidated financial statement
2023-06-02 17:48:59 +05:30
Rohit Waghchaure
bb95451db6 feat: added jinja method get_serial_or_batch_nos for print format and new print format 'Purchase Receipt Serial and Batch Bundle Print for reference 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
40ab3bdd35 test: test cases for serial and batch bundle 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
42b229435c fix: stock reco test case for serial and batch bundle 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
f4cfc589c6 fix: serial and batch selector 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
39da92929b fix: serial and batch selector 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
26b39ac7f4 fix: travis for asset capitalization and asset repair 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
e88c5d6d90 fix: travis for subcontracting module 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
f79f2a3bab fix: dialog issue 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
74ab20f97a fix: travis for POS merge invoice and putaway rule 2023-06-02 17:14:18 +05:30
Rohit Waghchaure
f8bf4aa7c8 fix: travis for work order, pos invoice and landed cost voucher 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
48fbf99e6d fix: travis for sales and purchase invoice 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
d3ceb07936 fix: travis 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
f704eb7581 fix: average batch wise valuation 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
854b89f252 fix: batch valuation for old entries 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
c2d7461d3c fix: travis issue 2023-06-02 17:14:17 +05:30
Rohit Waghchaure
7290dd87be fix: linters and travis 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
9b72845f0f feat: serial and batch bundle for pick list 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
648efca940 feat: auto create serial and batch bundle 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
c1132d1e6d fix: serial and batch selector and added deprecated decorator 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
440510337c fix: travis 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
0eaf6de5de feat: serial and batch bundle for POS 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
467046436b refactor: serial no ledger and batchwise balance history report 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
ba6e1447ef refactor: serial and batch bundle for Maintenance Schedule 2023-06-02 17:14:16 +05:30
Rohit Waghchaure
e50e5cc7b1 feat: serial and batch bundle for GIT stock entry 2023-06-02 17:14:15 +05:30
Rohit Waghchaure
5bb3173676 refactor: rename doctype serial and batch ledger to serial and batch entry 2023-06-02 17:14:15 +05:30
Rohit Waghchaure
16f26fb3d8 refactor: serial and batch package creation for finished item and cleanup code 2023-06-02 17:14:15 +05:30
Rohit Waghchaure
86da306cca feat: added negative inventory validation and restrict to make backdated entry for serial nos 2023-06-02 17:14:15 +05:30
Rohit Waghchaure
674bd3e2e5 feat: serial and batch bundle for Packing Items 2023-06-02 17:14:15 +05:30
Rohit Waghchaure
9c097e85f8 feat: serial and batch bundle for Stock Reconciliation 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
5ddd55a8ae feat: serial and batch bundle for Subcontracting 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
e6143abb8a refactor: added new file serial batch bundle 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
f1b5966680 refactor: serial and batch reposting 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
6c9b212dd1 fix: removed sales and purchase fields from serial nos 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
ba1aac1613 chore: used frappe.db.bulk_insert to create serial nos and serial bunndle 2023-06-02 17:14:14 +05:30
Rohit Waghchaure
bc75a7ef44 refactor: serial no normalization 2023-06-02 17:14:14 +05:30
Gursheen Anand
74619269f0 feat: Record Advance Payments as Liability
Ability to let user record advance payments as liability instead of a negative asset.

Issue #34282
2023-06-02 17:13:51 +05:30
Nabin Hait
f11d9b019d fix: Ignore permissions while submitting account closing balance record (#35536) 2023-06-02 16:57:00 +05:30
Suraj Shetty
e75bd72fe4 Merge pull request #35530 from surajshetty3416/fix-task-gantt 2023-06-02 11:09:06 +05:30
Suraj Shetty
f7b2d103e7 fix: Task gantt popup style 2023-06-02 10:55:29 +05:30
Sagar Sharma
13f427a762 Merge pull request #35529 from frappe/mergify/bp/develop/pr-35481
fix: update `Stock Reconciliation` document while reposting (backport #35481)
2023-06-01 22:01:10 +05:30
Raffael Meyer
09872301bd Merge branch 'develop' into bank-trans-party-automatch 2023-06-01 18:03:10 +02:00
s-aga-r
0fa56bcdce test: add test case for update stock reconciliation doc
(cherry picked from commit 5c9506c8ca)
2023-06-01 15:55:28 +00:00
s-aga-r
88a3f65d3d fix: update Stock Reconciliation document while reposting
(cherry picked from commit cc95cedfee)
2023-06-01 15:55:28 +00:00
Sagar Sharma
ebf03a51f3 Merge pull request #35525 from s-aga-r/FIX-STOCK-RESERVATION-TEST-CASE
fix(test): `test_stock_reservation_against_sales_order`
2023-06-01 19:41:12 +05:30
rohitwaghchaure
fe6a0a6c30 Merge pull request #35498 from rohitwaghchaure/fixed-db-binlogs-getting-full
fix: old data reposting causing low server disk space
2023-06-01 19:28:03 +05:30
s-aga-r
4044c2ed40 fix(test): test_stock_reservation_against_sales_order 2023-06-01 17:00:57 +05:30
brunoherrick
4eb2717c3b feat(accounts): add Portuguese SNC CoA (#35486)
The ultimate goal of this commit is to add an updated Portuguese Chart of Accounts (CoA), based on Portugal's SNC norm. Account numbers are included. "Account types" shall ideally be confirmed and improved by an accountant. Howbeit, the account types are mostly inspired on former OpenERP, now designated Odoo.
2023-06-01 15:38:18 +05:30
ruthra kumar
c02fc955c5 Merge pull request #35518 from ruthra-kumar/add_precision_in_exchange_rate_revaluation
fix:higher precision causes ERR to misjudge zero bal acc as non-zero
2023-06-01 14:59:04 +05:30
ruthra kumar
0319650187 Merge pull request #35112 from ruthra-kumar/gp_report_simplify_groupby_invoice
refactor(Gross Profit): simplify group by invoice logic
2023-06-01 14:34:01 +05:30
ruthra kumar
0cd47f07a6 fix: higher precision makes ERR to misjudge zero bal acc as non-zero 2023-06-01 14:24:03 +05:30
s-aga-r
0305a925fe fix: ignore Non-Stock Item while calculating % Picked in Sales Order 2023-06-01 14:18:48 +05:30
s-aga-r
03d7742737 fix: ignore Non-Stock Item mapping in Pick List 2023-06-01 14:18:39 +05:30
Akshay
e08d6fb2cb chore: typo in pricing rule schema (#35457) 2023-06-01 14:16:52 +05:30
Rohit Waghchaure
fb1a40cada fix: old data reposting causing low server disk space 2023-05-31 18:20:56 +05:30
rohitwaghchaure
cb19ebcd85 Merge pull request #35482 from rohitwaghchaure/fixed-stock-entry-missing-bom-details
fix: missing bom details in the stock entry
2023-05-31 17:29:19 +05:30
Ankush Menat
4bdd276f74 Merge pull request #35409 from nabinhait/workspace-cleanup
refactor: Workspace cleanup
2023-05-31 16:40:26 +05:30
Sagar Sharma
a250562f0b Merge pull request #35503 from s-aga-r/FIX-ISS-23-24-01158
fix(ux): throw if no row selected to create repost entries
2023-05-31 16:35:41 +05:30
Sagar Sharma
fe7c626098 Merge branch 'develop' into FIX-ISS-23-24-01158 2023-05-31 16:34:00 +05:30
Ankush Menat
bb67cc03df chore: typo 2023-05-31 16:31:58 +05:30
s-aga-r
1905239ec2 fix(ux): throw if no row selected to create repost entries 2023-05-31 15:30:45 +05:30
Sagar Vora
1287ee65b5 Merge pull request #35500 from resilient-tech/remove-wl 2023-05-31 14:44:59 +05:30
Sagar Vora
517d8a03ec chore: remove whitelisting for method not accessed from UI 2023-05-31 14:39:03 +05:30
Ankush Menat
686685bba0 fix: use kwargs in new_doc (#35497)
To handle https://github.com/frappe/frappe/pull/21190#event-9386089620
2023-05-31 12:50:14 +05:30
Deepesh Garg
bb21c044f6 fix: Billing Address display in buying transactions (#35451) 2023-05-31 11:02:30 +05:30
Deepesh Garg
27d5e6a99b fix: Error while validating budget (#35487)
* fix: Error while validating budget

* chore: remove print statement
2023-05-31 10:51:33 +05:30
Rohit Waghchaure
2fc7d82324 fix: missing bom details in the stock entry 2023-05-30 18:22:48 +05:30
rohitwaghchaure
ffd5308ed9 Merge pull request #35478 from rohitwaghchaure/fixed-lead-time-calculation-in-work-order
fix: incorrect transferred qty in the job card
2023-05-30 18:11:57 +05:30
Rohit Waghchaure
d3a5e49db9 fix: incorrect transfer quantity in the job card 2023-05-30 17:27:16 +05:30
Anand Baburajan
dbdc420066 fix: allow assets with depr entries to be cancelled (#35477)
fix: allow asset with depr entries to be cancelled
2023-05-30 16:28:57 +05:30
Nabin Hait
e78a7de1e5 fix: Rearranged accounting module links 2023-05-30 13:25:00 +05:30
Nabin Hait
5cf4c8c8b7 fix: removed duplicate links of manufacturing workspace 2023-05-30 13:18:58 +05:30
Nabin Hait
86f88817a9 fix: Added pos links in Selling workspace 2023-05-30 13:18:58 +05:30
Nabin Hait
0b28f641ad fix: Delete Retail and Utilities worspaces amd hide default Settings and Integration workspaces 2023-05-30 13:18:52 +05:30
Nabin Hait
243c49c550 refactor: Workspace cleanup 2023-05-30 13:17:59 +05:30
Sagar Sharma
7a3d16fc61 Merge pull request #35459 from marc-dll/FIX_retention_stock_entry_conversion_factor
fix: retention stock entry: grab conversion factor from source
2023-05-30 11:05:58 +05:30
Sagar Sharma
91ca266db6 Merge branch 'develop' into FIX_retention_stock_entry_conversion_factor 2023-05-30 11:05:37 +05:30
rohitwaghchaure
df921b79a4 Merge pull request #35465 from rohitwaghchaure/fixed-inter-transfer-company
fix: rate not fetching properly for inter transfer purchase order
2023-05-30 09:14:16 +05:30
Rohit Waghchaure
2931c657f4 fix: rate not fetching properly for inter transfer purchase order 2023-05-30 08:34:12 +05:30
rohitwaghchaure
7dce06021e Merge pull request #35462 from ankush/item_quick_entry
refactor!: Drop custom item quick entry
2023-05-30 08:32:09 +05:30
Sagar Sharma
ed0c8ae452 Merge branch 'develop' into FIX_retention_stock_entry_conversion_factor 2023-05-30 08:05:54 +05:30
Anand Baburajan
ae26d72f7f fix: monthly wdv depr schedule for existing assets [dev] (#35460)
fix: monthly wdv depr schedule for existing assets
2023-05-29 23:18:07 +05:30
Ankush Menat
b10e19141c refactor!: Drop item quick entry
- Item variants creator - we have better one on document
- Everything else - hardcoded behaviour that's not needed anymore IMO.
2023-05-29 22:33:56 +05:30
Marc de Lima Lucio
6954f538c9 fix: retention stock entry: grab conversion factor from source 2023-05-29 17:41:14 +02:00
Ankush Menat
d84c8de46c Merge pull request #35453 from ankush/stock_onboarding_workspace
fix: stock onboarding
2023-05-29 15:13:14 +05:30
Ankush Menat
964bb1d948 chore: docs for stock settings
[skip ci]
2023-05-29 15:11:28 +05:30
Ankush Menat
8fe8f80033 fix: replace stock projected with ledger
Ledger is much more widely used report, better to show that first?
2023-05-29 14:44:54 +05:30
Ankush Menat
dd245ccc7f fix: reorder stock reco tour 2023-05-29 14:44:54 +05:30
Ankush Menat
3341cd6b80 fix: filter parent warehouses by company 2023-05-29 14:44:54 +05:30
Ankush Menat
aa9f926298 fix: warehouse tour
- remove warehouse type, it doesn't do what it says. Misleading.
2023-05-29 14:44:54 +05:30
Ankush Menat
81e901ba62 fix: disable/enable with button 2023-05-29 14:44:54 +05:30
Ankush Menat
40ce33dff1 fix: warehouse form cleanup
- organize fields
- group transit fields and move them lower
- enable/disable should be button
- hide pointless fields from listview
2023-05-29 14:44:54 +05:30
Ankush Menat
7a18db561f fix: hide ledger button on new warehouse 2023-05-29 14:44:54 +05:30
Ankush Menat
2e13fbab5e fix: stock settings tour
- remove dead fields
- Keep only essential fields in tour
2023-05-29 14:44:50 +05:30
HarryPaulo
b7407a1d81 feat: add todo calendar to bootinfo.calendars (#35124)
* feat: add todo calendar to bootinfo.calendars

* chore: Linting Issues

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-05-29 10:37:35 +05:30
Raffael Meyer
1f08330ae1 fix: labels and translations (#34896)
* fix: german translation of expense claim

* fix: consistent labels and translations in project Costing and Billing

* fix: german translation of Stock Entry

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-05-29 09:56:16 +05:30
Akshay
1ab04344db fix (ui): debit note issued status indicator color (#35401)
* fix: debit note issued status indicator color

* fix: change DebitNoteIssued color from grey to gray
2023-05-29 09:42:01 +05:30
Vishnu VS
01567b5ec4 fix(UX): task and project name in error message (#35435) 2023-05-29 09:39:13 +05:30
Nabin Hait
3504bf7f62 fix: Show future payments in accounts receivable summary (#35416) 2023-05-29 09:23:40 +05:30
Sagar Sharma
afd9098612 Merge pull request #35437 from s-aga-r/FIX-ISS-23-24-01015
fix: incorrect `POS Reserved Qty` in `Stock Projected Qty` Report
2023-05-28 15:04:47 +05:30
Sagar Sharma
336ff5b327 Merge branch 'develop' into FIX-ISS-23-24-01015 2023-05-27 12:13:39 +05:30
Sagar Sharma
027de41600 fix: incorrect POS Reserved Qty in Stock Projected Qty Report 2023-05-27 12:05:37 +05:30
rohitwaghchaure
4099330bf4 Merge pull request #35426 from rohitwaghchaure/fixed-incorrect-actual-qty-bin
fix: incorrect available quantity in BIN
2023-05-26 22:47:42 +05:30
Sagar Sharma
c3fa1f7450 Merge pull request #34805 from s-aga-r/stock-reservation
feat: Stock Reservation against Sales Order
2023-05-26 17:13:44 +05:30
Sagar Sharma
8cc8af8204 Merge branch 'develop' into stock-reservation 2023-05-26 15:28:54 +05:30
Rohit Waghchaure
718ad3f240 fix: travis 2023-05-26 11:29:22 +05:30
Sagar Sharma
761f8a9f05 fix: use float_precision while checking for negative stock in BIN 2023-05-26 04:23:36 +05:30
Rohit Waghchaure
9e5e2de5d5 fix: incorrect available quantity in BIN 2023-05-25 23:56:23 +05:30
Sagar Sharma
781c93c0e6 Merge pull request #35108 from s-aga-r/PACKING-SLIP-FOR-DN-PACKED-ITEMS
refactor: Packing Slip
2023-05-25 23:54:04 +05:30
Sagar Sharma
b4362e5517 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-25 23:15:46 +05:30
mergify[bot]
55806c51f2 fix: Gross and Net Profit Report - incorrect calculation of totals
* fix: account group totals calculation to consider include_in_gross

(cherry picked from commit 8dcb9302b4)

* refactor: remove unused parameters

(cherry picked from commit 50822f207e)

* refactor: merge separate loops for calculating group / leaf node totals
rename function
remove return statement as the list is  mutated

(cherry picked from commit 1a3b9c5bdf)

* fix: add total col for gross and net profit

(cherry picked from commit cb9b4fbb91)

---------

Co-authored-by: Anoop Kurungadam <anoop@earthianslive.com>
2023-05-25 18:12:50 +05:30
Sagar Sharma
6f0867b006 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-25 18:04:06 +05:30
Sagar Sharma
196e18187f fix(patch): add patch to set packed_qty in draft DN 2023-05-25 18:03:39 +05:30
Sagar Sharma
ba59f53939 Merge pull request #35422 from s-aga-r/stock-balance-typo
chore: typo in stock balance
2023-05-25 17:22:13 +05:30
Sagar Sharma
5c7f3adf5a Merge branch 'develop' into stock-balance-typo 2023-05-25 16:04:11 +05:30
Sagar Sharma
c4e1f927ee chore: typo in stock balance 2023-05-25 16:03:15 +05:30
Sagar Sharma
82f0bd9ee9 feat: add Reserved Stock column in Stock Balance Report 2023-05-25 15:57:06 +05:30
Sagar Sharma
988db2eaf6 Merge branch 'develop' into stock-reservation 2023-05-25 15:10:54 +05:30
ruthra kumar
ec5d34117b Merge pull request #35417 from ruthra-kumar/fix_ambiguous_company_in_gross_profit_report
fix(Gross Profit): 'company' column is ambiguous in filter
2023-05-25 15:06:35 +05:30
Sagar Sharma
ccb2dc4df5 Merge branch 'develop' into stock-reservation 2023-05-25 14:35:59 +05:30
ruthra kumar
448712f719 fix(Gross Profit): 'company' column is ambiguous in filter 2023-05-25 14:18:41 +05:30
Sagar Sharma
fefd788eb5 fix(ux): add non-group warehouse filter 2023-05-25 11:49:47 +05:30
rohitwaghchaure
0bc9c3260e Merge pull request #35348 from rohitwaghchaure/refactor-stock-balance-report
refactor: stock balance report
2023-05-24 19:46:04 +05:30
rohitwaghchaure
693133d8f7 Merge pull request #35410 from rohitwaghchaure/fixed-negative-reserved-qty-for-production-plan
fix: Negative value in Reserved Qty for Production Plan
2023-05-24 19:08:14 +05:30
Rohit Waghchaure
a37608a36c fix: Negative value in Reserved Qty for Production Plan 2023-05-24 17:14:00 +05:30
Sagar Sharma
2813042936 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-24 14:35:51 +05:30
rohitwaghchaure
565322daba Merge branch 'develop' into stock-reservation 2023-05-24 14:32:04 +05:30
rohitwaghchaure
0d8f48891d Merge pull request #35405 from rohitwaghchaure/fixed-available-qty-issue
fix: available qty not fetching for raw material in PP
2023-05-24 14:24:53 +05:30
Rohit Waghchaure
8e3463c4ef fix: available qty not fetching for raw material in PP 2023-05-24 14:12:58 +05:30
Gursheen Kaur Anand
c1f1a033c9 fix: tab-uniformity (#35400)
Made Doctype tabs uniform

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
2023-05-24 12:45:00 +05:30
Anand Baburajan
edb7b0db8f fix: incorrect depr schedule and posting dates on selling of existing assets [dev] (#35398)
* fix: calc depr amount properly on selling of existing assets and fix incorrect posting dates

* chore: get number_of_depreciations_booked properly

* chore: fix test_gle_made_by_asset_sale_for_existing_asset
2023-05-24 12:29:46 +05:30
Rohit Waghchaure
3f548ac910 fix: Stock Analytics and Warehouse wise Item Balance Age and Value issue 2023-05-23 17:06:11 +05:30
Rohit Waghchaure
545b2d32cd fix: balance quantity 2023-05-23 17:06:11 +05:30
Rohit Waghchaure
d9979b2ffb refactor: stock balance report 2023-05-23 17:06:11 +05:30
Ankush Menat
b0eb72ffac fix: replace quotation with invoice in first onboarding (#35389)
[skip ci]
2023-05-23 15:35:55 +05:30
Sagar Sharma
3940deb31c Merge pull request #35303 from s-aga-r/FIX-34761
fix: Pick List TypeError
2023-05-23 14:20:49 +05:30
Sagar Sharma
a111917114 fix: Pick List TypeError 2023-05-23 12:57:48 +05:30
Sagar Sharma
00bb8add40 Merge pull request #35380 from CodeVenturers/OpenContrib
fix: TypeError while saving Job card
2023-05-23 10:49:42 +05:30
vishnu
8c34cc0e00 fix: use flt instead of mandatory field 2023-05-23 04:27:50 +00:00
rohitwaghchaure
4cb9cbee06 Merge pull request #35381 from rohitwaghchaure/fixed-skip-available-qty-for-sub-assembly
feat: provision to skip available sub assembly items in the production plan
2023-05-23 09:39:09 +05:30
Sagar Sharma
4fee4fb3b7 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-23 07:10:09 +05:30
Rohit Waghchaure
9dd566c1e8 test: test case to skip available qty for sub-assembly items 2023-05-23 01:02:16 +05:30
Rohit Waghchaure
64751ec4d9 feat: provision to skip available sub assembly items in the production plan 2023-05-23 00:16:48 +05:30
vishnu
a209fb4b64 fix: error while saving job card 2023-05-22 18:00:50 +00:00
Sagar Sharma
9308cd9b57 Merge pull request #35376 from s-aga-r/FIX-ISS-23-24-00368-2
fix: don't recalculate rate for SCR rejected warehouse SLE
2023-05-22 15:45:30 +05:30
Sagar Sharma
57ee473fa4 fix: don't recalculate rate for SCR rejected warehouse SLE 2023-05-22 15:07:39 +05:30
Sagar Sharma
7e4dc11c4c Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-21 08:34:41 +05:30
Ankush Menat
ba61865ee6 chore: drop outdated navigation video
new stuff is in work, this one is actually counter-productive rn.
2023-05-20 19:45:59 +05:30
rohitwaghchaure
44cd76bb48 Merge pull request #35365 from rohitwaghchaure/create-reposting-entries-from-report
feat: provision to make reposting entries from Stock and Account Value Comparison Report
2023-05-20 17:06:13 +05:30
Rohit Waghchaure
7b818e9d34 feat: provision to make reposting entries from Stock and Account Value Comparison Report 2023-05-19 18:53:40 +05:30
Deepesh Garg
68eee35c5d Merge pull request #35346 from nabinhait/account-closing-balance-patch-fix
fix: account closing balance patch
2023-05-19 11:09:39 +05:30
rohitwaghchaure
216983a729 Merge pull request #34909 from ihosseinu/get_incoming_rate_v14_fix
Get incoming rate v14 fix
2023-05-19 09:56:32 +05:30
Sagar Sharma
44b0bc2d76 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-19 09:20:21 +05:30
ruthra kumar
f143bd1bec Merge pull request #35355 from ruthra-kumar/fix_possible_type_erro_on_so_creation_from_quotation
fix: possible type error on quotation -> sales order creation
2023-05-18 13:31:29 +05:30
Marica
6fe5264ae2 Merge branch 'develop' into bank-trans-party-automatch 2023-05-18 12:57:58 +05:30
ruthra kumar
b2290c6f57 fix: possible type error on quotation -> sales order creation 2023-05-18 12:48:15 +05:30
ruthra kumar
1587ce3bfb Merge pull request #35335 from ruthra-kumar/incorrect_tds_calcuation_if_supplier_has_different_category
fix: tds incorrectly calculated for invoice that are below threshold
2023-05-18 12:38:31 +05:30
ruthra kumar
73bcd4451a Merge pull request #35352 from niyazrazak/patch-12
fix: create sales order
2023-05-18 12:07:35 +05:30
ruthra kumar
132846bbd1 fix(test): cumulative threshold checks 2023-05-18 12:00:59 +05:30
MOHAMMED NIYAS
90ddf1c0f0 fix: create sales order
Getting error while clicking create sales order button from quotation

Taceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 66, in application
    response = frappe.api.handle()
  File "apps/frappe/frappe/api.py", line 54, in handle
    return frappe.handler.handle()
  File "apps/frappe/frappe/handler.py", line 45, in handle
    data = execute_cmd(cmd)
  File "apps/frappe/frappe/handler.py", line 83, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "apps/frappe/frappe/__init__.py", line 1607, in call
    return fn(*args, **newargs)
  File "apps/frappe/frappe/model/mapper.py", line 36, in make_mapped_doc
    return method(source_name)
  File "apps/erpnext/erpnext/selling/doctype/quotation/quotation.py", line 263, in make_sales_order
    return _make_sales_order(source_name, target_doc)
  File "apps/erpnext/erpnext/selling/doctype/quotation/quotation.py", line 333, in _make_sales_order
    doclist = get_mapped_doc(
  File "apps/frappe/frappe/model/mapper.py", line 144, in get_mapped_doc
    postprocess(source_doc, target_doc)
  File "apps/erpnext/erpnext/selling/doctype/quotation/quotation.py", line 291, in set_missing_values
    for d in customer.get("sales_team"):
TypeError: 'NoneType' object is not iterable
2023-05-18 10:23:58 +05:30
rohitwaghchaure
ffb353032d Merge branch 'develop' into get_incoming_rate_v14_fix 2023-05-18 06:13:52 +05:30
rohitwaghchaure
6fbcc3d196 Merge pull request #35298 from CodeVenturers/OpenContirb
fix: Creating landed cost voucher from connections
2023-05-18 06:00:07 +05:30
Anand Baburajan
8c53e0f004 fix: depreciation schedule for existing assets [dev] (#35256)
* fix: depreciation schedule for existing assets

* chore: correct logic for existing assets and fix test

* chore: properly check if depr amount is non zero
2023-05-17 22:29:09 +05:30
Nabin Hait
2b8c39eee9 fix: account closing balance patch 2023-05-17 22:05:46 +05:30
marination
4364fb9628 feat: Optional Fuzzy Matching & Skip Matches for multiple similar matches
- Fuzzy matching can be enabled optionally in the settings
- If a query gets multiple matches with the same score, do not set a party as it is an extremely close call
- misc: Add 'cancelled' status to Bank transaction
- Test for skipping matching with extremely close matches
2023-05-17 19:45:03 +05:30
Sagar Sharma
cf0d37cd82 Merge pull request #35306 from s-aga-r/FIX-35014
fix: Pick List Status
2023-05-17 18:12:30 +05:30
Sagar Sharma
fcea907cf9 Merge branch 'develop' into FIX-35014 2023-05-17 16:09:21 +05:30
Sagar Sharma
9fb8b1827d fix: Pick List Status 2023-05-17 16:07:58 +05:30
Ankush Menat
e5c86bc2e8 fix: consider 0 if rate/qty are null (#35338)
[skip ci]
2023-05-17 16:04:49 +05:30
Sagar Sharma
0f3230f581 Merge pull request #35337 from s-aga-r/FIX-SCR-CONSUMED-QTY-UX
fix(ux): SCR consumed-qty read-only property
2023-05-17 15:57:30 +05:30
Sagar Sharma
adf2474d9d fix(ux): SCR consumed-qty read-only property 2023-05-17 15:12:47 +05:30
marination
4a14e9ea4e fix: Tests 2023-05-17 14:23:44 +05:30
ruthra kumar
84b7c1bba0 fix: tds incorrectly calculated for invoice that are below threshold
Two purchase invoices for the same supplier, using different tax
withholding categories have this issue.

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

1. PINV1 of net total: 105/- uses cat1. TDS is calculated as it
breached single threshold
2. PINV2 of net total: 200/- uses cat2. TDS incorrectly calculated as
PINV1 already has TDS calculated and 'consider_party_ledger_amount' is enabled.
2023-05-17 13:55:41 +05:30
Sagar Sharma
42804306fd Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-17 13:17:59 +05:30
ruthra kumar
e927f6cab1 Merge pull request #35239 from ashish-greycube/patch-8
fix: in payment_entry  difference amount cal is broken
2023-05-17 10:25:55 +05:30
ruthra kumar
0da6c1688b fix: unable to create partial invoice with auto fetch terms enabled (#35285)
fix: fetch so/po terms if auto fetch is enabled
2023-05-16 18:57:42 +05:30
rohitwaghchaure
96e6014d12 Merge pull request #35328 from rohitwaghchaure/fixed-create-reposting-entry-for-cancelled-documents
fix: force to do reposting for cancelled document
2023-05-16 17:31:45 +05:30
Ashish Shah
ae4e56747c refactor: use 'flt' for base_total_taxes_and_charges
difference_amount calculation is broken, as calculation gives NaN. Fix is make frm.doc.base_total_taxes_and_charges as flt(frm.doc.base_total_taxes_and_charges)
2023-05-16 16:55:11 +05:30
Rohit Waghchaure
6e661e7c0e fix: force to do reposting for cancelled document 2023-05-16 16:23:52 +05:30
ruthra kumar
776a83066d fix: cancelled vouchers in tax withheld vouchers list (#35309) 2023-05-16 15:54:46 +05:30
Ankush Menat
5574d9a72d fix(UX): misc "home" onboarding improvements (#35319)
* fix(UX): cleanup "Home" onboarding

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

* fix(UX): Show quick entry for item

* chore: fix copy here and there
2023-05-16 13:38:55 +05:30
Rucha Mahabal
9feda1b829 perf: cache and simplify queries for holiday list (#35315) 2023-05-16 13:11:47 +05:30
rohitwaghchaure
5c2d7701ea Merge pull request #35312 from rohitwaghchaure/fixed-item-list-view-not-working
fix: item list view not working
2023-05-16 01:09:44 +05:30
Rohit Waghchaure
0489e30244 fix: item list view not working 2023-05-16 00:48:52 +05:30
rohitwaghchaure
3f5ce43185 Merge pull request #35138 from s-aga-r/FIX-ISS-23-24-00368
fix: recalculate costs in SCR while reposting
2023-05-15 16:26:04 +05:30
rohitwaghchaure
8afbb06a33 Merge branch 'develop' into FIX-ISS-23-24-00368 2023-05-15 13:42:20 +05:30
Wolfram Schmidt
c236979508 fix: Update de.csv (#35278)
added many fixes on the base of 'No' which is often wrongly translated to 'Kein'.

Also removed translation of Naming Seris like ACC-INV-.YYYY.- to ACC-INV-.YYYY.-
2023-05-15 13:25:23 +05:30
Smit Vora
2a609616d9 fix: port option for additional_conditions in item wise sales register (#35187)
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-05-15 13:24:39 +05:30
vishnu
f2ceb00379 fix: Creating landed cost voucher from connections 2023-05-14 09:35:38 +00:00
Indrajith.vs
0c8276ec82 fix: sales person allocated amount calculation error nonetype and float (#35293)
fix: sales person allocated amount calculation error nontype and float
2023-05-14 11:47:46 +05:30
Raffael Meyer
870b02b03c fix: allow over-payment against SO (#35079) 2023-05-14 08:59:58 +05:30
Daizy Modi
19cd687784 fix: function batch_no should only be declared once (#35115)
fix: remove twice event call of `batch_no` to update batch qty
2023-05-14 08:56:25 +05:30
Kevin Shenk
26c5cfabdc feat: copy project from timesheet to invoice (#35146)
copy project from timesheet to invoice
2023-05-14 08:49:28 +05:30
HarryPaulo
e12e3bb012 fix: allow search leads by doctype search fields
* fix: allow search leads by doctype search fields

* fix: allow search leads by doctype search fields, linters fix
2023-05-14 08:08:47 +05:30
Phanupong Janthapoon
2b59a95162 fix: share_transfer display wrong currency symbo
In multi-companies setting, on amount and rate field of  Share Transfer
doctype are displaying wrong currency symbol, when create a
Share Transfer of others company that has different currency than
the main company. This due to the lack of `options` on those fields.

To fix this, add `options` to `amount` and `rate` fields.
2023-05-14 08:06:58 +05:30
rohitwaghchaure
e6f092d257 Merge pull request #35289 from rohitwaghchaure/fixed-inventory-dimesion-for-inter-compnay-trasfer-return
fix: inventory dimension for returned inter company transfer
2023-05-13 14:26:17 +05:30
Rohit Waghchaure
38aaba5720 fix: inventory dimension for inter company transfer return use case 2023-05-13 13:00:05 +05:30
Sagar Sharma
81a57e4e41 Merge branch 'develop' into stock-reservation 2023-05-13 09:44:06 +05:30
Sagar Sharma
9b617cc062 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-13 09:43:54 +05:30
Sagar Sharma
e17eeec619 Merge branch 'develop' into FIX-ISS-23-24-00368 2023-05-13 09:43:44 +05:30
Sagar Sharma
59f9d41756 Merge pull request #35275 from s-aga-r/FIX-35272
fix: add missing options for `Content Align`
2023-05-13 09:34:45 +05:30
Sagar Sharma
88ab075b11 Merge branch 'develop' into FIX-35272 2023-05-13 09:33:25 +05:30
rohitwaghchaure
e7bb6ad31c Merge pull request #35224 from rohitwaghchaure/fixed-inventory-dimension-for-material-transfer-not-working
fix: inventory dimension for material transfer not working
2023-05-13 02:15:18 +05:30
Rohit Waghchaure
6798b900ef fix: inventory dimension for material transfer not working 2023-05-13 01:44:06 +05:30
Sagar Sharma
4aff3c9a50 Merge branch 'develop' into FIX-35272 2023-05-12 15:06:47 +05:30
Sagar Sharma
d16caa2d2c fix: add missing options for Content Align 2023-05-12 15:06:03 +05:30
rohitwaghchaure
0723fbc108 Merge pull request #35273 from rohitwaghchaure/fixed-incorrect-packing-list
fix: incorrect packing items
2023-05-12 14:42:57 +05:30
Rohit Waghchaure
a686b8c337 fix: incorrect packing items 2023-05-12 14:12:29 +05:30
rohitwaghchaure
46a2bd8986 Merge pull request #35268 from rohitwaghchaure/fixed-incorrect-bom-filter-issue
fix: BOM item filter issue
2023-05-12 13:09:57 +05:30
Rohit Waghchaure
2879cb7c28 fix: bom item filter issue 2023-05-12 13:08:37 +05:30
rohitwaghchaure
4aa1508f04 Merge pull request #35261 from rohitwaghchaure/fixed-timeout-error-for-stock-entry-more-than-6-mmoths
fix: enqueue submit/cancel action for stock entry to avoid time out error
2023-05-12 12:32:33 +05:30
Nabin Hait
ca8b587730 Merge pull request #35178 from nabinhait/account-closing-balance-patch
fix: account closing balance patch
2023-05-12 12:07:45 +05:30
Sagar Sharma
b22f9a234b Merge branch 'develop' into FIX-ISS-23-24-00368 2023-05-12 11:55:12 +05:30
Sagar Sharma
9c72c2a6cb refactor: use calculate_items_qty_and_amount() to update scr items rate 2023-05-12 11:50:27 +05:30
Sagar Sharma
d6433f803b refactor(minor): rename function to be more descriptive 2023-05-12 11:45:33 +05:30
Sagar Sharma
46c1bef446 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-12 11:06:00 +05:30
Rohit Waghchaure
2d6f112727 fix: test case 2023-05-12 10:51:14 +05:30
Rohit Waghchaure
7a3801578c fix: enqueue submit/cancel action for stock entry to avoid time out error 2023-05-11 23:20:12 +05:30
Nabin Hait
f5cc41e182 fix: account closing balance patch 2023-05-10 16:41:47 +05:30
Ankush Menat
2ea38333f0 refactor: use job_id instead of job_name (#35242)
depends on https://github.com/frappe/frappe/pull/20951
2023-05-10 13:26:10 +05:30
marination
dbf7a479b6 fix: Use existing bank fields to match by bank account no/IBAN
- Remove newly added fields in Party doctypes to store bank details
- Use Bank Account's fields to match against account no/iban
- For employee, if Bank Account does not exist, find in Employee doctype against account no/iban
2023-05-09 20:47:14 +05:30
rohitwaghchaure
5d43b35d20 Merge pull request #35230 from rohitwaghchaure/fixed-serial-no-issue-stock-reco
fix: Changed type of column 'serial_no' in Stock Reconciliation to fix Data too Long error
2023-05-09 19:54:24 +05:30
rohitwaghchaure
bf29ec4341 Merge pull request #35227 from rohitwaghchaure/fixed-do-not-include-manufacturing-item
fix: non manufacturing items/fixed asset items in BOM
2023-05-09 18:47:36 +05:30
Rohit Waghchaure
1a673fd424 fix: Changed type of column 'serial_no' in Stock Reconciliation to fix Data too long error 2023-05-09 18:45:19 +05:30
ruthra kumar
b8971c7add Merge pull request #35216 from rtdany10/broken-empty-row-save
fix: broken save on empty row existance
2023-05-09 18:31:17 +05:30
Rohit Waghchaure
aba8431d70 fix: non manufacturing items/fixed asset items in BOM 2023-05-09 16:48:30 +05:30
rohitwaghchaure
d5f123f2e1 Merge pull request #35220 from rohitwaghchaure/fixed-performance-issue-for-ste-mr
fix: added search index to improve performance
2023-05-09 14:33:56 +05:30
Rohit Waghchaure
80ea22b56c fix: added search index to improve performance 2023-05-09 12:42:17 +05:30
ruthra kumar
afe9d7614b Merge pull request #35212 from ruthra-kumar/chore_change_throw_to_msgprint
chore: convert throw to msgprint in payment reconciliation job hook
2023-05-08 17:57:13 +05:30
Dany Robert
d9b231aa16 fix: broken save on empty row existance 2023-05-08 12:26:47 +00:00
Anand Baburajan
67f3304ab4 fix: handle empty FBs properly in TB and GL [develop] (#35190)
fix: handle empty FBs properly in TB and GL
2023-05-08 16:55:05 +05:30
Anand Baburajan
5a3acab110 fix: handle empty FBs properly in TB and GL [develop] (#35190)
fix: handle empty FBs properly in TB and GL
2023-05-08 16:54:00 +05:30
Sagar Sharma
12785101d9 Merge branch 'develop' into stock-reservation 2023-05-08 16:47:40 +05:30
Sagar Sharma
2e9278ef90 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-08 16:47:30 +05:30
ruthra kumar
73134d57bf chore: convert throw to msgprint 2023-05-08 16:42:12 +05:30
ruthra kumar
446f3d12eb Merge pull request #35153 from ruthra-kumar/fetch_sales_team_from_customer_master
fix: fetch default sales team on Quotation -> Sales Order creation
2023-05-08 14:19:28 +05:30
ruthra kumar
6315d9f836 Merge pull request #35142 from ruthra-kumar/fix_bypass_check_in_customer_group
fix: ineffective bypass flag for Credit Limit in Customer Group
2023-05-08 14:10:31 +05:30
ruthra kumar
34a5f24026 Merge pull request #35186 from ruthra-kumar/child_account_should_inherit_parent_account_currency
fix: child acc will inherit acc currency if explicitly specified
2023-05-08 14:09:46 +05:30
ruthra kumar
f6ea8fd8d7 test: currency inheritance on child accounts 2023-05-08 13:30:39 +05:30
rohitwaghchaure
ecc80a8504 Merge pull request #34998 from Vishnu7025/develop
fix: update workstation hour rate when workstation change in job card
2023-05-08 09:25:38 +05:30
rohitwaghchaure
328c3369a2 Merge pull request #35200 from rohitwaghchaure/fixed-accepted-warehouse-and-supplier-warehouse-issue
fix: error regarding accepted and supplier warehouse
2023-05-08 09:23:54 +05:30
rohitwaghchaure
457f7f941c Merge pull request #35196 from rohitwaghchaure/fixed-order-of-reposting-entry
fix: pick the in progress reposting entries first
2023-05-08 09:23:34 +05:30
Rohit Waghchaure
15f5f98858 fix: error regarding accepted and supplier warehouse 2023-05-07 20:27:17 +05:30
rohitwaghchaure
530edaf3d1 Merge branch 'develop' into develop 2023-05-07 19:58:42 +05:30
rohitwaghchaure
40e3747b93 Merge branch 'develop' into fixed-order-of-reposting-entry 2023-05-07 01:39:23 +05:30
rohitwaghchaure
c3ca5d0894 Merge pull request #35197 from rohitwaghchaure/fix-incorrect-fg-item-qty-in-job-po
fix: incorrect fg item quantity in subcontracted PO
2023-05-07 01:38:43 +05:30
Ritwik Puri
140cec8eb2 Merge branch 'develop' into fix-incorrect-fg-item-qty-in-job-po 2023-05-06 22:49:09 +05:30
Rohit Waghchaure
af16fbb0a3 fix: incorrect fg item quantity in subcontracted PO 2023-05-06 20:30:53 +05:30
Rohit Waghchaure
c8a4791d9b fix: pick the in progress reposting entries first 2023-05-06 20:09:15 +05:30
Deepesh Garg
23e7c1480f Merge pull request #34897 from barredterra/fix-translation-files
fix: translation files
2023-05-06 18:24:50 +05:30
ruthra kumar
abe691c03d fix: child acc will inherit acc currency if explicitly specified 2023-05-06 10:40:41 +05:30
Hossein Yousefian
27d71e9ec1 Merge branch 'develop' into get_incoming_rate_v14_fix 2023-05-06 08:12:36 +03:30
Nabin Hait
713fa67b96 fix: account closing balance patch 2023-05-05 17:54:34 +05:30
rohitwaghchaure
7fb1e5bdcd Merge pull request #35167 from rohitwaghchaure/fixed-job-card-excess-material-trafer
fix: not allow to transfer excess materials against the job card
2023-05-04 19:10:46 +05:30
Rohit Waghchaure
8167b24219 fix: not allow to transfer excess materials against the job card 2023-05-04 18:24:16 +05:30
rohitwaghchaure
3993bfd510 Merge pull request #35161 from rohitwaghchaure/configure-notify-reposting-role
feat: configuration to notify reposting errors to specific role
2023-05-04 17:35:14 +05:30
rohitwaghchaure
2bf771683c Merge pull request #35158 from rohitwaghchaure/fixed-internal-trasfer-condition
fix: internal transfer condition
2023-05-04 17:01:58 +05:30
Rohit Waghchaure
c7b62011db feat: configuration to notify reposting errors to specific role 2023-05-04 16:49:14 +05:30
Rohit Waghchaure
b5a2ccf21d fix: internal transfer condition 2023-05-04 15:38:35 +05:30
Sagar Sharma
e0b22edb2e test: add test case 2023-05-04 15:07:52 +05:30
ruthra kumar
4d31436917 fix: fetch default sales team on Quotation -> Sales Order creation 2023-05-04 10:45:22 +05:30
Raffael Meyer
9fd0091b60 Merge branch 'develop' into fix-translation-files 2023-05-04 00:26:01 +02:00
rohitwaghchaure
bea8f481b4 Merge pull request #35148 from rohitwaghchaure/fixed-extra-job-card-quantity-issue
fix: over production percentage not considered in validation
2023-05-04 00:13:53 +05:30
Rohit Waghchaure
a84d0af81e fix: over production percentage not considered in validation 2023-05-03 23:22:59 +05:30
rohitwaghchaure
dfee45f7ae Merge pull request #35144 from rohitwaghchaure/feat-reserved-qty-for-production-plan-in-bin
feat: reserve qty against production plan raw materials in BIN
2023-05-03 22:24:05 +05:30
Rohit Waghchaure
06e91e758f feat: reserve qty against production plan raw materials in BIN 2023-05-03 18:21:23 +05:30
ruthra kumar
f9a4972cb6 fix: bypass flag in Customer Group wasn't effective 2023-05-03 16:40:38 +05:30
s-aga-r
7548bb3fbe Merge branch 'develop' into stock-reservation 2023-05-03 12:06:11 +05:30
Sagar Sharma
6bcda38415 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-03 12:01:46 +05:30
s-aga-r
a6cb6c6f47 fix: recalculate costs in SCR while reposting 2023-05-03 11:33:52 +05:30
Anand Baburajan
6864b11f83 fix: handle finance book properly in trial balance and general ledger (#35085)
* fix: get default fb properly and handle different fb and default fb case

* chore: minor UX improvement

* fix: handle FBs properly in general ledger
2023-05-02 20:58:22 +05:30
Sagar Sharma
862041dc0e Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-02 19:11:33 +05:30
Vishnu VS
536473a484 Merge branch 'develop' into develop 2023-05-02 17:42:41 +05:30
ruthra kumar
7e24215b3a Merge pull request #35107 from ruthra-kumar/fix_incorrect_paid_amount_if_bank_cash_account_missing
fix: incorrect paid_amount and exchange rate in Payment Entry
2023-05-02 15:07:36 +05:30
ruthra kumar
1d70183d8c Merge pull request #35091 from ruthra-kumar/cost_center_allocation_splits_roundoff
refactor: button to toggle parent doc cost center preference for rounding adjustment amount
2023-05-02 14:07:22 +05:30
ruthra kumar
8f2302a7bf Merge pull request #35061 from ruthra-kumar/refactor_pe_dont_book_gain_loss_for_sales_purchase_orders
refactor: don't book exchange gain/loss for sales/purchase orders
2023-05-02 14:03:17 +05:30
rohitwaghchaure
9aa646512a Merge pull request #35123 from rohitwaghchaure/fixed-performance-issue-delivery-note
fix: timeout error while submitting delivery note
2023-05-01 23:30:14 +05:30
Rohit Waghchaure
2d5ccc07b1 fix: timeout error while submitting delivery note 2023-05-01 21:17:18 +05:30
rohitwaghchaure
a10aab35ff Merge pull request #35118 from rohitwaghchaure/fixed-don-not-allow-to-repost-valuation
fix: don't allow to make reposting for the closed period
2023-05-01 20:41:14 +05:30
mergify[bot]
49674585a5 fix: handle expected_value_after_useful_life properly in asset value adjustment (backport #35117) (#35119)
fix: handle expected_value_after_useful_life properly in asset value adjustment (#35117)

(cherry picked from commit 80230fec3e)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-05-01 19:59:58 +05:30
Rohit Waghchaure
f751727149 fix: don't allow to make reposting for the closed period 2023-05-01 18:48:29 +05:30
ruthra kumar
ce4e18c8d2 test: Sales/Purchase Orders will not book Exchange gain/loss 2023-05-01 14:09:19 +05:30
ruthra kumar
effb34bbfa refactor: don't book exch gain/loss for sales/purchase orders 2023-05-01 14:08:30 +05:30
Deepesh Garg
ea0b03ae9e fix: Updates in process statement of Accounts (#35064) 2023-05-01 13:09:47 +05:30
ruthra kumar
092c4b4c58 refactor: simplify group by invoice logic 2023-05-01 11:53:43 +05:30
Deepesh Garg
64be694087 fix: Patch for posting closing balances (#35037) 2023-05-01 10:56:46 +05:30
Deepesh Garg
f3b3dabb9a fix: Naming series error in Journal Entry template (#35084) 2023-05-01 10:50:51 +05:30
Sagar Sharma
424bd701f3 Merge branch 'develop' into PACKING-SLIP-FOR-DN-PACKED-ITEMS 2023-05-01 08:05:18 +05:30
s-aga-r
bbcb65894b refactor: use get_product_bundle_list() to get all product bundle at once 2023-05-01 08:04:03 +05:30
s-aga-r
ba61292dfc test: add test case for packed qty validation on DN submit 2023-05-01 07:25:36 +05:30
Suraj Shetty
a0131a96cb Merge remote-tracking branch 'upstream/develop' into move-exotel-to-separate-app 2023-04-30 12:43:18 +05:30
ruthra kumar
123355392b fix: incorrect paid_amount and exchange rate in PE
If Company master has no default cash or bank account set but Party has
default company bank account set. In this case, paid_amount and
conversion rate are not calculated correctly
2023-04-30 08:36:56 +05:30
Vishnu VS
9fd7a05b40 Merge branch 'develop' into develop 2023-04-29 21:02:54 +05:30
s-aga-r
699532647d refactor: validate_packed_qty() 2023-04-28 23:03:33 +05:30
s-aga-r
b0eb9ea7bd refactor(minor): use set_onload to get unpacked items details 2023-04-28 22:47:27 +05:30
s-aga-r
7742c592c5 test: add test cases for Packing Slip 2023-04-28 21:51:15 +05:30
s-aga-r
da00fc0f16 fix(ux): don't show Create > Packing Slip button if items are already packed 2023-04-28 18:28:28 +05:30
s-aga-r
8d1bccada4 fix(ux): remove Get Items button from Packing Slip 2023-04-28 18:02:24 +05:30
s-aga-r
e75aa4e291 fix(ux): get items on selecting DN in Packing Slip 2023-04-28 17:59:34 +05:30
s-aga-r
269cc96c41 refactor: move js validations to py 2023-04-28 17:47:36 +05:30
s-aga-r
90701c7ae9 fix: validate Packing Slip Item Qty with DN Items 2023-04-28 17:05:51 +05:30
rohitwaghchaure
35ee8d19b0 Merge pull request #35092 from rohitwaghchaure/fixed-reserved-qty-issue-for-dn
fix: not able to create delivery note from sales order
2023-04-28 16:02:35 +05:30
s-aga-r
9e5b102768 fix: make DN item reference mandatory for Packing Slip Item 2023-04-28 15:41:59 +05:30
s-aga-r
372bce4567 fix: Packing Slip Item Qty 2023-04-28 15:26:02 +05:30
Rohit Waghchaure
bdf2f7416a fix: not able to create delivery note from sales order 2023-04-28 15:16:02 +05:30
s-aga-r
0add90e7ec chore: enable no_copy for dn_detail and pi_detail in Packing Slip Item 2023-04-28 15:05:28 +05:30
s-aga-r
77f1e8ce78 fix: update Packed Qty in DN on submit and cancel of Packing Slip 2023-04-28 15:04:41 +05:30
ruthra kumar
4ccce93394 refactor: checkbox to toggle parent doc cost center preference 2023-04-28 14:20:50 +05:30
ruthra kumar
0f3b06cc8a refactor: checkbox in Sales Invoice 2023-04-28 14:20:50 +05:30
ruthra kumar
ebe6787510 refactor: checkbox to toggle parent doc cost center preference 2023-04-28 14:20:48 +05:30
Vishnu VS
bb13c236b9 Merge branch 'develop' into develop 2023-04-28 14:06:12 +05:30
ruthra kumar
b44331c981 refactor: checkbox in purchase invoice 2023-04-28 14:06:04 +05:30
s-aga-r
e6fc281acf feat: add field Packed Qty in Delivery Note Item and Packed Item 2023-04-28 13:20:47 +05:30
Sagar Sharma
d6c5b3e419 Merge pull request #35081 from SolufyPrivateLimited/fix-qc-hyperlink-v14
fix: Hyperlink in Quality Inspection Summary
2023-04-28 12:48:53 +05:30
s-aga-r
75fe9dd3ea fix: don't map items twice
* don't explicitly map Delivery Note Item custom fields to Packing Slip Item, get auto-mapped while mapping the doc.
* call Packing List `set_missing_values` after mapping the doc.
* refactor `get_recommended_case_no`, use `frappe.db.get_value` instead of `frappe.db.sql`.
2023-04-28 10:53:17 +05:30
s-aga-r
ee9f97ca7c fix: remove duplicate items validation 2023-04-28 09:07:03 +05:30
Vishnu VS
489f853ee2 Merge branch 'develop' into develop 2023-04-27 21:17:47 +05:30
s-aga-r
b62bf78814 refactor: packing_slip.js 2023-04-27 19:43:37 +05:30
s-aga-r
380dd73065 fix: map Packed Items while creating Packing Slip 2023-04-27 18:37:32 +05:30
Nihantra Patel
72dd7884a8 fix: Hyperlink in Quality Inspection Summary 2023-04-27 17:04:39 +05:30
ruthra kumar
787313b875 Merge pull request #35077 from SolufyPrivateLimited/fix-gp-link-14
fix: Report link, option, and added a link for Sales Person in GP
2023-04-27 16:40:45 +05:30
s-aga-r
eca77134ae feat: add field pi_detail in Packing Slip 2023-04-27 15:48:02 +05:30
Nihantra Patel
6dfca79af3 fix: Report link, option, and added a link for Sales Person in GP 2023-04-27 15:04:50 +05:30
Vishnu VS
06e458c745 Merge branch 'develop' into develop 2023-04-27 12:24:29 +05:30
rohitwaghchaure
01bfd2ab67 Merge pull request #35066 from rohitwaghchaure/fixed-delivered-qty-issue-while-making-mr
fix: don't create material request from sales order against delivered items
2023-04-27 09:05:36 +05:30
Rohit Waghchaure
1e2deee579 fix: don't create material request from sales order against the delivered items 2023-04-26 20:30:53 +05:30
Vishnu VS
f68eef833c Update erpnext/manufacturing/doctype/job_card/job_card.py
Co-authored-by: Marica <maricadsouza221197@gmail.com>
2023-04-26 20:25:43 +05:30
Vishnu VS
5c94f2cc52 Update erpnext/manufacturing/doctype/job_card/job_card.py
Co-authored-by: Marica <maricadsouza221197@gmail.com>
2023-04-26 20:25:15 +05:30
Vishnu VS
25d0119b7e Merge branch 'develop' into develop 2023-04-26 18:56:09 +05:30
HarryPaulo
3be1ab9b8d fix: allow submit delivery note when the sales order was billed... (#34910) 2023-04-25 21:54:41 +05:30
Kitti U. @ Ecosoft
c36dc3dc57 fix: v14, Bank Reconcile Tools not cover case JV debit bank (#35000) 2023-04-25 21:34:28 +05:30
rohitwaghchaure
5e37308b5e Merge pull request #35050 from Nandhinidevi123/workstation_filter
add if condition for workstation filter
2023-04-25 21:28:41 +05:30
rohitwaghchaure
b24704740b Merge pull request #34918 from s-aga-r/FIX-ISS-22-23-06298
perf: Journal Entries
2023-04-25 21:27:52 +05:30
mergify[bot]
ab0f7794b7 fix: wrong qty of remaining work orders to be created when using "Create" > "Work Order" (#34726)
fix: wrong qty of remaining work orders to be created when using "Create" > "Work Order" (#34726)

* fix: convert asynchronous field update to synchronous

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

(cherry picked from commit 189b020d22)

Co-authored-by: danjeremynavarro <46537526+danjeremynavarro@users.noreply.github.com>
2023-04-25 21:08:50 +05:30
tundebabzy
3d90b970d1 fix: click handler should not attempt indexed access of empty array (#35013)
fix: click handler should not attempt indexed access
of empty array
2023-04-25 20:57:59 +05:30
Ernesto Ruiz
c4512d552e chore: Add translate function to Depreciation Journal Entry Remark (#35022)
chore: Add translate function to Depreciation Journal Entry Remark
2023-04-25 20:56:53 +05:30
Deepesh Garg
f88431a79a fix: Common party JV cost center (#35008) 2023-04-25 20:54:22 +05:30
Raffael Meyer
d6bc8bba8b fix: per_billed condition for Payment Entry (#34969) 2023-04-25 20:51:11 +05:30
Nandhinidevi123
74fb2bec3a add if condition for workstation filter 2023-04-25 20:08:35 +05:30
Deepesh Garg
f7b50f2ade fix: Unable to allocate advance against invoice (#35007) 2023-04-25 19:18:45 +05:30
Nabin Hait
72b5c1f70a fix: Use set instead of db_set as it is called from validate (#34967) 2023-04-25 19:18:08 +05:30
Deepesh Garg
ecea9b44a3 fix: Payment entry with TDS in bank reco statement (#34961) 2023-04-25 19:17:13 +05:30
Solufy Solution
f1acc5fabb fix: Bulk Payment Entry from PO/SO (#34942)
Co-authored-by: Nihantra Patel <n.patel.serpentcs@gmail.com>
2023-04-25 19:16:30 +05:30
HarryPaulo
22290c2694 fix: respect title_field from doctype to bulk transactions (#34928) 2023-04-25 19:13:53 +05:30
Deepesh Garg
b545e3def0 fix: Add company field to lower deduction certificate (#34914) 2023-04-25 19:07:45 +05:30
Ankush Menat
6de71eb158 fix: pass reference_doctype in link queries (#35038) 2023-04-25 18:33:31 +05:30
Anand Baburajan
e08d636bf7 fix: use filter_by_finance_book instead of only_depreciable_assets in fixed asset register (#35031)
fix: use filter_by_finance_book instead of only_depreciable_assets
2023-04-25 15:16:50 +05:30
Sagar Sharma
31cdfa395a Merge branch 'develop' into FIX-ISS-22-23-06298 2023-04-25 13:57:34 +05:30
s-aga-r
e782a054c8 refactor: get_stock_value_on() to get stock value of multiple warehouses at once 2023-04-25 13:54:36 +05:30
Anand Baburajan
ca388ed9cd fix: value of depreciable assets not updating after manual depr entry [develop] (#35020)
* fix: value of depreciable assets not updating after manual depr entry

* chore: add asset depr schedule to jv's ignore_doctypes_on_cancel_all
2023-04-25 12:45:05 +05:30
rohitwaghchaure
04902e1b60 Merge pull request #35026 from frappe/revert-34929-fixed-stock-and-account-value-report
Revert "fix: Incorrect difference value in Stock and Account Value Comparison…"
2023-04-25 12:08:48 +05:30
rohitwaghchaure
7a63fbef4f Revert "fix: Incorrect difference value in Stock and Account Value Comparison…" 2023-04-25 12:01:26 +05:30
ruthra kumar
d70f5eef10 Merge pull request #34974 from frappe/revert-33699-tds_report_percentage
Revert "fix: Rate from LDC in TDS reports"
2023-04-25 11:17:04 +05:30
ruthra kumar
20226d0a47 Merge branch 'develop' into revert-33699-tds_report_percentage 2023-04-25 10:43:18 +05:30
ruthra kumar
cb7a99cbaa Revert "fix: Rate from LDC in TDS reports (#33699)"
This reverts commit db9beb3cdd.
2023-04-25 10:13:07 +05:30
Vishnu VS
cdb05cd310 Merge branch 'develop' into develop 2023-04-25 09:29:47 +05:30
Sagar Sharma
58dbf7fc24 Merge branch 'develop' into stock-reservation 2023-04-24 22:58:16 +05:30
s-aga-r
bf4a57a37c fix: miscellaneous
fix: don't reserve stock in group warehouse
fix: partial reservation in multiple warehouses
feat: add prompt to select warehouse and qty for reservation in SO
2023-04-24 22:19:09 +05:30
rohitwaghchaure
291845e461 Merge pull request #35015 from rohitwaghchaure/incorrect-or-cond-delivery-note-issue
fix: incorrect OR condition causing timeout error (For more than 50 line items)
2023-04-24 18:06:59 +05:30
rohitwaghchaure
5d8bf56cb9 Merge pull request #35012 from rohitwaghchaure/fixed-incorrect-bom-end-of-life
fix: item not showing in the BOM
2023-04-24 18:06:37 +05:30
Rohit Waghchaure
379b215aea fix: incorrect OR condition causing timeout error 2023-04-24 17:32:32 +05:30
Rohit Waghchaure
02c3b41dc2 fix: item not showing in the BOM 2023-04-24 14:50:27 +05:30
Marica
88647c63ba Merge branch 'develop' into bank-trans-party-automatch 2023-04-24 12:13:12 +05:30
s-aga-r
388f85b109 refactor: Stock Reservation code in sales_order.js 2023-04-24 12:04:22 +05:30
s-aga-r
e517c06847 chore: add warehouse info in SRE msg 2023-04-23 15:45:58 +05:30
s-aga-r
0b5f03e88c Revert "fix: Reserve and Unreserve buttons visibility in SO"
This reverts commit cdb3181691.
2023-04-23 15:41:48 +05:30
Vishnu VS
dc0e64a72d Merge branch 'frappe:develop' into develop 2023-04-22 23:15:42 +05:30
ruthra kumar
ed14d1ce44 feat: Reconcile Payments in background (#34596)
* feat: auto reconcile in background

* chore: Option to enable auto reconciliation in settings

* refactor: validate if feature is enabled in settings

* refactor: check for running job while using reconciliation tool

* chore: using doc to get filter values

* chore: use frappe.db.get_value in validations

* chore: cleanup commented out code

* chore: replace get_list with get_all

* chore: use block scope variable

* chore: type information for functions

* refactor: flag to ignore job validation check

* refactor: update parent doc status if all reconciled

* chore: create test_records file

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

* chore: renamed auto_reconcile to process_payment_reconciliation

* chore: another child doctype to hold payments

* chore: remove duplicate field

* chore: add fetched payments to log

* chore: Popup comment message update

* chore: replace get_all with get_value

* chore: replace label in settings page

* chore: remove unit test and records

* refactor: status in reconciliation log

* refactor: set status in log as well

* chore: fix field name

* chore: change triggered job name

* chore: use status field in list view of log

* chore: status while there are no allocations

* refactor: split trigger function into two

* chore: adding cancelled status

* refactor: function trigger queued docs

* chore: cron job scheduled

* chore: fixing accouts settings json file

* chore: typos and variable scope

* chore: use 'pluck' in db call

* chore: remove redundant whitelist decorator

* chore: use single DB call to fetch values

* chore: replace get_all with get_value

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

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

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

* chore: update status on successful batch operation

* chore: make payment table readonly

* chore: ability to pause the background job

* chore: remove isolate_each_allocation

* chore: more description in progress bar

* refactor: partially working state

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

* chore: make allocation editable -- NEED TO REVERT

* chore: pause button

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

* refactor: split reconcile function and skip a setter function

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

* chore: increase payment limit

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

* chore: remove unwanted doctypes

* refactor: make allocation table readonly

* perf: update ref_details only for newly linked invoices

* chore: rename skip flag

* refactor(UI): receivable_payable field should auto populate

* refactor: no control statements in finally block

* chore: cleanup section and rename checkbox

* chore: update new fieldname in code

* chore: update error msg

* refactor: start and pause integrated into status

pause checkbox has been removed

* refactor: added cancelled status to the log doctype

1. Moved the status section to the bottom in parent doc
2. Using alerts to indicate Job trigger status
2023-04-22 17:24:35 +05:30
rohitwaghchaure
58a5f816db Merge pull request #34994 from rohitwaghchaure/fixed-duplicate-repost-entries-of-same-voucher
fix: duplicate reposting entries of same voucher
2023-04-22 14:08:06 +05:30
Rohit Waghchaure
f2253dd645 fix: duplicate reposting entries of same voucher 2023-04-22 11:16:12 +05:30
s-aga-r
0cd10a50d2 Merge branch 'develop' into stock-reservation 2023-04-22 10:04:46 +05:30
s-aga-r
28d0629df1 chore: add depends_on condition for Reserve Stock field in SO 2023-04-22 10:01:00 +05:30
s-aga-r
cdb3181691 fix: Reserve and Unreserve buttons visibility in SO 2023-04-22 09:49:47 +05:30
s-aga-r
b70273b988 chore: remove Enable Stock Reservation field description 2023-04-22 08:49:31 +05:30
rohitwaghchaure
9fa72cb9d8 Merge pull request #34982 from rohitwaghchaure/fixed-added-validation-for-extra-job-card
fix: added validation for extra job cards
2023-04-21 18:50:39 +05:30
Ankush Menat
ac871797b2 fix: SLA permissions (#34981) 2023-04-21 18:05:29 +05:30
rohitwaghchaure
56d62cae7a Merge pull request #34980 from rohitwaghchaure/fix-inter-transfer-validation
fix: validation for internal transfer entry
2023-04-21 17:45:54 +05:30
s-aga-r
7e8fd8f324 chore: update reserved stock SLE validation 2023-04-21 17:44:44 +05:30
Rohit Waghchaure
6a0b7c9e8c fix: added validation for extra job card 2023-04-21 17:34:22 +05:30
Rohit Waghchaure
19911b48fd fix: validation for internal transfer entry 2023-04-21 16:56:09 +05:30
s-aga-r
9a37ac6c25 refactor: sum up SLE value in query 2023-04-21 13:28:14 +05:30
HENRY Florian
af8da53cf4 fix: FEC report for France accountancy (#34781)
* fix: FEC report for France Accountancy legal requirement

* fix: FEC report for France Accountancy legal requirement

* fix: change to query standard

* fix: change to query standard

* fix: columns to standard dict

* fix: columns to standard dict

* fix: columns to data

* refactor: french report FEC

* refactor: french report FEC (2)

---------

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
2023-04-21 13:26:32 +05:30
Deepesh Garg
a02705ded7 chore: Move source and campaign to more info section (#34946) 2023-04-21 13:25:32 +05:30
ruthra kumar
3ec1597860 Merge pull request #34940 from ruthra-kumar/broken_set_exchange_gain_loss_btn_in_payment_entry
fix: broken 'set exchange gain/loss' btn in payment entry
2023-04-21 09:47:53 +05:30
Hossein Yousefian
984eb2a0dd Merge branch 'develop' into get_incoming_rate_v14_fix 2023-04-20 16:50:34 +03:30
rohitwaghchaure
f218df460f Merge pull request #34958 from rohitwaghchaure/removed-depends-on-for-employee-detail
fix: removed depends on for the Employee Detail section
2023-04-20 18:03:46 +05:30
rohitwaghchaure
6259c81adc Merge pull request #34960 from rohitwaghchaure/fixed-stock-entry-type
fix: stock entry type issue
2023-04-20 18:03:23 +05:30
Sagar Vora
83a4c6dda8 Merge pull request #34738 from resilient-tech/regional++ 2023-04-20 05:17:57 -07:00
Sagar Vora
776b56ccd1 fix: use functools.wraps to preserve doc signature 2023-04-20 05:17:30 -07:00
Sagar Vora
2fa641f86d fix: simplify erpnext.get_region 2023-04-20 05:17:30 -07:00
Sagar Vora
17ef3c964f fix: set frappe.flags.company to call regional code accurately 2023-04-20 05:17:30 -07:00
Rohit Waghchaure
c3b5dcb767 fix: stock entry type issue 2023-04-20 16:39:26 +05:30
Rohit Waghchaure
a90a5b4aa4 fix: removed depends on for the Employee Detail section 2023-04-20 16:01:05 +05:30
Sagar Sharma
76c4d9011f Merge pull request #34953 from s-aga-r/FIX-ISS-23-24-00209
fix: `PermissionError` in Work Order
2023-04-20 15:57:25 +05:30
Sagar Sharma
81653e4762 Merge branch 'develop' into FIX-ISS-23-24-00209 2023-04-20 15:46:01 +05:30
s-aga-r
8108b2de0a fix: PermissionError in Work Order 2023-04-20 15:41:37 +05:30
rohitwaghchaure
47b653db6d Merge pull request #34954 from SolufyPrivateLimited/fix-process_loss-in-bom
fix: process_loss_percentage in BOM
2023-04-20 15:00:15 +05:30
Nihantra Patel
b572bef71d fix: process_loss_percentage in BOM 2023-04-20 14:32:32 +05:30
Deepesh Garg
ea6eeace80 fix: filtering via batch no(#34950)
* fix: filtering via batch no
2023-04-20 12:48:44 +05:30
Sagar Sharma
6f26044163 Merge pull request #34912 from s-aga-r/FIX-INTERNAL-PR-GL-ENTRIES
fix: internal Purchase Receipt GL Entries
2023-04-20 11:35:17 +05:30
Sagar Sharma
e1f5a5adea Merge branch 'develop' into FIX-INTERNAL-PR-GL-ENTRIES 2023-04-20 11:00:22 +05:30
ruthra kumar
fc6486d87d Merge pull request #34922 from ruthra-kumar/refactor_payment_entry_ref_details
refactor: refactor set_missing_values and set_missing_ref_details in Payment Entry
2023-04-20 10:59:50 +05:30
ruthra kumar
df0682fa8c fix: broken set exchagne gain/loss btn broken in payment entry 2023-04-20 10:39:15 +05:30
Sagar Sharma
66723dc5db Merge branch 'develop' into FIX-INTERNAL-PR-GL-ENTRIES 2023-04-20 10:31:29 +05:30
rohitwaghchaure
ad662d38c7 Merge pull request #34937 from rohitwaghchaure/fixed-limit-issue-for-next-stock-reco
fix: add limit for get_next_stock_reco
2023-04-20 10:18:23 +05:30
s-aga-r
11c8503180 fix(test): test_backdated_stock_reco_cancellation_future_negative_stock 2023-04-20 09:59:11 +05:30
Rohit Waghchaure
fcfa8842a7 fix: limit stock reco issue 2023-04-20 09:48:15 +05:30
rohitwaghchaure
3df4edc5c5 Merge branch 'develop' into get_incoming_rate_v14_fix 2023-04-19 21:07:54 +05:30
rohitwaghchaure
dd238aa5b4 Merge pull request #34929 from rohitwaghchaure/fixed-stock-and-account-value-report
fix: Incorrect difference value in Stock and Account Value Comparison…
2023-04-19 21:07:25 +05:30
Rohit Waghchaure
a77182645f fix: Incorrect difference value in Stock and Account Value Comparison report 2023-04-19 20:35:14 +05:30
Sagar Sharma
c88beb76d6 Merge pull request #34901 from s-aga-r/FIX-ISS-23-24-00145
fix: add item-code filter for SCR supplied-items batch-no
2023-04-19 19:23:12 +05:30
Sagar Sharma
45c27e4e3d Merge branch 'develop' into FIX-ISS-23-24-00145 2023-04-19 19:22:42 +05:30
Sagar Sharma
daac4dc182 Merge pull request #34895 from s-aga-r/use-UnixTimestamp
fix: use `CombineDatetime` instead of `Timestamp` in QB queries
2023-04-19 19:19:40 +05:30
Sagar Sharma
6519514db4 Merge branch 'develop' into use-UnixTimestamp 2023-04-19 18:23:29 +05:30
Vishal Dhayagude
59f3fedbf7 fix: batch qty conversion factor issue fixed in pos transaction (#34917) 2023-04-19 15:57:28 +05:30
ruthra kumar
b7d6e30f63 refactor: update ref details for selected references
set_missing_ref_details can update only for selected references
2023-04-19 15:13:10 +05:30
s-aga-r
c86c543fbf test: add test case for internal PR GL Entries 2023-04-19 13:30:37 +05:30
Sagar Sharma
2c0e22c01d Merge branch 'develop' into use-UnixTimestamp 2023-04-19 12:57:20 +05:30
s-aga-r
e43bc38e05 refactor: rewrite get_stock_value_on() queries in QB 2023-04-19 12:05:17 +05:30
ruthra kumar
11cb2db3fe refactor: move set_missing_ref_detials out of set_missing_values 2023-04-19 11:54:08 +05:30
ruthra kumar
eaa5f1fd9d Merge pull request #34838 from ruthra-kumar/making_similar_ledger_entries_merging_optional
refactor: toggle merging similar ledger entries in JE
2023-04-19 09:48:44 +05:30
barredterra
98d51b6c7b fix: remove empty translations 2023-04-18 18:27:21 +02:00
barredterra
f0a3e61ee9 fix: remove excessive fourth column 2023-04-18 17:27:46 +02:00
s-aga-r
6fca9adcd4 fix: internal Purchase Receipt GL Entries 2023-04-18 18:38:28 +05:30
Hossein Yousefian
13d4f85923 get_incoming_rate_voucher_no_fix 2023-04-18 14:50:09 +03:30
Hossein Yousefian
bbd44e6e7e Merge branch 'frappe:develop' into get_incoming_rate_zero_in_rate_fix 2023-04-18 14:47:19 +03:30
barredterra
debc013728 fix: remove excessive fourth column 2023-04-18 12:23:54 +02:00
Sagar Sharma
a7c5b33c9f Merge pull request #34860 from s-aga-r/FIX-ISS-23-24-00171
fix: add items field label
2023-04-18 13:04:13 +05:30
s-aga-r
e91abbfbe3 fix: add item-code filter for SCR supplied-items batch-no 2023-04-18 13:03:47 +05:30
Sagar Sharma
d07d67a968 Merge branch 'develop' into use-UnixTimestamp 2023-04-18 12:56:25 +05:30
s-aga-r
91a398a191 fix: use CombineDatetime instead of Timestamp in QB queries 2023-04-18 12:55:16 +05:30
Sagar Sharma
a78b4bef0e Merge branch 'develop' into FIX-ISS-23-24-00171 2023-04-18 11:44:03 +05:30
ruthra kumar
3f537d30bd chore(patch): by default ledger entries of JE's will not be merged 2023-04-18 10:55:49 +05:30
ruthra kumar
a3e3fe149d refactor: checkbox to toggle merging of JE account heads 2023-04-18 08:59:33 +05:30
Ankush Menat
cc185bd2fe chore: update codeowners
[skip ci]
2023-04-18 08:40:24 +05:30
Ankush Menat
e4f152a416 fix: whitelist doc method
This should've been whitelisted, looks like it was missed out

closes https://github.com/frappe/erpnext/issues/34898
2023-04-18 08:24:22 +05:30
barredterra
aba87db6be fix: translation files
- remove leading "DocType: XXX"
- remove leading path and line number
- add trailing comma (three columns total)
2023-04-17 22:28:53 +02:00
MohsinAli
dd93ea067e fix: change discuss forum url (#34891)
[skip ci]
2023-04-17 17:00:52 +05:30
Deepesh Garg
534ea5ad21 fix: Add offers info to website item (#34873)
* fix: Add offers info to website item

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

This reverts commit 88b598edb6.

* fix: Add offer properties to website item
2023-04-17 16:35:22 +05:30
Marica
fd38e8e0af Merge branch 'develop' into bank-trans-party-automatch 2023-04-17 16:34:46 +05:30
s-aga-r
a527221709 test: add test case for consumption of reserved stock 2023-04-17 15:33:55 +05:30
s-aga-r
2ed7d8a1fb fix: don't allow Stock Reconciliation for items having reserved stock 2023-04-17 15:33:55 +05:30
s-aga-r
dc9bb772cb refactor(test): use change_settings instead of update_stock_settings 2023-04-17 15:33:55 +05:30
s-aga-r
a87bb78d72 fix: don't allow to enable Stock Reservation and Negative Stock simultaneously 2023-04-17 15:33:55 +05:30
s-aga-r
73f16752a6 chore: conflicts 2023-04-17 15:33:55 +05:30
s-aga-r
866f98ac15 test: Stock Reservation for Serial and Batch Items 2023-04-17 15:33:46 +05:30
rohitwaghchaure
4f978a3cbd Merge pull request #34886 from rohitwaghchaure/fixed-stock-reco-test-case
fix: stock reconciliation test case
2023-04-17 15:21:49 +05:30
Rohit Waghchaure
6bccd8644e fix: stock reco test case 2023-04-17 14:22:35 +05:30
rohitwaghchaure
9fd8b8e53a Merge pull request #34851 from rohitwaghchaure/fixed-too-many-writes-error-in-stock-reco
fix: too many writes error while making backdated stock reconciliation
2023-04-17 12:01:36 +05:30
rohitwaghchaure
9f399f8741 Merge pull request #34882 from rohitwaghchaure/filter-to-hide-disabled-warehouses
fix: don't show disabled warehouses in the Warehouse Wise Stock Balance report
2023-04-17 12:00:57 +05:30
Rohit Waghchaure
9ceb1f6bda fix: don't show disabled warehouses in the Warehouse Wise Stock Balance report 2023-04-17 11:05:32 +05:30
Rohit Waghchaure
d9dd64b4d2 fix: linters issues 2023-04-16 23:25:51 +05:30
Sagar Sharma
db7b78328b Merge branch 'develop' into FIX-ISS-23-24-00171 2023-04-16 20:13:42 +05:30
Deepesh Garg
5c75894065 fix: Advance payment against payment terms (#34872) 2023-04-16 17:11:24 +05:30
Shariq Ansari
f27c921783 Merge pull request #34876 from shariquerik/selling-workspace-fix 2023-04-16 14:26:24 +05:30
rohitwaghchaure
634d526d15 Merge pull request #34852 from wojosc/patch-36
fix allowing rename of Lead
2023-04-16 14:18:49 +05:30
Shariq Ansari
5a4dd354c1 fix: selling workspace is not migrating properly 2023-04-16 13:10:42 +05:30
Hossein Yousefian
1d162ffb87 get_incoming_rate_zero_in_rate_fix 2023-04-16 11:03:16 +03:30
Sagar Sharma
68af588fcc Merge pull request #34858 from s-aga-r/FIX-ISS-23-24-00199
fix: unable to change `company` for manual `Serial No` entry
2023-04-15 12:10:13 +05:30
s-aga-r
c9418aab45 chore: add items field label 2023-04-14 16:57:14 +05:30
s-aga-r
fb3271c624 fix: unable to change company for manual Serial No entry 2023-04-14 15:59:35 +05:30
Devin Slauenwhite
51c4338661 fix(ux): don't throw error when company defaults aren't set (#34825)
* fix(ux): don't throw error when company defaults aren't set; instead prompt account input.

* fix: translate label and title
2023-04-14 15:20:51 +05:30
Rohit Waghchaure
7bfc8f1236 fix: too many writes error while making backdated stock reconciliation 2023-04-14 15:12:58 +05:30
Raffael Meyer
59f6b773cd feat: add german sales tax template (#34823)
Nullsteuersatz nach § 12 Abs. 3 UStG
2023-04-14 13:14:00 +05:30
Wolfram Schmidt
9d1cae01bd fix allowing rename of Lead
This is needed to consolidate data like merging leads together when duplicated appear.
2023-04-14 09:05:09 +02:00
Deepesh Garg
a7051cb9b5 fix: Don't use stale item details (#34847) 2023-04-14 09:59:42 +05:30
Deepesh Garg
66130493eb fix: Remove unnecessary checkbox from Accounts doctype (#34821) 2023-04-14 09:47:15 +05:30
Vishnu VS
194ed1842f fix: update workstation hour rate 2023-04-13 19:02:03 +05:30
s-aga-r
6c9e419fec fix: validation for Non-Stock item in Sales Order Reservation 2023-04-12 16:18:13 +05:30
s-aga-r
e65b6d47e4 fix: disable Stock Reservation by default 2023-04-12 15:12:56 +05:30
s-aga-r
f0acb2049b fix: don't allow to deliver/transfer reserved stock 2023-04-12 14:13:54 +05:30
s-aga-r
56097807b4 fix: Stock Reservation validation in Stock Settings 2023-04-12 13:58:11 +05:30
s-aga-r
e7491d117d test: add test case for Stock Reservation against SO 2023-04-11 17:25:13 +05:30
Saqib Ansari
7fabe62847 Merge pull request #34817 from frappe/nextchamp-saqib-patch-1
chore: update CODEOWNERS
2023-04-11 15:47:59 +05:30
s-aga-r
51946c5528 chore: linter 2023-04-11 12:46:59 +05:30
s-aga-r
a14a6002e7 Merge branch 'develop' into stock-reservation 2023-04-11 10:00:39 +05:30
s-aga-r
efcb84cedf test: add test cases for SO 2023-04-11 09:11:51 +05:30
s-aga-r
bc3cb6bff6 fix: cancel SRE on SO cancel 2023-04-11 08:32:37 +05:30
s-aga-r
a918adaa33 test: add test cases for SRE 2023-04-11 08:29:59 +05:30
marination
430b247dfc fix: Remove bank details fields from Shareholder 2023-04-11 01:33:08 +05:30
marination
7ed8f59dc8 test: Match by Account No, IBAN, Party Name, Desc and match correction 2023-04-10 22:11:00 +05:30
Marica
36de35c6d9 Merge branch 'develop' into bank-trans-party-automatch 2023-04-10 20:04:16 +05:30
s-aga-r
ac24d778e8 refactor: add Docstrings for functions 2023-04-05 19:48:15 +05:30
Marica
fcc8f9f164 Merge branch 'develop' into bank-trans-party-automatch 2023-04-05 17:04:07 +05:30
marination
d7bc192804 fix: Match by both Account No and IBAN & other cleanups
- A BT could have both account and iban, and a Supplier could have only IBAN set
- In this case, matching by either (only account) gives no match
- Match by Account OR IBAN, use `or_filters`
- If matched, set both account no. and IBAN in Bank Party Mapper

- Explain AutoMatchParty
- Add type hints to return values
- Use `set_value` to set values in BT after matching since its an after submit event
2023-04-05 15:28:47 +05:30
marination
aea4315435 chore: Make auto matching party configurable
- Checkbox in Accounts settings "Enable Automatic Party Matching"
- Check before invoking automatching methods
- misc: Remove TODO comments
2023-04-04 20:16:14 +05:30
marination
33604550ce chore: Perform automatch on submit
- misc: Clearer naming
2023-04-04 19:42:25 +05:30
marination
27ce789023 feat: Manually Update/Correct Party in Bank Transaction
- On updating bank trans.n party after submit, the corresponding mapper doc will be updated too
- The mapper doc in turn will update all linked bank transactions that do not have this updated value
- Added Bank Party Mapper hidden link in Bank Transaction
- Rename field in BPM to `Party Name` as it does not hold description data
- If a BT matches with a BPM record, link that record in the BT
2023-04-04 19:27:01 +05:30
marination
37c1331aba fix: Don't set description as key in Mapper doc if matched by description
- Description is volatile and will keep changing
- It will lead to multiple Bank Party Mapper docs for the same party that will never be referenced again
- Parts of the descripton keep changing which is why it will never match a mapper record
- If matched by desc, dont create mapper record.
2023-04-04 14:03:35 +05:30
marination
3a898289b0 chore: Single query with or filter to search Party Mapper by name/desc 2023-04-03 16:11:00 +05:30
s-aga-r
38e9367184 fix: re-reserve stock on SO Update Items 2023-04-02 21:24:59 +05:30
s-aga-r
d5f0a7fcbb refactor(minor): stock reservation entry 2023-04-02 19:23:22 +05:30
s-aga-r
8f3d5d24e1 chore: notify user on Reservation and Unreservation of Stock 2023-04-01 16:21:50 +05:30
s-aga-r
ee322c4904 fix(ux): Allow Partial Reservation depends on Enable Stock Reservation 2023-04-01 15:55:10 +05:30
s-aga-r
ef34f703d4 fix(ux): don't show Stock Reservation btn if Stock Reservation is disabled 2023-03-31 22:08:12 +05:30
s-aga-r
632f27b10d fix(ux): Reserve Stock and Reserved Stock Qty in SO Item 2023-03-31 21:58:21 +05:30
s-aga-r
de1492759d feat: add option to reserve stock in SO 2023-03-31 21:42:13 +05:30
marination
e7745033df feat: Party auto-matcher from Bank Transaction data
- Created Bank Party Mapper
- Created class to auto match by account/iban or party name/description(fuzzy)
- Automatch and set in transaction or create mapper
- `rapidfuzz` introduced
2023-03-31 16:11:00 +05:30
marination
ad31e02616 feat: Store Party bank details in party records (Customer/Supplier/Employee/Shareholder) 2023-04-04 11:45:37 +05:30
s-aga-r
0ae400c986 feat: add option to unreserve stock in SO 2023-03-31 15:38:16 +05:30
s-aga-r
26569b2162 fix: Stock Reservation validation for SO 2023-03-31 13:12:19 +05:30
s-aga-r
81fe5cfd72 chore: update Reserve Stock label to Reserve Stock on Submit in SO 2023-03-31 13:06:30 +05:30
s-aga-r
4d8ae41553 chore: make Reserve Stock on Sales Order Submission disabled by default 2023-03-31 12:50:13 +05:30
s-aga-r
06d1bc4d12 Revert "chore: add SRE ref in DN dashboard"
This reverts commit 15cb99290c.
2023-03-31 12:20:52 +05:30
s-aga-r
2d3997b2d7 refactor: remove Against Stock Reservation Entry field from DN Item 2023-03-31 12:16:59 +05:30
s-aga-r
1a84a0c411 fix: DN Item group warehouse validation against SRE 2023-03-30 16:42:27 +05:30
s-aga-r
e286d05904 fix: SRE Available Qty to Reserve for Group Warehouse 2023-03-30 16:26:42 +05:30
s-aga-r
72e32f1ae4 refactor: remove Posting Date and Posting Time columns from SRE 2023-03-29 18:42:44 +05:30
s-aga-r
2522198129 Revert "chore: add fields Serial No and Batch No in SRE"
This reverts commit 48108b5b41.
2023-03-29 18:33:03 +05:30
s-aga-r
6b24551672 Revert "chore: add Stock Reservation Qty column in Stock Projected Qty Report"
This reverts commit 3d75e3f434.
2023-03-29 18:33:03 +05:30
s-aga-r
3fcaa21110 refactor(minor): stock_reservation_entry.py 2023-03-29 18:33:01 +05:30
s-aga-r
7d0bc0914d Merge branch 'develop' into stock-reservation 2023-03-28 12:25:17 +05:30
s-aga-r
beb425e1ff chore: add Stock Reservation Qty column in Stock Balance Report 2023-03-27 21:03:35 +05:30
s-aga-r
3d75e3f434 chore: add Stock Reservation Qty column in Stock Projected Qty Report 2023-03-27 19:12:08 +05:30
s-aga-r
00ac49f81b refactor(minor): SRE functions 2023-03-27 12:18:40 +05:30
s-aga-r
22a9c8ad55 fix(ux): SRE filters in DN Items 2023-03-27 11:07:24 +05:30
s-aga-r
b95a49e4c2 fix: validate DN against SRE 2023-03-27 10:46:07 +05:30
s-aga-r
3602d1909e fix: map DN items based on SRE 2023-03-26 17:33:01 +05:30
s-aga-r
15cb99290c chore: add SRE ref in DN dashboard 2023-03-26 16:53:31 +05:30
s-aga-r
cdc625806d chore: add field Against Stock Reservation Entry in DN Item 2023-03-26 16:53:28 +05:30
s-aga-r
744166da73 fix(ux): unable to uncheck Reserve Stock button in SO 2023-03-26 12:14:00 +05:30
s-aga-r
9652cb8de5 chore: create SRE on SO submission 2023-03-25 15:50:00 +05:30
s-aga-r
be9fa8c047 fix: don't allow to disable Stock Reservation if SRE exists 2023-03-24 21:39:36 +05:30
s-aga-r
48108b5b41 chore: add fields Serial No and Batch No in SRE 2023-03-24 16:23:38 +05:30
s-aga-r
7b6e4d44b7 chore: remove Valuation Rate field from SRE 2023-03-24 16:09:38 +05:30
s-aga-r
c80ce99972 feat: configuration to allow partial reservation 2023-03-23 19:53:17 +05:30
s-aga-r
ee074883bb chore: add Partially Reserved status in SRE 2023-03-23 19:50:34 +05:30
s-aga-r
4ad55382cf chore: add field Voucher Qty in SRE 2023-03-23 19:37:57 +05:30
s-aga-r
1ccdf588e2 fix(ux): Reserve Stock button behaviour in SO 2023-03-23 13:34:40 +05:30
s-aga-r
f8c477ca5c chore: rename status from Submitted to Reserved 2023-03-23 13:05:43 +05:30
s-aga-r
fd746288f8 chore: add field Available Qty to Reserve in SRE 2023-03-23 13:05:41 +05:30
s-aga-r
30d566a787 fix: update Reserved Qty in SO Item on SRE cancel 2023-03-21 23:49:01 +05:30
s-aga-r
c2ba8b1b54 chore: make SRE a submittable DocType 2023-03-21 20:16:07 +05:30
s-aga-r
f858f657a0 feat: add Stock Reservation Entry ref in SO connections 2023-03-21 13:28:31 +05:30
s-aga-r
50de868285 chore: add Stock Reserved Qty field in SO Item 2023-03-21 13:17:58 +05:30
s-aga-r
0700063379 chore: add Reserve Stock check field in Sales Order 2023-03-20 23:55:33 +05:30
s-aga-r
1b7fb6d7e7 chore: make Stock UOM required in SRE 2023-03-20 22:41:22 +05:30
s-aga-r
4848a054a8 chore: make Submitted default status for Stock Reservation Entry 2023-03-20 22:40:06 +05:30
s-aga-r
2946de40d8 fix: make Project and Is Cancelled field read-only in SRE 2023-03-20 21:18:37 +05:30
s-aga-r
0d1332942c feat: add Status and Delivered Qty fields in Stock Reservation Entry 2023-03-20 19:01:37 +05:30
s-aga-r
da1455198e chore: field validation for Stock Reservation Entry 2023-03-20 13:42:11 +05:30
s-aga-r
7eb2075265 feat: add settings for Stock Reservation in Stock Settings 2023-03-20 11:45:35 +05:30
s-aga-r
085d9ce004 feat: add DocType Stock Reservation Entry 2023-03-20 11:20:30 +05:30
Suraj Shetty
64f439600b Merge branch 'develop' of https://github.com/frappe/erpnext into move-exotel-to-separate-app 2023-02-25 13:34:23 +05:30
Suraj Shetty
6349f29aed fix: Remove option from Communication Medium 2022-07-30 14:26:37 +05:30
Suraj Shetty
45544c2b1e Merge branch 'develop' of https://github.com/frappe/erpnext into move-exotel-to-separate-app 2022-07-28 10:07:40 +05:30
Suraj Shetty
3593573ed2 Merge branch 'develop' of https://github.com/frappe/erpnext into move-exotel-to-separate-app 2022-07-22 12:24:20 +05:30
Suraj Shetty
cf9c065cf8 refactor: Add exotel deprecation warning 2022-07-22 12:22:57 +05:30
Suraj Shetty
ec1607e825 Merge branch 'develop' of https://github.com/frappe/erpnext into move-exotel-to-separate-app 2022-05-08 16:10:55 +05:30
Suraj Shetty
e0bc437ddb refactor: Simplify call log code 2022-05-08 16:05:04 +05:30
Suraj Shetty
53e4fee4db refactor: Remove exotel
Move it to separate app
2022-05-08 16:04:14 +05:30
1012 changed files with 58547 additions and 112532 deletions

View File

@@ -2,65 +2,32 @@
"env": {
"browser": true,
"node": true,
"es6": true
"es2022": true
},
"parserOptions": {
"ecmaVersion": 11,
"sourceType": "module"
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
"tab",
{ "SwitchCase": 1 }
],
"brace-style": [
"error",
"1tbs"
],
"space-unary-ops": [
"error",
{ "words": true }
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"off"
],
"semi": [
"warn",
"always"
],
"camelcase": [
"off"
],
"no-unused-vars": [
"warn"
],
"no-redeclare": [
"warn"
],
"no-console": [
"warn"
],
"no-extra-boolean-cast": [
"off"
],
"no-control-regex": [
"off"
],
"space-before-blocks": "warn",
"keyword-spacing": "warn",
"comma-spacing": "warn",
"key-spacing": "warn"
"indent": "off",
"brace-style": "off",
"no-mixed-spaces-and-tabs": "off",
"no-useless-escape": "off",
"space-unary-ops": ["error", { "words": true }],
"linebreak-style": "off",
"quotes": ["off"],
"semi": "off",
"camelcase": "off",
"no-unused-vars": "off",
"no-console": ["warn"],
"no-extra-boolean-cast": ["off"],
"no-control-regex": ["off"]
},
"root": true,
"globals": {
"frappe": true,
"Vue": true,
"SetVueGlobals": true,
"erpnext": true,
"hub": true,
"$": true,
@@ -97,8 +64,10 @@
"is_null": true,
"in_list": true,
"has_common": true,
"posthog": true,
"has_words": true,
"validate_email": true,
"open_web_template_values_editor": true,
"get_number_format": true,
"format_number": true,
"format_currency": true,
@@ -154,7 +123,6 @@
"before": true,
"beforeEach": true,
"onScan": true,
"html2canvas": true,
"extend_cscript": true,
"localforage": true
}

View File

@@ -9,7 +9,7 @@ on:
workflow_dispatch:
jobs:
release:
stable-release:
name: Release
runs-on: ubuntu-latest
strategy:
@@ -30,3 +30,23 @@ jobs:
head: version-${{ matrix.version }}-hotfix
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
beta-release:
name: Release
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- uses: octokit/request-action@v2.x
with:
route: POST /repos/{owner}/{repo}/pulls
owner: frappe
repo: erpnext
title: |-
"chore: release v15 beta"
body: "Automated beta release."
base: version-15-beta
head: develop
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

View File

@@ -9,21 +9,22 @@ jobs:
name: linters
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: '3.10'
cache: pip
- name: Install and Run Pre-commit
uses: pre-commit/action@v2.0.3
uses: pre-commit/action@v3.0.0
- name: Download Semgrep rules
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules
- name: Download semgrep
run: pip install semgrep==0.97.0
run: pip install semgrep
- name: Run Semgrep rules
run: semgrep ci --config ./frappe-semgrep-rules/rules --config r/python.lang.correctness

View File

@@ -43,14 +43,16 @@ jobs:
fi
- name: Setup Python
uses: "gabrielfalcao/pyenv-action@v9"
uses: "actions/setup-python@v4"
with:
versions: 3.10:latest, 3.7:latest
python-version: |
3.7
3.10
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: 14
node-version: 18
check-latest: true
- name: Add to Hosts
@@ -92,7 +94,6 @@ jobs:
- name: Install
run: |
pip install frappe-bench
pyenv global $(pyenv versions | grep '3.10')
bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
env:
DB: mariadb
@@ -107,7 +108,6 @@ jobs:
git -C "apps/frappe" remote set-url upstream https://github.com/frappe/frappe.git
git -C "apps/erpnext" remote set-url upstream https://github.com/frappe/erpnext.git
pyenv global $(pyenv versions | grep '3.7')
for version in $(seq 12 13)
do
echo "Updating to v$version"
@@ -120,7 +120,7 @@ jobs:
git -C "apps/erpnext" checkout -q -f $branch_name
rm -rf ~/frappe-bench/env
bench setup env
bench setup env --python python3.7
bench pip install -e ./apps/payments
bench pip install -e ./apps/erpnext
@@ -132,9 +132,8 @@ jobs:
git -C "apps/frappe" checkout -q -f "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"
git -C "apps/erpnext" checkout -q -f "$GITHUB_SHA"
pyenv global $(pyenv versions | grep '3.10')
rm -rf ~/frappe-bench/env
bench -v setup env
bench -v setup env --python python3.10
bench pip install -e ./apps/payments
bench pip install -e ./apps/erpnext

38
.github/workflows/release_notes.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
# This action:
#
# 1. Generates release notes using github API.
# 2. Strips unnecessary info like chore/style etc from notes.
# 3. Updates release info.
# This action needs to be maintained on all branches that do releases.
name: 'Release Notes'
on:
workflow_dispatch:
inputs:
tag_name:
description: 'Tag of release like v13.0.0'
required: true
type: string
release:
types: [released]
permissions:
contents: read
jobs:
regen-notes:
name: 'Regenerate release notes'
runs-on: ubuntu-latest
steps:
- name: Update notes
run: |
NEW_NOTES=$(gh api --method POST -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/generate-notes -f tag_name=$RELEASE_TAG | jq -r '.body' | sed -E '/^\* (chore|ci|test|docs|style)/d' )
RELEASE_ID=$(gh api -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/tags/$RELEASE_TAG | jq -r '.id')
gh api --method PATCH -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/$RELEASE_ID -f body="$NEW_NOTES"
env:
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_TAG: ${{ github.event.inputs.tag_name || github.event.release.tag_name }}

View File

@@ -21,7 +21,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version: 14
node-version: 18
check-latest: true
- name: Check commit titles

View File

@@ -7,11 +7,9 @@ on:
- '**.css'
- '**.md'
- '**.html'
push:
branches: [ develop ]
paths-ignore:
- '**.js'
- '**.md'
schedule:
# Run everday at midnight UTC / 5:30 IST
- cron: "0 0 * * *"
workflow_dispatch:
inputs:
user:
@@ -71,7 +69,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: 14
node-version: 18
check-latest: true
- name: Add to Hosts

View File

@@ -59,7 +59,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: 14
node-version: 18
check-latest: true
- name: Add to Hosts

View File

@@ -16,8 +16,26 @@ repos:
- id: check-merge-conflict
- id: check-ast
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.44.0
hooks:
- id: eslint
types_or: [javascript]
args: ['--quiet']
# Ignore any files that might contain jinja / bundles
exclude: |
(?x)^(
erpnext/public/dist/.*|
cypress/.*|
.*node_modules.*|
.*boilerplate.*|
erpnext/public/js/controllers/.*|
erpnext/templates/pages/order.js|
erpnext/templates/includes/.*
)$
- repo: https://github.com/PyCQA/flake8
rev: 5.0.4
rev: 6.0.0
hooks:
- id: flake8
additional_dependencies: [

View File

@@ -5,7 +5,6 @@
erpnext/accounts/ @deepeshgarg007 @ruthra-kumar
erpnext/assets/ @anandbaburajan @deepeshgarg007
erpnext/loan_management/ @deepeshgarg007
erpnext/regional @deepeshgarg007 @ruthra-kumar
erpnext/selling @deepeshgarg007 @ruthra-kumar
erpnext/support/ @deepeshgarg007
@@ -22,4 +21,4 @@ erpnext/controllers/ @deepeshgarg007 @rohitwaghchaure
erpnext/patches/ @deepeshgarg007
.github/ @deepeshgarg007
pyproject.toml @ankush
pyproject.toml @phot0n

View File

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

View File

@@ -4,18 +4,19 @@
"creation": "2020-07-17 11:25:34.593061",
"docstatus": 0,
"doctype": "Dashboard Chart",
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"frappe.sys_defaults.fiscal_year\",\"to_fiscal_year\":\"frappe.sys_defaults.fiscal_year\"}",
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"erpnext.utils.get_fiscal_year()\",\"to_fiscal_year\":\"erpnext.utils.get_fiscal_year()\"}",
"filters_json": "{\"period\":\"Monthly\",\"budget_against\":\"Cost Center\",\"show_cumulative\":0}",
"idx": 0,
"is_public": 1,
"is_standard": 1,
"modified": "2020-07-22 12:24:49.144210",
"modified": "2023-07-19 13:13:13.307073",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget Variance",
"number_of_groups": 0,
"owner": "Administrator",
"report_name": "Budget Variance Report",
"roles": [],
"timeseries": 0,
"type": "Bar",
"use_report_chart": 1,

View File

@@ -4,18 +4,19 @@
"creation": "2020-07-17 11:25:34.448572",
"docstatus": 0,
"doctype": "Dashboard Chart",
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"frappe.sys_defaults.fiscal_year\",\"to_fiscal_year\":\"frappe.sys_defaults.fiscal_year\"}",
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"erpnext.utils.get_fiscal_year()\",\"to_fiscal_year\":\"erpnext.utils.get_fiscal_year()\"}",
"filters_json": "{\"filter_based_on\":\"Fiscal Year\",\"period_start_date\":\"2020-04-01\",\"period_end_date\":\"2021-03-31\",\"periodicity\":\"Yearly\",\"include_default_book_entries\":1}",
"idx": 0,
"is_public": 1,
"is_standard": 1,
"modified": "2020-07-22 12:33:48.888943",
"modified": "2023-07-19 13:08:56.470390",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Profit and Loss",
"number_of_groups": 0,
"owner": "Administrator",
"report_name": "Profit and Loss Statement",
"roles": [],
"timeseries": 0,
"type": "Bar",
"use_report_chart": 1,

View File

@@ -136,7 +136,7 @@ def convert_deferred_revenue_to_income(
send_mail(deferred_process)
def get_booking_dates(doc, item, posting_date=None):
def get_booking_dates(doc, item, posting_date=None, prev_posting_date=None):
if not posting_date:
posting_date = add_days(today(), -1)
@@ -146,39 +146,42 @@ def get_booking_dates(doc, item, posting_date=None):
"deferred_revenue_account" if doc.doctype == "Sales Invoice" else "deferred_expense_account"
)
prev_gl_entry = frappe.db.sql(
"""
select name, posting_date 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
order by posting_date desc limit 1
""",
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
if not prev_posting_date:
prev_gl_entry = frappe.db.sql(
"""
select name, posting_date 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
order by posting_date desc limit 1
""",
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
prev_gl_via_je = frappe.db.sql(
"""
SELECT p.name, p.posting_date 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 c.docstatus < 2 order by posting_date desc limit 1
""",
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
prev_gl_via_je = frappe.db.sql(
"""
SELECT p.name, p.posting_date 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 c.docstatus < 2 order by posting_date desc limit 1
""",
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
as_dict=True,
)
if prev_gl_via_je:
if (not prev_gl_entry) or (
prev_gl_entry and prev_gl_entry[0].posting_date < prev_gl_via_je[0].posting_date
):
prev_gl_entry = prev_gl_via_je
if prev_gl_via_je:
if (not prev_gl_entry) or (
prev_gl_entry and prev_gl_entry[0].posting_date < prev_gl_via_je[0].posting_date
):
prev_gl_entry = prev_gl_via_je
if prev_gl_entry:
start_date = getdate(add_days(prev_gl_entry[0].posting_date, 1))
else:
start_date = item.service_start_date
if prev_gl_entry:
start_date = getdate(add_days(prev_gl_entry[0].posting_date, 1))
else:
start_date = item.service_start_date
start_date = getdate(add_days(prev_posting_date, 1))
end_date = get_last_day(start_date)
if end_date >= item.service_end_date:
end_date = item.service_end_date
@@ -341,9 +344,15 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
accounts_frozen_upto = frappe.get_cached_value("Accounts Settings", "None", "acc_frozen_upto")
def _book_deferred_revenue_or_expense(
item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on
item,
via_journal_entry,
submit_journal_entry,
book_deferred_entries_based_on,
prev_posting_date=None,
):
start_date, end_date, last_gl_entry = get_booking_dates(doc, item, posting_date=posting_date)
start_date, end_date, last_gl_entry = get_booking_dates(
doc, item, posting_date=posting_date, prev_posting_date=prev_posting_date
)
if not (start_date and end_date):
return
@@ -377,9 +386,12 @@ 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):
end_date = get_last_day(add_days(accounts_frozen_upto, 1))
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(
@@ -388,7 +400,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
debit_account,
amount,
base_amount,
end_date,
gl_posting_date,
project,
account_currency,
item.cost_center,
@@ -404,7 +416,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
against,
amount,
base_amount,
end_date,
gl_posting_date,
project,
account_currency,
item.cost_center,
@@ -418,7 +430,11 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
if getdate(end_date) < getdate(posting_date) and not last_gl_entry:
_book_deferred_revenue_or_expense(
item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on
item,
via_journal_entry,
submit_journal_entry,
book_deferred_entries_based_on,
prev_posting_date,
)
via_journal_entry = cint(

View File

@@ -79,8 +79,8 @@ frappe.ui.form.on('Account', {
frm.add_custom_button(__('General Ledger'), function () {
frappe.route_options = {
"account": frm.doc.name,
"from_date": frappe.sys_defaults.year_start_date,
"to_date": frappe.sys_defaults.year_end_date,
"from_date": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[1],
"to_date": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
"company": frm.doc.company
};
frappe.set_route("query-report", "General Ledger");

View File

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

View File

@@ -204,8 +204,11 @@ class Account(NestedSet):
)
def validate_account_currency(self):
self.currency_explicitly_specified = True
if not self.account_currency:
self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
self.currency_explicitly_specified = False
gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency")
@@ -251,8 +254,10 @@ class Account(NestedSet):
{
"company": company,
# parent account's currency should be passed down to child account's curreny
# if it is None, it picks it up from default company currency, which might be unintended
"account_currency": erpnext.get_company_currency(company),
# if currency explicitly specified by user, child will inherit. else, default currency will be used.
"account_currency": self.account_currency
if self.currency_explicitly_specified
else erpnext.get_company_currency(company),
"parent_account": parent_acc_name_map[company],
}
)

View File

@@ -194,8 +194,8 @@ frappe.treeview_settings["Account"] = {
click: function(node, btn) {
frappe.route_options = {
"account": node.label,
"from_date": frappe.sys_defaults.year_start_date,
"to_date": frappe.sys_defaults.year_end_date,
"from_date": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[1],
"to_date": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
"company": frappe.treeview_settings['Account'].treeview.page.fields_dict.company.get_value()
};
frappe.set_route("query-report", "General Ledger");

View File

@@ -2,75 +2,13 @@
"country_code": "nl",
"name": "Netherlands - Grootboekschema",
"tree": {
"FABRIKAGEREKENINGEN": {
"is_group": 1,
"root_type": "Expense"
},
"FINANCIELE REKENINGEN, KORTLOPENDE VORDERINGEN EN SCHULDEN": {
"Bank": {
"RABO Bank": {
"account_type": "Bank"
},
"account_type": "Bank"
},
"KORTLOPENDE SCHULDEN": {
"Af te dragen Btw-verlegd": {
"account_type": "Tax"
},
"Afdracht loonheffing": {},
"Btw af te dragen hoog": {
"account_type": "Tax"
},
"Btw af te dragen laag": {
"account_type": "Tax"
},
"Btw af te dragen overig": {
"account_type": "Tax"
},
"Btw oude jaren": {
"account_type": "Tax"
},
"Btw te vorderen hoog": {
"account_type": "Tax"
},
"Btw te vorderen laag": {
"account_type": "Tax"
},
"Btw te vorderen overig": {
"account_type": "Tax"
},
"Btw-afdracht": {
"account_type": "Tax"
},
"Crediteuren": {
"account_type": "Payable"
},
"Dividend": {},
"Dividendbelasting": {},
"Energiekosten 1": {},
"Investeringsaftrek": {},
"Loonheffing": {},
"Overige te betalen posten": {},
"Pensioenpremies 1": {},
"Premie WIR": {},
"Rekening-courant inkoopvereniging": {},
"Rente": {},
"Sociale lasten 1": {},
"Stock Recieved niet gefactureerd": {
"account_type": "Stock Received But Not Billed"
},
"Tanti\u00e8mes 1": {},
"Te vorderen Btw-verlegd": {
"account_type": "Tax"
},
"Telefoon/telefax 1": {},
"Termijnen onderh. werk": {},
"Vakantiedagen": {},
"Vakantiegeld 1": {},
"Vakantiezegels": {},
"Vennootschapsbelasting": {},
"Vooruit ontvangen bedr.": {}
},
},
"LIQUIDE MIDDELEN": {
"ABN-AMRO bank": {},
"Bankbetaalkaarten": {},
@@ -91,6 +29,110 @@
},
"account_type": "Cash"
},
"TUSSENREKENINGEN": {
"Betaalwijze cadeaubonnen": {
"account_type": "Cash"
},
"Betaalwijze chipknip": {
"account_type": "Cash"
},
"Betaalwijze contant": {
"account_type": "Cash"
},
"Betaalwijze pin": {
"account_type": "Cash"
},
"Inkopen Nederland hoog": {
"account_type": "Cash"
},
"Inkopen Nederland laag": {
"account_type": "Cash"
},
"Inkopen Nederland onbelast": {
"account_type": "Cash"
},
"Inkopen Nederland overig": {
"account_type": "Cash"
},
"Inkopen Nederland verlegd": {
"account_type": "Cash"
},
"Inkopen binnen EU hoog": {
"account_type": "Cash"
},
"Inkopen binnen EU laag": {
"account_type": "Cash"
},
"Inkopen binnen EU overig": {
"account_type": "Cash"
},
"Inkopen buiten EU hoog": {
"account_type": "Cash"
},
"Inkopen buiten EU laag": {
"account_type": "Cash"
},
"Inkopen buiten EU overig": {
"account_type": "Cash"
},
"Kassa 1": {
"account_type": "Cash"
},
"Kassa 2": {
"account_type": "Cash"
},
"Netto lonen": {
"account_type": "Cash"
},
"Tegenrekening Inkopen": {
"account_type": "Cash"
},
"Tussenrek. autom. betalingen": {
"account_type": "Cash"
},
"Tussenrek. autom. loonbetalingen": {
"account_type": "Cash"
},
"Tussenrek. cadeaubonbetalingen": {
"account_type": "Cash"
},
"Tussenrekening balans": {
"account_type": "Cash"
},
"Tussenrekening chipknip": {
"account_type": "Cash"
},
"Tussenrekening correcties": {
"account_type": "Cash"
},
"Tussenrekening pin": {
"account_type": "Cash"
},
"Vraagposten": {
"account_type": "Cash"
},
"VOORRAAD GRONDSTOFFEN, HULPMATERIALEN EN HANDELSGOEDEREN": {
"Emballage": {},
"Gereed product 1": {},
"Gereed product 2": {},
"Goederen 1": {},
"Goederen 2": {},
"Goederen in consignatie": {},
"Goederen onderweg": {},
"Grondstoffen 1": {},
"Grondstoffen 2": {},
"Halffabrikaten 1": {},
"Halffabrikaten 2": {},
"Hulpstoffen 1": {},
"Hulpstoffen 2": {},
"Kantoorbenodigdheden": {},
"Onderhanden werk": {},
"Verpakkingsmateriaal": {},
"Zegels": {},
"root_type": "Asset"
},
"root_type": "Asset"
},
"VORDERINGEN": {
"Debiteuren": {
"account_type": "Receivable"
@@ -104,278 +146,299 @@
"Voorziening dubieuze debiteuren": {}
},
"root_type": "Asset"
},
"INDIRECTE KOSTEN": {
},
"KORTLOPENDE SCHULDEN": {
"Af te dragen Btw-verlegd": {
"account_type": "Tax"
},
"Afdracht loonheffing": {},
"Btw af te dragen hoog": {
"account_type": "Tax"
},
"Btw af te dragen laag": {
"account_type": "Tax"
},
"Btw af te dragen overig": {
"account_type": "Tax"
},
"Btw oude jaren": {
"account_type": "Tax"
},
"Btw te vorderen hoog": {
"account_type": "Tax"
},
"Btw te vorderen laag": {
"account_type": "Tax"
},
"Btw te vorderen overig": {
"account_type": "Tax"
},
"Btw-afdracht": {
"account_type": "Tax"
},
"Crediteuren": {
"account_type": "Payable"
},
"Dividend": {},
"Dividendbelasting": {},
"Energiekosten 1": {},
"Investeringsaftrek": {},
"Loonheffing": {},
"Overige te betalen posten": {},
"Pensioenpremies 1": {},
"Premie WIR": {},
"Rekening-courant inkoopvereniging": {},
"Rente": {},
"Sociale lasten 1": {},
"Stock Recieved niet gefactureerd": {
"account_type": "Stock Received But Not Billed"
},
"Tanti\u00e8mes 1": {},
"Te vorderen Btw-verlegd": {
"account_type": "Tax"
},
"Telefoon/telefax 1": {},
"Termijnen onderh. werk": {},
"Vakantiedagen": {},
"Vakantiegeld 1": {},
"Vakantiezegels": {},
"Vennootschapsbelasting": {},
"Vooruit ontvangen bedr.": {},
"is_group": 1,
"root_type": "Liability"
},
"FABRIKAGEREKENINGEN": {
"is_group": 1,
"root_type": "Expense"
},
"KOSTENREKENINGEN": {
"AFSCHRIJVINGEN": {
"Aanhangwagens": {},
"Aankoopkosten": {},
"Aanloopkosten": {},
"Auteursrechten": {},
"Bedrijfsgebouwen": {},
"Bedrijfsinventaris": {
"root_type": "Expense",
"INDIRECTE KOSTEN": {
"is_group": 1,
"root_type": "Expense"
},
"KOSTENREKENINGEN": {
"AFSCHRIJVINGEN": {
"Aanhangwagens": {},
"Aankoopkosten": {},
"Aanloopkosten": {},
"Auteursrechten": {},
"Bedrijfsgebouwen": {},
"Bedrijfsinventaris": {
"account_type": "Depreciation"
},
"Drankvergunningen": {},
"Fabrieksinventaris": {
"account_type": "Depreciation"
},
"Gebouwen": {},
"Gereedschappen": {},
"Goodwill": {},
"Grondverbetering": {},
"Heftrucks": {},
"Kantine-inventaris": {},
"Kantoorinventaris": {
"account_type": "Depreciation"
},
"Kantoormachines": {},
"Licenties": {},
"Machines 1": {},
"Magazijninventaris": {},
"Octrooien": {},
"Ontwikkelingskosten": {},
"Pachtersinvestering": {},
"Parkeerplaats": {},
"Personenauto's": {
"account_type": "Depreciation"
},
"Rijwielen en bromfietsen": {},
"Tonnagevergunningen": {},
"Verbouwingen": {},
"Vergunningen": {},
"Voorraadverschillen": {},
"Vrachtauto's": {},
"Winkels": {},
"Woon-winkelhuis": {},
"account_type": "Depreciation"
},
"Drankvergunningen": {},
"Fabrieksinventaris": {
"account_type": "Depreciation"
"ALGEMENE KOSTEN": {
"Accountantskosten": {},
"Advieskosten": {},
"Assuranties 1": {},
"Bankkosten": {},
"Juridische kosten": {},
"Overige algemene kosten": {},
"Toev. Ass. eigen risico": {}
},
"Gebouwen": {},
"Gereedschappen": {},
"Goodwill": {},
"Grondverbetering": {},
"Heftrucks": {},
"Kantine-inventaris": {},
"Kantoorinventaris": {
"account_type": "Depreciation"
"BEDRIJFSKOSTEN": {
"Assuranties 2": {},
"Energie (krachtstroom)": {},
"Gereedschappen 1": {},
"Hulpmaterialen 1": {},
"Huur inventaris": {},
"Huur machines": {},
"Leasing invent.operational": {},
"Leasing mach. operational": {},
"Onderhoud inventaris": {},
"Onderhoud machines": {},
"Ophalen/vervoer afval": {},
"Overige bedrijfskosten": {}
},
"Kantoormachines": {},
"Licenties": {},
"Machines 1": {},
"Magazijninventaris": {},
"Octrooien": {},
"Ontwikkelingskosten": {},
"Pachtersinvestering": {},
"Parkeerplaats": {},
"Personenauto's": {
"account_type": "Depreciation"
"FINANCIERINGSKOSTEN 1": {
"Overige rentebaten": {},
"Overige rentelasten": {},
"Rente bankkrediet": {},
"Rente huurkoopcontracten": {},
"Rente hypotheek": {},
"Rente leasecontracten": {},
"Rente lening o/g": {},
"Rente lening u/g": {}
},
"Rijwielen en bromfietsen": {},
"Tonnagevergunningen": {},
"Verbouwingen": {},
"Vergunningen": {},
"Voorraadverschillen": {},
"Vrachtauto's": {},
"Winkels": {},
"Woon-winkelhuis": {},
"account_type": "Depreciation"
},
"ALGEMENE KOSTEN": {
"Accountantskosten": {},
"Advieskosten": {},
"Assuranties 1": {},
"Bankkosten": {},
"Juridische kosten": {},
"Overige algemene kosten": {},
"Toev. Ass. eigen risico": {}
},
"BEDRIJFSKOSTEN": {
"Assuranties 2": {},
"Energie (krachtstroom)": {},
"Gereedschappen 1": {},
"Hulpmaterialen 1": {},
"Huur inventaris": {},
"Huur machines": {},
"Leasing invent.operational": {},
"Leasing mach. operational": {},
"Onderhoud inventaris": {},
"Onderhoud machines": {},
"Ophalen/vervoer afval": {},
"Overige bedrijfskosten": {}
},
"FINANCIERINGSKOSTEN 1": {
"Overige rentebaten": {},
"Overige rentelasten": {},
"Rente bankkrediet": {},
"Rente huurkoopcontracten": {},
"Rente hypotheek": {},
"Rente leasecontracten": {},
"Rente lening o/g": {},
"Rente lening u/g": {}
},
"HUISVESTINGSKOSTEN": {
"Assurantie onroerend goed": {},
"Belastingen onr. Goed": {},
"Energiekosten": {},
"Groot onderhoud onr. Goed": {},
"Huur": {},
"Huurwaarde woongedeelte": {},
"Onderhoud onroerend goed": {},
"Ontvangen huren": {},
"Overige huisvestingskosten": {},
"Pacht": {},
"Schoonmaakkosten": {},
"Toevoeging egalisatieres. Groot onderhoud": {}
},
"KANTOORKOSTEN": {
"Administratiekosten": {},
"Contributies/abonnementen": {},
"Huur kantoorapparatuur": {},
"Internetaansluiting": {},
"Kantoorbenodigdh./drukw.": {},
"Onderhoud kantoorinvent.": {},
"Overige kantoorkosten": {},
"Porti": {},
"Telefoon/telefax": {}
},
"OVERIGE BATEN EN LASTEN": {
"Betaalde schadevergoed.": {},
"Boekverlies vaste activa": {},
"Boekwinst van vaste activa": {},
"K.O. regeling OB": {},
"Kasverschillen": {},
"Kosten loonbelasting": {},
"Kosten omzetbelasting": {},
"Nadelige koersverschillen": {},
"Naheffing bedrijfsver.": {},
"Ontvangen schadevergoed.": {},
"Overige baten": {},
"Overige lasten": {},
"Voordelige koersverschil.": {}
},
"PERSONEELSKOSTEN": {
"Autokostenvergoeding": {},
"Bedrijfskleding": {},
"Belastingvrije uitkeringen": {},
"Bijzondere beloningen": {},
"Congressen, seminars en symposia": {},
"Gereedschapsgeld": {},
"Geschenken personeel": {},
"Gratificaties": {},
"Inhouding pensioenpremies": {},
"Inhouding sociale lasten": {},
"Kantinekosten": {},
"Lonen en salarissen": {},
"Loonwerk": {},
"Managementvergoedingen": {},
"Opleidingskosten": {},
"Oprenting stamrechtverpl.": {},
"Overhevelingstoeslag": {},
"Overige kostenverg.": {},
"Overige personeelskosten": {},
"Overige uitkeringen": {},
"Pensioenpremies": {},
"Provisie 1": {},
"Reiskosten": {},
"Rijwielvergoeding": {},
"Sociale lasten": {},
"Tanti\u00e8mes": {},
"Thuiswerkers": {},
"Toev. Backservice pens.verpl.": {},
"Toevoeging pensioenverpl.": {},
"Uitkering ziekengeld": {},
"Uitzendkrachten": {},
"Vakantiebonnen": {},
"Vakantiegeld": {},
"Vergoeding studiekosten": {},
"Wervingskosten personeel": {}
},
"VERKOOPKOSTEN": {
"Advertenties": {},
"Afschrijving dubieuze deb.": {},
"Beurskosten": {},
"Etalagekosten": {},
"Exportkosten": {},
"Kascorrecties": {},
"Overige verkoopkosten": {},
"Provisie": {},
"Reclame": {},
"Reis en verblijfkosten": {},
"Relatiegeschenken": {},
"Representatiekosten": {},
"Uitgaande vrachten": {},
"Veilingkosten": {},
"Verpakkingsmateriaal 1": {},
"Websitekosten": {}
},
"VERVOERSKOSTEN": {
"Assuranties auto's": {},
"Brandstoffen": {},
"Leasing auto's": {},
"Onderhoud personenauto's": {},
"Onderhoud vrachtauto's": {},
"Overige vervoerskosten": {},
"Priv\u00e9-gebruik auto's": {},
"Wegenbelasting": {}
},
"root_type": "Expense"
},
"TUSSENREKENINGEN": {
"Betaalwijze cadeaubonnen": {
"account_type": "Cash"
},
"Betaalwijze chipknip": {
"account_type": "Cash"
},
"Betaalwijze contant": {
"account_type": "Cash"
},
"Betaalwijze pin": {
"account_type": "Cash"
},
"Inkopen Nederland hoog": {
"account_type": "Cash"
},
"Inkopen Nederland laag": {
"account_type": "Cash"
},
"Inkopen Nederland onbelast": {
"account_type": "Cash"
},
"Inkopen Nederland overig": {
"account_type": "Cash"
},
"Inkopen Nederland verlegd": {
"account_type": "Cash"
},
"Inkopen binnen EU hoog": {
"account_type": "Cash"
},
"Inkopen binnen EU laag": {
"account_type": "Cash"
},
"Inkopen binnen EU overig": {
"account_type": "Cash"
},
"Inkopen buiten EU hoog": {
"account_type": "Cash"
},
"Inkopen buiten EU laag": {
"account_type": "Cash"
},
"Inkopen buiten EU overig": {
"account_type": "Cash"
},
"Kassa 1": {
"account_type": "Cash"
},
"Kassa 2": {
"account_type": "Cash"
},
"Netto lonen": {
"account_type": "Cash"
},
"Tegenrekening Inkopen": {
"account_type": "Cash"
},
"Tussenrek. autom. betalingen": {
"account_type": "Cash"
},
"Tussenrek. autom. loonbetalingen": {
"account_type": "Cash"
},
"Tussenrek. cadeaubonbetalingen": {
"account_type": "Cash"
},
"Tussenrekening balans": {
"account_type": "Cash"
},
"Tussenrekening chipknip": {
"account_type": "Cash"
},
"Tussenrekening correcties": {
"account_type": "Cash"
},
"Tussenrekening pin": {
"account_type": "Cash"
},
"Vraagposten": {
"account_type": "Cash"
},
"root_type": "Asset"
"HUISVESTINGSKOSTEN": {
"Assurantie onroerend goed": {},
"Belastingen onr. Goed": {},
"Energiekosten": {},
"Groot onderhoud onr. Goed": {},
"Huur": {},
"Huurwaarde woongedeelte": {},
"Onderhoud onroerend goed": {},
"Ontvangen huren": {},
"Overige huisvestingskosten": {},
"Pacht": {},
"Schoonmaakkosten": {},
"Toevoeging egalisatieres. Groot onderhoud": {}
},
"KANTOORKOSTEN": {
"Administratiekosten": {},
"Contributies/abonnementen": {},
"Huur kantoorapparatuur": {},
"Internetaansluiting": {},
"Kantoorbenodigdh./drukw.": {},
"Onderhoud kantoorinvent.": {},
"Overige kantoorkosten": {},
"Porti": {},
"Telefoon/telefax": {}
},
"OVERIGE BATEN EN LASTEN": {
"Betaalde schadevergoed.": {},
"Boekverlies vaste activa": {},
"Boekwinst van vaste activa": {},
"K.O. regeling OB": {},
"Kasverschillen": {},
"Kosten loonbelasting": {},
"Kosten omzetbelasting": {},
"Nadelige koersverschillen": {},
"Naheffing bedrijfsver.": {},
"Ontvangen schadevergoed.": {},
"Overige baten": {},
"Overige lasten": {},
"Voordelige koersverschil.": {}
},
"PERSONEELSKOSTEN": {
"Autokostenvergoeding": {},
"Bedrijfskleding": {},
"Belastingvrije uitkeringen": {},
"Bijzondere beloningen": {},
"Congressen, seminars en symposia": {},
"Gereedschapsgeld": {},
"Geschenken personeel": {},
"Gratificaties": {},
"Inhouding pensioenpremies": {},
"Inhouding sociale lasten": {},
"Kantinekosten": {},
"Lonen en salarissen": {},
"Loonwerk": {},
"Managementvergoedingen": {},
"Opleidingskosten": {},
"Oprenting stamrechtverpl.": {},
"Overhevelingstoeslag": {},
"Overige kostenverg.": {},
"Overige personeelskosten": {},
"Overige uitkeringen": {},
"Pensioenpremies": {},
"Provisie 1": {},
"Reiskosten": {},
"Rijwielvergoeding": {},
"Sociale lasten": {},
"Tanti\u00e8mes": {},
"Thuiswerkers": {},
"Toev. Backservice pens.verpl.": {},
"Toevoeging pensioenverpl.": {},
"Uitkering ziekengeld": {},
"Uitzendkrachten": {},
"Vakantiebonnen": {},
"Vakantiegeld": {},
"Vergoeding studiekosten": {},
"Wervingskosten personeel": {}
},
"VERKOOPKOSTEN": {
"Advertenties": {},
"Afschrijving dubieuze deb.": {},
"Beurskosten": {},
"Etalagekosten": {},
"Exportkosten": {},
"Kascorrecties": {},
"Overige verkoopkosten": {},
"Provisie": {},
"Reclame": {},
"Reis en verblijfkosten": {},
"Relatiegeschenken": {},
"Representatiekosten": {},
"Uitgaande vrachten": {},
"Veilingkosten": {},
"Verpakkingsmateriaal 1": {},
"Websitekosten": {}
},
"VERVOERSKOSTEN": {
"Assuranties auto's": {},
"Brandstoffen": {},
"Leasing auto's": {},
"Onderhoud personenauto's": {},
"Onderhoud vrachtauto's": {},
"Overige vervoerskosten": {},
"Priv\u00e9-gebruik auto's": {},
"Wegenbelasting": {}
},
"VOORRAAD GEREED PRODUCT EN ONDERHANDEN WERK": {
"Betalingskort. crediteuren": {},
"Garantiekosten": {},
"Hulpmaterialen": {},
"Inkomende vrachten": {
"account_type": "Expenses Included In Valuation"
},
"Inkoop import buiten EU hoog": {},
"Inkoop import buiten EU laag": {},
"Inkoop import buiten EU overig": {},
"Inkoopbonussen": {},
"Inkoopkosten": {},
"Inkoopprovisie": {},
"Inkopen BTW verlegd": {},
"Inkopen EU hoog tarief": {},
"Inkopen EU laag tarief": {},
"Inkopen EU overig": {},
"Inkopen hoog": {},
"Inkopen laag": {},
"Inkopen nul": {},
"Inkopen overig": {},
"Invoerkosten": {},
"Kosten inkoopvereniging": {},
"Kostprijs omzet grondstoffen": {
"account_type": "Cost of Goods Sold"
},
"Kostprijs omzet handelsgoederen": {},
"Onttrekking uitgev.garantie": {},
"Priv\u00e9-gebruik goederen": {},
"Stock aanpassing": {
"account_type": "Stock Adjustment"
},
"Tegenrekening inkoop": {},
"Toev. Voorz. incour. grondst.": {},
"Toevoeging garantieverpl.": {},
"Toevoeging voorz. incour. handelsgoed.": {},
"Uitbesteed werk": {},
"Voorz. Incourourant grondst.": {},
"Voorz.incour. handelsgoed.": {},
"root_type": "Expense"
},
"root_type": "Expense"
}
},
"VASTE ACTIVA, EIGEN VERMOGEN, LANGLOPEND VREEMD VERMOGEN EN VOORZIENINGEN": {
"EIGEN VERMOGEN": {
@@ -602,7 +665,7 @@
"account_type": "Equity"
}
},
"root_type": "Asset"
"root_type": "Equity"
},
"VERKOOPRESULTATEN": {
"Diensten fabric. 0% niet-EU": {},
@@ -627,67 +690,6 @@
"Verleende Kredietbep. fabricage": {},
"Verleende Kredietbep. handel": {},
"root_type": "Income"
},
"VOORRAAD GEREED PRODUCT EN ONDERHANDEN WERK": {
"Betalingskort. crediteuren": {},
"Garantiekosten": {},
"Hulpmaterialen": {},
"Inkomende vrachten": {
"account_type": "Expenses Included In Valuation"
},
"Inkoop import buiten EU hoog": {},
"Inkoop import buiten EU laag": {},
"Inkoop import buiten EU overig": {},
"Inkoopbonussen": {},
"Inkoopkosten": {},
"Inkoopprovisie": {},
"Inkopen BTW verlegd": {},
"Inkopen EU hoog tarief": {},
"Inkopen EU laag tarief": {},
"Inkopen EU overig": {},
"Inkopen hoog": {},
"Inkopen laag": {},
"Inkopen nul": {},
"Inkopen overig": {},
"Invoerkosten": {},
"Kosten inkoopvereniging": {},
"Kostprijs omzet grondstoffen": {
"account_type": "Cost of Goods Sold"
},
"Kostprijs omzet handelsgoederen": {},
"Onttrekking uitgev.garantie": {},
"Priv\u00e9-gebruik goederen": {},
"Stock aanpassing": {
"account_type": "Stock Adjustment"
},
"Tegenrekening inkoop": {},
"Toev. Voorz. incour. grondst.": {},
"Toevoeging garantieverpl.": {},
"Toevoeging voorz. incour. handelsgoed.": {},
"Uitbesteed werk": {},
"Voorz. Incourourant grondst.": {},
"Voorz.incour. handelsgoed.": {},
"root_type": "Expense"
},
"VOORRAAD GRONDSTOFFEN, HULPMATERIALEN EN HANDELSGOEDEREN": {
"Emballage": {},
"Gereed product 1": {},
"Gereed product 2": {},
"Goederen 1": {},
"Goederen 2": {},
"Goederen in consignatie": {},
"Goederen onderweg": {},
"Grondstoffen 1": {},
"Grondstoffen 2": {},
"Halffabrikaten 1": {},
"Halffabrikaten 2": {},
"Hulpstoffen 1": {},
"Hulpstoffen 2": {},
"Kantoorbenodigdheden": {},
"Onderhanden werk": {},
"Verpakkingsmateriaal": {},
"Zegels": {},
"root_type": "Asset"
}
}
}

View File

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

View File

@@ -14,10 +14,8 @@ class AccountClosingBalance(Document):
pass
def make_closing_entries(closing_entries, voucher_name):
def make_closing_entries(closing_entries, voucher_name, company, closing_date):
accounting_dimensions = get_accounting_dimensions()
company = closing_entries[0].get("company")
closing_date = closing_entries[0].get("closing_date")
previous_closing_entries = get_previous_closing_entries(
company, closing_date, accounting_dimensions
@@ -38,6 +36,7 @@ def make_closing_entries(closing_entries, voucher_name):
"closing_date": closing_date,
}
)
cle.flags.ignore_permissions = True
cle.submit()

View File

@@ -15,6 +15,17 @@ frappe.ui.form.on('Accounting Dimension', {
};
});
frm.set_query("offsetting_account", "dimension_defaults", function(doc, cdt, cdn) {
let d = locals[cdt][cdn];
return {
filters: {
company: d.company,
root_type: ["in", ["Asset", "Liability"]],
is_group: 0
}
}
});
if (!frm.is_new()) {
frm.add_custom_button(__('Show {0}', [frm.doc.document_type]), function () {
frappe.set_route("List", frm.doc.document_type);

View File

@@ -39,6 +39,8 @@ class AccountingDimension(Document):
if not self.is_new():
self.validate_document_type_change()
self.validate_dimension_defaults()
def validate_document_type_change(self):
doctype_before_save = frappe.db.get_value("Accounting Dimension", self.name, "document_type")
if doctype_before_save != self.document_type:
@@ -46,17 +48,27 @@ class AccountingDimension(Document):
message += _("Please create a new Accounting Dimension if required.")
frappe.throw(message)
def validate_dimension_defaults(self):
companies = []
for default in self.get("dimension_defaults"):
if default.company not in companies:
companies.append(default.company)
else:
frappe.throw(_("Company {0} is added more than once").format(frappe.bold(default.company)))
def after_insert(self):
if frappe.flags.in_test:
make_dimension_in_accounting_doctypes(doc=self)
else:
frappe.enqueue(make_dimension_in_accounting_doctypes, doc=self, queue="long")
frappe.enqueue(
make_dimension_in_accounting_doctypes, doc=self, queue="long", enqueue_after_commit=True
)
def on_trash(self):
if frappe.flags.in_test:
delete_accounting_dimension(doc=self)
else:
frappe.enqueue(delete_accounting_dimension, doc=self, queue="long")
frappe.enqueue(delete_accounting_dimension, doc=self, queue="long", enqueue_after_commit=True)
def set_fieldname_and_label(self):
if not self.label:
@@ -269,6 +281,12 @@ def get_dimensions(with_cost_center_and_project=False):
as_dict=1,
)
if isinstance(with_cost_center_and_project, str):
if with_cost_center_and_project.lower().strip() == "true":
with_cost_center_and_project = True
else:
with_cost_center_and_project = False
if with_cost_center_and_project:
dimension_filters.extend(
[

View File

@@ -8,7 +8,10 @@
"reference_document",
"default_dimension",
"mandatory_for_bs",
"mandatory_for_pl"
"mandatory_for_pl",
"column_break_lqns",
"automatically_post_balancing_accounting_entry",
"offsetting_account"
],
"fields": [
{
@@ -50,6 +53,23 @@
"fieldtype": "Check",
"in_list_view": 1,
"label": "Mandatory For Profit and Loss Account"
},
{
"default": "0",
"fieldname": "automatically_post_balancing_accounting_entry",
"fieldtype": "Check",
"label": "Automatically post balancing accounting entry"
},
{
"fieldname": "offsetting_account",
"fieldtype": "Link",
"label": "Offsetting Account",
"mandatory_depends_on": "eval: doc.automatically_post_balancing_accounting_entry",
"options": "Account"
},
{
"fieldname": "column_break_lqns",
"fieldtype": "Column Break"
}
],
"istable": 1,

View File

@@ -68,6 +68,16 @@ frappe.ui.form.on('Accounting Dimension Filter', {
frm.refresh_field("dimensions");
frm.trigger('setup_filters');
},
apply_restriction_on_values: function(frm) {
/** If restriction on values is not applied, we should set "allow_or_restrict" to "Restrict" with an empty allowed dimension table.
* Hence it's not "restricted" on any value.
*/
if (!frm.doc.apply_restriction_on_values) {
frm.set_value("allow_or_restrict", "Restrict");
frm.clear_table("dimensions");
frm.refresh_field("dimensions");
}
}
});
frappe.ui.form.on('Allowed Dimension', {

View File

@@ -10,6 +10,7 @@
"disabled",
"column_break_2",
"company",
"apply_restriction_on_values",
"allow_or_restrict",
"section_break_4",
"accounts",
@@ -24,94 +25,80 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Accounting Dimension",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "column_break_2",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_4",
"fieldtype": "Section Break",
"hide_border": 1,
"show_days": 1,
"show_seconds": 1
"hide_border": 1
},
{
"fieldname": "column_break_6",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
"fieldtype": "Column Break"
},
{
"depends_on": "eval:doc.apply_restriction_on_values == 1;",
"fieldname": "allow_or_restrict",
"fieldtype": "Select",
"label": "Allow Or Restrict Dimension",
"options": "Allow\nRestrict",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "accounts",
"fieldtype": "Table",
"label": "Applicable On Account",
"options": "Applicable On Account",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"depends_on": "eval:doc.accounting_dimension",
"depends_on": "eval:doc.accounting_dimension && doc.apply_restriction_on_values",
"fieldname": "dimensions",
"fieldtype": "Table",
"label": "Applicable Dimension",
"options": "Allowed Dimension",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"mandatory_depends_on": "eval:doc.apply_restriction_on_values == 1;",
"options": "Allowed Dimension"
},
{
"default": "0",
"fieldname": "disabled",
"fieldtype": "Check",
"label": "Disabled",
"show_days": 1,
"show_seconds": 1
"label": "Disabled"
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "dimension_filter_help",
"fieldtype": "HTML",
"label": "Dimension Filter Help",
"show_days": 1,
"show_seconds": 1
"label": "Dimension Filter Help"
},
{
"fieldname": "section_break_10",
"fieldtype": "Section Break",
"show_days": 1,
"show_seconds": 1
"fieldtype": "Section Break"
},
{
"default": "1",
"fieldname": "apply_restriction_on_values",
"fieldtype": "Check",
"label": "Apply restriction on dimension values"
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2021-02-03 12:04:58.678402",
"modified": "2023-06-07 14:59:41.869117",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Dimension Filter",
"naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
{
@@ -154,5 +141,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -8,6 +8,12 @@ from frappe.model.document import Document
class AccountingDimensionFilter(Document):
def before_save(self):
# If restriction is not applied on values, then remove all the dimensions and set allow_or_restrict to Restrict
if not self.apply_restriction_on_values:
self.allow_or_restrict = "Restrict"
self.set("dimensions", [])
def validate(self):
self.validate_applicable_accounts()
@@ -44,12 +50,12 @@ def get_dimension_filter_map():
a.applicable_on_account, d.dimension_value, p.accounting_dimension,
p.allow_or_restrict, a.is_mandatory
FROM
`tabApplicable On Account` a, `tabAllowed Dimension` d,
`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
AND p.name = d.parent
""",
as_dict=1,
)
@@ -76,4 +82,5 @@ def build_map(map_object, dimension, account, filter_value, allow_or_restrict, i
(dimension, account),
{"allowed_dimensions": [], "is_mandatory": is_mandatory, "allow_or_restrict": allow_or_restrict},
)
map_object[(dimension, account)]["allowed_dimensions"].append(filter_value)
if filter_value:
map_object[(dimension, account)]["allowed_dimensions"].append(filter_value)

View File

@@ -64,6 +64,7 @@ def create_accounting_dimension_filter():
"accounting_dimension": "Cost Center",
"allow_or_restrict": "Allow",
"company": "_Test Company",
"apply_restriction_on_values": 1,
"accounts": [
{
"applicable_on_account": "Sales - _TC",
@@ -85,6 +86,7 @@ def create_accounting_dimension_filter():
"doctype": "Accounting Dimension Filter",
"accounting_dimension": "Department",
"allow_or_restrict": "Allow",
"apply_restriction_on_values": 1,
"company": "_Test Company",
"accounts": [{"applicable_on_account": "Sales - _TC", "is_mandatory": 1}],
"dimensions": [{"accounting_dimension": "Department", "dimension_value": "Accounts - _TC"}],

View File

@@ -20,5 +20,11 @@ frappe.ui.form.on('Accounting Period', {
}
});
}
frm.set_query("document_type", "closed_documents", () => {
return {
query: "erpnext.controllers.queries.get_doctypes_for_closing",
}
});
}
});

View File

@@ -11,6 +11,10 @@ class OverlapError(frappe.ValidationError):
pass
class ClosedAccountingPeriod(frappe.ValidationError):
pass
class AccountingPeriod(Document):
def validate(self):
self.validate_overlap()
@@ -65,3 +69,42 @@ class AccountingPeriod(Document):
"closed_documents",
{"document_type": doctype_for_closing.document_type, "closed": doctype_for_closing.closed},
)
def validate_accounting_period_on_doc_save(doc, method=None):
if doc.doctype == "Bank Clearance":
return
elif doc.doctype == "Asset":
if doc.is_existing_asset:
return
else:
date = doc.available_for_use_date
elif doc.doctype == "Asset Repair":
date = doc.completion_date
else:
date = doc.posting_date
ap = frappe.qb.DocType("Accounting Period")
cd = frappe.qb.DocType("Closed Document")
accounting_period = (
frappe.qb.from_(ap)
.from_(cd)
.select(ap.name)
.where(
(ap.name == cd.parent)
& (ap.company == doc.company)
& (cd.closed == 1)
& (cd.document_type == doc.doctype)
& (date >= ap.start_date)
& (date <= ap.end_date)
)
).run(as_dict=1)
if accounting_period:
frappe.throw(
_("You cannot create a {0} within the closed Accounting Period {1}").format(
doc.doctype, frappe.bold(accounting_period[0]["name"])
),
ClosedAccountingPeriod,
)

View File

@@ -6,9 +6,11 @@ import unittest
import frappe
from frappe.utils import add_months, nowdate
from erpnext.accounts.doctype.accounting_period.accounting_period import OverlapError
from erpnext.accounts.doctype.accounting_period.accounting_period import (
ClosedAccountingPeriod,
OverlapError,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.general_ledger import ClosedAccountingPeriod
test_dependencies = ["Item"]
@@ -33,9 +35,9 @@ class TestAccountingPeriod(unittest.TestCase):
ap1.save()
doc = create_sales_invoice(
do_not_submit=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC"
do_not_save=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC"
)
self.assertRaises(ClosedAccountingPeriod, doc.submit)
self.assertRaises(ClosedAccountingPeriod, doc.save)
def tearDown(self):
for d in frappe.get_all("Accounting Period"):

View File

@@ -19,8 +19,8 @@
"column_break_17",
"enable_common_party_accounting",
"allow_multi_currency_invoices_against_single_party_account",
"report_setting_section",
"use_custom_cash_flow",
"journals_section",
"merge_similar_account_heads",
"deferred_accounting_settings_section",
"book_deferred_entries_based_on",
"column_break_18",
@@ -34,10 +34,13 @@
"book_tax_discount_loss",
"print_settings",
"show_inclusive_tax_in_print",
"show_taxes_as_table_in_print",
"column_break_12",
"show_payment_schedule_in_print",
"currency_exchange_section",
"allow_stale",
"section_break_jpd0",
"auto_reconcile_payments",
"stale_days",
"invoicing_settings_tab",
"accounts_transactions_settings_section",
@@ -55,11 +58,14 @@
"closing_settings_tab",
"period_closing_settings_section",
"acc_frozen_upto",
"ignore_account_closing_balance",
"column_break_25",
"frozen_accounts_modifier",
"report_settings_sb",
"tab_break_dpet",
"show_balance_in_coa"
"show_balance_in_coa",
"banking_tab",
"enable_party_matching",
"enable_fuzzy_matching"
],
"fields": [
{
@@ -170,20 +176,9 @@
"fieldtype": "Int",
"label": "Stale Days"
},
{
"fieldname": "report_settings_sb",
"fieldtype": "Section Break",
"label": "Report Settings"
},
{
"default": "0",
"description": "Only select this if you have set up the Cash Flow Mapper documents",
"fieldname": "use_custom_cash_flow",
"fieldtype": "Check",
"label": "Enable Custom Cash Flow Format"
},
{
"default": "0",
"description": "Payment Terms from orders will be fetched into the invoices as is",
"fieldname": "automatically_fetch_payment_terms",
"fieldtype": "Check",
"label": "Automatically Fetch Payment Terms from Order"
@@ -339,11 +334,6 @@
"fieldtype": "Tab Break",
"label": "POS"
},
{
"fieldname": "report_setting_section",
"fieldtype": "Section Break",
"label": "Report Setting"
},
{
"default": "0",
"description": "Enabling this will allow creation of multi-currency invoices against single party account in company currency",
@@ -368,6 +358,62 @@
"fieldname": "book_tax_discount_loss",
"fieldtype": "Check",
"label": "Book Tax Loss on Early Payment Discount"
},
{
"fieldname": "journals_section",
"fieldtype": "Section Break",
"label": "Journals"
},
{
"default": "0",
"description": "Rows with Same Account heads will be merged on Ledger",
"fieldname": "merge_similar_account_heads",
"fieldtype": "Check",
"label": "Merge Similar Account Heads"
},
{
"fieldname": "section_break_jpd0",
"fieldtype": "Section Break",
"label": "Payment Reconciliations"
},
{
"default": "0",
"fieldname": "auto_reconcile_payments",
"fieldtype": "Check",
"label": "Auto Reconcile Payments"
},
{
"default": "0",
"fieldname": "show_taxes_as_table_in_print",
"fieldtype": "Check",
"label": "Show Taxes as Table in Print"
},
{
"fieldname": "banking_tab",
"fieldtype": "Tab Break",
"label": "Banking"
},
{
"default": "0",
"description": "Auto match and set the Party in Bank Transactions",
"fieldname": "enable_party_matching",
"fieldtype": "Check",
"label": "Enable Automatic Party Matching"
},
{
"default": "0",
"depends_on": "enable_party_matching",
"description": "Approximately match the description/party name against parties",
"fieldname": "enable_fuzzy_matching",
"fieldtype": "Check",
"label": "Enable Fuzzy Matching"
},
{
"default": "0",
"description": "Financial reports will be generated using GL Entry doctypes (should be enabled if Period Closing Voucher is not posted for all years sequentially or missing) ",
"fieldname": "ignore_account_closing_balance",
"fieldtype": "Check",
"label": "Ignore Account Closing Balance"
}
],
"icon": "icon-cog",
@@ -375,7 +421,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-03-28 09:50:20.375233",
"modified": "2023-07-27 15:05:34.000264",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",

View File

@@ -14,21 +14,32 @@ from erpnext.stock.utils import check_pending_reposting
class AccountsSettings(Document):
def on_update(self):
frappe.clear_cache()
def validate(self):
frappe.db.set_default(
"add_taxes_from_item_tax_template", self.get("add_taxes_from_item_tax_template", 0)
)
old_doc = self.get_doc_before_save()
clear_cache = False
frappe.db.set_default(
"enable_common_party_accounting", self.get("enable_common_party_accounting", 0)
)
if old_doc.add_taxes_from_item_tax_template != self.add_taxes_from_item_tax_template:
frappe.db.set_default(
"add_taxes_from_item_tax_template", self.get("add_taxes_from_item_tax_template", 0)
)
clear_cache = True
if old_doc.enable_common_party_accounting != self.enable_common_party_accounting:
frappe.db.set_default(
"enable_common_party_accounting", self.get("enable_common_party_accounting", 0)
)
clear_cache = True
self.validate_stale_days()
self.enable_payment_schedule_in_print()
self.validate_pending_reposts()
if old_doc.show_payment_schedule_in_print != self.show_payment_schedule_in_print:
self.enable_payment_schedule_in_print()
if old_doc.acc_frozen_upto != self.acc_frozen_upto:
self.validate_pending_reposts()
if clear_cache:
frappe.clear_cache()
def validate_stale_days(self):
if not self.allow_stale and cint(self.stale_days) <= 0:

View File

@@ -8,9 +8,6 @@ frappe.ui.form.on('Bank', {
},
refresh: function(frm) {
add_fields_to_mapping_table(frm);
frappe.dynamic_link = { doc: frm.doc, fieldname: 'name', doctype: 'Bank' };
frm.toggle_display(['address_html','contact_html'], !frm.doc.__islocal);
if (frm.doc.__islocal) {
@@ -105,7 +102,7 @@ erpnext.integrations.refreshPlaidLink = class refreshPlaidLink {
}
onScriptLoaded(me) {
me.linkHandler = Plaid.create({
me.linkHandler = Plaid.create({ // eslint-disable-line no-undef
env: me.plaid_env,
token: me.token,
onSuccess: me.plaid_success

View File

@@ -70,7 +70,6 @@ def make_bank_account(doctype, docname):
return doc
@frappe.whitelist()
def get_party_bank_account(party_type, party):
return frappe.db.get_value(party_type, party, "default_bank_account")

View File

@@ -41,7 +41,7 @@ frappe.ui.form.on("Bank Clearance", {
frm.trigger("get_payment_entries")
);
frm.change_custom_button_type('Get Payment Entries', null, 'primary');
frm.change_custom_button_type(__('Get Payment Entries'), null, 'primary');
},
update_clearance_date: function(frm) {
@@ -53,8 +53,8 @@ frappe.ui.form.on("Bank Clearance", {
frm.refresh_fields();
if (!frm.doc.payment_entries.length) {
frm.change_custom_button_type('Get Payment Entries', null, 'primary');
frm.change_custom_button_type('Update Clearance Date', null, 'default');
frm.change_custom_button_type(__('Get Payment Entries'), null, 'primary');
frm.change_custom_button_type(__('Update Clearance Date'), null, 'default');
}
}
});
@@ -72,8 +72,8 @@ frappe.ui.form.on("Bank Clearance", {
frm.trigger("update_clearance_date")
);
frm.change_custom_button_type('Get Payment Entries', null, 'default');
frm.change_custom_button_type('Update Clearance Date', null, 'primary');
frm.change_custom_button_type(__('Get Payment Entries'), null, 'default');
frm.change_custom_button_type(__('Update Clearance Date'), null, 'primary');
}
}
});

View File

@@ -5,7 +5,6 @@
import frappe
from frappe import _, msgprint
from frappe.model.document import Document
from frappe.query_builder.custom import ConstantColumn
from frappe.utils import flt, fmt_money, getdate
import erpnext
@@ -22,167 +21,24 @@ class BankClearance(Document):
if not self.account:
frappe.throw(_("Account is mandatory to get payment entries"))
condition = ""
if not self.include_reconciled_entries:
condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')"
entries = []
journal_entries = frappe.db.sql(
"""
select
"Journal Entry" as payment_document, t1.name as payment_entry,
t1.cheque_no as cheque_number, t1.cheque_date,
sum(t2.debit_in_account_currency) as debit, sum(t2.credit_in_account_currency) as credit,
t1.posting_date, t2.against_account, t1.clearance_date, t2.account_currency
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
where
t2.parent = t1.name and t2.account = %(account)s and t1.docstatus=1
and t1.posting_date >= %(from)s and t1.posting_date <= %(to)s
and ifnull(t1.is_opening, 'No') = 'No' {condition}
group by t2.account, t1.name
order by t1.posting_date ASC, t1.name DESC
""".format(
condition=condition
),
{"account": self.account, "from": self.from_date, "to": self.to_date},
as_dict=1,
)
if self.bank_account:
condition += "and bank_account = %(bank_account)s"
payment_entries = frappe.db.sql(
"""
select
"Payment Entry" as payment_document, name as payment_entry,
reference_no as cheque_number, reference_date as cheque_date,
if(paid_from=%(account)s, paid_amount, 0) as credit,
if(paid_from=%(account)s, 0, received_amount) as debit,
posting_date, ifnull(party,if(paid_from=%(account)s,paid_to,paid_from)) as against_account, clearance_date,
if(paid_to=%(account)s, paid_to_account_currency, paid_from_account_currency) as account_currency
from `tabPayment Entry`
where
(paid_from=%(account)s or paid_to=%(account)s) and docstatus=1
and posting_date >= %(from)s and posting_date <= %(to)s
{condition}
order by
posting_date ASC, name DESC
""".format(
condition=condition
),
{
"account": self.account,
"from": self.from_date,
"to": self.to_date,
"bank_account": self.bank_account,
},
as_dict=1,
)
loan_disbursement = frappe.qb.DocType("Loan Disbursement")
query = (
frappe.qb.from_(loan_disbursement)
.select(
ConstantColumn("Loan Disbursement").as_("payment_document"),
loan_disbursement.name.as_("payment_entry"),
loan_disbursement.disbursed_amount.as_("credit"),
ConstantColumn(0).as_("debit"),
loan_disbursement.reference_number.as_("cheque_number"),
loan_disbursement.reference_date.as_("cheque_date"),
loan_disbursement.clearance_date.as_("clearance_date"),
loan_disbursement.disbursement_date.as_("posting_date"),
loan_disbursement.applicant.as_("against_account"),
)
.where(loan_disbursement.docstatus == 1)
.where(loan_disbursement.disbursement_date >= self.from_date)
.where(loan_disbursement.disbursement_date <= self.to_date)
.where(loan_disbursement.disbursement_account.isin([self.bank_account, self.account]))
.orderby(loan_disbursement.disbursement_date)
.orderby(loan_disbursement.name, order=frappe.qb.desc)
)
if not self.include_reconciled_entries:
query = query.where(loan_disbursement.clearance_date.isnull())
loan_disbursements = query.run(as_dict=1)
loan_repayment = frappe.qb.DocType("Loan Repayment")
query = (
frappe.qb.from_(loan_repayment)
.select(
ConstantColumn("Loan Repayment").as_("payment_document"),
loan_repayment.name.as_("payment_entry"),
loan_repayment.amount_paid.as_("debit"),
ConstantColumn(0).as_("credit"),
loan_repayment.reference_number.as_("cheque_number"),
loan_repayment.reference_date.as_("cheque_date"),
loan_repayment.clearance_date.as_("clearance_date"),
loan_repayment.applicant.as_("against_account"),
loan_repayment.posting_date,
)
.where(loan_repayment.docstatus == 1)
.where(loan_repayment.posting_date >= self.from_date)
.where(loan_repayment.posting_date <= self.to_date)
.where(loan_repayment.payment_account.isin([self.bank_account, self.account]))
)
if not self.include_reconciled_entries:
query = query.where(loan_repayment.clearance_date.isnull())
if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
query = query.where((loan_repayment.repay_from_salary == 0))
query = query.orderby(loan_repayment.posting_date).orderby(
loan_repayment.name, order=frappe.qb.desc
)
loan_repayments = query.run(as_dict=True)
pos_sales_invoices, pos_purchase_invoices = [], []
if self.include_pos_transactions:
pos_sales_invoices = frappe.db.sql(
"""
select
"Sales Invoice Payment" as payment_document, sip.name as payment_entry, sip.amount as debit,
si.posting_date, si.customer as against_account, sip.clearance_date,
account.account_currency, 0 as credit
from `tabSales Invoice Payment` sip, `tabSales Invoice` si, `tabAccount` account
where
sip.account=%(account)s and si.docstatus=1 and sip.parent = si.name
and account.name = sip.account and si.posting_date >= %(from)s and si.posting_date <= %(to)s
order by
si.posting_date ASC, si.name DESC
""",
{"account": self.account, "from": self.from_date, "to": self.to_date},
as_dict=1,
)
pos_purchase_invoices = frappe.db.sql(
"""
select
"Purchase Invoice" as payment_document, pi.name as payment_entry, pi.paid_amount as credit,
pi.posting_date, pi.supplier as against_account, pi.clearance_date,
account.account_currency, 0 as debit
from `tabPurchase Invoice` pi, `tabAccount` account
where
pi.cash_bank_account=%(account)s and pi.docstatus=1 and account.name = pi.cash_bank_account
and pi.posting_date >= %(from)s and pi.posting_date <= %(to)s
order by
pi.posting_date ASC, pi.name DESC
""",
{"account": self.account, "from": self.from_date, "to": self.to_date},
as_dict=1,
# get entries from all the apps
for method_name in frappe.get_hooks("get_payment_entries_for_bank_clearance"):
entries += (
frappe.get_attr(method_name)(
self.from_date,
self.to_date,
self.account,
self.bank_account,
self.include_reconciled_entries,
self.include_pos_transactions,
)
or []
)
entries = sorted(
list(payment_entries)
+ list(journal_entries)
+ list(pos_sales_invoices)
+ list(pos_purchase_invoices)
+ list(loan_disbursements)
+ list(loan_repayments),
entries,
key=lambda k: getdate(k["posting_date"]),
)
@@ -235,3 +91,111 @@ class BankClearance(Document):
msgprint(_("Clearance Date updated"))
else:
msgprint(_("Clearance Date not mentioned"))
def get_payment_entries_for_bank_clearance(
from_date, to_date, account, bank_account, include_reconciled_entries, include_pos_transactions
):
entries = []
condition = ""
if not include_reconciled_entries:
condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')"
journal_entries = frappe.db.sql(
"""
select
"Journal Entry" as payment_document, t1.name as payment_entry,
t1.cheque_no as cheque_number, t1.cheque_date,
sum(t2.debit_in_account_currency) as debit, sum(t2.credit_in_account_currency) as credit,
t1.posting_date, t2.against_account, t1.clearance_date, t2.account_currency
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
where
t2.parent = t1.name and t2.account = %(account)s and t1.docstatus=1
and t1.posting_date >= %(from)s and t1.posting_date <= %(to)s
and ifnull(t1.is_opening, 'No') = 'No' {condition}
group by t2.account, t1.name
order by t1.posting_date ASC, t1.name DESC
""".format(
condition=condition
),
{"account": account, "from": from_date, "to": to_date},
as_dict=1,
)
if bank_account:
condition += "and bank_account = %(bank_account)s"
payment_entries = frappe.db.sql(
"""
select
"Payment Entry" as payment_document, name as payment_entry,
reference_no as cheque_number, reference_date as cheque_date,
if(paid_from=%(account)s, paid_amount + total_taxes_and_charges, 0) as credit,
if(paid_from=%(account)s, 0, received_amount) as debit,
posting_date, ifnull(party,if(paid_from=%(account)s,paid_to,paid_from)) as against_account, clearance_date,
if(paid_to=%(account)s, paid_to_account_currency, paid_from_account_currency) as account_currency
from `tabPayment Entry`
where
(paid_from=%(account)s or paid_to=%(account)s) and docstatus=1
and posting_date >= %(from)s and posting_date <= %(to)s
{condition}
order by
posting_date ASC, name DESC
""".format(
condition=condition
),
{
"account": account,
"from": from_date,
"to": to_date,
"bank_account": bank_account,
},
as_dict=1,
)
pos_sales_invoices, pos_purchase_invoices = [], []
if include_pos_transactions:
pos_sales_invoices = frappe.db.sql(
"""
select
"Sales Invoice Payment" as payment_document, sip.name as payment_entry, sip.amount as debit,
si.posting_date, si.customer as against_account, sip.clearance_date,
account.account_currency, 0 as credit
from `tabSales Invoice Payment` sip, `tabSales Invoice` si, `tabAccount` account
where
sip.account=%(account)s and si.docstatus=1 and sip.parent = si.name
and account.name = sip.account and si.posting_date >= %(from)s and si.posting_date <= %(to)s
order by
si.posting_date ASC, si.name DESC
""",
{"account": account, "from": from_date, "to": to_date},
as_dict=1,
)
pos_purchase_invoices = frappe.db.sql(
"""
select
"Purchase Invoice" as payment_document, pi.name as payment_entry, pi.paid_amount as credit,
pi.posting_date, pi.supplier as against_account, pi.clearance_date,
account.account_currency, 0 as debit
from `tabPurchase Invoice` pi, `tabAccount` account
where
pi.cash_bank_account=%(account)s and pi.docstatus=1 and account.name = pi.cash_bank_account
and pi.posting_date >= %(from)s and pi.posting_date <= %(to)s
order by
pi.posting_date ASC, pi.name DESC
""",
{"account": account, "from": from_date, "to": to_date},
as_dict=1,
)
entries = (
list(payment_entries)
+ list(journal_entries)
+ list(pos_sales_invoices)
+ list(pos_purchase_invoices)
)
return entries

View File

@@ -8,26 +8,75 @@ from frappe.utils import add_months, getdate
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.loan_management.doctype.loan.test_loan import (
create_loan,
create_loan_accounts,
create_loan_type,
create_repayment_entry,
make_loan_disbursement_entry,
)
from erpnext.tests.utils import if_lending_app_installed, if_lending_app_not_installed
class TestBankClearance(unittest.TestCase):
@classmethod
def setUpClass(cls):
clear_payment_entries()
clear_loan_transactions()
make_bank_account()
create_loan_accounts()
create_loan_masters()
add_transactions()
# Basic test case to test if bank clearance tool doesn't break
# Detailed test can be added later
@if_lending_app_not_installed
def test_bank_clearance(self):
bank_clearance = frappe.get_doc("Bank Clearance")
bank_clearance.account = "_Test Bank Clearance - _TC"
bank_clearance.from_date = add_months(getdate(), -1)
bank_clearance.to_date = getdate()
bank_clearance.get_payment_entries()
self.assertEqual(len(bank_clearance.payment_entries), 1)
@if_lending_app_installed
def test_bank_clearance_with_loan(self):
from lending.loan_management.doctype.loan.test_loan import (
create_loan,
create_loan_accounts,
create_loan_type,
create_repayment_entry,
make_loan_disbursement_entry,
)
def create_loan_masters():
create_loan_type(
"Clearance Loan",
2000000,
13.5,
25,
0,
5,
"Cash",
"_Test Bank Clearance - _TC",
"_Test Bank Clearance - _TC",
"Loan Account - _TC",
"Interest Income Account - _TC",
"Penalty Income Account - _TC",
)
def make_loan():
loan = create_loan(
"_Test Customer",
"Clearance Loan",
280000,
"Repay Over Number of Periods",
20,
applicant_type="Customer",
)
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.save()
repayment_entry.submit()
create_loan_accounts()
create_loan_masters()
make_loan()
bank_clearance = frappe.get_doc("Bank Clearance")
bank_clearance.account = "_Test Bank Clearance - _TC"
bank_clearance.from_date = add_months(getdate(), -1)
@@ -36,6 +85,19 @@ class TestBankClearance(unittest.TestCase):
self.assertEqual(len(bank_clearance.payment_entries), 3)
def clear_payment_entries():
frappe.db.delete("Payment Entry")
@if_lending_app_installed
def clear_loan_transactions():
for dt in [
"Loan Disbursement",
"Loan Repayment",
]:
frappe.db.delete(dt)
def make_bank_account():
if not frappe.db.get_value("Account", "_Test Bank Clearance - _TC"):
frappe.get_doc(
@@ -49,42 +111,8 @@ def make_bank_account():
).insert()
def create_loan_masters():
create_loan_type(
"Clearance Loan",
2000000,
13.5,
25,
0,
5,
"Cash",
"_Test Bank Clearance - _TC",
"_Test Bank Clearance - _TC",
"Loan Account - _TC",
"Interest Income Account - _TC",
"Penalty Income Account - _TC",
)
def add_transactions():
make_payment_entry()
make_loan()
def make_loan():
loan = create_loan(
"_Test Customer",
"Clearance Loan",
280000,
"Repay Over Number of Periods",
20,
applicant_type="Customer",
)
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.save()
repayment_entry.submit()
def make_payment_entry():

View File

@@ -19,7 +19,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
onload: function (frm) {
// Set default filter dates
today = frappe.datetime.get_today()
let today = frappe.datetime.get_today()
frm.doc.bank_statement_from_date = frappe.datetime.add_months(today, -1);
frm.doc.bank_statement_to_date = today;
frm.trigger('bank_account');
@@ -81,7 +81,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
frm.add_custom_button(__('Get Unreconciled Entries'), function() {
frm.trigger("make_reconciliation_tool");
});
frm.change_custom_button_type('Get Unreconciled Entries', null, 'primary');
frm.change_custom_button_type(__('Get Unreconciled Entries'), null, 'primary');
},

View File

@@ -7,9 +7,9 @@ import json
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.query_builder.custom import ConstantColumn
from frappe.utils import cint, flt
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.bank_transaction.bank_transaction import get_total_allocated_amount
from erpnext.accounts.report.bank_reconciliation_statement.bank_reconciliation_statement import (
get_amounts_not_reflected_in_system,
@@ -140,6 +140,9 @@ def create_journal_entry_bts(
second_account
)
)
company = frappe.get_value("Account", company_account, "company")
accounts = []
# Multi Currency?
accounts.append(
@@ -149,6 +152,7 @@ def create_journal_entry_bts(
"debit_in_account_currency": bank_transaction.withdrawal,
"party_type": party_type,
"party": party,
"cost_center": get_default_cost_center(company),
}
)
@@ -158,11 +162,10 @@ def create_journal_entry_bts(
"bank_account": bank_transaction.bank_account,
"credit_in_account_currency": bank_transaction.withdrawal,
"debit_in_account_currency": bank_transaction.deposit,
"cost_center": get_default_cost_center(company),
}
)
company = frappe.get_value("Account", company_account, "company")
journal_entry_dict = {
"voucher_type": entry_type,
"company": company,
@@ -415,19 +418,7 @@ def check_matching(
to_reference_date,
):
exact_match = True if "exact_match" in document_types else False
# combine all types of vouchers
subquery = get_queries(
bank_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
exact_match,
)
filters = {
"amount": transaction.unallocated_amount,
"payment_type": "Receive" if transaction.deposit > 0.0 else "Pay",
@@ -439,21 +430,29 @@ def check_matching(
matching_vouchers = []
matching_vouchers.extend(
get_loan_vouchers(bank_account, transaction, document_types, filters, exact_match)
)
for query in subquery:
# get matching vouchers from all the apps
for method_name in frappe.get_hooks("get_matching_vouchers_for_bank_reconciliation"):
matching_vouchers.extend(
frappe.db.sql(
query,
frappe.get_attr(method_name)(
bank_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
exact_match,
filters,
)
or []
)
return sorted(matching_vouchers, key=lambda x: x[0], reverse=True) if matching_vouchers else []
def get_queries(
def get_matching_vouchers_for_bank_reconciliation(
bank_account,
company,
transaction,
@@ -464,6 +463,7 @@ def get_queries(
from_reference_date,
to_reference_date,
exact_match,
filters,
):
# get queries to get matching vouchers
account_from_to = "paid_to" if transaction.deposit > 0.0 else "paid_from"
@@ -488,7 +488,17 @@ def get_queries(
or []
)
return queries
vouchers = []
for query in queries:
vouchers.extend(
frappe.db.sql(
query,
filters,
)
)
return vouchers
def get_matching_queries(
@@ -546,18 +556,6 @@ def get_matching_queries(
return queries
def get_loan_vouchers(bank_account, transaction, document_types, filters, exact_match):
vouchers = []
if transaction.withdrawal > 0.0 and "loan_disbursement" in document_types:
vouchers.extend(get_ld_matching_query(bank_account, exact_match, filters))
if transaction.deposit > 0.0 and "loan_repayment" in document_types:
vouchers.extend(get_lr_matching_query(bank_account, exact_match, filters))
return vouchers
def get_bt_matching_query(exact_match, transaction):
# get matching bank transaction query
# find bank transactions in the same bank account with opposite sign
@@ -591,85 +589,6 @@ def get_bt_matching_query(exact_match, transaction):
"""
def get_ld_matching_query(bank_account, exact_match, filters):
loan_disbursement = frappe.qb.DocType("Loan Disbursement")
matching_reference = loan_disbursement.reference_number == filters.get("reference_number")
matching_party = loan_disbursement.applicant_type == filters.get(
"party_type"
) and loan_disbursement.applicant == filters.get("party")
rank = frappe.qb.terms.Case().when(matching_reference, 1).else_(0)
rank1 = frappe.qb.terms.Case().when(matching_party, 1).else_(0)
query = (
frappe.qb.from_(loan_disbursement)
.select(
rank + rank1 + 1,
ConstantColumn("Loan Disbursement").as_("doctype"),
loan_disbursement.name,
loan_disbursement.disbursed_amount,
loan_disbursement.reference_number,
loan_disbursement.reference_date,
loan_disbursement.applicant_type,
loan_disbursement.disbursement_date,
)
.where(loan_disbursement.docstatus == 1)
.where(loan_disbursement.clearance_date.isnull())
.where(loan_disbursement.disbursement_account == bank_account)
)
if exact_match:
query.where(loan_disbursement.disbursed_amount == filters.get("amount"))
else:
query.where(loan_disbursement.disbursed_amount > 0.0)
vouchers = query.run(as_list=True)
return vouchers
def get_lr_matching_query(bank_account, exact_match, filters):
loan_repayment = frappe.qb.DocType("Loan Repayment")
matching_reference = loan_repayment.reference_number == filters.get("reference_number")
matching_party = loan_repayment.applicant_type == filters.get(
"party_type"
) and loan_repayment.applicant == filters.get("party")
rank = frappe.qb.terms.Case().when(matching_reference, 1).else_(0)
rank1 = frappe.qb.terms.Case().when(matching_party, 1).else_(0)
query = (
frappe.qb.from_(loan_repayment)
.select(
rank + rank1 + 1,
ConstantColumn("Loan Repayment").as_("doctype"),
loan_repayment.name,
loan_repayment.amount_paid,
loan_repayment.reference_number,
loan_repayment.reference_date,
loan_repayment.applicant_type,
loan_repayment.posting_date,
)
.where(loan_repayment.docstatus == 1)
.where(loan_repayment.clearance_date.isnull())
.where(loan_repayment.payment_account == bank_account)
)
if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
query = query.where((loan_repayment.repay_from_salary == 0))
if exact_match:
query.where(loan_repayment.amount_paid == filters.get("amount"))
else:
query.where(loan_repayment.amount_paid > 0.0)
vouchers = query.run()
return vouchers
def get_pe_matching_query(
exact_match,
account_from_to,

View File

@@ -53,19 +53,20 @@ class BankStatementImport(DataImport):
if "Bank Account" not in json.dumps(preview["columns"]):
frappe.throw(_("Please add the Bank Account column"))
from frappe.utils.background_jobs import is_job_queued
from frappe.utils.background_jobs import is_job_enqueued
from frappe.utils.scheduler import is_scheduler_inactive
if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name):
job_id = f"bank_statement_import::{self.name}"
if not is_job_enqueued(job_id):
enqueue(
start_import,
queue="default",
timeout=6000,
event="data_import",
job_name=self.name,
job_id=job_id,
data_import=self.name,
bank_account=self.bank_account,
import_file_path=self.import_file,

View File

@@ -0,0 +1,178 @@
from typing import Tuple, Union
import frappe
from frappe.utils import flt
from rapidfuzz import fuzz, process
class AutoMatchParty:
"""
Matches by Account/IBAN and then by Party Name/Description sequentially.
Returns when a result is obtained.
Result (if present) is of the form: (Party Type, Party,)
"""
def __init__(self, **kwargs) -> None:
self.__dict__.update(kwargs)
def get(self, key):
return self.__dict__.get(key, None)
def match(self) -> Union[Tuple, None]:
result = None
result = AutoMatchbyAccountIBAN(
bank_party_account_number=self.bank_party_account_number,
bank_party_iban=self.bank_party_iban,
deposit=self.deposit,
).match()
fuzzy_matching_enabled = frappe.db.get_single_value("Accounts Settings", "enable_fuzzy_matching")
if not result and fuzzy_matching_enabled:
result = AutoMatchbyPartyNameDescription(
bank_party_name=self.bank_party_name, description=self.description, deposit=self.deposit
).match()
return result
class AutoMatchbyAccountIBAN:
def __init__(self, **kwargs) -> None:
self.__dict__.update(kwargs)
def get(self, key):
return self.__dict__.get(key, None)
def match(self):
if not (self.bank_party_account_number or self.bank_party_iban):
return None
result = self.match_account_in_party()
return result
def match_account_in_party(self) -> Union[Tuple, None]:
"""Check if there is a IBAN/Account No. match in Customer/Supplier/Employee"""
result = None
parties = get_parties_in_order(self.deposit)
or_filters = self.get_or_filters()
for party in parties:
party_result = frappe.db.get_all(
"Bank Account", or_filters=or_filters, pluck="party", limit_page_length=1
)
if party == "Employee" and not party_result:
# Search in Bank Accounts first for Employee, and then Employee record
if "bank_account_no" in or_filters:
or_filters["bank_ac_no"] = or_filters.pop("bank_account_no")
party_result = frappe.db.get_all(
party, or_filters=or_filters, pluck="name", limit_page_length=1
)
if party_result:
result = (
party,
party_result[0],
)
break
return result
def get_or_filters(self) -> dict:
or_filters = {}
if self.bank_party_account_number:
or_filters["bank_account_no"] = self.bank_party_account_number
if self.bank_party_iban:
or_filters["iban"] = self.bank_party_iban
return or_filters
class AutoMatchbyPartyNameDescription:
def __init__(self, **kwargs) -> None:
self.__dict__.update(kwargs)
def get(self, key):
return self.__dict__.get(key, None)
def match(self) -> Union[Tuple, None]:
# fuzzy search by customer/supplier & employee
if not (self.bank_party_name or self.description):
return None
result = self.match_party_name_desc_in_party()
return result
def match_party_name_desc_in_party(self) -> Union[Tuple, None]:
"""Fuzzy search party name and/or description against parties in the system"""
result = None
parties = get_parties_in_order(self.deposit)
for party in parties:
filters = {"status": "Active"} if party == "Employee" else {"disabled": 0}
names = frappe.get_all(party, filters=filters, pluck=party.lower() + "_name")
for field in ["bank_party_name", "description"]:
if not self.get(field):
continue
result, skip = self.fuzzy_search_and_return_result(party, names, field)
if result or skip:
break
if result or skip:
# Skip If: It was hard to distinguish between close matches and so match is None
# OR if the right match was found
break
return result
def fuzzy_search_and_return_result(self, party, names, field) -> Union[Tuple, None]:
skip = False
result = process.extract(query=self.get(field), choices=names, scorer=fuzz.token_set_ratio)
party_name, skip = self.process_fuzzy_result(result)
if not party_name:
return None, skip
return (
party,
party_name,
), skip
def process_fuzzy_result(self, result: Union[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.
Returns: Result, Skip (whether or not to discontinue matching)
"""
PARTY, SCORE, CUTOFF = 0, 1, 80
if not result or not len(result):
return None, False
first_result = result[0]
if len(result) == 1:
return (first_result[PARTY] if first_result[SCORE] > CUTOFF else None), True
second_result = result[1]
if first_result[SCORE] > CUTOFF:
# If multiple matches with the same score, return None but discontinue matching
# Matches were found but were too close to distinguish between
if first_result[SCORE] == second_result[SCORE]:
return None, True
return first_result[PARTY], True
else:
return None, False
def get_parties_in_order(deposit: float) -> list:
parties = ["Supplier", "Employee", "Customer"] # most -> least likely to receive
if flt(deposit) > 0:
parties = ["Customer", "Supplier", "Employee"] # most -> least likely to pay
return parties

View File

@@ -33,7 +33,11 @@
"unallocated_amount",
"party_section",
"party_type",
"party"
"party",
"column_break_3czf",
"bank_party_name",
"bank_party_account_number",
"bank_party_iban"
],
"fields": [
{
@@ -63,7 +67,7 @@
"fieldtype": "Select",
"in_standard_filter": 1,
"label": "Status",
"options": "\nPending\nSettled\nUnreconciled\nReconciled"
"options": "\nPending\nSettled\nUnreconciled\nReconciled\nCancelled"
},
{
"fieldname": "bank_account",
@@ -202,11 +206,30 @@
"fieldtype": "Data",
"label": "Transaction Type",
"length": 50
},
{
"fieldname": "column_break_3czf",
"fieldtype": "Column Break"
},
{
"fieldname": "bank_party_name",
"fieldtype": "Data",
"label": "Party Name/Account Holder (Bank Statement)"
},
{
"fieldname": "bank_party_iban",
"fieldtype": "Data",
"label": "Party IBAN (Bank Statement)"
},
{
"fieldname": "bank_party_account_number",
"fieldtype": "Data",
"label": "Party Account No. (Bank Statement)"
}
],
"is_submittable": 1,
"links": [],
"modified": "2022-05-29 18:36:50.475964",
"modified": "2023-06-06 13:58:12.821411",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction",
@@ -260,4 +283,4 @@
"states": [],
"title_field": "bank_account",
"track_changes": 1
}
}

View File

@@ -15,6 +15,9 @@ class BankTransaction(StatusUpdater):
self.clear_linked_payment_entries()
self.set_status()
if frappe.db.get_single_value("Accounts Settings", "enable_party_matching"):
self.auto_set_party()
_saving_flag = False
# nosemgrep: frappe-semgrep-rules.rules.frappe-modifying-but-not-comitting
@@ -146,6 +149,26 @@ class BankTransaction(StatusUpdater):
payment_entry.payment_document, payment_entry.payment_entry, clearance_date, self
)
def auto_set_party(self):
from erpnext.accounts.doctype.bank_transaction.auto_match_party import AutoMatchParty
if self.party_type and self.party:
return
result = AutoMatchParty(
bank_party_account_number=self.bank_party_account_number,
bank_party_iban=self.bank_party_iban,
bank_party_name=self.bank_party_name,
description=self.description,
deposit=self.deposit,
).match()
if result:
party_type, party = result
frappe.db.set_value(
"Bank Transaction", self.name, field={"party_type": party_type, "party": party}
)
@frappe.whitelist()
def get_doctypes_for_bank_reconciliation():
@@ -281,10 +304,13 @@ def get_paid_amount(payment_entry, currency, gl_bank_account):
)
elif payment_entry.payment_document == "Journal Entry":
return frappe.db.get_value(
"Journal Entry Account",
{"parent": payment_entry.payment_entry, "account": gl_bank_account},
"sum(credit_in_account_currency)",
return abs(
frappe.db.get_value(
"Journal Entry Account",
{"parent": payment_entry.payment_entry, "account": gl_bank_account},
"sum(debit_in_account_currency-credit_in_account_currency)",
)
or 0
)
elif payment_entry.payment_document == "Expense Claim":
@@ -317,14 +343,7 @@ def get_paid_amount(payment_entry, currency, gl_bank_account):
def set_voucher_clearance(doctype, docname, clearance_date, self):
if doctype in [
"Payment Entry",
"Journal Entry",
"Purchase Invoice",
"Expense Claim",
"Loan Repayment",
"Loan Disbursement",
]:
if doctype in get_doctypes_for_bank_reconciliation():
if (
doctype == "Payment Entry"
and frappe.db.get_value("Payment Entry", docname, "payment_type") == "Internal Transfer"

View File

@@ -0,0 +1,151 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import nowdate
from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import create_bank_account
class TestAutoMatchParty(FrappeTestCase):
@classmethod
def setUpClass(cls):
create_bank_account()
frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 1)
frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 1)
return super().setUpClass()
@classmethod
def tearDownClass(cls):
frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 0)
frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 0)
def test_match_by_account_number(self):
create_supplier_for_match(account_no="000000003716541159")
doc = create_bank_transaction(
withdrawal=1200,
transaction_id="562213b0ca1bf838dab8f2c6a39bbc3b",
account_no="000000003716541159",
iban="DE02000000003716541159",
)
self.assertEqual(doc.party_type, "Supplier")
self.assertEqual(doc.party, "John Doe & Co.")
def test_match_by_iban(self):
create_supplier_for_match(iban="DE02000000003716541159")
doc = create_bank_transaction(
withdrawal=1200,
transaction_id="c5455a224602afaa51592a9d9250600d",
account_no="000000003716541159",
iban="DE02000000003716541159",
)
self.assertEqual(doc.party_type, "Supplier")
self.assertEqual(doc.party, "John Doe & Co.")
def test_match_by_party_name(self):
create_supplier_for_match(supplier_name="Jackson Ella W.")
doc = create_bank_transaction(
withdrawal=1200,
transaction_id="1f6f661f347ff7b1ea588665f473adb1",
party_name="Ella Jackson",
iban="DE04000000003716545346",
)
self.assertEqual(doc.party_type, "Supplier")
self.assertEqual(doc.party, "Jackson Ella W.")
def test_match_by_description(self):
create_supplier_for_match(supplier_name="Microsoft")
doc = create_bank_transaction(
description="Auftraggeber: microsoft payments Buchungstext: msft ..e3006b5hdy. ref. j375979555927627/5536",
withdrawal=1200,
transaction_id="8df880a2d09c3bed3fea358ca5168c5a",
party_name="",
)
self.assertEqual(doc.party_type, "Supplier")
self.assertEqual(doc.party, "Microsoft")
def test_skip_match_if_multiple_close_results(self):
create_supplier_for_match(supplier_name="Adithya Medical & General Stores")
create_supplier_for_match(supplier_name="Adithya Medical And General Stores")
doc = create_bank_transaction(
description="Paracetamol Consignment, SINV-0009",
withdrawal=24.85,
transaction_id="3a1da4ee2dc5a980138d56ef3460cbd9",
party_name="Adithya Medical & General",
)
# Mapping is skipped as both Supplier names have the same match score
self.assertEqual(doc.party_type, None)
self.assertEqual(doc.party, None)
def create_supplier_for_match(supplier_name="John Doe & Co.", iban=None, account_no=None):
if frappe.db.exists("Supplier", {"supplier_name": supplier_name}):
# Update related Bank Account details
if not (iban or account_no):
return
frappe.db.set_value(
dt="Bank Account",
dn={"party": supplier_name},
field={"iban": iban, "bank_account_no": account_no},
)
return
# Create Supplier and Bank Account for the same
supplier = frappe.new_doc("Supplier")
supplier.supplier_name = supplier_name
supplier.supplier_group = "Services"
supplier.supplier_type = "Company"
supplier.insert()
if not frappe.db.exists("Bank", "TestBank"):
bank = frappe.new_doc("Bank")
bank.bank_name = "TestBank"
bank.insert(ignore_if_duplicate=True)
if not frappe.db.exists("Bank Account", supplier.name + " - " + "TestBank"):
bank_account = frappe.new_doc("Bank Account")
bank_account.account_name = supplier.name
bank_account.bank = "TestBank"
bank_account.iban = iban
bank_account.bank_account_no = account_no
bank_account.party_type = "Supplier"
bank_account.party = supplier.name
bank_account.insert()
def create_bank_transaction(
description=None,
withdrawal=0,
deposit=0,
transaction_id=None,
party_name=None,
account_no=None,
iban=None,
):
doc = frappe.new_doc("Bank Transaction")
doc.update(
{
"doctype": "Bank Transaction",
"description": description or "1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G",
"date": nowdate(),
"withdrawal": withdrawal,
"deposit": deposit,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank",
"transaction_id": transaction_id,
"bank_party_name": party_name,
"bank_party_account_number": account_no,
"bank_party_iban": iban,
}
)
doc.insert()
doc.submit()
doc.reload()
return doc

View File

@@ -16,6 +16,7 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_paymen
from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.tests.utils import if_lending_app_installed
test_dependencies = ["Item", "Cost Center"]
@@ -23,14 +24,13 @@ test_dependencies = ["Item", "Cost Center"]
class TestBankTransaction(FrappeTestCase):
def setUp(self):
for dt in [
"Loan Repayment",
"Bank Transaction",
"Payment Entry",
"Payment Entry Reference",
"POS Profile",
]:
frappe.db.delete(dt)
clear_loan_transactions()
make_pos_profile()
add_transactions()
add_vouchers()
@@ -160,8 +160,9 @@ class TestBankTransaction(FrappeTestCase):
is not None
)
@if_lending_app_installed
def test_matching_loan_repayment(self):
from erpnext.loan_management.doctype.loan.test_loan import create_loan_accounts
from lending.loan_management.doctype.loan.test_loan import create_loan_accounts
create_loan_accounts()
bank_account = frappe.get_doc(
@@ -190,6 +191,11 @@ class TestBankTransaction(FrappeTestCase):
self.assertEqual(linked_payments[0][2], repayment_entry.name)
@if_lending_app_installed
def clear_loan_transactions():
frappe.db.delete("Loan Repayment")
def create_bank_account(bank_name="Citi Bank", account_name="_Test Bank - _TC"):
try:
frappe.get_doc(
@@ -400,16 +406,18 @@ def add_vouchers():
si.submit()
@if_lending_app_installed
def create_loan_and_repayment():
from erpnext.loan_management.doctype.loan.test_loan import (
from lending.loan_management.doctype.loan.test_loan import (
create_loan,
create_loan_type,
create_repayment_entry,
make_loan_disbursement_entry,
)
from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import (
from lending.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import (
process_loan_interest_accrual_for_term_loans,
)
from erpnext.setup.doctype.employee.test_employee import make_employee
create_loan_type(

View File

@@ -125,14 +125,27 @@ def validate_expense_against_budget(args, expense_amount=0):
if not args.account:
return
for budget_against in ["project", "cost_center"] + get_accounting_dimensions():
default_dimensions = [
{
"fieldname": "project",
"document_type": "Project",
},
{
"fieldname": "cost_center",
"document_type": "Cost Center",
},
]
for dimension in default_dimensions + get_accounting_dimensions(as_list=False):
budget_against = dimension.get("fieldname")
if (
args.get(budget_against)
and args.account
and frappe.db.get_value("Account", {"name": args.account, "root_type": "Expense"})
):
doctype = frappe.unscrub(budget_against)
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"])

View File

@@ -1,6 +0,0 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Cash Flow Mapper', {
});

View File

@@ -1,275 +0,0 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 1,
"autoname": "field:section_name",
"beta": 0,
"creation": "2018-02-08 10:00:14.066519",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_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": "Section 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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_header",
"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": "Section Header",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "e.g Adjustments for:",
"fieldname": "section_leader",
"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": "Section Leader",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_subtotal",
"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": "Section Subtotal",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_footer",
"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": "Section Footer",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "accounts",
"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": "Accounts",
"length": 0,
"no_copy": 0,
"options": "Cash Flow Mapping Template Details",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "position",
"fieldtype": "Int",
"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": "Position",
"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,
"unique": 0
}
],
"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-02-15 18:28:55.034933",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cash Flow Mapper",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"apply_user_permissions": 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": "System Manager",
"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": "name",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

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

View File

@@ -1,25 +0,0 @@
DEFAULT_MAPPERS = [
{
"doctype": "Cash Flow Mapper",
"section_footer": "Net cash generated by operating activities",
"section_header": "Cash flows from operating activities",
"section_leader": "Adjustments for",
"section_name": "Operating Activities",
"position": 0,
"section_subtotal": "Cash generated from operations",
},
{
"doctype": "Cash Flow Mapper",
"position": 1,
"section_footer": "Net cash used in investing activities",
"section_header": "Cash flows from investing activities",
"section_name": "Investing Activities",
},
{
"doctype": "Cash Flow Mapper",
"position": 2,
"section_footer": "Net cash used in financing activites",
"section_header": "Cash flows from financing activities",
"section_name": "Financing Activities",
},
]

View File

@@ -1,8 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
class TestCashFlowMapper(unittest.TestCase):
pass

View File

@@ -1,43 +0,0 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Cash Flow Mapping', {
refresh: function(frm) {
frm.events.disable_unchecked_fields(frm);
},
reset_check_fields: function(frm) {
frm.fields.filter(field => field.df.fieldtype === 'Check')
.map(field => frm.set_df_property(field.df.fieldname, 'read_only', 0));
},
has_checked_field(frm) {
const val = frm.fields.filter(field => field.value === 1);
return val.length ? 1 : 0;
},
_disable_unchecked_fields: function(frm) {
// get value of clicked field
frm.fields.filter(field => field.value === 0)
.map(field => frm.set_df_property(field.df.fieldname, 'read_only', 1));
},
disable_unchecked_fields: function(frm) {
frm.events.reset_check_fields(frm);
const checked = frm.events.has_checked_field(frm);
if (checked) {
frm.events._disable_unchecked_fields(frm);
}
},
is_working_capital: function(frm) {
frm.events.disable_unchecked_fields(frm);
},
is_finance_cost: function(frm) {
frm.events.disable_unchecked_fields(frm);
},
is_income_tax_liability: function(frm) {
frm.events.disable_unchecked_fields(frm);
},
is_income_tax_expense: function(frm) {
frm.events.disable_unchecked_fields(frm);
},
is_finance_cost_adjustment: function(frm) {
frm.events.disable_unchecked_fields(frm);
}
});

View File

@@ -1,359 +0,0 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 1,
"autoname": "field:mapping_name",
"beta": 0,
"creation": "2018-02-08 09:28:44.678364",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "mapping_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": "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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "label",
"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": "Label",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "accounts",
"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": "Accounts",
"length": 0,
"no_copy": 0,
"options": "Cash Flow Mapping Accounts",
"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
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sb_1",
"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,
"label": "Select Maximum Of 1",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "is_finance_cost",
"fieldtype": "Check",
"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": "Is Finance Cost",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "is_working_capital",
"fieldtype": "Check",
"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": "Is Working Capital",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "is_finance_cost_adjustment",
"fieldtype": "Check",
"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": "Is Finance Cost Adjustment",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "is_income_tax_liability",
"fieldtype": "Check",
"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": "Is Income Tax Liability",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"fieldname": "is_income_tax_expense",
"fieldtype": "Check",
"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": "Is Income Tax Expense",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
}
],
"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-02-15 08:25:18.693533",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cash Flow Mapping",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"apply_user_permissions": 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,
"apply_user_permissions": 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": "Administrator",
"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": "name",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

@@ -1,22 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _
from frappe.model.document import Document
class CashFlowMapping(Document):
def validate(self):
self.validate_checked_options()
def validate_checked_options(self):
checked_fields = [
d for d in self.meta.fields if d.fieldtype == "Check" and self.get(d.fieldname) == 1
]
if len(checked_fields) > 1:
frappe.throw(
_("You can only select a maximum of one option from the list of check boxes."),
title=_("Error"),
)

View File

@@ -1,28 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
import frappe
class TestCashFlowMapping(unittest.TestCase):
def setUp(self):
if frappe.db.exists("Cash Flow Mapping", "Test Mapping"):
frappe.delete_doc("Cash Flow Mappping", "Test Mapping")
def tearDown(self):
frappe.delete_doc("Cash Flow Mapping", "Test Mapping")
def test_multiple_selections_not_allowed(self):
doc = frappe.new_doc("Cash Flow Mapping")
doc.mapping_name = "Test Mapping"
doc.label = "Test label"
doc.append("accounts", {"account": "Accounts Receivable - _TC"})
doc.is_working_capital = 1
doc.is_finance_cost = 1
self.assertRaises(frappe.ValidationError, doc.insert)
doc.is_finance_cost = 0
doc.insert()

View File

@@ -1,73 +0,0 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "field:account",
"beta": 0,
"creation": "2018-02-08 09:25:34.353995",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"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_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"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
}
],
"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-02-08 09:25:34.353995",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cash Flow Mapping Accounts",
"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_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

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

View File

@@ -1,6 +0,0 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Cash Flow Mapping Template', {
});

View File

@@ -1,123 +0,0 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2018-02-08 10:20:18.316801",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "template_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": "Template 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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "mapping",
"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": "Cash Flow Mapping",
"length": 0,
"no_copy": 0,
"options": "Cash Flow Mapping Template Details",
"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
}
],
"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-02-08 10:20:18.316801",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cash Flow Mapping Template",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"apply_user_permissions": 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
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

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

View File

@@ -1,8 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
class TestCashFlowMappingTemplate(unittest.TestCase):
pass

View File

@@ -1,6 +0,0 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Cash Flow Mapping Template Details', {
});

View File

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

View File

@@ -1,8 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
class TestCashFlowMappingTemplateDetails(unittest.TestCase):
pass

View File

@@ -70,7 +70,7 @@ frappe.ui.form.on('Cost Center', {
}
],
primary_action: function() {
var data = d.get_values();
let data = d.get_values();
if(data.cost_center_name === frm.doc.cost_center_name && data.cost_center_number === frm.doc.cost_center_number) {
d.hide();
return;
@@ -91,8 +91,8 @@ frappe.ui.form.on('Cost Center', {
if(r.message) {
frappe.set_route("Form", "Cost Center", r.message);
} else {
me.frm.set_value("cost_center_name", data.cost_center_name);
me.frm.set_value("cost_center_number", data.cost_center_number);
frm.set_value("cost_center_name", data.cost_center_name);
frm.set_value("cost_center_number", data.cost_center_number);
}
d.hide();
}

View File

@@ -1,13 +1,14 @@
// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on("Dunning", {
setup: function (frm) {
frm.set_query("sales_invoice", () => {
frm.set_query("sales_invoice", "overdue_payments", () => {
return {
filters: {
docstatus: 1,
company: frm.doc.company,
customer: frm.doc.customer,
outstanding_amount: [">", 0],
status: "Overdue"
},
@@ -22,14 +23,24 @@ frappe.ui.form.on("Dunning", {
}
};
});
frm.set_query("cost_center", () => {
return {
filters: {
company: frm.doc.company,
is_group: 0
}
};
});
frm.set_query("contact_person", erpnext.queries.contact_query);
frm.set_query("customer_address", erpnext.queries.address_query);
frm.set_query("company_address", erpnext.queries.company_address_query);
// cannot add rows manually, only via button "Fetch Overdue Payments"
frm.set_df_property("overdue_payments", "cannot_add_rows", true);
},
refresh: function (frm) {
frm.set_df_property("company", "read_only", frm.doc.__islocal ? 0 : 1);
frm.set_df_property(
"sales_invoice",
"read_only",
frm.doc.__islocal ? 0 : 1
);
if (frm.doc.docstatus === 1 && frm.doc.status === "Unresolved") {
frm.add_custom_button(__("Resolve"), () => {
frm.set_value("status", "Resolved");
@@ -40,42 +51,111 @@ frappe.ui.form.on("Dunning", {
__("Payment"),
function () {
frm.events.make_payment_entry(frm);
},__("Create")
}, __("Create")
);
frm.page.set_inner_btn_group_as_primary(__("Create"));
}
if(frm.doc.docstatus > 0) {
frm.add_custom_button(__('Ledger'), function() {
frappe.route_options = {
"voucher_no": frm.doc.name,
"from_date": frm.doc.posting_date,
"to_date": frm.doc.posting_date,
"company": frm.doc.company,
"show_cancelled_entries": frm.doc.docstatus === 2
};
frappe.set_route("query-report", "General Ledger");
}, __('View'));
if (frm.doc.docstatus === 0) {
frm.add_custom_button(__("Fetch Overdue Payments"), () => {
erpnext.utils.map_current_doc({
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.create_dunning",
source_doctype: "Sales Invoice",
date_field: "due_date",
target: frm,
setters: {
customer: frm.doc.customer || undefined,
},
get_query_filters: {
docstatus: 1,
status: "Overdue",
company: frm.doc.company
},
allow_child_item_selection: true,
child_fieldname: "payment_schedule",
child_columns: ["due_date", "outstanding"],
});
});
}
frappe.dynamic_link = { doc: frm.doc, fieldname: 'customer', doctype: 'Customer' };
frm.toggle_display("customer_name", (frm.doc.customer_name && frm.doc.customer_name !== frm.doc.customer));
},
overdue_days: function (frm) {
frappe.db.get_value(
"Dunning Type",
{
start_day: ["<", frm.doc.overdue_days],
end_day: [">=", frm.doc.overdue_days],
},
"dunning_type",
(r) => {
if (r) {
frm.set_value("dunning_type", r.dunning_type);
} else {
frm.set_value("dunning_type", "");
frm.set_value("rate_of_interest", "");
frm.set_value("dunning_fee", "");
// When multiple companies are set up. in case company name is changed set default company address
company: function (frm) {
if (frm.doc.company) {
frappe.call({
method: "erpnext.setup.doctype.company.company.get_default_company_address",
args: { name: frm.doc.company, existing_address: frm.doc.company_address || "" },
debounce: 2000,
callback: function (r) {
frm.set_value("company_address", r && r.message || "");
}
});
if (frm.fields_dict.currency) {
const company_currency = erpnext.get_currency(frm.doc.company);
if (!frm.doc.currency) {
frm.set_value("currency", company_currency);
}
if (frm.doc.currency == company_currency) {
frm.set_value("conversion_rate", 1.0);
}
}
);
const company_doc = frappe.get_doc(":Company", frm.doc.company);
if (company_doc.default_letter_head) {
if (frm.fields_dict.letter_head) {
frm.set_value("letter_head", company_doc.default_letter_head);
}
}
}
},
currency: function (frm) {
// this.set_dynamic_labels();
const company_currency = erpnext.get_currency(frm.doc.company);
// Added `ignore_pricing_rule` to determine if document is loading after mapping from another doc
if (frm.doc.currency && frm.doc.currency !== company_currency) {
frappe.call({
method: "erpnext.setup.utils.get_exchange_rate",
args: {
transaction_date: frm.doc.posting_date,
from_currency: frm.doc.currency,
to_currency: company_currency,
args: "for_selling"
},
freeze: true,
freeze_message: __("Fetching exchange rates ..."),
callback: function(r) {
const exchange_rate = flt(r.message);
if (exchange_rate != frm.doc.conversion_rate) {
frm.set_value("conversion_rate", exchange_rate);
}
}
});
} else {
frm.trigger("conversion_rate");
}
},
customer: (frm) => {
erpnext.utils.get_party_details(frm);
},
conversion_rate: function (frm) {
if (frm.doc.currency === erpnext.get_currency(frm.doc.company)) {
frm.set_value("conversion_rate", 1.0);
}
// Make read only if Accounts Settings doesn't allow stale rates
frm.set_df_property("conversion_rate", "read_only", erpnext.stale_rate_allowed() ? 0 : 1);
},
customer_address: function (frm) {
erpnext.utils.get_address_display(frm, "customer_address");
},
company_address: function (frm) {
erpnext.utils.get_address_display(frm, "company_address");
},
dunning_type: function (frm) {
frm.trigger("get_dunning_letter_text");
@@ -87,7 +167,7 @@ frappe.ui.form.on("Dunning", {
if (frm.doc.dunning_type) {
frappe.call({
method:
"erpnext.accounts.doctype.dunning.dunning.get_dunning_letter_text",
"erpnext.accounts.doctype.dunning.dunning.get_dunning_letter_text",
args: {
dunning_type: frm.doc.dunning_type,
language: frm.doc.language,
@@ -106,49 +186,62 @@ frappe.ui.form.on("Dunning", {
});
}
},
due_date: function (frm) {
frm.trigger("calculate_overdue_days");
},
posting_date: function (frm) {
frm.trigger("calculate_overdue_days");
},
rate_of_interest: function (frm) {
frm.trigger("calculate_interest_and_amount");
},
outstanding_amount: function (frm) {
frm.trigger("calculate_interest_and_amount");
},
interest_amount: function (frm) {
frm.trigger("calculate_interest_and_amount");
frm.trigger("calculate_interest");
},
dunning_fee: function (frm) {
frm.trigger("calculate_interest_and_amount");
frm.trigger("calculate_totals");
},
sales_invoice: function (frm) {
frm.trigger("calculate_overdue_days");
overdue_payments_add: function (frm) {
frm.trigger("calculate_totals");
},
overdue_payments_remove: function (frm) {
frm.trigger("calculate_totals");
},
calculate_overdue_days: function (frm) {
if (frm.doc.posting_date && frm.doc.due_date) {
const overdue_days = moment(frm.doc.posting_date).diff(
frm.doc.due_date,
"days"
);
frm.set_value("overdue_days", overdue_days);
}
frm.doc.overdue_payments.forEach((row) => {
if (frm.doc.posting_date && row.due_date) {
const overdue_days = moment(frm.doc.posting_date).diff(
row.due_date,
"days"
);
frappe.model.set_value(row.doctype, row.name, "overdue_days", overdue_days);
}
});
},
calculate_interest_and_amount: function (frm) {
const interest_per_year = frm.doc.outstanding_amount * frm.doc.rate_of_interest / 100;
const interest_amount = flt((interest_per_year * cint(frm.doc.overdue_days)) / 365 || 0, precision('interest_amount'));
const dunning_amount = flt(interest_amount + frm.doc.dunning_fee, precision('dunning_amount'));
const grand_total = flt(frm.doc.outstanding_amount + dunning_amount, precision('grand_total'));
frm.set_value("interest_amount", interest_amount);
frm.set_value("dunning_amount", dunning_amount);
frm.set_value("grand_total", grand_total);
calculate_interest: function (frm) {
frm.doc.overdue_payments.forEach((row) => {
const interest_per_day = frm.doc.rate_of_interest / 100 / 365;
const interest = flt((interest_per_day * row.overdue_days * row.outstanding), precision("interest", row));
frappe.model.set_value(row.doctype, row.name, "interest", interest);
});
},
calculate_totals: function (frm) {
const total_interest = frm.doc.overdue_payments
.reduce((prev, cur) => prev + cur.interest, 0);
const total_outstanding = frm.doc.overdue_payments
.reduce((prev, cur) => prev + cur.outstanding, 0);
const dunning_amount = total_interest + frm.doc.dunning_fee;
const base_dunning_amount = dunning_amount * frm.doc.conversion_rate;
const grand_total = total_outstanding + dunning_amount;
function setWithPrecison(field, value) {
frm.set_value(field, flt(value, precision(field)));
}
setWithPrecison("total_outstanding", total_outstanding);
setWithPrecison("total_interest", total_interest);
setWithPrecison("dunning_amount", dunning_amount);
setWithPrecison("base_dunning_amount", base_dunning_amount);
setWithPrecison("grand_total", grand_total);
},
make_payment_entry: function (frm) {
return frappe.call({
method:
"erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry",
"erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry",
args: {
dt: frm.doc.doctype,
dn: frm.doc.name,
@@ -160,3 +253,9 @@ frappe.ui.form.on("Dunning", {
});
},
});
frappe.ui.form.on("Overdue Payment", {
interest: function (frm) {
frm.trigger("calculate_totals");
}
});

View File

@@ -2,49 +2,60 @@
"actions": [],
"allow_events_in_timeline": 1,
"autoname": "naming_series:",
"beta": 1,
"creation": "2019-07-05 16:34:31.013238",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"title",
"naming_series",
"sales_invoice",
"customer",
"customer_name",
"outstanding_amount",
"currency",
"conversion_rate",
"column_break_3",
"company",
"posting_date",
"posting_time",
"due_date",
"overdue_days",
"status",
"section_break_9",
"currency",
"column_break_11",
"conversion_rate",
"address_and_contact_section",
"customer_address",
"address_display",
"contact_person",
"contact_display",
"column_break_16",
"company_address",
"company_address_display",
"contact_mobile",
"contact_email",
"column_break_18",
"company_address_display",
"section_break_6",
"dunning_type",
"dunning_fee",
"column_break_8",
"rate_of_interest",
"interest_amount",
"section_break_12",
"dunning_amount",
"grand_total",
"income_account",
"overdue_payments",
"section_break_28",
"total_interest",
"dunning_fee",
"column_break_17",
"status",
"printing_setting_section",
"dunning_amount",
"base_dunning_amount",
"section_break_32",
"spacer",
"column_break_33",
"total_outstanding",
"grand_total",
"printing_settings_section",
"language",
"body_text",
"column_break_22",
"letter_head",
"closing_text",
"accounting_details_section",
"income_account",
"column_break_48",
"cost_center",
"amended_from"
],
"fields": [
@@ -60,32 +71,17 @@
"fieldname": "naming_series",
"fieldtype": "Select",
"label": "Series",
"options": "DUNN-.MM.-.YY.-"
"options": "DUNN-.MM.-.YY.-",
"print_hide": 1
},
{
"fieldname": "sales_invoice",
"fieldtype": "Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Sales Invoice",
"options": "Sales Invoice",
"reqd": 1
},
{
"fetch_from": "sales_invoice.customer_name",
"fetch_from": "customer.customer_name",
"fieldname": "customer_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Customer Name",
"read_only": 1
},
{
"fetch_from": "sales_invoice.outstanding_amount",
"fieldname": "outstanding_amount",
"fieldtype": "Currency",
"label": "Outstanding Amount",
"read_only": 1
},
{
"fieldname": "column_break_3",
"fieldtype": "Column Break"
@@ -94,13 +90,8 @@
"default": "Today",
"fieldname": "posting_date",
"fieldtype": "Date",
"label": "Date"
},
{
"fieldname": "overdue_days",
"fieldtype": "Int",
"label": "Overdue Days",
"read_only": 1
"label": "Date",
"reqd": 1
},
{
"fieldname": "section_break_6",
@@ -112,16 +103,7 @@
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Dunning Type",
"options": "Dunning Type",
"reqd": 1
},
{
"default": "0",
"fieldname": "interest_amount",
"fieldtype": "Currency",
"label": "Interest Amount",
"precision": "2",
"read_only": 1
"options": "Dunning Type"
},
{
"fieldname": "column_break_8",
@@ -134,6 +116,7 @@
"fieldname": "dunning_fee",
"fieldtype": "Currency",
"label": "Dunning Fee",
"options": "currency",
"precision": "2"
},
{
@@ -144,36 +127,24 @@
"fieldname": "column_break_17",
"fieldtype": "Column Break"
},
{
"fieldname": "printing_setting_section",
"fieldtype": "Section Break",
"label": "Printing Setting"
},
{
"fieldname": "language",
"fieldtype": "Link",
"label": "Print Language",
"options": "Language"
"options": "Language",
"print_hide": 1
},
{
"fieldname": "letter_head",
"fieldtype": "Link",
"label": "Letter Head",
"options": "Letter Head"
"options": "Letter Head",
"print_hide": 1
},
{
"fieldname": "column_break_22",
"fieldtype": "Column Break"
},
{
"fetch_from": "sales_invoice.currency",
"fieldname": "currency",
"fieldtype": "Link",
"hidden": 1,
"label": "Currency",
"options": "Currency",
"read_only": 1
},
{
"fieldname": "amended_from",
"fieldtype": "Link",
@@ -183,14 +154,6 @@
"print_hide": 1,
"read_only": 1
},
{
"allow_on_submit": 1,
"default": "{customer_name}",
"fieldname": "title",
"fieldtype": "Data",
"hidden": 1,
"label": "Title"
},
{
"fieldname": "body_text",
"fieldtype": "Text Editor",
@@ -201,13 +164,6 @@
"fieldtype": "Text Editor",
"label": "Closing Text"
},
{
"fetch_from": "sales_invoice.due_date",
"fieldname": "due_date",
"fieldtype": "Date",
"label": "Due Date",
"read_only": 1
},
{
"fieldname": "posting_time",
"fieldtype": "Time",
@@ -222,44 +178,37 @@
"label": "Rate of Interest (%) Yearly"
},
{
"collapsible": 1,
"fieldname": "address_and_contact_section",
"fieldtype": "Section Break",
"label": "Address and Contact"
},
{
"fetch_from": "sales_invoice.address_display",
"fieldname": "address_display",
"fieldtype": "Small Text",
"label": "Address",
"read_only": 1
},
{
"fetch_from": "sales_invoice.contact_display",
"fieldname": "contact_display",
"fieldtype": "Small Text",
"label": "Contact",
"read_only": 1
},
{
"fetch_from": "sales_invoice.contact_mobile",
"fieldname": "contact_mobile",
"fieldtype": "Small Text",
"label": "Mobile No",
"options": "Phone",
"read_only": 1
},
{
"fieldname": "column_break_18",
"fieldtype": "Column Break"
},
{
"fetch_from": "sales_invoice.company_address_display",
"fieldname": "company_address_display",
"fieldtype": "Small Text",
"label": "Company Address",
"label": "Company Address Display",
"read_only": 1
},
{
"fetch_from": "sales_invoice.contact_email",
"fieldname": "contact_email",
"fieldtype": "Data",
"label": "Contact Email",
@@ -267,18 +216,18 @@
"read_only": 1
},
{
"fetch_from": "sales_invoice.customer",
"fieldname": "customer",
"fieldtype": "Link",
"label": "Customer",
"options": "Customer",
"read_only": 1
"reqd": 1
},
{
"default": "0",
"fieldname": "grand_total",
"fieldtype": "Currency",
"label": "Grand Total",
"options": "currency",
"precision": "2",
"read_only": 1
},
@@ -289,36 +238,154 @@
"fieldtype": "Select",
"in_standard_filter": 1,
"label": "Status",
"options": "Draft\nResolved\nUnresolved\nCancelled"
},
{
"fieldname": "dunning_amount",
"fieldtype": "Currency",
"hidden": 1,
"label": "Dunning Amount",
"options": "Draft\nResolved\nUnresolved\nCancelled",
"read_only": 1
},
{
"description": "For dunning fee and interest",
"fetch_from": "dunning_type.income_account",
"fieldname": "income_account",
"fieldtype": "Link",
"label": "Income Account",
"options": "Account"
"options": "Account",
"print_hide": 1
},
{
"fieldname": "overdue_payments",
"fieldtype": "Table",
"label": "Overdue Payments",
"options": "Overdue Payment"
},
{
"fieldname": "section_break_28",
"fieldtype": "Section Break"
},
{
"default": "0",
"fieldname": "total_interest",
"fieldtype": "Currency",
"label": "Total Interest",
"options": "currency",
"precision": "2",
"read_only": 1
},
{
"fieldname": "total_outstanding",
"fieldtype": "Currency",
"label": "Total Outstanding",
"options": "currency",
"read_only": 1
},
{
"fieldname": "customer_address",
"fieldtype": "Link",
"label": "Customer Address",
"options": "Address",
"print_hide": 1
},
{
"fieldname": "contact_person",
"fieldtype": "Link",
"label": "Contact Person",
"options": "Contact",
"print_hide": 1
},
{
"default": "0",
"fieldname": "dunning_amount",
"fieldtype": "Currency",
"label": "Dunning Amount",
"options": "currency",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "accounting_details_section",
"fieldtype": "Section Break",
"label": "Accounting Details"
},
{
"fetch_from": "dunning_type.cost_center",
"fieldname": "cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center",
"print_hide": 1
},
{
"collapsible": 1,
"fieldname": "printing_settings_section",
"fieldtype": "Section Break",
"label": "Printing Settings"
},
{
"fieldname": "section_break_32",
"fieldtype": "Section Break"
},
{
"fieldname": "column_break_33",
"fieldtype": "Column Break"
},
{
"fieldname": "spacer",
"fieldtype": "Data",
"hidden": 1,
"label": "Spacer",
"print_hide": 1,
"read_only": 1,
"report_hide": 1
},
{
"fieldname": "column_break_16",
"fieldtype": "Column Break"
},
{
"fieldname": "company_address",
"fieldtype": "Link",
"label": "Company Address",
"options": "Address",
"print_hide": 1
},
{
"fieldname": "section_break_9",
"fieldtype": "Section Break",
"label": "Currency"
},
{
"fieldname": "currency",
"fieldtype": "Link",
"label": "Currency",
"options": "Currency"
},
{
"fieldname": "column_break_11",
"fieldtype": "Column Break"
},
{
"fetch_from": "sales_invoice.conversion_rate",
"fieldname": "conversion_rate",
"fieldtype": "Float",
"hidden": 1,
"label": "Conversion Rate",
"label": "Conversion Rate"
},
{
"default": "0",
"fieldname": "base_dunning_amount",
"fieldtype": "Currency",
"label": "Dunning Amount (Company Currency)",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "column_break_48",
"fieldtype": "Column Break"
}
],
"is_submittable": 1,
"links": [],
"modified": "2020-08-03 18:55:43.683053",
"modified": "2023-06-15 15:46:53.865712",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Dunning",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
@@ -365,6 +432,7 @@
],
"sort_field": "modified",
"sort_order": "ASC",
"states": [],
"title_field": "customer_name",
"track_changes": 1
}

View File

@@ -1,131 +1,150 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
"""
# Accounting
1. Payment of outstanding invoices with dunning amount
- Debit full amount to bank
- Credit invoiced amount to receivables
- Credit dunning amount to interest and similar revenue
-> Resolves dunning automatically
"""
import json
import frappe
from frappe.utils import cint, flt, getdate
from frappe import _
from frappe.contacts.doctype.address.address import get_address_display
from frappe.utils import getdate
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
from erpnext.accounts.general_ledger import make_gl_entries, make_reverse_gl_entries
from erpnext.controllers.accounts_controller import AccountsController
class Dunning(AccountsController):
def validate(self):
self.validate_overdue_days()
self.validate_amount()
if not self.income_account:
self.income_account = frappe.get_cached_value("Company", self.company, "default_income_account")
self.validate_same_currency()
self.validate_overdue_payments()
self.validate_totals()
self.set_party_details()
self.set_dunning_level()
def validate_overdue_days(self):
self.overdue_days = (getdate(self.posting_date) - getdate(self.due_date)).days or 0
def validate_same_currency(self):
"""
Throw an error if invoice currency differs from dunning currency.
"""
for row in self.overdue_payments:
invoice_currency = frappe.get_value("Sales Invoice", row.sales_invoice, "currency")
if invoice_currency != self.currency:
frappe.throw(
_(
"The currency of invoice {} ({}) is different from the currency of this dunning ({})."
).format(row.sales_invoice, invoice_currency, self.currency)
)
def validate_amount(self):
amounts = calculate_interest_and_amount(
self.outstanding_amount, self.rate_of_interest, self.dunning_fee, self.overdue_days
def validate_overdue_payments(self):
daily_interest = self.rate_of_interest / 100 / 365
for row in self.overdue_payments:
row.overdue_days = (getdate(self.posting_date) - getdate(row.due_date)).days or 0
row.interest = row.outstanding * daily_interest * row.overdue_days
def validate_totals(self):
self.total_outstanding = sum(row.outstanding for row in self.overdue_payments)
self.total_interest = sum(row.interest for row in self.overdue_payments)
self.dunning_amount = self.total_interest + self.dunning_fee
self.base_dunning_amount = self.dunning_amount * self.conversion_rate
self.grand_total = self.total_outstanding + self.dunning_amount
def set_party_details(self):
from erpnext.accounts.party import _get_party_details
party_details = _get_party_details(
self.customer,
ignore_permissions=self.flags.ignore_permissions,
doctype=self.doctype,
company=self.company,
posting_date=self.get("posting_date"),
fetch_payment_terms_template=False,
party_address=self.customer_address,
company_address=self.get("company_address"),
)
if self.interest_amount != amounts.get("interest_amount"):
self.interest_amount = flt(amounts.get("interest_amount"), self.precision("interest_amount"))
if self.dunning_amount != amounts.get("dunning_amount"):
self.dunning_amount = flt(amounts.get("dunning_amount"), self.precision("dunning_amount"))
if self.grand_total != amounts.get("grand_total"):
self.grand_total = flt(amounts.get("grand_total"), self.precision("grand_total"))
for field in [
"customer_address",
"address_display",
"company_address",
"contact_person",
"contact_display",
"contact_mobile",
]:
self.set(field, party_details.get(field))
def on_submit(self):
self.make_gl_entries()
self.set("company_address_display", get_address_display(self.company_address))
def on_cancel(self):
if self.dunning_amount:
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Payment Ledger Entry")
make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
def make_gl_entries(self):
if not self.dunning_amount:
return
gl_entries = []
invoice_fields = [
"project",
"cost_center",
"debit_to",
"party_account_currency",
"conversion_rate",
"cost_center",
]
inv = frappe.db.get_value("Sales Invoice", self.sales_invoice, invoice_fields, as_dict=1)
accounting_dimensions = get_accounting_dimensions()
invoice_fields.extend(accounting_dimensions)
dunning_in_company_currency = flt(self.dunning_amount * inv.conversion_rate)
default_cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
gl_entries.append(
self.get_gl_dict(
{
"account": inv.debit_to,
"party_type": "Customer",
"party": self.customer,
"due_date": self.due_date,
"against": self.income_account,
"debit": dunning_in_company_currency,
"debit_in_account_currency": self.dunning_amount,
"against_voucher": self.name,
"against_voucher_type": "Dunning",
"cost_center": inv.cost_center or default_cost_center,
"project": inv.project,
def set_dunning_level(self):
for row in self.overdue_payments:
past_dunnings = frappe.get_all(
"Overdue Payment",
filters={
"payment_schedule": row.payment_schedule,
"parent": ("!=", row.parent),
"docstatus": 1,
},
inv.party_account_currency,
item=inv,
)
)
gl_entries.append(
self.get_gl_dict(
{
"account": self.income_account,
"against": self.customer,
"credit": dunning_in_company_currency,
"cost_center": inv.cost_center or default_cost_center,
"credit_in_account_currency": self.dunning_amount,
"project": inv.project,
},
item=inv,
)
)
make_gl_entries(
gl_entries, cancel=(self.docstatus == 2), update_outstanding="No", merge_entries=False
)
row.dunning_level = len(past_dunnings) + 1
def resolve_dunning(doc, state):
"""
Check if all payments have been made and resolve dunning, if yes. Called
when a Payment Entry is submitted.
"""
for reference in doc.references:
if reference.reference_doctype == "Sales Invoice" and reference.outstanding_amount <= 0:
dunnings = frappe.get_list(
"Dunning",
filters={"sales_invoice": reference.reference_name, "status": ("!=", "Resolved")},
ignore_permissions=True,
)
# Consider partial and full payments:
# Submitting full payment: outstanding_amount will be 0
# Submitting 1st partial payment: outstanding_amount will be the pending installment
# Cancelling full payment: outstanding_amount will revert to total amount
# Cancelling last partial payment: outstanding_amount will revert to pending amount
submit_condition = reference.outstanding_amount < reference.total_amount
cancel_condition = reference.outstanding_amount <= reference.total_amount
if reference.reference_doctype == "Sales Invoice" and (
submit_condition if doc.docstatus == 1 else cancel_condition
):
state = "Resolved" if doc.docstatus == 2 else "Unresolved"
dunnings = get_linked_dunnings_as_per_state(reference.reference_name, state)
for dunning in dunnings:
frappe.db.set_value("Dunning", dunning.name, "status", "Resolved")
resolve = True
dunning = frappe.get_doc("Dunning", dunning.get("name"))
for overdue_payment in dunning.overdue_payments:
outstanding_inv = frappe.get_value(
"Sales Invoice", overdue_payment.sales_invoice, "outstanding_amount"
)
outstanding_ps = frappe.get_value(
"Payment Schedule", overdue_payment.payment_schedule, "outstanding"
)
resolve = False if (outstanding_ps > 0 and outstanding_inv > 0) else True
dunning.status = "Resolved" if resolve else "Unresolved"
dunning.save()
def calculate_interest_and_amount(outstanding_amount, rate_of_interest, dunning_fee, overdue_days):
interest_amount = 0
grand_total = flt(outstanding_amount) + flt(dunning_fee)
if rate_of_interest:
interest_per_year = flt(outstanding_amount) * flt(rate_of_interest) / 100
interest_amount = (interest_per_year * cint(overdue_days)) / 365
grand_total += flt(interest_amount)
dunning_amount = flt(interest_amount) + flt(dunning_fee)
return {
"interest_amount": interest_amount,
"grand_total": grand_total,
"dunning_amount": dunning_amount,
}
def get_linked_dunnings_as_per_state(sales_invoice, state):
dunning = frappe.qb.DocType("Dunning")
overdue_payment = frappe.qb.DocType("Overdue Payment")
return (
frappe.qb.from_(dunning)
.join(overdue_payment)
.on(overdue_payment.parent == dunning.name)
.select(dunning.name)
.where(
(dunning.status == state)
& (dunning.docstatus != 2)
& (overdue_payment.sales_invoice == sales_invoice)
)
).run(as_dict=True)
@frappe.whitelist()

View File

@@ -1,12 +0,0 @@
from frappe import _
def get_data():
return {
"fieldname": "dunning",
"non_standard_fieldnames": {
"Journal Entry": "reference_name",
"Payment Entry": "reference_name",
},
"transactions": [{"label": _("Payment"), "items": ["Payment Entry", "Journal Entry"]}],
}

View File

@@ -1,162 +1,197 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, nowdate, today
from erpnext.accounts.doctype.dunning.dunning import calculate_interest_and_amount
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
unlink_payment_on_cancel_of_invoice,
)
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
create_dunning as create_dunning_from_sales_invoice,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import (
create_sales_invoice_against_cost_center,
)
test_dependencies = ["Company", "Cost Center"]
class TestDunning(unittest.TestCase):
class TestDunning(FrappeTestCase):
@classmethod
def setUpClass(self):
create_dunning_type()
create_dunning_type_with_zero_interest_rate()
def setUpClass(cls):
super().setUpClass()
create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1)
create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0)
unlink_payment_on_cancel_of_invoice()
@classmethod
def tearDownClass(self):
def tearDownClass(cls):
unlink_payment_on_cancel_of_invoice(0)
super().tearDownClass()
def test_dunning(self):
dunning = create_dunning()
amounts = calculate_interest_and_amount(
dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
)
self.assertEqual(round(amounts.get("interest_amount"), 2), 0.44)
self.assertEqual(round(amounts.get("dunning_amount"), 2), 20.44)
self.assertEqual(round(amounts.get("grand_total"), 2), 120.44)
def test_dunning_without_fees(self):
dunning = create_dunning(overdue_days=20)
def test_dunning_with_zero_interest_rate(self):
dunning = create_dunning_with_zero_interest_rate()
amounts = calculate_interest_and_amount(
dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
)
self.assertEqual(round(amounts.get("interest_amount"), 2), 0)
self.assertEqual(round(amounts.get("dunning_amount"), 2), 20)
self.assertEqual(round(amounts.get("grand_total"), 2), 120)
self.assertEqual(round(dunning.total_outstanding, 2), 100.00)
self.assertEqual(round(dunning.total_interest, 2), 0.00)
self.assertEqual(round(dunning.dunning_fee, 2), 0.00)
self.assertEqual(round(dunning.dunning_amount, 2), 0.00)
self.assertEqual(round(dunning.grand_total, 2), 100.00)
def test_gl_entries(self):
dunning = create_dunning()
dunning.submit()
gl_entries = frappe.db.sql(
"""select account, debit, credit
from `tabGL Entry` where voucher_type='Dunning' and voucher_no=%s
order by account asc""",
dunning.name,
as_dict=1,
)
self.assertTrue(gl_entries)
expected_values = dict(
(d[0], d) for d in [["Debtors - _TC", 20.44, 0.0], ["Sales - _TC", 0.0, 20.44]]
)
for gle in gl_entries:
self.assertEqual(expected_values[gle.account][0], gle.account)
self.assertEqual(expected_values[gle.account][1], gle.debit)
self.assertEqual(expected_values[gle.account][2], gle.credit)
def test_dunning_with_fees_and_interest(self):
dunning = create_dunning(overdue_days=15, dunning_type_name="Second Notice - _TC")
def test_payment_entry(self):
dunning = create_dunning()
self.assertEqual(round(dunning.total_outstanding, 2), 100.00)
self.assertEqual(round(dunning.total_interest, 2), 0.41)
self.assertEqual(round(dunning.dunning_fee, 2), 10.00)
self.assertEqual(round(dunning.dunning_amount, 2), 10.41)
self.assertEqual(round(dunning.grand_total, 2), 110.41)
def test_dunning_with_payment_entry(self):
dunning = create_dunning(overdue_days=15, dunning_type_name="Second Notice - _TC")
dunning.submit()
pe = get_payment_entry("Dunning", dunning.name)
pe.reference_no = "1"
pe.reference_date = nowdate()
pe.paid_from_account_currency = dunning.currency
pe.paid_to_account_currency = dunning.currency
pe.source_exchange_rate = 1
pe.target_exchange_rate = 1
pe.insert()
pe.submit()
si_doc = frappe.get_doc("Sales Invoice", dunning.sales_invoice)
self.assertEqual(si_doc.outstanding_amount, 0)
for overdue_payment in dunning.overdue_payments:
outstanding_amount = frappe.get_value(
"Sales Invoice", overdue_payment.sales_invoice, "outstanding_amount"
)
self.assertEqual(outstanding_amount, 0)
dunning.reload()
self.assertEqual(dunning.status, "Resolved")
def test_dunning_and_payment_against_partially_due_invoice(self):
"""
Create SI with first installment overdue. Check impact of Dunning and Payment Entry.
"""
create_payment_terms_template_for_dunning()
sales_invoice = create_sales_invoice_against_cost_center(
posting_date=add_days(today(), -1 * 6),
qty=1,
rate=100,
do_not_submit=True,
)
sales_invoice.payment_terms_template = "_Test 50-50 for Dunning"
sales_invoice.submit()
dunning = create_dunning_from_sales_invoice(sales_invoice.name)
self.assertEqual(len(dunning.overdue_payments), 1)
self.assertEqual(dunning.overdue_payments[0].payment_term, "_Test Payment Term 1 for Dunning")
dunning.submit()
pe = get_payment_entry("Dunning", dunning.name)
pe.reference_no, pe.reference_date = "2", nowdate()
pe.insert()
pe.submit()
sales_invoice.load_from_db()
dunning.load_from_db()
self.assertEqual(sales_invoice.status, "Partly Paid")
self.assertEqual(sales_invoice.payment_schedule[0].outstanding, 0)
self.assertEqual(dunning.status, "Resolved")
# Test impact on cancellation of PE
pe.cancel()
sales_invoice.reload()
dunning.reload()
self.assertEqual(sales_invoice.status, "Overdue")
self.assertEqual(dunning.status, "Unresolved")
def create_dunning():
posting_date = add_days(today(), -20)
due_date = add_days(today(), -15)
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, due_date=due_date, status="Overdue"
posting_date=posting_date, qty=1, rate=100
)
dunning_type = frappe.get_doc("Dunning Type", "First Notice")
dunning = frappe.new_doc("Dunning")
dunning.sales_invoice = sales_invoice.name
dunning.customer_name = sales_invoice.customer_name
dunning.outstanding_amount = sales_invoice.outstanding_amount
dunning.debit_to = sales_invoice.debit_to
dunning.currency = sales_invoice.currency
dunning.company = sales_invoice.company
dunning.posting_date = nowdate()
dunning.due_date = sales_invoice.due_date
dunning.dunning_type = "First Notice"
dunning.rate_of_interest = dunning_type.rate_of_interest
dunning.dunning_fee = dunning_type.dunning_fee
dunning.save()
return dunning
dunning = create_dunning_from_sales_invoice(sales_invoice.name)
if dunning_type_name:
dunning_type = frappe.get_doc("Dunning Type", dunning_type_name)
dunning.dunning_type = dunning_type.name
dunning.rate_of_interest = dunning_type.rate_of_interest
dunning.dunning_fee = dunning_type.dunning_fee
dunning.income_account = dunning_type.income_account
dunning.cost_center = dunning_type.cost_center
return dunning.save()
def create_dunning_with_zero_interest_rate():
posting_date = add_days(today(), -20)
due_date = add_days(today(), -15)
sales_invoice = create_sales_invoice_against_cost_center(
posting_date=posting_date, due_date=due_date, status="Overdue"
)
dunning_type = frappe.get_doc("Dunning Type", "First Notice with 0% Rate of Interest")
dunning = frappe.new_doc("Dunning")
dunning.sales_invoice = sales_invoice.name
dunning.customer_name = sales_invoice.customer_name
dunning.outstanding_amount = sales_invoice.outstanding_amount
dunning.debit_to = sales_invoice.debit_to
dunning.currency = sales_invoice.currency
dunning.company = sales_invoice.company
dunning.posting_date = nowdate()
dunning.due_date = sales_invoice.due_date
dunning.dunning_type = "First Notice with 0% Rate of Interest"
dunning.rate_of_interest = dunning_type.rate_of_interest
dunning.dunning_fee = dunning_type.dunning_fee
dunning.save()
return dunning
def create_dunning_type(title, fee, interest, is_default):
company = "_Test Company"
if frappe.db.exists("Dunning Type", f"{title} - _TC"):
return
def create_dunning_type():
dunning_type = frappe.new_doc("Dunning Type")
dunning_type.dunning_type = "First Notice"
dunning_type.start_day = 10
dunning_type.end_day = 20
dunning_type.dunning_fee = 20
dunning_type.rate_of_interest = 8
dunning_type.dunning_type = title
dunning_type.company = company
dunning_type.is_default = is_default
dunning_type.dunning_fee = fee
dunning_type.rate_of_interest = interest
dunning_type.income_account = get_income_account(company)
dunning_type.cost_center = get_default_cost_center(company)
dunning_type.append(
"dunning_letter_text",
{
"language": "en",
"body_text": "We have still not received payment for our invoice ",
"body_text": "We have still not received payment for our invoice",
"closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees.",
},
)
dunning_type.save()
dunning_type.insert()
def create_dunning_type_with_zero_interest_rate():
dunning_type = frappe.new_doc("Dunning Type")
dunning_type.dunning_type = "First Notice with 0% Rate of Interest"
dunning_type.start_day = 10
dunning_type.end_day = 20
dunning_type.dunning_fee = 20
dunning_type.rate_of_interest = 0
dunning_type.append(
"dunning_letter_text",
{
"language": "en",
"body_text": "We have still not received payment for our invoice ",
"closing_text": "We kindly request that you pay the outstanding amount immediately, and late fees.",
},
def get_income_account(company):
return (
frappe.get_value("Company", company, "default_income_account")
or frappe.get_all(
"Account",
filters={"is_group": 0, "company": company},
or_filters={
"report_type": "Profit and Loss",
"account_type": ("in", ("Income Account", "Temporary")),
},
limit=1,
pluck="name",
)[0]
)
dunning_type.save()
def create_payment_terms_template_for_dunning():
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_term
create_payment_term("_Test Payment Term 1 for Dunning")
create_payment_term("_Test Payment Term 2 for Dunning")
if not frappe.db.exists("Payment Terms Template", "_Test 50-50 for Dunning"):
frappe.get_doc(
{
"doctype": "Payment Terms Template",
"template_name": "_Test 50-50 for Dunning",
"allocate_payment_based_on_payment_terms": 1,
"terms": [
{
"doctype": "Payment Terms Template Detail",
"payment_term": "_Test Payment Term 1 for Dunning",
"invoice_portion": 50.00,
"credit_days_based_on": "Day(s) after invoice date",
"credit_days": 5,
},
{
"doctype": "Payment Terms Template Detail",
"payment_term": "_Test Payment Term 2 for Dunning",
"invoice_portion": 50.00,
"credit_days_based_on": "Day(s) after invoice date",
"credit_days": 10,
},
],
}
).insert()

View File

@@ -1,8 +1,24 @@
// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Dunning Type', {
// refresh: function(frm) {
// }
frappe.ui.form.on("Dunning Type", {
setup: function (frm) {
frm.set_query("income_account", () => {
return {
filters: {
root_type: "Income",
is_group: 0,
company: frm.doc.company,
},
};
});
frm.set_query("cost_center", () => {
return {
filters: {
is_group: 0,
company: frm.doc.company,
},
};
});
},
});

View File

@@ -1,23 +1,26 @@
{
"actions": [],
"allow_rename": 1,
"autoname": "field:dunning_type",
"beta": 1,
"creation": "2019-12-04 04:59:08.003664",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"dunning_type",
"overdue_interval_section",
"start_day",
"column_break_4",
"end_day",
"is_default",
"column_break_3",
"company",
"section_break_6",
"dunning_fee",
"column_break_8",
"rate_of_interest",
"text_block_section",
"dunning_letter_text"
"dunning_letter_text",
"section_break_9",
"income_account",
"column_break_13",
"cost_center"
],
"fields": [
{
@@ -45,10 +48,6 @@
"fieldtype": "Table",
"options": "Dunning Letter Text"
},
{
"fieldname": "column_break_4",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_6",
"fieldtype": "Section Break"
@@ -57,33 +56,62 @@
"fieldname": "column_break_8",
"fieldtype": "Column Break"
},
{
"fieldname": "overdue_interval_section",
"fieldtype": "Section Break",
"label": "Overdue Interval"
},
{
"fieldname": "start_day",
"fieldtype": "Int",
"label": "Start Day"
},
{
"fieldname": "end_day",
"fieldtype": "Int",
"label": "End Day"
},
{
"fieldname": "rate_of_interest",
"fieldtype": "Float",
"in_list_view": 1,
"label": "Rate of Interest (%) Yearly"
},
{
"default": "0",
"fieldname": "is_default",
"fieldtype": "Check",
"label": "Is Default"
},
{
"fieldname": "section_break_9",
"fieldtype": "Section Break",
"label": "Accounting Details"
},
{
"fieldname": "income_account",
"fieldtype": "Link",
"label": "Income Account",
"options": "Account"
},
{
"fieldname": "cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
},
{
"fieldname": "column_break_3",
"fieldtype": "Column Break"
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"reqd": 1
},
{
"fieldname": "column_break_13",
"fieldtype": "Column Break"
}
],
"links": [],
"modified": "2020-07-15 17:14:17.835074",
"links": [
{
"link_doctype": "Dunning",
"link_fieldname": "dunning_type"
}
],
"modified": "2021-11-13 00:25:35.659283",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Dunning Type",
"naming_rule": "By script",
"owner": "Administrator",
"permissions": [
{

View File

@@ -2,9 +2,11 @@
# For license information, please see license.txt
# import frappe
import frappe
from frappe.model.document import Document
class DunningType(Document):
pass
def autoname(self):
company_abbr = frappe.get_value("Company", self.company, "abbr")
self.name = f"{self.dunning_type} - {company_abbr}"

View File

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

View File

@@ -35,6 +35,21 @@ frappe.ui.form.on('Exchange Rate Revaluation', {
}
},
validate_rounding_loss: function(frm) {
let allowance = frm.doc.rounding_loss_allowance;
if (!(allowance >= 0 && allowance < 1)) {
frappe.throw(__("Rounding Loss Allowance should be between 0 and 1"));
}
},
rounding_loss_allowance: function(frm) {
frm.events.validate_rounding_loss(frm);
},
validate: function(frm) {
frm.events.validate_rounding_loss(frm);
},
get_entries: function(frm, account) {
frappe.call({
method: "get_accounts_data",
@@ -126,7 +141,8 @@ var get_account_details = function(frm, cdt, cdn) {
company: frm.doc.company,
posting_date: frm.doc.posting_date,
party_type: row.party_type,
party: row.party
party: row.party,
rounding_loss_allowance: frm.doc.rounding_loss_allowance
},
callback: function(r){
$.extend(row, r.message);

View File

@@ -8,6 +8,7 @@
"engine": "InnoDB",
"field_order": [
"posting_date",
"rounding_loss_allowance",
"column_break_2",
"company",
"section_break_4",
@@ -96,11 +97,19 @@
{
"fieldname": "column_break_10",
"fieldtype": "Column Break"
},
{
"default": "0.05",
"description": "Only values between [0,1) are allowed. Like {0.00, 0.04, 0.09, ...}\nEx: If allowance is set at 0.07, accounts that have balance of 0.07 in either of the currencies will be considered as zero balance account",
"fieldname": "rounding_loss_allowance",
"fieldtype": "Float",
"label": "Rounding Loss Allowance",
"precision": "9"
}
],
"is_submittable": 1,
"links": [],
"modified": "2022-12-29 19:38:24.416529",
"modified": "2023-06-20 07:29:06.972434",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation",

View File

@@ -12,13 +12,19 @@ from frappe.utils import flt, get_link_to_form
import erpnext
from erpnext.accounts.doctype.journal_entry.journal_entry import get_balance_on
from erpnext.accounts.utils import get_currency_precision
from erpnext.setup.utils import get_exchange_rate
class ExchangeRateRevaluation(Document):
def validate(self):
self.validate_rounding_loss_allowance()
self.set_total_gain_loss()
def validate_rounding_loss_allowance(self):
if not (self.rounding_loss_allowance >= 0 and self.rounding_loss_allowance < 1):
frappe.throw(_("Rounding Loss Allowance should be between 0 and 1"))
def set_total_gain_loss(self):
total_gain_loss = 0
@@ -87,11 +93,22 @@ class ExchangeRateRevaluation(Document):
return True
def fetch_and_calculate_accounts_data(self):
accounts = self.get_accounts_data()
if accounts:
for acc in accounts:
self.append("accounts", acc)
@frappe.whitelist()
def get_accounts_data(self):
self.validate_mandatory()
account_details = self.get_account_balance_from_gle(
company=self.company, posting_date=self.posting_date, account=None, party_type=None, party=None
company=self.company,
posting_date=self.posting_date,
account=None,
party_type=None,
party=None,
rounding_loss_allowance=self.rounding_loss_allowance,
)
accounts_with_new_balance = self.calculate_new_account_balance(
self.company, self.posting_date, account_details
@@ -103,7 +120,9 @@ class ExchangeRateRevaluation(Document):
return accounts_with_new_balance
@staticmethod
def get_account_balance_from_gle(company, posting_date, account, party_type, party):
def get_account_balance_from_gle(
company, posting_date, account, party_type, party, rounding_loss_allowance
):
account_details = []
if company and posting_date:
@@ -170,6 +189,23 @@ class ExchangeRateRevaluation(Document):
.run(as_dict=True)
)
# round off balance based on currency precision
# and consider debit-credit difference allowance
currency_precision = get_currency_precision()
rounding_loss_allowance = float(rounding_loss_allowance) or 0.05
for acc in account_details:
acc.balance_in_account_currency = flt(acc.balance_in_account_currency, currency_precision)
if abs(acc.balance_in_account_currency) <= rounding_loss_allowance:
acc.balance_in_account_currency = 0
acc.balance = flt(acc.balance, currency_precision)
if abs(acc.balance) <= rounding_loss_allowance:
acc.balance = 0
acc.zero_balance = (
True if (acc.balance == 0 or acc.balance_in_account_currency == 0) else False
)
return account_details
@staticmethod
@@ -222,8 +258,8 @@ class ExchangeRateRevaluation(Document):
new_balance_in_base_currency = 0
new_balance_in_account_currency = 0
current_exchange_rate = calculate_exchange_rate_using_last_gle(
company, d.account, d.party_type, d.party
current_exchange_rate = (
calculate_exchange_rate_using_last_gle(company, d.account, d.party_type, d.party) or 0.0
)
gain_loss = new_balance_in_account_currency - (
@@ -343,6 +379,24 @@ class ExchangeRateRevaluation(Document):
"credit": 0,
}
)
journal_entry_accounts.append(journal_account)
journal_entry_accounts.append(
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit": 0,
"credit": 0,
"debit_in_account_currency": abs(d.gain_loss) if d.gain_loss < 0 else 0,
"credit_in_account_currency": abs(d.gain_loss) if d.gain_loss > 0 else 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
elif d.get("balance_in_base_currency") and not d.get("new_balance_in_base_currency"):
# Base currency has balance
dr_or_cr = "credit" if d.get("balance_in_base_currency") > 0 else "debit"
@@ -358,22 +412,22 @@ class ExchangeRateRevaluation(Document):
}
)
journal_entry_accounts.append(journal_account)
journal_entry_accounts.append(journal_account)
journal_entry_accounts.append(
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit": abs(self.gain_loss_booked) if self.gain_loss_booked < 0 else 0,
"credit": abs(self.gain_loss_booked) if self.gain_loss_booked > 0 else 0,
"debit_in_account_currency": abs(self.gain_loss_booked) if self.gain_loss_booked < 0 else 0,
"credit_in_account_currency": self.gain_loss_booked if self.gain_loss_booked > 0 else 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
journal_entry_accounts.append(
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit": abs(d.gain_loss) if d.gain_loss < 0 else 0,
"credit": abs(d.gain_loss) if d.gain_loss > 0 else 0,
"debit_in_account_currency": 0,
"credit_in_account_currency": 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
journal_entry.set("accounts", journal_entry_accounts)
journal_entry.set_total_debit_credit()
@@ -521,7 +575,9 @@ 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):
def get_account_details(
company, posting_date, account, party_type=None, party=None, rounding_loss_allowance: float = None
):
if not (company and posting_date):
frappe.throw(_("Company and Posting Date is mandatory"))
@@ -539,7 +595,12 @@ def get_account_details(company, posting_date, account, party_type=None, party=N
"account_currency": account_currency,
}
account_balance = ExchangeRateRevaluation.get_account_balance_from_gle(
company=company, posting_date=posting_date, account=account, party_type=party_type, party=party
company=company,
posting_date=posting_date,
account=account,
party_type=party_type,
party=party,
rounding_loss_allowance=rounding_loss_allowance,
)
if account_balance and (

View File

@@ -73,6 +73,7 @@
"fieldname": "current_exchange_rate",
"fieldtype": "Float",
"label": "Current Exchange Rate",
"precision": "9",
"read_only": 1
},
{
@@ -92,6 +93,7 @@
"fieldtype": "Float",
"in_list_view": 1,
"label": "New Exchange Rate",
"precision": "9",
"reqd": 1
},
{
@@ -147,7 +149,7 @@
],
"istable": 1,
"links": [],
"modified": "2022-12-29 19:38:52.915295",
"modified": "2023-06-22 12:39:56.446722",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation Account",

View File

@@ -13,7 +13,7 @@ class TestFinanceBook(unittest.TestCase):
finance_book = create_finance_book()
# create jv entry
jv = make_journal_entry("_Test Bank - _TC", "_Test Receivable - _TC", 100, save=False)
jv = make_journal_entry("_Test Bank - _TC", "Debtors - _TC", 100, save=False)
jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer"})

View File

@@ -8,17 +8,6 @@ frappe.ui.form.on('Fiscal Year', {
frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1));
}
},
refresh: function (frm) {
if (!frm.doc.__islocal && (frm.doc.name != frappe.sys_defaults.fiscal_year)) {
frm.add_custom_button(__("Set as Default"), () => frm.events.set_as_default(frm));
frm.set_intro(__("To set this Fiscal Year as Default, click on 'Set as Default'"));
} else {
frm.set_intro("");
}
},
set_as_default: function(frm) {
return frm.call('set_as_default');
},
year_start_date: function(frm) {
if (!frm.doc.is_short_year) {
let year_end_date =

View File

@@ -4,28 +4,12 @@
import frappe
from dateutil.relativedelta import relativedelta
from frappe import _, msgprint
from frappe import _
from frappe.model.document import Document
from frappe.utils import add_days, add_years, cstr, getdate
class FiscalYear(Document):
@frappe.whitelist()
def set_as_default(self):
frappe.db.set_value("Global Defaults", None, "current_fiscal_year", self.name)
global_defaults = frappe.get_doc("Global Defaults")
global_defaults.check_permission("write")
global_defaults.on_update()
# clear cache
frappe.clear_cache()
msgprint(
_(
"{0} is now the default Fiscal Year. Please refresh your browser for the change to take effect."
).format(self.name)
)
def validate(self):
self.validate_dates()
self.validate_overlap()
@@ -68,13 +52,6 @@ class FiscalYear(Document):
frappe.cache().delete_value("fiscal_years")
def on_trash(self):
global_defaults = frappe.get_doc("Global Defaults")
if global_defaults.current_fiscal_year == self.name:
frappe.throw(
_(
"You cannot delete Fiscal Year {0}. Fiscal Year {0} is set as default in Global Settings"
).format(self.name)
)
frappe.cache().delete_value("fiscal_years")
def validate_overlap(self):

View File

@@ -35,6 +35,7 @@
{
"fieldname": "company",
"fieldtype": "Link",
"in_filter": 1,
"in_list_view": 1,
"label": "Company",
"options": "Company",
@@ -56,7 +57,7 @@
}
],
"links": [],
"modified": "2022-01-18 21:11:23.105589",
"modified": "2023-07-09 18:11:23.105589",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Item Tax Template",
@@ -102,4 +103,4 @@
"states": [],
"title_field": "title",
"track_changes": 1
}
}

View File

@@ -8,7 +8,7 @@ frappe.provide("erpnext.journal_entry");
frappe.ui.form.on("Journal Entry", {
setup: function(frm) {
frm.add_fetch("bank_account", "account", "account");
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', 'Journal Entry', "Repost Payment Ledger"];
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', 'Journal Entry', "Repost Payment Ledger", 'Asset', 'Asset Movement', 'Asset Depreciation Schedule'];
},
refresh: function(frm) {
@@ -264,11 +264,11 @@ erpnext.accounts.JournalEntry = class JournalEntry extends frappe.ui.form.Contro
}
if(jvd.party_type && jvd.party) {
var party_field = "";
let party_field = "";
if(jvd.reference_type.indexOf("Sales")===0) {
var party_field = "customer";
party_field = "customer";
} else if (jvd.reference_type.indexOf("Purchase")===0) {
var party_field = "supplier";
party_field = "supplier";
}
if (party_field) {
@@ -368,7 +368,7 @@ cur_frm.cscript.update_totals = function(doc) {
td += flt(accounts[i].debit, precision("debit", accounts[i]));
tc += flt(accounts[i].credit, precision("credit", accounts[i]));
}
var doc = locals[doc.doctype][doc.name];
doc = locals[doc.doctype][doc.name];
doc.total_debit = td;
doc.total_credit = tc;
doc.difference = flt((td - tc), precision("difference"));
@@ -575,7 +575,7 @@ $.extend(erpnext.journal_entry, {
};
if(!frm.doc.multi_currency) {
$.extend(filters, {
account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency
account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
});
}
return { filters: filters };

View File

@@ -69,6 +69,7 @@ class JournalEntry(AccountsController):
self.validate_empty_accounts_table()
self.set_account_and_party_balance()
self.validate_inter_company_accounts()
self.validate_depr_entry_voucher_type()
if self.docstatus == 0:
self.apply_tax_withholding()
@@ -130,6 +131,13 @@ class JournalEntry(AccountsController):
if self.total_credit != doc.total_debit or self.total_debit != doc.total_credit:
frappe.throw(_("Total Credit/ Debit Amount should be same as linked Journal Entry"))
def validate_depr_entry_voucher_type(self):
if (
any(d.account_type == "Depreciation" for d in self.get("accounts"))
and self.voucher_type != "Depreciation Entry"
):
frappe.throw(_("Journal Entry type should be set as Depreciation Entry for asset depreciation"))
def validate_stock_accounts(self):
stock_accounts = get_stock_accounts(self.company, self.doctype, self.name)
for account in stock_accounts:
@@ -233,25 +241,30 @@ class JournalEntry(AccountsController):
self.remove(d)
def update_asset_value(self):
if self.voucher_type != "Depreciation Entry":
if self.flags.planned_depr_entry or self.voucher_type != "Depreciation Entry":
return
processed_assets = []
for d in self.get("accounts"):
if (
d.reference_type == "Asset" and d.reference_name and d.reference_name not in processed_assets
d.reference_type == "Asset"
and d.reference_name
and d.account_type == "Depreciation"
and d.debit
):
processed_assets.append(d.reference_name)
asset = frappe.get_doc("Asset", d.reference_name)
if asset.calculate_depreciation:
continue
depr_value = d.debit or d.credit
asset.db_set("value_after_depreciation", asset.value_after_depreciation - depr_value)
fb_idx = 1
if self.finance_book:
for fb_row in asset.get("finance_books"):
if fb_row.finance_book == self.finance_book:
fb_idx = fb_row.idx
break
fb_row = asset.get("finance_books")[fb_idx - 1]
fb_row.value_after_depreciation -= d.debit
fb_row.db_update()
else:
asset.db_set("value_after_depreciation", asset.value_after_depreciation - d.debit)
asset.set_status()
@@ -313,45 +326,57 @@ class JournalEntry(AccountsController):
d.db_update()
def unlink_asset_reference(self):
if self.voucher_type != "Depreciation Entry":
return
processed_assets = []
for d in self.get("accounts"):
if (
d.reference_type == "Asset" and d.reference_name and d.reference_name not in processed_assets
self.voucher_type == "Depreciation Entry"
and d.reference_type == "Asset"
and d.reference_name
and d.account_type == "Depreciation"
and d.debit
):
processed_assets.append(d.reference_name)
asset = frappe.get_doc("Asset", d.reference_name)
if asset.calculate_depreciation:
je_found = False
for row in asset.get("finance_books"):
for fb_row in asset.get("finance_books"):
if je_found:
break
depr_schedule = get_depr_schedule(asset.name, "Active", row.finance_book)
depr_schedule = get_depr_schedule(asset.name, "Active", fb_row.finance_book)
for s in depr_schedule or []:
if s.journal_entry == self.name:
s.db_set("journal_entry", None)
row.value_after_depreciation += s.depreciation_amount
row.db_update()
asset.set_status()
fb_row.value_after_depreciation += d.debit
fb_row.db_update()
je_found = True
break
if not je_found:
fb_idx = 1
if self.finance_book:
for fb_row in asset.get("finance_books"):
if fb_row.finance_book == self.finance_book:
fb_idx = fb_row.idx
break
fb_row = asset.get("finance_books")[fb_idx - 1]
fb_row.value_after_depreciation += d.debit
fb_row.db_update()
else:
depr_value = d.debit or d.credit
asset.db_set("value_after_depreciation", asset.value_after_depreciation + d.debit)
asset.set_status()
elif self.voucher_type == "Journal Entry" and d.reference_type == "Asset" and d.reference_name:
journal_entry_for_scrap = frappe.db.get_value(
"Asset", d.reference_name, "journal_entry_for_scrap"
)
asset.db_set("value_after_depreciation", asset.value_after_depreciation + depr_value)
asset.set_status()
if journal_entry_for_scrap == self.name:
frappe.throw(
_("Journal Entry for Asset scrapping cannot be cancelled. Please restore the Asset.")
)
def unlink_inter_company_jv(self):
if (
@@ -383,6 +408,15 @@ class JournalEntry(AccountsController):
d.idx, d.account
)
)
elif (
d.party_type
and frappe.db.get_value("Party Type", d.party_type, "account_type") != account_type
):
frappe.throw(
_("Row {0}: Account {1} and Party Type {2} have different account types").format(
d.idx, d.account, d.party_type
)
)
def check_credit_limit(self):
customers = list(
@@ -885,6 +919,8 @@ class JournalEntry(AccountsController):
def make_gl_entries(self, cancel=0, adv_adj=0):
from erpnext.accounts.general_ledger import make_gl_entries
merge_entries = frappe.db.get_single_value("Accounts Settings", "merge_similar_account_heads")
gl_map = self.build_gl_map()
if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
update_outstanding = "No"
@@ -892,7 +928,13 @@ class JournalEntry(AccountsController):
update_outstanding = "Yes"
if gl_map:
make_gl_entries(gl_map, cancel=cancel, adv_adj=adv_adj, update_outstanding=update_outstanding)
make_gl_entries(
gl_map,
cancel=cancel,
adv_adj=adv_adj,
merge_entries=merge_entries,
update_outstanding=update_outstanding,
)
@frappe.whitelist()
def get_balance(self, difference_account=None):
@@ -926,6 +968,7 @@ class JournalEntry(AccountsController):
blank_row.debit_in_account_currency = abs(diff)
blank_row.debit = abs(diff)
self.set_total_debit_credit()
self.validate_total_debit_and_credit()
@frappe.whitelist()

View File

@@ -43,7 +43,7 @@ class TestJournalEntry(unittest.TestCase):
frappe.db.sql(
"""select name from `tabJournal Entry Account`
where account = %s and docstatus = 1 and parent = %s""",
("_Test Receivable - _TC", test_voucher.name),
("Debtors - _TC", test_voucher.name),
)
)
@@ -105,8 +105,8 @@ class TestJournalEntry(unittest.TestCase):
elif test_voucher.doctype in ["Sales Order", "Purchase Order"]:
# if test_voucher is a Sales Order/Purchase Order, test error on cancellation of test_voucher
frappe.db.set_value(
"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
frappe.db.set_single_value(
"Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
)
submitted_voucher = frappe.get_doc(test_voucher.doctype, test_voucher.name)
self.assertRaises(frappe.LinkExistsError, submitted_voucher.cancel)
@@ -273,7 +273,7 @@ class TestJournalEntry(unittest.TestCase):
jv.submit()
# create jv in USD, but account currency in INR
jv = make_journal_entry("_Test Bank - _TC", "_Test Receivable - _TC", 100, save=False)
jv = make_journal_entry("_Test Bank - _TC", "Debtors - _TC", 100, save=False)
jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer USD"})
@@ -287,10 +287,6 @@ class TestJournalEntry(unittest.TestCase):
jv.submit()
def test_inter_company_jv(self):
frappe.db.set_value("Account", "Sales Expenses - _TC", "inter_company_account", 1)
frappe.db.set_value("Account", "Buildings - _TC", "inter_company_account", 1)
frappe.db.set_value("Account", "Sales Expenses - _TC1", "inter_company_account", 1)
frappe.db.set_value("Account", "Buildings - _TC1", "inter_company_account", 1)
jv = make_journal_entry(
"Sales Expenses - _TC",
"Buildings - _TC",

View File

@@ -6,7 +6,7 @@
"doctype": "Journal Entry",
"accounts": [
{
"account": "_Test Receivable - _TC",
"account": "Debtors - _TC",
"party_type": "Customer",
"party": "_Test Customer",
"credit_in_account_currency": 400.0,
@@ -70,7 +70,7 @@
"doctype": "Journal Entry",
"accounts": [
{
"account": "_Test Receivable - _TC",
"account": "Debtors - _TC",
"party_type": "Customer",
"party": "_Test Customer",
"credit_in_account_currency": 0.0,

View File

@@ -2,6 +2,21 @@
// For license information, please see license.txt
frappe.ui.form.on("Journal Entry Template", {
onload: function(frm) {
if(frm.is_new()) {
frappe.call({
type: "GET",
method: "erpnext.accounts.doctype.journal_entry_template.journal_entry_template.get_naming_series",
callback: function(r){
if(r.message) {
frm.set_df_property("naming_series", "options", r.message.split("\n"));
frm.set_value("naming_series", r.message.split("\n")[0]);
frm.refresh_field("naming_series");
}
}
});
}
},
refresh: function(frm) {
frappe.model.set_default_values(frm.doc);
@@ -13,24 +28,12 @@ frappe.ui.form.on("Journal Entry Template", {
if(!frm.doc.multi_currency) {
$.extend(filters, {
account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency
account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
});
}
return { filters: filters };
});
frappe.call({
type: "GET",
method: "erpnext.accounts.doctype.journal_entry_template.journal_entry_template.get_naming_series",
callback: function(r){
if(r.message){
frm.set_df_property("naming_series", "options", r.message.split("\n"));
frm.set_value("naming_series", r.message.split("\n")[0]);
frm.refresh_field("naming_series");
}
}
});
},
voucher_type: function(frm) {
var add_accounts = function(doc, r) {

View File

@@ -4,7 +4,7 @@
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.utils.background_jobs import is_job_queued
from frappe.utils.background_jobs import is_job_enqueued
from erpnext.accounts.doctype.account.account import merge_account
@@ -17,13 +17,14 @@ class LedgerMerge(Document):
if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name):
job_id = f"ledger_merge::{self.name}"
if not is_job_enqueued(job_id):
enqueue(
start_merge,
queue="default",
timeout=6000,
event="ledger_merge",
job_name=self.name,
job_id=job_id,
docname=self.name,
now=frappe.conf.developer_mode or frappe.flags.in_test,
)

View File

@@ -6,7 +6,7 @@ import frappe
from frappe import _, scrub
from frappe.model.document import Document
from frappe.utils import flt, nowdate
from frappe.utils.background_jobs import enqueue, is_job_queued
from frappe.utils.background_jobs import enqueue, is_job_enqueued
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
@@ -212,13 +212,15 @@ class OpeningInvoiceCreationTool(Document):
if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name):
job_id = f"opening_invoice::{self.name}"
if not is_job_enqueued(job_id):
enqueue(
start_import,
queue="default",
timeout=6000,
event="opening_invoice_creation",
job_name=self.name,
job_id=job_id,
invoices=invoices,
now=frappe.conf.developer_mode or frappe.flags.in_test,
)

View File

@@ -0,0 +1,170 @@
{
"actions": [],
"creation": "2021-09-15 18:34:27.172906",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"sales_invoice",
"payment_schedule",
"dunning_level",
"payment_term",
"section_break_15",
"description",
"section_break_4",
"due_date",
"overdue_days",
"mode_of_payment",
"column_break_5",
"invoice_portion",
"section_break_16",
"payment_amount",
"outstanding",
"paid_amount",
"discounted_amount",
"interest"
],
"fields": [
{
"columns": 2,
"fieldname": "payment_term",
"fieldtype": "Link",
"label": "Payment Term",
"options": "Payment Term",
"print_hide": 1,
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "section_break_15",
"fieldtype": "Section Break",
"label": "Description"
},
{
"columns": 2,
"fetch_from": "payment_term.description",
"fieldname": "description",
"fieldtype": "Small Text",
"label": "Description",
"read_only": 1
},
{
"fieldname": "section_break_4",
"fieldtype": "Section Break"
},
{
"columns": 2,
"fieldname": "due_date",
"fieldtype": "Date",
"label": "Due Date",
"read_only": 1
},
{
"fieldname": "mode_of_payment",
"fieldtype": "Link",
"label": "Mode of Payment",
"options": "Mode of Payment",
"read_only": 1
},
{
"fieldname": "column_break_5",
"fieldtype": "Column Break"
},
{
"columns": 2,
"fieldname": "invoice_portion",
"fieldtype": "Percent",
"label": "Invoice Portion",
"read_only": 1
},
{
"columns": 2,
"fieldname": "payment_amount",
"fieldtype": "Currency",
"label": "Payment Amount",
"options": "currency",
"read_only": 1
},
{
"fetch_from": "payment_amount",
"fieldname": "outstanding",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Outstanding",
"options": "currency",
"read_only": 1
},
{
"depends_on": "paid_amount",
"fieldname": "paid_amount",
"fieldtype": "Currency",
"label": "Paid Amount",
"options": "currency"
},
{
"default": "0",
"depends_on": "discounted_amount",
"fieldname": "discounted_amount",
"fieldtype": "Currency",
"label": "Discounted Amount",
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "sales_invoice",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Sales Invoice",
"options": "Sales Invoice",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "payment_schedule",
"fieldtype": "Data",
"label": "Payment Schedule",
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "overdue_days",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Overdue Days",
"read_only": 1
},
{
"default": "1",
"fieldname": "dunning_level",
"fieldtype": "Int",
"in_list_view": 1,
"label": "Dunning Level",
"read_only": 1
},
{
"fieldname": "section_break_16",
"fieldtype": "Section Break"
},
{
"fieldname": "interest",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Interest",
"options": "currency",
"read_only": 1
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-09-23 13:48:27.898830",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Overdue Payment",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1
}

View File

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

View File

@@ -6,7 +6,8 @@
"engine": "InnoDB",
"field_order": [
"company",
"account"
"account",
"advance_account"
],
"fields": [
{
@@ -22,14 +23,20 @@
"fieldname": "account",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Account",
"label": "Default Account",
"options": "Account"
},
{
"fieldname": "advance_account",
"fieldtype": "Link",
"label": "Advance Account",
"options": "Account"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2022-04-04 12:31:02.994197",
"modified": "2023-06-06 14:15:42.053150",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Party Account",

View File

@@ -1,10 +1,12 @@
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
{% include "erpnext/public/js/controllers/accounts.js" %}
frappe.provide("erpnext.accounts.dimensions");
cur_frm.cscript.tax_table = "Advance Taxes and Charges";
erpnext.accounts.taxes.setup_tax_validations("Payment Entry");
erpnext.accounts.taxes.setup_tax_filters("Advance Taxes and Charges");
frappe.ui.form.on('Payment Entry', {
onload: function(frm) {
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', "Repost Payment Ledger"];
@@ -106,12 +108,11 @@ frappe.ui.form.on('Payment Entry', {
});
frm.set_query("reference_doctype", "references", function() {
let doctypes = ["Journal Entry"];
if (frm.doc.party_type == "Customer") {
var doctypes = ["Sales Order", "Sales Invoice", "Journal Entry", "Dunning"];
doctypes = ["Sales Order", "Sales Invoice", "Journal Entry", "Dunning"];
} else if (frm.doc.party_type == "Supplier") {
var doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"];
} else {
var doctypes = ["Journal Entry"];
doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"];
}
return {
@@ -122,13 +123,10 @@ frappe.ui.form.on('Payment Entry', {
frm.set_query('payment_term', 'references', function(frm, cdt, cdn) {
const child = locals[cdt][cdn];
if (in_list(['Purchase Invoice', 'Sales Invoice'], child.reference_doctype) && child.reference_name) {
let payment_term_list = frappe.get_list('Payment Schedule', {'parent': child.reference_name});
payment_term_list = payment_term_list.map(pt => pt.payment_term);
return {
query: "erpnext.controllers.queries.get_payment_terms_for_references",
filters: {
'name': ['in', payment_term_list]
'reference': child.reference_name
}
}
}
@@ -155,6 +153,7 @@ frappe.ui.form.on('Payment Entry', {
frm.events.hide_unhide_fields(frm);
frm.events.set_dynamic_labels(frm);
frm.events.show_general_ledger(frm);
erpnext.accounts.ledger_preview.show_accounting_ledger_preview(frm);
},
validate_company: (frm) => {
@@ -164,6 +163,7 @@ frappe.ui.form.on('Payment Entry', {
},
company: function(frm) {
frm.trigger('party');
frm.events.hide_unhide_fields(frm);
frm.events.set_dynamic_labels(frm);
erpnext.accounts.dimensions.update_dimension(frm, frm.doctype);
@@ -286,6 +286,13 @@ frappe.ui.form.on('Payment Entry', {
}
},
mode_of_payment: function(frm) {
erpnext.accounts.pos.get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
let payment_account_field = frm.doc.payment_type == "Receive" ? "paid_to" : "paid_from";
frm.set_value(payment_account_field, account);
})
},
party_type: function(frm) {
let party_types = Object.keys(frappe.boot.party_account_types);
@@ -612,7 +619,7 @@ frappe.ui.form.on('Payment Entry', {
frm.events.set_unallocated_amount(frm);
},
get_outstanding_invoice: function(frm) {
get_outstanding_invoices_or_orders: function(frm, get_outstanding_invoices, get_orders_to_be_billed) {
const today = frappe.datetime.get_today();
const fields = [
{fieldtype:"Section Break", label: __("Posting Date")},
@@ -642,12 +649,29 @@ frappe.ui.form.on('Payment Entry', {
{fieldtype:"Check", label: __("Allocate Payment Amount"), fieldname:"allocate_payment_amount", default:1},
];
let btn_text = "";
if (get_outstanding_invoices) {
btn_text = "Get Outstanding Invoices";
}
else if (get_orders_to_be_billed) {
btn_text = "Get Outstanding Orders";
}
frappe.prompt(fields, function(filters){
frappe.flags.allocate_payment_amount = true;
frm.events.validate_filters_data(frm, filters);
frm.doc.cost_center = filters.cost_center;
frm.events.get_outstanding_documents(frm, filters);
}, __("Filters"), __("Get Outstanding Documents"));
frm.events.get_outstanding_documents(frm, filters, get_outstanding_invoices, get_orders_to_be_billed);
}, __("Filters"), __(btn_text));
},
get_outstanding_invoices: function(frm) {
frm.events.get_outstanding_invoices_or_orders(frm, true, false);
},
get_outstanding_orders: function(frm) {
frm.events.get_outstanding_invoices_or_orders(frm, false, true);
},
validate_filters_data: function(frm, filters) {
@@ -673,7 +697,7 @@ frappe.ui.form.on('Payment Entry', {
}
},
get_outstanding_documents: function(frm, filters) {
get_outstanding_documents: function(frm, filters, get_outstanding_invoices, get_orders_to_be_billed) {
frm.clear_table("references");
if(!frm.doc.party) {
@@ -697,6 +721,13 @@ frappe.ui.form.on('Payment Entry', {
args[key] = filters[key];
}
if (get_outstanding_invoices) {
args["get_outstanding_invoices"] = true;
}
else if (get_orders_to_be_billed) {
args["get_orders_to_be_billed"] = true;
}
frappe.flags.allocate_payment_amount = filters['allocate_payment_amount'];
return frappe.call({
@@ -708,7 +739,6 @@ frappe.ui.form.on('Payment Entry', {
if(r.message) {
var total_positive_outstanding = 0;
var total_negative_outstanding = 0;
$.each(r.message, function(i, d) {
var c = frm.add_child("references");
c.reference_doctype = d.voucher_type;
@@ -719,6 +749,7 @@ frappe.ui.form.on('Payment Entry', {
c.bill_no = d.bill_no;
c.payment_term = d.payment_term;
c.allocated_amount = d.allocated_amount;
c.account = d.account;
if(!in_list(frm.events.get_order_doctypes(frm), d.voucher_type)) {
if(flt(d.outstanding_amount) > 0)
@@ -872,12 +903,12 @@ frappe.ui.form.on('Payment Entry', {
if(frm.doc.payment_type == "Receive"
&& frm.doc.base_total_allocated_amount < frm.doc.base_received_amount + total_deductions
&& frm.doc.total_allocated_amount < frm.doc.paid_amount + (total_deductions / frm.doc.source_exchange_rate)) {
unallocated_amount = (frm.doc.base_received_amount + total_deductions + frm.doc.base_total_taxes_and_charges
unallocated_amount = (frm.doc.base_received_amount + total_deductions + flt(frm.doc.base_total_taxes_and_charges)
- frm.doc.base_total_allocated_amount) / frm.doc.source_exchange_rate;
} else if (frm.doc.payment_type == "Pay"
&& frm.doc.base_total_allocated_amount < frm.doc.base_paid_amount - total_deductions
&& frm.doc.total_allocated_amount < frm.doc.received_amount + (total_deductions / frm.doc.target_exchange_rate)) {
unallocated_amount = (frm.doc.base_paid_amount + frm.doc.base_total_taxes_and_charges - (total_deductions
unallocated_amount = (frm.doc.base_paid_amount + flt(frm.doc.base_total_taxes_and_charges) - (total_deductions
+ frm.doc.base_total_allocated_amount)) / frm.doc.target_exchange_rate;
}
}
@@ -904,7 +935,7 @@ frappe.ui.form.on('Payment Entry', {
function(d) { return flt(d.amount) }));
frm.set_value("difference_amount", difference_amount - total_deductions +
frm.doc.base_total_taxes_and_charges);
flt(frm.doc.base_total_taxes_and_charges));
frm.events.hide_unhide_fields(frm);
},
@@ -970,29 +1001,48 @@ frappe.ui.form.on('Payment Entry', {
},
callback: function(r, rt) {
if(r.message) {
var write_off_row = $.map(frm.doc["deductions"] || [], function(t) {
const write_off_row = $.map(frm.doc["deductions"] || [], function(t) {
return t.account==r.message[account] ? t : null; });
var row = [];
var difference_amount = flt(frm.doc.difference_amount,
const difference_amount = flt(frm.doc.difference_amount,
precision("difference_amount"));
if (!write_off_row.length && difference_amount) {
row = frm.add_child("deductions");
row.account = r.message[account];
row.cost_center = r.message["cost_center"];
} else {
row = write_off_row[0];
}
const add_deductions = (details) => {
let row = null;
if (!write_off_row.length && difference_amount) {
row = frm.add_child("deductions");
row.account = details[account];
row.cost_center = details["cost_center"];
} else {
row = write_off_row[0];
}
if (row) {
row.amount = flt(row.amount) + difference_amount;
} else {
frappe.msgprint(__("No gain or loss in the exchange rate"))
}
if (row) {
row.amount = flt(row.amount) + difference_amount;
} else {
frappe.msgprint(__("No gain or loss in the exchange rate"))
}
refresh_field("deductions");
};
refresh_field("deductions");
if (!r.message[account]) {
frappe.prompt({
label: __("Please Specify Account"),
fieldname: account,
fieldtype: "Link",
options: "Account",
get_query: () => ({
filters: {
company: frm.doc.company,
}
})
}, (values) => {
const details = Object.assign({}, r.message, values);
add_deductions(details);
}, __(frappe.unscrub(account)));
} else {
add_deductions(r.message);
}
frm.events.set_unallocated_amount(frm);
}
@@ -1058,7 +1108,7 @@ frappe.ui.form.on('Payment Entry', {
if (tax.charge_type === 'On Net Total') {
tax.charge_type = 'On Paid Amount';
}
me.frm.add_child("taxes", tax);
frm.add_child("taxes", tax);
}
frm.events.apply_taxes(frm);
frm.events.set_unallocated_amount(frm);
@@ -1174,7 +1224,7 @@ frappe.ui.form.on('Payment Entry', {
tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item;
} else {
tax.grand_total_fraction_for_current_item =
me.frm.doc["taxes"][i-1].grand_total_fraction_for_current_item +
frm.doc["taxes"][i-1].grand_total_fraction_for_current_item +
tax.tax_fraction_for_current_item;
}
@@ -1221,7 +1271,7 @@ frappe.ui.form.on('Payment Entry', {
}
});
$.each(me.frm.doc["taxes"] || [], function(i, tax) {
$.each(frm.doc["taxes"] || [], function(i, tax) {
let current_tax_amount = frm.events.get_current_tax_amount(frm, tax);
// Adjust divisional loss to the last item

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