Compare commits

...

836 Commits

Author SHA1 Message Date
Sahil Khan
d7aa71aa70 Merge branch 'hotfix' 2019-04-22 14:05:43 +05:30
Sahil Khan
32207ad722 bumped to version 11.1.22 2019-04-22 14:25:43 +05:50
Nabin Hait
16bd2ed967 Merge pull request #17319 from SaiFi0102/Revert-Allocate-Advance-Automatically-V11
fix: Set Allocate Advance Automatically disabled by default (v11)
2019-04-22 13:32:30 +05:30
Saif Ur Rehman
d1332f6c24 fix: Set Allocate Advance Automatically disabled by default 2019-04-22 12:17:25 +05:00
Saurabh
f36fa088f8 Merge pull request #17302 from sahil28297/new_site_sync
fix(site_sync): return more data in level
2019-04-22 12:46:20 +05:30
Saurabh
bb63103183 Merge branch 'hotfix' into new_site_sync 2019-04-22 12:46:13 +05:30
Anurag Mishra
7760db7563 fix: sales order status for order type 'Maintenance' (#17119)
* fix: Sales order Status for order type 'Maintenance'

* fix: test case for sales order
2019-04-22 12:15:11 +05:30
Saurabh
0ea1e67ce7 Merge branch 'hotfix' into new_site_sync 2019-04-22 11:59:52 +05:30
Nabin Hait
587b52dcd4 Merge pull request #17080 from auliabismar/patch-2
fix: Renumber Aktiva, remove excess 0
2019-04-22 11:21:15 +05:30
Nabin Hait
efcdf2fd42 Merge pull request #17255 from Anurag810/patch_for_salary_structure
fix: (Patch)make salary details submitable if  salary structure is submitted
2019-04-22 11:17:28 +05:30
Nabin Hait
010a05df48 Update set_salary_details_submitable.py 2019-04-22 11:16:47 +05:30
Nabin Hait
58d565a882 Merge pull request #17292 from prasadarr/listing-fixes-hotfix
fix: Allow system manager to access share ledger
2019-04-22 11:13:17 +05:30
Nabin Hait
b655b07f20 Merge pull request #17309 from nabinhait/ar-fix
fix: Total row alignment in AR report
2019-04-22 11:11:45 +05:30
Sahil Khan
afb59fa5c0 fix: import iteritems 2019-04-22 10:47:37 +05:30
Sahil Khan
cb4b86512d fix: syntax error 2019-04-22 10:10:50 +05:30
Kenneth Sequeira
c4a670c8c8 add salutation in contact display for lead (#17312) 2019-04-20 21:44:38 +05:30
Don-Leopardo
a26e2c064a fix: Campaign Efficiency report only works in english (#17284)
* fix column translation and match

* fix float results

* fix import missing
2019-04-20 21:12:23 +05:30
Sahil Khan
3889d0f0a0 fix: refactor level 2019-04-20 14:26:49 +05:30
rohitwaghchaure
4e81fb20b9 fix: Move erpnext related methods from frappe to erpnext (#17293) 2019-04-20 11:50:45 +05:30
Nabin Hait
dfba52b834 fix: Total row alignment in AR report 2019-04-20 10:57:04 +05:30
Nabin Hait
f665e42e2a Merge pull request #17307 from surajshetty3416/fix-employee-permission-hotfix
fix: Do not create employee user permission if already exists
2019-04-20 01:44:30 +05:30
Nabin Hait
560cc66a36 Merge pull request #17279 from rohitwaghchaure/requested_items_tobe_ordered_issue_for_multi_uom
fix: Requested Items To Be Ordered report showing records even if material request is fully ordered
2019-04-20 01:27:46 +05:30
Suraj Shetty
d08953b72b fix: Do not create employee user permission if already exists 2019-04-19 21:57:39 +05:30
Nabin Hait
34e4ac2398 Merge pull request #17296 from chdecultot/reconciliation_correction
fix: Reconciliation dashboard py3 and matching corrections
2019-04-19 20:02:54 +05:30
Sahil Khan
3dbaa3c2d9 fix(site_sync): return more data in level 2019-04-19 16:31:23 +05:30
Anurag Mishra
4f2fa173c9 fix: Reopen button does not appear in delivery note (#17295) 2019-04-19 16:06:17 +05:30
Rohit Waghchaure
d36e635e60 fix: Requested Items To Be Ordered report showing records even if material request is fully ordered 2019-04-19 14:54:59 +05:30
Charles-Henri Decultot
e86d21ea15 Py3 and matching corrections 2019-04-19 10:09:06 +02:00
Nabin Hait
b6fda118b9 Merge pull request #17280 from rohitwaghchaure/credit_will_not_be_converted_if_debit_amount_is_there
fix: credit amount not be consider if debit amount is present in the general ledger
2019-04-19 13:18:33 +05:30
Nabin Hait
2c607e5562 Merge pull request #17290 from alyf-de/company_test
fix(test): provide a helpful error message
2019-04-19 13:10:46 +05:30
Nabin Hait
95fce2395a Merge pull request #17289 from sunhoww/patch-1
fix: scan_barcode field adding invalid items
2019-04-19 13:07:06 +05:30
Nabin Hait
0f0dcd9035 Merge pull request #17285 from rohitwaghchaure/task_not_able_to_search_by_name_in_global_search
fix: task name was not able to search by name in global search
2019-04-19 13:06:24 +05:30
Prasad R
ce291c253b fix: show 2 missing doctypes in Accounts
Pricing Term and Exchage Rate Revaluation were missing, added in list
2019-04-19 12:17:19 +05:30
Prasad R
e85c6ad236 fix: Allow system manager to access share ledger 2019-04-19 11:07:19 +05:30
Raffael Meyer
df16cdcf31 fix(test): provide a helpful error message 2019-04-19 00:21:44 +02:00
Sun Howwrongbum
6f54a7b7d8 fix: scan_barcode field adding invalid items 2019-04-19 01:44:35 +05:30
Rohit Waghchaure
4db4f21d16 fix: task name was not able to search by name in global search 2019-04-18 22:34:19 +05:30
Rohit Waghchaure
abf9ef0244 fix: credit amount in account's currency not be consider if debit amount is present in the general ledger 2019-04-18 22:01:45 +05:30
Suraj Shetty
22ad81fb57 fix: Remove unwanted parent & parenttype field (#17274) 2019-04-18 15:45:47 +05:30
Shivam Mishra
923c5462a2 Merge pull request #17267 from fproldan/bundlestock
fix: Incorrect stock in "Available Stock for Packing Items" report
2019-04-18 11:04:55 +05:30
Francisco Roldán
753b3d1c28 Merge branch 'hotfix' into bundlestock 2019-04-17 11:44:40 -03:00
Nabin Hait
b9046edb85 Merge pull request #17259 from frappe/kennethsequeira-patch-2
fix: Improve Validation Message in BOM
2019-04-17 17:35:42 +05:30
Nabin Hait
7932eba733 Merge pull request #17266 from deepeshgarg007/gstr1-fixes
fix: GSTR-1 B2C Small report fix
2019-04-17 17:33:20 +05:30
Nabin Hait
5ba9c82922 Merge branch 'hotfix' into gstr1-fixes 2019-04-17 17:33:13 +05:30
Nabin Hait
fc48ce7073 Merge pull request #17250 from saurabh6790/patches_fix
fix: woocommerce settings patch
2019-04-17 17:30:14 +05:30
Nabin Hait
8b9a84b568 Merge pull request #17253 from hrwX/sales_percentage_validate_v11
fix(Customer): validate percentage total
2019-04-17 17:28:50 +05:30
Deepesh Garg
cc4e6a25f6 Merge branch 'hotfix' into kennethsequeira-patch-2 2019-04-17 17:24:45 +05:30
Nabin Hait
17923863de Merge pull request #17256 from Anurag810/fix_report_of_billing_summary
fix: total error arissing due to blank link field
2019-04-17 17:23:19 +05:30
Nabin Hait
32efea5e38 Merge pull request #17262 from rohitwaghchaure/finance_book_blank_issue
fix: If finance book filter is not set then show all the entries
2019-04-17 17:22:33 +05:30
Deepesh Garg
87a2c1d27d Merge branch 'hotfix' into kennethsequeira-patch-2 2019-04-17 17:16:37 +05:30
Nabin Hait
c581d67bba Merge pull request #17120 from hrwX/payment_terms_fix
fix(Purchase Order): fetch payment terms
2019-04-17 17:16:30 +05:30
Himanshu Warekar
1865e0df7c refactor: fetch payment terms in account settings 2019-04-17 15:35:43 +05:30
Himanshu Warekar
308ae1f155 fix: codacy fixes 2019-04-17 12:42:00 +05:30
Himanshu Warekar
2b54cee4aa fix: test case 2019-04-17 12:09:19 +05:30
Himanshu Warekar
ba47f89702 fix: added a single value to fetch payment terms 2019-04-17 11:24:04 +05:30
Nabin Hait
0ea32faf3d Merge pull request #17268 from nabinhait/pr-pi-onload
fix: Pull items from PR to PI
2019-04-16 23:45:48 +05:30
Nabin Hait
7be0736154 fix: removed debug 2019-04-16 23:05:39 +05:30
Nabin Hait
97bf12734a fix: Pull items from PR to PI 2019-04-16 22:11:22 +05:30
deepeshgarg007
4bccd692e5 fix: GSTR1 B2C report fix 2019-04-16 20:50:46 +05:30
NahuelOperto
07f8e6bbfc fix get_item_warehouse_quantity_map method 2019-04-16 11:36:19 -03:00
Rohit Waghchaure
15c7a05879 fix: If finance book filter is not set then show all the entries 2019-04-16 19:28:11 +05:30
Kenneth Sequeira
82e76b2c0c Improve Validation Message in BOM
Update following validation message:

"Price not found for item {0} and price list {1}" to "Price not found for item {0} in price list {1}"
2019-04-16 18:00:21 +05:30
Anurag Mishra
d6757b7af6 fix: total error arissing due to blank link field 2019-04-16 17:39:40 +05:30
Anurag Mishra
b380a02d09 fix: make salary details submitable if salary structure is submitted 2019-04-16 17:07:07 +05:30
Himanshu Warekar
64980fed59 fix: validate percentage total 2019-04-16 16:29:13 +05:30
Saurabh
7df8c0ef82 fix: woocommerce settings patch 2019-04-16 15:57:21 +05:30
Saurabh
332b4171c0 Merge branch 'hotfix' 2019-04-16 13:34:52 +05:30
Saurabh
e5544b8c86 bumped to version 11.1.21 2019-04-16 14:04:52 +06:00
sahil28297
38e5e7f616 Merge pull request #17246 from frappe/revert-17226-site_sync
Revert "feat(site_sync): return erpnext data in level"
2019-04-16 13:22:18 +05:30
sahil28297
a595346769 Revert "feat(site_sync): return erpnext data in level" 2019-04-16 13:21:24 +05:30
Nabin Hait
8dace802dc Merge pull request #17243 from hrwX/delivery_note_fix_v11
fix(Delivery Note): show get items even if note has been amended
2019-04-16 13:19:58 +05:30
Himanshu
ac6259dfe8 fix: let user delete the elements of items 2019-04-16 13:18:47 +05:30
Nabin Hait
f801cc953b Merge pull request #17152 from Alchez/hotfix-company-address-label
fix(selling): Add missing label to company address field
2019-04-16 12:45:40 +05:30
Nabin Hait
c117048fde Merge pull request #17226 from sahil28297/site_sync
feat(site_sync): return erpnext data in level
2019-04-16 12:42:45 +05:30
Himanshu Warekar
73fd508ccf fix: show get items even if note has been amended 2019-04-16 12:15:49 +05:30
Nabin Hait
734c32b970 Merge pull request #17234 from nabinhait/pr-to-pi
fix: Invoice against partially returned DN/PR
2019-04-16 09:46:24 +05:30
Nabin Hait
fa862e6814 Merge pull request #17236 from hrwX/remove_asset_permission_v11
fix(Asset): Remove user permission for employee in asset
2019-04-16 09:45:54 +05:30
Himanshu Warekar
cc581d21f0 Merge branch 'hotfix' of https://github.com/frappe/erpnext into remove_asset_permission_v11 2019-04-15 22:54:42 +05:30
Himanshu Warekar
dca60888ce fix: remove user permission for emp in asset 2019-04-15 22:52:50 +05:30
Nabin Hait
b2465c7a69 fix: Invoice against partially returned DN/PR 2019-04-15 21:02:16 +05:30
rohitwaghchaure
14477c7f51 Merge pull request #17161 from karthikeyan5/hotfix-woocommerce-fix
fix(woocommerce integration): 403 error and adding defaults
2019-04-15 19:34:54 +05:30
Nabin Hait
1024b55f99 Fixed merge conflict 2019-04-15 11:41:54 +05:30
Nabin Hait
9ba7b678fe fix: Bank reconciliation cleanup 2019-04-15 11:33:06 +05:30
Nabin Hait
a8c8e6b78a Merge pull request #16752 from nabinhait/limit-cond-fix
fix: Limit conditions while fetching payment entries
2019-04-15 10:19:12 +05:30
Nabin Hait
ce107086e7 Merge pull request #17083 from frappe/revert-16926-salary-slip-fix
Revert "fix(Salary Slip): Consider Leave without Pay for calculation"
2019-04-15 10:14:12 +05:30
Nabin Hait
49d1449d2b Merge branch 'hotfix' into revert-16926-salary-slip-fix 2019-04-15 10:13:31 +05:30
Nabin Hait
2f6789e54d Merge pull request #17228 from rohitwaghchaure/pos_not_working_if_user_can_access_more_than_one_company
fix: POS not working if user has access of multiple company
2019-04-15 10:12:51 +05:30
Nabin Hait
f2893e5701 Merge pull request #17215 from nabinhait/project-task-opt-tests
perf: Project task optimization
2019-04-15 10:11:16 +05:30
Nabin Hait
870410c9d5 Merge pull request #17180 from netchampfaris/duplicate-variant-check
fix: Validate variant attributes only if is_new
2019-04-15 10:09:12 +05:30
Nabin Hait
30bca30f20 Merge pull request #17185 from netchampfaris/allow-items-not-in-stock
feat: Allow items not in stock to be added in cart
2019-04-15 10:07:49 +05:30
Nabin Hait
80f1d5f63d Merge pull request #17217 from netchampfaris/item-price-packing-unit
fix: Set default value for Packing Unit as 0
2019-04-15 10:07:00 +05:30
Nabin Hait
76d4fa9f2b Merge pull request #17221 from nabinhait/supplier-sales-analytics
fix: supplier wise sales analytics report
2019-04-15 10:05:43 +05:30
Nabin Hait
e17c9d9978 Merge pull request #17225 from hrwX/naming_series
fix(Naming Series): Naming series
2019-04-15 10:05:17 +05:30
Rohit Waghchaure
548e93b2d3 fix: POS not working if user has access of multiple company 2019-04-14 19:39:11 +05:30
sahil28297
76eb9b32b3 Merge branch 'hotfix' into site_sync 2019-04-14 18:58:28 +05:30
Sahil Khan
0ac4cfa9b1 fix(site_sync): remove duplicate entry 2019-04-14 18:29:49 +05:30
Himanshu
dc34393b8a fix: allow braces for custom field names 2019-04-14 00:54:24 +05:30
Himanshu
023a865e1e Merge pull request #7 from frappe/hotfix
Hotfix
2019-04-14 00:49:41 +05:30
rohitwaghchaure
d2a7ec1add Merge pull request #17222 from Anurag810/pay_fix
fix: handle for party type member in payment entry(v11)
2019-04-13 00:10:30 +05:30
rohitwaghchaure
564ee5399c Merge pull request #17223 from rohitwaghchaure/user_permissions_are_not_working_for_stock_ledger
fix: user permissions are not working on stock ledger report
2019-04-13 00:09:58 +05:30
karthikeyan5
2518a2ab16 fix(woocommerce integration): travis fix 2019-04-12 19:35:07 +05:30
karthikeyan5
df3e8853ae fix(woocommerce integration): fix strange travis error
the patch was working locally. But, in was failing on travis. The strange thing was that the patch running in travis was looking for woocommerce_settings in the path 'frappe.core.doctype.woocommerce_settings.woocommerce_settings'
2019-04-12 19:35:07 +05:30
karthikeyan5
a0b7ff60b8 fix(woocommerce integration): possible travis fix
possible fix for travis patch error "Error: No module named woocommerce_settings.woocommerce_settings)"
2019-04-12 19:35:07 +05:30
karthikeyan5
97383716e6 fix(woocommerce integration): error in new-site
resolving "Could not find UOM: Nos" error in travis
2019-04-12 19:35:06 +05:30
karthikeyan5
f788117b3e fix(woocommerce integration): defaults in settings 2019-04-12 19:35:06 +05:30
karthikeyan5
6784335e2c fix(woocommerce integration): fixing 403 error 2019-04-12 19:35:06 +05:30
Rohit Waghchaure
c5c9dc5f6d fix: user permissions are not working on stock ledger report 2019-04-12 16:58:51 +05:30
Nabin Hait
819e24ddde fix: supplier wise sales analytics report 2019-04-12 15:11:11 +05:30
Anurag Mishra
313ed4feeb fix: handle for party type member in payment entry 2019-04-12 15:11:06 +05:30
Nabin Hait
5157fa9233 Merge pull request #17150 from nabinhait/ar-credit-note
fix: Show standalone credit note in Accounts receivable report
2019-04-12 14:18:17 +05:30
Faris Ansari
774b96495f fix: Set default value for Packing Unit as 0
The default value 1 assumes Items will be always packed in integer
quantities. This is not the usual case.
2019-04-12 12:38:04 +05:30
Nabin Hait
ea4c2c9e7d fix: task optimisation and test case fixes 2019-04-12 11:33:28 +05:30
Nabin Hait
b42bbf1b6f perf: Optimisation of project and task updation 2019-04-12 11:33:28 +05:30
Nabin Hait
c768febac6 Merge pull request #17206 from rohitwaghchaure/fix_pending_so_items_for_purchase_reques_report
fix: Pending SO Items For Purchase Request report not showing the so, requested and pending quantity correctly
2019-04-12 11:11:16 +05:30
Nabin Hait
0449d30423 Merge pull request #16976 from ESS-LLP/patient_hotfix
fix: Patient relation - patient link is not showing
2019-04-12 11:08:24 +05:30
Nabin Hait
f17dfb0ebe Merge pull request #17157 from Anurag810/vedmata-print-fixes
fix: Vedmata print fixes
2019-04-12 11:07:24 +05:30
Nabin Hait
13273412d1 Merge pull request #17207 from Anurag810/timesheet_report_amount_fixes
fix: timesheet report not showing total amount correctly
2019-04-12 11:05:12 +05:30
Nabin Hait
f198b1d032 Merge branch 'hotfix' into timesheet_report_amount_fixes 2019-04-12 11:05:03 +05:30
Nabin Hait
9512a43d44 Merge pull request #17187 from nabinhait/rounding-adjustment-gle
fix: Rounding Adjustment GL Entry
2019-04-12 11:00:29 +05:30
Anurag Mishra
50db128ff1 fix: timesheet report not showing total amount correctly 2019-04-11 16:07:38 +05:30
Rohit Waghchaure
5eaf7d0517 fix: Pending SO Items For Purchase Request not showing the so quantity correctly if so has duplicate items 2019-04-11 13:56:40 +05:30
Nabin Hait
760b01912a Merge branch 'hotfix' into limit-cond-fix 2019-04-11 11:47:48 +05:30
Nabin Hait
4c331206f1 Merge branch 'hotfix' into patient_hotfix 2019-04-11 11:46:53 +05:30
Nabin Hait
02181c017a Merge branch 'hotfix' into patch-2 2019-04-11 11:46:39 +05:30
Nabin Hait
7fece8f431 Merge branch 'hotfix' into revert-16926-salary-slip-fix 2019-04-11 11:46:35 +05:30
Nabin Hait
bd7a165318 Merge branch 'hotfix' into ar-credit-note 2019-04-11 11:46:16 +05:30
Nabin Hait
4114365017 Merge branch 'hotfix' into hotfix-company-address-label 2019-04-11 11:46:08 +05:30
Nabin Hait
aace25ac2b Merge branch 'hotfix' into vedmata-print-fixes 2019-04-11 11:46:00 +05:30
Nabin Hait
697f1186c0 Merge branch 'hotfix' into duplicate-variant-check 2019-04-11 11:45:49 +05:30
Nabin Hait
55bee7a393 Merge branch 'hotfix' into allow-items-not-in-stock 2019-04-11 11:45:42 +05:30
Nabin Hait
c151b58acd Merge branch 'hotfix' into rounding-adjustment-gle 2019-04-11 11:45:36 +05:30
Nabin Hait
0f62b13dd8 Merge pull request #17159 from rohitwaghchaure/sales_return_not_working_for_bundle_items
fix: sales return not working for product bundle items
2019-04-11 11:44:57 +05:30
Nabin Hait
961d7ace4a Merge pull request #17189 from nabinhait/sales-person
fix: Made employee optional in sales person
2019-04-11 11:37:08 +05:30
Nabin Hait
38351587fc Merge pull request #17197 from nabinhait/training-feedback
fix: training feedback code cleanup
2019-04-11 11:36:50 +05:30
rohitwaghchaure
4898d1936b Merge pull request #17200 from Anurag810/pos_running
fix: order by idx(v11)
2019-04-11 10:57:05 +05:30
rohitwaghchaure
22d6eb3eaa Merge pull request #17191 from rohitwaghchaure/asset_depreciation_rate_hotfix
fix: Asset depreciation formula for WDV method, user was not able to edit schedule table for Manula method
2019-04-11 09:58:02 +05:30
rohitwaghchaure
6cd114b467 Merge pull request #17198 from rohitwaghchaure/fix_auto_assign_payment_entry_to_invoice
fix: don't assign the advance payment entries if Allocate Advances Automatically is disabled
2019-04-11 09:57:45 +05:30
rohitwaghchaure
2521b1347b Merge pull request #17201 from rohitwaghchaure/fix_test_cases_for_item_variant
Fix: item variant test cases
2019-04-10 19:16:51 +05:30
Rohit Waghchaure
f3a9552e48 fix: item variant test cases 2019-04-10 17:57:09 +05:30
Anurag Mishra
5ab5f77fd4 fix: order by idx 2019-04-10 17:53:45 +05:30
Rohit Waghchaure
49907e746b fix: test cases 2019-04-10 17:33:32 +05:30
Rohit Waghchaure
45d0b31d44 fix: test cases 2019-04-10 17:25:08 +05:30
Rohit Waghchaure
b286fc99b8 fix: don't assign the advance payment entries if Allocate Advances Automatically is disabled 2019-04-10 16:16:30 +05:30
Nabin Hait
c8c678f747 fix: training feedback code cleanup 2019-04-10 15:56:16 +05:30
Sahil Khan
ef73452abe feat(sync_site): return erpnext data in levels 2019-04-10 15:29:49 +05:30
Rohit Waghchaure
bb0d4e37b9 fix: Asset depreciation formula for WDV method, user was not able to edit schedule table for Manula method 2019-04-10 03:14:11 +05:30
Nabin Hait
b305f38869 fix: Made employee optional in sales person 2019-04-09 20:06:11 +05:30
Nabin Hait
ff73090ad2 fix: Rounding Adjustment GL Entry 2019-04-09 19:24:54 +05:30
Faris Ansari
b63adcbac7 feat: Allow items not in stock to be added in cart 2019-04-09 18:41:31 +05:30
Nabin Hait
7dcdb93596 Merge pull request #17178 from Anurag810/timesheet_report_fixes
fix: timesheet_report (WN-SUP41913)
2019-04-09 17:28:22 +05:30
Faris Ansari
f492d5f61d fix: Validate variant attributes only if is_new 2019-04-09 15:19:10 +05:30
Anurag Mishra
22867f7fa5 fix: added currency 2019-04-09 15:06:49 +05:30
Anurag Mishra
3e8b8a4359 fix: filters and some conditions 2019-04-09 14:34:56 +05:30
Anurag Mishra
17fbafa390 fix: filters,added total,only submitted doc,considered fraction 2019-04-09 11:31:11 +05:30
Faris Ansari
aac7719dd9 fix: Translated string method in Jinja (#17174) 2019-04-08 21:50:58 +05:30
Rushabh Mehta
2cce72412d Merge pull request #17168 from frappe/revert-17086-check-version-hf
Revert "fix: Raise exception if apps are on incompatible branches"
2019-04-08 17:11:15 +05:30
Rushabh Mehta
1412a681f3 Revert "fix: Raise exception if apps are on incompatible branches" 2019-04-08 17:10:56 +05:30
Saurabh
b0c939d280 Merge branch 'hotfix' 2019-04-08 15:09:04 +05:30
Saurabh
00a5e7a1d0 bumped to version 11.1.20 2019-04-08 15:39:03 +06:00
Nabin Hait
f1698bb2df fix: unique variant based on 2019-04-08 14:59:43 +05:30
Anurag Mishra
4ac386d0fe fix: Removed Extra page on generating pdf in print formats 2019-04-08 11:43:24 +05:30
Anurag Mishra
4753bd4519 fix: UI on generating pdf in print format 2019-04-08 10:53:19 +05:30
Nabin Hait
79c9d5d24a Merge pull request #17146 from Anurag810/timesheet-report
feat: Timesheet report
2019-04-08 10:33:44 +05:30
Rohit Waghchaure
3771db92b8 fix: sales return not working for bundle items 2019-04-06 17:34:40 +05:30
Anurag Mishra
76815cf2be fix: removed before from accounts_controlle.pyr and fetch the gl from frontend 2019-04-06 12:07:40 +05:30
Rohan Bansal
936d147b4b fix(selling): Add missing label to company address field 2019-04-05 18:15:04 +05:30
Nabin Hait
20090306f6 fix: Show standalone credit note in Accounts receivable report 2019-04-05 18:06:07 +05:30
Saurabh
c32f8eb0cb Merge branch 'hotfix' 2019-04-05 16:59:22 +05:30
Saurabh
63fabc3723 bumped to version 11.1.19 2019-04-05 17:29:22 +06:00
Nabin Hait
d70476fbc8 Merge pull request #17139 from hrwX/pe_supp_inv_v11
fix(Payment Entry): Return Bill No for Payment Entry
2019-04-05 15:59:43 +05:30
Nabin Hait
8cf76e74e0 Merge pull request #17133 from hrwX/validate_stock_transaction_v11
fix(Item): check transactions for batch, serial check
2019-04-05 15:41:35 +05:30
Nabin Hait
843e440191 Merge branch 'hotfix' into validate_stock_transaction_v11 2019-04-05 15:41:26 +05:30
Nabin Hait
1580e24946 Merge pull request #17137 from netchampfaris/item-group-clean-description
fix(Item Group): Don't clean description html
2019-04-05 15:39:44 +05:30
Nabin Hait
603dce428b Merge pull request #17144 from nabinhait/variant-fix
fix: Default variant Based on
2019-04-05 15:38:15 +05:30
Anurag Mishra
0dc62e8747 fix: Removed raw query and used frappe.get_all 2019-04-05 14:36:43 +05:30
Anurag Mishra
f71c147ea8 Added mandatory feilds to the report 2019-04-05 14:36:43 +05:30
Anurag Mishra
5c17e7760b fix: readability 2019-04-05 14:36:43 +05:30
Anurag Mishra
b57c024ff7 feat: Project Billing Summary for timesheet 2019-04-05 14:36:43 +05:30
Anurag Mishra
61aab377b6 Minor Fixes 2019-04-05 14:36:42 +05:30
Anurag Mishra
3d27aabdeb Commonify code 2019-04-05 14:36:42 +05:30
Anurag Mishra
94514ffee9 feat: timesheet Employee Summary Report 2019-04-05 14:36:42 +05:30
rohitwaghchaure
e334413b34 Merge pull request #17141 from rohitwaghchaure/incorrect_pos_profile_selected_if
fix: incorrect auto POS profile selected in the sales invoice
2019-04-05 13:04:05 +05:30
Anurag Mishra
a1a7beb12e fix: Print Auditing print format 2019-04-05 12:35:46 +05:30
Nabin Hait
a3357e4e86 fix: Default variant Based on 2019-04-05 12:10:36 +05:30
Himanshu Warekar
9f2847e86c fix: test case fixes for travis 2019-04-05 11:40:37 +05:30
Rohit Waghchaure
4324f43a06 always set the company from the POS Profile 2019-04-05 09:54:55 +05:30
Rohit Waghchaure
f7a83cb4f5 fix: incorrect POS profile selected 2019-04-05 00:42:48 +05:30
Himanshu Warekar
6443d7dd10 refactor: declare bill_on at function start 2019-04-04 19:54:23 +05:30
Himanshu Warekar
ad32324c4c fix: get bill_no 2019-04-04 19:50:23 +05:30
Faris Ansari
7a0a05d8f1 fix(Item Group): Don't clean description html 2019-04-04 15:53:16 +05:30
Himanshu Warekar
44d8224a3b fix: test case fix 2019-04-04 15:40:36 +05:30
Himanshu Warekar
7f253b679a pull from hotfix 2019-04-04 15:19:44 +05:30
Himanshu Warekar
28db545947 fix: check transactions for batch, serial check 2019-04-04 15:02:25 +05:30
Nabin Hait
82bd388993 Merge pull request #17122 from frappe/asbasawaraj-remove-location-from-abbreviation-doctypes
fix: Removed Location from Abbreviation Update DocTypes
2019-04-04 11:50:33 +05:30
Nabin Hait
e0a9835f30 Merge pull request #16987 from SaiFi0102/Party-Ledger-Summary-Fix
fix(Party Ledger Summary): Show all adjustment entries as columns
2019-04-04 11:45:36 +05:30
Nabin Hait
0747273ea4 Merge pull request #17028 from sagarvora/field_order
fix(accounts): dependent field should be displayed after source link field
2019-04-04 11:45:01 +05:30
Nabin Hait
9eeb3715f0 Merge pull request #16992 from hrwX/cost_center
fix(Purchase Invoice): Cost Centre as per company
2019-04-04 11:43:35 +05:30
Nabin Hait
2df623c693 Merge pull request #17072 from kennethsequeira/auto-re-val
fix: spelling in validation message for Auto-reorder
2019-04-04 11:40:08 +05:30
Nabin Hait
1e5664ba5f Update item.py 2019-04-04 11:39:55 +05:30
Nabin Hait
f4ae29320f Merge pull request #17087 from deepeshgarg007/payment_entry
Party type validation in payment entry
2019-04-04 11:39:00 +05:30
Nabin Hait
f86a01446f Merge pull request #17086 from adityahase/check-version-hf
fix: Raise exception if apps are on incompatible branches
2019-04-04 11:17:04 +05:30
Nabin Hait
9ee417888e Merge pull request #17092 from nabinhait/ar-ap-print
fix: Show Sales Person in AR/AP print is optional
2019-04-04 11:02:26 +05:30
Nabin Hait
2c869bd486 Merge pull request #17101 from hrwX/india_setup
fix(India): Add HSN/SAC in setup
2019-04-04 11:02:11 +05:30
Himanshu
c930cb10fa fix: remove duplicate doctype 2019-04-04 11:01:10 +05:30
Nabin Hait
91b1875ccf Merge pull request #17099 from nabinhait/return-precision-issue
fix: Validate returned qty with ref qty considering field precision
2019-04-04 10:59:26 +05:30
Nabin Hait
2092a8b1cf Merge pull request #17100 from nabinhait/gl-entry-precision
fix: Validate gl entry debit/credit as per field's precision
2019-04-04 10:59:06 +05:30
Nabin Hait
6ffdddc100 Merge pull request #17126 from rmehta/warehouse-account-description
fix(kaizen): warehouse account description
2019-04-04 10:50:52 +05:30
Nabin Hait
d2c370a215 Merge pull request #17113 from deepeshgarg007/item-register
fix: Divide by zero exception handling
2019-04-04 10:49:13 +05:30
Rushabh Mehta
1f0edabda8 fix(kaizen): warehouse account description 2019-04-04 08:58:34 +05:30
Rushabh Mehta
e7b6b46309 Merge pull request #17109 from PawanMeh/fixes_16894_v11
fix: Amazon v11 integration issues
2019-04-03 22:54:43 +05:30
asbasawaraj
d2b69445b1 Removed Location from Abbreviation Update DocTypes 2019-04-03 17:05:53 +05:30
Himanshu Warekar
5ba438af80 fix: fetch payment terms 2019-04-03 16:53:19 +05:30
rohitwaghchaure
fb48686d82 Merge pull request #17118 from rohitwaghchaure/_incorrect_prezzototale
fix: incorrect PrezzoTotale
2019-04-03 16:33:56 +05:30
Rohit Waghchaure
a2f71cdeec fix: incorrect PrezzoTotale 2019-04-03 16:10:14 +05:30
Nabin Hait
b1f3f04d71 fix: Validate gl entry debit/credit as per field's precision 2019-04-03 12:30:25 +05:30
deepeshgarg007
5ad7b655cf fix: Divide by zero exception handling 2019-04-03 09:11:03 +05:30
hello@openetech.com
ea00f8cbc3 [fix] #16894 2019-04-02 14:22:23 +05:30
rohitwaghchaure
b035bf7f39 Merge pull request #17095 from rohitwaghchaure/incorrect_calculation_of_imponibile_importo
fix: incorrect calcualtion of ImponibileImporto if tax rate is zero
2019-04-01 23:14:56 +05:30
Himanshu Warekar
624477cb21 fix(India): Add HSN/SAC in setup 2019-04-01 19:25:28 +05:30
Nabin Hait
b4263a41c6 fix: Validate gl entry debit/credit as per field's precision 2019-04-01 19:11:34 +05:30
Nabin Hait
88f036a171 fix: Validate returned qty with ref qty considering field precision 2019-04-01 18:41:31 +05:30
Nabin Hait
0049986efd Merge pull request #17088 from nabinhait/hsn-fixes
fix: Fetch HSN code only if empty
2019-04-01 18:17:26 +05:30
Rohit Waghchaure
ebc2437516 fix: calcualtion of ImponibileImporto if tax rate is zero 2019-04-01 17:50:31 +05:30
Nabin Hait
51d08786dc fix: Show Sales Person in AR/AP print is optional 2019-04-01 16:24:23 +05:30
Nabin Hait
f4af608408 fix: Fetch HSN code only if empty 2019-04-01 11:51:54 +05:30
deepeshgarg007
4614eb219b Merge branch 'hotfix' of https://github.com/frappe/erpnext into payment_entry 2019-04-01 11:48:07 +05:30
Aditya Hase
b841cb2a66 fix: Raise exception if apps are on incompatible branches 2019-04-01 11:36:57 +05:30
Nabin Hait
4873875c1c Merge pull request #17038 from netchampfaris/fix-leave-application-condition
fix: Missing "and" in filter conditions
2019-04-01 11:15:36 +05:30
Nabin Hait
093f4c529b Merge pull request #17055 from deepeshgarg007/tds
fix: TDS payable monthly report fix
2019-04-01 11:12:45 +05:30
Nabin Hait
3d6b51089c Revert "fix(Salary Slip): Consider Leave without Pay for calculation (#16926)"
This reverts commit 6343a697a2.
2019-04-01 11:09:55 +05:30
Aulia Bismar
f817663f11 Renumber Aktiva, remove excess 0 2019-04-01 10:37:28 +07:00
deepeshgarg007
d0b98d74de fix: Allow doctype only in party account types 2019-03-30 19:44:31 +05:30
Nabin Hait
08319cecf5 Merge pull request #17074 from nabinhait/woocommerce-fix
fix: Woo-commerce fix
2019-03-30 19:12:38 +05:30
Nabin Hait
f9f04ed89e fix: woocommerce settings 2019-03-30 17:39:40 +05:30
Kenneth Sequeira
4f5839eb65 fixed spelling in validation message
fixed typo in auto-reorder validation message
2019-03-30 15:37:51 +05:30
Saurabh
05c8474db3 Merge branch 'hotfix' 2019-03-30 15:00:36 +05:30
Saurabh
75b4de3e20 bumped to version 11.1.18 2019-03-30 15:30:36 +06:00
rohitwaghchaure
892f675cf7 Merge pull request #17069 from frappe/revert-16950-fix-issue-credit
feat: Revert "Fix(Delivery Note): Fix issue credit note"
2019-03-30 14:25:08 +05:30
rohitwaghchaure
223bd45e06 Merge pull request #17039 from surajshetty3416/fix-bom-item-subquery-issue
fix: Subquery in get_bom_items method
2019-03-30 14:23:25 +05:30
rohitwaghchaure
f3a1fa0bae Revert "Fix(Delivery Note): Fix issue credit note" 2019-03-30 12:33:54 +05:30
rohitwaghchaure
5fdbdd50f9 Merge pull request #16950 from hrwX/fix-issue-credit
Fix(Delivery Note): Fix issue credit note
2019-03-30 12:31:18 +05:30
Himanshu
52ae923566 fix(Update GSTIN): remove '.__' from template (#17061)
'.__'  Avoid Server Side Template Injection
2019-03-30 12:11:27 +05:30
rohitwaghchaure
9d159be826 Merge pull request #17064 from rohitwaghchaure/not_able_to_create_chart_of_account
fix: user not able to create chart of account in parent if child has no chart of account
2019-03-30 10:14:19 +05:30
rohitwaghchaure
d4365e25c4 Merge pull request #17063 from scmmishra/hotfix
fix: healthcare unit type enable toggle
2019-03-30 10:13:30 +05:30
scmmishra
6f82f96816 Merge branch 'hotfix' of https://github.com/frappe/erpnext into hotfix 2019-03-29 20:05:40 +05:30
rohitwaghchaure
8dadd4b0b2 Merge pull request #17059 from rohitwaghchaure/cherry_pick_test_case_fix
fix: cherry-pick item variant test cases fix
2019-03-29 19:32:30 +05:30
Rohit Waghchaure
fd2b1385a3 fix: user not able to create chart of account in parent if child has no chart of account 2019-03-29 19:20:47 +05:30
scmmishra
29dc744354 fix: healtcare unit type enable toggle 2019-03-29 19:00:45 +05:30
Himanshu
6343a697a2 fix(Salary Slip): Consider Leave without Pay for calculation (#16926)
while net salary calculation, it was not considering actual days worked but now it will consider it
2019-03-29 18:48:56 +05:30
rohitwaghchaure
13752774ab Merge pull request #17000 from scmmishra/hotfix-task-status
fix: Task overdue status propagates to project
2019-03-29 18:44:36 +05:30
Rushabh Mehta
c4599c21c3 fix(test): item variant 2019-03-29 18:30:00 +05:30
rohitwaghchaure
fb8f1b93d6 Merge pull request #17058 from hrwX/bank_reco_fix
fix(Bank Reconciliation): get credit and debit in float and not string
2019-03-29 18:18:15 +05:30
Himanshu Warekar
f7f85f7379 fix: get credit and debit in float and not string 2019-03-29 16:19:15 +05:30
deepeshgarg007
4092ead41e fix: fetch account only if available 2019-03-29 16:19:04 +05:30
Faris Ansari
eec89ba4cb Merge branch 'hotfix' of https://github.com/frappe/erpnext into fix-leave-application-condition 2019-03-29 16:06:38 +05:30
Nabin Hait
862f77cc13 Merge branch 'deferred_revenue' into hotfix 2019-03-29 13:26:16 +05:30
Nabin Hait
66d07c2700 fix(accounts): Indentation 2019-03-29 13:25:11 +05:30
Nabin Hait
cf7538c17f Merge pull request #17046 from nabinhait/deferred_revenue
Refactor: deferred revenue booking logic
2019-03-29 12:39:36 +05:30
rohitwaghchaure
043cfe99ad Merge pull request #17051 from rohitwaghchaure/accounts_receivable_summary_issue
fix: accounts receivable summary
2019-03-29 09:28:21 +05:30
rohitwaghchaure
c268682772 Merge pull request #17048 from rohitwaghchaure/fixed_bank_reconciliation_not_working
fix: bank reconciliation not working
2019-03-29 09:27:50 +05:30
Rohit Waghchaure
9da14747aa fix: accounts receivable summary 2019-03-29 09:26:40 +05:30
Rohit Waghchaure
573d1dd31f fix: bank reconciliation not working 2019-03-28 20:39:49 +05:30
Nabin Hait
86fb523ea7 fix(accounts): codacy fixes 2019-03-28 20:06:57 +05:30
Nabin Hait
0a90ce5cf6 Refactored deferred revenue booking logic 2019-03-28 19:43:02 +05:30
Faris Ansari
f04988a02f fix: Missing "and" in filter conditions 2019-03-28 15:42:07 +05:30
Suraj Shetty
6262c9ed6a fix: Subquery in get_bom_items method 2019-03-28 14:59:27 +05:30
Saurabh
6cc9831ce9 Merge branch 'hotfix' 2019-03-28 13:51:58 +05:30
Saurabh
f2036dd1d1 bumped to version 11.1.17 2019-03-28 14:21:58 +06:00
Saurabh
1271dea39b Merge pull request #17035 from gaurav-naik/issue-17033
fix(regional,italy): autoset tax id, cf from customer before validating
2019-03-28 12:46:24 +05:30
rohitwaghchaure
89a2577ae5 Merge pull request #17032 from surajshetty3416/fix-group-same-items-in-printview
fix(print): Fix group same items for print view
2019-03-28 12:42:22 +05:30
Gaurav
bd80fd13cb fix(regional,italy): autoset company cf, tax_id before validating 2019-03-28 12:18:03 +05:30
Nabin Hait
bf5ea691cf fixed merge conflict 2019-03-28 11:35:39 +05:30
Saurabh
ea19250884 Merge pull request #16859 from rohitwaghchaure/added_new_tags_e_invoice_xml
fix: added tags for discount amount, multiple customer po no, delivery notes
2019-03-28 11:19:44 +05:30
Gaurav
010acf75fa fix(regional,italy): autoset tax id, cf from customer before validating missing values
Fixes issue #17033
2019-03-28 10:42:29 +05:30
Suraj Shetty
a7992ecb62 style: Fix formatting 2019-03-27 20:32:42 +05:30
Suraj Shetty
abc2a64d5e fix: Commonify get gl_entry code by moving it to accounts_controller 2019-03-27 20:25:18 +05:30
Sagar Vora
d20ecb0a71 fix(accounts): dependent field should be displayed after source link field 2019-03-27 17:42:42 +05:30
Rohit Waghchaure
1b7059b867 fix: ImponibileImporto calculation 2019-03-27 15:33:47 +05:30
scmmishra
2405e14dde Merge branch 'hotfix-task-status' of github.com:scmmishra/erpnext into hotfix-task-status 2019-03-27 15:02:35 +05:30
scmmishra
36824cf7fb feat: refactored update status 2019-03-27 15:01:40 +05:30
rohitwaghchaure
4510e3a836 Merge pull request #17020 from rohitwaghchaure/offline_pos_duplicate_records_making
fix: offline pos, duplicate records creating
2019-03-26 22:49:42 +05:30
Himanshu
e43b6beff0 fix(Leave Balance Report): total allocated leaves not calculated properly (#16969)
* fix: total alloted leaves not calculated properly

* fix: Possible SQL injection

* typo fix in sql query

* prevent sql injection again ?

* Use ORM for query
2019-03-26 21:42:12 +05:30
Rohit Waghchaure
22ebaf1b11 fix: added tags for discount amount, multiple customer po no, delivery notes 2019-03-26 20:19:46 +05:30
Rohit Waghchaure
1df62097f6 fix: offline pos, duplicate records creating 2019-03-26 19:15:53 +05:30
Prateeksha Singh
6d2bb9126a Merge pull request #17019 from pratu16x7/hotfix-stock_entry_from_bom
fix(uom): Get items as per UOM defined in BOM
2019-03-26 18:00:50 +05:30
Nabin Hait
411f66a177 Merge pull request #17006 from deepeshgarg007/account-fix
fix: Ignore root company validation setting in company master
2019-03-26 17:49:21 +05:30
deepeshgarg007
3eeb1cacb0 fix: Change name to Allow Account Creation against Child Company in company master 2019-03-26 17:18:06 +05:30
Prateeksha Singh
a0927c1ba6 fix: correct use of include_item_in_manufacturing 2019-03-26 16:55:13 +05:30
Nabin Hait
8aaee57921 fix(uom): Get items as per UOM defined in BOM, fixes #15081 2019-03-26 16:53:13 +05:30
deepeshgarg007
c45c2bdabb fix: Missing semicolon 2019-03-26 15:38:38 +05:30
deepeshgarg007
7aefc15352 fix: Allow to add child account if ignore validation checked 2019-03-26 15:09:29 +05:30
Raffael Meyer
fdbb516a1b fix(projects): Auto-set employee and company in Timesheet (#16743)
* fix(projects): auto-set employee and company

* only set employee and company if document is unsaved

* use frm.set_value()
2019-03-26 12:47:36 +05:30
deepeshgarg007
1c785a99b1 fix: Added setting in company to ignore root company validation 2019-03-25 22:32:29 +05:30
Faris Ansari
843b7f6dd5 fix: Reorder Currency column to fix print (#17008)
Every Financial Report's 2nd column is Currency, which is an implicit requirement to Print them properly. In this case, Income column was not printed. This fixes that.
2019-03-25 15:50:36 +05:30
rohitwaghchaure
0a03e3d30c Merge pull request #17011 from rohitwaghchaure/fix_incorrect_paid_amt_in_accounts_receivable_summary_report
fix: incorrect paid amount in accounts receivable summary report
2019-03-25 15:41:29 +05:30
Rohit Waghchaure
4ed7d035cb fix: incorrect paid amount in accounts receivable summary report 2019-03-25 15:37:25 +05:30
rohitwaghchaure
794b6b6c0d Merge pull request #17004 from surajshetty3416/fix-bank-reconciliation-entries-hotfix
fix: Show consolidated amount of payment entries in Bank reconciliation
2019-03-25 14:11:47 +05:30
Rushabh Mehta
689490e4de Merge pull request #16986 from hrwX/italy_xml_fix
fix(Italy Customisation): Include fiscal code in invoice xml if present
2019-03-25 11:57:30 +05:30
deepeshgarg007
4f9ac0ad55 fix: Child company account currency fix 2019-03-25 11:39:25 +05:30
Shivam Mishra
ec56122876 fix: minor fix in test 2019-03-25 11:36:43 +05:30
scmmishra
1af3c41da3 fix: Typo in update_status 2019-03-25 11:34:33 +05:30
Suraj Shetty
67876d1026 fix: Show amount of entry based on diff of credit and debit 2019-03-25 11:19:07 +05:30
scmmishra
f7f32634c8 feat: Added check for no end date and refactored query 2019-03-24 20:43:15 +05:30
scmmishra
6ab6d35f92 fix: Task Overdue status propagates to project
- Used ORM instead of a SQL for set_task_as_overdue
- update_status function compares the time and marks the appropriate task as overdue
- The on_update hook makes the changes in project as well
2019-03-24 18:17:13 +05:30
rohitwaghchaure
9673d0ddae fix: description missing in the XML (#16985) 2019-03-24 12:19:58 +05:30
Himanshu Warekar
92593bb717 fix: Cost center as per company 2019-03-23 19:46:31 +05:30
Frappe Bot
0f1271612a Merge branch 'hotfix' 2019-03-23 07:25:02 +00:00
Frappe Bot
021ccf572a bumped to version 11.1.16 2019-03-23 07:25:02 +00:00
Himanshu
138e030055 CodiceFiscale should be after IdFiscaleIVA 2019-03-22 23:22:52 +05:30
Saif Ur Rehman
7d1c1aa28f fix(Party Ledger Summary): Show all adjustment entries as columns
Consider only Income Account or Expense Account account type for adjustment amounts
Check if GL Entry's is_opening == "Yes"
2019-03-22 17:18:32 +05:00
Himanshu Warekar
1d04ea1212 fix: include fiscal code in invoice xml if present 2019-03-22 17:47:57 +05:30
rohitwaghchaure
56e491bccd Merge pull request #16983 from rohitwaghchaure/allow_on_submit_for_budget_fields
feat: enabled allow on submit for action fields in the Budget
2019-03-22 15:34:41 +05:30
Rushabh Mehta
d562e9530e fix(link): help link in selling 2019-03-22 14:46:12 +05:30
Rushabh Mehta
c0de5b741e fix: remove gitter chat 2019-03-22 14:32:00 +05:30
Rushabh Mehta
da87a491ab Merge pull request #16816 from finbyz/hotfix
fix: Rounding adjustment in Rounded Total
2019-03-22 12:51:09 +05:30
Rushabh Mehta
7678c7b179 Merge pull request #16869 from rohitwaghchaure/not_able_to_submit_purchase_receipt
fix: purchase receipt not able to submit because default inventory account has not selected in another company
2019-03-22 12:47:06 +05:30
Rushabh Mehta
ff04142d9b Merge pull request #16848 from alyf-de/hotfix-1
fix(projects): change fieldtype of billing amounts to Currency
2019-03-22 12:44:18 +05:30
Rushabh Mehta
7defd6f3b5 Merge pull request #16749 from Alchez/hotfix-cancelled-payments
fix(payments): Only check for Draft or Submitted payments while cancelling payment requests
2019-03-22 12:43:52 +05:30
Rushabh Mehta
199aae0fe8 Merge pull request #16861 from Anurag810/asset_fixes
fix: passing the correct argument in get_depreciation_amount
2019-03-22 12:42:46 +05:30
Rohit Waghchaure
9c214b6129 feat: enabled allow on submit for action fields in the Budget 2019-03-22 12:08:09 +05:30
Rushabh Mehta
2f9c7171fa Merge pull request #16980 from chdecultot/fec_correctioon
fix: [Regional] [FEC report] Mapping issue in sql query
2019-03-22 12:05:51 +05:30
Charles-Henri Decultot
a7cf7fbccc Fix: Mapping issue in sql query 2019-03-21 13:28:14 +00:00
Jamsheer
48e206d983 fix: Patient relation - patient link is not showing 2019-03-21 16:11:12 +05:30
Saurabh
ce8d20c489 Merge branch 'hotfix' 2019-03-20 14:33:01 +05:30
Saurabh
83cc587f8f bumped to version 11.1.15 2019-03-20 15:03:00 +06:00
rohitwaghchaure
f45db71ba2 Merge pull request #16964 from rohitwaghchaure/fix_cost_center_mapping_not_working
fix: Cost center from PO to PI is not mapping
2019-03-20 13:40:05 +05:30
Rohit Waghchaure
f288866130 fix: Cost center from PO to PI is not mapping 2019-03-20 13:34:28 +05:30
rohitwaghchaure
e521f51e5f Merge pull request #16955 from rohitwaghchaure/sales_person_showing_wrong_on_ars
fix: Accounts receivable report, remarks showing in the sales person column
2019-03-19 18:17:15 +05:30
Mangesh-Khairnar
7fc1bc0b27 fix: handle an empty match query condition in leave application (#16931) 2019-03-19 18:14:02 +05:30
Rohit Waghchaure
a322687897 fix: Accounts receivable report, remarks showing in the sales person column 2019-03-19 18:10:08 +05:30
rohitwaghchaure
40046721b2 Merge pull request #16954 from rohitwaghchaure/pos_cost_center_not_added_against_debtors
fix: POS, cost center not added against debtors
2019-03-19 16:38:07 +05:30
Rohit Waghchaure
8808a3fc8e fix: POS, cost center not added against debtors 2019-03-19 15:32:05 +05:30
rohitwaghchaure
4904ce649e Merge pull request #16952 from rohitwaghchaure/fixed_accounts_receivable_summary_advance_amt
fix: advance amount is not calculating properly
2019-03-19 15:26:41 +05:30
Rohit Waghchaure
1a6e01542a fix: advance amount is not calculating properly 2019-03-19 15:06:01 +05:30
Rushabh Mehta
1e7d768a45 Merge pull request #16951 from hrwX/change-to-supplier
fix(Supplier Ledger Summary): Change Customer to Supplier in Supplier Ledger Summary
2019-03-19 09:47:14 +05:30
Himanshu Warekar
642a5b69f5 fix: change customer to supplier 2019-03-18 21:53:33 +05:30
Himanshu Warekar
2f5f17fcbb refactor: fix issue credit note 2019-03-18 21:46:26 +05:30
Himanshu
bed6f4748e Merge pull request #6 from frappe/hotfix
Hotfix
2019-03-18 20:48:26 +05:30
rohitwaghchaure
2046024de9 Merge pull request #16942 from hrwX/invoice-creation-tool
fix(Invoice Creation Tool): Disable P/L validation for opening invoice creation
2019-03-18 15:48:55 +05:30
Himanshu
ac199580af fix(Customer Ledger): ambiguous error in where clause (#16914)
fix for error "InternalError: (1052, u"Column 'company' in where clause is ambiguous")" in Customer Ledger Summary
2019-03-18 15:44:54 +05:30
rohitwaghchaure
4c8627e88d Merge pull request #16523 from Zlash65/comp-sync
feat: Sync Chart of Accounts in Company hierarchy
2019-03-18 15:43:50 +05:30
Rohit Waghchaure
d4e4316d0b fix: test cases and codacy 2019-03-18 14:18:49 +05:30
Zlash65
01086ff60c codacy fixes 2019-03-18 12:50:29 +05:30
Zlash65
11bba571af test case added to check account syncing 2019-03-18 12:50:29 +05:30
Zlash65
cc65447e62 fix: chart of accounts field toggling improv 2019-03-18 12:50:29 +05:30
Zlash65
f71cb8dc6d fix: return if no descendants found 2019-03-18 12:50:28 +05:30
Zlash65
73acb8c837 fix: set chart of accounts based on parent company on server side 2019-03-18 12:50:28 +05:30
Zlash65
d787ef8b8e feat: sync account created for a group company to all its descendants 2019-03-18 12:50:28 +05:30
Zlash65
88c990901d fix: added validation to if account is being added to child company 2019-03-18 12:50:28 +05:30
Zlash65
0407bf1e00 fix: override primary action button, change filter to root company 2019-03-18 12:50:27 +05:30
Zlash65
2def228da8 feat: allow adding account only if topmost parent company
- hidden filter for Parent Company added
- Add button overriden with new condition
2019-03-18 12:50:27 +05:30
Zlash65
a57d58f756 feat: once company is saved, parent_company cannot be selected 2019-03-18 12:50:27 +05:30
Zlash65
1a4bfdd090 feat: selecting parent_company should disable chart_of_accounts based fields 2019-03-18 12:50:27 +05:30
Himanshu Warekar
aa03ea2a56 disbale pl check for Sales and Purchase Invoice 2019-03-18 12:36:42 +05:30
Deepesh Garg
3ead70ba3c fix: Change IBAN Account length from 25 to 30 (#16847) 2019-03-18 08:22:57 +05:30
Deepesh Garg
2ae7ed4cf0 fix: Gross profit report fix (#16935) 2019-03-17 09:49:24 +05:30
rohitwaghchaure
fd33c55760 Merge pull request #16865 from rohitwaghchaure/purchase_invoice_asset_issue_not_able_to_submit
feat: added provision to disable CWIP accounting in asset settings
2019-03-16 12:18:36 +05:30
rushin29
08a209bc52 fix: gst_state_number for address with Unregistered GST (#16798) 2019-03-15 15:28:50 +05:30
rohitwaghchaure
ef74e94374 Merge pull request #16882 from rohitwaghchaure/multiple_time_logs_in_job_card
feat: child table to add multiple time logs in job card
2019-03-15 11:46:33 +05:30
Rushabh Mehta
59a3012a5c Update payment_request.py 2019-03-15 08:57:49 +05:30
Bassam Ramadan
e14758c897 fix: add returns field to cashier closing (#16911) 2019-03-14 15:01:50 +05:30
Rushabh Mehta
947d573276 Merge pull request #16892 from hrwX/uae_fix
fix(UAE): Fetch from fix for UAE customizations
2019-03-14 14:20:32 +05:30
Rushabh Mehta
e8258fc352 Merge pull request #16854 from jay-parikh/hotfix
fix: Default Company to Total Stock Summary Report
2019-03-14 14:18:36 +05:30
Rushabh Mehta
d63e0f490c Merge pull request #16856 from hrwX/sales-work-fix
fix(Work Order): fetch item info when making work order from sales order
2019-03-14 14:17:40 +05:30
Rushabh Mehta
20af5a2b40 Merge pull request #16866 from deepeshgarg007/additional
fix: Removed relieving date validation form additional salary
2019-03-14 14:16:18 +05:30
Rohit Waghchaure
52729bf369 feat: child table to add multiple time logs in job card 2019-03-11 00:02:32 +05:30
Himanshu
ee2b523b31 Merge pull request #5 from frappe/hotfix
Hotfix
2019-03-09 00:05:50 +05:30
Himanshu Warekar
1692fbaf1c fetch from fix 2019-03-08 18:37:34 +05:30
Frappe Bot
2ae018a653 Merge branch 'hotfix' 2019-03-08 09:39:33 +00:00
Frappe Bot
3406229152 bumped to version 11.1.14 2019-03-08 09:39:32 +00:00
Rohit Waghchaure
6b33c9b934 fix: purchase receipt not able to submit because default inventory account has not selected in another company 2019-03-08 11:13:35 +05:30
Rohit Waghchaure
821a002125 feat: added provision to disable CWIP accounting in asset settings 2019-03-08 10:51:37 +05:30
Nabin Hait
9ec4816b32 Update item_barcode_childtable_migrate.py 2019-03-08 10:44:13 +05:30
deepeshgarg007
78a32ae172 fix: Remove validation for relieving date from additional salary 2019-03-07 20:00:07 +05:30
Anurag Mishra
1b0f5fd430 fix: pass correct argument to method get_deprication_amount 2019-03-07 16:17:00 +05:30
rohitwaghchaure
d4754619d0 Merge pull request #16806 from rohitwaghchaure/set_scanned_barcode_in_the_table
fix: scan barcode not adding the barcode value in the items table
2019-03-07 11:29:56 +05:30
rohitwaghchaure
d06212e408 Merge pull request #16853 from rohitwaghchaure/pos_profile_changes
fix: POS profile, account for change amount must be cash or bank account
2019-03-07 11:28:25 +05:30
Himanshu Warekar
7ab961f798 remove debug code 2019-03-06 23:53:38 +05:30
Himanshu Warekar
59699bf46e [debug] locally tests passed but travis failed 2019-03-06 23:33:03 +05:30
Himanshu Warekar
4f1737c2dd fix sales order test for creating work order from sales order 2019-03-06 22:19:15 +05:30
Himanshu Warekar
783331c645 sales_order to work_order item desc fix 2019-03-06 18:44:04 +05:30
Rohit Waghchaure
db8500c03a POS profile, account for change amount must be cash or bank account 2019-03-06 18:28:45 +05:30
Jay Parikh
9757a603fa Fix Company Default to Total Stock Summary Report 2019-03-06 12:44:41 +00:00
Rushabh Mehta
29c46bb311 fix(sales_order.py): handle zero bundle qty 2019-03-06 14:49:13 +05:30
Raffael Meyer
33d0a9f684 fix(projects): change fieldtype of billing amounts to Currency 2019-03-05 21:57:11 +01:00
Prateeksha Singh
fb491a568f Merge pull request #16842 from hrwX/additional_salary
fix(Additional Salary): Allow additional salary to be zero
2019-03-05 17:34:37 +05:30
Himanshu Warekar
acb7238ad6 Allow zero amount in additional salary 2019-03-05 12:20:19 +05:30
Rushabh Mehta
1f0792d5ea Merge pull request #16823 from jay-parikh/sales-return
fix: Python 3 Sales Invoice Return Validation "validate_pos"
2019-03-05 08:05:00 +05:30
rohitwaghchaure
55c382a780 Merge pull request #16820 from rohitwaghchaure/state_code_blank_if_not_matched_with_state_codes
fix: on save of the address, state code field become blank
2019-03-04 16:59:45 +05:30
rohitwaghchaure
f6a8b17717 Merge pull request #16824 from rohitwaghchaure/user_not_able_to_search_item_by_description
fix(sales order item): not able to search item by description
2019-03-04 16:59:19 +05:30
rohitwaghchaure
369d20ac2b Merge pull request #16829 from rohitwaghchaure/gst_purchase_invoice_hsn_number
fix: HSN code not disaplying for the GST Purchase Invoice print format
2019-03-04 16:58:58 +05:30
rohitwaghchaure
e552170ce6 Merge pull request #16704 from Anurag810/vedmata-print-formats
feat: Auditors print formats
2019-03-04 16:58:31 +05:30
rohitwaghchaure
8c96e06e19 Merge pull request #16629 from Anurag810/gross-and-net-profit-report
feat: Gross and Net Profit Report
2019-03-04 16:57:21 +05:30
Anurag Mishra
0c9945e0bf Minor fixes 2019-03-04 16:14:53 +05:30
Anurag Mishra
02138b6bfc fix: gross depends upon now report type 2019-03-04 14:46:28 +05:30
Rohit Waghchaure
9842ce5a79 fix: HSN code not disaplying for the GST Purchase Invoice print format 2019-03-04 13:39:52 +05:30
Deepesh Garg
44ff41188d fix: Selling and buying amount precision fix (#16764) 2019-03-04 12:56:27 +05:30
Deepesh Garg
40743840b7 fix: Print letter head only if checked in Print Settings (#16789)
Letter head is printed in financial statements even if option is not checked

![letter head option](https://user-images.githubusercontent.com/42651287/53430759-26baa080-3a15-11e9-948a-bc95700a18d2.png)
2019-03-04 12:53:11 +05:30
Deepesh Garg
e1f72cc010 revert: Address and contact report fix (#16786)
Reverts #16674 

Address and other info are not visible in address and contact report
![screenshot 2019-02-27 at 11 31 38 am](https://user-images.githubusercontent.com/42651287/53469309-6029f500-3a83-11e9-9672-e5e7d14dc470.png)
2019-03-04 12:49:39 +05:30
Anurag Mishra
1e4e61bd94 Minor fixes 2019-03-04 12:36:51 +05:30
Anurag Mishra
f3bdeedc68 minor fixes 2019-03-04 12:27:41 +05:30
Rohit Waghchaure
2bfb063fdb fix(sales order item): not able to search item by description 2019-03-02 21:47:55 +05:30
Jay Parikh
c2090939d7 Fix Sales Invoice Return Validation "validate_pos" 2019-03-02 12:19:32 +00:00
Rohit Waghchaure
4ef924d0ba fix: on save state code field become blank 2019-03-01 18:11:43 +05:30
Frappe Bot
9ce994a320 Merge branch 'hotfix' 2019-03-01 09:12:25 +00:00
Frappe Bot
3ec0bb7e53 bumped to version 11.1.13 2019-03-01 09:12:25 +00:00
rohitwaghchaure
066da6b1b6 Merge pull request #16817 from gaurav-naik/italy-einvoice-bank-details-fix
fix(regional,italy): bank details, custom button on sales invoice
2019-03-01 14:26:07 +05:30
rohitwaghchaure
5e71a56c7a Merge pull request #16807 from rohitwaghchaure/remove_validation_for_group_by_voucher_consolidate
fix: when General Ledger is opened from Purchase Receipt or Delivery note, user get Opening and Closing printed twice
2019-03-01 14:25:00 +05:30
Gaurav
6a4625b94c fix(regional,italy): codacy fixes in regional sales_invoice js 2019-03-01 13:58:39 +05:30
Gaurav
b30a9b1869 fix(regional,italy): bank details, custom button on sales invoice
Updates to Bank details in e-invoice XML
Additional fields on Payment Schedule
Button to Generate E-Invoice on Sales Invoice (generates and replaces attached e-invoice)
Replaced `x.decode('utf-8')` with `frappe.safe_decode(x, encoding='utf-8')` in setup.py
Updated italian localisation patch line in patches.txt
2019-03-01 12:38:35 +05:30
FinByz Tech Pvt. Ltd
6635583103 fix: Rounding adjustment in Rounded Total
In Purchase Receipt and GST Purchase Receipt report, the Rounded Total column doesn't display rounding adjustment of Base Grand Total. So, we have created a fix for that rounding adjustment.
2019-03-01 11:57:06 +05:30
Rohit Waghchaure
c21cda2790 Removed validation for group by voucher in general ledger 2019-02-28 16:20:45 +05:30
Frappe Bot
5d414af86b Merge branch 'hotfix' 2019-02-28 10:08:08 +00:00
Frappe Bot
58135976dd bumped to version 11.1.12 2019-02-28 10:08:08 +00:00
Rohit Waghchaure
ab4ff984c4 fix: scan barcode not adding the barcode value in the items table 2019-02-28 13:31:02 +05:30
rohitwaghchaure
1d41c1c2de Merge pull request #16787 from rohitwaghchaure/italian_more_fixes
fix: e-invoicing patch, patch to set country code in the address
2019-02-28 11:28:04 +05:30
rohitwaghchaure
75e17c664a Merge pull request #16797 from rohitwaghchaure/cost_update_not_working_for_price_list
fix: bom cost update is not working
2019-02-27 20:52:28 +05:30
Rohit Waghchaure
b48effebce fix: test case 2019-02-27 19:33:22 +05:30
Rohit Waghchaure
cd34c70670 fix: bom cost update is not working 2019-02-27 18:01:30 +05:30
Rohit Waghchaure
74cfe57716 fix: e-invoicing patch, patch to set country code in the address 2019-02-27 14:38:36 +05:30
Anurag Mishra
a9a1552e32 refactor 2019-02-27 14:10:24 +05:30
Rushabh Mehta
76f36f68d3 Merge pull request #16790 from crossxcell99/master
fix: call base class onload method
2019-02-27 08:31:14 +05:30
crossxcell99
f95171e808 fix: call base clase onload method 2019-02-26 18:01:37 +01:00
Sagar Vora
2ca1f135ef Merge branch 'hotfix' 2019-02-26 17:08:58 +05:30
Sagar Vora
5a14e46a1b bumped to version 11.1.11 2019-02-26 17:28:58 +05:50
Sagar Vora
311a9c79e3 fix: use node v10 for CI 2019-02-26 16:56:37 +05:30
Nabin Hait
39c489bfdc Merge pull request #16781 from deepeshgarg007/summary
fix: Make company filter mandatory in sales person wise transaction summary
2019-02-26 16:00:51 +05:30
Nabin Hait
be5124fe10 Merge pull request #16784 from rohitwaghchaure/multiple_fixes_e_invoicing
fix: multiple e-invoicing issues for italy region
2019-02-26 15:52:56 +05:30
Rohit Waghchaure
0f98cb8b83 fix: multiple e-invoicing issues for italy region 2019-02-26 15:09:27 +05:30
deepeshgarg007
d2d84e3c9d fix: Company filter fix 2019-02-26 11:52:22 +05:30
Sagar Vora
1ca2d47d35 fix: update node to version supported by Yarn (#16772) 2019-02-25 21:10:11 +05:30
Suraj Shetty
5636f924a9 fix: get mode of payment while selecting payment term in payment term template (#16765) 2019-02-25 12:43:34 +05:30
Nabin Hait
9990306399 fix: Consider only active BOMs while updating cost via BOM Update Tool (#16753) 2019-02-25 11:59:05 +05:30
Rushabh Mehta
e2de8e0fa5 fix: expense claim type (#16760) 2019-02-25 11:56:30 +05:30
Suraj Shetty
3ed3332c46 Merge pull request #16726 from deepeshgarg007/bom-item
fix: Removed duplicate fields from BOM Item
2019-02-22 10:26:29 +05:30
Suraj Shetty
2dadc1ef98 chore: Remove trailing whitespaces 2019-02-21 20:51:35 +05:30
deepeshgarg007
bf6b36a39b fix: Removed white spaces 2019-02-21 19:30:27 +05:30
deepeshgarg007
56b52d43e6 Merge branch 'hotfix' of https://github.com/frappe/erpnext into bom-item 2019-02-21 18:30:02 +05:30
Saurabh
539c77c591 Merge branch 'hotfix' 2019-02-21 18:25:28 +05:30
Saurabh
76cd402ca5 bumped to version 11.1.10 2019-02-21 18:55:28 +06:00
Saurabh
e5ff28a92c Merge pull request #16754 from deepeshgarg007/state_code
fix: State code issue fix
2019-02-21 18:21:24 +05:30
Nabin Hait
367d7c104e Merge pull request #16724 from rohitwaghchaure/user_progress_issue
fix: user progress issue
2019-02-21 18:13:52 +05:30
Saurabh
47738f9792 Merge pull request #16750 from nabinhait/cc-against-bs
fix: Ignore cost center while fetching outstanding invoices if not allowed from accounts settings
2019-02-21 18:12:06 +05:30
Nabin Hait
e08cb3a49b Merge pull request #16745 from nabinhait/manage-returned-qty
fix: Consider returned qty while making invoice from DN / PR
2019-02-21 18:11:37 +05:30
Nabin Hait
31f46b313c Merge pull request #16728 from rohitwaghchaure/maintainance_visit_issue
fix: not able to cancel maintenance visit
2019-02-21 18:10:46 +05:30
Nabin Hait
e328869b10 Merge pull request #16738 from deepeshgarg007/unique_tree_options
fix: Filter out unique values for tree options
2019-02-21 18:09:42 +05:30
Nabin Hait
e3b1b11bc5 Merge pull request #16740 from nabinhait/leave-calendar
fix: Calendar events for leaves considering user permissions
2019-02-21 18:08:19 +05:30
Saurabh
a05ccb76f4 Merge pull request #16748 from nabinhait/multi-company-serial-invoicing
fix: Validate serial no usage in invoice considering multi company transaction
2019-02-21 18:07:40 +05:30
Nabin Hait
e797ec7463 Merge pull request #16746 from deepeshgarg007/gross_profit
fix: Decimal point issue in gross profit print
2019-02-21 18:07:14 +05:30
deepeshgarg007
1915e15a9e fix: State code issue fix in regional module(Italy) 2019-02-21 17:55:57 +05:30
rohitwaghchaure
a49f59fcec Merge pull request #16751 from rohitwaghchaure/parent_value_showing_as_zero
(Profit and Loss Statement, fix): for parent account value was showing as zero
2019-02-21 17:50:51 +05:30
Nabin Hait
4ff2b0114f fix: Removed limit conditionas it does not make sense in get_outstanding function 2019-02-21 17:48:21 +05:30
Nabin Hait
e7cc6649eb fix: Limit conditions while fetching payment entries 2019-02-21 17:23:23 +05:30
Rohit Waghchaure
90691dc0d8 (Profit and Loss Statement, fix): for parent account value was showing as zero 2019-02-21 17:18:28 +05:30
Nabin Hait
b24caad789 fix: Ignore cost center while fetching outstanding invocies if not allowed from accounts settings 2019-02-21 17:11:35 +05:30
Rohan Bansal
143973166f fix(payments): Only check for Draft or Submitted paymentswhile cancelling payment requests 2019-02-21 15:57:06 +05:30
Suraj Shetty
463a3cf8cf Merge pull request #16725 from deepeshgarg007/item_dashboard
fix: Item name display issue fix in item dashboard
2019-02-21 14:42:38 +05:30
Nabin Hait
26972c954d fix: Validate serial no usage in invoice considering multi company transaction 2019-02-21 14:32:41 +05:30
deepeshgarg007
14ff6bfc32 fix: Decimal point issue in gross profit print 2019-02-21 12:08:32 +05:30
Nabin Hait
816a4655a0 fix: Consider returned qty while making invoice from DN / PR 2019-02-21 12:02:36 +05:30
Nabin Hait
40c15d2e74 fix: Calendar events for leaves considering user permissions 2019-02-20 18:55:38 +05:30
Saurabh
bc3bdd77f6 Merge branch 'hotfix' 2019-02-20 18:14:17 +05:30
Saurabh
ada93e5d77 bumped to version 11.1.9 2019-02-20 18:44:17 +06:00
deepeshgarg007
0d64d622e5 fix: filter only unique values for tree options 2019-02-20 17:55:14 +05:30
rohitwaghchaure
485bd93dae Merge pull request #16737 from saurabh6790/indentation_fixes
fix: reload report doc and indentation fixes
2019-02-20 17:40:50 +05:30
rohitwaghchaure
c18e925d61 fix: Moved regional methods from controller to hooks (#16736) 2019-02-20 17:13:15 +05:30
Saurabh
9fcfc63f77 fix: reload report doc and indentation fixes 2019-02-20 17:04:18 +05:30
rohitwaghchaure
ef3f864123 fix: not able to submit purchase order (#16735) 2019-02-20 15:47:06 +05:30
rohitwaghchaure
e141865c43 Merge pull request #16722 from rohitwaghchaure/stop_button_not_working
fix: stop button not working in material request
2019-02-20 12:30:26 +05:30
Sagar Vora
c09ffe1308 Merge branch 'hotfix' 2019-02-20 12:11:25 +05:30
Sagar Vora
d48393541d bumped to version 11.1.8 2019-02-20 12:31:25 +05:50
Gaurav Naik
3bf0acbac6 fix(regional,italy): renamed validate hook for address (#16732) 2019-02-20 12:08:53 +05:30
Rohit Waghchaure
7e02e1c3cd fix: not able to cancel maintenance visit 2019-02-19 22:53:31 +05:30
deepeshgarg007
1b04534095 fix: Removed duplicate fields from BOM Item 2019-02-19 21:36:12 +05:30
deepeshgarg007
942c894f93 fix: fetch item name in item dashboard 2019-02-19 19:51:23 +05:30
Rohit Waghchaure
f4049f9dfd fix: user progress issue 2019-02-19 19:46:14 +05:30
Rohit Waghchaure
389cd6ad63 fix: stop button not working in material request 2019-02-19 19:18:07 +05:30
Sagar Vora
2b7ce3dc71 Merge branch 'hotfix' 2019-02-19 17:54:14 +05:30
Sagar Vora
f5c511c193 bumped to version 11.1.7 2019-02-19 18:14:14 +05:50
Nabin Hait
2c23f98b65 Merge pull request #16721 from nabinhait/ar-ap-fix
fix: AR/AP report based on account type
2019-02-19 17:45:30 +05:30
Nabin Hait
06e6e87e3b Merge pull request #16720 from gaurav-naik/italy-state-codes
fix(regional,italy): added state code on address, updated patch
2019-02-19 17:44:49 +05:30
Gaurav
3f046136d4 fix(regional,italy): added state code on address, updated patch
moved state codes to init, rewired patch
added logic to autoset state code on address validate
handled multiple names for Italy
refactored validate_address_italy to validate_address
2019-02-19 17:28:36 +05:30
Nabin Hait
e4f73929c4 fix: AR/AP report based on account type 2019-02-19 17:11:50 +05:30
Charles-Henri Decultot
4d19d344b6 Merge branch 'hotfix' into plaid_reconciliation 2019-02-19 11:05:00 +00:00
Nabin Hait
ff6d2692d3 Merge pull request #16663 from netchampfaris/fix-item-variant-settings-barcodes
fix: Validate invalid fields in Item Variant Settings
2019-02-19 15:07:55 +05:30
Nabin Hait
8e9d947527 Merge branch 'hotfix' into fix-item-variant-settings-barcodes 2019-02-19 15:07:46 +05:30
Nabin Hait
21706894af Merge pull request #16705 from deepeshgarg007/pos-precision
fix: Fetch precision form system settings in Sales invoice payment(POS)
2019-02-19 15:06:56 +05:30
Nabin Hait
2c65ef0286 Merge pull request #16710 from deepeshgarg007/purchase-qty-fix
Received Qty Label rename to accepted qty in purchase invoice
2019-02-19 15:06:18 +05:30
Nabin Hait
818ead4041 Merge branch 'hotfix' into purchase-qty-fix 2019-02-19 15:06:10 +05:30
Nabin Hait
157526c978 Merge pull request #16711 from rohitwaghchaure/multi_uom_not_working_for_rate_pricing_rule
fix: multi-uom not working for the pricing rule rate
2019-02-19 15:05:07 +05:30
Nabin Hait
6bd3098824 Merge pull request #16716 from deepeshgarg007/precision-fix
fix: Removed precision from multiple doctypes
2019-02-19 15:03:00 +05:30
rohitwaghchaure
e938306e7d Merge pull request #16598 from gaurav-naik/italy-hotfix-new
feat(regional): Italian Localization and E-Invoicing export
2019-02-19 14:56:07 +05:30
Gaurav
2670ad7eb2 mod(regional,italy): adjusted calculation logic for charges
validation for missing code on mode of payment
UOM from settings
Replace str with cstr
2019-02-19 13:15:25 +05:30
Gaurav
f1e28e0e8d mod(regional,italy): Updates to Italian Localization
fixes:
removed cleanup_files from italy/utils
removed extract_doc_number from italy/utils
added country filter to italian localization patch
replaced dict assignment with dot operator in prepare_invoice
correcions in e-invoice xml following changes in prepare_invoice
added setup_report in patch
added section for e-invoicing custom fields in company
added Italy in test_company
2019-02-19 10:39:22 +05:30
Gaurav
a4aa80fe05 feature(regional): Italian Localization
Added setup.py for italy under regional
Included fiscal regimes, tax exemption reasons and custom fields

Issue #16259
2019-02-19 10:39:10 +05:30
deepeshgarg007
de0f59b818 fix: Removed precision from multiple doctypes 2019-02-19 08:40:16 +05:30
Rohit Waghchaure
5821b672ad fix: multi-uom not working for the pricing rule rate 2019-02-18 20:07:44 +05:30
Nabin Hait
750fe6eaea fix: get item rate in bom 2019-02-18 18:56:08 +05:30
rohitwaghchaure
982ed555d2 Merge pull request #16708 from rohitwaghchaure/allow_to_make_sle_if_jc_is_in_draft
fix: Allow to make material request from draft job card
2019-02-18 18:46:11 +05:30
deepeshgarg007
9a19e06856 fix: Change Received qty to accepted qty and validation for indicators 2019-02-18 18:42:15 +05:30
Rohit Waghchaure
99e7362006 fix: Allow to make material request from draft job card 2019-02-18 18:26:50 +05:30
deepeshgarg007
48a7262fae fix: Precision issue in POS payment 2019-02-18 15:05:36 +05:30
Anurag Mishra
879e5fd8bb remove print and codacy 2019-02-18 14:43:55 +05:30
Anurag Mishra
42a106c7ba Auditors print formats 2019-02-18 14:35:33 +05:30
rohitwaghchaure
1bcbe9069b Merge pull request #16610 from jay-parikh/hotfix
fix: (POS) Item listing issue in pos after submit for Multi Company POS Profile
2019-02-18 12:43:57 +05:30
Anurag Mishra
61f981ae05 Changes Requested 2019-02-18 11:43:32 +05:30
Rushabh Mehta
f3b33f3ab2 Merge pull request #16611 from karthikeyan5/hotfix-marketplace-features
feat(marketplace): seller profile page
2019-02-18 11:24:01 +05:30
Rushabh Mehta
c8e05206cc Merge pull request #16695 from surajshetty3416/remove-unwanted-barcode-field
fix: Remove unwanted barcode field
2019-02-18 11:18:53 +05:30
Suraj Shetty
053d6a2ca1 Move reload doc before get query 2019-02-17 11:24:51 +05:30
Suraj Shetty
3a2f342ac1 Ignore duplicate entry 2019-02-16 21:09:24 +05:30
Suraj Shetty
1399fbe986 Move patch 2019-02-16 21:02:34 +05:30
Suraj Shetty
8cbe824c5b Rerun item_barcode_chidtable_migrate patch 2019-02-16 17:54:15 +05:30
Suraj Shetty
cc0222a28a Remove unwanted barcode field from item 2019-02-16 17:53:23 +05:30
Frappe Bot
58dda68430 Merge branch 'hotfix' 2019-02-15 10:22:32 +00:00
Frappe Bot
acf26c8569 bumped to version 11.1.6 2019-02-15 10:22:32 +00:00
Faris Ansari
8a01342e48 fix: Remove comment 2019-02-15 15:14:38 +05:30
Nabin Hait
09a4df74f0 Merge pull request #16645 from nabinhait/tds-fix
fix: Ignore tds account while creating tax withholding category
2019-02-15 14:53:30 +05:30
Nabin Hait
eb0627356b Merge pull request #16650 from nabinhait/general-ledger-fix
fix: show values in account/party currency based in actual entry, no conversion
2019-02-15 14:53:12 +05:30
Nabin Hait
b5c249583a Merge pull request #16651 from netchampfaris/fix-barcode-scanning-ux
fix: Barcode scanning UX
2019-02-15 14:52:42 +05:30
Nabin Hait
b819f104e6 Merge pull request #16653 from nabinhait/item-variants
fix: Enqueued item variants updation if there are more than 30 variants
2019-02-15 14:51:14 +05:30
Nabin Hait
c45962e3ef Merge pull request #16675 from deepeshgarg007/purchase-fix
fix: Purchase order item description fix
2019-02-15 14:50:38 +05:30
Nabin Hait
aa80a223d8 Merge pull request #16674 from deepeshgarg007/address-rep-fix
fix: Address and contact report
2019-02-15 14:26:16 +05:30
Nabin Hait
8788a5c712 Merge pull request #16676 from nabinhait/get-item-details
fix: get item details
2019-02-15 14:24:46 +05:30
Nabin Hait
b1cbe221b7 Merge pull request #16677 from nabinhait/total-qty-patch-fix
fix: Consider parenttype while updating total qty in transactions
2019-02-15 14:24:30 +05:30
Nabin Hait
a0c9c7501b Update update_total_qty_field.py 2019-02-15 14:24:08 +05:30
Nabin Hait
9d85876086 Merge pull request #16679 from nabinhait/get_oustanding
Get outstanding invoices
2019-02-15 14:23:07 +05:30
Sagar Vora
379e6a4635 Merge branch 'hotfix' into address-rep-fix 2019-02-15 13:08:42 +05:30
Nabin Hait
4df7679c65 fix: Get outstanding invoices 2019-02-15 13:08:04 +05:30
Sagar Vora
ebdd8a9710 Merge branch 'hotfix' into purchase-fix 2019-02-15 13:04:32 +05:30
Sagar Vora
921f468950 Merge branch 'hotfix' into get-item-details 2019-02-15 13:03:04 +05:30
Nabin Hait
6f7a4d94ce fix: Consider parenttype while updating total qty in transactions 2019-02-14 19:34:43 +05:30
Nabin Hait
f66c6874ca Merge pull request #16652 from nabinhait/work-order-fix
fix: Make work order from production plan considering already ordered qty
2019-02-14 18:50:30 +05:30
Nabin Hait
54f8ed1282 Merge branch 'hotfix' into item-variants 2019-02-14 18:50:11 +05:30
Nabin Hait
c3698e458f Merge pull request #16666 from nabinhait/deferred-revenue-fix
fix: errors in deferred revenue booking
2019-02-14 18:49:01 +05:30
Nabin Hait
1c6a1dd5c0 Merge branch 'hotfix' into general-ledger-fix 2019-02-14 18:37:40 +05:30
Nabin Hait
0d1ccc357f fix: get item details 2019-02-14 18:30:10 +05:30
deepeshgarg007
867ca63750 fix: Purchase order item description fix 2019-02-14 18:10:47 +05:30
Deepesh Garg
20008946a3 Merge branch 'hotfix' into address-rep-fix 2019-02-14 17:37:41 +05:30
Deepesh Garg
4902f7b2a0 fix: Show tasks in timesheet with status as Closed (#16660) 2019-02-14 17:32:52 +05:30
deepeshgarg007
34f4f24e21 fix: Address and contact report 2019-02-14 17:26:49 +05:30
Nabin Hait
29fcb14c42 fix: errors in deferred revenue booking 2019-02-13 17:18:12 +05:30
Deepesh Garg
4d1bc0ca85 fix: Add total row in analytics report (#16648) 2019-02-13 16:58:46 +05:30
Anurag Mishra
4f0fd38209 refractor 2019-02-13 16:46:05 +05:30
Faris Ansari
a748ca69e7 fix: Validate invalid fields in Item Variant Settings
- Some fields like barcodes cannot be copied in Item Variants
- Wrote a patch that deletes the fields if they exist
- Also, validate in controller
2019-02-13 13:02:39 +05:30
rohitwaghchaure
a0aaeafae8 Merge pull request #16644 from rohitwaghchaure/fix_work_order_time_log_msg
fix: validation message for work order
2019-02-13 09:49:25 +05:30
Faris Ansari
795102125c Merge branch 'hotfix' into fix-barcode-scanning-ux 2019-02-12 18:31:06 +05:30
Nabin Hait
db527bfb24 fix: Enqueued item variants updation if there are more than 30 variants 2019-02-12 18:30:00 +05:30
Nabin Hait
1a3c27bbea fix: Make work order from production plan considering already ordered qty 2019-02-12 17:38:37 +05:30
Faris Ansari
5631ffca68 fix: Barcode scanning UX 2019-02-12 17:12:48 +05:30
Nabin Hait
6447069e50 fix: show values in account/party currency based in actual entry, no conversion 2019-02-12 16:41:20 +05:30
Sagar Vora
e11f2c0107 Merge branch 'hotfix' 2019-02-12 16:34:29 +05:30
Sagar Vora
6837ae3377 bumped to version 11.1.5 2019-02-12 16:54:29 +05:50
karthikeyan5
4324dc6ea8 fix(marketplace): fixing hubmarket server specific error 2019-02-12 15:12:23 +05:30
karthikeyan5
4df6003bd9 feat(marketplace): seller profile page 2019-02-12 15:12:23 +05:30
karthikeyan5
2894f7935a feat(marketplace): featured Items for sellers 2019-02-12 15:12:23 +05:30
karthikeyan5
88baf53cc1 feat(marketplace): navigation link to seller profile from item page 2019-02-12 15:12:23 +05:30
Nabin Hait
fdefbdb23b Merge pull request #16609 from nabinhait/multipel_fixes
Multiple fixes
2019-02-12 13:56:06 +05:30
Nabin Hait
c46d995480 Merge pull request #16628 from Zlash65/fix-noti-patch
fix: Notification Control delete
2019-02-12 13:04:45 +05:30
Nabin Hait
e6abee4bd5 Merge pull request #16643 from Zlash65/field-fix
fix: Fieldtype and Fetch From fixes
2019-02-12 13:04:00 +05:30
Nabin Hait
ca536efe7b Merge pull request #16640 from nabinhait/pur_reg_fix
fix: show project even if PI is directly created
2019-02-12 13:01:18 +05:30
Deepesh Garg
da7c20e474 fix: Validate task dates in project (#16586)
* fix: Validate task dates in project

* fix: Test case fix and validation only if date exists

* fix: Added dates in error messages
2019-02-12 12:55:50 +05:30
Rohit Waghchaure
e0412a177c fix: validation message for work order 2019-02-12 11:47:16 +05:30
Zlash65
fc88029d7d fix: fix item field for clinical procedure template 2019-02-12 11:38:27 +05:30
Zlash65
b614fb1d45 fix: make finance book field as link field and rectify fetch_from 2019-02-12 11:30:58 +05:30
Nabin Hait
afef9c1cc7 fix: Ignore tds account while creating tax withholding category 2019-02-12 11:28:20 +05:30
Zlash65
fd3998cfc9 fix: make branch as link field 2019-02-12 11:27:23 +05:30
Nabin Hait
ab50211e18 fix: show project even if PI is directly created 2019-02-11 18:25:18 +05:30
Anurag Mishra
aaa57026ac Merge branch 'gross-and-net-profit-report' of https://github.com/Anurag810/erpnext into gross-and-net-profit-report 2019-02-11 17:02:59 +05:30
Anurag Mishra
f70d4089bc fix: codacy 2019-02-11 17:02:20 +05:30
Sagar Vora
4e92414850 Merge branch 'hotfix' into gross-and-net-profit-report 2019-02-11 16:00:28 +05:30
sahil28297
1a7e438fb2 fix(pstch): allow duplicate entries (#16632) 2019-02-11 15:53:04 +05:30
rohitwaghchaure
d95c8cfac3 Merge pull request #16621 from netchampfaris/fix-warehouse-currency
fix: Set company_currency for Warehouse Tree
2019-02-11 14:58:02 +05:30
Anurag Mishra
a032f0528e new report gross-and-net-profit-report 2019-02-11 13:12:44 +05:30
Zlash65
a206f06af9 delete notification control's docctype entry 2019-02-11 12:01:01 +05:30
Nabin Hait
bb6438af5a Merge pull request #16537 from nabinhait/stock-balance-fix
fix: Fixed error on stock balance report
2019-02-11 11:00:01 +05:30
Faris Ansari
453964728d fix: Set company_currency for Warehouse Tree 2019-02-09 20:27:42 +05:30
Nabin Hait
17e0513270 fix: message if stock reco is enqueued 2019-02-08 16:56:26 +05:30
Nabin Hait
8d4bb3e327 fix: backflush only if transferred item is present in work order 2019-02-08 16:56:26 +05:30
Nabin Hait
450fe309d6 fix: allow updating title of material request 2019-02-08 16:56:26 +05:30
Nabin Hait
e3b0f4f9f6 fix: removed account type filter on employee advance account 2019-02-08 16:56:26 +05:30
Nabin Hait
27af6b377f fix: defered accounting fixes 2019-02-08 16:56:26 +05:30
Jay Parikh
1906f6da3a Fix - POS >> Item listing after submit pos >> list all the items which are not restricted to that pos profile #16588 2019-02-08 11:13:09 +00:00
Faris Ansari
504f317434 fix: BOM Stock Calculated Report (#16585)
- Cast null values to 0 to avoid mathematic errors
2019-02-07 07:15:38 +05:30
Faris Ansari
8ae5dbcac8 fix: Set barcode in Item row after scanning barcode (#16591) 2019-02-07 07:09:49 +05:30
Himanshu
088886e082 Remove illegal character after break (#16589) 2019-02-07 07:09:20 +05:30
Himanshu
e7bc2beea0 Remove illegal character after break 2019-02-06 15:55:49 +05:30
Himanshu
cd416a3135 Merge pull request #4 from frappe/hotfix
Hotfix
2019-02-06 15:54:33 +05:30
Sagar Vora
76120309e3 Merge branch 'hotfix' 2019-02-05 18:40:38 +05:30
Sagar Vora
8aa34a0ce0 bumped to version 11.1.4 2019-02-05 19:00:38 +05:50
Prateeksha Singh
34df5d27a1 Merge pull request #16518 from karthikeyan5/staging-marketplace-features
fix(marketplace): bug in filtering menu_items
2019-02-05 18:09:57 +05:30
karthikeyan5
4cb0a250a0 fix(marketplace): bug in filtering menu_items
> UX improvment for incomplete feature
2019-02-05 18:07:48 +05:30
Nabin Hait
efff826e15 Merge pull request #16556 from nabinhait/payroll-cost-center
fix: Don't force fetch cost center from company in payroll entry
2019-02-05 13:32:16 +05:30
Nabin Hait
8a46df5c4b Removed duplicate fields 2019-02-05 13:31:32 +05:30
Nabin Hait
38b05a1296 fix: Set default cost center in payroll entry 2019-02-05 10:46:41 +05:30
Nabin Hait
294319e71b fix: Don't force fetch cost center from company in payroll entry 2019-02-05 10:37:41 +05:30
Nabin Hait
ad69e29334 Merge pull request #16548 from nabinhait/stock-balance-item
fix: Fetch data based on item group filter in item dashboard stock balance report
2019-02-05 10:36:47 +05:30
Nabin Hait
1c288ca4ab Merge pull request #16558 from deepeshgarg007/production_plan
fix: Validation while getting raw materials for production in Production Plan
2019-02-05 10:35:16 +05:30
Nabin Hait
fe6f1ad244 Update production_plan.py 2019-02-05 10:34:58 +05:30
Nabin Hait
d4e029665c Merge pull request #16569 from nabinhait/salary-allow-on-submit
fix: Allow-on-submit enabled for formula and condition in salary structure
2019-02-05 10:31:24 +05:30
Nabin Hait
b6d2c7eb80 Merge pull request #16570 from saurabh6790/jinja_injection_fix
fix: access request parameter directly
2019-02-05 10:31:08 +05:30
Nabin Hait
7b93e738ad Merge pull request #16576 from nabinhait/pay_reco_fix
fix: Optimising payment reconciliation queries
2019-02-05 10:28:03 +05:30
Nabin Hait
025e780f31 Merge pull request #16575 from rohitwaghchaure/fixed_job_card_not_working
fix: job card not working if transfer against work order
2019-02-05 10:27:12 +05:30
Nabin Hait
56bff95e15 Merge pull request #16571 from Thunderbottom/purchase-invoice-fix
fix(purchase_invoice): fix undefined variable
2019-02-05 10:26:41 +05:30
Nabin Hait
ac18498ca5 fix: Optimising payment reconciliation queries 2019-02-04 21:13:43 +05:30
Rohit Waghchaure
780c6b0d77 fix: job card not working if transfer against work order 2019-02-04 21:04:48 +05:30
Chinmay Pai
125505f2aa fix(purchase_invoice): fix undefined variable
fixes issue while creating purchase invoice

Signed-off-by: Chinmay Pai <chinmaydpai@gmail.com>
2019-02-04 16:30:20 +05:30
Saurabh
bbebceb31a fix: access request parameter directly 2019-02-04 15:56:23 +05:30
Nabin Hait
ff05ee50e0 fix: Allow-on-submit enabled for formula and condition in salary structure 2019-02-04 14:42:57 +05:30
Deepesh Garg
d442d06947 Update production_plan.py 2019-02-03 12:45:20 +05:30
dgarg007
f667cff5a6 fix: Validation while getting raw materils for production in Production Plan 2019-02-02 21:57:00 +05:30
rohitwaghchaure
752f2f1805 Merge pull request #16547 from rohitwaghchaure/project_status_email_fix
fix: check open status projects for project status update
2019-02-02 13:06:29 +05:30
Saurabh
aba611e09f Merge branch 'hotfix' into project_status_email_fix 2019-02-01 15:01:26 +05:30
Nabin Hait
e1c75a9d55 fix: fixed salary structure assignment patch (#16546)
* fix: fixed salary structure assignment patch

* fix: patch
2019-02-01 12:25:40 +05:30
Nabin Hait
f3f4ce9b87 fix: Fetch data based on item group filter in item dashboard stock balance report 2019-02-01 12:01:19 +05:30
Rohit Waghchaure
a4645b6d17 fix: check open status projects for project status update 2019-02-01 11:37:22 +05:30
Sagar Vora
ec5faaeae6 Merge branch 'hotfix' into stock-balance-fix 2019-01-31 18:46:06 +05:30
Nabin Hait
9ea19b8fe1 fix: Fixed error on stock balance report 2019-01-31 15:53:25 +05:30
Sagar Vora
7a2163ca39 Merge branch 'hotfix' 2019-01-31 13:33:07 +05:30
Sagar Vora
fea55fc018 bumped to version 11.1.3 2019-01-31 13:53:07 +05:50
Nabin Hait
a85f008f30 Merge pull request #16528 from adityahase/payment-request-usability
fix(accounts): fetch subscription details only if required fields are populated
2019-01-31 10:27:27 +05:30
Sagar Vora
7ea2497b9a Fix salary patch (#16531)
fix: salary structure assignment patch, add .vscode to gitignore
2019-01-31 09:17:29 +05:30
Sagar Vora
76728b87ab fix: value missing for selling settings - sales_update_frequency (#16530) 2019-01-31 08:19:38 +05:30
Sagar Vora
38384be42b Merge branch 'hotfix' 2019-01-30 20:09:45 +05:30
Sagar Vora
664e21acbf bumped to version 11.1.2 2019-01-30 20:29:45 +05:50
Aditya Hase
245b73b94f fix(search): Fix possible reflected XSS attack vector (#16522) 2019-01-30 19:56:04 +05:30
Aditya Hase
66833f109b fix(accounts): fetch subscription details only if required fields are populated 2019-01-30 19:40:40 +05:30
Nabin Hait
78fc158b39 Merge pull request #16527 from nabinhait/bom-fix
fix: Default value for 'raw materials rate based on' in BOM
2019-01-30 18:35:49 +05:30
Saurabh
429996752d fix: patch fixes (#16524) 2019-01-30 17:45:48 +05:30
Nabin Hait
16d7b49d73 fix: Default value for 'raw materials rate based on' in BOM 2019-01-30 17:27:08 +05:30
Saurabh
5fdcd91847 Merge branch 'hotfix' 2019-01-30 12:38:00 +05:30
Saurabh
bb2031941e bumped to version 11.1.1 2019-01-30 13:08:00 +06:00
Nabin Hait
562516dcc4 Merge pull request #16521 from saurabh6790/add_patch_to_set_guardian_role
fix: patch to add guardian role if not exists
2019-01-30 12:00:00 +05:30
Saurabh
5c12490709 fix: patch to add guardian role if not exists 2019-01-30 11:52:53 +05:30
rohitwaghchaure
25e63e806c fix: modified date (#16520) 2019-01-30 11:46:34 +05:30
Sagar Vora
7ddbd386a5 Merge branch 'master' into hotfix 2019-01-29 18:56:45 +05:30
Sagar Vora
1c44a6a0ba fix: set version to 11.1.0, remove staging_version 2019-01-29 18:52:50 +05:30
Sagar Vora
605fbf4f89 Merge branch 'staging' 2019-01-29 18:51:12 +05:30
Sagar Vora
3f1fb9ca7e Merge branch 'staging-fixes' into staging 2019-01-29 18:26:34 +05:30
Sagar Vora
1a4cd3b66a bumped to version 11.1.0 2019-01-29 18:46:34 +05:50
Sagar Vora
606bd37316 fix: change changelog version to 11.1.0 2019-01-29 17:55:46 +05:30
Sagar Vora
b5dda63ddd fix: change changelog version to 11.1.0 2019-01-29 17:54:47 +05:30
Sagar Vora
51a27b3524 fix: unsaved merge conflict 2019-01-29 17:52:47 +05:30
Sagar Vora
f3cfad7595 Merge branch 'master' into staging-fixes 2019-01-29 17:20:46 +05:30
Sagar Vora
898977bda8 Merge branch 'hotfix' 2019-01-29 17:10:19 +05:30
Sagar Vora
b32d9458b5 bumped to version 10.1.81 2019-01-29 17:30:19 +05:50
Nabin Hait
f8e9734f16 Merge pull request #16514 from sagarvora/changelog
docs: changelog for v11.0.4
2019-01-29 16:27:07 +05:30
rohitwaghchaure
a95ed44d3d fix: test case for fiscal year (#16516) 2019-01-29 16:24:53 +05:30
Nabin Hait
9f33c208d7 Update v11_0_4.md 2019-01-29 16:07:07 +05:30
Sagar Vora
bad36ef3ef fix: add node_modules to gitignore (#16515) 2019-01-29 16:00:45 +05:30
Sagar Vora
7ef69b68f8 Update v11_0_4.md 2019-01-29 15:52:57 +05:30
Nabin Hait
cc41b876fb Merge pull request #16497 from nabinhait/bom_price
BOM raw materials price
2019-01-29 14:58:40 +05:30
Nabin Hait
49c1f023b1 Merge pull request #16507 from rohitwaghchaure/fiscal_year_should_always_be_for_12_months
fix: fiscal year should always be for 12 months
2019-01-29 14:44:43 +05:30
Sagar Vora
115a252f55 docs: changelog for v11.0.4 2019-01-29 14:40:10 +05:30
Nabin Hait
4e45663297 fix(stock): get item price based on party 2019-01-29 14:02:08 +05:30
Sagar Vora
8f6509fa9a Merge branch 'staging-fixes' into fiscal_year_should_always_be_for_12_months 2019-01-29 13:04:20 +05:30
Sagar Vora
9520e345bd fix: better error messages 2019-01-29 13:03:46 +05:30
Nabin Hait
1df9a23e7b Merge pull request #16513 from rohitwaghchaure/remove_zero_qty_items_on_click_os_pay
feat: on click of pay button and on focus out of qty field remove the zero qty items from the cart
2019-01-29 13:02:56 +05:30
Rohit Waghchaure
07f75a3e54 feat: on click of pay button and on focus out of qty field remove the zero qty items from the cart 2019-01-29 13:00:18 +05:30
Rohit Waghchaure
a8e743e3c4 fix: fiscal year always be for 12 months 2019-01-29 12:55:04 +05:30
Nabin Hait
6f7cc8b186 Merge pull request #16505 from deepeshgarg007/pos_issue
feat: Enhancement  in POS functionality
2019-01-29 12:51:00 +05:30
Nabin Hait
25cb13c0f8 Merge pull request #16508 from navdeepghai1/salary-slip-net-pay-fixes
fix(human resources): gross pay calculation issue
2019-01-29 12:08:11 +05:30
Nabin Hait
7fc9825954 Merge pull request #16368 from ESS-LLP/pr_staging_fixes_2
feat: List Active Healthcare Practitioner
2019-01-29 11:52:55 +05:30
Nabin Hait
8ba9545b72 Merge pull request #16498 from nabinhait/stock-ledger-report
fix(stock): Escaping issue in stock ledger report
2019-01-29 11:30:15 +05:30
Deepesh Garg
a8cc4b105d Merge branch 'staging-fixes' into pos_issue 2019-01-29 11:29:41 +05:30
Nabin Hait
3b8623e207 Merge pull request #16491 from adityahase/ar-fix
fix(ar-summary): Changes to column list to match recent changes
2019-01-29 11:28:02 +05:30
Nabin Hait
1467962f8a Merge pull request #16490 from nabinhait/gst_settings_perm
GST Settings permission and regional taxes creation
2019-01-29 11:27:18 +05:30
Nabin Hait
ff2922cbbb Merge pull request #16488 from deepeshgarg007/price_list
fix(sales_invoice): fetch customer price list if available before pos price list
2019-01-29 11:24:22 +05:30
Nabin Hait
7c0fbfab0a Merge pull request #16482 from pipech/staging-fixes
fix(Stock Entry): "Select Serial Numbers" dialog won't fill mandatory field
2019-01-29 11:23:05 +05:30
Nabin Hait
3ccc16e4e0 Merge pull request #16449 from scmmishra/remove-foundation
feat: Deprecated In App Help
2019-01-29 11:20:23 +05:30
Nabin Hait
0bfd990ada Merge pull request #16456 from adityahase/unicode
fix(unicode): Import unicode_literals in every file
2019-01-29 11:13:30 +05:30
Nabin Hait
e8190473f5 Merge branch 'staging-fixes' into unicode 2019-01-29 11:13:04 +05:30
Nabin Hait
1c5d681f65 Merge pull request #16500 from scmmishra/v10-remove-docs
feat: [v10] Deprecate In App Help
2019-01-29 11:05:25 +05:30
Nabin Hait
8fae0b3017 Merge pull request #16242 from rohitwaghchaure/is_fixed_asset_checkbox_not_copied
[Fix] Is fixed asset checkbox not checked if user duplicate the existing invoice
2019-01-29 11:03:44 +05:30
Nabin Hait
57928a5382 Merge pull request #16468 from sagarvora/fix-scorecard
fix(buying): make supplier scorecard usable
2019-01-29 11:00:18 +05:30
Nabin Hait
b44b200e7c Merge branch 'hotfix' into fix-scorecard 2019-01-29 11:00:07 +05:30
Aditya Hase
9acb885e60 fix(sqli): Avoid SQL Injection with sender param (#16509) 2019-01-29 10:52:37 +05:30
Navdeep Ghai
ec570026e1 Merge branch 'hotfix' into salary-slip-net-pay-fixes 2019-01-29 09:12:37 +04:00
Nabin Hait
385e3bb284 Merge pull request #16446 from Zlash65/jv-fix
fix(accounts): wrong filters sent to fetch reference name in Journal Entry
2019-01-29 10:41:15 +05:30
navdeepghai1
92bb84aa70 Changed static precision(2) value to system setting currency_precision value 2019-01-28 16:54:58 +04:00
deepeshgarg007
f0cfe98860 fix: Added missing semicolon and removed null from parameter 2019-01-28 17:58:44 +05:30
deepeshgarg007
0bee62b460 fix: Made period fields read only and added validation for multiple entries by same user 2019-01-28 12:45:11 +05:30
Sagar Vora
a1a946fcd6 Merge branch 'hotfix' into fix-scorecard 2019-01-28 12:20:55 +05:30
navdeepghai1
aac404a155 Fixed net_pay calculation issue 2019-01-28 10:42:16 +04:00
deepeshgarg007
4e4b200972 Merge branch 'staging-fixes' of https://github.com/frappe/erpnext into pos_issue 2019-01-27 22:54:34 +05:30
deepeshgarg007
c2ffcc5e71 feat(POS): Customer wise price list in offline mode and enhancement in POS closing voucher 2019-01-27 16:09:07 +05:30
scmmishra
1b63fa1920 [fix] Formatting issues 2019-01-25 20:45:04 +05:30
scmmishra
e1f5d22a02 [fix] Code formatting, removed trailing spaces 2019-01-25 20:45:04 +05:30
scmmishra
000e216354 [feat] Added docsUrl variable to configure help_links 2019-01-25 20:44:45 +05:30
scmmishra
0be2aa33ac [fix] Links now redirect to erpnext.com 2019-01-25 20:41:54 +05:30
scmmishra
c6c1628c8a [feat] Modified help config 2019-01-25 20:41:54 +05:30
Nabin Hait
1187d61b56 fix(stock): Escaping issue in stock ledger report 2019-01-25 17:07:29 +05:30
deepeshgarg007
76556e1a3e Merge branch 'staging-fixes' of https://github.com/frappe/erpnext into price_list 2019-01-25 16:50:06 +05:30
deepeshgarg007
8c84b7b888 fix: Doctype Name correction 2019-01-25 16:44:45 +05:30
deepeshgarg007
49cca7ac76 fix: Customer based price_list in online POS 2019-01-25 16:41:01 +05:30
Nabin Hait
01ca3e5e36 fix(manufacturing): Get raw materials rate from price list ignoring party 2019-01-25 16:25:15 +05:30
Nabin Hait
3476a457ad fix: minor 2019-01-25 16:22:36 +05:30
Shivam Mishra
67c338fd51 [fix] Fixed links
Previous commit missed the links starting with `http://`
2019-01-25 15:17:44 +05:30
scmmishra
f44dfb1582 [fix] Formatting issues 2019-01-25 14:56:30 +05:30
scmmishra
d71de2a23e [fix] Code formatting, removed trailing spaces 2019-01-25 14:27:23 +05:30
scmmishra
9731a02657 [feat] Added docsUrl variable to configure help_links 2019-01-25 13:14:11 +05:30
scmmishra
3f9b231f31 [fix] Links now redirect to erpnext.com 2019-01-25 12:56:27 +05:30
deepeshgarg007
1f9a6febdd fix: Assign given price list if POS price list is not available 2019-01-25 11:53:55 +05:30
Nabin Hait
596c1b3489 Merge pull request #16220 from SaiFi0102/Party-Ledger-Summary
feat: Party Ledger Summary Report
2019-01-25 11:22:55 +05:30
Nabin Hait
ddc65dfb87 fix: delete taxes and charges template while deleting company 2019-01-25 11:04:14 +05:30
Nabin Hait
50e552321b Merge pull request #16363 from scmmishra/leave-application-naming
fix: Naming series not reflecting in leave application
2019-01-25 10:34:01 +05:30
Nabin Hait
cce96758fc Merge pull request #16484 from netchampfaris/add-logging-for-failed-exchange-rate
chore: Add error logging for failed get_exchange_rate call
2019-01-25 10:33:03 +05:30
Nabin Hait
42462fac9d Merge pull request #16465 from nabinhait/eway_bill
fix(accounts): Validate gst accounts defined in GST Settings in eway bill report
2019-01-25 10:00:06 +05:30
Nabin Hait
05f1c0e1b9 Merge pull request #16470 from netchampfaris/fix-jinja-unicode-formatting
fix: Don't use .format in jinja templates
2019-01-25 09:57:37 +05:30
Nabin Hait
e21bdf020c Merge pull request #16472 from deepeshgarg007/cost_center
fix(cost_center): Bug fix in  update_cost_center_number argument name
2019-01-25 09:56:52 +05:30
Nabin Hait
a6ab38665d Merge pull request #16487 from netchampfaris/fix-gst-pos-invoice
fix: Dont show 0 amount taxes and tax breakup
2019-01-25 09:54:07 +05:30
Nabin Hait
393080ecbe Merge pull request #16492 from rohitwaghchaure/ascii_code_issue_pos_offline_not_working
fix: ascii codec while opening offline POS
2019-01-25 09:50:41 +05:30
Nabin Hait
f6459335da Merge pull request #16493 from rohitwaghchaure/bank_reconcilliation_entry_issue
fix: bank reconcilliation showing multiple entries against one JV
2019-01-25 09:50:07 +05:30
Nabin Hait
fc9e733d7f Merge pull request #16483 from surajshetty3416/stock-levels-based-on-permission
fix: Show stock levels in Item master based on user permissions
2019-01-25 09:48:43 +05:30
Suraj Shetty
1c9dd67f15 Merge branch 'staging-fixes' into add-logging-for-failed-exchange-rate 2019-01-25 09:22:46 +05:30
Rohit Waghchaure
e14cc8f2b6 fix: bank reconcilliation showing multiple entries against one JV 2019-01-25 00:23:41 +05:30
Rohit Waghchaure
74df01d3d1 fix: ascii code while opening offline POS 2019-01-25 00:03:35 +05:30
rohitwaghchaure
7e4cf62a15 Merge pull request #16370 from rohitwaghchaure/show_outward_entries_in_negative
Show outward entries in negative for Bank Clearance Summary report
2019-01-24 22:13:40 +05:30
Aditya Hase
a40c43e414 fix(ar-summary): Changes to column list to match recent changes 2019-01-24 19:13:32 +05:30
Nabin Hait
2a1aedfff1 fix(setup): Create regional taxes on creation on company 2019-01-24 17:56:19 +05:30
Nabin Hait
49b41e49ae fix: Added permissions in GST Settings and added filters for accounts based on company 2019-01-24 17:55:44 +05:30
deepeshgarg007
c48efaba6e fix(sales_invoice): fetch customer price list if available before pos profile price list 2019-01-24 17:15:38 +05:30
Faris Ansari
d6f837c5e5 fix: Dont show 0 amount taxes and tax breakup 2019-01-24 17:10:33 +05:30
Faris Ansari
badf1c42e0 chore: Add error logging for failed get_exchange_rate call 2019-01-24 16:28:53 +05:30
Suraj Shetty
7a45887fa1 fix typo 2019-01-24 16:26:48 +05:30
Suraj Shetty
dd0496f7aa Add missed out field field 2019-01-24 16:18:43 +05:30
Suraj Shetty
c165838228 Filter bin list based on warehouses that are accessible to the user 2019-01-24 15:45:46 +05:30
Nabin Hait
2a0e8e24ec Merge branch 'staging-fixes' into plaid_reconciliation 2019-01-24 14:11:00 +05:30
pipeCh
c16c7fffb4 fixed for "Select Serial Numbers" dialog won't fill mandatory field 2019-01-24 15:00:07 +07:00
deepeshgarg007
19ab86a3a7 fix:(cost_center): fix for update cost center number 2019-01-23 17:28:13 +05:30
Sagar Vora
e9778d9556 fix: do not use built-in "input", reload_doc 2019-01-23 17:13:31 +05:30
Sagar Vora
f51661b225 fix: allow operators, make weighting_function mandatory 2019-01-23 16:42:28 +05:30
Faris Ansari
853d3fd1ab fix: Don't use .format in jinja templates
- Jinja doesn't allow unicode strings to be formatted in templates
2019-01-23 16:34:22 +05:30
Sagar Vora
9aeabce3d3 fix: trailing whitespace, duplication & more 2019-01-23 16:01:19 +05:30
Sagar Vora
57d7c837aa fix: supplier scorecard test 2019-01-23 14:26:35 +05:30
Sagar Vora
fb256d68ff Merge branch 'fix-supplier-scorecard' of /home/snv/Work/master_bench/apps/erpnext into fix-scorecard 2019-01-23 14:13:40 +05:30
Sagar Vora
037d0f8ba6 fix(buying): make supplier scorecard usable 2019-01-23 14:11:25 +05:30
Frappe Bot
f74e28bc64 Merge branch 'staging-fixes' into staging 2019-01-23 08:12:19 +00:00
Frappe Bot
2d5bf69dc4 bumped to version 11.0.3-beta.37 2019-01-23 08:12:19 +00:00
Frappe Bot
34121bc81a Merge branch 'master' into staging-fixes 2019-01-23 08:08:55 +00:00
Frappe Bot
d801437f5f Merge branch 'hotfix' 2019-01-23 08:08:53 +00:00
Frappe Bot
342854f6f2 bumped to version 10.1.80 2019-01-23 08:08:53 +00:00
Nabin Hait
06607fda4e fix: removed print statement 2019-01-23 12:15:48 +05:30
Nabin Hait
141c543f97 Update journal_entry.js 2019-01-23 12:14:55 +05:30
Nabin Hait
36706c04bb Merge pull request #16451 from nabinhait/unicode-issue
fix: Unicode issue in purchase invoice
2019-01-23 12:11:00 +05:30
Nabin Hait
d2e2ca31ac Merge pull request #16460 from nabinhait/pricing-rule-issue
fix: Enforce pricing rule based on rate on server side
2019-01-23 12:09:12 +05:30
Nabin Hait
fb8c0bd664 Merge pull request #16464 from adityahase/flakes
style: Linting fixes
2019-01-23 12:08:57 +05:30
Nabin Hait
5b2922f76c Merge pull request #16466 from nabinhait/project-nonetype
fix(projects): None type handling while updating tasks
2019-01-23 12:07:25 +05:30
Nabin Hait
4ef578e1c4 Merge pull request #16406 from rohitwaghchaure/newchanges_in_tds_reports
fix: Multiple fixes in the reports
2019-01-23 12:05:36 +05:30
Nabin Hait
49e09624d6 fix(projects): None type handling while updating tasks 2019-01-23 10:43:00 +05:30
Nabin Hait
8c2a2c8f60 fix(accounts): Validate gst accounts defined in GST Settings in eway bill report 2019-01-23 10:33:47 +05:30
Aditya Hase
819a16d0f5 fix(dead-code): Remove .py files (#16462) 2019-01-23 07:57:08 +05:30
Aditya Hase
f79937d64b style: Remove unused imports 2019-01-23 00:28:37 +05:30
Aditya Hase
55a08dee78 style: Remove unusued local variable 2019-01-23 00:28:02 +05:30
Aditya Hase
4b4265f8a7 fix(dead-code): Remove .py files (#16457) 2019-01-22 20:54:21 +05:30
FinByz Tech Pvt. Ltd
237a871f17 fix: NoneType object has no attribute "gstin" (#16458)
* fix: NoneType object has no attribute "gstin"

* fix: handle NoneType values
2019-01-22 20:49:06 +05:30
Nabin Hait
da32916396 fix: Enforce pricing rule based on rate on server side 2019-01-22 19:06:06 +05:30
Aditya Hase
f3c22f342c fix(unicode): Import unicode_literals in every file 2019-01-22 18:36:10 +05:30
Sagar Vora
4d418b98f3 Merge branch 'staging-fixes' into staging 2019-01-22 18:17:09 +05:30
Sagar Vora
5555b2802f bumped to version 11.0.3-beta.36 2019-01-22 18:37:09 +05:50
Sagar Vora
c84e3fe21b Merge branch 'master' into staging-fixes 2019-01-22 18:16:13 +05:30
Sagar Vora
33bc3f3309 Merge branch 'hotfix' 2019-01-22 18:15:44 +05:30
Sagar Vora
2a9a867f05 bumped to version 10.1.79 2019-01-22 18:35:44 +05:50
Sagar Vora
ecf6467799 fix(travis): Redis must be working for caching, so reverting (#16455) 2019-01-22 17:41:56 +05:30
Nabin Hait
a5270e561f fix: Unicode issue in purchase invoice 2019-01-22 15:43:04 +05:30
Rohit Waghchaure
ddd9136d10 Renamed field and added finance book column in the trial balance simple report 2019-01-22 14:11:57 +05:30
Zlash65
270c4c2a87 fix: push party filter only if applicable 2019-01-22 12:47:25 +05:30
Zlash65
c8d632ddff fix: add set query for payroll entry in JV 2019-01-22 12:46:13 +05:30
Nabin Hait
22923ed663 Merge branch 'staging-fixes' into pr_staging_fixes_2 2019-01-22 10:51:59 +05:30
scmmishra
f2d0be7299 [feat] Modified help config 2019-01-21 19:35:46 +05:30
scmmishra
dd461636e3 [feat] Updated all help_links 2019-01-21 19:35:02 +05:30
Saif Ur Rehman
31d58eac01 fix(Party Ledger Summary): Added Supplier/Customer Name column 2019-01-19 15:28:53 +05:00
Saif Ur Rehman
55566b7f8e fix(Party Ledger Summary): Codacy fix 2019-01-19 15:12:08 +05:00
Saif Ur Rehman
fcaed12a53 Merge branch 'Party-Ledger-Summary' of https://saifi0102@github.com/SaiFi0102/erpnext.git into Party-Ledger-Summary 2019-01-19 13:18:23 +05:00
Faris Ansari
f523611e12 Merge branch 'hotfix' into leave-application-naming 2019-01-18 14:30:39 +05:30
Rohit Waghchaure
fa7ee0b3b6 Added dafult bank account in the customer/supplier 2019-01-17 15:45:27 +05:30
Rohit Waghchaure
f725816809 Enhance: Added field limit in the Payment Reconciliation to handle large entries 2019-01-17 12:54:14 +05:30
Nabin Hait
c8ac825f0d Merge branch 'hotfix' into leave-application-naming 2019-01-16 17:54:35 +05:30
Nabin Hait
873442a55d Merge branch 'staging-fixes' into Party-Ledger-Summary 2019-01-16 17:52:45 +05:30
Nabin Hait
cd40d87ebd Merge branch 'staging-fixes' into pr_staging_fixes_2 2019-01-16 17:52:01 +05:30
Rohit Waghchaure
affeb3dfec Added on account amount field in Accounts Payable/Receivable Summary 2019-01-15 17:38:31 +05:30
Rohit Waghchaure
1a4c1e11cb Fix: total invoiced amount in Accounts Receivable Summary report showing blank 2019-01-15 17:01:34 +05:30
Rohit Waghchaure
b2d08a498b Added bank account field in the payment entry 2019-01-15 16:11:29 +05:30
Rohit Waghchaure
bdee57ca8d Added finance book in trial balance and fixed cost center not working issue in trial balance 2019-01-15 15:52:52 +05:30
Saif Ur Rehman
f86123ad5a feat(Party Ledger Summary): Include columns for discount and other adjustments 2019-01-15 15:18:43 +05:00
Rohit Waghchaure
df7215dcb2 Added supplier name in the tds report 2019-01-15 14:48:06 +05:30
Nabin Hait
d92024bb0f Merge branch 'hotfix' into leave-application-naming 2019-01-14 20:26:01 +05:30
Nabin Hait
55c672eefd Merge branch 'hotfix' into is_fixed_asset_checkbox_not_copied 2019-01-14 20:25:22 +05:30
Rohit Waghchaure
701c762a68 Show outward entries in negative for Bank Clearance Summary report 2019-01-09 14:21:03 +05:30
Jamsheer
319ca86c81 fix: Test Fee Validity 2019-01-09 13:29:20 +05:30
Jamsheer
c0ac849776 fix: Helathcare Prcatitioner custom query escaped 2019-01-09 11:48:41 +05:30
Jamsheer
45c5138eaf fix: updated options for abdomen in Vital Signs 2019-01-09 11:19:27 +05:30
Jamsheer
f2d7e3309f fix: Patient Appointment - Calendar - status != Cancelled 2019-01-09 11:19:27 +05:30
Jamsheer
17bb0da278 fix: remove print statement 2019-01-09 11:19:27 +05:30
Jamsheer
c3804230cd fix: Patient - Quick Entry enabled 2019-01-09 11:19:27 +05:30
Jamsheer
52ac72e63e fix: Validate Patient Appointment 2019-01-09 11:19:27 +05:30
Jamsheer
c0097ad729 feat: Filter active Healthcare Practitioner 2019-01-09 11:19:27 +05:30
Jamsheer
fb7b5292b3 fix: Clinical Procedure - consume stock if items present 2019-01-09 11:19:27 +05:30
Jamsheer
3e01891e22 fix: Traverse note from procedure prescription to appointment 2019-01-09 11:19:27 +05:30
Jamsheer
f3c4f5a901 fix: Clinical Procedure - copy fields from appointment 2019-01-09 11:19:26 +05:30
Jamsheer
f4d0fcb836 fix: patient - user welcome email configuration 2019-01-09 11:19:26 +05:30
Jamsheer
b2c9268ece fix: Patient Appointment - Calendar - set color from appointment type 2019-01-09 11:19:26 +05:30
scmmishra
e2762df90b Fix: Naming series not reflecting in leave application 2019-01-08 17:38:28 +05:30
Charles-Henri Decultot
c75300dc43 Purchase invoice modified date 2019-01-07 15:46:25 +00:00
Charles-Henri Decultot
8d36b362d1 Merge conflict resolution 2019-01-07 15:24:39 +00:00
Charles-Henri Decultot
4c57fae726 Codacy correction 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
2d1b5b0769 Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
1d7646f31f Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
1a19746904 Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
e7fec6e659 Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
c45e271b3e Add button to unlink bank account 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
422d483baf Move actions menu to standard menu 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
c56f771c81 UX corrections + additional tests 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
89923b84b1 UX enhancements 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
c936f07a1e Correct Travis error 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
aea2fbf82d Correct test case for Travis 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
7a1ea42271 Addition of test cases 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
58438f4e5b Duplicate query to avoid SQL injection 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
f6d18e81e9 Modify SQL queries and add a test case 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
e8f3050e27 Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
cbe63ec418 Codacy corrections 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
94899981d3 Dev cleanup 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
6a4dae3a9d Codacy corrections + sql queries 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
57c6b49d1a Dev cleanup 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
eae7424984 Cleanup dev 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
e394cec194 Bank reconciliation dashboard 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
818492387a WIP 2019-01-07 15:21:57 +00:00
Charles-Henri Decultot
31cb24f48d Bank reconciliation WIP 2019-01-07 15:20:06 +00:00
Charles-Henri Decultot
590d8d3d3e Bank reconciliation wip 2019-01-07 15:20:06 +00:00
Charles-Henri Decultot
6025e498f2 Bank reconciliation wip 2019-01-07 15:20:06 +00:00
Charles-Henri Decultot
09cad814cd Reconciliation dashboard wip 2019-01-07 15:20:06 +00:00
Charles-Henri Decultot
c75a2b1eed Plaid integration 2019-01-07 15:20:06 +00:00
Sagar Vora
f5a00dc0c1 Merge branch 'hotfix' into is_fixed_asset_checkbox_not_copied 2019-01-07 15:45:33 +05:30
Rohit Waghchaure
f6f503a1f6 [Fix] Is fixed asset checkbox not checked if user duplicate the existing invoice 2018-12-19 15:15:35 +05:30
Saif Ur Rehman
b53231595d Using same filter for Sales Person from Accounts Receivable
Added Customer/Supplier Ledger Summary in Accounts Module page
2018-12-12 15:46:50 +05:00
Saif Ur Rehman
b07d108bee feat: Supplier Ledger Summary 2018-12-12 05:45:49 +05:00
Saif Ur Rehman
41236ed0e5 feat: Customer Ledger Summary report 2018-12-12 05:12:20 +05:00
672 changed files with 31065 additions and 19651 deletions

2
.gitignore vendored
View File

@@ -12,3 +12,5 @@ erpnext/docs/current
*.swo
__pycache__
*~
.vscode/
node_modules/

View File

@@ -15,7 +15,7 @@ install:
- sudo rm /etc/apt/sources.list.d/docker.list
- sudo apt-get install hhvm && rm -rf /home/travis/.kiex/
- sudo apt-get purge -y mysql-common mysql-server mysql-client
- nvm install v7.10.0
- nvm install 10
- pip install python-coveralls
- wget https://raw.githubusercontent.com/frappe/bench/master/playbooks/install.py
- sudo python install.py --develop --user travis --without-bench-setup
@@ -33,16 +33,16 @@ before_script:
- cd ~/frappe-bench
- bench get-app erpnext $TRAVIS_BUILD_DIR
- bench use test_site
- bench reinstall --mariadb-root-username root --mariadb-root-password travis --yes
- bench scheduler disable
- sed -i 's/9000/9001/g' sites/common_site_config.json
- bench start &
- sleep 10
jobs:
include:
- stage: test
script:
- bench reinstall --mariadb-root-username root --mariadb-root-password travis --yes
- bench scheduler disable
- sed -i 's/9000/9001/g' sites/common_site_config.json
- bench start &
- sleep 10
- set -e
- bench run-tests --app erpnext --coverage
after_script:

View File

@@ -6,7 +6,6 @@
</p>
[![Build Status](https://travis-ci.com/frappe/erpnext.png)](https://travis-ci.com/frappe/erpnext)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/frappe/erpnext?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Open Source Helpers](https://www.codetriage.com/frappe/erpnext/badges/users.svg)](https://www.codetriage.com/frappe/erpnext)
[![Coverage Status](https://coveralls.io/repos/github/frappe/erpnext/badge.svg?branch=develop)](https://coveralls.io/github/frappe/erpnext?branch=develop)
@@ -18,7 +17,7 @@ Includes: Accounting, Inventory, Manufacturing, CRM, Sales, Purchase, Project Ma
ERPNext is built on the [Frappe](https://github.com/frappe/frappe) Framework, a full-stack web app framework in Python & JavaScript.
- [User Guide](https://erpnext.org/docs/user)
- [User Guide](https://erpnext.com/docs/user)
- [Discussion Forum](https://discuss.erpnext.com/)
---

View File

@@ -5,7 +5,7 @@ import frappe
from erpnext.hooks import regional_overrides
from frappe.utils import getdate
__version__ = '10.1.78'
__version__ = '11.1.22'
def get_default_company(user=None):
'''Get default company for user'''
@@ -74,7 +74,7 @@ def is_perpetual_inventory_enabled(company):
frappe.local.enable_perpetual_inventory = {}
if not company in frappe.local.enable_perpetual_inventory:
frappe.local.enable_perpetual_inventory[company] = frappe.get_cached_value('Company',
frappe.local.enable_perpetual_inventory[company] = frappe.get_cached_value('Company',
company, "enable_perpetual_inventory") or 0
return frappe.local.enable_perpetual_inventory[company]
@@ -87,7 +87,7 @@ def get_default_finance_book(company=None):
frappe.local.default_finance_book = {}
if not company in frappe.local.default_finance_book:
frappe.local.default_finance_book[company] = frappe.get_cached_value('Company',
frappe.local.default_finance_book[company] = frappe.get_cached_value('Company',
company, "default_finance_book")
return frappe.local.default_finance_book[company]
@@ -108,7 +108,7 @@ 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',
return frappe.get_cached_value('Company',
company or frappe.flags.company, 'country')
elif frappe.flags.country:
return frappe.flags.country

View File

@@ -2,9 +2,9 @@ from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.utils import date_diff, add_months, today, getdate, add_days, flt
from frappe.utils import date_diff, add_months, today, getdate, add_days, flt, get_last_day
from erpnext.accounts.utils import get_account_currency
from erpnext.accounts.general_ledger import make_gl_entries
from frappe.email import sendmail_to_system_managers
def validate_service_stop_date(doc):
''' Validates service_stop_date for Purchase Invoice and Sales Invoice '''
@@ -29,51 +29,53 @@ def validate_service_stop_date(doc):
if date_diff(item.service_stop_date, item.service_end_date) > 0:
frappe.throw(_("Service Stop Date cannot be after Service End Date"))
if old_stop_dates and old_stop_dates[item.name] and item.service_stop_date!=old_stop_dates[item.name]:
if old_stop_dates and old_stop_dates.get(item.name) and item.service_stop_date!=old_stop_dates[item.name]:
frappe.throw(_("Cannot change Service Stop Date for item in row {0}".format(item.idx)))
def convert_deferred_expense_to_expense(start_date=None, end_date=None):
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
if not start_date:
start_date = add_months(today(), -1)
if not end_date:
end_date = add_days(today(), -1)
# check for the purchase invoice for which GL entries has to be done
invoices = frappe.db.sql_list('''
select distinct parent from `tabPurchase Invoice Item` where service_start_date<=%s and service_end_date>=%s
select distinct parent from `tabPurchase Invoice Item`
where service_start_date<=%s and service_end_date>=%s
and enable_deferred_expense = 1 and docstatus = 1 and ifnull(amount, 0) > 0
''', (end_date or today(), start_date or add_months(today(), -1)))
''', (end_date, start_date))
# For each invoice, book deferred expense
for invoice in invoices:
doc = frappe.get_doc("Purchase Invoice", invoice)
book_deferred_income_or_expense(doc, start_date, end_date)
book_deferred_income_or_expense(doc, end_date)
def convert_deferred_revenue_to_income(start_date=None, end_date=None):
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
if not start_date:
start_date = add_months(today(), -1)
if not end_date:
end_date = add_days(today(), -1)
# check for the sales invoice for which GL entries has to be done
invoices = frappe.db.sql_list('''
select distinct parent from `tabSales Invoice Item` where service_start_date<=%s and service_end_date>=%s
select distinct parent from `tabSales Invoice Item`
where service_start_date<=%s and service_end_date>=%s
and enable_deferred_revenue = 1 and docstatus = 1 and ifnull(amount, 0) > 0
''', (end_date or today(), start_date or add_months(today(), -1)))
''', (end_date, start_date))
# For each invoice, book deferred revenue
for invoice in invoices:
doc = frappe.get_doc("Sales Invoice", invoice)
book_deferred_income_or_expense(doc, start_date, end_date)
book_deferred_income_or_expense(doc, end_date)
def get_booking_dates(doc, item, posting_date=None):
if not posting_date:
posting_date = add_days(today(), -1)
last_gl_entry = False
def get_booking_dates(doc, item, start_date=None, end_date=None):
deferred_account = "deferred_revenue_account" if doc.doctype=="Sales Invoice" else "deferred_expense_account"
last_gl_entry, skip = False, False
booking_end_date = getdate(add_days(today(), -1)) if not end_date else end_date
if booking_end_date < item.service_start_date or \
(item.service_stop_date and booking_end_date.month > item.service_stop_date.month):
return None, None, None, True
elif booking_end_date >= item.service_end_date:
last_gl_entry = True
booking_end_date = item.service_end_date
elif item.service_stop_date and item.service_stop_date <= booking_end_date:
last_gl_entry = True
booking_end_date = item.service_stop_date
booking_start_date = getdate(add_months(today(), -1)) if not start_date else start_date
booking_start_date = booking_start_date \
if booking_start_date > item.service_start_date else item.service_start_date
prev_gl_entry = frappe.db.sql('''
select name, posting_date from `tabGL Entry` where company=%s and account=%s and
@@ -81,17 +83,28 @@ def get_booking_dates(doc, item, start_date=None, end_date=None):
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_gl_entry and item.service_start_date < booking_start_date:
booking_start_date = item.service_start_date
elif prev_gl_entry:
booking_start_date = getdate(add_days(prev_gl_entry[0].posting_date, 1))
skip = True if booking_start_date > booking_end_date else False
if prev_gl_entry:
start_date = getdate(add_days(prev_gl_entry[0].posting_date, 1))
else:
start_date = item.service_start_date
return last_gl_entry, booking_start_date, booking_end_date, skip
end_date = get_last_day(start_date)
if end_date >= item.service_end_date:
end_date = item.service_end_date
last_gl_entry = True
elif item.service_stop_date and end_date >= item.service_stop_date:
end_date = item.service_stop_date
last_gl_entry = True
def calculate_amount_and_base_amount(doc, item, last_gl_entry, total_days, total_booking_days):
account_currency = get_account_currency(item.expense_account)
if end_date > getdate(posting_date):
end_date = posting_date
if getdate(start_date) <= getdate(end_date):
return start_date, end_date, last_gl_entry
else:
return None, None, None
def calculate_amount(doc, item, last_gl_entry, total_days, total_booking_days, account_currency):
if doc.doctype == "Sales Invoice":
total_credit_debit, total_credit_debit_currency = "debit", "debit_in_account_currency"
deferred_account = "deferred_revenue_account"
@@ -113,7 +126,6 @@ def calculate_amount_and_base_amount(doc, item, last_gl_entry, total_days, total
group by voucher_detail_no
'''.format(total_credit_debit, total_credit_debit_currency),
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
already_booked_amount = gl_entries_details[0].total_credit if gl_entries_details else 0
base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
if account_currency==doc.company_currency:
@@ -124,24 +136,15 @@ def calculate_amount_and_base_amount(doc, item, last_gl_entry, total_days, total
return amount, base_amount
def book_deferred_income_or_expense(doc, start_date=None, end_date=None):
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
# start_date: 1st of the last month or the start date
# end_date: end_date or today-1
def book_deferred_income_or_expense(doc, posting_date=None):
enable_check = "enable_deferred_revenue" \
if doc.doctype=="Sales Invoice" else "enable_deferred_expense"
gl_entries = []
for item in doc.get('items'):
skip = False
last_gl_entry, booking_start_date, booking_end_date, skip = \
get_booking_dates(doc, item, start_date, end_date)
if skip: continue
total_days = date_diff(item.service_end_date, item.service_start_date)
total_booking_days = date_diff(booking_end_date, booking_start_date) + 1
def _book_deferred_revenue_or_expense(item):
start_date, end_date, last_gl_entry = get_booking_dates(doc, item, posting_date=posting_date)
if not (start_date and end_date): return
account_currency = get_account_currency(item.expense_account)
amount, base_amount = calculate_amount_and_base_amount(doc, item, last_gl_entry, total_days, total_booking_days)
if doc.doctype == "Sales Invoice":
against, project = doc.customer, doc.project
credit_account, debit_account = item.income_account, item.deferred_revenue_account
@@ -149,32 +152,62 @@ def book_deferred_income_or_expense(doc, start_date=None, end_date=None):
against, project = doc.supplier, item.project
credit_account, debit_account = item.deferred_expense_account, item.expense_account
# GL Entry for crediting the amount in the deferred expense
gl_entries.append(
doc.get_gl_dict({
"account": credit_account,
"against": against,
"credit": base_amount,
"credit_in_account_currency": amount,
"cost_center": item.cost_center,
"voucher_detail_no": item.name,
'posting_date': booking_end_date,
'project': project
}, account_currency)
)
# GL Entry to debit the amount from the expense
gl_entries.append(
doc.get_gl_dict({
"account": debit_account,
"against": against,
"debit": base_amount,
"debit_in_account_currency": amount,
"cost_center": item.cost_center,
"voucher_detail_no": item.name,
'posting_date': booking_end_date,
'project': project
}, account_currency)
)
total_days = date_diff(item.service_end_date, item.service_start_date) + 1
total_booking_days = date_diff(end_date, start_date) + 1
amount, base_amount = calculate_amount(doc, item, last_gl_entry,
total_days, total_booking_days, account_currency)
make_gl_entries(doc, credit_account, debit_account, against,
amount, base_amount, end_date, project, account_currency, item.cost_center, item.name)
if getdate(end_date) < getdate(posting_date) and not last_gl_entry:
_book_deferred_revenue_or_expense(item)
for item in doc.get('items'):
if item.get(enable_check):
_book_deferred_revenue_or_expense(item)
def make_gl_entries(doc, credit_account, debit_account, against,
amount, base_amount, posting_date, project, account_currency, cost_center, voucher_detail_no):
# GL Entry for crediting the amount in the deferred expense
from erpnext.accounts.general_ledger import make_gl_entries
gl_entries = []
gl_entries.append(
doc.get_gl_dict({
"account": credit_account,
"against": against,
"credit": base_amount,
"credit_in_account_currency": amount,
"cost_center": cost_center,
"voucher_detail_no": voucher_detail_no,
'posting_date': posting_date,
'project': project
}, account_currency)
)
# GL Entry to debit the amount from the expense
gl_entries.append(
doc.get_gl_dict({
"account": debit_account,
"against": against,
"debit": base_amount,
"debit_in_account_currency": amount,
"cost_center": cost_center,
"voucher_detail_no": voucher_detail_no,
'posting_date': posting_date,
'project': project
}, account_currency)
)
if gl_entries:
make_gl_entries(gl_entries, cancel=(doc.docstatus == 2), merge_entries=True)
try:
make_gl_entries(gl_entries, cancel=(doc.docstatus == 2), merge_entries=True)
frappe.db.commit()
except:
frappe.db.rollback()
title = _("Error while processing deferred accounting for {0}").format(doc.name)
traceback = frappe.get_traceback()
frappe.log_error(message=traceback , title=title)
sendmail_to_system_managers(title, traceback)

View File

@@ -632,6 +632,39 @@
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.report_type == 'Profit and Loss' && !doc.is_group)",
"fieldname": "include_in_gross",
"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": "Include in gross",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
@@ -645,7 +678,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-01-07 16:52:02.557837",
"modified": "2019-03-04 14:42:07.208893",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",

View File

@@ -5,7 +5,7 @@ from __future__ import unicode_literals
import frappe
from frappe.utils import cint, cstr
from frappe import throw, _
from frappe.utils.nestedset import NestedSet
from frappe.utils.nestedset import NestedSet, get_ancestors_of, get_descendants_of
class RootNotEditable(frappe.ValidationError): pass
class BalanceMismatchError(frappe.ValidationError): pass
@@ -41,6 +41,7 @@ class Account(NestedSet):
self.validate_frozen_accounts_modifier()
self.validate_balance_must_be_debit_or_credit()
self.validate_account_currency()
self.validate_root_company_and_sync_account_to_children()
def validate_parent(self):
"""Fetch Parent Details and validate parent account"""
@@ -90,6 +91,38 @@ class Account(NestedSet):
if not self.parent_account and not self.is_group:
frappe.throw(_("Root Account must be a group"))
def validate_root_company_and_sync_account_to_children(self):
# ignore validation while creating new compnay or while syncing to child companies
if frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation:
return
ancestors = get_root_company(self.company)
if ancestors:
if frappe.get_value("Company", self.company, "allow_account_creation_against_child_company"):
return
frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0]))
else:
descendants = get_descendants_of('Company', self.company)
if not descendants: return
acc_name_map = {}
acc_name = frappe.db.get_value('Account', self.parent_account, "account_name")
for d in frappe.db.get_values('Account',
{"company": ["in", descendants], "account_name": acc_name},
["company", "name"], as_dict=True):
acc_name_map[d["company"]] = d["name"]
if not acc_name_map: return
for company in descendants:
doc = frappe.copy_doc(self)
doc.flags.ignore_root_company_validation = True
doc.update({"company": company, "account_currency": None,
"parent": acc_name_map[company], "parent_account": acc_name_map[company]})
doc.save()
frappe.msgprint(_("Account {0} is added in the child company {1}")
.format(doc.name, company))
def validate_group_or_ledger(self):
if self.get("__islocal"):
return
@@ -250,3 +283,9 @@ def merge_account(old, new, is_group, root_type, company):
frappe.rename_doc("Account", old, new, merge=1, ignore_permissions=1)
return new
@frappe.whitelist()
def get_root_company(company):
# return the topmost company in the hierarchy
ancestors = get_ancestors_of('Company', company, "lft asc")
return [ancestors[0]] if ancestors else []

View File

@@ -4,13 +4,42 @@ frappe.treeview_settings["Account"] = {
breadcrumbs: "Accounts",
title: __("Chart Of Accounts"),
get_tree_root: false,
filters: [{
fieldname: "company",
fieldtype:"Select",
options: erpnext.utils.get_tree_options("company"),
label: __("Company"),
default: erpnext.utils.get_tree_default("company")
}],
filters: [
{
fieldname: "company",
fieldtype:"Select",
options: erpnext.utils.get_tree_options("company"),
label: __("Company"),
default: erpnext.utils.get_tree_default("company"),
on_change: function() {
var me = frappe.treeview_settings['Account'].treeview;
var company = me.page.fields_dict.company.get_value();
frappe.call({
method: "erpnext.accounts.doctype.account.account.get_root_company",
args: {
company: company,
},
callback: function(r) {
if(r.message) {
let root_company = r.message.length ? r.message[0] : "";
me.page.fields_dict.root_company.set_value(root_company);
frappe.db.get_value("Company", {"name": company}, "allow_account_creation_against_child_company", (r) => {
frappe.flags.ignore_root_company_validation = r.allow_account_creation_against_child_company;
});
}
}
});
}
},
{
fieldname: "root_company",
fieldtype:"Data",
label: __("Root Company"),
hidden: true,
disable_onchange: true
}
],
root_label: "Accounts",
get_tree_nodes: 'erpnext.accounts.utils.get_children',
add_tree_node: 'erpnext.accounts.utils.add_ac',
@@ -42,8 +71,8 @@ frappe.treeview_settings["Account"] = {
],
ignore_fields:["parent_account"],
onload: function(treeview) {
frappe.treeview_settings['Account'].page = {};
$.extend(frappe.treeview_settings['Account'].page, treeview.page);
frappe.treeview_settings['Account'].treeview = {};
$.extend(frappe.treeview_settings['Account'].treeview, treeview);
function get_company() {
return treeview.page.fields_dict.company.get_value();
}
@@ -78,6 +107,18 @@ frappe.treeview_settings["Account"] = {
}
},
post_render: function(treeview) {
frappe.treeview_settings['Account'].treeview["tree"] = treeview.tree;
treeview.page.set_primary_action(__("New"), function() {
let root_company = treeview.page.fields_dict.root_company.get_value();
if(root_company) {
frappe.throw(__("Please add the account to root level Company - ") + root_company);
} else {
treeview.new_node();
}
}, "octicon octicon-plus");
},
onrender: function(node) {
if(frappe.boot.user.can_read.indexOf("GL Entry") !== -1){
var dr_or_cr = node.data.balance < 0 ? "Cr" : "Dr";
@@ -93,6 +134,20 @@ frappe.treeview_settings["Account"] = {
}
},
toolbar: [
{
label:__("Add Child"),
condition: function(node) {
return frappe.boot.user.can_create.indexOf("Account") !== -1
&& (!frappe.treeview_settings['Account'].treeview.page.fields_dict.root_company.get_value()
|| frappe.flags.ignore_root_company_validation)
&& node.expandable && !node.hide_add;
},
click: function() {
var me = frappe.treeview_settings['Account'].treeview;
me.new_node();
},
btnClass: "hidden-xs"
},
{
condition: function(node) {
return !node.root && frappe.boot.user.can_read.indexOf("GL Entry") !== -1
@@ -103,7 +158,7 @@ frappe.treeview_settings["Account"] = {
"account": node.label,
"from_date": frappe.sys_defaults.year_start_date,
"to_date": frappe.sys_defaults.year_end_date,
"company": frappe.treeview_settings['Account'].page.fields_dict.company.get_value()
"company": frappe.treeview_settings['Account'].treeview.page.fields_dict.company.get_value()
};
frappe.set_route("query-report", "General Ledger");
},

View File

@@ -1,5 +1,6 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe, os, json

View File

@@ -38,24 +38,24 @@
"Kas": {
"Kas Mata Uang Lain": {
"Kas USD": {
"account_number": "1112.0010",
"account_number": "1112.001",
"account_type": "Cash"
},
"account_number": "1112.000"
},
"Kas Rupiah": {
"Kas Besar": {
"account_number": "1111.0020",
"account_number": "1111.002",
"account_type": "Cash"
},
"Kas Kecil": {
"account_number": "1111.0010",
"account_number": "1111.001",
"account_type": "Cash"
},
"account_number": "1111.000",
"account_type": "Cash"
},
"account_number": "1110.0000"
"account_number": "1110.000"
},
"Pendapatan Yang Akan di Terima": {
"Pendapatan Yang di Terima": {
@@ -98,7 +98,7 @@
},
"account_number": "1130.000"
},
"account_number": "1100.0000"
"account_number": "1100.000"
},
"Aktiva Tetap": {
"Aktiva": {
@@ -121,20 +121,20 @@
"Investasi": {
"Investasi": {
"Deposito": {
"account_number": "1231.003",
"account_number": "1231.300",
"is_group": 1
},
"Investai Saham": {
"Investasi Saham": {
"Investasi Saham": {
"account_number": "1231.0011"
"account_number": "1231.101"
},
"account_number": "1231.001"
"account_number": "1231.100"
},
"Investasi Perumahan": {
"Investasi Perumahan": {
"account_number": "1231.0021"
"account_number": "1231.201"
},
"account_number": "1231.002"
"account_number": "1231.200"
},
"account_number": "1231.000"
},
@@ -142,7 +142,7 @@
},
"account_number": "1200.000"
},
"account_number": "1000.0000",
"account_number": "1000.000",
"root_type": "Asset"
},
"Beban": {
@@ -684,4 +684,4 @@
"root_type": "Income"
}
}
}
}

View File

@@ -97,6 +97,19 @@ class TestAccount(unittest.TestCase):
self.assertRaises(frappe.ValidationError, merge_account, "Capital Stock - _TC",\
"Softwares - _TC", doc.is_group, doc.root_type, doc.company)
def test_account_sync(self):
del frappe.local.flags["ignore_root_company_validation"]
acc = frappe.new_doc("Account")
acc.account_name = "Test Sync Account"
acc.parent_account = "Temporary Accounts - _TC3"
acc.company = "_Test Company 3"
acc.insert()
acc_tc_4 = frappe.db.get_value('Account', {'account_name': "Test Sync Account", "company": "_Test Company 4"})
acc_tc_5 = frappe.db.get_value('Account', {'account_name': "Test Sync Account", "company": "_Test Company 5"})
self.assertEqual(acc_tc_4, "Test Sync Account - _TC4")
self.assertEqual(acc_tc_5, "Test Sync Account - _TC5")
def _make_test_records(verbose):
from frappe.test_runner import make_test_objects
@@ -131,7 +144,7 @@ def _make_test_records(verbose):
# related to Account Inventory Integration
["_Test Account Stock In Hand", "Current Assets", 0, None, None],
# fixed asset depreciation
["_Test Fixed Asset", "Current Assets", 0, "Fixed Asset", None],
["_Test Accumulated Depreciations", "Current Assets", 0, None, None],
@@ -168,13 +181,17 @@ def get_inventory_account(company, warehouse=None):
return account
def create_account(**kwargs):
account = frappe.get_doc(dict(
doctype = "Account",
account_name = kwargs.get('account_name'),
account_type = kwargs.get('account_type'),
parent_account = kwargs.get('parent_account'),
company = kwargs.get('company')
))
account.save()
return account.name
account = frappe.db.get_value("Account", filters={"account_name": kwargs.get("account_name"), "company": kwargs.get("company")})
if account:
return account
else:
account = frappe.get_doc(dict(
doctype = "Account",
account_name = kwargs.get('account_name'),
account_type = kwargs.get('account_type'),
parent_account = kwargs.get('parent_account'),
company = kwargs.get('company')
))
account.save()
return account.name

View File

@@ -0,0 +1,8 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Account Subtype', {
refresh: function() {
}
});

View File

@@ -0,0 +1,134 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 1,
"autoname": "field:account_subtype",
"beta": 0,
"creation": "2018-10-25 15:46:08.054586",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_subtype",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Account Subtype",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-10-25 15:47:03.841390",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account Subtype",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
}

View File

@@ -1,9 +1,9 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and contributors
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
class Lead(Document):
class AccountSubtype(Document):
pass

View File

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: Account Subtype", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new Account Subtype
() => frappe.tests.make('Account Subtype', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from __future__ import unicode_literals
import unittest
class TestAccountSubtype(unittest.TestCase):
pass

View File

@@ -0,0 +1,8 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Account Type', {
refresh: function() {
}
});

View File

@@ -0,0 +1,134 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 1,
"autoname": "field:account_type",
"beta": 0,
"creation": "2018-10-25 15:45:45.789963",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_type",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Account Type",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 1
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-10-25 15:46:51.042604",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account Type",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
}

View File

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

View File

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: Account Type", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new Account Type
() => frappe.tests.make('Account Type', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from __future__ import unicode_literals
import unittest
class TestAccountType(unittest.TestCase):
pass

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
import unittest
import frappe

View File

@@ -2,7 +2,29 @@
// For license information, please see license.txt
frappe.ui.form.on('Bank', {
onload: function(frm) {
add_fields_to_mapping_table(frm);
},
refresh: function(frm) {
add_fields_to_mapping_table(frm);
}
});
let add_fields_to_mapping_table = function (frm) {
let options = [];
frappe.model.with_doctype("Bank Transaction", function() {
let meta = frappe.get_meta("Bank Transaction");
meta.fields.forEach(value => {
if (!["Section Break", "Column Break"].includes(value.fieldtype)) {
options.push(value.fieldname);
}
});
});
frappe.meta.get_docfield("Bank Transaction Mapping", "bank_transaction_field",
frm.doc.name).options = options;
frm.fields_dict.bank_transaction_mapping.grid.refresh();
};

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
@@ -15,6 +16,7 @@
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -42,6 +44,134 @@
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
"columns": 0,
"fieldname": "data_import_configuration_section",
"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": "Data Import Configuration",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "bank_transaction_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": "Bank Transaction Mapping",
"length": 0,
"no_copy": 0,
"options": "Bank Transaction Mapping",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_4",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "plaid_access_token",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Plaid Access Token",
"length": 0,
"no_copy": 1,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
@@ -55,7 +185,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-04-07 17:00:21.246202",
"modified": "2018-11-27 16:12:13.938776",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank",
@@ -64,7 +194,6 @@
"permissions": [
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -90,5 +219,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Bank Account', {
@@ -24,5 +24,13 @@ frappe.ui.form.on('Bank Account', {
else {
frappe.contacts.render_address_and_contact(frm);
}
if (frm.doc.integration_id) {
frm.add_custom_button(__("Unlink external integrations"), function() {
frappe.confirm(__("This action will unlink this account from any external service integrating ERPNext with your bank accounts. It cannot be undone. Are you certain ?"), function() {
frm.set_value("integration_id", "");
});
});
}
}
});

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,9 @@ class BankAccount(Document):
"""Load address and contacts in `__onload`"""
load_address_and_contact(self)
def autoname(self):
self.name = self.account_name + " - " + self.bank
def on_trash(self):
delete_contact_and_address('BankAccount', self.name)
@@ -31,3 +34,13 @@ def make_bank_account(doctype, docname):
doc.is_default = 1
return doc
@frappe.whitelist()
def get_party_bank_account(party_type, party):
return frappe.db.get_value(party_type,
party, 'default_bank_account')
@frappe.whitelist()
def get_bank_account_details(bank_account):
return frappe.db.get_value("Bank Account",
bank_account, ['account', 'bank', 'bank_account_no'], as_dict=1)

View File

@@ -23,35 +23,36 @@ class BankReconciliation(Document):
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,
t2.debit_in_account_currency as debit, t2.credit_in_account_currency as credit,
t1.posting_date, t2.against_account, t1.clearance_date, t2.account_currency
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 = %s and t1.docstatus=1
and t1.posting_date >= %s and t1.posting_date <= %s
and t1.posting_date >= %s and t1.posting_date <= %s
and ifnull(t1.is_opening, 'No') = 'No' {0}
group by t2.account, t1.name
order by t1.posting_date ASC, t1.name DESC
""".format(condition), (self.bank_account, self.from_date, self.to_date), as_dict=1)
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, "") as credit,
if(paid_from=%(account)s, "", received_amount) as debit,
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 {0}
order by
order by
posting_date ASC, name DESC
""".format(condition),
""".format(condition),
{"account":self.bank_account, "from":self.from_date, "to":self.to_date}, as_dict=1)
pos_entries = []
@@ -78,8 +79,12 @@ class BankReconciliation(Document):
for d in entries:
row = self.append('payment_entries', {})
amount = d.debit if d.debit else d.credit
d.amount = fmt_money(amount, 2, d.account_currency) + " " + (_("Dr") if d.debit else _("Cr"))
amount = flt(d.get('debit', 0)) - flt(d.get('credit', 0))
formatted_amount = fmt_money(abs(amount), 2, d.account_currency)
d.amount = formatted_amount + " " + (_("Dr") if amount > 0 else _("Cr"))
d.pop("credit")
d.pop("debit")
d.pop("account_currency")
@@ -102,10 +107,10 @@ class BankReconciliation(Document):
d.clearance_date = None
frappe.db.set_value(d.payment_document, d.payment_entry, "clearance_date", d.clearance_date)
frappe.db.sql("""update `tab{0}` set clearance_date = %s, modified = %s
where name=%s""".format(d.payment_document),
frappe.db.sql("""update `tab{0}` set clearance_date = %s, modified = %s
where name=%s""".format(d.payment_document),
(d.clearance_date, nowdate(), d.payment_entry))
clearance_date_updated = True
if clearance_date_updated:

View File

@@ -0,0 +1,14 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('Bank Transaction', {
onload: function(frm) {
frm.set_query('payment_document', 'payment_entries', function() {
return {
"filters": {
"name": ["in", ["Payment Entry", "Journal Entry", "Sales Invoice", "Purchase Invoice", "Expense Claim"]]
}
};
});
}
});

View File

@@ -0,0 +1,800 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 0,
"autoname": "naming_series:",
"beta": 0,
"creation": "2018-10-22 18:19:02.784533",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "ACC-BTN-.YYYY.-",
"fetch_if_empty": 0,
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Series",
"length": 0,
"no_copy": 1,
"options": "ACC-BTN-.YYYY.-",
"permlevel": 0,
"precision": "",
"print_hide": 1,
"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": 1,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_2",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Settled",
"fetch_if_empty": 0,
"fieldname": "status",
"fieldtype": "Select",
"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": "Status",
"length": 0,
"no_copy": 0,
"options": "\nPending\nSettled",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "bank_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Bank Account",
"length": 0,
"no_copy": 0,
"options": "Bank 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": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "",
"fetch_from": "bank_account.company",
"fetch_if_empty": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_4",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "debit",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Debit",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "credit",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Credit",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_7",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "currency",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Currency",
"length": 0,
"no_copy": 0,
"options": "Currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_10",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "description",
"fieldtype": "Small Text",
"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": "Description",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_14",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "reference_number",
"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": "Reference Number",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "transaction_id",
"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": "Transaction ID",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 1
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "payment_entries",
"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": "Payment Entries",
"length": 0,
"no_copy": 0,
"options": "Bank Transaction Payments",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_17",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "allocated_amount",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Allocated Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "unallocated_amount",
"fieldtype": "Currency",
"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": "Unallocated Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Bank Transaction",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-03-22 10:52:04.540756",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
},
{
"amend": 0,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "date",
"sort_order": "DESC",
"title_field": "bank_account",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
}

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe.utils import flt
from six.moves import reduce
class BankTransaction(Document):
def after_insert(self):
self.unallocated_amount = abs(flt(self.credit) - flt(self.debit))
def on_update_after_submit(self):
allocated_amount = reduce(lambda x, y: flt(x) + flt(y), [x.allocated_amount for x in self.payment_entries])
if allocated_amount:
frappe.db.set_value(self.doctype, self.name, "allocated_amount", flt(allocated_amount))
frappe.db.set_value(self.doctype, self.name, "unallocated_amount", abs(flt(self.credit) - flt(self.debit)) - flt(allocated_amount))
else:
frappe.db.set_value(self.doctype, self.name, "allocated_amount", 0)
frappe.db.set_value(self.doctype, self.name, "unallocated_amount", abs(flt(self.credit) - flt(self.debit)))
self.reload()

View File

@@ -0,0 +1,13 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
frappe.listview_settings['Bank Transaction'] = {
add_fields: ["unallocated_amount"],
get_indicator: function(doc) {
if(flt(doc.unallocated_amount)>0) {
return [__("Unreconciled"), "orange", "unallocated_amount,>,0"];
} else if(flt(doc.unallocated_amount)===0) {
return [__("Reconciled"), "green", "unallocated_amount,=,0"];
}
}
};

View File

@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
import json
from frappe.utils import getdate
from frappe.utils.dateutils import parse_date
from six import iteritems
@frappe.whitelist()
def upload_bank_statement():
if getattr(frappe, "uploaded_file", None):
with open(frappe.uploaded_file, "rb") as upfile:
fcontent = upfile.read()
else:
from frappe.utils.file_manager import get_uploaded_content
fname, fcontent = get_uploaded_content()
if frappe.safe_encode(fname).lower().endswith("csv".encode('utf-8')):
from frappe.utils.csvutils import read_csv_content
rows = read_csv_content(fcontent, False)
elif frappe.safe_encode(fname).lower().endswith("xlsx".encode('utf-8')):
from frappe.utils.xlsxutils import read_xlsx_file_from_attached_file
rows = read_xlsx_file_from_attached_file(fcontent=fcontent)
columns = rows[0]
rows.pop(0)
data = rows
return {"columns": columns, "data": data}
@frappe.whitelist()
def create_bank_entries(columns, data, bank_account):
header_map = get_header_mapping(columns, bank_account)
count = 0
for d in json.loads(data):
if all(item is None for item in d) is True:
continue
fields = {}
for key, value in iteritems(header_map):
fields.update({key: d[int(value)-1]})
bank_transaction = frappe.get_doc({
"doctype": "Bank Transaction"
})
bank_transaction.update(fields)
bank_transaction.date = getdate(parse_date(bank_transaction.date))
bank_transaction.bank_account = bank_account
bank_transaction.insert()
bank_transaction.submit()
count = count + 1
return count
def get_header_mapping(columns, bank_account):
mapping = get_bank_mapping(bank_account)
header_map = {}
for column in json.loads(columns):
if column["content"] in mapping:
header_map.update({mapping[column["content"]]: column["colIndex"]})
return header_map
def get_bank_mapping(bank_account):
bank_name = frappe.db.get_value("Bank Account", bank_account, "bank")
bank = frappe.get_doc("Bank", bank_name)
mapping = {row.file_field:row.bank_transaction_field for row in bank.bank_transaction_mapping}
return mapping

View File

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: Bank Transaction", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new Bank Transaction
() => frappe.tests.make('Bank Transaction', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@@ -0,0 +1,286 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from __future__ import unicode_literals
import frappe
import unittest
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
from erpnext.accounts.page.bank_reconciliation.bank_reconciliation import reconcile, get_linked_payments
test_dependencies = ["Item", "Cost Center"]
class TestBankTransaction(unittest.TestCase):
def setUp(self):
add_transactions()
add_payments()
def tearDown(self):
for bt in frappe.get_all("Bank Transaction"):
doc = frappe.get_doc("Bank Transaction", bt.name)
doc.cancel()
doc.delete()
# Delete directly in DB to avoid validation errors for countries not allowing deletion
frappe.db.sql("""delete from `tabPayment Entry Reference`""")
frappe.db.sql("""delete from `tabPayment Entry`""")
frappe.flags.test_bank_transactions_created = False
frappe.flags.test_payments_created = False
# This test checks if ERPNext is able to provide a linked payment for a bank transaction based on the amount of the bank transaction.
def test_linked_payments(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic"))
linked_payments = get_linked_payments(bank_transaction.name)
self.assertTrue(linked_payments[0].party == "Conrad Electronic")
# This test validates a simple reconciliation leading to the clearance of the bank transaction and the payment
def test_reconcile(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"))
payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1200))
reconcile(bank_transaction.name, "Payment Entry", payment.name)
unallocated_amount = frappe.db.get_value("Bank Transaction", bank_transaction.name, "unallocated_amount")
self.assertTrue(unallocated_amount == 0)
clearance_date = frappe.db.get_value("Payment Entry", payment.name, "clearance_date")
self.assertTrue(clearance_date is not None)
# Check if ERPNext can correctly fetch a linked payment based on the party
def test_linked_payments_based_on_party(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G"))
linked_payments = get_linked_payments(bank_transaction.name)
self.assertTrue(len(linked_payments)==1)
# Check if ERPNext can correctly filter a linked payments based on the debit/credit amount
def test_debit_credit_output(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07"))
linked_payments = get_linked_payments(bank_transaction.name)
self.assertTrue(linked_payments[0].payment_type == "Pay")
# Check error if already reconciled
def test_already_reconciled(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"))
payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1200))
reconcile(bank_transaction.name, "Payment Entry", payment.name)
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"))
payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1200))
self.assertRaises(frappe.ValidationError, reconcile, bank_transaction=bank_transaction.name, payment_doctype="Payment Entry", payment_name=payment.name)
# Raise an error if creditor transaction vs creditor payment
def test_invalid_creditor_reconcilation(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio"))
payment = frappe.get_doc("Payment Entry", dict(party="Conrad Electronic", paid_amount=690))
self.assertRaises(frappe.ValidationError, reconcile, bank_transaction=bank_transaction.name, payment_doctype="Payment Entry", payment_name=payment.name)
# Raise an error if debitor transaction vs debitor payment
def test_invalid_debitor_reconcilation(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07"))
payment = frappe.get_doc("Payment Entry", dict(party="Fayva", paid_amount=109080))
self.assertRaises(frappe.ValidationError, reconcile, bank_transaction=bank_transaction.name, payment_doctype="Payment Entry", payment_name=payment.name)
# Raise an error if debitor transaction vs debitor payment
def test_clear_sales_invoice(self):
bank_transaction = frappe.get_doc("Bank Transaction", dict(description="I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio"))
payment = frappe.get_doc("Sales Invoice", dict(customer="Fayva", status=["=", "Paid"]))
reconcile(bank_transaction.name, "Sales Invoice", payment.name)
self.assertEqual(frappe.db.get_value("Bank Transaction", bank_transaction.name, "unallocated_amount"), 0)
self.assertTrue(frappe.db.get_value("Sales Invoice Payment", dict(parent=payment.name), "clearance_date") is not None)
def add_transactions():
if frappe.flags.test_bank_transactions_created:
return
frappe.set_user("Administrator")
try:
frappe.get_doc({
"doctype": "Bank",
"bank_name":"Citi Bank",
}).insert()
except frappe.DuplicateEntryError:
pass
try:
frappe.get_doc({
"doctype": "Bank Account",
"account_name":"Checking Account",
"bank": "Citi Bank",
"account": "_Test Bank - _TC"
}).insert()
except frappe.DuplicateEntryError:
pass
doc = frappe.get_doc({
"doctype": "Bank Transaction",
"description":"1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G",
"date": "2018-10-23",
"debit": 1200,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank"
}).insert()
doc.submit()
doc = frappe.get_doc({
"doctype": "Bank Transaction",
"description":"1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G",
"date": "2018-10-23",
"debit": 1700,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank"
}).insert()
doc.submit()
doc = frappe.get_doc({
"doctype": "Bank Transaction",
"description":"Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic",
"date": "2018-10-26",
"debit": 690,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank"
}).insert()
doc.submit()
doc = frappe.get_doc({
"doctype": "Bank Transaction",
"description":"Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07",
"date": "2018-10-27",
"debit": 3900,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank"
}).insert()
doc.submit()
doc = frappe.get_doc({
"doctype": "Bank Transaction",
"description":"I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio",
"date": "2018-10-27",
"credit": 109080,
"currency": "INR",
"bank_account": "Checking Account - Citi Bank"
}).insert()
doc.submit()
frappe.flags.test_bank_transactions_created = True
def add_payments():
if frappe.flags.test_payments_created:
return
frappe.set_user("Administrator")
try:
frappe.get_doc({
"doctype": "Supplier",
"supplier_group":"All Supplier Groups",
"supplier_type": "Company",
"supplier_name": "Conrad Electronic"
}).insert()
except frappe.DuplicateEntryError:
pass
pi = make_purchase_invoice(supplier="Conrad Electronic", qty=1, rate=690)
pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Conrad Oct 18"
pe.reference_date = "2018-10-24"
pe.insert()
pe.submit()
try:
frappe.get_doc({
"doctype": "Supplier",
"supplier_group":"All Supplier Groups",
"supplier_type": "Company",
"supplier_name": "Mr G"
}).insert()
except frappe.DuplicateEntryError:
pass
pi = make_purchase_invoice(supplier="Mr G", qty=1, rate=1200)
pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Herr G Oct 18"
pe.reference_date = "2018-10-24"
pe.insert()
pe.submit()
pi = make_purchase_invoice(supplier="Mr G", qty=1, rate=1700)
pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Herr G Nov 18"
pe.reference_date = "2018-11-01"
pe.insert()
pe.submit()
try:
frappe.get_doc({
"doctype": "Supplier",
"supplier_group":"All Supplier Groups",
"supplier_type": "Company",
"supplier_name": "Poore Simon's"
}).insert()
except frappe.DuplicateEntryError:
pass
try:
frappe.get_doc({
"doctype": "Customer",
"customer_group":"All Customer Groups",
"customer_type": "Company",
"customer_name": "Poore Simon's"
}).insert()
except frappe.DuplicateEntryError:
pass
pi = make_purchase_invoice(supplier="Poore Simon's", qty=1, rate=3900)
pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Poore Simon's Oct 18"
pe.reference_date = "2018-10-28"
pe.insert()
pe.submit()
si = create_sales_invoice(customer="Poore Simon's", qty=1, rate=3900)
pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Poore Simon's Oct 18"
pe.reference_date = "2018-10-28"
pe.insert()
pe.submit()
try:
frappe.get_doc({
"doctype": "Customer",
"customer_group":"All Customer Groups",
"customer_type": "Company",
"customer_name": "Fayva"
}).insert()
except frappe.DuplicateEntryError:
pass
si = create_sales_invoice(customer="Fayva", qty=1, rate=109080)
pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank - _TC")
pe.reference_no = "Fayva Oct 18"
pe.reference_date = "2018-10-29"
pe.insert()
pe.submit()
company = frappe.db.get_single_value('Global Defaults', 'default_company')
frappe.get_doc({
"doctype": "Mode of Payment",
"name": "Cash"
}).append("accounts", {
"company": company,
"default_account": "_Test Bank - _TC"
}).save()
si = create_sales_invoice(customer="Fayva", qty=1, rate=109080, do_not_submit=1)
si.is_pos = 1
si.append("payments", {
"mode_of_payment": "Cash",
"account": "_Test Bank - _TC",
"amount": 109080
})
si.save()
si.submit()
frappe.flags.test_payments_created = True

View File

@@ -0,0 +1,107 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2018-10-24 15:24:56.713277",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "bank_transaction_field",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Field in Bank Transaction",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "file_field",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Column in Bank File",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-10-24 15:24:56.713277",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Mapping",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0,
"track_views": 0
}

View File

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

View File

@@ -0,0 +1,141 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2018-11-28 08:55:40.815355",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_document",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Payment Document",
"length": 0,
"no_copy": 0,
"options": "DocType",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Payment Entry",
"length": 0,
"no_copy": 0,
"options": "payment_document",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "allocated_amount",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Allocated Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"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-12-06 10:57:02.635141",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Payments",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
}

View File

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

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 0,
@@ -19,6 +20,7 @@
"collapsible": 0,
"columns": 0,
"default": "Cost Center",
"fetch_if_empty": 0,
"fieldname": "budget_against",
"fieldtype": "Select",
"hidden": 0,
@@ -52,6 +54,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -86,6 +89,7 @@
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.budget_against == 'Cost Center'",
"fetch_if_empty": 0,
"fieldname": "cost_center",
"fieldtype": "Link",
"hidden": 0,
@@ -120,6 +124,7 @@
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.budget_against == 'Project'",
"fetch_if_empty": 0,
"fieldname": "project",
"fieldtype": "Link",
"hidden": 0,
@@ -153,6 +158,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "fiscal_year",
"fieldtype": "Link",
"hidden": 0,
@@ -186,6 +192,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"hidden": 0,
@@ -218,6 +225,7 @@
"collapsible": 0,
"columns": 0,
"depends_on": "eval:in_list([\"Stop\", \"Warn\"], doc.action_if_accumulated_monthly_budget_exceeded_on_po || doc.action_if_accumulated_monthly_budget_exceeded_on_mr || doc.action_if_accumulated_monthly_budget_exceeded_on_actual)",
"fetch_if_empty": 0,
"fieldname": "monthly_distribution",
"fieldtype": "Link",
"hidden": 0,
@@ -251,6 +259,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
@@ -283,6 +292,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_6",
"fieldtype": "Section Break",
"hidden": 0,
@@ -315,6 +325,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "applicable_on_material_request",
"fieldtype": "Check",
"hidden": 0,
@@ -343,12 +354,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Stop",
"depends_on": "eval:doc.applicable_on_material_request == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_annual_budget_exceeded_on_mr",
"fieldtype": "Select",
"hidden": 0,
@@ -378,12 +390,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Warn",
"depends_on": "eval:doc.applicable_on_material_request == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_accumulated_monthly_budget_exceeded_on_mr",
"fieldtype": "Select",
"hidden": 0,
@@ -417,6 +430,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_13",
"fieldtype": "Column Break",
"hidden": 0,
@@ -448,6 +462,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "applicable_on_purchase_order",
"fieldtype": "Check",
"hidden": 0,
@@ -476,12 +491,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Stop",
"depends_on": "eval:doc.applicable_on_purchase_order == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_annual_budget_exceeded_on_po",
"fieldtype": "Select",
"hidden": 0,
@@ -511,12 +527,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Warn",
"depends_on": "eval:doc.applicable_on_purchase_order == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_accumulated_monthly_budget_exceeded_on_po",
"fieldtype": "Select",
"hidden": 0,
@@ -550,6 +567,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_16",
"fieldtype": "Section Break",
"hidden": 0,
@@ -581,6 +599,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "applicable_on_booking_actual_expenses",
"fieldtype": "Check",
"hidden": 0,
@@ -609,12 +628,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Stop",
"depends_on": "eval:doc.applicable_on_booking_actual_expenses == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_annual_budget_exceeded",
"fieldtype": "Select",
"hidden": 0,
@@ -644,12 +664,13 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Warn",
"depends_on": "eval:doc.applicable_on_booking_actual_expenses == 1",
"fetch_if_empty": 0,
"fieldname": "action_if_accumulated_monthly_budget_exceeded",
"fieldtype": "Select",
"hidden": 0,
@@ -683,6 +704,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "section_break_21",
"fieldtype": "Section Break",
"hidden": 0,
@@ -715,6 +737,7 @@
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fetch_if_empty": 0,
"fieldname": "accounts",
"fieldtype": "Table",
"hidden": 0,
@@ -735,7 +758,7 @@
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
@@ -752,7 +775,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-09-12 11:02:41.825923",
"modified": "2019-03-22 12:06:02.323099",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget",
@@ -785,7 +808,7 @@
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_changes": 1,
"track_seen": 0,
"track_views": 0
}

View File

@@ -1,3 +1,5 @@
from __future__ import unicode_literals
DEFAULT_MAPPERS = [
{
'doctype': 'Cash Flow Mapper',

View File

@@ -1,403 +1,434 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "naming_series:",
"beta": 0,
"creation": "2018-06-18 16:51:49.994750",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Cashier-closing-",
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 1,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Series",
"length": 0,
"no_copy": 0,
"options": "Cashier-closing-\n",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "user",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "User",
"length": 0,
"no_copy": 0,
"options": "User",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Today",
"fieldname": "date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "From Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "",
"fieldname": "time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "To Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "expense",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Expense",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "custody",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Custody",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "outstanding_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Outstanding Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.0",
"fieldname": "payments",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Payments",
"length": 0,
"no_copy": 0,
"options": "Cashier Closing Payments",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "net_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Net Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Cashier Closing",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-09-03 10:59:54.500567",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing",
"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": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "naming_series:",
"beta": 0,
"creation": "2018-06-18 16:51:49.994750",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "POS-CLO-",
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 1,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Series",
"length": 0,
"no_copy": 0,
"options": "POS-CLO-",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "user",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "User",
"length": 0,
"no_copy": 0,
"options": "User",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Today",
"fieldname": "date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "From Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "",
"fieldname": "time",
"fieldtype": "Time",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1,
"label": "To Time",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "expense",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Expense",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "custody",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Custody",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "returns",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Returns",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.00",
"fieldname": "outstanding_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Outstanding Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.0",
"fieldname": "payments",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Payments",
"length": 0,
"no_copy": 0,
"options": "Cashier Closing Payments",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "net_amount",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Net Amount",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Cashier Closing",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-03-14 09:14:26.727129",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing",
"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": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

@@ -29,8 +29,8 @@ class CashierClosing(Document):
for i in self.payments:
total += flt(i.amount)
self.net_amount = total + self.outstanding_amount + self.expense - self.custody
self.net_amount = total + self.outstanding_amount + self.expense - self.custody + self.returns
def validate_time(self):
if self.from_time >= self.time:
frappe.throw(_("From Time Should Be Less Than To Time"))
frappe.throw(_("From Time Should Be Less Than To Time"))

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
@@ -14,6 +15,7 @@
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -41,10 +43,12 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -63,7 +67,7 @@
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -72,6 +76,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
@@ -85,7 +90,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-09-02 14:45:36.303520",
"modified": "2019-02-19 08:34:20.268037",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing Payments",
@@ -99,5 +104,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@@ -46,7 +46,7 @@ frappe.ui.form.on('Cost Center', {
doctype_name: frm.doc.doctype,
name: frm.doc.name,
field_name: d.fields[0].fieldname,
field_value: data.cost_center_number,
number_value: data.cost_center_number,
company: frm.doc.company
},
callback: function(r) {

View File

@@ -9,6 +9,8 @@ from dateutil.relativedelta import relativedelta
from frappe.model.document import Document
class FiscalYearIncorrectDate(frappe.ValidationError): pass
class FiscalYear(Document):
def set_as_default(self):
frappe.db.set_value("Global Defaults", None, "current_fiscal_year", self.name)
@@ -35,11 +37,14 @@ class FiscalYear(Document):
def validate_dates(self):
if getdate(self.year_start_date) > getdate(self.year_end_date):
frappe.throw(_("Fiscal Year Start Date should not be greater than Fiscal Year End Date"))
frappe.throw(_("Fiscal Year Start Date should be one year earlier than Fiscal Year End Date"),
FiscalYearIncorrectDate)
if (getdate(self.year_end_date) - getdate(self.year_start_date)).days > 366:
date = getdate(self.year_start_date) + relativedelta(years=1) - relativedelta(days=1)
self.year_end_date = date.strftime("%Y-%m-%d")
date = getdate(self.year_start_date) + relativedelta(years=1) - relativedelta(days=1)
if getdate(self.year_end_date) != date:
frappe.throw(_("Fiscal Year End Date should be one year after Fiscal Year Start Date"),
FiscalYearIncorrectDate)
def on_update(self):
check_duplicate_fiscal_year(self)

View File

@@ -5,6 +5,8 @@ from __future__ import unicode_literals
import frappe, unittest
from erpnext.accounts.doctype.fiscal_year.fiscal_year import FiscalYearIncorrectDate
test_records = frappe.get_test_records('Fiscal Year')
test_ignore = ["Company"]
@@ -12,12 +14,12 @@ class TestFiscalYear(unittest.TestCase):
def test_extra_year(self):
if frappe.db.exists("Fiscal Year", "_Test Fiscal Year 2000"):
frappe.delete_doc("Fiscal Year", "_Test Fiscal Year 2000")
fy = frappe.get_doc({
"doctype": "Fiscal Year",
"year": "_Test Fiscal Year 2000",
"year_end_date": "2002-12-31",
"year_start_date": "2000-04-01"
})
fy.insert()
self.assertEqual(fy.year_end_date, '2001-03-31')
self.assertRaises(FiscalYearIncorrectDate, fy.insert)

View File

@@ -6,6 +6,7 @@ import frappe, erpnext
from frappe import _
from frappe.utils import flt, fmt_money, getdate, formatdate
from frappe.model.document import Document
from frappe.model.meta import get_field_precision
from erpnext.accounts.party import validate_party_gle_currency, validate_party_frozen_disabled
from erpnext.accounts.utils import get_account_currency
from erpnext.accounts.utils import get_fiscal_year
@@ -56,7 +57,7 @@ class GLEntry(Document):
.format(self.voucher_type, self.voucher_no, self.account))
# Zero value transaction is not allowed
if not (flt(self.debit) or flt(self.credit)):
if not (flt(self.debit, self.precision("debit")) or flt(self.credit, self.precision("credit"))):
frappe.throw(_("{0} {1}: Either debit or credit amount is required for {2}")
.format(self.voucher_type, self.voucher_no, self.account))
@@ -74,7 +75,8 @@ class GLEntry(Document):
def check_pl_account(self):
if self.is_opening=='Yes' and \
frappe.db.get_value("Account", self.account, "report_type")=="Profit and Loss":
frappe.db.get_value("Account", self.account, "report_type")=="Profit and Loss" and \
self.voucher_type not in ['Purchase Invoice', 'Sales Invoice']:
frappe.throw(_("{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry")
.format(self.voucher_type, self.voucher_no, self.account))
@@ -215,17 +217,23 @@ def validate_frozen_account(account, adv_adj=None):
def update_against_account(voucher_type, voucher_no):
entries = frappe.db.get_all("GL Entry",
filters={"voucher_type": voucher_type, "voucher_no": voucher_no},
fields=["name", "party", "against", "debit", "credit", "account"])
fields=["name", "party", "against", "debit", "credit", "account", "company"])
if not entries:
return
company_currency = erpnext.get_company_currency(entries[0].company)
precision = get_field_precision(frappe.get_meta("GL Entry")
.get_field("debit"), company_currency)
accounts_debited, accounts_credited = [], []
for d in entries:
if flt(d.debit > 0): accounts_debited.append(d.party or d.account)
if flt(d.credit) > 0: accounts_credited.append(d.party or d.account)
if flt(d.debit, precision) > 0: accounts_debited.append(d.party or d.account)
if flt(d.credit, precision) > 0: accounts_credited.append(d.party or d.account)
for d in entries:
if flt(d.debit > 0):
if flt(d.debit, precision) > 0:
new_against = ", ".join(list(set(accounts_credited)))
if flt(d.credit > 0):
if flt(d.credit, precision) > 0:
new_against = ", ".join(list(set(accounts_debited)))
if d.against != new_against:

View File

@@ -205,6 +205,13 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
};
}
// payroll entry
if(jvd.reference_type==="Payroll Entry") {
return {
query: "erpnext.hr.doctype.payroll_entry.payroll_entry.get_payroll_entries_for_jv",
};
}
var out = {
filters: [
[jvd.reference_type, "docstatus", "=", 1]
@@ -227,10 +234,18 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
out.filters.push([jvd.reference_type, "per_billed", "<", 100]);
}
if(jvd.party_type && jvd.party) {
out.filters.push([jvd.reference_type,
(jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier"), "=", jvd.party]);
var party_field = "";
if(jvd.reference_type.indexOf("Sales")===0) {
var party_field = "customer";
} else if (jvd.reference_type.indexOf("Purchase")===0) {
var party_field = "supplier";
}
if (party_field) {
out.filters.push([jvd.reference_type, party_field, "=", jvd.party]);
}
}
return out;

View File

@@ -52,6 +52,7 @@ class JournalEntry(AccountsController):
self.update_loan()
self.update_inter_company_jv()
def get_title(self):
return self.pay_to_recd_from or self.accounts[0].account

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
@@ -398,7 +399,7 @@
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "6",
"precision": "9",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -911,7 +912,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-08-19 04:08:44.742510",
"modified": "2019-02-18 19:00:53.662788",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry Account",

View File

@@ -1,6 +1,7 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors
# See license.txt
from __future__ import unicode_literals
import frappe
import unittest

View File

@@ -232,6 +232,13 @@ frappe.ui.form.on('Payment Entry', {
},
party_type: function(frm) {
let party_types = Object.keys(frappe.boot.party_account_types);
if(frm.doc.party_type && !party_types.includes(frm.doc.party_type)){
frm.set_value("party_type", "");
frappe.throw(__("Party can only be one of "+ party_types.join(", ")));
}
if(frm.doc.party) {
$.each(["party", "party_balance", "paid_from", "paid_to",
"paid_from_account_currency", "paid_from_account_balance",
@@ -284,7 +291,12 @@ frappe.ui.form.on('Payment Entry', {
() => frm.events.get_outstanding_documents(frm),
() => frm.events.hide_unhide_fields(frm),
() => frm.events.set_dynamic_labels(frm),
() => { frm.set_party_account_based_on_party = false; }
() => {
frm.set_party_account_based_on_party = false;
if (r.message.bank_account) {
frm.set_value("bank_account", r.message.bank_account);
}
}
]);
}
}
@@ -833,6 +845,25 @@ frappe.ui.form.on('Payment Entry', {
}
})
}
},
bank_account: function(frm) {
const field = frm.doc.payment_type == "Pay" ? "paid_from":"paid_to";
if (frm.doc.bank_account && in_list(['Pay', 'Receive'], frm.doc.payment_type)) {
frappe.call({
method: "erpnext.accounts.doctype.bank_account.bank_account.get_bank_account_details",
args: {
bank_account: frm.doc.bank_account
},
callback: function(r) {
if (r.message) {
frm.set_value(field, r.message.account);
frm.set_value('bank', r.message.bank);
frm.set_value('bank_account_no', r.message.bank_account_no);
}
}
});
}
}
});

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,13 @@ from __future__ import unicode_literals
import frappe, erpnext, json
from frappe import _, scrub, ValidationError
from frappe.utils import flt, comma_or, nowdate, getdate
from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on
from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on, get_allow_cost_center_in_entry_of_bs_account
from erpnext.accounts.party import get_party_account
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
from erpnext.setup.utils import get_exchange_rate
from erpnext.accounts.general_ledger import make_gl_entries
from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount
from erpnext.accounts.doctype.bank_account.bank_account import get_party_bank_account, get_bank_account_details
from erpnext.controllers.accounts_controller import AccountsController, get_supplier_block_status
from six import string_types, iteritems
@@ -69,6 +70,7 @@ class PaymentEntry(AccountsController):
self.update_advance_paid()
self.update_expense_claim()
def on_cancel(self):
self.setup_party_account_field()
self.make_gl_entries(cancel=1)
@@ -88,6 +90,16 @@ class PaymentEntry(AccountsController):
.format(d.idx, d.reference_doctype, d.reference_name))
reference_names.append((d.reference_doctype, d.reference_name))
def set_bank_account_data(self):
if self.bank_account:
bank_data = get_bank_account_details(self.bank_account)
field = "paid_from" if self.payment_type == "Pay" else "paid_to"
self.bank = bank_data.bank
self.bank_account_no = bank_data.bank_account_no
self.set(field, bank_data.account)
def validate_allocated_amount(self):
for d in self.get("references"):
if (flt(d.allocated_amount))> 0:
@@ -160,7 +172,7 @@ class PaymentEntry(AccountsController):
if not frappe.db.exists(self.party_type, self.party):
frappe.throw(_("Invalid {0}: {1}").format(self.party_type, self.party))
if self.party_account:
if self.party_account and self.party_type in ("Customer", "Supplier"):
self.validate_account_type(self.party_account,
[erpnext.get_party_account_type(self.party_type)])
@@ -524,9 +536,13 @@ class PaymentEntry(AccountsController):
@frappe.whitelist()
def get_outstanding_reference_documents(args):
if isinstance(args, string_types):
args = json.loads(args)
if args.get('party_type') == 'Member':
return
# confirm that Supplier is not blocked
if args.get('party_type') == 'Supplier':
supplier_status = get_supplier_block_status(args['party'])
@@ -553,8 +569,8 @@ def get_outstanding_reference_documents(args):
.format(frappe.db.escape(args["voucher_type"]), frappe.db.escape(args["voucher_no"]))
# Add cost center condition
if args.get("cost_center"):
condition += " and cost_center='%s'" % args.get("cost_center")
if args.get("cost_center") and get_allow_cost_center_in_entry_of_bs_account():
condition += " and cost_center='%s'" % args.get("cost_center")
outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"),
args.get("party_account"), condition=condition)
@@ -670,6 +686,7 @@ def get_negative_outstanding_invoices(party_type, party, party_account, party_ac
@frappe.whitelist()
def get_party_details(company, party_type, party, date, cost_center=None):
bank_account = ''
if not frappe.db.exists(party_type, party):
frappe.throw(_("Invalid {0}: {1}").format(party_type, party))
@@ -677,16 +694,19 @@ def get_party_details(company, party_type, party, date, cost_center=None):
account_currency = get_account_currency(party_account)
account_balance = get_balance_on(party_account, date, cost_center=cost_center)
_party_name = "title" if party_type == "Student" else party_type.lower() + "_name"
_party_name = "title" if party_type in ("Student", "Shareholder") else party_type.lower() + "_name"
party_name = frappe.db.get_value(party_type, party, _party_name)
party_balance = get_balance_on(party_type=party_type, party=party, cost_center=cost_center)
if party_type in ["Customer", "Supplier"]:
bank_account = get_party_bank_account(party_type, party)
return {
"party_account": party_account,
"party_name": party_name,
"party_account_currency": account_currency,
"party_balance": party_balance,
"account_balance": account_balance
"account_balance": account_balance,
"bank_account": bank_account
}
@@ -733,7 +753,7 @@ def get_outstanding_on_journal_entry(name):
@frappe.whitelist()
def get_reference_details(reference_doctype, reference_name, party_account_currency):
total_amount = outstanding_amount = exchange_rate = None
total_amount = outstanding_amount = exchange_rate = bill_no = None
ref_doc = frappe.get_doc(reference_doctype, reference_name)
company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency(ref_doc.company)
@@ -767,6 +787,7 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
if reference_doctype in ("Sales Invoice", "Purchase Invoice"):
outstanding_amount = ref_doc.get("outstanding_amount")
bill_no = ref_doc.get("bill_no")
elif reference_doctype == "Expense Claim":
outstanding_amount = flt(ref_doc.get("total_sanctioned_amount")) \
- flt(ref_doc.get("total_amount+reimbursed")) - flt(ref_doc.get("total_advance_amount"))
@@ -783,7 +804,8 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
"due_date": ref_doc.get("due_date"),
"total_amount": total_amount,
"outstanding_amount": outstanding_amount,
"exchange_rate": exchange_rate
"exchange_rate": exchange_rate,
"bill_no": bill_no
})
@@ -890,6 +912,11 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=
pe.allocate_payment_amount = 1
pe.letter_head = doc.get("letter_head")
if pe.party_type in ["Customer", "Supplier"]:
bank_account = get_party_bank_account(pe.party_type, pe.party)
pe.set("bank_account", bank_account)
pe.set_bank_account_data()
# only Purchase Invoice can be blocked individually
if doc.doctype == "Purchase Invoice" and doc.invoice_is_blocked():
frappe.msgprint(_('{0} is on hold till {1}'.format(doc.name, doc.release_date)))

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
from frappe import _
def get_data():

View File

@@ -1,23 +1,34 @@
{
"allow_copy": 1,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2014-07-09 12:04:51.681583",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 0,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
@@ -26,22 +37,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "party_type",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Party Type",
"length": 0,
"no_copy": 0,
@@ -50,23 +69,31 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "party",
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Party",
"length": 0,
"no_copy": 0,
@@ -75,22 +102,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "receivable_payable_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Receivable / Payable Account",
"length": 0,
"no_copy": 0,
@@ -100,22 +135,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "bank_cash_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": "Bank / Cash Account",
"length": 0,
"no_copy": 0,
@@ -124,22 +167,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "col_break1",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "",
"length": 0,
"no_copy": 0,
@@ -147,22 +198,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "From Invoice Date",
"length": 0,
"no_copy": 0,
@@ -170,22 +229,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "to_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "To Invoice Date",
"length": 0,
"no_copy": 0,
@@ -193,22 +260,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "minimum_amount",
"fieldtype": "Currency",
"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": "Minimum Invoice Amount",
"length": 0,
"no_copy": 0,
@@ -216,22 +291,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "maximum_amount",
"fieldtype": "Currency",
"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": "Maximum Invoice Amount",
"length": 0,
"no_copy": 0,
@@ -239,22 +322,63 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "System will fetch all the entries if limit value is zero.",
"fieldname": "limit",
"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": "Limit",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "get_unreconciled_entries",
"fieldtype": "Button",
"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": "Get Unreconciled Entries",
"length": 0,
"no_copy": 0,
@@ -262,22 +386,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sec_break1",
"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": "Unreconciled Payment Details",
"length": 0,
"no_copy": 0,
@@ -285,22 +417,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payments",
"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": "Payments",
"length": 0,
"no_copy": 0,
@@ -309,22 +449,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reconcile",
"fieldtype": "Button",
"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": "Reconcile",
"length": 0,
"no_copy": 0,
@@ -332,22 +480,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sec_break2",
"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": "Invoice/Journal Entry Details",
"length": 0,
"no_copy": 0,
@@ -355,22 +511,30 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "invoices",
"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": "Invoices",
"length": 0,
"no_copy": 0,
@@ -379,25 +543,28 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 1,
"icon": "fa fa-resize-horizontal",
"icon": "icon-resize-horizontal",
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 1,
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
"modified": "2016-01-04 02:26:58.807921",
"modified": "2019-01-15 17:42:21.135214",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Reconciliation",
@@ -406,7 +573,6 @@
"permissions": [
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -426,7 +592,6 @@
},
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -445,8 +610,13 @@
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC"
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
}

View File

@@ -13,20 +13,20 @@ class PaymentReconciliation(Document):
def get_unreconciled_entries(self):
self.get_nonreconciled_payment_entries()
self.get_invoice_entries()
def get_nonreconciled_payment_entries(self):
self.check_mandatory_to_fetch()
payment_entries = self.get_payment_entries()
journal_entries = self.get_jv_entries()
self.add_payment_entries(payment_entries + journal_entries)
def get_payment_entries(self):
order_doctype = "Sales Order" if self.party_type=="Customer" else "Purchase Order"
payment_entries = get_advance_payment_entries(self.party_type, self.party,
self.receivable_payable_account, order_doctype, against_all_orders=True)
payment_entries = get_advance_payment_entries(self.party_type, self.party,
self.receivable_payable_account, order_doctype, against_all_orders=True, limit=self.limit)
return payment_entries
def get_jv_entries(self):
@@ -36,10 +36,12 @@ class PaymentReconciliation(Document):
bank_account_condition = "t2.against_account like %(bank_cash_account)s" \
if self.bank_cash_account else "1=1"
limit_cond = "limit %s" % self.limit if self.limit else ""
journal_entries = frappe.db.sql("""
select
"Journal Entry" as reference_type, t1.name as reference_name,
t1.posting_date, t1.remark as remarks, t2.name as reference_row,
"Journal Entry" as reference_type, t1.name as reference_name,
t1.posting_date, t1.remark as remarks, t2.name as reference_row,
{dr_or_cr} as amount, t2.is_advance
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
@@ -47,18 +49,19 @@ class PaymentReconciliation(Document):
t1.name = t2.parent and t1.docstatus = 1 and t2.docstatus = 1
and t2.party_type = %(party_type)s and t2.party = %(party)s
and t2.account = %(account)s and {dr_or_cr} > 0
and (t2.reference_type is null or t2.reference_type = '' or
(t2.reference_type in ('Sales Order', 'Purchase Order')
and (t2.reference_type is null or t2.reference_type = '' or
(t2.reference_type in ('Sales Order', 'Purchase Order')
and t2.reference_name is not null and t2.reference_name != ''))
and (CASE
WHEN t1.voucher_type in ('Debit Note', 'Credit Note')
THEN 1=1
ELSE {bank_account_condition}
END)
order by t1.posting_date
order by t1.posting_date {limit_cond}
""".format(**{
"dr_or_cr": dr_or_cr,
"bank_account_condition": bank_account_condition,
"limit_cond": limit_cond
}), {
"party_type": self.party_type,
"party": self.party,
@@ -82,6 +85,9 @@ class PaymentReconciliation(Document):
non_reconciled_invoices = get_outstanding_invoices(self.party_type, self.party,
self.receivable_payable_account, condition=condition)
if self.limit:
non_reconciled_invoices = non_reconciled_invoices[:self.limit]
self.add_invoice_entries(non_reconciled_invoices)
def add_invoice_entries(self, non_reconciled_invoices):
@@ -106,7 +112,7 @@ class PaymentReconciliation(Document):
self.validate_invoice()
dr_or_cr = ("credit_in_account_currency"
if erpnext.get_party_account_type(self.party_type) == 'Receivable' else "debit_in_account_currency")
lst = []
for e in self.get('payments'):
if e.invoice_number and e.allocated_amount:
@@ -124,11 +130,11 @@ class PaymentReconciliation(Document):
'unadjusted_amount' : flt(e.amount),
'allocated_amount' : flt(e.allocated_amount)
}))
if lst:
from erpnext.accounts.utils import reconcile_against_document
reconcile_against_document(lst)
msgprint(_("Successfully Reconciled"))
self.get_unreconciled_entries()

View File

@@ -54,7 +54,7 @@ frappe.ui.form.on("Payment Request", "is_a_subscription", function(frm) {
frm.toggle_reqd("payment_gateway_account", frm.doc.is_a_subscription);
frm.toggle_reqd("subscription_plans", frm.doc.is_a_subscription);
if (frm.doc.is_a_subscription) {
if (frm.doc.is_a_subscription && frm.doc.reference_doctype && frm.doc.reference_name) {
frappe.call({
method: "erpnext.accounts.doctype.payment_request.payment_request.get_subscription_details",
args: {"reference_doctype": frm.doc.reference_doctype, "reference_name": frm.doc.reference_name},

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
@@ -425,7 +426,7 @@
"no_copy": 0,
"options": "currency",
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -1501,7 +1502,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-09-06 14:44:43.563367",
"modified": "2019-02-18 18:52:34.203239",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",

View File

@@ -214,9 +214,10 @@ class PaymentRequest(Document):
def check_if_payment_entry_exists(self):
if self.status == "Paid":
payment_entry = frappe.db.sql_list("""select parent from `tabPayment Entry Reference`
where reference_name=%s""", self.reference_name)
if payment_entry:
if frappe.get_all("Payment Entry Reference",
filters={"reference_name": self.reference_name, "docstatus": ["<", 2]},
fields=["parent"],
limit=1):
frappe.throw(_("Payment Entry already exists"), title=_('Error'))
def make_communication_entry(self):

View File

@@ -8,5 +8,6 @@ frappe.ui.form.on('Payment Terms Template', {
frm.add_fetch("payment_term", "due_date_based_on", "due_date_based_on");
frm.add_fetch("payment_term", "credit_days", "credit_days");
frm.add_fetch("payment_term", "credit_months", "credit_months");
frm.add_fetch("payment_term", "mode_of_payment", "mode_of_payment");
}
});

View File

@@ -33,6 +33,14 @@ frappe.ui.form.on('POS Profile', {
};
});
frm.set_query("account_for_change_amount", function() {
return {
filters: {
account_type: ['in', ["Cash", "Bank"]]
}
};
});
frm.set_query("print_format", function() {
return { filters: { doc_type: "Sales Invoice", print_format_type: "Js"} };
});

View File

@@ -196,8 +196,9 @@ def get_pricing_rule_for_item(args):
pricing_rule_rate = 0.0
if pricing_rule.currency == args.currency:
pricing_rule_rate = pricing_rule.rate
item_details.update({
"price_list_rate": pricing_rule_rate,
"price_list_rate": pricing_rule_rate * args.get("conversion_factor"),
"discount_percentage": 0.0
})
else:

View File

@@ -9,9 +9,12 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
this.setup_posting_date_time_check();
this._super(doc);
// formatter for material request item
this.frm.set_indicator_formatter('item_code',
function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" })
// formatter for purchase invoice item
if(this.frm.doc.update_stock) {
this.frm.set_indicator_formatter('item_code', function(doc) {
return (doc.qty<=doc.received_qty) ? "green" : "orange";
});
}
},
onload: function() {
this._super();
@@ -465,7 +468,7 @@ cur_frm.fields_dict["items"].grid.get_field("cost_center").get_query = function(
cur_frm.cscript.cost_center = function(doc, cdt, cdn){
var d = locals[cdt][cdn];
if(d.idx == 1 && d.cost_center){
if(d.cost_center){
var cl = doc.items || [];
for(var i = 0; i < cl.length; i++){
if(!cl[i].cost_center) cl[i].cost_center = d.cost_center;
@@ -507,11 +510,25 @@ frappe.ui.form.on("Purchase Invoice", {
}
}
}
frm.set_query("cost_center", function() {
return {
filters: {
company: frm.doc.company,
is_group: 0
}
};
});
},
onload: function(frm) {
if(frm.doc.__onload && !frm.doc.__onload.supplier_tds) {
me.frm.set_df_property("apply_tds", "read_only", 1);
if(frm.doc.__onload) {
if(frm.doc.supplier) {
frm.doc.apply_tds = frm.doc.__onload.supplier_tds ? 1 : 0;
}
if(!frm.doc.__onload.supplier_tds) {
frm.set_df_property("apply_tds", "read_only", 1);
}
}
erpnext.queries.setup_queries(frm, "Warehouse", function() {

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,14 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import frappe, erpnext
from frappe.utils import cint, cstr, formatdate, flt, getdate, nowdate
from frappe import _, throw
import frappe.defaults
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.controllers.buying_controller import BuyingController
from erpnext.accounts.party import get_party_account, get_due_date
from erpnext.accounts.utils import get_account_currency, get_fiscal_year
@@ -16,7 +18,7 @@ from erpnext.accounts.general_ledger import make_gl_entries, merge_similar_entri
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
from erpnext.buying.utils import check_for_closed_status
from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
from erpnext.assets.doctype.asset.asset import get_asset_account
from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled
from frappe.model.mapper import get_mapped_doc
from six import iteritems
from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\
@@ -45,6 +47,7 @@ class PurchaseInvoice(BuyingController):
}]
def onload(self):
super(PurchaseInvoice, self).onload()
supplier_tds = frappe.db.get_value("Supplier", self.supplier, "tax_withholding_category")
self.set_onload("supplier_tds", supplier_tds)
@@ -52,6 +55,7 @@ class PurchaseInvoice(BuyingController):
if not self.on_hold:
self.release_date = ''
def invoice_is_blocked(self):
return self.on_hold and (not self.release_date or self.release_date > getdate(nowdate()))
@@ -214,7 +218,7 @@ class PurchaseInvoice(BuyingController):
self.validate_item_code()
self.validate_warehouse()
if auto_accounting_for_stock:
warehouse_account = get_warehouse_account_map()
warehouse_account = get_warehouse_account_map(self.company)
for item in self.get("items"):
# in case of auto inventory accounting,
@@ -230,7 +234,14 @@ class PurchaseInvoice(BuyingController):
item.expense_account = warehouse_account[item.warehouse]["account"]
else:
item.expense_account = stock_not_billed_account
elif item.is_fixed_asset and d.pr_detail:
elif item.is_fixed_asset and is_cwip_accounting_disabled():
if not item.asset:
frappe.throw(_("Row {0}: asset is required for item {1}")
.format(item.idx, item.item_code))
item.expense_account = get_asset_category_account(item.asset, 'fixed_asset_account',
company = self.company)
elif item.is_fixed_asset and item.pr_detail:
item.expense_account = asset_received_but_not_billed
elif not item.expense_account and for_validate:
throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
@@ -358,7 +369,8 @@ class PurchaseInvoice(BuyingController):
if repost_future_gle and cint(self.update_stock) and self.auto_accounting_for_stock:
from erpnext.controllers.stock_controller import update_gl_entries_after
items, warehouses = self.get_items_and_warehouses()
update_gl_entries_after(self.posting_date, self.posting_time, warehouses, items)
update_gl_entries_after(self.posting_date, self.posting_time,
warehouses, items, company = self.company)
elif self.docstatus == 2 and cint(self.update_stock) and self.auto_accounting_for_stock:
delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
@@ -375,7 +387,9 @@ class PurchaseInvoice(BuyingController):
self.make_supplier_gl_entry(gl_entries)
self.make_item_gl_entries(gl_entries)
self.get_asset_gl_entry(gl_entries)
if not is_cwip_accounting_disabled():
self.get_asset_gl_entry(gl_entries)
self.make_tax_gl_entries(gl_entries)
gl_entries = merge_similar_entries(gl_entries)
@@ -415,7 +429,7 @@ class PurchaseInvoice(BuyingController):
stock_items = self.get_stock_items()
expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
if self.update_stock and self.auto_accounting_for_stock:
warehouse_account = get_warehouse_account_map()
warehouse_account = get_warehouse_account_map(self.company)
voucher_wise_stock_value = {}
if self.update_stock:
@@ -467,7 +481,7 @@ class PurchaseInvoice(BuyingController):
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": flt(item.rm_supp_cost)
}, warehouse_account[self.supplier_warehouse]["account_currency"]))
elif not item.is_fixed_asset:
elif not item.is_fixed_asset or (item.is_fixed_asset and is_cwip_accounting_disabled()):
gl_entries.append(
self.get_gl_dict({
"account": item.expense_account if not item.enable_deferred_expense else item.deferred_expense_account,
@@ -512,7 +526,7 @@ class PurchaseInvoice(BuyingController):
base_asset_amount = flt(item.base_net_amount + item.item_tax_amount)
if (not item.expense_account or frappe.db.get_value('Account',
item.expense_account, 'account_type') != 'Asset Received But Not Billed'):
item.expense_account, 'account_type') not in ['Asset Received But Not Billed', 'Fixed Asset']):
arbnb_account = self.get_company_default("asset_received_but_not_billed")
item.expense_account = arbnb_account
@@ -775,9 +789,8 @@ class PurchaseInvoice(BuyingController):
for d in self.items:
if d.project and d.project not in project_list:
project = frappe.get_doc("Project", d.project)
project.flags.dont_sync_tasks = True
project.update_purchase_costing()
project.save()
project.db_update()
project_list.append(d.project)
def validate_supplier_invoice(self):

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
from frappe import _
def get_data():

View File

@@ -344,6 +344,7 @@ class TestPurchaseInvoice(unittest.TestCase):
pi = frappe.copy_doc(test_records[0])
pi.disable_rounded_total = 1
pi.allocate_advances_automatically = 0
pi.append("advances", {
"reference_type": "Journal Entry",
"reference_name": jv.name,
@@ -383,6 +384,7 @@ class TestPurchaseInvoice(unittest.TestCase):
pi = frappe.copy_doc(test_records[0])
pi.disable_rounded_total = 1
pi.allocate_advances_automatically = 0
pi.append("advances", {
"reference_type": "Journal Entry",
"reference_name": jv.name,
@@ -551,7 +553,7 @@ class TestPurchaseInvoice(unittest.TestCase):
sum(credit) as credit, debit_in_account_currency, credit_in_account_currency
from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
group by account, voucher_no order by account asc;""", pi.name, as_dict=1)
stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse)
self.assertTrue(gl_entries)
@@ -634,7 +636,7 @@ class TestPurchaseInvoice(unittest.TestCase):
self.assertEqual(frappe.db.get_value("Serial No", pi.get("items")[0].rejected_serial_no,
"warehouse"), pi.get("items")[0].rejected_warehouse)
def test_outstanding_amount_after_advance_jv_cancelation(self):
from erpnext.accounts.doctype.journal_entry.test_journal_entry \
import test_records as jv_test_records
@@ -656,14 +658,14 @@ class TestPurchaseInvoice(unittest.TestCase):
pi.insert()
pi.submit()
pi.load_from_db()
#check outstanding after advance allocation
self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total - pi.total_advance))
#added to avoid Document has been modified exception
jv = frappe.get_doc("Journal Entry", jv.name)
jv.cancel()
pi.load_from_db()
#check outstanding after advance cancellation
self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance))
@@ -722,7 +724,7 @@ class TestPurchaseInvoice(unittest.TestCase):
shipping_rule = create_shipping_rule(shipping_rule_type = "Buying", shipping_rule_name = "Shipping Rule - Purchase Invoice Test")
pi = frappe.copy_doc(test_records[0])
pi.shipping_rule = shipping_rule.name
pi.insert()
@@ -740,14 +742,14 @@ class TestPurchaseInvoice(unittest.TestCase):
"tax_amount": shipping_amount,
"description": shipping_rule.name,
"add_deduct_tax": "Add"
}
}
pi.append("taxes", shipping_charge)
pi.save()
self.assertEqual(pi.net_total, 1250)
self.assertEqual(pi.total_taxes_and_charges, 462.3)
self.assertEqual(pi.grand_total, 1712.3)
self.assertEqual(pi.grand_total, 1712.3)
def test_make_pi_without_terms(self):
pi = make_purchase_invoice(do_not_save=1)

View File

@@ -293,7 +293,7 @@
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -321,7 +321,7 @@
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Qty",
"label": "Accepted Qty",
"length": 0,
"no_copy": 0,
"oldfieldname": "qty",
@@ -358,7 +358,7 @@
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -2626,7 +2626,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2019-01-07 16:52:00.749414",
"modified": "2019-02-18 19:03:19.250280",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",

View File

@@ -1,7 +1,6 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import json
@@ -55,6 +54,7 @@ def get_pos_data():
'barcode_data': get_barcode_data(items_list),
'tax_data': get_item_tax_data(),
'price_list_data': get_price_list_data(doc.selling_price_list),
'customer_wise_price_list': get_customer_wise_price_list(),
'bin_data': get_bin_data(pos_profile),
'pricing_rules': get_pricing_rule_data(doc),
'print_template': print_template,
@@ -328,15 +328,32 @@ def get_price_list_data(selling_price_list):
return itemwise_price_list
def get_customer_wise_price_list():
customer_wise_price = {}
customer_price_list_mapping = frappe._dict(frappe.get_all('Customer',fields = ['default_price_list', 'name'], as_list=1))
price_lists = frappe.db.sql(""" Select ifnull(price_list_rate, 0) as price_list_rate,
item_code, price_list from `tabItem Price` """, as_dict=1)
for item in price_lists:
if item.price_list and customer_price_list_mapping.get(item.price_list):
customer_wise_price.setdefault(customer_price_list_mapping.get(item.price_list),{}).setdefault(
item.item_code, item.price_list_rate
)
return customer_wise_price
def get_bin_data(pos_profile):
itemwise_bin_data = {}
cond = "1=1"
if pos_profile.get('warehouse'):
cond = "warehouse = '{0}'".format(pos_profile.get('warehouse'))
cond = "warehouse = %(warehouse)s"
bin_data = frappe.db.sql(""" select item_code, warehouse, actual_qty from `tabBin`
where actual_qty > 0 and {cond}""".format(cond=cond), as_dict=1)
where actual_qty > 0 and {cond}""".format(cond=cond), {
'warehouse': frappe.db.escape(pos_profile.get('warehouse'))
}, as_dict=1)
for bins in bin_data:
if bins.item_code not in itemwise_bin_data:

View File

@@ -0,0 +1,3 @@
{% include "erpnext/regional/italy/sales_invoice.js" %}
erpnext.setup_e_invoice_button('Sales Invoice')

View File

@@ -201,7 +201,8 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
get_query: function() {
var filters = {
docstatus: 1,
company: me.frm.doc.company
company: me.frm.doc.company,
is_return: 0
};
if(me.frm.doc.customer) filters["customer"] = me.frm.doc.customer;
return {
@@ -217,6 +218,9 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
this.get_terms();
},
customer: function() {
if (this.frm.doc.is_pos){
var pos_profile = this.frm.doc.pos_profile;
}
var me = this;
if(this.frm.updating_party_details) return;
erpnext.utils.get_party_details(this.frm,
@@ -226,6 +230,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
party_type: "Customer",
account: this.frm.doc.debit_to,
price_list: this.frm.doc.selling_price_list,
pos_profile: pos_profile
}, function() {
me.apply_pricing_rule();
});
@@ -551,6 +556,23 @@ frappe.ui.form.on('Sales Invoice', {
frm.add_fetch('payment_term', 'invoice_portion', 'invoice_portion');
frm.add_fetch('payment_term', 'description', 'description');
frm.set_query("account_for_change_amount", function() {
return {
filters: {
account_type: ['in', ["Cash", "Bank"]]
}
};
});
frm.set_query("cost_center", function() {
return {
filters: {
company: frm.doc.company,
is_group: 0
}
};
});
frm.custom_make_buttons = {
'Delivery Note': 'Delivery',
'Sales Invoice': 'Sales Return',

File diff suppressed because it is too large Load Diff

View File

@@ -205,6 +205,7 @@ class SalesInvoice(SellingController):
def before_cancel(self):
self.update_time_sheet(None)
def on_cancel(self):
self.check_close_sales_order("sales_order")
@@ -398,11 +399,16 @@ class SalesInvoice(SellingController):
self.account_for_change_amount = pos.get('account_for_change_amount')
for fieldname in ('territory', 'naming_series', 'currency', 'taxes_and_charges', 'letter_head', 'tc_name',
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account', 'company_address',
'write_off_account', 'write_off_cost_center', 'apply_discount_on'):
'company', 'select_print_heading', 'cash_bank_account', 'company_address',
'write_off_account', 'write_off_cost_center', 'apply_discount_on', 'cost_center'):
if (not for_validate) or (for_validate and not self.get(fieldname)):
self.set(fieldname, pos.get(fieldname))
customer_price_list = frappe.get_value("Customer", self.customer, 'default_price_list')
if not customer_price_list:
self.set('selling_price_list', pos.get('selling_price_list'))
if not for_validate:
self.update_stock = cint(pos.get("update_stock"))
@@ -518,8 +524,8 @@ class SalesInvoice(SellingController):
def validate_pos(self):
if self.is_return:
if flt(self.paid_amount) + flt(self.write_off_amount) - flt(self.grand_total) < \
1/(10**(self.precision("grand_total") + 1)):
if flt(self.paid_amount) + flt(self.write_off_amount) - flt(self.grand_total) > \
1.0/(10.0**(self.precision("grand_total") + 1.0)):
frappe.throw(_("Paid amount + Write Off Amount can not be greater than Grand Total"))
def validate_item_code(self):
@@ -684,7 +690,8 @@ class SalesInvoice(SellingController):
if repost_future_gle and cint(self.update_stock) \
and cint(auto_accounting_for_stock):
items, warehouses = self.get_items_and_warehouses()
update_gl_entries_after(self.posting_date, self.posting_time, warehouses, items)
update_gl_entries_after(self.posting_date, self.posting_time,
warehouses, items, company = self.company)
elif self.docstatus == 2 and cint(self.update_stock) \
and cint(auto_accounting_for_stock):
from erpnext.accounts.general_ledger import delete_gl_entries
@@ -1007,16 +1014,16 @@ class SalesInvoice(SellingController):
for serial_no in item.serial_no.split("\n"):
sales_invoice = frappe.db.get_value("Serial No", serial_no, "sales_invoice")
if sales_invoice and self.name != sales_invoice:
frappe.throw(_("Serial Number: {0} is already referenced in Sales Invoice: {1}".format(
serial_no, sales_invoice
)))
sales_invoice_company = frappe.db.get_value("Sales Invoice", sales_invoice, "company")
if sales_invoice_company == self.company:
frappe.throw(_("Serial Number: {0} is already referenced in Sales Invoice: {1}"
.format(serial_no, sales_invoice)))
def update_project(self):
if self.project:
project = frappe.get_doc("Project", self.project)
project.flags.dont_sync_tasks = True
project.update_billed_amount()
project.save()
project.db_update()
def verify_payment_amount_is_positive(self):

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
from frappe import _
def get_data():

View File

@@ -14,8 +14,9 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_per
from erpnext.exceptions import InvalidAccountCurrency, InvalidCurrency
from erpnext.stock.doctype.serial_no.serial_no import SerialNoWarehouseError
from frappe.model.naming import make_autoname
from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data
from erpnext.stock.doctype.item.test_item import create_item
from six import iteritems
class TestSalesInvoice(unittest.TestCase):
def make(self):
@@ -762,7 +763,7 @@ class TestSalesInvoice(unittest.TestCase):
set_perpetual_inventory(0)
frappe.db.sql("delete from `tabPOS Profile`")
def test_pos_si_without_payment(self):
set_perpetual_inventory()
make_pos_profile()
@@ -854,6 +855,7 @@ class TestSalesInvoice(unittest.TestCase):
jv.submit()
si = frappe.copy_doc(test_records[0])
si.allocate_advances_automatically = 0
si.append("advances", {
"doctype": "Sales Invoice Advance",
"reference_type": "Journal Entry",
@@ -1360,7 +1362,7 @@ class TestSalesInvoice(unittest.TestCase):
"included_in_print_rate": 1
})
si.save()
si.submit()
self.assertEqual(si.net_total, 19453.13)
self.assertEqual(si.grand_total, 24900)
self.assertEqual(si.total_taxes_and_charges, 5446.88)
@@ -1382,6 +1384,50 @@ class TestSalesInvoice(unittest.TestCase):
self.assertEqual(expected_values[gle.account][1], gle.debit)
self.assertEqual(expected_values[gle.account][2], gle.credit)
def test_rounding_adjustment_2(self):
si = create_sales_invoice(rate=400, do_not_save=True)
for rate in [400, 600, 100]:
si.append("items", {
"item_code": "_Test Item",
"gst_hsn_code": "999800",
"warehouse": "_Test Warehouse - _TC",
"qty": 1,
"rate": rate,
"income_account": "Sales - _TC",
"cost_center": "_Test Cost Center - _TC"
})
for tax_account in ["_Test Account VAT - _TC", "_Test Account Service Tax - _TC"]:
si.append("taxes", {
"charge_type": "On Net Total",
"account_head": tax_account,
"description": tax_account,
"rate": 9,
"cost_center": "_Test Cost Center - _TC",
"included_in_print_rate": 1
})
si.save()
si.submit()
self.assertEqual(si.net_total, 1271.19)
self.assertEqual(si.grand_total, 1500)
self.assertEqual(si.total_taxes_and_charges, 228.82)
self.assertEqual(si.rounding_adjustment, -0.01)
expected_values = dict((d[0], d) for d in [
[si.debit_to, 1500, 0.0],
["_Test Account Service Tax - _TC", 0.0, 114.41],
["_Test Account VAT - _TC", 0.0, 114.41],
["Sales - _TC", 0.0, 1271.18]
])
gl_entries = frappe.db.sql("""select account, debit, credit
from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
order by account asc""", si.name, as_dict=1)
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_sales_invoice_with_shipping_rule(self):
from erpnext.accounts.doctype.shipping_rule.test_shipping_rule \
import create_shipping_rule
@@ -1514,6 +1560,56 @@ class TestSalesInvoice(unittest.TestCase):
accounts_settings.allow_cost_center_in_entry_of_bs_account = 0
accounts_settings.save()
def test_deferred_revenue(self):
deferred_account = create_account(account_name="Deferred Revenue",
parent_account="Current Liabilities - _TC", company="_Test Company")
item = create_item("_Test Item for Deferred Accounting")
item.enable_deferred_revenue = 1
item.deferred_revenue_account = deferred_account
item.no_of_months = 12
item.save()
si = create_sales_invoice(item=item.name, posting_date="2019-01-10", do_not_submit=True)
si.items[0].enable_deferred_revenue = 1
si.items[0].service_start_date = "2019-01-10"
si.items[0].service_end_date = "2019-03-15"
si.items[0].deferred_revenue_account = deferred_account
si.save()
si.submit()
from erpnext.accounts.deferred_revenue import convert_deferred_revenue_to_income
convert_deferred_revenue_to_income(start_date="2019-01-01", end_date="2019-01-31")
expected_gle = [
[deferred_account, 33.85, 0.0, "2019-01-31"],
["Sales - _TC", 0.0, 33.85, "2019-01-31"]
]
self.check_gl_entries(si.name, expected_gle, "2019-01-10")
convert_deferred_revenue_to_income(start_date="2019-01-01", end_date="2019-03-31")
expected_gle = [
[deferred_account, 43.08, 0.0, "2019-02-28"],
["Sales - _TC", 0.0, 43.08, "2019-02-28"],
[deferred_account, 23.07, 0.0, "2019-03-15"],
["Sales - _TC", 0.0, 23.07, "2019-03-15"]
]
self.check_gl_entries(si.name, expected_gle, "2019-01-31")
def check_gl_entries(self, voucher_no, expected_gle, posting_date):
gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
from `tabGL Entry`
where voucher_type='Sales Invoice' and voucher_no=%s and posting_date > %s
order by posting_date asc, account asc""", (voucher_no, posting_date), as_dict=1)
for i, gle in enumerate(gl_entries):
self.assertEqual(expected_gle[i][0], gle.account)
self.assertEqual(expected_gle[i][1], gle.debit)
self.assertEqual(expected_gle[i][2], gle.credit)
self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
def create_sales_invoice(**args):
si = frappe.new_doc("Sales Invoice")
@@ -1611,4 +1707,4 @@ def get_outstanding_amount(against_voucher_type, against_voucher, account, party
if against_voucher_type == 'Purchase Invoice':
bal = bal * -1
return bal
return bal

View File

@@ -779,7 +779,7 @@
"no_copy": 0,
"options": "currency",
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
@@ -913,7 +913,7 @@
"no_copy": 0,
"options": "Company:company:default_currency",
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
@@ -2766,7 +2766,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2019-01-07 16:51:55.018091",
"modified": "2019-02-18 18:59:52.223628",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",

View File

@@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
@@ -13,11 +14,13 @@
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:parent.doctype == 'POS Profile'",
"fetch_if_empty": 0,
"fieldname": "default",
"fieldtype": "Check",
"hidden": 0,
@@ -40,15 +43,17 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "mode_of_payment",
"fieldtype": "Link",
"hidden": 0,
@@ -72,17 +77,19 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0.0",
"default": "0",
"depends_on": "eval:parent.doctype == 'Sales Invoice'",
"fetch_if_empty": 0,
"fieldname": "amount",
"fieldtype": "Currency",
"hidden": 0,
@@ -97,7 +104,7 @@
"no_copy": 0,
"options": "currency",
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -106,15 +113,17 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"hidden": 0,
@@ -136,15 +145,17 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "account",
"fieldtype": "Link",
"hidden": 0,
@@ -168,16 +179,18 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_from": "mode_of_payment.type",
"fetch_from": "mode_of_payment.type",
"fetch_if_empty": 0,
"fieldname": "type",
"fieldtype": "Read Only",
"hidden": 0,
@@ -201,15 +214,17 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "base_amount",
"fieldtype": "Currency",
"hidden": 0,
@@ -233,15 +248,17 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_if_empty": 0,
"fieldname": "clearance_date",
"fieldtype": "Date",
"hidden": 0,
@@ -264,7 +281,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"translatable": 0,
"unique": 0
}
],
@@ -278,7 +295,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-05-16 22:42:52.033991",
"modified": "2019-03-19 14:54:56.524556",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Payment",
@@ -292,5 +309,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@@ -1,5 +1,7 @@
{
"allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
@@ -12,6 +14,8 @@
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -39,9 +43,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -68,9 +75,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -88,7 +98,7 @@
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
@@ -97,9 +107,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -126,20 +139,21 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 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": "2017-02-17 16:47:04.413420",
"modified": "2019-02-18 18:50:44.770361",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Timesheet",
@@ -153,5 +167,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@@ -135,9 +135,9 @@ def round_off_debit_credit(gl_map):
.format(gl_map[0].voucher_type, gl_map[0].voucher_no, debit_credit_diff))
elif abs(debit_credit_diff) >= (1.0 / (10**precision)):
make_round_off_gle(gl_map, debit_credit_diff)
make_round_off_gle(gl_map, debit_credit_diff, precision)
def make_round_off_gle(gl_map, debit_credit_diff):
def make_round_off_gle(gl_map, debit_credit_diff, precision):
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(gl_map[0].company)
round_off_account_exists = False
round_off_gle = frappe._dict()
@@ -150,6 +150,10 @@ def make_round_off_gle(gl_map, debit_credit_diff):
debit_credit_diff += flt(d.credit_in_account_currency)
round_off_account_exists = True
if round_off_account_exists and abs(debit_credit_diff) <= (1.0 / (10**precision)):
gl_map.remove(round_off_gle)
return
if not round_off_gle:
for k in ["voucher_type", "voucher_no", "company",
"posting_date", "remarks", "is_opening"]:

View File

@@ -0,0 +1,571 @@
frappe.provide("erpnext.accounts");
frappe.pages['bank-reconciliation'].on_page_load = function(wrapper) {
new erpnext.accounts.bankReconciliation(wrapper);
}
erpnext.accounts.bankReconciliation = class BankReconciliation {
constructor(wrapper) {
this.page = frappe.ui.make_app_page({
parent: wrapper,
title: __("Bank Reconciliation"),
single_column: true
});
this.parent = wrapper;
this.page = this.parent.page;
this.check_plaid_status();
this.make();
}
make() {
const me = this;
me.$main_section = $(`<div class="reconciliation page-main-content"></div>`).appendTo(me.page.main);
const empty_state = __("Upload a bank statement, link or reconcile a bank account")
me.$main_section.append(`<div class="flex justify-center align-center text-muted"
style="height: 50vh; display: flex;"><h5 class="text-muted">${empty_state}</h5></div>`)
me.page.add_field({
fieldtype: 'Link',
label: __('Company'),
fieldname: 'company',
options: "Company",
onchange: function() {
if (this.value) {
me.company = this.value;
} else {
me.company = null;
me.bank_account = null;
}
}
})
me.page.add_field({
fieldtype: 'Link',
label: __('Bank Account'),
fieldname: 'bank_account',
options: "Bank Account",
get_query: function() {
if(!me.company) {
frappe.throw(__("Please select company first"));
return
}
return {
filters: {
"company": me.company
}
}
},
onchange: function() {
if (this.value) {
me.bank_account = this.value;
me.add_actions();
} else {
me.bank_account = null;
me.page.hide_actions_menu();
}
}
})
}
check_plaid_status() {
const me = this;
frappe.db.get_value("Plaid Settings", "Plaid Settings", "enabled", (r) => {
if (r && r.enabled == "1") {
me.plaid_status = "active"
} else {
me.plaid_status = "inactive"
}
})
}
add_actions() {
const me = this;
me.page.show_menu()
me.page.add_menu_item(__("Upload a statement"), function() {
me.clear_page_content();
new erpnext.accounts.bankTransactionUpload(me);
}, true)
if (me.plaid_status==="active") {
me.page.add_menu_item(__("Synchronize this account"), function() {
me.clear_page_content();
new erpnext.accounts.bankTransactionSync(me);
}, true)
}
me.page.add_menu_item(__("Reconcile this account"), function() {
me.clear_page_content();
me.make_reconciliation_tool();
}, true)
}
clear_page_content() {
const me = this;
$(me.page.body).find('.frappe-list').remove();
me.$main_section.empty();
}
make_reconciliation_tool() {
const me = this;
frappe.model.with_doctype("Bank Transaction", () => {
erpnext.accounts.ReconciliationList = new erpnext.accounts.ReconciliationTool({
parent: me.parent,
doctype: "Bank Transaction"
});
})
}
}
erpnext.accounts.bankTransactionUpload = class bankTransactionUpload {
constructor(parent) {
this.parent = parent;
this.data = [];
const assets = [
"/assets/frappe/css/frappe-datatable.css",
"/assets/frappe/js/lib/clusterize.min.js",
"/assets/frappe/js/lib/Sortable.min.js",
"/assets/frappe/js/lib/frappe-datatable.js"
];
frappe.require(assets, () => {
this.make();
});
}
make() {
const me = this;
frappe.upload.make({
args: {
method: 'erpnext.accounts.doctype.bank_transaction.bank_transaction_upload.upload_bank_statement',
allow_multiple: 0
},
no_socketio: true,
sample_url: "e.g. http://example.com/somefile.csv",
callback: function(attachment, r) {
if (!r.exc && r.message) {
me.data = r.message;
me.setup_transactions_dom();
me.create_datatable();
me.add_primary_action();
}
}
})
}
setup_transactions_dom() {
const me = this;
me.parent.$main_section.append(`<div class="transactions-table"></div>`)
}
create_datatable() {
try {
this.datatable = new DataTable('.transactions-table', {
columns: this.data.columns,
data: this.data.data
})
}
catch(err) {
let msg = __(`Your file could not be processed by ERPNext.
<br>It should be a standard CSV or XLSX file.
<br>The headers should be in the first row.`)
frappe.throw(msg)
}
}
add_primary_action() {
const me = this;
me.parent.page.set_primary_action(__("Submit"), function() {
me.add_bank_entries()
}, null, __("Creating bank entries..."))
}
add_bank_entries() {
const me = this;
frappe.xcall('erpnext.accounts.doctype.bank_transaction.bank_transaction_upload.create_bank_entries',
{columns: this.datatable.datamanager.columns, data: this.datatable.datamanager.data, bank_account: me.parent.bank_account}
).then((result) => {
let result_title = __("{0} bank transaction(s) created", [result])
let result_msg = `
<div class="flex justify-center align-center text-muted" style="height: 50vh; display: flex;">
<h5 class="text-muted">${result_title}</h5>
</div>`
me.parent.page.clear_primary_action();
me.parent.$main_section.empty();
me.parent.$main_section.append(result_msg);
frappe.show_alert({message:__("All bank transactions have been created"), indicator:'green'});
})
}
}
erpnext.accounts.bankTransactionSync = class bankTransactionSync {
constructor(parent) {
this.parent = parent;
this.data = [];
this.init_config()
}
init_config() {
const me = this;
frappe.xcall('erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.plaid_configuration')
.then(result => {
me.plaid_env = result.plaid_env;
me.plaid_public_key = result.plaid_public_key;
me.client_name = result.client_name;
me.sync_transactions()
})
}
sync_transactions() {
const me = this;
frappe.db.get_value("Bank Account", me.parent.bank_account, "bank", (v) => {
frappe.xcall('erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.sync_transactions', {
bank: v['bank'],
bank_account: me.parent.bank_account,
freeze: true
})
.then((result) => {
let result_title = (result.length > 0) ? __("{0} bank transaction(s) created", [result.length]) : __("This bank account is already synchronized")
let result_msg = `
<div class="flex justify-center align-center text-muted" style="height: 50vh; display: flex;">
<h5 class="text-muted">${result_title}</h5>
</div>`
this.parent.$main_section.append(result_msg)
frappe.show_alert({message:__("Bank account '{0}' has been synchronized", [me.parent.bank_account]), indicator:'green'});
})
})
}
}
erpnext.accounts.ReconciliationTool = class ReconciliationTool extends frappe.views.BaseList {
constructor(opts) {
super(opts);
this.show();
}
setup_defaults() {
super.setup_defaults();
this.page_title = __("Bank Reconciliation");
this.doctype = 'Bank Transaction';
this.fields = ['date', 'description', 'debit', 'credit', 'currency']
}
setup_view() {
this.render_header();
}
setup_side_bar() {
//
}
make_standard_filters() {
//
}
freeze() {
this.$result.find('.list-count').html(`<span>${__('Refreshing')}...</span>`);
}
get_args() {
const args = super.get_args();
return Object.assign({}, args, {
...args.filters.push(["Bank Transaction", "docstatus", "=", 1],
["Bank Transaction", "unallocated_amount", ">", 0])
});
}
update_data(r) {
let data = r.message || [];
if (this.start === 0) {
this.data = data;
} else {
this.data = this.data.concat(data);
}
}
render() {
const me = this;
this.$result.find('.list-row-container').remove();
$('[data-fieldname="name"]').remove();
me.data.map((value) => {
const row = $('<div class="list-row-container">').data("data", value).appendTo(me.$result).get(0);
new erpnext.accounts.ReconciliationRow(row, value);
})
}
render_header() {
const me = this;
if ($(this.wrapper).find('.transaction-header').length === 0) {
me.$result.append(frappe.render_template("bank_transaction_header"));
}
}
}
erpnext.accounts.ReconciliationRow = class ReconciliationRow {
constructor(row, data) {
this.data = data;
this.row = row;
this.make();
this.bind_events();
}
make() {
$(this.row).append(frappe.render_template("bank_transaction_row", this.data))
}
bind_events() {
const me = this;
$(me.row).on('click', '.clickable-section', function() {
me.bank_entry = $(this).attr("data-name");
me.show_dialog($(this).attr("data-name"));
})
$(me.row).on('click', '.new-reconciliation', function() {
me.bank_entry = $(this).attr("data-name");
me.show_dialog($(this).attr("data-name"));
})
$(me.row).on('click', '.new-payment', function() {
me.bank_entry = $(this).attr("data-name");
me.new_payment();
})
$(me.row).on('click', '.new-invoice', function() {
me.bank_entry = $(this).attr("data-name");
me.new_invoice();
})
$(me.row).on('click', '.new-expense', function() {
me.bank_entry = $(this).attr("data-name");
me.new_expense();
})
}
new_payment() {
const me = this;
const paid_amount = me.data.credit > 0 ? me.data.credit : me.data.debit;
const payment_type = me.data.credit > 0 ? "Receive": "Pay";
const party_type = me.data.credit > 0 ? "Customer": "Supplier";
frappe.new_doc("Payment Entry", {"payment_type": payment_type, "paid_amount": paid_amount,
"party_type": party_type, "paid_from": me.data.bank_account})
}
new_invoice() {
const me = this;
const invoice_type = me.data.credit > 0 ? "Sales Invoice" : "Purchase Invoice";
frappe.new_doc(invoice_type)
}
new_expense() {
frappe.new_doc("Expense Claim")
}
show_dialog(data) {
const me = this;
frappe.db.get_value("Bank Account", me.data.bank_account, "account", (r) => {
me.gl_account = r.account;
})
frappe.xcall('erpnext.accounts.page.bank_reconciliation.bank_reconciliation.get_linked_payments',
{bank_transaction: data, freeze:true, freeze_message:__("Finding linked payments")}
).then((result) => {
me.make_dialog(result)
})
}
make_dialog(data) {
const me = this;
me.selected_payment = null;
const fields = [
{
fieldtype: 'Section Break',
fieldname: 'section_break_1',
label: __('Automatic Reconciliation')
},
{
fieldtype: 'HTML',
fieldname: 'payment_proposals'
},
{
fieldtype: 'Section Break',
fieldname: 'section_break_2',
label: __('Search for a payment')
},
{
fieldtype: 'Link',
fieldname: 'payment_doctype',
options: 'DocType',
label: 'Payment DocType',
get_query: () => {
return {
filters : {
"name": ["in", ["Payment Entry", "Journal Entry", "Sales Invoice", "Purchase Invoice", "Expense Claim"]]
}
}
},
},
{
fieldtype: 'Column Break',
fieldname: 'column_break_1',
},
{
fieldtype: 'Dynamic Link',
fieldname: 'payment_entry',
options: 'payment_doctype',
label: 'Payment Document',
get_query: () => {
let dt = this.dialog.fields_dict.payment_doctype.value;
if (dt === "Payment Entry") {
return {
query: "erpnext.accounts.page.bank_reconciliation.bank_reconciliation.payment_entry_query",
filters : {
"bank_account": this.data.bank_account,
"company": this.data.company
}
}
} else if (dt === "Journal Entry") {
return {
query: "erpnext.accounts.page.bank_reconciliation.bank_reconciliation.journal_entry_query",
filters : {
"bank_account": this.data.bank_account,
"company": this.data.company
}
}
} else if (dt === "Sales Invoice") {
return {
query: "erpnext.accounts.page.bank_reconciliation.bank_reconciliation.sales_invoices_query"
}
} else if (dt === "Purchase Invoice") {
return {
filters : [
["Purchase Invoice", "ifnull(clearance_date, '')", "=", ""],
["Purchase Invoice", "docstatus", "=", 1],
["Purchase Invoice", "company", "=", this.data.company]
]
}
} else if (dt === "Expense Claim") {
return {
filters : [
["Expense Claim", "ifnull(clearance_date, '')", "=", ""],
["Expense Claim", "docstatus", "=", 1],
["Expense Claim", "company", "=", this.data.company]
]
}
}
},
onchange: function() {
if (me.selected_payment !== this.value) {
me.selected_payment = this.value;
me.display_payment_details(this);
}
}
},
{
fieldtype: 'Section Break',
fieldname: 'section_break_3'
},
{
fieldtype: 'HTML',
fieldname: 'payment_details'
},
];
me.dialog = new frappe.ui.Dialog({
title: __("Choose a corresponding payment"),
fields: fields,
size: "large"
});
const proposals_wrapper = me.dialog.fields_dict.payment_proposals.$wrapper;
if (data && data.length > 0) {
proposals_wrapper.append(frappe.render_template("linked_payment_header"));
data.map(value => {
proposals_wrapper.append(frappe.render_template("linked_payment_row", value))
})
} else {
const empty_data_msg = __("ERPNext could not find any matching payment entry")
proposals_wrapper.append(`<div class="text-center"><h5 class="text-muted">${empty_data_msg}</h5></div>`)
}
$(me.dialog.body).on('click', '.reconciliation-btn', (e) => {
const payment_entry = $(e.target).attr('data-name');
const payment_doctype = $(e.target).attr('data-doctype');
frappe.xcall('erpnext.accounts.page.bank_reconciliation.bank_reconciliation.reconcile',
{bank_transaction: me.bank_entry, payment_doctype: payment_doctype, payment_name: payment_entry})
.then((result) => {
setTimeout(function(){
erpnext.accounts.ReconciliationList.refresh();
}, 2000);
me.dialog.hide();
})
})
me.dialog.show();
}
display_payment_details(event) {
const me = this;
if (event.value) {
let dt = me.dialog.fields_dict.payment_doctype.value;
me.dialog.fields_dict['payment_details'].$wrapper.empty();
frappe.db.get_doc(dt, event.value)
.then(doc => {
let displayed_docs = []
if (dt === "Payment Entry") {
doc.currency = doc.payment_type == "Receive" ? doc.paid_to_account_currency : doc.paid_from_account_currency;
displayed_docs.push(doc);
} else if (dt === "Journal Entry") {
doc.accounts.forEach(payment => {
if (payment.account === me.gl_account) {
payment.posting_date = doc.posting_date;
payment.party = doc.pay_to_recd_from;
payment.reference_no = doc.cheque_no;
payment.reference_date = doc.cheque_date;
payment.currency = payment.account_currency;
payment.paid_amount = payment.credit > 0 ? payment.credit : payment.debit;
payment.name = doc.name;
displayed_docs.push(payment);
}
})
} else if (dt === "Sales Invoice") {
doc.payments.forEach(payment => {
if (payment.clearance_date === null || payment.clearance_date === "") {
payment.posting_date = doc.posting_date;
payment.party = doc.customer;
payment.reference_no = doc.remarks;
payment.currency = doc.currency;
payment.paid_amount = payment.amount;
payment.name = doc.name;
displayed_docs.push(payment);
}
})
}
const details_wrapper = me.dialog.fields_dict.payment_details.$wrapper;
details_wrapper.append(frappe.render_template("linked_payment_header"));
displayed_docs.forEach(values => {
details_wrapper.append(frappe.render_template("linked_payment_row", values));
})
})
}
}
}

View File

@@ -0,0 +1,29 @@
{
"content": null,
"creation": "2018-11-24 12:03:14.646669",
"docstatus": 0,
"doctype": "Page",
"idx": 0,
"modified": "2018-11-24 12:03:14.646669",
"modified_by": "Administrator",
"module": "Accounts",
"name": "bank-reconciliation",
"owner": "Administrator",
"page_name": "bank-reconciliation",
"roles": [
{
"role": "System Manager"
},
{
"role": "Accounts Manager"
},
{
"role": "Accounts User"
}
],
"script": null,
"standard": "Yes",
"style": null,
"system_page": 0,
"title": "Bank Reconciliation"
}

View File

@@ -0,0 +1,391 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe import _
import difflib
from frappe.utils import flt
from six import iteritems
from erpnext import get_company_currency
@frappe.whitelist()
def reconcile(bank_transaction, payment_doctype, payment_name):
transaction = frappe.get_doc("Bank Transaction", bank_transaction)
payment_entry = frappe.get_doc(payment_doctype, payment_name)
account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
gl_entry = frappe.get_doc("GL Entry", dict(account=account, voucher_type=payment_doctype, voucher_no=payment_name))
if transaction.unallocated_amount == 0:
frappe.throw(_("This bank transaction is already fully reconciled"))
if transaction.credit > 0 and gl_entry.credit > 0:
frappe.throw(_("The selected payment entry should be linked with a debtor bank transaction"))
if transaction.debit > 0 and gl_entry.debit > 0:
frappe.throw(_("The selected payment entry should be linked with a creditor bank transaction"))
add_payment_to_transaction(transaction, payment_entry, gl_entry)
clear_payment_entry(transaction, payment_entry, gl_entry)
return 'reconciled'
def add_payment_to_transaction(transaction, payment_entry, gl_entry):
transaction.append("payment_entries", {
"payment_document": payment_entry.doctype,
"payment_entry": payment_entry.name,
"allocated_amount": gl_entry.credit if gl_entry.credit > 0 else gl_entry.debit
})
transaction.save()
def clear_payment_entry(transaction, payment_entry, gl_entry):
linked_bank_transactions = frappe.db.sql("""
SELECT
bt.credit, bt.debit
FROM
`tabBank Transaction Payments` as btp
LEFT JOIN
`tabBank Transaction` as bt on btp.parent=bt.name
WHERE
btp.payment_document = %s
AND
btp.payment_entry = %s
AND
bt.docstatus = 1
""", (payment_entry.doctype, payment_entry.name), as_dict=True)
amount_cleared = (flt(linked_bank_transactions[0].credit) - flt(linked_bank_transactions[0].debit))
amount_to_be_cleared = (flt(gl_entry.debit) - flt(gl_entry.credit))
if payment_entry.doctype in ("Payment Entry", "Journal Entry", "Purchase Invoice", "Expense Claim"):
clear_simple_entry(amount_cleared, amount_to_be_cleared, payment_entry, transaction)
elif payment_entry.doctype == "Sales Invoice":
clear_sales_invoice(amount_cleared, amount_to_be_cleared, payment_entry, transaction)
def clear_simple_entry(amount_cleared, amount_to_be_cleared, payment_entry, transaction):
if amount_cleared >= amount_to_be_cleared:
frappe.db.set_value(payment_entry.doctype, payment_entry.name, "clearance_date", transaction.date)
def clear_sales_invoice(amount_cleared, amount_to_be_cleared, payment_entry, transaction):
if amount_cleared >= amount_to_be_cleared:
frappe.db.set_value("Sales Invoice Payment", dict(parenttype=payment_entry.doctype,
parent=payment_entry.name), "clearance_date", transaction.date)
@frappe.whitelist()
def get_linked_payments(bank_transaction):
transaction = frappe.get_doc("Bank Transaction", bank_transaction)
bank_account = frappe.db.get_values("Bank Account", transaction.bank_account, ["account", "company"], as_dict=True)
# Get all payment entries with a matching amount
amount_matching = check_matching_amount(bank_account[0].account, bank_account[0].company, transaction)
# Get some data from payment entries linked to a corresponding bank transaction
description_matching = get_matching_descriptions_data(bank_account[0].company, transaction)
if amount_matching:
return check_amount_vs_description(amount_matching, description_matching)
elif description_matching:
return sorted(description_matching, key = lambda x: x["posting_date"], reverse=True)
else:
return []
def check_matching_amount(bank_account, company, transaction):
payments = []
amount = transaction.credit if transaction.credit > 0 else transaction.debit
payment_type = "Receive" if transaction.credit > 0 else "Pay"
account_from_to = "paid_to" if transaction.credit > 0 else "paid_from"
currency_field = "paid_to_account_currency as currency" if transaction.credit > 0 else "paid_from_account_currency as currency"
payment_entries = frappe.get_all("Payment Entry", fields=["'Payment Entry' as doctype", "name", "paid_amount", "payment_type", "reference_no", "reference_date",
"party", "party_type", "posting_date", "{0}".format(currency_field)], filters=[["paid_amount", "like", "{0}%".format(amount)],
["docstatus", "=", "1"], ["payment_type", "=", payment_type], ["ifnull(clearance_date, '')", "=", ""], ["{0}".format(account_from_to), "=", "{0}".format(bank_account)]])
if transaction.credit > 0:
journal_entries = frappe.db.sql("""
SELECT
'Journal Entry' as doctype, je.name, je.posting_date, je.cheque_no as reference_no,
je.pay_to_recd_from as party, je.cheque_date as reference_date, jea.debit_in_account_currency as paid_amount
FROM
`tabJournal Entry Account` as jea
JOIN
`tabJournal Entry` as je
ON
jea.parent = je.name
WHERE
(je.clearance_date is null or je.clearance_date='0000-00-00')
AND
jea.account = %s
AND
jea.debit_in_account_currency like %s
AND
je.docstatus = 1
""", (bank_account, amount), as_dict=True)
else:
journal_entries = frappe.db.sql("""
SELECT
'Journal Entry' as doctype, je.name, je.posting_date, je.cheque_no as reference_no,
je.pay_to_recd_from as party, je.cheque_date as reference_date, jea.credit_in_account_currency as paid_amount
FROM
`tabJournal Entry Account` as jea
JOIN
`tabJournal Entry` as je
ON
jea.parent = je.name
WHERE
(je.clearance_date is null or je.clearance_date='0000-00-00')
AND
jea.account = %s
AND
jea.credit_in_account_currency like %s
AND
je.docstatus = 1
""", (bank_account, amount), as_dict=True)
if transaction.credit > 0:
sales_invoices = frappe.db.sql("""
SELECT
'Sales Invoice' as doctype, si.name, si.customer as party,
si.posting_date, sip.amount as paid_amount
FROM
`tabSales Invoice Payment` as sip
JOIN
`tabSales Invoice` as si
ON
sip.parent = si.name
WHERE
(sip.clearance_date is null or sip.clearance_date='0000-00-00')
AND
sip.account = %s
AND
sip.amount like %s
AND
si.docstatus = 1
""", (bank_account, amount), as_dict=True)
else:
sales_invoices = []
if transaction.debit > 0:
purchase_invoices = frappe.get_all("Purchase Invoice",
fields = ["'Purchase Invoice' as doctype", "name", "paid_amount", "supplier as party", "posting_date", "currency"],
filters=[
["paid_amount", "like", "{0}%".format(amount)],
["docstatus", "=", "1"],
["is_paid", "=", "1"],
["ifnull(clearance_date, '')", "=", ""],
["cash_bank_account", "=", "{0}".format(bank_account)]
]
)
mode_of_payments = [x["parent"] for x in frappe.db.get_list("Mode of Payment Account",
filters={"default_account": bank_account}, fields=["parent"])]
company_currency = get_company_currency(company)
expense_claims = frappe.get_all("Expense Claim",
fields=["'Expense Claim' as doctype", "name", "total_sanctioned_amount as paid_amount",
"employee as party", "posting_date", "'{0}' as currency".format(company_currency)],
filters=[
["total_sanctioned_amount", "like", "{0}%".format(amount)],
["docstatus", "=", "1"],
["is_paid", "=", "1"],
["ifnull(clearance_date, '')", "=", ""],
["mode_of_payment", "in", "{0}".format(tuple(mode_of_payments))]
]
)
else:
purchase_invoices = expense_claims = []
for data in [payment_entries, journal_entries, sales_invoices, purchase_invoices, expense_claims]:
if data:
payments.extend(data)
return payments
def get_matching_descriptions_data(company, transaction):
if not transaction.description :
return []
bank_transactions = frappe.db.sql("""
SELECT
bt.name, bt.description, bt.date, btp.payment_document, btp.payment_entry
FROM
`tabBank Transaction` as bt
LEFT JOIN
`tabBank Transaction Payments` as btp
ON
bt.name = btp.parent
WHERE
bt.allocated_amount > 0
AND
bt.docstatus = 1
""", as_dict=True)
selection = []
for bank_transaction in bank_transactions:
if bank_transaction.description:
seq=difflib.SequenceMatcher(lambda x: x == " ", transaction.description, bank_transaction.description)
if seq.ratio() > 0.6:
bank_transaction["ratio"] = seq.ratio()
selection.append(bank_transaction)
document_types = set([x["payment_document"] for x in selection])
links = {}
for document_type in document_types:
links[document_type] = [x["payment_entry"] for x in selection if x["payment_document"]==document_type]
data = []
company_currency = get_company_currency(company)
for key, value in iteritems(links):
if key == "Payment Entry":
data.extend(frappe.get_all("Payment Entry", filters=[["name", "in", value]], fields=["'Payment Entry' as doctype", "posting_date", "party", "reference_no", "reference_date", "paid_amount", "paid_to_account_currency as currency"]))
if key == "Journal Entry":
journal_entries = frappe.get_all("Journal Entry", filters=[["name", "in", value]], fields=["name", "'Journal Entry' as doctype", "posting_date", "paid_to_recd_from as party", "cheque_no as reference_no", "cheque_date as reference_date", "total_credit as paid_amount"])
for journal_entry in journal_entries:
journal_entry_accounts = frappe.get_all("Journal Entry Account", filters={"parenttype": journal_entry["doctype"], "parent": journal_entry["name"]}, fields=["account_currency"])
journal_entry["currency"] = journal_entry_accounts[0]["account_currency"] if journal_entry_accounts else company_currency
data.extend(journal_entries)
if key == "Sales Invoice":
data.extend(frappe.get_all("Sales Invoice", filters=[["name", "in", value]], fields=["'Sales Invoice' as doctype", "posting_date", "customer_name as party", "paid_amount", "currency"]))
if key == "Purchase Invoice":
data.extend(frappe.get_all("Purchase Invoice", filters=[["name", "in", value]], fields=["'Purchase Invoice' as doctype", "posting_date", "supplier_name as party", "paid_amount", "currency"]))
if key == "Expense Claim":
expense_claims = frappe.get_all("Expense Claim", filters=[["name", "in", value]], fields=["'Expense Claim' as doctype", "posting_date", "employee_name as party", "total_amount_reimbursed as paid_amount"])
data.extend([dict(x,**{"currency": company_currency}) for x in expense_claims])
return data
def check_amount_vs_description(amount_matching, description_matching):
result = []
if description_matching:
for am_match in amount_matching:
for des_match in description_matching:
if am_match["party"] == des_match["party"]:
if am_match not in result:
result.append(am_match)
continue
if hasattr(am_match, "reference_no") and hasattr(des_match, "reference_no"):
if difflib.SequenceMatcher(lambda x: x == " ", am_match["reference_no"], des_match["reference_no"]).ratio() > 70:
if am_match not in result:
result.append(am_match)
if result:
return sorted(result, key = lambda x: x["posting_date"], reverse=True)
else:
return sorted(amount_matching, key = lambda x: x["posting_date"], reverse=True)
else:
return sorted(amount_matching, key = lambda x: x["posting_date"], reverse=True)
def get_matching_transactions_payments(description_matching):
payments = [x["payment_entry"] for x in description_matching]
payment_by_ratio = {x["payment_entry"]: x["ratio"] for x in description_matching}
if payments:
reference_payment_list = frappe.get_all("Payment Entry", fields=["name", "paid_amount", "payment_type", "reference_no", "reference_date",
"party", "party_type", "posting_date", "paid_to_account_currency"], filters=[["name", "in", payments]])
return sorted(reference_payment_list, key=lambda x: payment_by_ratio[x["name"]])
else:
return []
def payment_entry_query(doctype, txt, searchfield, start, page_len, filters):
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
if not account:
return
return frappe.db.sql("""
SELECT
name, party, paid_amount, received_amount, reference_no
FROM
`tabPayment Entry`
WHERE
(clearance_date is null or clearance_date='0000-00-00')
AND (paid_from = %(account)s or paid_to = %(account)s)
AND (name like %(txt)s or party like %(txt)s)
AND docstatus = 1
ORDER BY
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), name
LIMIT
%(start)s, %(page_len)s""",
{
'txt': "%%%s%%" % txt,
'_txt': txt.replace("%", ""),
'start': start,
'page_len': page_len,
'account': account
}
)
def journal_entry_query(doctype, txt, searchfield, start, page_len, filters):
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
return frappe.db.sql("""
SELECT
jea.parent, je.pay_to_recd_from,
if(jea.debit_in_account_currency > 0, jea.debit_in_account_currency, jea.credit_in_account_currency)
FROM
`tabJournal Entry Account` as jea
LEFT JOIN
`tabJournal Entry` as je
ON
jea.parent = je.name
WHERE
(je.clearance_date is null or je.clearance_date='0000-00-00')
AND
jea.account = %(account)s
AND
(jea.parent like %(txt)s or je.pay_to_recd_from like %(txt)s)
AND
je.docstatus = 1
ORDER BY
if(locate(%(_txt)s, jea.parent), locate(%(_txt)s, jea.parent), 99999),
jea.parent
LIMIT
%(start)s, %(page_len)s""",
{
'txt': "%%%s%%" % txt,
'_txt': txt.replace("%", ""),
'start': start,
'page_len': page_len,
'account': account
}
)
def sales_invoices_query(doctype, txt, searchfield, start, page_len, filters):
return frappe.db.sql("""
SELECT
sip.parent, si.customer, sip.amount, sip.mode_of_payment
FROM
`tabSales Invoice Payment` as sip
LEFT JOIN
`tabSales Invoice` as si
ON
sip.parent = si.name
WHERE
(sip.clearance_date is null or sip.clearance_date='0000-00-00')
AND
(sip.parent like %(txt)s or si.customer like %(txt)s)
ORDER BY
if(locate(%(_txt)s, sip.parent), locate(%(_txt)s, sip.parent), 99999),
sip.parent
LIMIT
%(start)s, %(page_len)s""",
{
'txt': "%%%s%%" % txt,
'_txt': txt.replace("%", ""),
'start': start,
'page_len': page_len
}
)

View File

@@ -0,0 +1,21 @@
<div class="transaction-header">
<div class="level list-row list-row-head text-muted small">
<div class="col-sm-2 ellipsis hidden-xs">
{{ __("Date") }}
</div>
<div class="col-xs-11 col-sm-4 ellipsis list-subject">
{{ __("Description") }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{{ __("Debit") }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{{ __("Credit") }}
</div>
<div class="col-sm-1 ellipsis hidden-xs">
{{ __("Currency") }}
</div>
<div class="col-sm-1 ellipsis">
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div class="list-row transaction-item">
<div>
<div class="clickable-section" data-name={{ name }}>
<div class="col-sm-2 ellipsis hidden-xs">
{%= frappe.datetime.str_to_user(date) %}
</div>
<div class="col-xs-8 col-sm-4 ellipsis list-subject">
{{ description }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{%= format_currency(debit, currency) %}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{%= format_currency(credit, currency) %}
</div>
<div class="col-sm-1 ellipsis hidden-xs">
{{ currency }}
</div>
</div>
<div class="col-xs-3 col-sm-1">
<div class="btn-group">
<a class="dropdown-toggle btn btn-default btn-xs" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span>Actions </span>
<span class="caret"></span>
</a>
<ul class="dropdown-menu reports-dropdown" style="max-height: 300px; overflow-y: auto; right: 0px; left: auto;">
<li><a class="new-reconciliation" data-name={{ name }}>{{ __("Reconcile") }}</a></li>
<li class="divider"></li>
<li><a class="new-payment" data-name={{ name }}>{{ __("New Payment") }}</a></li>
<li><a class="new-invoice" data-name={{ name }}>{{ __("New Invoice") }}</a></li>
<li><a class="new-expense" data-name={{ name }}>{{ __("New Expense") }}</a></li>
</ul>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,21 @@
<div class="transaction-header">
<div class="level list-row list-row-head text-muted small">
<div class="col-xs-3 col-sm-2 ellipsis">
{{ __("Payment Name") }}
</div>
<div class="col-xs-3 col-sm-2 ellipsis">
{{ __("Reference Date") }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{{ __("Amount") }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{{ __("Party") }}
</div>
<div class="col-xs-3 col-sm-2 ellipsis">
{{ __("Reference Number") }}
</div>
<div class="col-xs-2 col-sm-2">
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div class="list-row">
<div>
<div class="col-xs-3 col-sm-2 ellipsis">
{{ name }}
</div>
<div class="col-xs-3 col-sm-2 ellipsis">
{% if (typeof reference_date !== "undefined") %}
{%= frappe.datetime.str_to_user(reference_date) %}
{% else %}
{% if (typeof posting_date !== "undefined") %}
{%= frappe.datetime.str_to_user(posting_date) %}
{% endif %}
{% endif %}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{{ format_currency(paid_amount, currency) }}
</div>
<div class="col-sm-2 ellipsis hidden-xs">
{% if (typeof party !== "undefined") %}
{{ party }}
{% endif %}
</div>
<div class="col-xs-3 col-sm-2 ellipsis">
{% if (typeof reference_no !== "undefined") %}
{{ reference_no }}
{% else %}
{{ "" }}
{% endif %}
</div>
<div class="col-xs-2 col-sm-2">
<div class="text-right margin-bottom">
<button class="btn btn-primary btn-xs reconciliation-btn" data-doctype="{{ doctype }}" data-name="{{ name }}">{{ __("Reconcile") }}</button>
</div>
</div>
</div>
</div>

View File

@@ -125,7 +125,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.page.add_menu_item(__("Cashier Closing"), function () {
frappe.set_route('List', 'Cashier Closing');
});
});
this.page.add_menu_item(__("POS Profile"), function () {
frappe.set_route('List', 'POS Profile');
@@ -313,6 +313,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.contacts = r.message.contacts;
this.address = r.message.address || {};
this.price_list_data = r.message.price_list_data;
this.customer_wise_price_list = r.message.customer_wise_price_list
this.bin_data = r.message.bin_data;
this.pricing_rules = r.message.pricing_rules;
this.print_template = r.message.print_template;
@@ -332,6 +333,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
var me = this;
this.frm = {}
this.load_data(true);
this.frm.doc.offline_pos_name = '';
this.setup();
this.set_default_customer()
},
@@ -344,7 +346,6 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
if (load_doc) {
this.frm.doc = JSON.parse(localStorage.getItem('doc'));
this.frm.doc.offline_pos_name = null;
}
$.each(this.meta, function (i, data) {
@@ -602,7 +603,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.remove_item = []
idx = $(this.wrapper).find(".pos-selected-item-action").attr("data-idx")
this.remove_item.push(idx)
this.remove_zero_qty_item()
this.remove_zero_qty_items_from_cart()
this.update_paid_amount_status(false)
},
@@ -640,7 +641,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
me.list_customers_btn.toggleClass("view_customer");
me.pos_bill.show();
me.list_customers_btn.show();
me.frm.doc.offline_pos_name = $(this).parents().attr('invoice-name')
me.frm.doc.offline_pos_name = $(this).parents().attr('invoice-name');
me.edit_record();
})
@@ -798,6 +799,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
if (item.action) {
$(this).val("");
}
me.make_item_list(item.customer_name);
});
},
@@ -982,7 +984,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
}
if(!this.customer_doc.fields_dict.customer_pos_id.value) {
this.customer_doc.set_value("customer_pos_id", $.now())
this.customer_doc.set_value("customer_pos_id", frappe.datetime.now_datetime())
}
},
@@ -1037,7 +1039,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.numeric_keypad.show();
},
make_item_list: function () {
make_item_list: function (customer) {
var me = this;
if (!this.price_list) {
frappe.msgprint(__("Price List not found or disabled"));
@@ -1051,10 +1053,17 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
if (this.items.length > 0) {
$.each(this.items, function(index, obj) {
let customer_price_list = me.customer_wise_price_list[customer];
let item_price
if (customer && customer_price_list && customer_price_list[obj.name]) {
item_price = format_currency(customer_price_list[obj.name], me.frm.doc.currency);
} else {
item_price = format_currency(me.price_list_data[obj.name], me.frm.doc.currency);
}
if(index < me.page_len) {
$(frappe.render_template("pos_item", {
item_code: obj.name,
item_price: format_currency(me.price_list_data[obj.name], me.frm.doc.currency),
item_price: item_price,
item_name: obj.name === obj.item_name ? "" : obj.item_name,
item_image: obj.image,
item_stock: __('Stock Qty') + ": " + me.get_actual_qty(obj),
@@ -1167,20 +1176,27 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
$(this.wrapper).on("change", ".pos-item-qty", function () {
var item_code = $(this).parents(".pos-selected-item-action").attr("data-item-code");
var qty = $(this).val();
me.update_qty(item_code, qty)
me.update_value()
me.update_qty(item_code, qty);
me.update_value();
})
$(this.wrapper).on("focusout", ".pos-item-qty", function () {
var item_code = $(this).parents(".pos-selected-item-action").attr("data-item-code");
var qty = $(this).val();
me.update_qty(item_code, qty, true);
me.update_value();
})
$(this.wrapper).find("[data-action='increase-qty']").on("click", function () {
var item_code = $(this).parents(".pos-bill-item").attr("data-item-code");
var qty = flt($(this).parents(".pos-bill-item").find('.pos-item-qty').val()) + 1;
me.update_qty(item_code, qty)
me.update_qty(item_code, qty);
})
$(this.wrapper).find("[data-action='decrease-qty']").on("click", function () {
var item_code = $(this).parents(".pos-bill-item").attr("data-item-code");
var qty = flt($(this).parents(".pos-bill-item").find('.pos-item-qty').val()) - 1;
me.update_qty(item_code, qty)
me.update_qty(item_code, qty);
})
$(this.wrapper).on("change", ".pos-item-disc", function () {
@@ -1219,11 +1235,11 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
me.bind_delete_event()
},
update_qty: function (item_code, qty) {
update_qty: function (item_code, qty, remove_zero_qty_items) {
var me = this;
this.items = this.get_items(item_code);
this.validate_serial_no()
this.set_item_details(item_code, "qty", qty);
this.set_item_details(item_code, "qty", qty, remove_zero_qty_items);
},
update_discount: function(item_code, discount) {
@@ -1284,7 +1300,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
})
},
set_item_details: function (item_code, field, value) {
set_item_details: function (item_code, field, value, remove_zero_qty_items) {
var me = this;
if (value < 0) {
frappe.throw(__("Enter value must be positive"));
@@ -1299,7 +1315,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
d[field] = flt(value);
d.amount = flt(d.rate) * flt(d.qty);
if (d.qty == 0) {
if (d.qty == 0 && remove_zero_qty_items) {
me.remove_item.push(d.idx)
}
@@ -1309,10 +1325,14 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
}
});
if (field == 'qty') {
this.remove_zero_qty_items_from_cart();
}
this.update_paid_amount_status(false)
},
remove_zero_qty_item: function () {
remove_zero_qty_items_from_cart: function () {
var me = this;
var idx = 0;
this.items = []
@@ -1417,8 +1437,20 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.child.income_account = this.pos_profile_data['income_account'] || this.items[0].income_account;
this.child.warehouse = (this.item_serial_no[this.child.item_code]
? this.item_serial_no[this.child.item_code][1] : (this.pos_profile_data['warehouse'] || this.items[0].default_warehouse));
this.child.price_list_rate = flt(this.price_list_data[this.child.item_code] * this.child.conversion_factor, 9) / flt(this.frm.doc.conversion_rate, 9);
this.child.rate = flt(this.price_list_data[this.child.item_code] * this.child.conversion_factor, 9) / flt(this.frm.doc.conversion_rate, 9);
customer = this.frm.doc.customer;
let rate;
customer_price_list = this.customer_wise_price_list[customer]
if (customer_price_list && customer_price_list[this.child.item_code]){
rate = flt(this.customer_wise_price_list[customer][this.child.item_code] * this.child.conversion_factor, 9) / flt(this.frm.doc.conversion_rate, 9);
}
else{
rate = flt(this.price_list_data[this.child.item_code] * this.child.conversion_factor, 9) / flt(this.frm.doc.conversion_rate, 9);
}
this.child.price_list_rate = rate;
this.child.rate = rate;
this.child.actual_qty = me.get_actual_qty(this.items[0]);
this.child.amount = flt(this.child.qty) * flt(this.child.rate);
this.child.batch_no = this.item_batch_no[this.child.item_code];
@@ -1654,10 +1686,18 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
create_invoice: function () {
var me = this;
var existing_pos_list = [];
var invoice_data = {};
this.si_docs = this.get_doc_from_localstorage();
if (this.frm.doc.offline_pos_name) {
if(this.si_docs) {
this.si_docs.forEach((row) => {
existing_pos_list.push(Object.keys(row));
});
}
if (this.frm.doc.offline_pos_name
&& in_list(existing_pos_list, this.frm.doc.offline_pos_name)) {
this.update_invoice()
//to retrieve and set the default payment
invoice_data[this.frm.doc.offline_pos_name] = this.frm.doc;
@@ -1666,8 +1706,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.frm.doc.paid_amount = this.frm.doc.net_total
this.frm.doc.outstanding_amount = 0
} else {
this.frm.doc.offline_pos_name = $.now();
} else if(!this.frm.doc.offline_pos_name) {
this.frm.doc.offline_pos_name = frappe.datetime.now_datetime();
this.frm.doc.posting_date = frappe.datetime.get_today();
this.frm.doc.posting_time = frappe.datetime.now_time();
this.frm.doc.pos_total_qty = this.frm.doc.qty_total;
@@ -1826,10 +1866,25 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
validate: function () {
var me = this;
this.customer_validate();
this.validate_zero_qty_items();
this.item_validate();
this.validate_mode_of_payments();
},
validate_zero_qty_items: function() {
this.remove_item = [];
this.frm.doc.items.forEach(d => {
if (d.qty == 0) {
this.remove_item.push(d.idx);
}
});
if(this.remove_item) {
this.remove_zero_qty_items_from_cart();
}
},
item_validate: function () {
if (this.frm.doc.items.length == 0) {
frappe.throw(__("Select items to save the invoice"))

View File

@@ -14,7 +14,7 @@ from frappe.contacts.doctype.address.address import (get_address_display,
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency
from erpnext.accounts.utils import get_fiscal_year
from erpnext import get_default_currency, get_company_currency
from erpnext import get_company_currency
from six import iteritems
@@ -22,18 +22,20 @@ class DuplicatePartyAccountError(frappe.ValidationError): pass
@frappe.whitelist()
def get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
bill_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False, fetch_payment_terms_template=True, party_address=None, shipping_address=None):
bill_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False, fetch_payment_terms_template=True,
party_address=None, shipping_address=None, pos_profile=None):
if not party:
return {}
if not frappe.db.exists(party_type, party):
frappe.throw(_("{0}: {1} does not exists").format(party_type, party))
return _get_party_details(party, account, party_type,
company, posting_date, bill_date, price_list, currency, doctype, ignore_permissions, fetch_payment_terms_template, party_address, shipping_address)
company, posting_date, bill_date, price_list, currency, doctype, ignore_permissions,
fetch_payment_terms_template, party_address, shipping_address, pos_profile)
def _get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
bill_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False,
fetch_payment_terms_template=True, party_address=None, shipping_address=None):
fetch_payment_terms_template=True, party_address=None, shipping_address=None, pos_profile=None):
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype))
party = out[party_type.lower()]
@@ -49,7 +51,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
set_address_details(out, party, party_type, doctype, company, party_address, shipping_address)
set_contact_details(out, party, party_type)
set_other_values(out, party, party_type)
set_price_list(out, party, party_type, price_list)
set_price_list(out, party, party_type, price_list, pos_profile)
out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_type)
@@ -149,12 +151,20 @@ def get_default_price_list(party):
return None
def set_price_list(out, party, party_type, given_price_list):
def set_price_list(out, party, party_type, given_price_list, pos=None):
# price list
price_list = get_permitted_documents('Price List')
if price_list:
price_list = price_list[0]
elif pos and party_type == 'Customer':
customer_price_list = frappe.get_value('Customer', party.name, 'default_price_list')
if customer_price_list:
price_list = customer_price_list
else:
pos_price_list = frappe.get_value('POS Profile', pos, 'selling_price_list')
price_list = pos_price_list or given_price_list
else:
price_list = get_default_price_list(party) or given_price_list
@@ -562,3 +572,18 @@ def get_party_shipping_address(doctype, name):
return out[0][0]
else:
return ''
def get_partywise_advanced_payment_amount(party_type, posting_date = None):
cond = "1=1"
if posting_date:
cond = "posting_date <= '{0}'".format(posting_date)
data = frappe.db.sql(""" SELECT party, sum({0}) as amount
FROM `tabGL Entry`
WHERE
party_type = %s and against_voucher is null
and {1} GROUP BY party"""
.format(("credit") if party_type == "Customer" else "debit", cond) , party_type)
if data:
return frappe._dict(data)

View File

@@ -0,0 +1,76 @@
{%- from "templates/print_formats/standard_macros.html" import add_header -%}
<style>
.table-bordered td.top-bottom {border-top: none !important;border-bottom: none !important;}
.table-bordered td.right{border-right: none !important;}
.table-bordered td.left{border-left: none !important;}
</style>
<div>
{% set gl = frappe.get_list(doctype="GL Entry", fields=["account", "party_type", "party", "debit", "credit", "remarks"], filters={"voucher_type": doc.doctype, "voucher_no": doc.name}) %}
{%- if not doc.get("print_heading") and not doc.get("select_print_heading")
and doc.set("select_print_heading", _("Payment Entry")) -%}{%- endif -%}
{{ add_header(0, 1, doc, letter_head, no_letterhead, print_settings) }}
<div class="row margin-bottom">
<div class="col-xs-6">
<table>
<tr><td><strong>Voucher No: </strong></td><td>{{ doc.name }}</td></tr>
</table>
</div>
<div class="col-xs-6">
<table>
<tr><td><strong>Date: </strong></td><td>{{ frappe.utils.formatdate(doc.creation) }}</td></tr>
</table>
</div>
</div>
<div class="margin-top">
<table class="table table-bordered table-condensed">
<tr>
<th>Account</th>
<th>Party Type</th>
<th>Party</th>
<th>Amount</th>
</tr>
<tr>
<td class="top-bottom" colspan="5"><strong>Debit</strong></td>
</tr>
{% for entries in gl %}
{% if entries.credit == 0.0 %}
<tr>
<td class="right top-bottom">{{ entries.account }}</td>
<td class="right left top-bottom">{{ entries.party_type }}</td>
<td class="right left top-bottom">{{ entries.party }}</td>
<td class="left top-bottom">{{ entries.debit }}</td>
</tr>
<tr>
<td class="top-bottom"colspan="4"><strong> Narration </strong><br>{{ entries.remarks }}</td>
</tr>
{% endif %}
{% endfor %}
<tr>
<td class="right" colspan="3" ><strong>Total (debit) </strong></td>
<td class="left" >{{ gl | sum(attribute='debit') }}</td>
</tr>
<tr>
<td class="top-bottom" colspan="5"><strong>Credit</strong></td>
</tr>
{% for entries in gl %}
{% if entries.debit == 0.0 %}
<tr>
<td class="right top-bottom">{{ entries.account }}</td>
<td class="right left top-bottom">{{ entries.party_type }}</td>
<td class="right left top-bottom">{{ entries.party }}</td>
<td class="left top-bottom">{{ entries.credit }}</td>
</tr>
<tr>
<td class="top-bottom" colspan="4"><strong> Narration </strong><br>{{ entries.remarks }}</td>
</tr>
{% endif %}
{% endfor %}
<tr>
<td class="right" colspan="3"><strong>Total (credit) </strong></td>
<td class="left" >{{ gl | sum(attribute='credit') }}</td>
</tr>
</table>
<div>
</div>

View File

@@ -0,0 +1,22 @@
{
"align_labels_right": 0,
"creation": "2019-02-15 11:49:08.608619",
"custom_format": 0,
"default_print_language": "en",
"disabled": 0,
"doc_type": "Payment Entry",
"docstatus": 0,
"doctype": "Print Format",
"font": "Default",
"idx": 0,
"line_breaks": 0,
"modified": "2019-02-15 11:49:08.608619",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank and Cash Payment Voucher",
"owner": "Administrator",
"print_format_builder": 0,
"print_format_type": "Server",
"show_section_headings": 0,
"standard": "Yes"
}

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