Compare commits

..

1349 Commits

Author SHA1 Message Date
ricky e6818958ae Add I18n support for flash messages and update locale file with new notices 2026-01-30 20:19:12 -05:00
ricky 5b31459629 use a symbol for empty 2026-01-30 19:28:33 -05:00
ricky 92de2928f6 Merge branch 'master' into symbols 2026-01-30 17:12:11 -05:00
ricky a8af180de2 2026.1.7 2026-01-30 17:09:34 -05:00
ricky e621dc9e3a nil not nill 2026-01-30 17:00:29 -05:00
ricky c3d7c1c867 Use symbols 2026-01-30 16:58:14 -05:00
ricky defeec7f8e 2026.1.6 2026-01-30 07:53:51 -05:00
ricky 37c302e274 use symbol keys 2026-01-30 07:53:29 -05:00
ricky 006e907b35 need to supply selected id 2026-01-30 07:53:14 -05:00
ricky f1f77a8022 use locale 2026-01-30 07:42:09 -05:00
ricky ff358d806e 2026.1.5 2026-01-30 07:22:11 -05:00
ricky b80e1d4e28 loose the hash rocket, use symbol keys 2026-01-29 22:30:59 -05:00
ricky f24128ef75 Cleaned up Issue Show Hook 2026-01-29 21:53:18 -05:00
ricky d3a8c05f50 Added missing to_s method 2026-01-29 21:36:50 -05:00
ricky f023cd246d Titlize new issue subjects 2026-01-29 21:18:15 -05:00
ricky b7e18a3c3f Cleaned up Issue Form Hook 2026-01-29 21:12:32 -05:00
ricky 67f2dbf4d8 Removed reduntant onchange js call to update issue 2026-01-28 17:35:12 -05:00
ricky 924aa7657b Fixed typo 2026-01-28 10:11:28 -05:00
ricky 16fe07f177 Fixed typo 2026-01-28 08:50:37 -05:00
ricky 9257b2f938 2026.1.4 2026-01-28 08:42:33 -05:00
ricky 0227681e92 Added hook list to README 2026-01-28 08:41:55 -05:00
ricky c034696810 Disabled showing assinee to customer 2026-01-28 08:38:02 -05:00
ricky ffdabccd84 Updated README with information about plugin hooks 2026-01-28 08:18:29 -05:00
ricky 1f03908040 Refactor employee and estimate models by removing redundant comments; update locale file to remove item references; delete unused QboItemTest file. 2026-01-28 07:45:20 -05:00
ricky 43a5317b4e Removed DEVELOPMENT from plugin name 2026-01-28 07:03:08 -05:00
ricky 4c49ec6890 2026.1.3 2026-01-27 21:17:17 -05:00
ricky ef7faee685 Process updates from the hooks 2026-01-27 20:50:54 -05:00
ricky 02b48d2de4 Dont add reference for customers to projects 2026-01-27 18:07:37 -05:00
ricky e670d99766 Removed project level intergration 2026-01-27 18:01:42 -05:00
ricky 241dd594d0 Fixed pdf hooks 2026-01-26 23:22:23 -05:00
ricky b603cb634a Version Bump 2026.1.2 2026-01-26 22:59:48 -05:00
ricky 1308a05011 Removed Load Customer Link 2026-01-26 21:00:16 -05:00
ricky 334ed60bf7 removed extra comma 2026-01-26 20:14:01 -05:00
ricky d63bf809f2 Merge branch 'redmine-6' into dev-6 2026-01-26 10:16:40 -05:00
ricky 31406af681 Version bump 2026.1.1 2026-01-26 10:09:24 -05:00
ricky 479be461a6 Dynamically load updateIssueFrom javascript path 2026-01-26 10:08:53 -05:00
ricky c1af031d22 Link to sandbox if enabled 2026-01-23 21:40:08 -05:00
ricky a741cd0217 update readme 2026-01-22 21:54:03 -05:00
ricky 4ae9374401 Merge branch 'redmine-6' into dev-6 2026-01-22 21:50:40 -05:00
ricky b096244454 Better display of customer note 2026-01-22 21:50:17 -05:00
ricky 4983cd661c Fixed missing locale 2026-01-22 21:49:33 -05:00
ricky 5f6fb4af27 Only show select all when more than one invoice 2026-01-22 21:29:08 -05:00
ricky 2f2c74403f Bug fixes 2026-01-22 21:20:47 -05:00
ricky 43579d73e5 Merge remote-tracking branch 'origin/hooks' into dev-6 2026-01-22 20:58:06 -05:00
ricky a90d6b839f Updated readme 2026-01-22 20:57:09 -05:00
ricky e76f977ca8 Removed Vehicles 2026-01-22 20:54:06 -05:00
ricky 7f821d241c Removed typo 2026-01-22 20:47:31 -05:00
ricky 1bc9227c7f finish redmine-6 merge into dev 2026-01-22 20:43:06 -05:00
ricky 3c2f1d0edd Merge branch 'redmine-6' into HEAD 2026-01-22 20:39:20 -05:00
ricky 35e303d54b Migrated hard coded strings to locales 2026-01-21 20:49:54 -05:00
ricky 2aeb3fa028 Updated copyright dates 2026-01-21 20:40:06 -05:00
ricky c85e45b544 Print attached estimate 2026-01-21 20:29:38 -05:00
ricky 6cd7825430 Added pdf method 2026-01-21 20:28:54 -05:00
ricky 14f411c2e1 Moved hooks & patches into sperate folders 2026-01-21 19:35:08 -05:00
ricky 623510b474 Finaly got the issue form javascrip reloading to work 2026-01-21 12:20:43 -05:00
ricky 20d9f0a84e update readme 2026-01-20 21:41:58 -05:00
ricky f741ce5dc9 Fixed displaying of notes 2026-01-20 21:40:17 -05:00
ricky 72ec89292f Added onclick to load customer link 2026-01-20 21:15:25 -05:00
ricky b54eb86b7f Moved javascript into ViewLayoutsHookListener 2026-01-20 21:02:40 -05:00
ricky f74f3ad72e Select All Invoices For Bulk PDF 2026-01-20 20:49:03 -05:00
ricky 0647b7708f Udated README & Copyright Date 2026-01-20 13:49:38 -05:00
ricky 7d644f0619 Dynamically load all Hooks & Patches 2026-01-20 08:12:34 -05:00
ricky b712c328ba Remove logging 2026-01-20 08:11:53 -05:00
ricky 5649ba05cd Added Checkbox Controller javascript 2026-01-19 19:34:59 -05:00
ricky bcdd515cf1 Remove view_layouts_base_body_bottom 2026-01-19 19:34:10 -05:00
ricky 704dff2a72 Multiple Invoices to PDF 2026-01-19 19:33:29 -05:00
ricky 55d00f9005 Added sandbox to settings 2025-07-08 21:01:48 -04:00
ricky eba3f529f8 Set version & requirements 2025-07-08 20:19:19 -04:00
ricky f0a3b0193c Development mode
Use the QBO sandbox & Display DEVEOMPENT in the plugin name
2025-06-18 08:30:21 -04:00
ricky 19733c3f8c Added gem rexml 2025-06-16 23:41:30 -04:00
ricky f22795ac90 Moved strings for notices to en.yml 2025-06-16 22:56:54 -04:00
ricky 166a9ee31b Removed has_many purchases, table doesn't exist anymore 2025-06-16 22:54:47 -04:00
ricky 4d85c24872 generate redirect_uri protocol based one site settings 2025-06-16 22:30:30 -04:00
ricky 43c7374c42 Load oauth key & secret when constructing client, not on application start up 2025-06-16 22:16:58 -04:00
ricky 60857e9dca generate redirect_uri protocol based one site settings 2025-06-16 22:15:42 -04:00
ricky d38f0d6ac1 Merge branch 'master' of https://github.com/rickbarrette/redmine_qbo 2025-06-15 19:03:59 -04:00
ricky f6da031e72 include Redmine::I18n 2025-06-15 18:59:00 -04:00
ricky 9779437c00 Log token refresh 2024-12-19 09:41:53 -05:00
ricky 1a37926628 Log error not info 2024-12-19 09:36:23 -05:00
ricky dac9a7c756 Started Support for Redmine 6 2024-12-12 06:00:36 -05:00
ricky 9ac1261ed0 Sort by id not doc_number
This fixes the bug where documents were displayed out of order
2024-08-30 09:19:58 -04:00
ricky 9b69d3f728 Added link to customer profile for appointments 2024-08-26 11:00:50 -04:00
ricky a5de879260 Fixed formatting 2024-08-26 08:41:56 -04:00
ricky 6464e1cbc6 Added actions 2024-08-26 07:58:40 -04:00
ricky 7f3a94229a Create Estimate 2024-08-26 07:58:05 -04:00
ricky 395e0117fb Update _actions.html.erb 2024-08-26 07:57:10 -04:00
ricky e04d363e42 Added label for actions 2024-08-26 07:56:06 -04:00
ricky 3b6c0d4a70 Removed Action links 2024-08-26 07:52:27 -04:00
ricky d1f6ccd9cb Create _actions.html.erb 2024-08-26 07:51:38 -04:00
ricky 74f7ba41df Add Appointment Link 2024-08-21 21:39:50 -04:00
ricky 4fb424faa8 Only sync by doc number if not in database 2024-08-20 07:14:37 -04:00
ricky 63218e7f42 Fixed formating 2024-08-19 23:28:54 -04:00
ricky 7f0bb3cae7 Removed extra end 2024-08-19 23:26:43 -04:00
ricky ad7417c233 Moved work into thread to repsond quickly 2024-08-19 23:21:56 -04:00
ricky cf0be2336b Removed sync button from sidebar 2024-08-19 23:12:20 -04:00
ricky 6e08746611 2.1.1 Force Estimate sync by Doc Number when searching 2024-08-19 22:51:53 -04:00
ricky 7eb26facaf Use the first result 2024-08-19 22:49:20 -04:00
ricky 9115cc662c Forgot params[:search] 2024-08-19 22:39:50 -04:00
ricky 9e7c1dbfb2 removed () 2024-08-19 22:38:16 -04:00
ricky e99f5d2e52 Added webhook view 2024-08-19 22:36:44 -04:00
ricky 039d1ca993 Use Logger.info 2024-08-19 22:31:41 -04:00
ricky dd9ac3c481 Added Estimate.sync_by_doc_number 2024-08-19 22:30:34 -04:00
ricky 4f789080e7 2.1.0 Bumped wrong versoin 2024-08-19 20:18:22 -04:00
ricky 80fc858a35 send back status 200 if request succeeded 2024-08-19 20:14:02 -04:00
ricky 6f8d280657 5.2.0 FIXED QBO Authentication 2024-08-19 20:06:13 -04:00
ricky 5782cbc166 Added https 2024-08-19 20:04:09 -04:00
ricky 0729d2ac41 added https to redirect_uri 2024-08-19 20:02:22 -04:00
ricky 6c6de0ba86 Added log 2024-08-19 19:59:26 -04:00
ricky 11dbcaf80c Use Setting.host_name & path 2024-08-19 19:53:51 -04:00
ricky 95592e542f Use qbo_oauth_callback_path 2024-08-19 19:30:51 -04:00
ricky 472bdec4fa Use qbo_authenticate_path 2024-08-19 19:17:45 -04:00
ricky c7a313e9ed Add customer name to details 2024-04-03 11:47:38 -04:00
ricky c14b590083 2024 Copy Right Update 2024-03-29 08:10:05 -04:00
ricky 040c920481 2.0.5 2024-03-29 07:58:26 -04:00
ricky 8c63817950 Use free_form_number 2024-03-28 14:13:39 -04:00
ricky e2f43d398f Nil Checks 2024-03-28 14:01:18 -04:00
ricky 7ba4829066 Update Customer Phone Numbers On Sync 2024-03-28 13:51:29 -04:00
ricky 938999db91 Added quickbooks to customer's name 2024-03-28 12:54:36 -04:00
ricky 0b60a8e41b 2.0.4 2024-01-07 20:53:07 -05:00
ricky 817a43e849 Fixed update 2024-01-07 20:47:26 -05:00
ricky 047296329e 2.0.32.0.3 2023-12-31 16:42:47 -05:00
ricky c8cb74f3d4 Merge branch 'redmine-5' 2023-12-31 16:35:26 -05:00
ricky aceb6cb6b5 fixed typo 2023-12-31 16:26:02 -05:00
ricky b531076c18 Merge branch 'dev' into hooks 2023-12-30 23:43:10 -05:00
ricky 9e342ced28 Merge branch 'master' into hooks 2023-12-30 23:40:08 -05:00
ricky 9fd1bc9dff Merge branch 'redmine-5' 2023-12-30 23:35:25 -05:00
ricky 0537d9bd86 Merge branch 'master' into hooks 2023-12-30 23:18:55 -05:00
ricky 04391f1c6e 2.0.2 2023-12-30 23:07:17 -05:00
ricky e2bf42e66b Fixed invoice pdf 2023-12-30 23:04:43 -05:00
ricky 0c72ca9294 missed this authenticated_request 2023-12-30 23:01:32 -05:00
ricky 2985fad77c Fixed typo 2023-12-30 23:01:01 -05:00
ricky 02b5fb4d0e Fixed returned variable handling 2023-12-30 22:53:08 -05:00
ricky bf417c163c Rework performing authenticated requests 2023-12-30 22:33:28 -05:00
ricky b35974e455 2.0.1 2023-12-30 20:55:58 -05:00
ricky 6d0abf865e 2023 2023-12-30 20:54:40 -05:00
ricky 275af9be82 Fixed formatting 2023-12-30 20:53:39 -05:00
ricky f4e44a1975 Remove listen (was used for development env) 2023-12-30 20:29:20 -05:00
ricky 81f322b616 Call refresh_token to set token time stamps 2023-12-30 20:26:30 -05:00
ricky f094ef57ec Setter for notes 2023-12-30 20:08:36 -05:00
ricky 2e32d8f6e5 Fixed get_base 2023-12-30 19:55:01 -05:00
ricky 3e352f270d Added Item 2023-12-30 19:41:02 -05:00
ricky 45056e8ff4 Remove unsed columns 2023-12-30 19:28:04 -05:00
ricky b13abe51bf Display token expiration times 2023-12-30 19:27:37 -05:00
ricky c3513427de Used realm_id not comany_id 2023-12-30 19:13:08 -05:00
ricky 7a6b6882d2 Update get_base 2023-12-30 18:53:01 -05:00
ricky d6ec34cef9 added realm_id 2023-12-30 12:56:46 -05:00
ricky 84dfdd707a fixed token names 2023-12-30 12:46:52 -05:00
ricky 517a239485 Started reworking Oauth token sorage 2023-12-30 12:39:51 -05:00
ricky 47868051f8 Rails 6.1 Deprecates update_attributes 2023-12-29 20:25:26 -05:00
ricky 96e4e9df66 Fixed typo with params 2023-12-29 20:17:46 -05:00
ricky 7d510e4028 Added notes to allowed params 2023-12-29 20:06:15 -05:00
ricky 6760b29148 Log the time stamp 2023-12-29 19:20:31 -05:00
ricky 122063b1d5 Fixed customer typo 2023-12-29 19:14:38 -05:00
ricky b304c3a175 Fixed employee typo 2023-12-29 19:09:24 -05:00
ricky 5b89d73c20 Remove QboItem.sync 2023-12-29 18:56:20 -05:00
ricky 8380dda25a render 403 when forbidden 2023-12-29 17:06:00 -05:00
ricky 7839116134 Version 2.0.0 2023-12-27 16:31:11 -05:00
ricky b3a809ab1c Redmine 5.1 Update 2023-12-27 15:03:08 -05:00
ricky 3a0e58c3da Append last 4 of phone number to customers name 2023-05-22 07:34:18 -04:00
ricky 26433c9020 Added hour totals to customer job history 2023-01-14 06:38:48 -05:00
ricky a531ef4f87 Added hour totals to customer job history 2023-01-14 06:20:41 -05:00
ricky 6dbf84f401 Added nil check to address_to_s 2022-05-04 12:37:31 -04:00
ricky 3220ff728f Fixed process_estimate that I accidently broke 2022-04-06 12:45:40 -04:00
ricky 1fae647381 Merge branch 'master' into dev 2022-03-19 05:49:54 -04:00
ricky d1764e2203 Removed Comment 2022-03-19 05:49:18 -04:00
ricky d8d1942673 Version 1.1.6 2022-03-19 05:47:07 -04:00
ricky 8e329b2dd2 Fix broken invoice processing 2022-03-19 05:29:59 -04:00
ricky 3622f8cad7 Added space 2022-03-19 05:16:26 -04:00
ricky f830881883 Don't need to pass customer, only issue 2022-03-17 06:52:46 -04:00
ricky fb87e8a33a Added hook :show_issue_view_right 2022-03-17 06:45:57 -04:00
ricky 8bdec410c4 Fixed render of hook :show_customer_view_right 2022-03-17 06:12:35 -04:00
ricky dec9eee90b Merge branch 'master' into dev 2022-03-15 12:29:11 -04:00
ricky 0513763607 Version 1.1.5 2022-03-14 19:41:53 -04:00
ricky b7e3ea9e3d estimate not e 2022-03-14 19:39:36 -04:00
ricky 3ea2cd14d1 Fixed accidental removal of qbo prefix 2022-03-14 19:33:20 -04:00
ricky 7b7875991f created get_estimate to remove redundant code 2022-03-14 19:28:40 -04:00
ricky b1a106d4d8 No id required 2022-03-14 19:27:31 -04:00
ricky 0281d86f1a No id required 2022-03-14 19:25:20 -04:00
ricky 2231156873 use estimate_doc_path not a hard coded path 2022-03-14 19:01:20 -04:00
ricky 2745ecf242 Added call_hook :show_customer_view_right 2022-03-14 07:52:33 -04:00
ricky 13472c3b3a Remove nhtsa_vin gem 2022-03-14 07:26:07 -04:00
ricky b686110145 Initial Vehicle Delete 2022-03-14 07:22:43 -04:00
ricky d91e7892c3 Added PDF hooks 2022-03-13 22:36:34 -04:00
ricky f26224de56 Created hook process_invoice_custom_fields 2022-03-13 20:06:13 -04:00
ricky ecc8930bec Try to bill completed issue, TODO handle errors 2022-03-13 17:51:52 -04:00
ricky 5814740a5d Allow customer to view estimate 2022-03-13 17:49:58 -04:00
ricky 25159c760a FIX - forgot to drop qbo from time_entries.billed 2022-03-13 01:17:18 -05:00
ricky 3ff9132acb Updated readme 2022-03-13 01:00:34 -05:00
ricky b5f00f254c Added a copy link button 2022-03-13 00:53:32 -05:00
ricky 70f2c473d5 Moved buttons to watcher link location 2022-03-13 00:37:51 -05:00
ricky b3b11d726d Version 1.1.4 2022-03-12 16:03:14 -05:00
ricky f97d5bc731 Moving fat into CustomerToken 2022-03-12 16:01:13 -05:00
ricky 49507d06c7 Updated TODO list 2022-03-12 00:03:26 -05:00
ricky 5d928c486f Getter convenience method for tokens 2022-03-12 00:01:40 -05:00
ricky 0485e9d64c Allow attachment viewing w/ valid customer token 2022-03-11 23:16:23 -05:00
ricky cc0839204e Ignore workspace files 2022-03-11 21:14:12 -05:00
ricky 760a85a1da removed link_to user & version 2022-03-10 06:53:05 -05:00
ricky c821774e9b Version 1.1.3 2022-03-09 23:17:38 -05:00
ricky 47a19a7e77 Removed Qbo index & sync html, methods, & routes
This stuff isn't really used for anything
2022-03-09 23:06:54 -05:00
ricky a75f1abd71 Removed extra white spaces 2022-03-09 22:53:03 -05:00
ricky 09c497ff96 Removed old #attr_accessible... comments 2022-03-09 22:31:19 -05:00
ricky cae1d9de02 Removed old commented out code 2022-03-09 22:27:33 -05:00
ricky 1050a4f6a7 Use rails router, not hard coded links 2022-03-09 22:18:47 -05:00
ricky be4ef44c13 Added strings for Flash messages, not used yet 2022-03-09 22:10:16 -05:00
ricky 89e4132fc1 Update readme & comments 2022-03-09 21:51:06 -05:00
ricky 8d8201822b No longer need to prepend("Qbo") 2022-03-09 21:45:07 -05:00
ricky 726eb4632e use plural for routes 2022-03-09 21:43:08 -05:00
ricky ffcb2ee608 Remove payment orphans 2022-03-09 21:40:40 -05:00
ricky 24f8be6e80 Drop the Qbo prefix 2022-03-09 21:31:56 -05:00
ricky 08fa4aefc4 Added button text to locale file 2022-03-09 19:09:37 -05:00
ricky 13bbd5dfc1 Use rails router, not hard coded links 2022-03-09 19:05:12 -05:00
ricky 8e6eeab680 Moved HTML code into partial _from_hook.html.erb 2022-03-09 18:55:44 -05:00
ricky 70d9d5063a Moved issues show details to issue folder 2022-03-09 18:25:07 -05:00
ricky 374429f161 Added 2016 2022-03-08 20:50:39 -05:00
ricky c69666e747 Added first year 2022-03-08 20:49:55 -05:00
ricky 7dc04b4a07 QboItem doesn’t exist anymore 2022-03-08 20:30:52 -05:00
ricky 7b5e54aaba Merge branch 'master' of https://github.com/rickbarrette/redmine_qbo 2022-03-07 07:52:26 -05:00
ricky 30b704c90f Don't generate new customer view token every time 2022-03-07 07:52:17 -05:00
ricky 2f98b5afaa Update README.md
formatting
2022-03-06 19:04:29 -05:00
ricky 3c3b43cfc5 Readme update
formatting
2022-03-06 19:02:31 -05:00
ricky 09f2a534be Readme update
Cleaning things up
2022-03-06 19:01:42 -05:00
ricky 7b5b673ebf Version 1.1.2 2022-03-06 18:20:30 -05:00
ricky c72d0a83ca New line @ EOF & formating 2022-03-06 17:50:22 -05:00
ricky 3159289ac0 Removed unused code, only need to bill time
removed line items, payments, drop used db tables
2022-03-06 17:26:57 -05:00
ricky a9cc5fac73 Removed unsed code & cleaned up comments 2022-03-06 17:05:04 -05:00
ricky fe06fccacd Only show sync button if User is an admin 2022-03-06 16:49:07 -05:00
ricky 8b4a46f7eb H3 not H2 2022-03-06 16:27:39 -05:00
ricky cf362caaf2 Cleaning up html formatting 2022-03-06 16:24:17 -05:00
ricky de1be7d296 Make last 8 bold 2022-03-06 16:17:08 -05:00
ricky d8e3e1a72f Styling & formatting 2022-03-06 13:46:55 -05:00
ricky 64a7ad844f Styling & formatting 2022-03-06 13:46:26 -05:00
ricky 9201c4ca96 render 404 on all exceptions 2022-03-06 09:23:05 -05:00
ricky dab6b6f723 don't show doors if vehicle.doors is nil 2022-03-06 09:17:06 -05:00
ricky 495243d177 Add trim & doors to vehicle 2022-03-06 08:59:48 -05:00
ricky 332f07c93d Version 1.1.1 2022-03-06 07:51:39 -05:00
ricky 54d4be9762 Only show sidebar views when user is logged in 2022-03-06 07:32:01 -05:00
ricky f1e3c29c97 Added Load Customer Link on Issue Form 2022-03-05 08:26:57 -05:00
ricky 66d393a465 Dynamically load hooks/patches & require redmine4+ 2022-03-02 07:15:54 -05:00
ricky 218d3392f0 Moved string to en.yml 2022-02-24 18:34:17 -05:00
ricky 0136d91cc3 Comments & formatting 2022-02-24 04:58:41 -05:00
ricky a95f0350d8 Fixed missing transation error 2022-02-23 20:20:47 -05:00
ricky 55c04b6585 update Issue form on customer name change 2022-02-23 18:36:08 -05:00
ricky ea21bc362a autocomplete off for forms & search 2022-02-23 18:24:57 -05:00
ricky 117d92b879 Fixed customer sorting & removed customer filter 2022-02-21 20:23:57 -05:00
ricky 440c8e4618 list issues in desc order 2022-02-21 19:33:38 -05:00
ricky 1344526f7f update txn_date too 2022-02-21 08:51:24 -05:00
ricky 19acfbc76f Added logging 2022-02-21 08:51:01 -05:00
ricky 9dfb27f0a4 Prevent webhook loops 2022-02-21 07:54:24 -05:00
ricky 51cd830710 Updated screenshots 2022-02-21 06:53:50 -05:00
ricky 956ba2ad46 Version 1.1.0 2022-02-21 06:25:51 -05:00
ricky 3ae3107760 desc sort issues, estimates, & invoices 2022-02-21 06:22:13 -05:00
ricky 925d4b8bcf Updated comments & removed unused code 2022-02-21 06:06:24 -05:00
ricky ca6dbfd12d Removed duplicate private declaration 2022-02-21 05:26:54 -05:00
ricky 9ea03d0c6d Removed sync on view 2022-02-21 05:23:11 -05:00
ricky 6ad4929d53 Sync Estimates & Invoices on database update 2022-02-21 05:17:35 -05:00
ricky 446f419af0 Sync invoice when viewing 2022-02-20 19:37:03 -05:00
ricky f3c5de82e0 Bug fix 2022-02-20 18:02:37 -05:00
ricky 56e24752cf Import invoice fix 2022-02-20 17:53:01 -05:00
ricky 255af13b20 Add txn_date to invoice & estimate databse 2022-02-20 17:40:41 -05:00
ricky 02b4f1eb43 Added Invoice date 2022-02-20 17:26:24 -05:00
ricky 8c735d3921 Added Estimate date 2022-02-20 17:19:56 -05:00
ricky 70e6038215 Moved customer issue counts 2022-02-20 15:22:31 -05:00
ricky fc7501c4fe address not a 2022-02-20 14:57:21 -05:00
ricky 45b60cfea1 PhysicalAddress to_s 2022-02-20 14:52:11 -05:00
ricky 09313ad471 exclude before filter for customer/view 2022-02-20 13:42:06 -05:00
ricky 1b15aecbff Disable autocomplete suggestions for search 2022-02-20 08:11:57 -05:00
ricky 2bea7dbc8d fixed customer link - missing view issues/history 2022-02-20 07:56:25 -05:00
ricky 3468b5f236 Open links in new window 2022-02-19 22:53:39 -05:00
ricky 1c431d14dc remove gem faraday_middleware & set oauth2 1.4.7 2022-02-19 22:48:44 -05:00
ricky 7234a70265 Added allowed params for qbo controller 2022-02-19 21:47:12 -05:00
ricky a459d84b00 Added Estimate & Invoice List to Customer view 2022-02-19 21:19:08 -05:00
ricky 49d2ed8244 Readme update 2022-02-19 20:56:54 -05:00
ricky d6aebfcb99 Moved strings to Ruby I18n en.yml 2022-02-19 20:46:39 -05:00
ricky 2085eb7869 Add gem dependancy faraday_middleware 1.2.0 to fix NoMethodError: undefined method `dependency' for Gzip:Class 2022-02-18 22:42:20 -05:00
ricky c101a86f02 Open Estimate PDF in new windows 2022-02-17 09:19:32 -05:00
ricky 2d32769a59 Error not fatal 2022-02-13 13:19:04 -05:00
ricky a2f755388e Fixed merge error 2022-02-13 12:34:03 -05:00
ricky 8a8f1af2bd Updated Copyright 2022 2022-02-13 11:57:43 -05:00
ricky 4582b8c5b9 Added estimate search in side bar 2022-02-13 10:03:43 -05:00
ricky f66fbf6656 specified the rails version in migrations 2022-02-12 16:14:36 -05:00
ricky 41d49ccce5 Setting.host_name for hooks not a hardcoded URL 2022-02-12 09:24:21 -05:00
ricky c85f450742 Merge branch 'master' into redmine-4 2022-02-12 09:19:36 -05:00
ricky e314dae10d Logging & exception handler for updating invoices 2022-02-12 09:12:11 -05:00
ricky b1192a1912 Use host name from settings for auth & added exception handing in QboInvoice 2022-02-06 16:37:00 -05:00
ricky 7cc8a946fd Inital update for redmine 4.0+ compatibility 2022-02-01 20:53:20 -05:00
ricky 4b34852c72 Don't include open issues in closed issue list 2020-03-30 20:56:38 -04:00
ricky 5d7fc9dabd Don't include open issues in closed issue list 2020-03-28 20:39:04 -04:00
ricky db61952e67 added notes to regaurding customer autocomplete field 2020-03-28 20:19:58 -04:00
ricky 016dca242c Added comments to clearify methods 2020-03-28 20:16:54 -04:00
ricky 983811af97 Added comments to clearify methods 2020-03-28 20:08:44 -04:00
ricky d18a9726ac Added onchange event to customer_id 2020-03-28 19:56:42 -04:00
ricky cdef838d3e comment out missing method call 2020-03-26 20:31:00 -04:00
ricky 7703d724e1 Update issues_save_hook_listener.rb
titleize all subjects
2020-03-26 20:22:07 -04:00
ricky 94b5efbd00 forgot a comma 2020-03-26 12:53:59 -04:00
ricky f43020b864 Update issues_form_hook_listener.rb
Added onchange listener to customer form field
2020-03-26 12:50:32 -04:00
ricky 0d0f808305 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2020-01-24 13:55:15 -05:00
ricky 279e8b15e0 Added open/closed issue lists for customer/vehicles 2020-01-24 13:54:26 -05:00
ricky 099f729303 Update README.md 2020-01-06 08:52:36 -05:00
ricky 5150a31cdb Removed unused gems 2020-01-05 12:33:52 -05:00
ricky b5d17dc862 Removed oauth1 database columns & updated settings 2020-01-05 12:21:36 -05:00
ricky e6c5feb3f3 Remove uneeded columns from qbos table 2020-01-05 12:03:19 -05:00
ricky 5573e941c6 Cleaning up uneeded code 2020-01-05 11:58:27 -05:00
ricky 29dbca20e0 Update copyright 2020-01-05 11:44:02 -05:00
ricky d6c114d52b Version 0.8.1 2020-01-05 09:20:23 -05:00
ricky 87b8daf283 Fixed expired token check 2020-01-05 09:17:50 -05:00
ricky 719abe20a6 Update qbo.rb 2020-01-05 01:22:27 -05:00
ricky 4a5b83265d Update qbo.rb 2020-01-05 01:20:23 -05:00
ricky 8d103d3fc6 Update qbo.rb 2020-01-05 01:12:48 -05:00
ricky 9310f207a3 Update qbo.rb 2020-01-05 01:08:42 -05:00
ricky 000b67b329 Added employee 2020-01-05 00:08:00 -05:00
ricky ebee9395ba Update qbo_employee.rb 2020-01-05 00:06:45 -05:00
ricky 2cd6731f0c Update qbo_employee.rb 2020-01-05 00:05:25 -05:00
ricky ebdbd25082 Update qbo.rb 2020-01-04 23:45:00 -05:00
ricky 18ada91fcd Update qbo.rb 2020-01-04 23:38:46 -05:00
ricky 1cf3926585 Update qbo.rb 2020-01-04 23:33:33 -05:00
ricky e776deeece Update qbo.rb 2020-01-04 23:07:53 -05:00
ricky 8c2f30949a Update qbo.rb 2020-01-04 23:04:09 -05:00
ricky 015a989f72 Update qbo.rb 2020-01-04 22:57:53 -05:00
ricky 0d4d5a6136 Update qbo.rb 2020-01-04 22:52:01 -05:00
ricky 0364989fe1 Update qbo_controller.rb 2020-01-04 22:46:20 -05:00
ricky fb47eaba0e Update qbo.rb 2020-01-04 22:45:31 -05:00
ricky 725d511be5 Update qbo.rb 2020-01-04 22:30:43 -05:00
ricky fd85f296de Update 030_update_qbos_token.rb 2020-01-04 22:16:07 -05:00
ricky 9549bb8fe2 Update qbo.rb 2020-01-04 20:24:29 -05:00
ricky 6a1c8b0551 Update README.md 2020-01-04 16:09:03 -05:00
ricky 086632e804 Version 0.8.0 (OAuth 2.0) 2020-01-04 16:01:16 -05:00
ricky d37ff922fc Update customer.rb 2020-01-04 15:51:04 -05:00
ricky 3483efa100 Oauth2 Upgrade 2020-01-04 15:41:15 -05:00
ricky f65eea2820 Oauth2 Upgrade 2020-01-04 15:37:17 -05:00
ricky a4111e0a11 oAuth2 Upgrade 2020-01-04 15:36:36 -05:00
ricky ebe5373d82 Oauth2 Upgrade 2020-01-04 15:34:57 -05:00
ricky 5b8c7d42c5 Oauth2 Upgrade 2020-01-04 15:34:04 -05:00
ricky b8fc57d583 Oauth2 Upgrade 2020-01-04 15:31:19 -05:00
ricky 7c42197cb1 Oauth2 Upgrade 2020-01-04 15:30:03 -05:00
ricky cc0ffce892 Oauth2 Upgrade 2020-01-04 15:29:18 -05:00
ricky 0fd2abbec3 Oauth2 Upgrade 2020-01-04 15:28:43 -05:00
ricky 215b219a6d Oauth2 Upgrade 2020-01-04 15:28:04 -05:00
ricky ea71542d81 Oauth2 Upgrade 2020-01-04 15:26:35 -05:00
ricky 5dbf486b50 Update qbo_controller.rb 2020-01-04 15:21:14 -05:00
ricky b734125d6b Update qbo_controller.rb 2020-01-04 15:19:31 -05:00
ricky 06e6295c6e Update qbo.rb 2020-01-04 14:32:32 -05:00
ricky fd383ad9d4 Update qbo.rb 2020-01-04 14:29:23 -05:00
ricky 4eb6c533f1 Update qbo.rb 2020-01-04 14:21:07 -05:00
ricky 5af7d73768 Update qbo_controller.rb 2020-01-04 14:18:42 -05:00
ricky 1d0ae34261 Update qbo.rb 2020-01-04 14:13:29 -05:00
ricky 21656b3e14 Update qbo.rb 2020-01-04 14:09:37 -05:00
ricky 131976cd71 Update issue_patch.rb 2020-01-04 14:08:48 -05:00
ricky 88c1b9c9a2 Update issue_patch.rb 2020-01-04 14:06:42 -05:00
ricky 5ea9aed3cb Update qbo.rb 2020-01-04 14:05:00 -05:00
ricky 41e10d9b0e Update qbo.rb 2020-01-04 13:59:09 -05:00
ricky 45859bef3e Update qbo.rb 2020-01-04 13:56:38 -05:00
ricky f5c40738dc Update issue_patch.rb 2020-01-04 13:54:29 -05:00
ricky bfa37ee634 Update issue_patch.rb 2020-01-04 13:51:31 -05:00
ricky 787b55f3d7 Update qbo.rb 2020-01-04 13:46:13 -05:00
ricky 61f882e98c Update qbo.rb 2020-01-04 13:45:00 -05:00
ricky 37db0d3d72 Update qbo.rb 2020-01-04 13:31:40 -05:00
ricky 4f2dec3069 Update qbo.rb 2020-01-04 13:29:36 -05:00
ricky 35a7c3cfeb Create 030_update_qbos_token.rb 2020-01-04 13:28:22 -05:00
ricky cbbaf5a95c Update qbo.rb 2020-01-04 13:22:27 -05:00
ricky 647923e5e6 Update 029_update_qbos_types.rb 2020-01-04 13:19:21 -05:00
ricky 70ca4e9964 Create 029_update_qbos_types.rb 2020-01-04 13:17:15 -05:00
ricky 7fb40ad4a8 Update qbo_controller.rb 2020-01-04 13:09:09 -05:00
ricky 36083d23a0 Update qbo_controller.rb 2020-01-04 13:07:36 -05:00
ricky 2ec57f2bbf Update qbo_controller.rb 2020-01-04 13:06:23 -05:00
ricky 278708e566 Update qbo_controller.rb 2020-01-04 12:47:30 -05:00
ricky 23f2b92e8d Update qbo_controller.rb 2020-01-04 12:45:16 -05:00
ricky 5d92eeddfb Update qbo_controller.rb 2020-01-04 12:44:05 -05:00
ricky 384a8c033c Update qbo_controller.rb 2020-01-04 12:39:23 -05:00
ricky 32b12b60f9 Update qbo_controller.rb 2020-01-04 12:33:54 -05:00
ricky 93db447239 Update qbo_controller.rb 2020-01-04 12:29:54 -05:00
ricky 19a6180e15 Update qbo.rb 2020-01-04 12:26:04 -05:00
ricky 3408ee173c Update qbo.rb 2020-01-04 12:25:12 -05:00
ricky b817e842dd Update qbo.rb 2020-01-04 12:23:59 -05:00
ricky 51c3b8338e Update qbo.rb 2020-01-04 12:23:05 -05:00
ricky c6a3edfbc1 Update qbo_controller.rb 2020-01-04 12:21:45 -05:00
ricky 21d8d90465 Update qbo.rb 2020-01-04 12:21:24 -05:00
ricky 04c0fa57c6 Update qbo_controller.rb 2020-01-04 12:17:26 -05:00
ricky f5ad761712 Update qbo_controller.rb 2020-01-04 12:14:54 -05:00
ricky 9b80485915 Update qbo.rb 2020-01-04 12:14:05 -05:00
ricky 87de865c00 oauth2 2020-01-04 11:51:25 -05:00
ricky 1ea27e8511 Only show error flash if errors are not empty 2019-11-12 12:50:44 -05:00
ricky 8f0ca00b09 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:45:20 -05:00
ricky 859a1d505b always show errors 2019-11-12 12:45:14 -05:00
ricky cd109653a2 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:37:12 -05:00
ricky cab723bbcd Removed styles & removed after find call 2019-11-12 12:36:25 -05:00
ricky 3dd712629b added local vin validation 2019-11-12 12:35:54 -05:00
ricky cdf2603e12 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:16:30 -05:00
ricky 5df9d324bc Update vehicle.rb 2019-11-12 12:15:59 -05:00
ricky f78c0338b4 Made decode_vin not private 2019-11-12 12:08:04 -05:00
ricky fe6aa7908f Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 11:51:54 -05:00
ricky aa45338e36 Update vehicle.rb 2019-11-11 10:10:23 -05:00
ricky 213dca2621 Fixed redicect to :home 2019-07-08 11:30:53 -04:00
ricky fee710d717 Rediect to vehicle if vin is already taken 2019-06-26 11:39:07 -04:00
ricky 65eac58f6c Update customer.rb 2019-06-25 12:48:35 -04:00
ricky b4f5112fc3 Create 028_add_customers_mobile_phone_number.rb 2019-06-25 12:46:03 -04:00
ricky fa5dcbf9a9 Fixed redirect to for new vehicles 2019-06-25 12:37:49 -04:00
ricky e0aebb1c23 Update customer.rb 2019-06-25 11:59:08 -04:00
ricky 6d176acc2b Update customer.rb 2019-06-25 11:54:26 -04:00
ricky 9e9b29fef9 Update 027_add_customers_phone_number.rb 2019-06-25 11:53:40 -04:00
ricky 1af846537d Update customer.rb 2019-06-25 11:50:14 -04:00
ricky d6c5daff49 Added phone number 2019-06-25 11:15:57 -04:00
ricky 61c76ad80a Create 027_add_customers_phone_number.rb 2019-06-25 10:59:34 -04:00
ricky 0d514790fd Moved issue.status.is_closed? check back into issue save hook 2019-03-26 12:15:03 -04:00
ricky 748d431d35 Removed controller_issues_edit_before_save hook 2019-03-26 12:11:54 -04:00
ricky 87b8d99c41 Working on issue.bill_time 2019-03-26 12:09:38 -04:00
ricky a0da53b6cf Fixed formatting & removed search from heading 2018-10-15 21:10:41 -04:00
ricky 02d630c631 Fixed Invoice Link to be HTML safe 2018-10-15 21:07:36 -04:00
ricky 15b214c800 Moved html into partial view 2018-10-15 20:57:03 -04:00
ricky 1b5e185087 Added nil check 2018-10-15 19:42:41 -04:00
ricky 102309600e Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2018-10-15 19:36:09 -04:00
ricky 6acc7db91b Changed Customer search to shown on all pages 2018-10-15 19:34:51 -04:00
ricky 02898883a8 Update line_item.rb 2018-10-14 23:35:13 -04:00
ricky ce02b70bc3 Update line_items_controler.rb 2018-10-14 23:34:17 -04:00
ricky d4d4a555f8 Forgot to add sidebar files 2018-10-14 23:32:07 -04:00
ricky c2663cd0a0 License update 2018-10-14 23:31:17 -04:00
ricky d48609361f Added customer search to sidebar 2018-10-14 23:27:19 -04:00
ricky 70995f6e55 Fixed formating 2018-10-04 20:59:46 -04:00
ricky 05a0472939 Changed redirect to :back 2018-10-04 20:57:24 -04:00
ricky cff9f3fde3 Fixed new vehicle add missing customer 2018-09-22 00:29:54 -04:00
ricky e24b704571 Added qbo partial views 2018-09-19 22:57:45 -04:00
ricky 4d99f54c79 Added autocomplete to vehicle customer field 2018-09-19 22:33:36 -04:00
ricky e65725c334 Update init.rb 2018-09-19 10:15:13 -04:00
ricky 4829daab7c Update new.html.erb 2018-09-19 10:10:54 -04:00
ricky 260e9f3e4a Update _list.html.erb 2018-09-19 10:07:52 -04:00
ricky e3ce2445b8 Update index.html.erb 2018-09-19 10:05:45 -04:00
ricky 2b333667ed Update init.rb 2018-09-19 09:52:58 -04:00
ricky 1077cf214c Update show.html.erb 2018-09-19 09:51:27 -04:00
ricky f27fdf5274 Update index.html.erb 2018-09-19 09:50:58 -04:00
ricky 1dbcca4ca0 Create _search.html.erb 2018-09-19 09:49:51 -04:00
ricky 558e2359f7 Added partial customers/search & fixed formatting 2018-09-19 09:45:36 -04:00
ricky f99ef648b3 Rename _search.erb to _search.html.erb 2018-09-19 09:24:05 -04:00
ricky 5e4e3329c8 Create _search.erb 2018-09-19 09:23:37 -04:00
ricky b0a66aba0a Fixed custom field redering 2018-07-31 15:22:46 -04:00
ricky f2dd500536 Merge branch 'line_items' of github.com:rickbarrette/redmine_qbo into line_items 2018-03-31 08:04:17 -04:00
ricky 7412ac4f91 Added boolean billed 2018-03-31 08:03:26 -04:00
ricky 2acb3efe5a Create line_items_controler.rb 2018-03-31 08:00:56 -04:00
ricky 2cc0d06bc5 Merge branch 'master' into line_items 2018-03-29 22:42:54 -04:00
ricky 4070cb7c49 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2018-03-29 22:42:03 -04:00
ricky fcd196355a Create line_item.rb 2018-03-29 10:17:01 -04:00
ricky ea502d5b7b Create 026_create_line_items.rb 2018-03-29 10:05:37 -04:00
ricky 1f33009f89 Update LICENSE 2018-03-28 15:24:44 -04:00
ricky 3509ae9725 Removed squish_vin and added last 8 of vin to vehicle name 2018-03-27 09:40:01 -04:00
ricky 49858c45c9 do a full search by setting the full parameter to true. 2018-03-27 09:38:44 -04:00
ricky b78cd44cc9 don't bill time if not assigned to anyone EE 2018-03-05 08:58:33 -05:00
ricky 39fcd6d4dd Removed Drive & Doors 2018-03-03 13:55:22 -05:00
ricky 8838d36793 Fixed vin decoding 2018-03-03 13:54:19 -05:00
ricky 63fa94e6f2 Merge branch 'master' into nhtsa_vin 2018-03-03 13:14:05 -05:00
ricky 17183f9643 Update vehicle.rb 2018-03-03 13:11:58 -05:00
ricky 667d0bfa97 Remove Edmunds API & Added NhtsaVin 2018-03-03 12:38:56 -05:00
ricky 88a6be0d27 Remove Edmunds API Key Setting 2018-03-03 12:26:25 -05:00
ricky c3eaddff97 Start work to switch from edmunds_vin to nhtsa_vin 2018-03-03 12:22:44 -05:00
ricky f03adad463 Update issues_form_hook_listener.rb 2017-11-19 22:17:25 -05:00
ricky bd03e3ac32 Did things 2017-11-19 22:14:40 -05:00
ricky 299a28a0d2 Create controller_issues_listener.rb 2017-11-19 22:01:20 -05:00
ricky cee8ddced1 Added safe_attributes for ProjecT 2017-11-17 20:54:14 -05:00
ricky 738cd21b1f Update issues_form_hook_listener.rb 2017-11-17 10:56:13 -05:00
ricky b8186e4b52 More customer/project relations 2017-11-17 10:51:25 -05:00
ricky d98a8b8cc4 Fixed Project releationships and database migration 2017-11-17 10:14:05 -05:00
ricky dba6c4b131 Update vehicle.rb 2017-11-13 22:19:20 -05:00
ricky 118812f16f Update vehicle.rb 2017-11-13 22:17:03 -05:00
ricky 0b96a1412c Rename app/views/qbo/list_simple.html.erb to app/views/issues/_list_simple.html.erb 2017-11-13 22:07:12 -05:00
ricky 29de191d26 Rename app/views/issues/list_simple.html.erb to app/views/qbo/list_simple.html.erb 2017-11-13 22:06:45 -05:00
ricky f86af9ca71 Create list_simple.html.erb 2017-11-13 22:04:04 -05:00
ricky d25de7b30f Merge remote-tracking branch 'origin/dev' 2017-11-13 21:37:28 -05:00
ricky 273bd3d6be Update application.js 2017-11-13 21:01:17 -05:00
ricky ac446723f1 Update application.js 2017-11-13 20:59:45 -05:00
ricky c21bc1333f Update projects_form_hook_listener.rb 2017-11-13 20:38:33 -05:00
ricky 4e4255995e Update projects_form_hook_listener.rb 2017-11-13 20:37:59 -05:00
ricky c68b540597 Update projects_form_hook_listener.rb 2017-11-13 20:36:44 -05:00
ricky 1358871ccc Update init.rb 2017-11-13 20:31:16 -05:00
ricky 908511f299 Update init.rb 2017-11-13 20:30:28 -05:00
ricky 6260de21f9 Update query_patch.rb 2017-11-13 20:28:19 -05:00
ricky e2f276097c Update query_patch.rb 2017-11-13 20:27:36 -05:00
ricky 205bb67a6a Update query_patch.rb 2017-11-13 20:20:46 -05:00
ricky 05edafec4c Update query_patch.rb 2017-11-13 20:13:26 -05:00
ricky 4a073d3a71 Update query_patch.rb 2017-11-13 20:12:23 -05:00
ricky f2cbf31e17 Create projects_form_hook_listener.rb 2017-11-13 19:53:37 -05:00
ricky 22b22780ea Create project_patch.rb
Add relationships to projects
2017-11-13 19:47:39 -05:00
ricky 71cfa28817 Create 025_update_projects.rb
Added customer & vehicle reference to a project.
2017-11-13 19:40:14 -05:00
ricky 8b2d88f80b Create qbo_controller.rb 2017-06-14 09:43:52 -04:00
ricky eaf0a57e51 Create qbo_controller.rb 2017-06-13 21:58:42 -04:00
ricky 512f5ad7ba Create index.html.erb 2017-06-13 21:55:13 -04:00
ricky 8d2351d3f9 Create vehicle.rb 2017-06-13 21:51:36 -04:00
ricky c5a20c9e7f Create vehicle.rb 2017-06-13 21:50:50 -04:00
ricky 4a3b663333 Create vehicle.rb 2017-06-13 21:49:10 -04:00
ricky e43635b5d8 Update vehicle.rb 2017-06-13 12:31:07 -04:00
ricky 7044377f16 Update vehicle.rb 2017-06-13 12:27:22 -04:00
ricky 7ced1bf942 Create vehicle.rb 2017-06-13 12:22:48 -04:00
ricky 7ca3315ce5 Update vehicle.rb 2017-06-13 11:44:46 -04:00
ricky 2b8c4b4d4d Update vehicle.rb 2017-06-06 08:58:11 -04:00
ricky a359e8815b Update issues_form_hook_listener.rb 2017-06-06 08:53:36 -04:00
ricky 01cf82813c Update vehicle.rb 2017-06-06 08:32:21 -04:00
ricky 625e400c48 Update vehicle.rb 2017-06-06 08:27:55 -04:00
ricky 56793cee7c Update vehicle.rb 2017-06-06 08:25:35 -04:00
ricky 3ba5337812 Update vehicle.rb
Updated regex to remove invalid chars
2017-06-06 08:22:50 -04:00
ricky 129e3d4821 Update issues_form_hook_listener.rb 2017-06-06 08:12:08 -04:00
ricky 4d524a7d61 Update issues_form_hook_listener.rb 2017-06-06 08:10:28 -04:00
ricky 429fb920fb Update index.html.erb 2017-04-04 22:29:06 -04:00
ricky 77c7f0b6fe Update index.html.erb 2017-04-04 22:28:20 -04:00
ricky 1a043bea76 Added Permission Check 2017-04-04 22:26:58 -04:00
ricky e4d770c272 Update index.html.erb 2017-04-04 22:23:33 -04:00
ricky fce3931858 Added new customer button 2017-04-04 22:22:29 -04:00
ricky 43cdade6e1 Merge branch 'master' into dev 2017-04-04 09:32:50 -04:00
ricky 4374f9436c Removed .service from get_base call 2017-04-04 09:31:02 -04:00
ricky 7c63c3c816 Fixed typo 2017-04-04 08:49:08 -04:00
ricky b3f491a60b Fixed logic 2017-04-04 08:48:36 -04:00
ricky 4adcbba840 Update vehicle.rb 2017-04-04 08:47:15 -04:00
ricky baccb42455 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-04 08:46:44 -04:00
ricky d0842dd803 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-04 08:45:45 -04:00
ricky 02aabe6045 Forgot End 2017-04-04 08:45:34 -04:00
ricky 0e47f9eb5f Some Cleanup & Fixed to_s to report vin
to_s to report vin when year,make,model are nil
2017-04-04 08:44:14 -04:00
ricky f1d2d63f20 Removed un-needed initializer 2017-04-04 08:37:49 -04:00
ricky f322f9f7ab Update Copyright 2017-04-04 08:34:03 -04:00
ricky 6db8b76902 Update Copyright 2017-04-04 08:33:37 -04:00
ricky 61adce1299 0.5.0 2017-04-03 22:59:09 -04:00
ricky daffb3719e Copyright Update & Formating 2017-04-03 22:57:25 -04:00
ricky 1b8626d28f Update init.rb 2017-04-03 22:53:34 -04:00
ricky b119344fad Copyright Update 2017-04-03 22:52:37 -04:00
ricky 4381d403d4 Copyright Update 2017-04-03 22:52:14 -04:00
ricky 26bfaca1d6 Copyright Update 2017-04-03 22:52:00 -04:00
ricky 0c68d8094a Copyright Update 2017-04-03 22:51:43 -04:00
ricky 6230175ba5 Copyright Update 2017-04-03 22:51:25 -04:00
ricky 5dc4dc5637 Copyright Update 2017-04-03 22:51:03 -04:00
ricky ac15307fb8 Copyright Update 2017-04-03 22:50:50 -04:00
ricky ec5ce497d8 Copyright Update 2017-04-03 22:50:38 -04:00
ricky 01fe52157d Update issue_patch.rb 2017-04-03 22:50:19 -04:00
ricky 75737cf2fd Copyright Update 2017-04-03 22:50:05 -04:00
ricky 7824edf5aa Copyright Update 2017-04-03 22:49:52 -04:00
ricky 6b70b447a5 Copyright Update 2017-04-03 22:48:07 -04:00
ricky 5a6b679099 Copyright Update 2017-04-03 22:47:49 -04:00
ricky 72835dcf65 Copyright Update 2017-04-03 22:47:36 -04:00
ricky b9e2349983 Update qbo.rb 2017-04-03 22:47:21 -04:00
ricky ef13ec7e11 Update qbo_employee.rb 2017-04-03 22:47:10 -04:00
ricky 00b40da8c4 Copyright Update 2017-04-03 22:46:48 -04:00
ricky 2be25adf18 Copyright Update 2017-04-03 22:46:35 -04:00
ricky 5ab9a777f6 Copyright Update 2017-04-03 22:46:19 -04:00
ricky 7fbb1d6ba3 Copyright Update 2017-04-03 22:46:04 -04:00
ricky 786c80609c Copyright Update 2017-04-03 22:45:21 -04:00
ricky efb554824d Update vehicles_controller.rb 2017-04-03 22:44:40 -04:00
ricky c615abc896 Update qbo_controller.rb 2017-04-03 22:44:29 -04:00
ricky 8ecc3414da Update payments_controller.rb 2017-04-03 22:44:17 -04:00
ricky 505def8d23 Update invoice_controller.rb 2017-04-03 22:44:03 -04:00
ricky da155de514 Copyright Update 2017-04-03 22:43:42 -04:00
ricky 7d727e1ad8 Copyright Update 2017-04-03 22:43:25 -04:00
ricky 3dcb5155fc Add Blank Option 2017-04-03 22:40:07 -04:00
ricky 4424593e63 Add Blank to Select 2017-04-03 22:38:45 -04:00
ricky 8eae838ef8 Update filter_estimates_by_customer.js.erb 2017-04-03 22:34:19 -04:00
ricky d5e8b4bbc4 Update qbo_estimate.rb 2017-04-03 22:26:53 -04:00
ricky fc8efa53e9 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-03 22:25:29 -04:00
ricky 15ea3aeaa2 Update qbo_estimate.rb 2017-04-03 22:24:04 -04:00
ricky 35bf300f2d Show only estimates attached to the customer 2017-04-03 22:07:06 -04:00
ricky 72bf10680f Added ajax to update estimates 2017-04-03 21:57:56 -04:00
ricky bd8706deee Create filter_estimates_by_customer.js.erb 2017-04-03 21:55:47 -04:00
ricky e8619529d4 Added routes for filtering estimates & invoices 2017-04-03 21:52:39 -04:00
ricky fd3c8e15e6 Added filter methods for estimates & invoices 2017-04-03 21:49:57 -04:00
ricky 166c1d3002 Add files via upload 2017-04-02 17:13:21 -04:00
ricky 773d60fb23 Delete plugin_issue_view.png 2017-04-02 17:12:53 -04:00
ricky cc46902095 Update qbo_estimate.rb 2017-04-02 08:45:02 -04:00
ricky acb2628c7a Update qbo_estimate.rb 2017-04-02 08:41:36 -04:00
ricky e4914590f8 Moved Invoice Sync up in the order 2017-04-02 08:31:22 -04:00
ricky e3a8e464ae Update qbo_estimate.rb 2017-04-02 08:21:36 -04:00
ricky 8a6bb45b6a Fixed Custom Field Logic 2017-04-02 08:06:07 -04:00
ricky 3decf83a7b Update qbo_invoice.rb 2017-04-02 07:54:33 -04:00
ricky 1b7b286d1b Update qbo_invoice.rb 2017-04-02 07:31:28 -04:00
ricky a8804f6704 Increment the sync token 2017-04-02 07:28:53 -04:00
ricky 5d03e261d1 Added customer association 2017-04-02 07:19:12 -04:00
ricky 1ae766b8bd Added customer association 2017-04-02 07:13:28 -04:00
ricky 119c36569f Added association for invoices & estimates 2017-04-02 07:08:24 -04:00
ricky 3be69d5efd Update 024_update_invoices_and_estimates.rb 2017-04-02 07:00:43 -04:00
ricky b55dd99efd Merge branch 'master' into dev 2017-04-02 06:59:01 -04:00
ricky eff1f97ab2 Create 024_update_invoices_and_estimates.rb 2017-04-02 06:56:17 -04:00
ricky 06050bd139 Removed unused method update_vehicles 2017-03-31 16:23:42 -04:00
ricky a48840ddfb Fixed typo 2017-03-31 16:12:21 -04:00
ricky 9b9aabee11 Format the VIN 2017-03-31 16:11:19 -04:00
ricky 7782627286 Split the VIN 2017-03-31 16:07:09 -04:00
ricky 41a113dc59 Do not hide notes 2017-03-31 16:02:48 -04:00
ricky b84e249dfb 0.4.3 2017-03-23 06:05:43 -04:00
ricky 6b45f767a4 Merge pull request #8 from rickbarrette/permissions
Permissions
2017-03-23 06:03:06 -04:00
ricky a34b6a07fc fixed typos 2017-03-23 05:56:26 -04:00
ricky 2ce811bbbf Update auth_helper.rb 2017-03-23 05:50:31 -04:00
ricky 02153de8b0 Added before filters add_customer, view_customer 2017-03-23 05:47:37 -04:00
ricky 68be20459b Added global_check_permission 2017-03-23 05:45:45 -04:00
ricky bbd03cc337 Update init.rb 2017-03-23 05:42:54 -04:00
ricky 4fc71a93f2 Update init.rb 2017-03-23 05:42:09 -04:00
ricky 8e7e1908e4 Update customers_controller.rb 2017-03-23 05:39:55 -04:00
ricky 89fba883ef Update customers_controller.rb 2017-03-23 05:38:06 -04:00
ricky 15f317fba1 Update customers_controller.rb 2017-03-23 05:36:51 -04:00
ricky 894ee9abfd added check_permission 2017-03-23 05:33:58 -04:00
ricky ca17807117 Update payments_controller.rb 2017-03-23 05:29:54 -04:00
ricky a70ba2f164 Update payments_controller.rb 2017-03-23 05:27:38 -04:00
ricky 78ac97298c Update payments_controller.rb 2017-03-23 05:25:57 -04:00
ricky 72cd349c1b Update payments_controller.rb 2017-03-23 05:23:44 -04:00
ricky 6fc1d27dca Update auth_helper.rb 2017-03-23 05:21:56 -04:00
ricky 525c6b99d6 Update auth_helper.rb 2017-03-23 05:19:13 -04:00
ricky 3eaff0ab30 Update auth_helper.rb 2017-03-23 05:14:47 -04:00
ricky 85b40bc9cf Update payments_controller.rb 2017-03-23 05:11:15 -04:00
ricky 37a2b95447 Update payments_controller.rb 2017-03-23 05:10:05 -04:00
ricky 33feb91713 added permission_checker 2017-03-23 05:08:33 -04:00
ricky f7357f30ce Update payments_controller.rb 2017-03-23 05:03:58 -04:00
ricky c0ae01018b Update payments_controller.rb 2017-03-23 05:01:01 -04:00
ricky 4353e910c8 Update payments_controller.rb 2017-03-23 04:57:22 -04:00
ricky bef9774c4e Update payments_controller.rb 2017-03-23 04:52:19 -04:00
ricky 863437b1b7 Added before filter to check permissions 2017-03-23 04:50:17 -04:00
ricky 7cfa15910a Update init.rb 2017-03-23 04:41:31 -04:00
ricky 2154a3d001 Update init.rb 2017-03-22 23:09:05 -04:00
ricky fdab090a3d Update init.rb 2017-03-22 23:06:12 -04:00
ricky 3f32b7fef1 Update init.rb 2017-03-22 22:53:21 -04:00
ricky 14422bc549 Update init.rb 2017-03-22 22:52:24 -04:00
ricky 6bb66597e8 Added some permissions
view_customers, add_customers, view_payments, add_payments
2017-03-22 22:44:09 -04:00
ricky 32b750b545 Version 0.4.2 2017-03-22 22:38:42 -04:00
ricky 5fd3141746 Merge pull request #7 from rickbarrette/dev
Removed un-needed js files
2017-03-22 22:26:04 -04:00
ricky 2c38361234 Removed un-needed js files 2017-03-22 22:20:12 -04:00
ricky 81b7b1492d Merge pull request #6 from rickbarrette/filter_vehicles_by_customer
Filter vehicles by customer
2017-03-22 22:07:22 -04:00
ricky 57ef1ac5a1 Fixed Typo 2017-03-22 22:05:33 -04:00
ricky 6597c5a13c Update application.js 2017-03-22 22:03:25 -04:00
ricky 8af97072fb Fixed filter_vehicles_by_customer method 2017-03-22 21:55:07 -04:00
ricky 48b6df0cef Update application.js 2017-03-22 21:34:04 -04:00
ricky 853b7ad804 Rename filter_vehicles_by_customerjs.erb to filter_vehicles_by_customer.js.erb 2017-03-22 21:27:15 -04:00
ricky 6a74baff5e Update application.js 2017-03-22 18:56:44 -04:00
ricky 8b21b0ff75 Update application.js 2017-03-22 18:54:47 -04:00
ricky d22a6303cd Update application.js 2017-03-22 18:53:47 -04:00
ricky 807d6643f4 Update application.js 2017-03-22 18:52:38 -04:00
ricky c725c2774c Update application.js 2017-03-22 18:50:21 -04:00
ricky ae0abae333 Update application.js 2017-03-22 18:48:52 -04:00
ricky fed2282212 Added debug 2017-03-22 18:37:06 -04:00
ricky 545960e676 Call autocomplete instead 2017-03-22 18:28:53 -04:00
ricky 66781f0625 Update application.js 2017-03-22 13:12:29 -04:00
ricky 504b9b93e4 Removed { 2017-03-22 13:11:19 -04:00
ricky b71bba473c Provide empty list 2017-03-22 13:09:15 -04:00
ricky aef3c453c4 Do not list all vehicles without customer 2017-03-22 13:04:50 -04:00
ricky 6de3ed94dc Update and rename app/views/filter_vehicles_by_customerjs.erb to app/views/customers/filter_vehicles_by_customerjs.erb
Also changed ID to select#issue_vehicles_id
2017-03-22 12:59:36 -04:00
ricky daada08ea7 Changed select to input 2017-03-22 12:48:43 -04:00
ricky fa37c98500 Removed ID 2017-03-22 12:47:08 -04:00
ricky 0ee59704b3 Fixed Javascript includes to += 2017-03-22 12:43:25 -04:00
ricky a22cbb9520 Added Javascript include for application.js 2017-03-22 11:09:19 -04:00
ricky c0d3f64d82 Create application.js 2017-03-22 11:08:14 -04:00
ricky 66d2bf4aa4 Create filter_vehicles_by_customerjs.erb 2017-03-22 11:04:48 -04:00
ricky 2b90c953ba Added filter_vehicles_by_customer method 2017-03-22 10:29:04 -04:00
ricky 0d5e5d679e Added route for filter_vehicles_by_customer 2017-03-22 10:24:16 -04:00
ricky 4da891cc07 Merge branch 'master' of git://github.com/sempervictus/redmine_qbo into sempervictus-master 2017-02-22 11:10:46 -05:00
ricky d3475a9b53 Delete vehicles.js 2017-02-14 14:42:13 -05:00
ricky eb583f78ec Delete update_vehicles.js.coffee 2017-02-14 14:41:55 -05:00
ricky 47bebf0a1a Delete application.js 2017-02-14 14:41:34 -05:00
ricky f9bd149f21 Commented out un-needed JS 2017-02-14 14:39:58 -05:00
ricky 5371b0f193 Update application.js 2017-01-29 22:40:48 -05:00
ricky 95497e5514 Update issues_form_hook_listener.rb 2017-01-29 22:40:02 -05:00
ricky 1a74abe76c Update issues_form_hook_listener.rb 2017-01-29 22:38:30 -05:00
ricky 7f11d3cdc4 Update issues_form_hook_listener.rb 2017-01-29 22:36:32 -05:00
ricky da01d79325 Update customers_controller.rb 2017-01-29 22:29:15 -05:00
ricky 82807cfede Update customers_controller.rb 2017-01-29 22:26:53 -05:00
ricky a268d10819 Update customers_controller.rb 2017-01-29 22:25:27 -05:00
ricky ba4bdd9ecb Update routes.rb 2017-01-29 22:19:12 -05:00
ricky 0a72e05e03 Update issues_form_hook_listener.rb 2017-01-29 22:05:29 -05:00
ricky 8d143ff06d Update customers_controller.rb 2017-01-29 22:00:19 -05:00
ricky 3ddb585a58 Update customers_controller.rb 2017-01-29 21:58:49 -05:00
ricky 1606ceb743 Update issues_form_hook_listener.rb 2017-01-29 21:49:57 -05:00
ricky 97578f8380 Update issues_form_hook_listener.rb 2017-01-29 21:47:09 -05:00
ricky 32beae70ef Update issues_form_hook_listener.rb 2017-01-29 21:45:13 -05:00
ricky 13fbc9e14f Update issues_form_hook_listener.rb 2017-01-29 21:44:00 -05:00
ricky c57a45c85e Update issues_form_hook_listener.rb 2017-01-29 21:43:25 -05:00
ricky 3711a9ca43 Update issues_form_hook_listener.rb 2017-01-29 21:38:18 -05:00
ricky d0c1693f38 Create autocomplete-rails.js 2017-01-29 21:37:27 -05:00
ricky 36534ee129 Update issues_form_hook_listener.rb 2017-01-29 21:34:28 -05:00
ricky 188c460054 Update issues_form_hook_listener.rb 2017-01-29 21:15:29 -05:00
ricky d9e3cb096b Update application.js 2017-01-29 21:10:41 -05:00
ricky b57b19493f Add files via upload 2017-01-29 21:08:29 -05:00
ricky 8c569db541 Update issues_form_hook_listener.rb 2017-01-29 20:56:30 -05:00
ricky 997257f42d Update issues_form_hook_listener.rb 2017-01-29 20:54:52 -05:00
ricky f9f1af17bc Update issues_form_hook_listener.rb 2017-01-29 20:53:09 -05:00
ricky f1f44d0048 Update issues_form_hook_listener.rb 2017-01-29 20:46:39 -05:00
ricky 7e8511090d Update issues_form_hook_listener.rb 2017-01-29 20:42:18 -05:00
ricky 4ca6a3138b Update issues_form_hook_listener.rb 2017-01-29 20:41:38 -05:00
ricky 21e1132e0e Update issues_form_hook_listener.rb 2017-01-29 20:36:19 -05:00
ricky dc15424014 Update issues_form_hook_listener.rb 2017-01-29 20:30:34 -05:00
ricky f90cdcd86b Update customers_controller.rb 2017-01-29 20:28:17 -05:00
ricky 5e53c18098 Update issues_form_hook_listener.rb 2017-01-29 20:24:06 -05:00
ricky 52d13ea7bc Update customers_controller.rb 2017-01-29 20:18:21 -05:00
ricky 5e24c5084e Update customers_controller.rb 2017-01-29 20:12:38 -05:00
ricky abdb61cc41 Update Gemfile 2017-01-29 20:07:08 -05:00
ricky 03556cc670 Update Gemfile 2017-01-29 20:03:53 -05:00
ricky 7f6cd99aba Update Gemfile 2017-01-29 19:58:11 -05:00
ricky ba513fb950 Update issues_form_hook_listener.rb 2017-01-29 19:47:24 -05:00
ricky 837ddd722c Update issues_form_hook_listener.rb 2017-01-29 19:46:21 -05:00
ricky f2b0cd3748 Update issues_form_hook_listener.rb 2017-01-29 19:45:31 -05:00
ricky f2a8878af4 Update issues_form_hook_listener.rb 2017-01-29 19:40:51 -05:00
ricky 13fccec54b Update routes.rb 2017-01-29 19:36:58 -05:00
ricky eca2b986a9 Update customers_controller.rb 2017-01-29 19:35:45 -05:00
ricky a06599b7f9 Update issues_form_hook_listener.rb 2017-01-29 19:34:31 -05:00
ricky 7fda4dc577 Create application.js 2017-01-29 19:32:59 -05:00
ricky 9e47152e12 Update Gemfile 2017-01-29 19:31:31 -05:00
ricky 83d21da41a Update issues_form_hook_listener.rb 2017-01-29 19:27:23 -05:00
ricky a692f03bfa Update init.rb 2017-01-29 19:17:37 -05:00
ricky 994cdf908f Update init.rb 2017-01-29 19:16:55 -05:00
ricky b022d17fc0 Update init.rb 2017-01-29 19:16:05 -05:00
ricky 644899c0b5 Update email_worker.rb 2017-01-29 19:15:14 -05:00
ricky be3a3b920d Update email_worker.rb 2017-01-27 12:04:58 -05:00
ricky d546eb026f Update email_worker.rb 2017-01-27 12:01:53 -05:00
ricky fdc59feb13 Create email_worker.rb 2017-01-27 11:47:30 -05:00
ricky 186b726a7b Added nil check 2017-01-27 09:38:00 -05:00
RageLtMan fa362bad55 Merge pull request #3 from sempervictus/bug-dont_call_string_method_on_nil_token
Do not permit OAUTH_CONSUMER_SECRET to be nil
2017-01-19 04:09:34 -05:00
RageLtMan fcf55bb504 Do not permit OAUTH_CONSUMER_SECRET to be nil
When QBO plugin is not configured, OAUTH_CONSUMER_SECRET can be
nil, and any codepath hitting the model raises a stack trace.

Set a "safe-ish" value here to allow execution in conditions where
QBO plugin is installed, but not yet configured.
2017-01-19 04:02:59 -05:00
RageLtMan 2185667665 Merge pull request #2 from sempervictus/local
Merge initial changes 20170103
2017-01-03 04:34:58 -05:00
RageLtMan 772483817e Prevent billing if issue has no customer assigned 2017-01-03 04:32:04 -05:00
RageLtMan 178ddd32c7 Remove will_paginate version constraint 2017-01-02 05:01:41 -05:00
ricky 08e047c90e Added done_ratio to partial billing 2016-10-12 10:31:05 -04:00
ricky b3c3314385 Remove Breaks 2016-09-26 16:41:41 -04:00
ricky 9fd5e01bb4 Update qbo_invoice.rb 2016-09-26 16:39:12 -04:00
ricky cd62f65fcd Update qbo_invoice.rb 2016-09-26 16:34:56 -04:00
ricky fb40833abd Update qbo_invoice.rb 2016-09-26 16:33:56 -04:00
ricky 6aae155933 Update qbo_invoice.rb 2016-09-21 19:51:22 -04:00
ricky f9e0ae8fef Update qbo_invoice.rb 2016-09-21 19:48:26 -04:00
ricky 489e335ca4 Update qbo_invoice.rb 2016-09-21 19:46:55 -04:00
ricky 874d0b4db9 Update qbo_invoice.rb 2016-09-21 19:43:40 -04:00
ricky 49e8f70b46 Update qbo_invoice.rb 2016-09-21 16:17:07 -04:00
ricky 77ea20171e Don't tie invoice to issue if customer is diffrent 2016-09-21 16:15:43 -04:00
ricky 11d4034c37 Update query_patch.rb 2016-09-19 23:19:53 -04:00
ricky 64369470de Update auth_helper.rb 2016-09-19 23:01:58 -04:00
ricky 7b483f3290 Update invoice_controller.rb 2016-09-19 23:01:27 -04:00
ricky 32bec79c28 Update invoice_controller.rb 2016-09-19 22:59:44 -04:00
ricky dfd9622ab7 Update invoice_controller.rb 2016-09-19 22:59:02 -04:00
ricky 334d3c930b Update auth_helper.rb 2016-09-19 22:57:19 -04:00
ricky 8cf2f370bf Update invoice_controller.rb 2016-09-19 22:54:58 -04:00
ricky 3965bed6c4 Update invoice_controller.rb 2016-09-19 22:50:18 -04:00
ricky 52396eb384 Update invoice_controller.rb 2016-09-19 22:49:06 -04:00
ricky 9cfab7bea1 Update invoice_controller.rb 2016-09-19 22:44:52 -04:00
ricky c8ef3bbd4e Update invoice_controller.rb 2016-09-19 22:38:48 -04:00
ricky 39e7d3c062 Update invoice_controller.rb 2016-09-19 22:37:53 -04:00
ricky 6fa96e11df Update invoice_controller.rb 2016-09-19 22:35:51 -04:00
ricky ecde64193a Update invoice_controller.rb 2016-09-19 22:32:30 -04:00
ricky f701af9a4d Update auth_helper.rb 2016-09-19 22:30:14 -04:00
ricky 6d99702a11 Update customers_controller.rb 2016-09-19 22:27:03 -04:00
ricky 138f8f2c2f Update auth_helper.rb 2016-09-19 22:21:37 -04:00
ricky 61ddf7378d Update auth_helper.rb 2016-09-19 22:18:19 -04:00
ricky f5b72f30be Update customers_controller.rb 2016-09-19 22:17:15 -04:00
ricky 1863b33955 Update view.html.erb 2016-09-19 22:05:48 -04:00
ricky a4573fce1c Update issue_patch.rb 2016-09-19 22:01:32 -04:00
ricky 0461801ee0 Update issues_form_hook_listener.rb 2016-09-19 21:29:28 -04:00
ricky 4c2eaac013 Update routes.rb 2016-09-19 21:26:40 -04:00
ricky 7ca56ccd2e Update routes.rb 2016-09-19 20:27:26 -04:00
ricky 915a59afa4 Update issues_form_hook_listener.rb 2016-09-19 20:17:00 -04:00
ricky ac61950d48 Update routes.rb 2016-09-19 20:13:57 -04:00
ricky b257fef563 Update customers_controller.rb 2016-09-19 20:10:11 -04:00
ricky 504c27c197 Update qbo_invoice.rb 2016-09-19 11:10:26 -04:00
ricky a7a5e2c731 Update qbo_invoice.rb 2016-09-19 11:07:33 -04:00
ricky 21d72dcc33 Update qbo_invoice.rb 2016-09-19 11:06:35 -04:00
ricky da7ba40e61 Added Private Note Scanning
Also removed redundant checks
2016-09-19 10:59:20 -04:00
ricky b4d6fc55ea Update customers_controller.rb 2016-09-19 07:57:49 -04:00
ricky 515b8feff7 Update attachments_controller_patch.rb 2016-09-19 07:44:03 -04:00
ricky 8bc05db033 Update init.rb 2016-09-19 07:30:07 -04:00
ricky 34cd6b08dc Create attachments_controller_patch.rb 2016-09-19 07:29:16 -04:00
ricky 41195dc095 Update show.html.erb 2016-09-18 22:55:12 -04:00
ricky 33a83c8f76 Update _details.html.erb 2016-09-18 22:53:54 -04:00
ricky 4f613d3fe1 Update show.html.erb 2016-09-18 22:52:48 -04:00
ricky 1c7cdec600 Update show.html.erb 2016-09-18 22:41:24 -04:00
ricky 7ae60c0e62 Update show.html.erb 2016-09-18 22:38:26 -04:00
ricky 5dd04925e0 Update show.html.erb 2016-09-18 22:37:23 -04:00
ricky 92eedbd4d3 Update show.html.erb 2016-09-18 22:32:45 -04:00
ricky 5545d72adf Update view.html.erb 2016-09-16 23:11:59 -04:00
ricky 226d44cd28 Update customers_controller.rb 2016-09-16 23:10:21 -04:00
ricky b7152d6124 Update view.html.erb 2016-09-16 23:07:05 -04:00
ricky f3e9b58c87 Update customers_controller.rb 2016-09-16 23:06:20 -04:00
ricky 5209315236 Update view.html.erb 2016-09-16 23:05:23 -04:00
ricky f38a9e1ff0 Update view.html.erb 2016-09-16 23:04:47 -04:00
ricky 80fb296e24 Update customers_controller.rb 2016-09-16 23:03:07 -04:00
ricky 9dda339a32 Version Bump 0.4.1
* Various Bug Fixes
* Added a share button that creates a public view-able link for an issue that lasts 24 Hours
2016-09-15 07:32:38 -04:00
ricky 1098accc8a Bug Fix #2 2016-09-15 07:06:52 -04:00
ricky 12826cf436 Bug Fix #2 2016-09-15 07:05:19 -04:00
ricky f9f77fdcb1 Bug Fix #2 2016-09-15 07:04:50 -04:00
ricky 0bc935d3dd Bug Fix #2 2016-09-15 07:03:54 -04:00
ricky fc40e4a6fe Update README.md 2016-09-14 17:04:33 -04:00
ricky 99b658a03d Update qbo_invoice.rb 2016-09-14 16:49:54 -04:00
ricky dacde1e050 Update qbo_invoice.rb 2016-09-14 14:34:50 -04:00
ricky 365219eddb Update issues_form_hook_listener.rb 2016-09-14 09:31:22 -04:00
ricky bc4dbbadbb Update issues_form_hook_listener.rb 2016-09-14 09:30:07 -04:00
ricky c06d2300f2 Update vehicles.js 2016-09-14 09:25:05 -04:00
ricky 5e34587a53 Update issues_form_hook_listener.rb 2016-09-14 09:24:04 -04:00
ricky eb39b297f9 Update and rename vehicles.js.coffee to vehicles.js 2016-09-14 09:23:38 -04:00
ricky 798a7c9933 Update issues_form_hook_listener.rb 2016-09-14 09:00:23 -04:00
ricky 9dee336e76 Rename update_vehicles.coffee.js to update_vehicles.js.coffee 2016-09-14 08:59:22 -04:00
ricky 9ba43d63b9 Rename vehicles.coffee.js to vehicles.js.coffee 2016-09-14 08:59:05 -04:00
ricky 8126671df9 Update vehicles.coffee.js 2016-09-14 08:54:29 -04:00
ricky 3f0ccd79f3 Update vehicles.coffee.js 2016-09-14 08:47:56 -04:00
ricky e61023acd5 Update issues_form_hook_listener.rb 2016-09-14 08:43:05 -04:00
ricky 35c2e7a951 Update issues_form_hook_listener.rb 2016-09-14 08:42:11 -04:00
ricky 81e8a9594f Update issues_form_hook_listener.rb 2016-09-14 08:40:10 -04:00
ricky 63415f8e58 Delete autocomplete.js 2016-09-14 08:37:15 -04:00
ricky ed9b1ea7b9 Update issues_form_hook_listener.rb 2016-09-14 08:36:54 -04:00
ricky 6026f9cdfc Update issues_form_hook_listener.rb 2016-09-14 08:31:30 -04:00
ricky 1924156a8c Rename vehicles.js.coffee to vehicles.coffee.js 2016-09-14 08:30:19 -04:00
ricky 3927b2b007 Rename update_vehicles.js.coffee to update_vehicles.coffee.js 2016-09-14 08:29:54 -04:00
ricky 7a2e984df7 Update issues_form_hook_listener.rb 2016-09-14 00:31:06 -04:00
ricky 2c9559104a Update issues_form_hook_listener.rb 2016-09-14 00:10:40 -04:00
ricky 07e342845a Update Gemfile 2016-09-14 00:04:46 -04:00
ricky dbab5bfbca Update issues_form_hook_listener.rb 2016-09-13 23:58:32 -04:00
ricky cc70c95115 Create update_vehicles.js.coffee 2016-09-13 23:57:12 -04:00
ricky 03bcff2b9a Create vehicles.js.coffee 2016-09-13 23:55:54 -04:00
ricky 9c4ed3d9e1 Update vehicles_controller.rb 2016-09-13 23:43:06 -04:00
ricky 8156657eb2 Update issues_show_hook_listener.rb 2016-09-13 23:37:27 -04:00
ricky c2ffedc8de Update issues_show_hook_listener.rb 2016-09-13 23:33:48 -04:00
ricky 3600c3e80a Update issues_show_hook_listener.rb 2016-09-13 23:32:45 -04:00
ricky 2970bd092c Update issues_show_hook_listener.rb 2016-09-13 23:28:36 -04:00
ricky a2cac188bb Update issues_show_hook_listener.rb 2016-09-13 23:26:37 -04:00
ricky e542f098a8 Update issues_show_hook_listener.rb 2016-09-13 23:24:34 -04:00
ricky 04a1670ac2 Update qbo_invoice.rb 2016-09-13 23:17:51 -04:00
ricky c189bc5dca Update qbo_invoice.rb 2016-09-13 23:14:18 -04:00
ricky 4b7cf407e8 Update qbo_invoice.rb 2016-09-13 22:57:45 -04:00
ricky 332deed21e Update qbo_invoice.rb 2016-09-13 22:56:36 -04:00
ricky 41313029cd Update qbo_invoice.rb 2016-09-13 22:54:52 -04:00
ricky bbc3b138cf Update qbo_invoice.rb 2016-09-13 22:48:11 -04:00
ricky e4d5770bdc Update qbo_invoice.rb 2016-09-13 22:44:12 -04:00
ricky 53a0a47dd6 Update qbo_invoice.rb 2016-09-13 22:41:51 -04:00
ricky 48edc85e2c Update qbo_invoice.rb 2016-09-13 22:39:25 -04:00
ricky c685aaa245 Update qbo_invoice.rb 2016-09-13 22:30:52 -04:00
ricky 2a79389b18 Update qbo_invoice.rb 2016-09-13 22:23:36 -04:00
ricky c3e4d0dbc2 Update invoice_controller.rb 2016-09-06 23:33:39 -04:00
ricky 89123fed31 Update header_footer_hook_listener.rb 2016-09-06 23:05:24 -04:00
ricky 571811ace6 Update header_footer_hook_listener.rb 2016-09-06 23:01:26 -04:00
ricky cb24967713 Update qbo_invoice.rb 2016-09-06 19:09:59 -04:00
ricky 449a59188c Update qbo_invoice.rb 2016-09-06 19:02:32 -04:00
ricky 907448ce3e Update qbo_invoice.rb 2016-09-06 19:01:27 -04:00
ricky 4f08af3987 Update _form.html.erb 2016-09-06 11:00:07 -05:00
ricky 00285e1f24 Update vehicle.rb 2016-09-06 10:56:30 -05:00
ricky 5b56d7a878 Update customers_controller.rb 2016-09-05 20:40:32 -04:00
ricky 5c0d1def9f Update customers_controller.rb 2016-09-05 20:35:10 -04:00
ricky fc3e252fff Update customers_controller.rb 2016-09-05 20:33:27 -04:00
ricky d605f617e4 Update issues_show_hook_listener.rb 2016-09-05 19:58:40 -04:00
ricky eb390e09d8 Update issues_show_hook_listener.rb 2016-09-05 19:57:17 -04:00
ricky bde29ef9d0 Update issue_patch.rb 2016-09-05 19:54:13 -04:00
ricky 5ffc9ed01c Update issue_patch.rb 2016-09-05 19:53:06 -04:00
ricky c992370962 Update issues_show_hook_listener.rb 2016-09-05 19:49:17 -04:00
ricky b3acf9f29d Update customers_controller.rb 2016-09-05 19:27:03 -04:00
ricky dca3735ce1 Update customers_controller.rb 2016-09-05 19:25:32 -04:00
ricky c7a5c1147f Update customers_controller.rb 2016-09-03 23:50:24 -04:00
ricky 8940e72091 Update customers_controller.rb 2016-09-03 23:48:54 -04:00
ricky 1ed7c6fe63 Update customers_controller.rb 2016-09-03 23:47:05 -04:00
ricky a197dcdefc Update README.md 2016-09-03 23:31:11 -04:00
ricky e00f73a48d Update en.yml 2016-09-03 09:53:26 -04:00
ricky 1c977a6687 Update query_patch.rb 2016-09-03 09:37:27 -04:00
ricky b3e93bb465 Update time_entry_query_patch.rb 2016-09-03 09:35:23 -04:00
ricky 628c798238 Update init.rb 2016-09-03 09:34:17 -04:00
ricky b34bd9dd7c Update en.yml 2016-09-03 09:32:09 -04:00
ricky 4d40093fe9 Update time_entry_query_patch.rb 2016-09-03 09:31:38 -04:00
ricky e573da2c11 Update init.rb 2016-09-03 09:30:52 -04:00
ricky f47316efbe Create time_entry_query_patch.rb 2016-09-03 09:28:51 -04:00
ricky f57c3c3df0 Update issue_patch.rb 2016-09-03 09:17:55 -04:00
ricky 9b91e4fd63 Update issue_patch.rb 2016-09-03 09:16:13 -04:00
ricky a264e707a8 Update issue_patch.rb 2016-09-03 09:15:37 -04:00
ricky a75a784e8d Update customers_controller.rb 2016-09-03 09:06:52 -04:00
ricky 1e04b6ae9f Update view.html.erb 2016-09-02 11:40:18 -04:00
ricky 6dfbfccced Update view.html.erb 2016-09-02 11:38:13 -04:00
ricky 27288c2eb2 Update view.html.erb 2016-09-02 11:36:59 -04:00
ricky 53a1be9761 Update view.html.erb 2016-09-02 11:28:06 -04:00
ricky d1c6492ea3 Update view.html.erb 2016-09-02 11:26:51 -04:00
ricky 0f72d88c71 Update customers_controller.rb 2016-09-02 11:22:05 -04:00
ricky 9edfcecdaa Update customers_controller.rb 2016-09-02 11:20:31 -04:00
ricky 5303b3dfef Update view.html.erb 2016-09-02 11:18:42 -04:00
ricky 1213c2e57a Update view.html.erb 2016-09-02 11:17:54 -04:00
ricky 49ca69aa78 Update view.html.erb 2016-09-02 11:17:22 -04:00
ricky 586f7c8fb9 Update view.html.erb 2016-09-02 11:16:40 -04:00
ricky 7a68fcfa92 Update customers_controller.rb 2016-09-02 11:15:18 -04:00
ricky 357e5d4490 Update customers_controller.rb 2016-09-02 11:14:01 -04:00
ricky af25326c23 Update view.html.erb 2016-09-02 11:09:12 -04:00
ricky e1db312982 Update view.html.erb 2016-09-02 11:04:46 -04:00
ricky 59a418727e Update view.html.erb 2016-09-02 11:04:36 -04:00
ricky c3d9833acb Update view.html.erb 2016-09-02 11:03:48 -04:00
ricky 59ebeb48ce Update view.html.erb 2016-09-02 11:03:10 -04:00
ricky 7bd23e993e Update view.html.erb 2016-09-02 11:01:54 -04:00
ricky 9b15f3f4f6 Update view.html.erb 2016-09-02 11:00:40 -04:00
ricky f087d3c6c0 Update view.html.erb 2016-09-02 10:59:55 -04:00
ricky 806b4719fe Update customers_controller.rb 2016-09-02 10:54:58 -04:00
ricky 126f4abe0a Update customer_token.rb 2016-09-02 10:52:19 -04:00
ricky 5ec76737b3 Update customer_token.rb 2016-09-02 10:50:32 -04:00
ricky 1d7bcc24fe Update issue_patch.rb 2016-09-02 10:46:37 -04:00
ricky 76a6fce406 Update customer_token.rb 2016-09-02 10:43:50 -04:00
ricky 3d44bcb04d Update customers_controller.rb 2016-09-02 10:40:15 -04:00
ricky fd8b5c280c Create view.html.erb 2016-09-02 10:39:43 -04:00
ricky ef6f104d5f Update customers_controller.rb 2016-09-02 10:34:51 -04:00
ricky 92538a58e3 Update customers_controller.rb 2016-09-02 10:34:09 -04:00
ricky 44bc2f47f1 Update customers_controller.rb 2016-09-02 10:32:58 -04:00
ricky 3c9316340f Update routes.rb 2016-09-02 10:31:05 -04:00
ricky 3ef9236388 Update customers_controller.rb 2016-09-02 10:29:48 -04:00
ricky dfdde631f9 Update routes.rb 2016-09-02 10:29:26 -04:00
ricky 372a6a1b6a Update auth_helper.rb 2016-09-02 10:28:17 -04:00
ricky 5a4996abac Update qbo_controller.rb 2016-09-02 10:10:55 -04:00
ricky 416df8d3f1 Update auth_helper.rb 2016-09-02 00:29:47 -04:00
ricky 0aa7fe8e73 Update auth_helper.rb 2016-09-02 00:25:32 -04:00
ricky f14e82a01b Update auth_helper.rb 2016-09-02 00:24:59 -04:00
ricky 5a10065bb0 Update auth_helper.rb 2016-09-02 00:23:49 -04:00
ricky fb801e9260 Update auth_helper.rb 2016-09-02 00:21:52 -04:00
ricky 0fa31f815e Update auth_helper.rb 2016-09-02 00:11:01 -04:00
ricky 76bd0d4e08 Update customer_token.rb 2016-09-02 00:04:33 -04:00
ricky b31c3ad550 Update customer_token.rb 2016-09-02 00:02:39 -04:00
ricky af7c1b0130 Update customer_token.rb 2016-09-02 00:00:48 -04:00
ricky 224b0b4238 Update 023_create_customer_tokens.rb 2016-09-01 23:57:24 -04:00
ricky e6fee6bd97 Update customer_token.rb 2016-09-01 23:52:39 -04:00
ricky 731b811cfe Update customer_token.rb 2016-09-01 23:48:48 -04:00
ricky 63d969c844 Added Customer Token Model 2016-09-01 23:45:51 -04:00
ricky 1138b0d5c9 Rename 21_add_issues_qbo_invoices.rb to 021_add_issues_qbo_invoices.rb 2016-09-01 23:37:07 -04:00
ricky 758810135d Rename 20_update_qbos_time_stamp.rb to 020_update_qbos_time_stamp.rb 2016-09-01 23:36:53 -04:00
ricky 6eff61b19d Create 022_update_issues_remove_invoice.rb 2016-09-01 23:36:40 -04:00
ricky b3bc17f327 Update Gemfile 2016-09-01 23:30:58 -04:00
ricky 67d4ac0ebf Update init.rb 2016-09-01 23:30:25 -04:00
ricky 11d3a2d0bf Update init.rb 2016-09-01 23:28:34 -04:00
ricky 1f76333af7 Update init.rb 2016-09-01 23:27:26 -04:00
ricky 816daeb429 Update init.rb 2016-09-01 23:24:28 -04:00
ricky b1bc19fb7a Update init.rb 2016-09-01 23:23:20 -04:00
ricky 578258f9e2 Update Gemfile 2016-09-01 23:19:14 -04:00
ricky 41fe8f6a5d Update issues_show_hook_listener.rb 2016-09-01 12:13:06 -04:00
ricky fee0548899 Version Bump 0.4.0
Added "Bill Time" button to Issue view to allow for manual billing of a work ticket without closing. This will be useful for work orders that might take months to complete.

Allow multiple invoices to be tied to a work ticket, since invoices are now automatically attached

Added Last Sync to footer
2016-09-01 08:57:53 -04:00
ricky 5ddb45ba24 Update qbo_invoice.rb 2016-09-01 08:52:23 -04:00
ricky 98c965c607 Update qbo_invoice.rb 2016-09-01 08:41:22 -04:00
ricky 6e1d23af4e Update qbo_invoice.rb 2016-09-01 08:37:21 -04:00
ricky 8da45bd348 Update qbo_invoice.rb 2016-09-01 08:33:59 -04:00
ricky 620c4b395e Update issue_patch.rb 2016-09-01 08:31:24 -04:00
ricky d75208a75a Update qbo_invoice.rb 2016-09-01 08:31:04 -04:00
ricky 4f08825fb1 Update qbo_invoice.rb 2016-09-01 08:29:12 -04:00
ricky 865470fc11 Update qbo_invoice.rb 2016-09-01 08:28:01 -04:00
ricky d827936c85 Update issue_patch.rb 2016-09-01 08:26:20 -04:00
ricky fcc614ff54 Update 21_add_issues_qbo_invoices.rb 2016-09-01 08:22:51 -04:00
ricky b7abe2610e Update issue_patch.rb 2016-09-01 08:20:47 -04:00
ricky d916464423 Update qbo_invoice.rb 2016-09-01 08:19:03 -04:00
ricky 32164157c2 Update qbo_invoice.rb 2016-09-01 08:06:24 -04:00
ricky ce4b957c8e Update qbo_invoice.rb 2016-09-01 08:00:16 -04:00
ricky 3735629073 Update qbo_invoice.rb 2016-09-01 07:58:38 -04:00
ricky d41d618be5 Update issues_save_hook_listener.rb 2016-09-01 02:37:31 -04:00
ricky d97f3cb2a3 Update header_footer_hook_listener.rb 2016-09-01 02:29:33 -04:00
ricky dcf31116b4 Update header_footer_hook_listener.rb 2016-09-01 02:28:25 -04:00
ricky 219141eeee Update header_footer_hook_listener.rb 2016-09-01 02:26:47 -04:00
ricky 765b5b6024 Update header_footer_hook_listener.rb 2016-09-01 02:25:57 -04:00
ricky 4efca93d03 Update header_footer_hook_listener.rb 2016-09-01 02:25:17 -04:00
ricky e2a4908420 Update header_footer_hook_listener.rb 2016-09-01 02:22:58 -04:00
ricky 183b8d17e6 Update header_footer_hook_listener.rb 2016-09-01 02:22:29 -04:00
ricky ed2b84c697 Update init.rb 2016-09-01 02:20:31 -04:00
ricky 59410e6d77 Create header_footer_hook_listener.rb 2016-09-01 02:19:06 -04:00
ricky a134d1b601 Update issues_show_hook_listener.rb 2016-09-01 01:59:42 -04:00
ricky 56161f12d0 Update issues_form_hook_listener.rb 2016-09-01 01:58:10 -04:00
ricky 146dbb137c Update issues_form_hook_listener.rb 2016-09-01 01:55:44 -04:00
ricky 4f23439dac Update issues_show_hook_listener.rb 2016-09-01 01:52:45 -04:00
ricky 8b33aa6f6a Update issues_form_hook_listener.rb 2016-09-01 01:52:19 -04:00
ricky 4f72a8e5ad Update issue_patch.rb 2016-09-01 01:48:43 -04:00
ricky fae4782ef0 Update qbo_controller.rb 2016-09-01 01:47:43 -04:00
ricky 37ea01de8c Update qbo_controller.rb 2016-09-01 01:42:45 -04:00
ricky 2c53155207 Update qbo_controller.rb 2016-09-01 01:41:54 -04:00
ricky dbe585ca2a Update issue_patch.rb 2016-09-01 01:40:09 -04:00
ricky 6434092306 Update qbo_controller.rb 2016-09-01 01:38:59 -04:00
ricky 8720176b57 Update qbo_controller.rb 2016-09-01 01:37:57 -04:00
ricky 5bdf313fa5 Update qbo_controller.rb 2016-09-01 01:36:33 -04:00
ricky 4527e74d29 Update issues_show_hook_listener.rb 2016-09-01 01:35:11 -04:00
ricky 8e6e543c5b Update issues_show_hook_listener.rb 2016-09-01 01:32:22 -04:00
ricky dbbd4a2593 Update issues_show_hook_listener.rb 2016-09-01 01:31:43 -04:00
ricky 6b55f92454 Update issues_show_hook_listener.rb 2016-09-01 01:29:53 -04:00
ricky fba9645932 Update routes.rb 2016-09-01 01:28:16 -04:00
ricky 0cc867b410 Update issues_show_hook_listener.rb 2016-09-01 01:27:24 -04:00
ricky 40f738d976 Update routes.rb 2016-09-01 01:24:14 -04:00
ricky 82ecaae156 Update qbo_controller.rb 2016-09-01 01:22:16 -04:00
ricky 8d4ac896fa Update issue_patch.rb 2016-09-01 01:14:55 -04:00
ricky 7c6246a539 Update issues_show_hook_listener.rb 2016-09-01 01:11:46 -04:00
ricky ce88cdd258 No Duplicates! 2016-09-01 01:10:17 -04:00
ricky f179b04af1 Update and rename 21_add_qbo_invoices_issues.rb to 21_add_issues_qbo_invoices.rb 2016-09-01 00:49:15 -04:00
ricky 0070264d51 Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:18:56 -04:00
ricky 22db89a6d9 Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:17:45 -04:00
ricky 78dfad9875 Update issues_show_hook_listener.rb 2016-09-01 00:12:01 -04:00
ricky 6a55138f7c Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:04:27 -04:00
ricky f95ee10290 Update qbo_invoice.rb 2016-09-01 00:01:56 -04:00
ricky adb864c9ca Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:00:10 -04:00
ricky f3f92e48e0 Create 21_add_qbo_invoices_issues.rb 2016-08-31 23:58:52 -04:00
ricky 87a9d978c2 Update qbo_invoice.rb 2016-08-31 23:54:20 -04:00
ricky 9981b9ef70 Update issue_patch.rb 2016-08-31 23:54:00 -04:00
ricky 94f10dc9cd Update issue_patch.rb 2016-08-31 23:52:55 -04:00
ricky e3fdc070df Update issue_patch.rb 2016-08-31 23:50:35 -04:00
ricky 4cae63d02b Update issues_show_hook_listener.rb 2016-08-31 23:47:40 -04:00
ricky d856ceeec7 Update issues_show_hook_listener.rb 2016-08-31 23:45:26 -04:00
ricky d461570b14 Update issues_show_hook_listener.rb 2016-08-31 23:44:02 -04:00
ricky 924e0d7bc9 Update issues_show_hook_listener.rb 2016-08-31 23:43:14 -04:00
ricky 6b3280edaf Update issues_show_hook_listener.rb 2016-08-31 23:41:44 -04:00
ricky 722d66f130 Added bill_time 2016-08-31 23:37:57 -04:00
ricky 16083a6f30 Update qbo_invoice.rb 2016-08-15 08:37:07 -04:00
ricky 1b6fe073dc Update payments_controller.rb 2016-08-15 07:48:40 -04:00
ricky 9f6103ad89 Update payments_controller.rb 2016-08-15 07:47:44 -04:00
ricky 8a67cdf37c Update payments_controller.rb 2016-08-15 07:46:48 -04:00
ricky 9b444d638b Update payments_controller.rb 2016-08-15 07:45:32 -04:00
ricky abab81158f Update payments_controller.rb 2016-08-15 07:44:47 -04:00
ricky 26c0716d35 Sort! 2016-08-15 07:43:46 -04:00
ricky 7f7c724ef1 Update qbo_invoice.rb 2016-08-15 07:41:56 -04:00
ricky f083e8257a Simplified & Removed the unnecessary nested loops 2016-08-15 07:39:51 -04:00
ricky 4cb588e992 Added is_changed to stop endless update loop with webhook 2016-08-12 19:25:03 -04:00
ricky 245d2b49a2 Update invoice outside of loop (woops) 2016-08-12 16:56:35 -04:00
ricky e888bd0d38 Update README.md 2016-08-11 00:49:54 -04:00
ricky 6cfd56ed01 Update qbo_invoice.rb 2016-08-11 00:42:49 -04:00
ricky 647af6f87a Update qbo_invoice.rb 2016-08-11 00:35:53 -04:00
ricky 0e2f9b1031 Update qbo_invoice.rb 2016-08-11 00:34:09 -04:00
ricky 86ee8908b3 Update qbo_invoice.rb 2016-08-11 00:31:45 -04:00
ricky a0618b51ba Update qbo_invoice.rb 2016-08-11 00:18:14 -04:00
ricky 272369ba4c Delete vehicles.js 2016-08-10 23:40:51 -04:00
ricky 6319c24b5c Update customer.rb 2016-08-10 23:39:52 -04:00
ricky a3180a318c Delete _dropdown.html.erb 2016-08-10 23:37:06 -04:00
ricky aeb890cbed Delete update_vehicles.js.erb 2016-08-10 23:36:27 -04:00
ricky 4a94ca1d17 Delete without_callback.rb 2016-08-10 23:35:47 -04:00
ricky 63d845ed97 Update issue_patch.rb 2016-08-10 23:33:53 -04:00
ricky cb67cab974 Update routes.rb 2016-08-10 23:33:34 -04:00
ricky df94564d9b Update issues_form_hook_listener.rb 2016-08-10 23:33:15 -04:00
ricky 540e008f68 Update issues_form_hook_listener.rb 2016-08-10 23:32:14 -04:00
ricky c85d3ba8d5 Update routes.rb 2016-08-10 23:31:42 -04:00
ricky 1df335ed16 Update issue_patch.rb 2016-08-10 23:30:48 -04:00
ricky 7ca5076477 Update customers_controller.rb 2016-08-10 23:30:16 -04:00
ricky 6605946e62 Update issues_form_hook_listener.rb 2016-08-10 23:20:56 -04:00
ricky ba45c776ae Update routes.rb 2016-08-10 23:19:54 -04:00
ricky dcf17052b6 Update customers_controller.rb 2016-08-10 23:17:57 -04:00
ricky 8b9acccb8a Update issues_form_hook_listener.rb 2016-08-10 23:16:09 -04:00
ricky 2afed176f0 Update issues_form_hook_listener.rb 2016-08-10 23:10:23 -04:00
ricky 577788110e Update issues_form_hook_listener.rb 2016-08-10 23:09:00 -04:00
ricky d251ea066f Update issues_form_hook_listener.rb 2016-08-10 23:07:39 -04:00
ricky 609e65b7cd Update issues_form_hook_listener.rb 2016-08-10 23:04:16 -04:00
ricky 6c2dd29a57 Update issues_form_hook_listener.rb 2016-08-10 23:01:56 -04:00
ricky 98896ac0a6 Update issues_form_hook_listener.rb 2016-08-10 22:59:37 -04:00
ricky 19ba3abade Update issues_form_hook_listener.rb 2016-08-10 22:55:12 -04:00
ricky 3347490b82 Update routes.rb 2016-08-10 22:54:37 -04:00
ricky d1457b09be Update customers_controller.rb 2016-08-10 22:54:05 -04:00
ricky 1b71439f19 Update Gemfile 2016-08-10 22:51:29 -04:00
ricky 55c09d7e9d Update Gemfile 2016-08-10 22:50:26 -04:00
ricky 8429c29c30 Update issues_save_hook_listener.rb 2016-08-10 22:47:45 -04:00
ricky 10f8a7e124 Update issues_form_hook_listener.rb 2016-08-10 22:46:16 -04:00
ricky e8763ea923 Update issues_form_hook_listener.rb 2016-08-10 22:44:20 -04:00
ricky e5601030b1 Update issues_form_hook_listener.rb 2016-08-10 22:42:43 -04:00
ricky ad8d15203e Update customers_controller.rb 2016-08-10 22:38:26 -04:00
ricky 3b4e55727c Update routes.rb 2016-08-10 22:36:45 -04:00
ricky 5dc2921d40 Update issues_form_hook_listener.rb 2016-08-10 22:34:49 -04:00
ricky 0c4ef8abe9 Create autocomplete.js 2016-08-10 22:33:46 -04:00
ricky 8165523acf Update Gemfile 2016-08-10 22:32:42 -04:00
ricky 7d1e9bb838 Update routes.rb 2016-08-10 22:09:16 -04:00
ricky 0d9140958f Update issue_patch.rb 2016-08-10 22:06:54 -04:00
ricky 16ca8177e9 Update README.md 2016-08-10 22:03:50 -04:00
ricky a0e9061a8f Update qbo_controller.rb 2016-08-10 01:24:18 -04:00
ricky a56c01fe6d Update README.md 2016-08-10 01:20:24 -04:00
ricky 1cb9639f03 Added skipping of unknown items 2016-08-10 00:33:41 -04:00
ricky 7af89db442 Removed Item & Invoice Dropdowns 2016-08-10 00:29:25 -04:00
ricky fae815fd7f Removed Item 2016-08-10 00:26:59 -04:00
ricky 1b533d6dd8 Update issues_save_hook_listener.rb 2016-08-10 00:22:16 -04:00
ricky bc38361348 Update issues_save_hook_listener.rb 2016-08-10 00:19:22 -04:00
ricky a0a365c10e Update issues_save_hook_listener.rb 2016-08-10 00:14:56 -04:00
ricky 162c76471b Update issues_save_hook_listener.rb 2016-08-10 00:13:16 -04:00
ricky 328a50be47 Update issues_save_hook_listener.rb 2016-08-10 00:08:13 -04:00
ricky 7cc84277c6 Update issues_save_hook_listener.rb 2016-08-10 00:03:04 -04:00
ricky fbac6b6d77 Update issues_save_hook_listener.rb 2016-08-09 23:47:58 -04:00
ricky 33b5ac8c87 Update issues_save_hook_listener.rb 2016-08-09 23:35:03 -04:00
ricky 74f179d64b Update init.rb 2016-08-06 23:20:54 -04:00
ricky 3cef188ff3 Update customer.rb 2016-08-06 23:19:32 -04:00
ricky 1b767f78d2 Version bump 0.3.0
* Added Payments
* Other things that I don't remember...
2016-08-05 22:00:57 -04:00
ricky f380969082 Update payments_controller.rb 2016-08-05 21:59:21 -04:00
ricky df6acde327 Update payments_controller.rb 2016-08-05 21:57:31 -04:00
ricky 0318ffaa10 Update payments_controller.rb 2016-08-05 21:56:23 -04:00
ricky 51c1b38197 Update init.rb 2016-08-05 21:45:08 -04:00
ricky d96bd1a3f4 Update init.rb 2016-08-05 21:44:00 -04:00
ricky b6e43b5837 Update payment.rb 2016-08-05 21:41:52 -04:00
ricky 62fa98a656 Update payment.rb 2016-08-05 21:39:53 -04:00
ricky bb5a080f25 Update payment.rb 2016-08-05 21:37:20 -04:00
ricky 2afa9e4166 Update payment.rb 2016-08-05 21:36:01 -04:00
ricky b489a2771f Update payment.rb 2016-08-05 21:28:56 -04:00
ricky 0495ac1bc5 Update payment.rb 2016-08-05 21:26:11 -04:00
ricky e3b49358bb Update payment.rb 2016-08-05 21:25:37 -04:00
ricky 08b365e69e Update payment.rb 2016-08-05 21:24:49 -04:00
ricky 5d4c49c85d Update payment.rb 2016-08-05 21:23:07 -04:00
ricky 5bc9ca34a4 Update payment.rb 2016-08-05 21:20:58 -04:00
ricky 630a1d144b Update payment.rb 2016-08-05 21:20:06 -04:00
ricky 491684f7df Update payment.rb 2016-08-05 21:18:33 -04:00
ricky 9a28247b7f Update payment.rb 2016-08-05 21:17:31 -04:00
ricky 5a91e21d45 Update payments_controller.rb 2016-08-05 21:08:05 -04:00
ricky f6f1ca4c04 Update _form.html.erb 2016-08-05 21:01:31 -04:00
ricky 8daa10888f Update routes.rb 2016-08-05 21:00:03 -04:00
ricky 82449642d3 Update routes.rb 2016-08-05 20:58:55 -04:00
ricky 06ad2d6971 Update and rename app/views/payment/new.html.erb to app/views/payments/new.html.erb 2016-08-05 20:58:27 -04:00
ricky 4c4ca67be8 Rename app/views/payment/_form.html.erb to app/views/payments/_form.html.erb 2016-08-05 20:58:06 -04:00
ricky b994f7c142 Update and rename payment_controller.rb to payments_controller.rb 2016-08-05 20:57:44 -04:00
ricky 97b483031d Update payment.rb 2016-08-05 20:56:04 -04:00
ricky c624c20354 Update payment.rb 2016-08-05 20:53:55 -04:00
ricky 695e3bd24c Update payment.rb 2016-08-05 20:43:27 -04:00
ricky ce4883cd4c Update payment_controller.rb 2016-08-05 20:42:25 -04:00
ricky 49e19cb73f Create payment.rb 2016-08-05 20:41:52 -04:00
ricky 31bb242a61 Update new.html.erb 2016-08-05 20:39:18 -04:00
ricky 2e533e8798 Rename app/views/payments/new.html.erb to app/views/payment/new.html.erb 2016-08-05 20:37:47 -04:00
ricky e70d0c8d17 Rename app/views/payments/_form.html.erb to app/views/payment/_form.html.erb 2016-08-05 20:37:31 -04:00
ricky d96ecd2b66 Create new.html.erb 2016-08-05 20:28:35 -04:00
ricky a588ac19a6 Fixed typo 2016-08-05 20:27:25 -04:00
ricky 2bc8ec4f56 Added payments 2016-08-05 20:25:34 -04:00
ricky 578a5a1228 Create payment_controller.rb 2016-08-05 20:20:05 -04:00
ricky 416595ffea Create _form.html.erb 2016-08-05 20:09:49 -04:00
ricky d3be59fbc5 Update _details.html.erb 2016-08-05 09:07:50 -04:00
ricky 3c3b4da313 Update _details.html.erb 2016-08-05 09:06:58 -04:00
ricky 501834419b Update _details.html.erb 2016-08-05 09:02:46 -04:00
ricky 75b25a9e44 Account Balance & Adresses 2016-08-05 09:01:09 -04:00
ricky 15912b2197 QueryValidationError: property 'PrimaryPhone' is not queryable 2016-08-05 08:52:33 -04:00
ricky b093f6136e Update customer.rb 2016-08-05 08:49:59 -04:00
ricky 33db0a53ba Update customer.rb 2016-08-05 08:46:48 -04:00
ricky 7237d2e643 Search Phone Numbers 2016-08-05 08:43:44 -04:00
ricky 77b1c1dbef Update vehicle.rb 2016-08-05 00:56:28 -04:00
ricky f3090bd1a4 Update vehicle.rb 2016-08-05 00:54:34 -04:00
ricky 89a131018c Update vehicles_controller.rb 2016-08-05 00:47:37 -04:00
ricky de17fb80d1 Update _form.html.erb 2016-08-05 00:45:55 -04:00
ricky a5f1d15156 Update vehicles_controller.rb 2016-08-05 00:45:23 -04:00
ricky d3463ce41b Removed link 2016-08-05 00:39:53 -04:00
ricky 4503150b02 Removed hiding of notes 2016-08-05 00:37:29 -04:00
ricky 36cd00822e Removed New Vehicle Button 2016-08-05 00:33:14 -04:00
ricky d285344a61 Added customer count 2016-08-05 00:30:00 -04:00
ricky 8418dfc0b5 Update vehicles_controller.rb 2016-08-05 00:04:31 -04:00
ricky eb039368bb Version bump 0.2.0
* New Top & Application Menus
* Move quickbooks stats into QBO settings page
* Fixed New vehicle for customer link
* Added issue linking from hashtag numbers in QBO invoice line items
* Cleaned up customer & vehicle lists
* Implemented delete calls from web hook
* Added webhook token verification
* More...
2016-08-04 10:12:12 -04:00
ricky 0dea5917a7 Update _settings.html.erb 2016-08-04 10:06:07 -04:00
ricky a8ccde6c81 Update _settings.html.erb 2016-08-04 10:05:07 -04:00
ricky 787ae1b8df Update _settings.html.erb 2016-08-04 10:03:28 -04:00
ricky 276c89d4ac Update init.rb 2016-08-04 09:59:12 -04:00
ricky 9a395ee25c Update _list.html.erb 2016-08-04 09:53:02 -04:00
ricky 475c86eabe Update show.html.erb 2016-08-04 09:52:32 -04:00
ricky 259737a488 Update show.html.erb 2016-08-04 09:51:47 -04:00
ricky 362cb77381 Update show.html.erb 2016-08-04 09:50:55 -04:00
ricky 8cfab17136 Update show.html.erb 2016-08-04 09:50:37 -04:00
ricky f0018ab87d Update _details.html.erb 2016-08-04 09:49:52 -04:00
ricky 8f87eb3e60 Update show.html.erb 2016-08-04 09:48:19 -04:00
ricky 2b093903b3 Update show.html.erb 2016-08-04 09:46:22 -04:00
ricky 05017dcc4f Update show.html.erb 2016-08-04 09:45:39 -04:00
ricky 0e9b5fa17a Update show.html.erb 2016-08-04 09:44:09 -04:00
ricky dd335aff71 Update _form.html.erb 2016-08-04 00:18:32 -04:00
ricky 0f61bf54ce Update index.html.erb 2016-08-04 00:15:33 -04:00
ricky 14cb22d743 Update vehicles_controller.rb 2016-08-04 00:13:47 -04:00
ricky 702ab5013e Update index.html.erb 2016-08-04 00:11:54 -04:00
ricky 235e2c6e7b Update routes.rb 2016-08-04 00:10:46 -04:00
ricky 2e89a60d63 Update vehicles_controller.rb 2016-08-04 00:09:52 -04:00
ricky 3d5ef2cd8a Update vehicles_controller.rb 2016-08-04 00:08:21 -04:00
ricky de8eff9bd2 Update vehicles_controller.rb 2016-08-04 00:03:35 -04:00
ricky a9561d1694 Update vehicles_controller.rb 2016-08-04 00:02:56 -04:00
ricky aa33de00d2 Update index.html.erb 2016-08-04 00:01:15 -04:00
ricky ffc589fe80 Update index.html.erb 2016-08-03 23:59:50 -04:00
ricky 229e4e8d39 Update index.html.erb 2016-08-03 23:57:28 -04:00
ricky d6dda2cdd6 Update init.rb 2016-08-03 23:54:17 -04:00
ricky b8a101fddb Update routes.rb 2016-08-03 23:50:55 -04:00
ricky c8a875b301 Update init.rb 2016-08-03 23:45:30 -04:00
ricky df8e3a7465 Update init.rb 2016-08-03 23:35:43 -04:00
ricky d91a6e3939 Update init.rb 2016-08-03 23:15:38 -04:00
ricky 48a2d683dd Update init.rb 2016-08-03 23:13:55 -04:00
ricky 44bf42c548 Update init.rb 2016-08-03 23:11:00 -04:00
ricky d34e6cb0fd Update issues_form_hook_listener.rb 2016-08-03 23:05:19 -04:00
ricky d8e7356ca3 Update init.rb 2016-08-03 23:03:59 -04:00
ricky 60e6dbaa6f Update issues_form_hook_listener.rb 2016-08-03 22:50:53 -04:00
ricky 47e5a7d0e4 Update issues_form_hook_listener.rb 2016-08-03 22:48:26 -04:00
ricky 9fa2165907 Update issues_form_hook_listener.rb 2016-08-03 22:46:42 -04:00
ricky 7385d7018c Update issues_form_hook_listener.rb 2016-08-03 22:45:23 -04:00
ricky 6124c1b307 Update issues_form_hook_listener.rb 2016-08-03 22:44:56 -04:00
ricky b73535c6da Update issues_form_hook_listener.rb 2016-08-03 22:43:40 -04:00
ricky 1581023656 Update vehicles.js 2016-08-03 22:39:33 -04:00
ricky 0d21e2967d Rename vehicles.js.cof to vehicles.js 2016-08-03 22:37:48 -04:00
ricky 0dc7d83fbe Update issues_form_hook_listener.rb 2016-08-03 22:37:30 -04:00
ricky cd18067384 Rename vehicles.js to vehicles.js.coffee 2016-08-03 22:36:12 -04:00
ricky 6c99f7095c Update issues_form_hook_listener.rb 2016-08-03 22:35:49 -04:00
ricky eeaafce427 Rename vehicles.js.coffee to vehicles.js 2016-08-03 22:32:19 -04:00
ricky b7cb27b5da Update vehicles.js.coffee 2016-08-03 22:30:04 -04:00
ricky 3e6286da7c Update vehicles.js.coffee 2016-08-03 22:28:31 -04:00
ricky 30ceea7fd5 Update vehicles_controller.rb 2016-08-03 22:23:07 -04:00
ricky de9e973fd9 Update routes.rb 2016-08-03 22:22:23 -04:00
ricky 49a3bd5790 Update routes.rb 2016-08-03 22:19:23 -04:00
ricky f1745930b1 Update routes.rb 2016-08-03 22:15:43 -04:00
ricky d9beda8171 Rename update_vehicles.js.coffee.erb to update_vehicles.js.erb 2016-08-03 22:14:23 -04:00
ricky 65f343fb74 Update vehicles_controller.rb 2016-08-03 22:13:18 -04:00
ricky 892bd65fac Rename update_vehicles.js.coffee to update_vehicles.js.coffee.erb 2016-08-03 22:10:50 -04:00
ricky 0251191844 Update vehicles_controller.rb 2016-08-03 22:05:25 -04:00
ricky 65f6f52252 Update update_vehicles.js.coffee 2016-08-03 21:58:47 -04:00
ricky 4d94308bcc Update vehicles_controller.rb 2016-08-03 21:57:50 -04:00
ricky 7dcd8b24d2 Update vehicles.js.coffee 2016-08-03 21:55:31 -04:00
ricky 11da8e7a43 Update vehicles_controller.rb 2016-08-03 21:54:05 -04:00
ricky 56c895388d Update vehicles.js.coffee 2016-08-03 21:53:31 -04:00
ricky 8ec9567f15 Update issues_form_hook_listener.rb 2016-08-03 21:50:02 -04:00
ricky be3dd0d131 Rename assets/javascripts/app/assets/vehicles.js.coffee to assets/javascripts/vehicles.js.coffee 2016-08-03 21:40:04 -04:00
ricky 92f51d9884 Create _vehicle.html.erb 2016-08-03 21:34:10 -04:00
ricky c4904a0ac2 Create update_vehicles.js.coffee 2016-08-03 21:29:01 -04:00
ricky 0d87e5fb21 Create vehicles.js.coffee 2016-08-03 21:26:21 -04:00
ricky d38e3e1702 Update routes.rb 2016-08-03 21:22:34 -04:00
ricky fec59a7495 Update vehicles_controller.rb 2016-08-03 21:20:08 -04:00
ricky a3b5ad0cb0 Update show.html.erb 2016-08-03 21:16:31 -04:00
ricky bf21451819 Update show.html.erb 2016-08-03 21:15:40 -04:00
ricky c6d3d9673b Update show.html.erb 2016-08-03 21:15:03 -04:00
ricky 3f5334a92d Update show.html.erb 2016-08-03 21:14:25 -04:00
ricky bde7b83752 Update show.html.erb 2016-08-03 21:13:40 -04:00
ricky c788e5724a Update show.html.erb 2016-08-03 21:12:54 -04:00
ricky 295cd12f9d Update show.html.erb 2016-08-03 21:11:57 -04:00
ricky 4a432481d9 Update show.html.erb 2016-08-03 21:11:05 -04:00
ricky 4a37d83694 Update show.html.erb 2016-08-03 21:09:15 -04:00
ricky 15a2a16379 Update show.html.erb 2016-08-03 21:08:42 -04:00
ricky 18fc7a6c8c Update vehicles_controller.rb 2016-08-03 21:02:45 -04:00
ricky 7aba8cdce3 Update qbo_invoice.rb 2016-08-03 16:40:05 -04:00
ricky 382e6675f1 Update qbo_invoice.rb 2016-08-03 16:39:07 -04:00
ricky 116d6896f4 Update qbo_invoice.rb 2016-08-03 16:38:09 -04:00
ricky c9ced52112 Update qbo_invoice.rb 2016-08-03 16:36:50 -04:00
ricky 01b4bb4e53 Update qbo_invoice.rb 2016-08-03 16:35:04 -04:00
ricky a266da2cd7 Update qbo_invoice.rb 2016-08-03 16:33:38 -04:00
ricky 578e7ba807 Update qbo_invoice.rb 2016-08-03 16:32:52 -04:00
ricky b923e15d46 Update qbo_invoice.rb 2016-08-03 16:31:17 -04:00
ricky 1310d1e63e Update qbo_invoice.rb 2016-08-03 16:27:30 -04:00
ricky a8e1e8429c Update qbo_invoice.rb 2016-08-03 16:25:33 -04:00
ricky 1b54b40f6c Update qbo_invoice.rb 2016-08-03 16:22:44 -04:00
ricky 6d7530922d Update qbo_invoice.rb 2016-08-03 16:20:26 -04:00
ricky 23698986b1 Update qbo_invoice.rb 2016-08-03 16:15:50 -04:00
ricky 1b4c377940 Update _details.html.erb 2016-08-01 22:35:12 -04:00
ricky d33c0c9aa5 Update _details.html.erb 2016-08-01 22:34:38 -04:00
ricky 09d8c0024f Update _details.html.erb 2016-08-01 22:33:32 -04:00
ricky 06e827fff8 Version bump 0.1.0 2016-08-01 22:30:47 -04:00
ricky b1844689df Update qbo_controller.rb 2016-08-01 22:29:53 -04:00
ricky a4263a92ca Update issues_show_hook_listener.rb 2016-08-01 22:20:57 -04:00
ricky 14cc251809 Update Gemfile 2016-08-01 21:56:17 -04:00
ricky 471e8f3398 Update qbo_controller.rb 2016-08-01 21:56:00 -04:00
ricky dadbda62c6 Update qbo_controller.rb 2016-08-01 21:55:30 -04:00
ricky df47efe816 Update qbo_controller.rb 2016-08-01 21:54:31 -04:00
ricky 03cc6943a3 Update Gemfile 2016-08-01 21:51:04 -04:00
ricky 6f0163ce7d Update qbo_controller.rb 2016-08-01 21:49:17 -04:00
ricky 91110adad5 Update qbo_controller.rb 2016-08-01 21:47:30 -04:00
ricky c2f48d0277 Update qbo_controller.rb 2016-08-01 21:41:47 -04:00
ricky 06344b6498 Update qbo_controller.rb 2016-08-01 21:34:14 -04:00
ricky 4ff2b2bdc6 Update _settings.html.erb 2016-08-01 21:28:15 -04:00
ricky a71dd310fe Update issues_show_hook_listener.rb 2016-08-01 21:24:22 -04:00
ricky 90da7a5d74 Update issues_show_hook_listener.rb 2016-08-01 21:23:15 -04:00
ricky 6505f54c7f Update issues_show_hook_listener.rb 2016-08-01 21:22:31 -04:00
ricky c4a488e5a7 Update issues_show_hook_listener.rb 2016-08-01 21:21:41 -04:00
ricky 71817f5ca8 Update issues_show_hook_listener.rb 2016-08-01 21:18:31 -04:00
ricky 77c97ef2c1 Update vehicle.rb 2016-08-01 21:14:02 -04:00
ricky 875ec19e38 Update customer.rb 2016-08-01 21:09:39 -04:00
ricky f47e77f816 Version bump 0.0.8 2016-08-01 21:08:49 -04:00
ricky 144a52f813 Add files via upload 2016-08-01 21:07:01 -04:00
ricky f9a5269fd7 Delete plugin_issue_edit.png 2016-08-01 21:06:48 -04:00
ricky bc1445f8bb Update qbo_employee.rb 2016-08-01 21:01:06 -04:00
ricky 01e5415074 Update qbo_controller.rb 2016-08-01 20:57:51 -04:00
ricky 697ff4f9d5 Update qbo_controller.rb 2016-08-01 20:54:42 -04:00
ricky fe7cfc6b1d Update qbo_controller.rb 2016-08-01 20:52:24 -04:00
ricky 7a7e148719 Update README.md 2016-08-01 20:38:04 -04:00
ricky 95db8f9839 Update _list.html.erb 2016-08-01 20:31:48 -04:00
ricky 7fb91ae10b Update _list.html.erb 2016-08-01 20:29:58 -04:00
ricky 0c5c778c75 Update _list.html.erb 2016-08-01 20:28:18 -04:00
ricky 38865bd062 Update vehicle.rb 2016-08-01 19:34:28 -04:00
ricky e201765f02 Update vehicles_controller.rb 2016-08-01 19:31:51 -04:00
ricky d9ccffe3d6 Update vehicles_controller.rb 2016-08-01 19:30:25 -04:00
ricky 86e084574e Update _list.html.erb 2016-08-01 19:28:22 -04:00
ricky 756e60b865 Update index.html.erb 2016-08-01 19:09:41 -04:00
ricky 5c49094b40 Update index.html.erb 2016-08-01 19:08:49 -04:00
ricky 336d1c7c7b Update vehicles_controller.rb 2016-08-01 19:05:49 -04:00
ricky 632b788082 Update vehicle.rb 2016-08-01 19:04:46 -04:00
ricky ddd00a3e9a Update show.html.erb 2016-08-01 19:02:49 -04:00
ricky 54e59fbd98 Update show.html.erb 2016-08-01 17:00:54 -04:00
ricky 3f29a024f9 Update show.html.erb 2016-08-01 17:00:25 -04:00
ricky c5f03ed03c Update _details.html.erb 2016-08-01 16:59:35 -04:00
ricky 547880443c Update _details.html.erb 2016-08-01 16:58:51 -04:00
ricky 838733fdc3 Update README.md 2016-08-01 16:55:56 -04:00
ricky 4b068266a9 Add files via upload 2016-08-01 16:48:46 -04:00
ricky 57c78f27a7 Delete plugin_config.png 2016-08-01 16:48:31 -04:00
ricky 3af5caef4a Update index.html.erb 2016-08-01 16:41:59 -04:00
ricky 49425656ee Update index.html.erb 2016-08-01 16:40:50 -04:00
ricky 3e85216e66 Update qbo.rb 2016-08-01 16:39:58 -04:00
ricky 443d6fc47c Update customer.rb 2016-08-01 16:13:58 -04:00
ricky 4d7bc59bd3 Update customer.rb 2016-08-01 16:12:08 -04:00
ricky 4dbeee0aa1 Update index.html.erb 2016-08-01 16:09:30 -04:00
ricky 9b137fed69 Update index.html.erb 2016-08-01 16:02:05 -04:00
ricky 9c667c20da Update index.html.erb 2016-08-01 16:01:24 -04:00
ricky e503c965c3 Update index.html.erb 2016-08-01 15:59:51 -04:00
ricky 933d1eb730 Update qbo_controller.rb 2016-08-01 15:54:40 -04:00
ricky c99fe57074 Update qbo_controller.rb 2016-08-01 15:52:02 -04:00
ricky 77fc54dc31 Update customer.rb 2016-08-01 15:48:28 -04:00
ricky 37f6518a15 Update customer.rb 2016-08-01 15:47:10 -04:00
ricky bcaf011166 Update customers_controller.rb 2016-08-01 15:46:37 -04:00
ricky 27807e963d Update customers_controller.rb 2016-08-01 15:45:57 -04:00
ricky f0fabc5e10 Update customers_controller.rb 2016-08-01 15:45:10 -04:00
ricky e7c85eac4d Update index.html.erb 2016-08-01 15:43:45 -04:00
ricky 01ea01fef6 Update index.html.erb 2016-08-01 15:42:42 -04:00
ricky 134fb776f9 Update index.html.erb 2016-08-01 15:40:17 -04:00
ricky 9cd143c5ef Update index.html.erb 2016-08-01 15:39:04 -04:00
ricky ba18275ef8 Update index.html.erb 2016-08-01 15:37:32 -04:00
ricky 6e92648d8b Update customers_controller.rb 2016-08-01 15:36:10 -04:00
ricky 8ddc612bba Extended search 2016-08-01 15:34:17 -04:00
ricky 2324aadcd5 Extended search 2016-08-01 15:31:54 -04:00
ricky baff3f5a1b Extended search 2016-08-01 15:30:00 -04:00
ricky 68b6ea7649 Update _list.html.erb 2016-07-28 23:33:15 -04:00
ricky c46cab6a6f Update customers_controller.rb 2016-07-28 23:30:49 -04:00
ricky 74807c73b0 Jump to customer is there is only one result 2016-07-28 23:27:02 -04:00
ricky a26214fef7 Search 2016-07-28 20:50:23 -04:00
ricky ec77a004a2 Search 2016-07-28 20:49:38 -04:00
ricky f33203b0e3 Search 2016-07-28 20:48:34 -04:00
ricky 297dd8ec4e Search 2016-07-28 20:46:49 -04:00
ricky bbc2ae4750 Search 2016-07-28 20:45:29 -04:00
ricky fb1a560751 Search 2016-07-28 20:44:15 -04:00
ricky bee48c4f0f Version Bump 0.0.7! 2016-07-28 20:37:13 -04:00
ricky 0f8fbfb8df Update qbo.rb 2016-07-28 20:34:31 -04:00
ricky d71e9a78a1 Update qbo_controller.rb 2016-07-28 20:06:06 -04:00
ricky 7ac778586c Update qbo.rb 2016-07-28 20:03:36 -04:00
ricky 2558cb69b1 Update qbo_controller.rb 2016-07-28 19:52:42 -04:00
ricky 55ac8d12a5 Update qbo_controller.rb 2016-07-28 19:51:48 -04:00
ricky a5dc5ce921 Update qbo.rb 2016-07-28 19:42:09 -04:00
ricky de65cc0926 Update qbo.rb 2016-07-28 19:41:02 -04:00
ricky 80d3eed224 Update qbo_controller.rb 2016-07-28 19:32:24 -04:00
ricky 76beccfb9f Update qbo_controller.rb 2016-07-28 19:31:24 -04:00
ricky 5579cd9255 Update _settings.html.erb 2016-07-28 19:27:00 -04:00
ricky 236e84f11a Update _settings.html.erb 2016-07-28 19:23:20 -04:00
ricky ed61dc6bbf Update qbo_controller.rb 2016-07-28 19:21:40 -04:00
ricky 2b7ac05338 Update qbo.rb 2016-07-28 19:19:13 -04:00
ricky 36e63995aa Update qbo_controller.rb 2016-07-28 19:15:19 -04:00
ricky 58d16fbc7d Update qbo_controller.rb 2016-07-28 19:12:36 -04:00
ricky aa78482c36 Update qbo_controller.rb 2016-07-28 19:11:09 -04:00
ricky c35b6a3f6b Update qbo_controller.rb 2016-07-28 18:35:44 -04:00
ricky 8d52c46a53 Update qbo_controller.rb 2016-07-28 18:31:54 -04:00
ricky 325f124e4e Update qbo_controller.rb 2016-07-28 18:30:48 -04:00
ricky 18d71a69f8 Update qbo_controller.rb 2016-07-28 18:27:00 -04:00
ricky 7d5fd72297 Update qbo_controller.rb 2016-07-28 18:21:58 -04:00
ricky a625f6d9fc Update qbo_controller.rb 2016-07-28 18:17:44 -04:00
ricky ede89cc6cf Update qbo_controller.rb 2016-07-28 18:15:56 -04:00
ricky c60f06e8ed Webhook 2016-07-28 09:18:50 -04:00
ricky 863a5efa38 Webhook 2016-07-28 09:17:21 -04:00
ricky 670b0aac67 Webhook 2016-07-28 09:16:13 -04:00
ricky d261b156bd Webhook 2016-07-28 09:14:18 -04:00
ricky c49bdb731a Webhook 2016-07-28 09:13:16 -04:00
ricky dc2993bdea Webhook 2016-07-28 09:09:38 -04:00
ricky 09e1c0ad48 Webhook 2016-07-28 09:07:51 -04:00
ricky 370153bed9 Webhook 2016-07-28 09:04:17 -04:00
ricky b115c4bf67 Webhook 2016-07-28 09:03:55 -04:00
ricky 90a7ac1267 Webhook 2016-07-28 09:02:29 -04:00
ricky 887d330ba9 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2016-07-28 09:02:04 -04:00
ricky fe97a589d9 Update 2016-07-28 09:01:41 -04:00
ricky 37d0b2321f Webhook 2016-07-28 08:59:43 -04:00
ricky 47aa454895 Webhook 2016-07-28 08:57:28 -04:00
ricky fecc4956b4 Webhook 2016-07-28 08:52:30 -04:00
ricky 0d5fb8d3e3 Update qbo_controller.rb 2016-07-28 08:47:39 -04:00
ricky ca6e51911b Webhook 2016-07-28 08:41:23 -04:00
ricky 8159487631 Webhook 2016-07-28 08:33:26 -04:00
ricky 392b27563a Webhooks 2016-07-28 07:55:20 -04:00
ricky 60dced41db Webhook 2016-07-28 01:07:54 -04:00
ricky 8b02a80904 Webhooks 2016-07-28 01:04:00 -04:00
ricky ff977cc364 Update pdf_patch.rb 2016-07-22 19:01:43 -04:00
ricky 3578908832 Update pdf_patch.rb 2016-07-22 19:00:24 -04:00
ricky 4fcde967f1 Update issues_show_hook_listener.rb 2016-07-22 19:00:03 -04:00
ricky 4e81c16617 Update pdf_patch.rb 2016-07-22 16:02:57 -04:00
ricky 8149f5ab9b Update issues_show_hook_listener.rb 2016-07-22 15:59:49 -04:00
ricky 7800e52299 Update users_show_hook_listener.rb 2016-07-13 16:33:04 -04:00
ricky c6f8fd7561 Update issues_form_hook_listener.rb 2016-06-04 10:09:27 -04:00
ricky e3d26cea23 Update issue_patch.rb 2016-06-02 09:47:42 -04:00
ricky 4fd35d4cb6 Update issues_form_hook_listener.rb 2016-06-02 09:45:54 -04:00
ricky cf00331497 Update issues_form_hook_listener.rb 2016-06-02 09:45:28 -04:00
ricky dc8ea82b61 Update issues_form_hook_listener.rb 2016-06-02 09:41:54 -04:00
ricky aab99e3abe Update issues_form_hook_listener.rb 2016-06-02 09:41:14 -04:00
ricky f240a5a6a4 Update issues_form_hook_listener.rb 2016-06-02 09:40:13 -04:00
ricky 05ce348d8a Update issues_form_hook_listener.rb 2016-06-02 09:36:34 -04:00
ricky 67afbff93d Update issues_form_hook_listener.rb 2016-06-02 09:35:41 -04:00
ricky bd92ca8f2c Fixed Vehicle Drop down 2016-06-02 09:25:52 -04:00
ricky 7ef3e31465 New Issue Button 2016-06-02 09:20:44 -04:00
ricky f59aa18be8 Fixed Formatting 2016-06-02 09:02:06 -04:00
ricky 2699b37e4f Edmunds API Key 2016-06-02 08:56:13 -04:00
ricky 22f8138422 Edmunds API Key Setting 2016-06-02 08:54:37 -04:00
ricky 0727257d72 Update issues_save_hook_listener.rb 2016-06-01 12:01:51 -04:00
ricky f8a9ffbe15 Setter for email 2016-05-31 11:16:41 -04:00
126 changed files with 2907 additions and 1708 deletions
+2
View File
@@ -1,3 +1,5 @@
.bundle .bundle
.config .config
.dockerrc
.vscode
Gemfile.lock Gemfile.lock
+10 -5
View File
@@ -1,9 +1,14 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'quickbooks-ruby' gem 'quickbooks-ruby'
gem 'quickbooks-ruby-base' gem 'oauth2'
gem 'oauth-plugin'
gem 'oauth'
gem 'roxml' gem 'roxml'
gem 'edmunds_vin' gem 'will_paginate'
gem 'will_paginate', '~> 3.1.0' gem 'rails-jquery-autocomplete'
gem 'jquery-ui-rails'
gem 'rexml'
gem 'combine_pdf'
group :assets do
gem 'coffee-rails'
end
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 Rick Barrette Copyright (c) 2016 - 2026 Rick Barrette
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+90 -51
View File
@@ -1,71 +1,110 @@
#Redmine Quickbooks Online # Redmine QuickBooks Online
A simple plugin for Redmine to connect to Quickbooks Online A plugin for Redmine to connect to QuickBooks Online.
The goal of this project is to allow redmine to connect with Quickbooks Online to create time activity entries for completed work when an issue is closed. The goal of this project is to allow Redmine to connect with QuickBooks Online to create Time Activity Entries for billable hours logged when an Issue is closed.
`Note: This project is under heavy development. Currently the initial functionality goal has been meet, however I am still working on adding other features. Tags should be stable` ## Disclaimer
####How it works **Note:** Although the core functionality is complete, this project is still under development and the master branch may be unstable. Tags should be stable and are recommended.
* Issues can be assigned to a QBO Customer and QBO Service Item via drop down in issues form
- The `QBO Employee` for the issue is assigned via the assigned redmine user
- IF an `Issue` has been assined a `QBO Customer`, `QBO Service Item` & `QBO Employee` when an `Issue` is closed the following will happen:
- A new `QBO Time Activity` agaist the `QBO Customer` will be created using the total spent hours logged agaist an `Issue`.
- The rate will be the set via the `QBO Service Item` price
* `Issues` with the Tracker `Quote` will generate an estimate based on the estimated hours and `QBO Service Item` cost.
- Needs to have a `QBO Customer` & `QBO Service Item` Assiged
* Users will be assigned a `QBO Employee` via a drop down in the user admistration page.
##Prerequisites ## Compatibility
* Sign up to become a developer for Intuit https://developer.intuit.com/ | Plugin Version | Redmine Version |
* Create your own aplication to obtain your API keys | :--- | :--- |
| Version 2026.1.0+ | Redmine 6.1 |
| Version 2.0.0+ | Redmine 5 |
| Version 1.0.0+ | Redmine 4 |
| Version 0.8.1 | Redmine 3 |
##The Install ## Features
1. To install, clone this repo into your plugin folder * **Customer Assignment:** Issues can be assigned to a Customer via a dropdown in the edit Issue form.
* Once a customer is attached to an Issue, you can attach an Estimate to the issue via a dropdown menu.
* **Employee Mapping:** An Employee is assigned to a Redmine User via a dropdown in the User Administration page.
* **Automatic Billing:** If an Issue has been assigned a Customer, the following happens when the Issue is closed:
* A new Time Activity will be billed against the Customer assigned to the issue for each Redmine Time Entry.
* Time Entries will be totalled up by Activity name. This allows billing for different activities without having to create separate Issues.
* The Time Activity names are used to dynamically lookup Items in QuickBooks.
* If there are no Items that match the Activity name, it will be skipped and will not be billed to the Customer.
* Labor Rates are set by the corresponding Item in QuickBooks.
* **Customer Management:** Customers can be created via the New Customer Page.
* Customers can be searched by name or phone number.
* Basic information for the Customer can be viewed/edited via the Customer page.
* **Webhook Support:**
* **Invoices:** Automatically attached to an Issue if a line item contains a hashtag number (e.g., `#123`).
* **Custom Fields:** Invoice Custom Fields are matched to Issue Custom Fields and are automatically updated in QuickBooks. (Useful for extracting Mileage In/Out from the Issue to update the Invoice).
* **Sync:** Customers are automatically updated in the local database.
* **Plugin View Hooks** Allows intergration of other features supported by companion plugins, for example [redmine_qbo_vehicles](https://github.com/rickbarrette/redmine_qbo_vehicles) adds customer vehicle interation
`git clone git@github.com:rickbarrette/redmine_qbo.git` ## Prerequisites
2. Migrate your database
`rake redmine:plugins:migrate RAILS_ENV=production` * Sign up to become a developer for Intuit: https://developer.intuit.com/
* Create your own application to obtain your API keys.
3. Navigate to the plugin configuration page and suppy your own OAuth key & secret. * Set up the webhook service to `https://redmine.yourdomain.com/qbo/webhook`
![Alt plugin_config](/Screenshots/plugin_config.png) ## Installation
4. After saving your key & secret, you need to click on the Authenticate link on the plugin configuration page to authenticate with QBO. 1. **Clone the plugin:**
Clone this repo into your plugin folder and checkout a tagged version.
```bash
cd path/to/redmine/plugins
git clone git@github.com:rickbarrette/redmine_qbo.git
cd redmine_qbo
git checkout <tag>
```
5. Assign an Employee to each of your users via the User Administration Page 2. **Install dependencies:** *Crucial for Redmine 6 / Rails 7 compatibility.*
Bash
```
bundle install
```
3. **Migrate your database:**
Bash
```
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```
4. **Restart Redmine:** You must restart your Redmine server instance for the plugin and hooks to load.
5. **Configuration:**
* Navigate to the plugin configuration page (`Administration > Plugins > Configure`).
* Supply your own OAuth Key & Secret.
* After saving the Key & Secret, click the **Authenticate** link on the configuration page to connect to QBO.
6. **User Mapping:**
* Assign an Employee to each of your users via the **User Administration Page**.
![Alt plugin_user_edit](/Screenshots/plugin_user_edit.png)
## Usage ## Usage
To enable automatic `QBO Time Activity` entries for an `Issue` , you need only to assign a `QBO Customer` and `QBO Item` to an `Issue` via drop downs in the creation/update form. To enable automatic Time Activity entries for an Issue, you simply need to assign a Customer to an Issue via the dropdowns in the issue creation/update form.
![Alt plugin_issue-edit](/Screenshots/plugin_issue_edit.png)
Note: Customers, Employees, and Service Items with automaticly update during normal usage of redmine i.e. a page refresh. You can also manualy force redmine to sync its database with QBO clicking the sync link in the Quickbooks top menu page **Note:** After the initial synchronization, this plugin will receive push notifications via Intuit's webhook service.
![Alt plugin_top_menu](/Screenshots/plugin_top_menu.png) ## Companion Plugin Hooks
* :pdf_left, { issue: issue }
* :pdf_right, { issue: issue }
* :process_invoice_custom_fields, { issue: issue, invoice: invoice }
* :show_customer_view_right, {customer: @customer}
## TODO ## License
* Abiltiy to add line items to a ticket in a dynamic table so they can be added to the invoice upon closing of the issue
* Customer ~~Creation~~, ~~Update~~, Deletion
* Email Customer updates, provding a link that would: bypass the login page, go directly to the issue directing them to, and allow them to view only that issue.
* Add a rake file to create required Trackers or statuses required
* Add Setting for Sandbox Mode
##License > The MIT License (MIT)
>
The MIT License (MIT) > Copyright (c) 2016 - 2026 Rick Barrette
>
Copyright (c) 2016 rick barrette > Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: > The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

+177 -32
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -10,76 +10,221 @@
# This controller class will handle map management # This controller class will handle map management
class CustomersController < ApplicationController class CustomersController < ApplicationController
unloadable
include AuthHelper include AuthHelper
helper :issues
before_filter :require_user helper :journals
helper :projects
helper :custom_fields
helper :issue_relations
helper :watchers
helper :attachments
helper :queries
include QueriesHelper
helper :repositories
helper :sort
include SortHelper
helper :timelog
before_action :add_customer, only: :new
before_action :view_customer, except: [:new, :view]
skip_before_action :verify_authenticity_token, :check_if_login_required, only: [:view]
default_search_scope :names
autocomplete :customer, :name, full: true, extra_data: [:id]
def allowed_params
params.require(:customer).permit(:name, :email, :primary_phone, :mobile_phone, :phone_number, :notes)
end
# getter method for a customer's invoices
# used for customer autocomplete field / issue form
def filter_invoices_by_customer
@filtered_invoices = Invoice.all.where(customer_id: params[:selected_customer])
end
# getter method for a customer's estimates
# used for customer autocomplete field / issue form
def filter_estimates_by_customer
@filtered_estimates = Estimate.all.where(customer_id: params[:selected_customer])
end
# display a list of all customers # display a list of all customers
def index def index
@customers = Customer.paginate(:page => params[:page]) if params[:search]
@customers = Customer.search(params[:search]).paginate(page: params[:page])
if only_one_non_zero?(@customers)
redirect_to @customers.first
end
end
end end
# initialize a new customer
def new def new
@customer = Customer.new @customer = Customer.new
end end
# create a new customer
def create def create
@customer = Customer.new(params[:customer]) @customer = Customer.new(allowed_params)
if @customer.save if @customer.save
flash[:notice] = "New Customer Created" flash[:notice] = t :notice_customer_created
redirect_to @customer redirect_to @customer
else else
flash[:error] = @customer.errors.full_messages.to_sentence flash[:error] = @customer.errors.full_messages.to_sentence
redirect_to new_customer_path redirect_to new_customer_path
end end
end end
# display a specific customer # display a specific customer
def show def show
begin begin
@customer = Customer.find_by_id(params[:id]) @customer = Customer.find_by_id(params[:id])
@vehicles = @customer.vehicles.paginate(:page => params[:page]) @issues = @customer.issues.order(id: :desc)
@issues = @customer.issues @billing_address = address_to_s(@customer.billing_address)
rescue ActiveRecord::RecordNotFound @shipping_address = address_to_s(@customer.shipping_address)
@closed_issues = (@issues - @issues.open)
@hours = 0
@closed_hours = 0
@issues.open.each { |i| @hours+= i.total_spent_hours }
@closed_issues.each { |i| @closed_hours+= i.total_spent_hours }
rescue
flash[:error] = t :notice_customer_not_found
render_404 render_404
end end
end end
# return an HTML form for editing a customer # return an HTML form for editing a customer
def edit def edit
begin begin
@customer = Customer.find_by_id(params[:id]) @customer = Customer.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound rescue
flash[:error] = t :notice_customer_not_found
render_404 render_404
end end
end end
# update a specific customer # update a specific customer
def update def update
begin begin
@customer = Customer.find_by_id(params[:id]) @customer = Customer.find_by_id(params[:id])
if @customer.update_attributes(params[:customer]) if @customer.update(allowed_params)
flash[:notice] = "Customer updated" flash[:notice] = tv :notice_customer_updated
redirect_to @customer redirect_to @customer
else else
redirect_to edit_customer_path redirect_to edit_customer_path
flash[:error] = @customer.errors.full_messages.to_sentence if @customer.errors flash[:error] = @customer.errors.full_messages.to_sentence if @customer.errors
end end
rescue ActiveRecord::RecordNotFound rescue
render_404 flash[:error] = t :notice_customer_not_found
end
end
def destroy
begin
Customer.find_by_id(params[:id]).destroy
flash[:notice] = "Customer deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
end end
# delete a customer
def destroy
begin
Customer.find_by_id(params[:id]).destroy
flash[:notice] = t :notice_customer_deleted
redirect_to action: :index
rescue
flash[:error] = t :notice_customer_not_deleted
render_404
end
end
# creates new customer view tokens, removes expired tokens & redirects to newly created customer view with new token.
def share
Thread.new do
logger.info "Removing expired customer tokens"
CustomerToken.remove_expired_tokens
ActiveRecord::Base.connection.close
end
begin
issue = Issue.find_by_id(params[:id])
redirect_to view_path issue.share_token.token
rescue
flash[:error] = t :notice_issue_not_found
render_404
end
end
# displays an issue for a customer with a provided security CustomerToken
def view
User.current = User.find_by lastname: 'Anonymous'
@token = CustomerToken.find_by token: params[:token]
begin
@token.destroy if @token.expired?
raise "Token Expired" if @token.destroyed
session[:token] = @token.token
@issue = Issue.find @token.issue_id
@journals = @issue.journals.
preload(:details).
preload(user: :email_address).
reorder(:created_on, :id).to_a
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project)
Journal.preload_journals_details_custom_fields(@journals)
@journals.select! {|journal| journal.notes? || journal.visible_details.any?}
@journals.reverse! if User.current.wants_comments_in_reverse_order?
@changesets = @issue.changesets.visible.preload(:repository, :user).to_a
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@priorities = IssuePriority.active
@time_entry = TimeEntry.new(issue: @issue, project: @issue.project)
@relation = IssueRelation.new
rescue
flash[:error] = t :notice_forbidden
render_403
end
end
private
# redmine permission - add customers
def add_customer
global_check_permission(:add_customers)
end
# redmine permission - view customers
def view_customer
global_check_permission(:view_customers)
end
# checks to see if there is only one item in an array
# @return true if array only has one item
def only_one_non_zero?( array )
found_non_zero = false
array.each do |val|
if val!=0
return false if found_non_zero
found_non_zero = true
end
end
found_non_zero
end
# format a quickbooks address to a human readable string
def address_to_s (address)
return if address.nil?
string = address.line1 if address.line1
string << "\n" + address.line2 if address.line2
string << "\n" + address.line3 if address.line3
string << "\n" + address.line4 if address.line4
string << "\n" + address.line5 if address.line5
string << " " + address.city if address.city
string << ", " + address.country_sub_division_code if address.country_sub_division_code
string << " " + address.postal_code if address.postal_code
return string
end
end end
+38 -7
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,20 +8,51 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class EstimateController < ApplicationController class EstimateController < ApplicationController
unloadable
include AuthHelper include AuthHelper
before_filter :require_user before_action :require_user, unless: proc {|c| session[:token].nil? }
skip_before_action :verify_authenticity_token, :check_if_login_required, unless: proc {|c| session[:token].nil? }
def get_estimate
# Force sync for estimate by doc number if not found
if Estimate.find_by_doc_number(params[:search]).nil?
begin
Estimate.sync_by_doc_number(params[:search]) if params[:search]
rescue
logger.info "Estimate.find_by_doc_number failed"
end
end
estimate = Estimate.find_by_id(params[:id]) if params[:id]
estimate = Estimate.find_by_doc_number(params[:search]) if params[:search]
return estimate
end
# #
# Downloads and forwards the estimate pdf # Downloads and forwards the estimate pdf
# #
def show def show
base = QboEstimate.get_base.service estimate = get_estimate
estimate = base.fetch_by_id(params[:id])
@pdf = base.pdf(estimate) begin
send_data @pdf, filename: "estimate #{estimate.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf" send_data estimate.pdf, filename: "estimate #{estimate.doc_number}.pdf", disposition: :inline, type: "application/pdf"
rescue
redirect_to :back, flash: { error: I18n.t(:notice_estimate_not_found) }
end
end
#
# Downloads estimate by document number
#
def doc
estimate = get_estimate
begin
send_data estimate.pdf, filename: "estimate #{estimate.doc_number}.pdf", disposition: :inline, type: "application/pdf"
rescue
redirect_to :back, flash: { error: I18n.t(:notice_estimate_not_found) }
end
end end
end end
+36 -8
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,19 +8,47 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class InvoiceController < ApplicationController class InvoiceController < ApplicationController
unloadable
include AuthHelper include AuthHelper
require 'combine_pdf'
before_filter :require_user
before_action :require_user, unless: proc {|c| session[:token].nil? }
skip_before_action :verify_authenticity_token, :check_if_login_required, unless: proc {|c| session[:token].nil? }
# #
# Downloads and forwards the invoice pdf # Downloads and forwards the invoice pdf
# #
def show def show
base = QboInvoice.get_base.service logger.info("Processing request for URL: #{request.original_url}")
invoice = base.fetch_by_id(params[:id]) begin
@pdf = base.pdf(invoice) qbo = Qbo.first
send_data @pdf, filename: "invoice #{invoice.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf" qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
# If multiple id's then pull each pdf & combine them
if params[:invoice_ids]
logger.info("Grabbing pdfs for " + params[:invoice_ids].join(', '))
ref = ""
params[:invoice_ids].each do |i|
logger.info("processing " + i)
invoice = service.fetch_by_id(i)
ref += " #{invoice.doc_number}"
@pdf << CombinePDF.parse(service.pdf(invoice)) unless @pdf.nil?
if @pdf.nil?
@pdf = CombinePDF.parse(service.pdf(invoice))
end
end
@pdf = @pdf.to_pdf
else
invoice = service.fetch_by_id(params[:id])
@pdf = service.pdf(invoice)
ref = invoice.doc_number
end
send_data @pdf, filename: "invoice #{ref}.pdf", disposition: :inline, type: "application/pdf"
end
rescue
redirect_to :back, flash: { error: I18n.t(:notice_invoice_not_found) }
end
end end
end end
+119 -44
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -9,74 +9,149 @@
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QboController < ApplicationController class QboController < ApplicationController
unloadable
require 'openssl'
include AuthHelper include AuthHelper
before_filter :require_user before_action :require_user, except: :webhook
skip_before_action :verify_authenticity_token, :check_if_login_required, only: [:webhook]
# def allowed_params
# Called when the QBO Top Menu us shown params.permit(:code, :state, :realmId, :id)
#
def index
@qbo = Qbo.first
@customer_count = Customer.count
@qbo_item_count = QboItem.count
@qbo_employee_count = QboEmployee.count
@qbo_invoice_count = QboInvoice.count
@qbo_estimate_count = QboEstimate.count
end end
# #
# Called when the user requests that Redmine to connect to QBO # Called when the user requests that Redmine to connect to QBO
# #
def authenticate def authenticate
callback = request.base_url + qbo_oauth_callback_path redirect_uri = "#{Setting.protocol}://#{Setting.host_name + qbo_oauth_callback_path}"
token = Qbo.get_oauth_consumer.get_request_token(:oauth_callback => callback) logger.info "redirect_uri: #{redirect_uri}"
session[:qb_request_token] = token oauth2_client = Qbo.construct_oauth2_client
redirect_to("https://appcenter.intuit.com/Connect/Begin?oauth_token=#{token.token}") and return grant_url = oauth2_client.auth_code.authorize_url(redirect_uri: redirect_uri, response_type: "code", state: SecureRandom.hex(12), scope: "com.intuit.quickbooks.accounting")
redirect_to grant_url
end end
# #
# Called by QBO after authentication has been processed # Called by QBO after authentication has been processed
# #
def oauth_callback def oauth_callback
at = session[:qb_request_token].get_access_token(:oauth_verifier => params[:oauth_verifier]) if params[:state].present?
oauth2_client = Qbo.construct_oauth2_client
#There can only be one... # use the state value to retrieve from your backend any information you need to identify the customer in your system
Qbo.destroy_all redirect_uri = "#{Setting.protocol}://#{Setting.host_name + qbo_oauth_callback_path}"
if resp = oauth2_client.auth_code.get_token(params[:code], redirect_uri: redirect_uri)
# Save the authentication information
qbo = Qbo.new # Remove the last authentication information
qbo.qb_token = at.token Qbo.delete_all
qbo.qb_secret = at.secret
qbo.token_expires_at = 6.months.from_now.utc # Save the authentication information
qbo.reconnect_token_at = 5.months.from_now.utc qbo = Qbo.new
qbo.company_id = params['realmId'] qbo.update(oauth2_access_token: resp.token, oauth2_refresh_token: resp.refresh_token, realm_id: params[:realmId])
if qbo.save! qbo.refresh_token!
redirect_to qbo_sync_path, :flash => { :notice => "Successfully connected to Quickbooks" }
if qbo.save!
redirect_to qbo_sync_path, flash: { notice: I18n.t(:label_connected) }
else
redirect_to plugin_settings_path(:redmine_qbo), flash: { error: I18n.t(:label_error) }
end
end
end
end
# Manual Billing
def bill
i = Issue.find_by_id params[:id]
if i.customer
i.bill_time
redirect_to i, flash: { notice: I18n.t(:label_billed_success) + i.customer.name }
else else
redirect_to plugin_settings_path(:redmine_qbo), :flash => { :error => "Error" } redirect_to i, flash: { error: I18n.t(:label_billing_error) }
end
end
# Quickbooks Webhook Callback
def webhook
logger.info "Quickbooks is calling webhook"
# check the payload
signature = request.headers['intuit-signature']
key = Setting.plugin_redmine_qbo['settingsWebhookToken']
data = request.body.read
hash = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha256'), key, data)).strip()
# proceed if the request is good
if hash.eql? signature
Thread.new do
if request.headers['content-type'] == 'application/json'
data = JSON.parse(data)
else
# application/x-www-form-urlencoded
data = params.as_json
end
# Process the information
entities = data['eventNotifications'][0]['dataChangeEvent'][:entities]
entities.each do |entity|
id = entity[:id].to_i
name = entity[:name]
logger.info "Casting #{name.constantize} to obj"
# Magicly initialize the correct class
obj = name.constantize
# for merge events
obj.destroy(entity['deletedId']) if entity['deletedId']
#Check to see if we are deleting a record
if entity[:operation].eql? "Delete"
obj.destroy(id)
#if not then update!
else
begin
obj.sync_by_id(id)
rescue => e
logger.error "Failed to call sync_by_id on obj"
logger.error e.message
logger.error e.backtrace.join("\n")
end
end
end
# Record that last time we updated
Qbo.update_time_stamp
ActiveRecord::Base.connection.close
end
# The webhook doesn't require a response but let's make sure we don't send anything
render nothing: true, status: 200
else
render nothing: true, status: 400
end end
logger.info "Quickbooks webhook complete"
end end
# #
# Synchronizes the QboCustomer table with QBO # Synchronizes the QboCustomer table with QBO
# #
def sync def sync
if Qbo.exists? logger.info "Syncing EVERYTHING"
Customer.sync # Update info in background
QboItem.sync Thread.new do
QboEmployee.sync if Qbo.exists?
QboEstimate.sync Customer.sync
QboInvoice.sync Invoice.sync
#QboPurchase.sync Employee.sync
Estimate.sync
# Record the last sync time
Qbo.update_time_stamp # Record the last sync time
Qbo.update_time_stamp
end
ActiveRecord::Base.connection.close
end end
redirect_to qbo_path(:redmine_qbo), :flash => { :notice => "Successfully synced to Quickbooks" } redirect_to :home, flash: { notice: I18n.t(:label_syncing) }
end end
end end
-90
View File
@@ -1,90 +0,0 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# This controller class will handle map management
class VehiclesController < ApplicationController
unloadable
include AuthHelper
before_filter :require_user
# display a list of all vehicles
def index
@vehicles = Vehicle.paginate(:page => params[:page])
end
# return an HTML form for creating a new vehicle
def new
@vehicle = Vehicle.new
@customers = Customer.all.order(:name)
end
# create a new vehicle
def create
@vehicle = Vehicle.new(params[:vehicle])
if @vehicle.save
flash[:notice] = "New Vehicle Created"
redirect_to @vehicle
else
flash[:error] = @vehicle.errors.full_messages.to_sentence
redirect_to new_vehicle_path
end
end
# display a specific vehicle
def show
begin
@vehicle = Vehicle.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
end
# return an HTML form for editing a vehicle
def edit
begin
@vehicle = Vehicle.find_by_id(params[:id])
@customer = @vehicle.customer.id
@customers = Customer.all.order(:name)
rescue ActiveRecord::RecordNotFound
render_404
end
end
# update a specific vehicle
def update
@customer = params[:customer]
begin
@vehicle = Vehicle.find_by_id(params[:id])
if @vehicle.update_attributes(params[:vehicle])
flash[:notice] = "Vehicle updated"
redirect_to @vehicle
else
flash[:error] = @vehicle.errors.full_messages.to_sentence if @vehicle.errors
redirect_to edit_vehicle_path
end
rescue ActiveRecord::RecordNotFound
render_404
end
end
# delete a specific vehicle
def destroy
begin
Vehicle.find_by_id(params[:id]).destroy
flash[:notice] = "Vehicle deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
render_404
end
end
end
+37 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -11,8 +11,43 @@
module AuthHelper module AuthHelper
def require_user def require_user
return unless session[:token].nil?
if !User.current.logged? if !User.current.logged?
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true render_403
end end
end end
def allowed_to?(action)
return false if User.current.nil?
project = Project.find(params[:project_id])
return false if project.nil?
return true if User.current.allowed_to?(action, project)
false
end
def check_permission(permission)
if !allowed_to?(permission)
render_403
end
end
def global_check_permission(permission)
if !globaly_allowed_to?(permission)
render_403
end
end
def globaly_allowed_to?( action)
return false if User.current.nil?
projects = Project.all
projects.each { |p|
if User.current.allowed_to?(action, p)
return true
end
}
false
end
end end
+88
View File
@@ -0,0 +1,88 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module QuickbooksOauth
extend ActiveSupport::Concern
#== Instance Methods
def perform_authenticated_request(&block)
attempts = 0
begin
yield oauth_access_token
rescue OAuth2::Error, Quickbooks::AuthorizationFailure => ex
Rails.logger.error("QuickbooksOauth.perform: #{ex.message}")
# to prevent an infinite loop here keep a counter and bail out after N times...
attempts += 1
raise "QuickbooksOauth:ExceededAuthAttempts" if attempts >= 3
# check if its an invalid_grant first, but assume it is for now
refresh_token!
retry
end
end
def refresh_token!
Rails.logger.info("QuickbooksOauth.refresh_token!")
t = oauth_access_token
refreshed = t.refresh!
if refreshed.params['x_refresh_token_expires_in'].to_i > 0
oauth2_refresh_token_expires_at = Time.now + refreshed.params['x_refresh_token_expires_in'].to_i.seconds
else
oauth2_refresh_token_expires_at = 100.days.from_now
end
Rails.logger.info("QuickbooksOauth.refresh_token!: #{oauth2_refresh_token_expires_at}")
update!(
oauth2_access_token: refreshed.token,
oauth2_access_token_expires_at: Time.at(refreshed.expires_at),
oauth2_refresh_token: refreshed.refresh_token,
oauth2_refresh_token_expires_at: oauth2_refresh_token_expires_at
)
end
def oauth_client
self.class.construct_oauth2_client
end
def oauth_access_token
OAuth2::AccessToken.new(oauth_client, oauth2_access_token, refresh_token: oauth2_refresh_token)
end
def consumer
oauth_access_token
end
module ClassMethods
def construct_oauth2_client
oauth_consumer_key = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
oauth_consumer_secret = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
# Are we are playing in the sandbox?
Quickbooks.sandbox_mode = Setting.plugin_redmine_qbo[:sandbox] ? true : false
logger.info "Sandbox mode: #{Quickbooks.sandbox_mode}"
options = {
site: "https://appcenter.intuit.com/connect/oauth2",
authorize_url: "https://appcenter.intuit.com/connect/oauth2",
token_url: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
}
OAuth2::Client.new(oauth_consumer_key, oauth_consumer_secret, options)
end
end
end
+109 -34
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -9,20 +9,18 @@
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Customer < ActiveRecord::Base class Customer < ActiveRecord::Base
unloadable
has_many :issues has_many :issues
has_many :qbo_purchases has_many :invoices
has_many :vehicles has_many :estimates
attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone
validates_presence_of :id, :name validates_presence_of :id, :name
self.primary_key = :id self.primary_key = :id
# returns a human readable string # returns a human readable string
def to_s def to_s
return name return "#{self[:name]} - #{phone_number.split(//).last(4).join unless phone_number.nil?}"
end end
# Convenience Method # Convenience Method
@@ -36,6 +34,13 @@ class Customer < ActiveRecord::Base
end end
end end
# Convenience Method
# Sets the email
def email=(s)
pull unless @details
@details.email_address = s
end
# Convenience Method # Convenience Method
# returns the customer's primary phone # returns the customer's primary phone
def primary_phone def primary_phone
@@ -54,6 +59,8 @@ class Customer < ActiveRecord::Base
pn = Quickbooks::Model::TelephoneNumber.new pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n pn.free_form_number = n
@details.primary_phone = pn @details.primary_phone = pn
#update our locally stored number too
update_phone_number
end end
# Convenience Method # Convenience Method
@@ -74,6 +81,33 @@ class Customer < ActiveRecord::Base
pn = Quickbooks::Model::TelephoneNumber.new pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n pn.free_form_number = n
@details.mobile_phone = pn @details.mobile_phone = pn
#update our locally stored number too
update_mobile_phone_number
end
# Convenience Method
# Sets the notes
def notes=(s)
pull unless @details
@details.notes = s
end
# update the localy stored phone number as a plain string with no special chars
def update_phone_number
begin
self.phone_number = self.primary_phone.tr('^0-9', '')
rescue
return nil
end
end
# update the localy stored phone number as a plain string with no special chars
def update_mobile_phone_number
begin
self.mobile_phone_number = self.mobile_phone.tr('^0-9', '')
rescue
return nil
end
end end
# Convenience Method # Convenience Method
@@ -86,57 +120,94 @@ class Customer < ActiveRecord::Base
# Magic Method # Magic Method
# Maps Get/Set methods to QBO customer object # Maps Get/Set methods to QBO customer object
def method_missing(sym, *arguments) def method_missing(sym, *arguments)
# Check to see if the method exists # Check to see if the method exists
if Quickbooks::Model::Customer.method_defined?(sym) if Quickbooks::Model::Customer.method_defined?(sym)
# download details if required # download details if required
pull unless @details pull unless @details
method_name = sym.to_s method_name = sym.to_s
# Setter # Setter
if method_name[-1, 1] == "=" if method_name[-1, 1] == "="
@details.method(method_name).call(arguments[0]) @details.method(method_name).call(arguments[0])
# Getter # Getter
else else
return @details.method(method_name).call return @details.method(method_name).call
end end
end end
end end
# proforms a bruteforce sync operation # proforms a bruteforce sync operation
# This needs to be simplified # This needs to be simplified
def self.sync def self.sync
service = Qbo.get_base(:customer).service
# Sync ALL customers if the database is empty # Sync ALL customers if the database is empty
if count == 0 qbo = Qbo.first
customers = service.all customers = qbo.perform_authenticated_request do |access_token|
else service = Quickbooks::Service::Customer.new(company_id: qbo.realm_id, access_token: access_token)
last = Qbo.first.last_sync service.all
query = "Select Id, DisplayName From Customer"
query << " Where Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
customers = service.query(query)
end end
customers.each do |customer| return unless customers
qbo_customer = Customer.find_or_create_by(id: customer.id)
if customer.active? customers.each do |c|
if not qbo_customer.name.eql? customer.display_name logger.info "Processing customer #{c.id}"
qbo_customer.name = customer.display_name customer = Customer.find_or_create_by(id: c.id)
qbo_customer.id = customer.id if c.active?
qbo_customer.save_without_push #if not customer.name.eql? c.display_name
end customer.name = c.display_name
customer.id = c.id
customer.phone_number = c.primary_phone.free_form_number.tr('^0-9', '') unless c.primary_phone.nil?
customer.mobile_phone_number = c.mobile_phone.free_form_number.tr('^0-9', '') unless c.mobile_phone.nil?
customer.save_without_push
#end
else else
if not qbo_customer.new_record? if not c.new_record?
qbo_customer.delete customer.delete
end end
end end
end end
end end
# Searchs the database for a customer by name or phone number with out special chars
def self.search(search)
customers = where("name LIKE ? OR phone_number LIKE ? OR mobile_phone_number LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%")
return customers.order(:name)
end
# proforms a bruteforce sync operation
# This needs to be simplified
def self.sync_by_id(id)
qbo = Qbo.first
c = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Customer.new(company_id: qbo.realm_id, access_token: access_token)
service.fetch_by_id(id)
end
return unless c
customer = Customer.find_or_create_by(id: c.id)
if c.active?
#if not customer.name.eql? c.display_name
customer.name = c.display_name
customer.id = c.id
customer.phone_number = c.primary_phone.free_form_number.tr('^0-9', '') unless c.primary_phone.nil?
customer.mobile_phone_number = c.mobile_phone.free_form_number.tr('^0-9', '') unless c.mobile_phone.nil?
customer.save_without_push
#end
else
if not customer.new_record?
customer.delete
end
end
end
# Push the updates # Push the updates
def save_with_push def save_with_push
begin begin
@details = Qbo.get_base(:customer).service.update(@details) qbo = Qbo.first
@details = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Customer.new(company_id: qbo.realm_id, access_token: access_token)
service.update(@details)
end
#raise "QBO Fault" if @details.fault? #raise "QBO Fault" if @details.fault?
self.id = @details.id self.id = @details.id
rescue Exception => e rescue Exception => e
@@ -154,7 +225,11 @@ class Customer < ActiveRecord::Base
def pull def pull
begin begin
raise Exception unless self.id raise Exception unless self.id
@details = Qbo.get_base(:customer).find_by_id(self.id) qbo = Qbo.first
@details = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Customer.new(company_id: qbo.realm_id, access_token: access_token)
service.fetch_by_id(self.id)
end
rescue Exception => e rescue Exception => e
@details = Quickbooks::Model::Customer.new @details = Quickbooks::Model::Customer.new
end end
+61
View File
@@ -0,0 +1,61 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CustomerToken < ActiveRecord::Base
has_many :issues
validates_presence_of :issue_id
before_create :generate_token, :generate_expire_date
attr_accessor :destroyed
after_destroy :mark_as_destroyed
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret'] || 'CONFIGURE__' + SecureRandom.uuid
# generates a random token using the plugin setting settingsOAuthConsumerSecret for salt
def generate_token
self.token = SecureRandom.base64(15).tr('+/=lIO0', OAUTH_CONSUMER_SECRET)
end
# generates an expiring date
def generate_expire_date
self.expires_at = Time.now + 1.month
end
# set destroyed flag
def mark_as_destroyed
self.destroyed = true
end
# purge expired tokens
def self.remove_expired_tokens
where("expires_at < ?", Time.now).destroy_all
end
# has the token expired?
def expired?
self.expires_at < Time.now
end
# Getter convenience method for tokens
def self.get_token(issue)
# check to see if token exists & if it is expired
token = find_by_issue_id issue.id
unless token.nil?
return token unless token.expired?
# remove expired tokens
token.destroy
end
# only create new token if we have an issue to attach it to
return create(issue_id: issue.id) if User.current.logged?
end
end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,40 +8,42 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QboItem < ActiveRecord::Base class Employee < ActiveRecord::Base
unloadable
has_many :issues has_many :users
attr_accessible :name
validates_presence_of :id, :name validates_presence_of :id, :name
self.primary_key = :id
def self.get_base
Qbo.get_base(:item)
end
def self.sync def self.sync
last = Qbo.first.last_sync qbo = Qbo.first
employees = qbo.perform_authenticated_request do |access_token|
query = "SELECT Id, Name FROM Item WHERE Type = 'Service' " service = Quickbooks::Service::Employee.new(company_id: qbo.realm_id, access_token: access_token)
query << " AND Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last service.all
if count == 0
items = get_base.service.all
else
items = get_base.service.query(query)
end end
unless items.count = 0 return unless employees
items.find_by(:type, "Service").each { |i|
qbo_item = QboItem.find_or_create_by(id: i.id) transaction do
qbo_item.name = i.name employees.each { |e|
qbo_item.id = i.id logger.info "Processing employee #{e.id}"
qbo_item.save employee = find_or_create_by(id: e.id)
employee.name = e.display_name
employee.id = e.id
employee.save!
} }
end end
# QboItem.where.not(items.map(&:id)).destroy_all
end end
def self.sync_by_id(id)
qbo = Qbo.first
employee = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Employee.new(company_id: qbo.realm_id, access_token: access_token)
service.fetch_by_id(id)
end
return unless employee
employee = find_or_create_by(id: employee.id)
employee.name = employee.display_name
employee.id = employee.id
employee.save!
end
end end
+133
View File
@@ -0,0 +1,133 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Estimate < ActiveRecord::Base
has_and_belongs_to_many :issues
belongs_to :customer
validates_presence_of :doc_number, :id
self.primary_key = :id
# returns a human readable string
def to_s
return self[:doc_number]
end
# sync all estimates
def self.sync
logger.info "Syncing ALL estimates"
qbo = Qbo.first
estimates = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
service.all
end
return unless estimates
estimates.each { |estimate|
process_estimate(estimate)
}
#remove deleted estimates
where.not(estimates.map(&:id)).destroy_all
end
# sync only one estimate
def self.sync_by_id(id)
logger.info "Syncing estimate #{id}"
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
process_estimate(service.fetch_by_id(id))
end
end
# sync only one estimate
def self.sync_by_doc_number(number)
logger.info "Syncing estimate by doc number #{number}"
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
process_estimate(service.find_by( :doc_number, number).first)
end
end
# update an estimate
def self.update(id)
qbo = Qbo.first
estimate = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
service.fetch_by_id(id)
end
return unless estimate
e = find_or_create_by(id: id)
e.doc_number = estimate.doc_number
e.txn_date = estimate.txn_date
e.save!
end
# process an estimate into the database
def self.process_estimate(qbo_estimate)
logger.info "Processing estimate #{qbo_estimate.id}"
estimate = find_or_create_by(id: qbo_estimate.id)
estimate.doc_number = qbo_estimate.doc_number
estimate.customer_id = qbo_estimate.customer_ref.value
estimate.id = qbo_estimate.id
estimate.txn_date = qbo_estimate.txn_date
estimate.save!
end
# download the pdf from quickbooks
def pdf
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
estimate = service.fetch_by_id(id)
service.pdf(estimate)
end
end
# Magic Method
# Maps Get/Set methods to QBO estimate object
def method_missing(sym, *arguments)
# Check to see if the method exists
if Quickbooks::Model::Estimate.method_defined?(sym)
# download details if required
pull unless @details
method_name = sym.to_s
# Setter
if method_name[-1, 1] == "="
@details.method(method_name).call(arguments[0])
# Getter
else
return @details.method(method_name).call
end
end
end
private
# pull the details
def pull
begin
raise Exception unless self.id
qbo = Qbo.first
@details = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Estimate.new(company_id: qbo.realm_id, access_token: access_token)
service(:estimate).fetch_by_id(self.id)
end
rescue Exception => e
@details = Quickbooks::Model::Estimate.new
end
end
end
+208
View File
@@ -0,0 +1,208 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Invoice < ActiveRecord::Base
has_and_belongs_to_many :issues
belongs_to :customer
validates_presence_of :doc_number, :id, :customer_id, :txn_date
self.primary_key = :id
# returns a human readable string
def to_s
return self[:doc_number]
end
# sync ALL the invoices
def self.sync
logger.info "Syncing all invoices"
last = Qbo.first.last_sync
query = "SELECT Id, DocNumber FROM Invoice"
query << " WHERE Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
# TODO actually do something with the above query
# .all() is never called since count is never initialized
qbo = Qbo.first
invoices = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
service.all
end
return unless invoices
invoices.each { | invoice |
process_invoice invoice
}
end
#sync by invoice ID
def self.sync_by_id(id)
logger.info "Syncing invoice #{id}"
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
invoice = service.fetch_by_id(id)
process_invoice invoice
end
end
private
# Attach the invoice to the issue
def self.attach_to_issue(issue, invoice)
return if issue.nil?
# skip this issue if the issue customer is not the same as the invoice customer
return if issue.customer_id != invoice.customer_ref.value.to_i
logger.info "Attaching invoice #{invoice.id} to issue #{issue.id}"
invoice = Invoice.find_or_create_by(id: invoice.id)
unless issue.invoices.include?(invoice)
issue.invoices << invoice
issue.save!
end
compare_custom_fields(issue, invoice)
end
# processes the invoice into the database
def self.process_invoice(i)
logger.info "Processing invoice #{i.id}"
# Load the invoice into the database
invoice = Invoice.find_or_create_by(id: i.id)
invoice.doc_number = i.doc_number
invoice.id = i.id
invoice.customer_id = i.customer_ref
invoice.txn_date = i.txn_date
invoice.save!
# Scan the private notes for hashtags and attach to the applicable issues
if not i.private_note.nil?
i.private_note.scan(/#(\w+)/).flatten.each { |issue|
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
}
end
# Scan the line items for hashtags and attach to the applicable issues
i.line_items.each { |line|
if line.description
line.description.scan(/#(\w+)/).flatten.each { |issue|
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
}
end
}
end
# compares the custome fields on invoices & issues and updates the invoice as needed
#
# the issue here is when two or more issues share an invoice with the same custom field, but diffrent values
# this condions causes an infinite loop as the webhook is called when an invoice is updated
# TODO maybe add a cf_sync_confict flag to invoices
def self.compare_custom_fields(issue, invoice)
logger.info "Comparing custom fields"
# TODO break if Invoice.find(invoice.id).cf_sync_confict
is_changed = false
logger.debug "Calling :process_invoice_custom_fields hook"
context = Redmine::Hook.call_hook :process_invoice_custom_fields, { issue: issue, invoice: invoice }
# Process updates from the hooks
context.each do |c|
unless c.nil?
logger.debug "Invoice.compare_custom_fields: We have a responce from a hook"
push_updates c[:invoice] if c[:is_changed]
end
end
# Process Issue Custom Values
begin
value = issue.custom_values.find_by(custom_field_id: CustomField.find_by_name(cf.name).id)
# Check to see if the value is blank...
if not value.value.to_s.blank?
# Check to see if the value is diffrent
if not cf.string_value.to_s.eql? value.value.to_s
# update the custom field on the invoice
cf.string_value = value.value.to_s
is_changed = true
end
end
rescue
# Nothing to do here, there is no match
end
push_updates invoice if is_changed
end
# pushes invoice updates
def self.push_updates(invoice)
begin
logger.info "Invoice.push_updates"
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
service.update invoice
end
rescue
# Do nothing, probaly custome field sync confict on the invoice.
# This is a problem with how it's billed
# TODO Add notes in memo area
# TODO flag Invoice.cf_sync_confict here
logger.error "Failed to update invoice"
end
end
# download the pdf from quickbooks
def pdf
qbo = Qbo.first
qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
invoice = service.fetch_by_id(id)
return service.pdf(invoice)
end
end
# Magic Method
# Maps Get/Set methods to QBO invoice object
def method_missing(sym, *arguments)
# Check to see if the method exists
if Quickbooks::Model::Invoice.method_defined?(sym)
# download details if required
pull unless @details
method_name = sym.to_s
# Setter
if method_name[-1, 1] == "="
@details.method(method_name).call(arguments[0])
# Getter
else
return @details.method(method_name).call
end
end
end
# pull the details from quickbooks
def pull
begin
raise Exception unless self.id
qbo = Qbo.first
@details = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
service.fetch_by_id(self.id)
end
rescue Exception => e
@details = Quickbooks::Model::Invoice.new
end
end
end
+11 -37
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -9,46 +9,20 @@
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Qbo < ActiveRecord::Base class Qbo < ActiveRecord::Base
unloadable
validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at include QuickbooksOauth
include Redmine::I18n
QB_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
QB_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
# Quickbooks Config Info
$qb_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
:site => "https://oauth.intuit.com",
:request_token_path => "/oauth/v1/get_request_token",
:authorize_url => "https://appcenter.intuit.com/Connect/Begin",
:access_token_path => "/oauth/v1/get_access_token"
})
# Configure quickbooks-ruby-base to access our database
Quickbooks::Base.configure do |c|
c.persistent_token = 'qb_token'
c.persistent_secret = 'qb_secret'
c.persistent_company_id = 'company_id'
end
def self.get_oauth_consumer
return $qb_oauth_consumer
end
# Get a quickbooks base object for type
# @params type of base
def self.get_base(type)
Quickbooks::Base.new(first, type)
end
# Get the QBO account
def self.get_account
first
end
# Updates last sync time stamp # Updates last sync time stamp
def self.update_time_stamp def self.update_time_stamp
date = DateTime.now
logger.info "Updating QBO timestamp to #{date}"
qbo = Qbo.first qbo = Qbo.first
qbo.last_sync = DateTime.now qbo.last_sync = date
qbo.save qbo.save
end end
def self.last_sync
format_time(Qbo.first.last_sync)
end
end end
-45
View File
@@ -1,45 +0,0 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QboEstimate < ActiveRecord::Base
unloadable
has_many :issues
attr_accessible :doc_number
validates_presence_of :id, :doc_number
def self.get_base
Qbo.get_base(:estimate)
end
def self.sync
estimates = get_base.service.all
# Update the item table
transaction do
estimates.each { |estimate|
qbo_estimate = QboEstimate.find_or_create_by(id: estimate.id)
qbo_estimate.doc_number = estimate.doc_number
qbo_estimate.id = estimate.id
qbo_estimate.save!
}
end
#remove deleted estimates
where.not(estimates.map(&:id)).destroy_all
end
def self.update(id)
# Update the item table
estimate = get_base.service.fetch_by_id(id)
qbo_estimate = QboEstimate.find_or_create_by(id: id)
qbo_estimate.doc_number = estimate.doc_number
qbo_estimate.save!
end
end
-55
View File
@@ -1,55 +0,0 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QboInvoice < ActiveRecord::Base
unloadable
has_many :issues
attr_accessible :doc_number
validates_presence_of :id, :doc_number
def self.get_base
Qbo.get_base(:invoice)
end
def self.sync
#Pull the invoices from the quickbooks server
#invoices = get_base.service.all
last = Qbo.first.last_sync
query = "SELECT Id, DocNumber FROM Invoice"
query << " WHERE Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
if count == 0
invoices = get_base.service.all
else
invoices = get_base.service.query()
end
# Update the invoice table
invoices.each { | invoice |
qbo_invoice = find_or_create_by(id: invoice.id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.id = invoice.id
qbo_invoice.save!
}
#remove deleted invoices
#where.not(invoices.map(&:id)).destroy_all
end
def self.update(id)
# Update the item table
invoice = get_base.service.fetch_by_id(id)
qbo_invoice = find_or_create_by(id: id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.save!
end
end
-47
View File
@@ -1,47 +0,0 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QboPurchase < ActiveRecord::Base
unloadable
belongs_to :issues
belongs_to :qbo_customer
attr_accessible :description
validates_presence_of :id, :line_id, :description, :qbo_customer_id
def self.get_base
Qbo.get_base(:purchase)
end
def get_purchase(id)
get_base.service.find_by_id(id)
end
def self.sync
QboPurchase.get_base.service.all.each { |purchase|
purchase.line_items.all? { |line_item|
detail = line_item.account_based_expense_line_detail ? line_item.account_based_expense_line_detail : line_item.item_based_expense_line_detail
if detail.billable_status = "Billable"
qbo_purchase = find_or_create_by(id: purchase.id)
qbo_purchase.line_id = line_item.id
qbo_purchase.description = line_item.description
qbo_purchase.qbo_customer_id = detail.customer_ref
#TODO attach to issues
#qbo_purchase.issue_id = Issue.find_by_invoice()
qbo_purchase.save
end
}
}
end
end
-122
View File
@@ -1,122 +0,0 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Vehicle < ActiveRecord::Base
unloadable
belongs_to :customer
has_many :issues, :foreign_key => 'vehicles_id'
attr_accessible :year, :make, :model, :customer_id, :notes, :vin
validates_presence_of :customer
validates :vin, uniqueness: true
validates :year, numericality: { only_integer: true }
before_save :decode_vin
after_initialize :get_details
self.primary_key = :id
# returns a human readable string
def to_s
return "#{year} #{make} #{model}"
end
# returns the raw JSON details from EMUNDS
def details
return @details
end
# returns the style of the vehicle
def style
begin
return @details['years'][0]['styles'][0]['name'] if @details
rescue
return nil
end
end
# returns the drive of the vehicle i.e. 2 wheel, 4 wheel, ect.
def drive
return @details['drivenWheels'].to_s.upcase if @details
end
# returns the number of doors of the vehicle
def doors
return @details['numOfDoors'] if @details
end
# Force Upper Case for VIN numbers
def make=(val)
# The to_s is in case you get nil/non-string
write_attribute(:make, val.to_s.titleize)
end
# Force Upper Case for VIN numbers
def model=(val)
# The to_s is in case you get nil/non-string
write_attribute(:model, val.to_s.titleize)
end
# Force Upper Case for VIN numbers
def vin=(val)
# The to_s is in case you get nil/non-string
write_attribute(:vin, val.to_s.upcase)
end
private
# init method to pull JSON details from Edmunds
def get_details
if self.vin?
begin
@details = JSON.parse get_decoder.full(self.vin)
raise @details['message'] if @details['status'] == "NOT_FOUND"
raise @details['message'] if @details['status'] == "BAD_REQUEST"
rescue Exception => e
errors.add(:vin, e.message)
end
end
end
# returns the Edmunds decoder service
def get_decoder
#TODO API Code via Settings
return decoder = Edmunds::Vin.new('2dheutzvhxs28dzukx5tgu47')
end
# decodes a vin and updates self
def decode_vin
get_details
if @details
begin
self.year = @details['years'][0]['year']
self.make = @details['make']['name']
self.model = @details['model']['name']
rescue Exception => e
errors.add(:vin, e.message)
end
end
self.name = to_s
end
# makes a squishvin
# https://api.edmunds.com/api/vehicle/v2/squishvins/#{vin}/?fmt=json&api_key=#{ENV['edmunds_key']}
def vin_squish
if not self.vin? or self.vin.size < 11
# this is to go ahead and query the API, letting them handle the error. :P
return '1000000000A'
end
v = self.vin[0,11]
return v.slice(0,8) + v.slice(9,11)
end
end
+11
View File
@@ -0,0 +1,11 @@
<%= link_to t(:label_appointment), "https://calendar.google.com/calendar/render?action=TEMPLATE&text=#{@customer.name}+-&details=#{ link_to "Customer Details", "https://#{Setting.host_name}#{customer_path @customer.id}"}%0A#{@customer.primary_phone}&dates=#{Time.now.strftime("%Y%m%d")}T090000/#{Time.now.strftime("%Y%m%d")}T170000", target: :_blank %>
<br/>
<br/>
<%= link_to t(:label_create_estimate), "https://qbo.intuit.com/app/estimate?nameId=#{@customer.id}", target: :_blank %>
<br/>
<br/>
<%= button_to t(:label_edit_customer), edit_customer_path(@customer), method: :get%>
+37 -17
View File
@@ -1,40 +1,60 @@
<table> <table>
<tbody> <tbody>
<tr> <tr>
<th>Customer</th> <th><%=t(:label_name)%></th>
<td><%= customer.name %></td> <td><%= customer.name %></td>
</tr> </tr>
<tr> <tr>
<th>Email</th> <th><%=t(:label_email)%></th>
<td><%= customer.email %></td> <td><%= customer.email %></td>
</tr> </tr>
<tr> <tr>
<th>Primary Phone</th> <th><%=t(:label_primary_phone)%></th>
<td><%= customer.primary_phone %></td> <td><%= number_to_phone(customer.primary_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.primary_phone %></td>
</tr> </tr>
<tr> <tr>
<th>Mobile Phone</th> <th><%=t(:label_mobile_phone)%></th>
<td><%= customer.mobile_phone %></td> <td><%= number_to_phone(customer.mobile_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.mobile_phone %></td>
</tr>
<tr>
<th><%=t(:label_billing_address)%></th>
<td><%= @billing_address %></td>
</tr>
<tr>
<th><%=t(:label_shipping_address)%></th>
<td><%= @shipping_address %></td>
</tr> </tr>
<tr> <tr>
<th>Notes</th> <th><%=t(:label_account_balance)%></th>
<td><%= customer.notes %></td> <td>$<%= customer.balance %></td>
</tr> </tr>
<tr> <tr>
<th>Issues</th> <th colspan="2"><h4><%=t(:field_notes)%></hr></th>
<td><%= customer.issues.count %></td>
</tr> </tr>
<tr> <tr>
<td/> <td colspan="2">
<td> <pre id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit;">
<%= button_to "Edit Customer", edit_customer_path(customer), method: :get%> <%= customer.notes %>
</pre>
</td> </td>
</tr> </tr>
<script>
const preElement = document.getElementById('note-display');
// This takes the text, trims the edges, and puts it back
preElement.textContent = preElement.textContent.trim();
</script>
</tbody> </tbody>
</table> </table>
<br/>
<br/>
+16 -17
View File
@@ -5,48 +5,47 @@
<%= form_for @customer do |f| %> <%= form_for @customer do |f| %>
<div class="clearfix"> <div class="clearfix">
Display Name: <%=t(:label_display_name)%>
<div class="input"> <div class="input">
<%= f.text_field :name, :required => true %> <%= f.text_field :name, required: true, autocomplete: "off" %>
</div> </div>
</div> </div>
<div class="clearfix"> <div class="clearfix">
Phone Number: <%=t(:label_primary_phone)%>
<div class="input"> <div class="input">
<%= f.telephone_field :primary_phone %> <%= f.telephone_field :primary_phone, autocomplete: "off" %>
</div> </div>
</div> </div>
<div class="clearfix"> <div class="clearfix">
Mobile Phone Number: <%=t(:label_mobile_phone)%>:
<div class="input"> <div class="input">
<%= f.telephone_field :mobile_phone %> <%= f.telephone_field :mobile_phone, autocomplete: "off" %>
</div> </div>
</div> </div>
<div class="clearfix"> <div class="clearfix">
Email: <%=t(:label_email)%>:
<div class="input"> <div class="input">
<%= f.email_field :email %> <%= f.email_field :email, autocomplete: "off" %>
</div> </div>
</div> </div>
<div class="clearfix"> <div class="clearfix">
Notes: <%=t(:field_notes)%>:
<div class="input"> <div class="input">
<p> <p>
<%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @customer.new_record? %> <%= content_tag :span, id: "issue_description_and_toolbar" do %>
<%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@customer.new_record? ? nil : 'display:none') do %>
<%= f.text_area :notes, <%= f.text_area :notes,
:cols => 60, cols: 60,
:rows => 10, rows: 10,
:accesskey => accesskey(:edit), accesskey: accesskey(:edit),
:class => 'wiki-edit', class: 'wiki-edit',
:no_label => true %> no_label: true %>
<% end %> <% end %>
</p> </p>
<%= wikitoolbar_for 'issue_description' %> <%= wikitoolbar_for :issue_description %>
</div> </div>
</div> </div>
+5
View File
@@ -0,0 +1,5 @@
<%= form_tag(customers_path, method: "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_customers), autocomplete: "off" %>
<%= submit_tag t(:label_search) %>
<% end %>
<%= button_to t(:label_new_customer), new_customer_path, method: :get%>
+2
View File
@@ -0,0 +1,2 @@
<h3><%=t(:label_customers)%></h3>
<%= render partial: 'customers/search' %>
+2 -2
View File
@@ -1,3 +1,3 @@
<h1>Edit Customer</h1> <h1><%=t(:label_edit_customer)%></h1>
<br/> <br/>
<%= render :partial => 'customers/form' %> <%= render partial: 'customers/form' %>
@@ -0,0 +1 @@
$('select#issue_estimate_id').html('<%= j content_tag(:option,'',value:"")+options_from_collection_for_select(@filtered_estimates, :id, :doc_number) %>');
+18 -13
View File
@@ -1,19 +1,24 @@
<h1>Customers</h1> <h2><%=t(:field_customers)%> <span style="float:right"> <%= render partial: 'customers/search' %> </span> </h2>
<br/> <% if @customers.present? %>
<% @customers.each do |c| %> <br/>
<div class="row"> <% @customers.each do |c| %>
<div class="span6 columns"> <div class="row">
<fieldset> <div class="span6 columns">
<%= c.name %> <%= link_to c, customer_path(c.id) %>
<%= button_to "Show", customer_path(c.id), method: :get %> </div>
</fieldset>
</div> </div>
</div> <% end %>
<% end %>
<br/> <p><%=t(:label_matching)%> <%= @customers.count %> <%=t(:field_customers)%> </p>
<div class="actions"> <div class="actions">
<%= will_paginate @customers %> <%= will_paginate @customers %>
<%= button_to "New", new_customer_path, method: :get %> </div>
<% else %>
<p><%=t(:label_no_customers)%> <%= params[:search] %>.</p>
<% end %>
<div>
<%= render partial: 'qbo/stats' %>
</div> </div>
+2 -2
View File
@@ -1,3 +1,3 @@
<h1>New Customer</h1> <h2><%=t(:label_new_customer)%></h2>
<br/> <br/>
<%= render :partial => 'customers/form' %> <%= render partial: 'customers/form' %>
+52 -6
View File
@@ -1,7 +1,53 @@
<h1>Customer Detail</h1> <h2><%=t(:field_customer)%> #<%= @customer.id %> - <%= link_to @customer.to_s, "https://#{Setting.plugin_redmine_qbo[:sandbox] ? "sandbox" : "app"}.qbo.intuit.com/app/customerdetail?nameId=#{@customer.id}", target: :_blank %> </h2>
<br/> <div class="issue">
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
<div class="splitcontent">
<div class="splitcontentleft">
<h4><%=t(:label_details)%>:</h4>
<!-- Customer Info -->
<div class="splitcontent">
<div class="splitcontentleft">
<h4><%=t(:field_customer)%>:</h4>
<%= render partial: 'customers/details', locals: {customer: @customer} %>
</div>
<div class="splitcontentleft">
<h4><%=t(:label_actions)%>:</h4>
<%= render partial: 'customers/actions', locals: {customer: @customer} %>
</div>
</div>
<!-- QBO Info -->
<div class="splitcontent">
<div class="splitcontentleft">
<h4><%=t(:estimates)%>:</h4>
<%= render partial: 'estimates/list', locals: {customer: @customer} %>
</div>
<div class="splitcontentleft">
<h4><%=t(:label_invoices)%>:</h4>
<%= render partial: 'invoices/list', locals: {customer: @customer} %>
</div>
</div>
</div>
<div class="splitcontentleft">
<%= call_hook :show_customer_view_right, {customer: @customer} %>
</div>
</div>
</div>
<br/> <br/>
<%= render :partial => 'vehicles/list' %> <h3><%=@issues.open.count%> <%=t(:label_open_issues)%> - <%=@hours.round(1)%> <%=t(:label_hours)%></h3>
<br/> <%= render partial: 'issues/list_simple', locals: {issues: @issues.open} %>
<%= render :partial => 'issues/list_simple', locals: {issues: @issues} %>
<h3><%=@closed_issues.count%> <%=t(:label_closed_issues)%> - <%= @closed_hours.round(1)%> <%=t(:label_hours)%></h3>
<%= render partial: 'issues/list_simple', locals: {issues: @closed_issues} %>
+111
View File
@@ -0,0 +1,111 @@
<p style="float: right;"> <%= copy_object_url_link(request.url) %> </p>
<h2><%= issue_heading(@issue) %></h2>
<div class="<%= @issue.css_classes %> details">
<%= avatar(@issue.author, size: "50") %>
<div class="subject">
<%= render_issue_subject_with_tree(@issue) %>
<%=t(:label_customer_link_expires)%> <%= distance_of_time_in_words(Time.now, @token.expires_at) %>
</div>
<p class="author">
<%= authoring @issue.created_on, @issue.author %>.
<% if @issue.created_on != @issue.updated_on %>
<%= l(:label_updated_time, time_tag(@issue.updated_on)).html_safe %>.
<% end %>
</p>
<div class="attributes">
<%= issue_fields_rows do |rows|
rows.left l(:field_status), @issue.status.name, class: :status
rows.left l(:field_priority), @issue.priority.name, class: :priority
# unless @issue.disabled_core_fields.include?(:assigned_to_id)
# rows.left l(:field_assigned_to), avatar(@issue.assigned_to, size: "14").to_s.html_safe + (@issue.assigned_to ? @issue.assigned_to : "-"), class: 'assigned-to'
# end
unless @issue.disabled_core_fields.include?(:category_id) || (@issue.category.nil? && @issue.project.issue_categories.none?)
rows.left l(:field_category), (@issue.category ? @issue.category.name : "-"), class: :category
end
unless @issue.disabled_core_fields.include?(:fixed_version_id) || (@issue.fixed_version.nil? && @issue.assignable_versions.none?)
rows.left l(:field_fixed_version), (@issue.fixed_version ? @issue.fixed_version : "-"), class: 'fixed-version'
end
unless @issue.disabled_core_fields.include?(:start_date)
rows.right l(:field_start_date), format_date(@issue.start_date), class: 'start-date'
end
unless @issue.disabled_core_fields.include?(:due_date)
rows.right l(:field_due_date), format_date(@issue.due_date), class: 'due-date'
end
unless @issue.disabled_core_fields.include?(:done_ratio)
rows.right l(:field_done_ratio), progress_bar(@issue.done_ratio, legend: "#{@issue.done_ratio}%"), class: :progress
end
unless @issue.disabled_core_fields.include?(:estimated_hours)
if @issue.estimated_hours.present? || @issue.total_estimated_hours.to_f > 0
rows.right l(:field_estimated_hours), issue_estimated_hours_details(@issue), class: 'estimated-hours'
end
end
#if User.current.allowed_to_view_all_time_entries?(@project)
if @issue.total_spent_hours > 0
rows.right l(:label_spent_time), issue_spent_hours_details(@issue), class: 'spent-time'
end
#end
end %>
<%= render_full_width_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, issue: @issue) %>
</div>
<% if @issue.description? || @issue.attachments.any? -%>
<hr />
<% if @issue.description? %>
<div class="description">
<div class="contextual">
<%= link_to l(:button_quote), quoted_issue_path(@issue), remote: true, method: :post, class: 'icon icon-comment' if @issue.notes_addable? %>
</div>
<p><strong><%=l(:field_description)%></strong></p>
<div class="wiki">
<%= textilizable @issue, :description, attachments: @issue.attachments %>
</div>
</div>
<% end %>
<%= link_to_attachments @issue, thumbnails: true %>
<% end -%>
<%= call_hook(:view_issues_show_description_bottom, issue: @issue) %>
<% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %>
<hr />
<div id="issue_tree">
<div class="contextual">
<%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %>
</div>
<p><strong><%=l(:label_subtask_plural)%></strong></p>
<%= render_descendants_tree(@issue) unless @issue.leaf? %>
</div>
<% end %>
<% if @relations.present? || User.current.allowed_to?(:manage_issue_relations, @project) %>
<hr />
<div id="relations">
<%= render partial: 'issues/relations' %>
</div>
<% end %>
</div>
<% if @changesets.present? %>
<div id="issue-changesets">
<h3><%=l(:label_associated_revisions)%></h3>
<%= render partial: 'issues/changesets', locals: { changesets: @changesets} %>
</div>
<% end %>
<% if @journals.present? %>
<div id="history">
<h3><%=l(:label_history)%></h3>
<%= render partial: 'issues/history', locals: { issue: @issue, journals: @journals } %>
</div>
<% end %>
<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
+11
View File
@@ -0,0 +1,11 @@
<% if @customer.present? %>
<% @customer.estimates.order(id: :desc).each do |estimate| %>
<div class="row">
<b><%= link_to "##{estimate.doc_number}", estimate_path(estimate), target: :_blank %></b> <%= estimate.txn_date %>
</div>
<% end %>
<% else %>
<p><%=t(:label_no_estimates)%>.</p>
<% end %>
+4
View File
@@ -0,0 +1,4 @@
<%= form_tag(estimate_doc_path, method: "get") do %>
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_estimates), autocomplete: "off" %>
<%= submit_tag t(:label_search), formtarget: "_blank" %>
<% end %>
+2
View File
@@ -0,0 +1,2 @@
<h3><%=t(:label_estimates) %></h3>
<%= render partial: 'estimates/search' %>
+28
View File
@@ -0,0 +1,28 @@
<% if @customer.present? %>
<%= form_with(url: invoice_path, method: :get) do |form| %>
<% if @customer.invoices.count > 1 %>
<div class="form-check">
<%= check_box_tag "select-all-invoices", "1", false, id: "select-all-invoices" %>
<%= label_tag "select-all-invoices", t(:label_select_all) %>
</div>
<hr>
<% end %>
<% @customer.invoices.order(id: :desc).each do |invoice| %>
<div class="row">
<%= check_box_tag "invoice_ids[]", invoice.id, false, class: "invoice-checkbox" %>
<b><%= link_to "##{invoice.doc_number}", invoice_path(invoice), target: :_blank %></b> <%= invoice.txn_date %>
</div>
<% end %>
<% if @customer.invoices.count > 1 %>
<%= form.submit t(:button_bulk_pdf) %>
<% end %>
<% end %>
<% else %>
<p><%=t(:label_no_invoices)%>.</p>
<% end %>
+9
View File
@@ -0,0 +1,9 @@
<p>
<label for="issue_customer"><%= t(:customer) %></label>
<%= search_customer %>
<%= customer_id %>
</p>
<p>
<%= select_estimate %>
</p>
+35
View File
@@ -0,0 +1,35 @@
<% reply_links = issue.notes_addable? -%>
<% for journal in journals %>
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
<div id="note-<%= journal.indice %>">
<div class="contextual">
<span class="journal-actions"><%= render_journal_actions(issue, journal, reply_links: reply_links) %></span>
<a href="#note-<%= journal.indice %>" class="journal-link">#<%= journal.indice %></a>
</div>
<h4>
<%= avatar(journal.user, size: "24") %>
<%= authoring journal.created_on, journal.user, label: :label_updated_time_by %>
<%= render_private_notes_indicator(journal) %>
</h4>
<% if journal.details.any? %>
<ul class="details">
<% details_to_strings(journal.visible_details).each do |string| %>
<li><%= string %></li>
<% end %>
</ul>
<% if Setting.thumbnails_enabled? && (thumbnail_attachments = journal_thumbnail_attachments(journal)).any? %>
<div class="thumbnails">
<% thumbnail_attachments.each do |attachment| %>
<div><%= thumbnail_tag(attachment) %></div>
<% end %>
</div>
<% end %>
<% end %>
<%= render_notes(issue, journal, reply_links: reply_links) unless journal.notes.blank? %>
</div>
</div>
<%= call_hook(:view_issues_history_journal_bottom, { journal: journal }) %>
<% end %>
<% heads_for_wiki_formatter if User.current.allowed_to?(:edit_issue_notes, issue.project) || User.current.allowed_to?(:edit_own_issue_notes, issue.project) %>
+29
View File
@@ -0,0 +1,29 @@
<% if issues && issues.any? %>
<%= form_tag({}) do %>
<table class="list issues">
<thead><tr>
<th>#</th>
<th><%=l(:field_project)%></th>
<th><%=l(:field_tracker)%></th>
<th><%=l(:field_subject)%></th>
</tr></thead>
<tbody>
<% for issue in issues %>
<tr id="issue-<%= h(issue.id) %>" class="hascontextmenu <%= cycle(:odd, :even) %> <%= issue.css_classes %>">
<td class="id">
<%= check_box_tag("ids[]", issue.id, false, style: 'display:none;', id: nil) %>
<%= link_to(issue.id, issue_path(issue)) %>
</td>
<td class="project"><%= link_to_project(issue.project) %></td>
<td class="tracker"><%= issue.tracker %></td>
<td class="subject">
<%= link_to(issue.subject.truncate(60), issue_path(issue)) %> (<%= issue.status %>)
</td>
</tr>
<% end %>
</tbody>
</table>
<% end %>
<% else %>
<p class="nodata"><%= l(:label_no_data) %></p>
<% end %>
+22
View File
@@ -0,0 +1,22 @@
<div class="splitcontent">
<div class="splitcontentleft">
<div class="customer_id attribute">
<div class="label"><span><%=t(:field_customer)%></span>:</div>
<div class="value"><%= customer %></div>
</div>
<div class="estimate_id attribute">
<div class="label"><span><%=t(:field_estimate)%></span>:</div>
<div class="value"><%= estimate_link %></div>
</div>
<div class="invoice_id attribute">
<div class="label"><span><%=t(:field_invoice)%></span>:</div>
<div class="value"><%= invoice_link %></div>
</div>
</div>
<div class="splitcontentleft">
<%= call_hook :show_issue_view_right, {issue: issue} %>
</div>
</div>
-1
View File
@@ -1 +0,0 @@
<%= flash.now[:error] = "Not Authorized" %>
+1
View File
@@ -0,0 +1 @@
<b><%=t(:label_last_sync)%>: </b> <%= Qbo.last_sync if Qbo.exists? %>
+79 -26
View File
@@ -1,7 +1,7 @@
<!-- <!--
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 rick barrette Copyright (c) 2016 - 2026 rick barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -10,49 +10,102 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--> -->
<!-- somewhere in your document include the Javascript -->
<script type="text/javascript" src="https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js"></script>
<!-- configure the Intuit object: 'grantUrl' is a URL in your application which kicks off the flow, see below -->
<script>
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_authenticate_path %>'});
</script>
<table > <table >
<tbody> <tbody>
<tr> <tr>
<th>OAuth Consumer Key</th> <th><%=t(:label_client_id)%></th>
<td> <td>
<input type="text" style="width:350px" id="settingsOAuthConsumerKey" <input
value="<%= settings['settingsOAuthConsumerKey'] %>" type="text"
name="settings[settingsOAuthConsumerKey]" > style="width:350px"
id="settingsOAuthConsumerKey"
value="<%= settings['settingsOAuthConsumerKey'] %>"
name="settings[settingsOAuthConsumerKey]" >
</td> </td>
</tr> </tr>
<tr> <tr>
<th>OAuth Consumer Secret</th> <th><%=t(:label_client_secret)%></th>
<td> <td>
<input type="text" style="width:350px" id="settingsOAuthConsumerSecret" <input
value="<%= settings['settingsOAuthConsumerSecret'] %>" type="text"
name="settings[settingsOAuthConsumerSecret]" > style="width:350px"
id="settingsOAuthConsumerSecret"
value="<%= settings['settingsOAuthConsumerSecret'] %>"
name="settings[settingsOAuthConsumerSecret]" >
</td>
</tr>
<tr>
<th><%=t(:label_webhook_token)%></th>
<td>
<input
type="text"
style="width:350px"
id="settingsWebhookToken"
value="<%= settings['settingsWebhookToken'] %>"
name="settings[settingsWebhookToken]" >
</td> </td>
</tr> </tr>
</tbody> <tr>
</table> <th><%=t(:label_sandbox)%></th>
<td>
<br/> <%= check_box_tag 'settings[sandbox]', @settings[:sandbox], @settings[:sandbox] %>
</td>
<table> </tr>
<tbody>
<tr> <tr>
<th>Token Expires At</th> <th><%=t(:label_oauth_expires)%></th>
<td><%= if Qbo.exists? then Qbo.first.token_expires_at end %> <td><%= if Qbo.exists? then Qbo.first.oauth2_access_token_expires_at end %>
</tr> </tr>
<tr> <tr>
<th>Reconnect Token At</th> <th><%=t(:label_oauth2_refresh_token_expires_at)%></th>
<td><%= if Qbo.exists? then Qbo.first.reconnect_token_at end %> <td><%= if Qbo.exists? then Qbo.first.oauth2_refresh_token_expires_at end %>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<br/> <br/>
Note: You need to authenticate after saving your key and secret above <%=t(:label_oauth_note)%>
<br/> <br/>
<br/>
<%= link_to "Authenticate", qbo_authenticate_path, :method => :get %>
<!-- this will display a button that the user clicks to start the flow -->
<ipp:connectToIntuit></ipp:connectToIntuit>
<br/>
<br/>
<div>
<b><%=t(:label_customer_count)%>:</b> <%= Customer.count%>
</div>
<div>
<b><%=t(:label_employee_count)%>:</b> <%= Employee.count %>
</div>
<div>
<b><%=t(:label_invoice_count)%>:</b> <%= Invoice.count %>
</div>
<div>
<b><%=t(:label_estimate_count)%>:</b> <%= Estimate.count %>
</div>
<br/>
<div>
<b><%=t(:label_last_sync)%> </b> <%= Qbo.last_sync if Qbo.exists? %> <%= link_to t(:label_sync_now), qbo_sync_path %>
</div>
+6
View File
@@ -0,0 +1,6 @@
<% if User.current.logged? %>
<%= render partial: 'customers/sidebar' %>
<%= render partial: 'estimates/sidebar' %>
<% end %>
+1
View File
@@ -0,0 +1 @@
<%= Customer.count %> <%=t(:field_customers)%> - <%= render partial: 'qbo/last_sync' %>
+1 -2
View File
@@ -1,7 +1,7 @@
<!-- <!--
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 rick barrette Copyright (c) 2016 - 2026 rick barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -30,4 +30,3 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= authenticate_vendors_url %>'}); intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= authenticate_vendors_url %>'});
</script> </script>
</body> </body>
-55
View File
@@ -1,55 +0,0 @@
<!--
The MIT License (MIT)
Copyright (c) 2016 rick barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-->
<body>
<h1> Redmine Quickbooks</h1>
<%= form_for @qbo do |f|%>
<div>
<%= f.label "Customer Count:"+@customer_count.to_s%>
<br/>
<%= f.select :customer_id, Customer.all.pluck(:name, :id).sort, :selected => @selected_customer, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Item Count: "+@qbo_item_count.to_s %>
<br/>
<%= f.select :qbo_item_id, QboItem.all.pluck(:name, :id).sort.reverse, :selected => @selected_item, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Employee Count: "+@qbo_employee_count.to_s %>
<br/>
<%= f.select :qbo_employee_id, QboEmployee.all.pluck(:name, :id).sort, :selected => @selected_employee, include_blank: true %>
</div>
<p>
<%= f.label "Invoice Count: "+@qbo_invoice_count.to_s %>
<br/>
<%=f.select :qbo_invoice_id, QboInvoice.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => @selected_invoice, include_blank: true%>
</p>
<p>
<%= f.label "Estimate Count: "+@qbo_estimate_count.to_s %>
<br/>
<%=f.select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => @selected_estimate, include_blank: true%>
</p>
<% end %>
<br/>
<br/>
<%= link_to "Sync", qbo_sync_path %>
</body>
+1 -1
View File
@@ -1,7 +1,7 @@
<!-- <!--
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 rick barrette Copyright (c) 2016 - 2026 rick barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -1,7 +1,7 @@
<!-- <!--
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 rick barrette Copyright (c) 2016 - 2026 rick barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -10,8 +10,4 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--> -->
<body> <h2>QboController#webhook</h2>
<h2>QboController#sync</h2>
</body>
-52
View File
@@ -1,52 +0,0 @@
<table>
<tbody>
<tr>
<th>Customer</th>
<td><%= vehicle.customer.name %></td>
</tr>
<tr>
<th>Vehicle</th>
<td><%= vehicle.to_s %></td>
</tr>
<tr>
<th>VIN</th>
<td><%= vehicle.vin %></td>
</tr>
<tr>
<th>Style</th>
<td><%= vehicle.style %></td>
</tr>
<tr>
<th>Drive</th>
<td><%= vehicle.drive %></td>
</tr>
<tr>
<th>Doors</th>
<td><%= vehicle.doors %></td>
</tr>
<tr>
<th>Notes</th>
<td><%= vehicle.notes %></td>
</tr>
<tr>
<th>Issues</th>
<td><%= vehicle.issues.count %></td>
</tr>
<tr>
<td/>
<td>
<%= button_to "Edit", edit_vehicle_path(vehicle), method: :get%>
<%= button_to "Delete", vehicle, method: :delete, data: {confirm: "You sure?"} %>
</td>
</tr>
</tbody>
</table>
-2
View File
@@ -1,2 +0,0 @@
<%= @f.collection_select :vehicle_id, @customer.vehicles.order(:year), :id, :vin, include_blank: true, :selected => @vehicle%>
Partial Test
-66
View File
@@ -1,66 +0,0 @@
<div class="row">
<div class="span6 columns">
<fieldset>
<%= form_for @vehicle do |f| %>
<div class="clearfix">
Customer:
<div class="input">
<%= f.collection_select :customer_id, @customers, :id, :name, include_blank: true, :selected => @customer, :required => true%>
</div>
</div>
<div class="clearfix">
Year:
<div class="input">
<%= f.number_field :year %>
</div>
</div>
<div class="clearfix">
Make:
<div class="input">
<%= f.text_field :make %>
</div>
</div>
<div class="clearfix">
Model:
<div class="input">
<%= f.text_field :model %>
</div>
</div>
<div class="clearfix">
VIN:
<div class="input">
<%= f.text_field :vin %>
</div>
</div>
<div class="clearfix">
Notes:
<div class="input">
<p>
<%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @vehicle.new_record? %>
<%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@vehicle.new_record? ? nil : 'display:none') do %>
<%= f.text_area :notes,
:cols => 60,
:rows => 10,
:accesskey => accesskey(:edit),
:class => 'wiki-edit',
:no_label => true %>
<% end %>
</p>
<%= wikitoolbar_for 'issue_description' %>
</div>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</fieldset>
</div>
</div>
-20
View File
@@ -1,20 +0,0 @@
<% @vehicles.each do |vehicle| %>
<div class="row">
<div class="span6 columns">
<fieldset>
<%= vehicle.to_s %>
<br/>
<div style="float: right;" >
<%= button_to "More", vehicle_path(vehicle), method: :get %>
</div>
</fieldset>
</div>
</div>
<% end %>
<br/>
<div class="actions">
<%= will_paginate @vehicles %>
<%= button_to "New Vehicle", new_vehicle_path, method: :get %>
</div>
-3
View File
@@ -1,3 +0,0 @@
<h1>Edit Customer Vehicle</h1>
<br/>
<%= render :partial => 'vehicles/form' %>
-3
View File
@@ -1,3 +0,0 @@
<h1>Customer Vehicles</h1>
<br/>
<%= render :partial => 'vehicles/list' %>
-3
View File
@@ -1,3 +0,0 @@
<h1>New Customer Vehicle</h1>
<br/>
<%= render :partial => 'vehicles/form' %>
-8
View File
@@ -1,8 +0,0 @@
<h1>Customer Vehicle</h1>
<br/>
<div style="text-align: left; width:90%;">
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
<%= render :partial => 'issues/list_simple', locals: {issues: @vehicle.issues} %>
</div>
+11
View File
@@ -0,0 +1,11 @@
$(function() {
$("input#issue_customer_id").on("change", function() {
$.ajax({
url: "/filter_estimates_by_customer",
type: "GET",
data: { selected_customer: $("input#issue_customer_id").val() }
});
});
});
+1
View File
@@ -0,0 +1 @@
!function(t){t.fn.railsAutocomplete=function(e){var a=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};if(void 0!==t.fn.on){if(!e)return;return t(document).on("focus",e,a)}return this.live("focus",a)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.options={showNoMatches:!0,noMatchesLabel:"no existing match"},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("data-min-length")||t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,r){var n=this.element[0],o={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){o[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),o,function(){var a={};t.extend(a,t.railsAutocomplete.options),t.each(a,function(i,r){if(a.hasOwnProperty(i)){var n=t(e).attr("data-"+i);a[i]=n?n:r}}),0==arguments[0].length&&t.inArray(a.showNoMatches,[!0,"true"])>=0&&(arguments[0]=[],arguments[0][0]={id:"",label:a.noMatchesLabel}),t(arguments[0]).each(function(a,i){var r={};r[i.id]=i,t(e).data(r)}),r.apply(null,arguments),t(n).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:"").trigger("change"),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),r=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var n in i){var o=t(i[n]);o.is(":checkbox")?null!=r[n]&&o.prop("checked",r[n]):o.val(a.item?r[n]:"").trigger("change")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,r){if(r.item.value=r.item.value.toString(),-1!=r.item.value.toLowerCase().indexOf("no match")||-1!=r.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",r),!1;var n=a(this.value);if(n.pop(),n.push(r.item.value),null!=e.delimiter)n.push(""),this.value=n.join(e.delimiter);else if(this.value=n.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(r.item.id).trigger("change"),t(this).attr("data-update-elements")){var o=r.item,l=-1!=r.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?o[s]===!0||1===o[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):l&&o[s]&&-1==o[s].indexOf("Create New")||!l?t(u[s]).val(o[s]).trigger("change"):t(u[s]).val("").trigger("change")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val("").trigger("change"),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",r),!1}}),t(e).trigger("railsAutocomplete.init")}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete("input[data-autocomplete]")})}(jQuery);
+17
View File
@@ -0,0 +1,17 @@
document.addEventListener('DOMContentLoaded', () => {
const select_all_invoice = document.getElementById('select-all-invoices');
const invoices = document.querySelectorAll('.invoice-checkbox');
if (select_all_invoice) {
select_all_invoice.addEventListener('change', (e) => {
invoices.forEach(item => item.checked = e.target.checked);
});
}
invoices.forEach(item => {
item.addEventListener('change', () => {
const allChecked = Array.from(invoices).every(i => i.checked);
select_all_invoice.checked = allChecked;
});
});
});
-3
View File
@@ -1,3 +0,0 @@
Edmunds::Api.configure do |config|
config.api_key = '2dheutzvhxs28dzukx5tgu47'
end
+88 -8
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -9,13 +9,93 @@
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# English strings go here for Rails i18n # English strings go here for Rails i18n
# Usage I18n.t(:label)
en: en:
# my_label: "My label"
field_customer: "Customer" field_customer: "Customer"
field_qbo_item: "Item" field_employee: "Employee"
field_qbo_employee: "Employee" field_invoice: "Invoice"
field_qbo_invoice: "Invoice" field_estimate: "Estimate"
field_qbo_estimate: "Estimate"
field_vehicles: "Vehicle"
field_vin: "VIN"
field_notes: "Notes" field_notes: "Notes"
field_billed: "Billed"
label_week: "Week"
label_search_estimates: "Search Estimates"
label_search: "Search"
label_estimates: "Estimates"
warn_ru_sure: "You sure?"
label_delete: "Delete"
label_edit: "Edit"
label_year: "Year"
label_make: " Make"
label_model: "Model"
label_no_customers: "There are no customers containing the term(s)"
label_matching: "Matching "
label_open_issues: "Open Issues"
label_closed_issues: "Closed Issues"
label_sync: "Sync"
label_new_customer: "New Customer"
label_search_customers: "Search Customers"
label_customers: "Customers"
label_edit_customer: "Edit Customer"
label_email: "Email"
label_primary_phone: "Primary Phone"
label_mobile_phone: "Mobile Phone"
label_billing_address: "Billing Address"
label_shipping_address: "Shipping Address"
label_account_balance: "Account Balance"
label_balance_with_jobs: "Balance With Jobs"
label_display_name: "Display Name"
label_details: "Details"
label_customer_link_expires: "This customer link expires in"
label_amount: "Amount"
label_deposit_into: "Deposit to Account"
label_last_sync: "Last Sync"
label_redmine_qbo: "Redmine Quickbooks"
label_customer_count: "Customer Count"
label_invoice_count: "Invoice Count"
label_estimate_count: "Estimate Count"
label_employee_count: "Employee Count"
label_client_id: "Intuit QBO OAuth2 Client ID"
label_client_secret: "Intuit QBO OAuth2 Client Secret"
label_webhook_token: "Intuit QBO Webhook Token"
label_oauth_expires: "OAuth2 Access Token Expires At"
label_oauth_note: "Note: You need to authenticate with Quickbooks after saving your key and secret above"
field_customers: "Customers"
label_no_estimates: "No Estimates"
label_no_invoices: "No Invoices"
label_invoices: "Invoices"
label_load_customer: "Load Customer"
label_door: "Door"
label_trim: "Trim"
label_bill_time: "Bill Time"
label_share: "Share"
label_sync_now: "Sync Now"
label_invoice_404: "Invoice not found"
label_estimate_404: "Estimate not found"
label_connected: "Successfully connected to Quickbooks"
label_error: "Error"
label_billed_success: "Successfully Billed "
label_billing_error: "Cannot bill without a customer assigned"
label_qbo_sync_success: "Successfully synced to Quickbooks"
label_hours: "Hours"
label_oauth2_refresh_token_expires_at: "Refresh Token Expires At"
label_name: "Name"
label_appointment: "Add Appointment"
label_actions: "Actions"
label_create_estimate: "Create Estimate"
label_syncing: "Syncing Quickbooks"
label_sandbox: "Sandbox"
button_bulk_pdf: "Bulk PDF"
label_select_all: "Select All"
notice_customer_created: "Customer created in Quickbooks"
notice_customer_updated: "Customer updated in Quickbooks"
notice_customer_not_found: "Customer not found in Quickbooks"
notice_customer_not_deleted: "Customer could not be deleted in Quickbooks"
notice_customer_deleted: "Customer deleted in Quickbooks"
notice_estimate_created: "Estimate created in Quickbooks"
notice_estimate_updated: "Estimate updated in Quickbooks"
notice_estimate_not_found: "Estimate not found"
notice_invoice_created: "Invoice created in Quickbooks"
notice_invoice_updated: "Invoice updated in Quickbooks"
notice_invoice_not_found: "Invoice not found"
notice_forbidden: "You do not have permission to access this resource"
notice_issue_not_found: "Issue not found"
+30 -12
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,14 +8,32 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Plugin's routes #authentication
# See: http://guides.rubyonrails.org/routing.html get 'qbo/authenticate', to: 'qbo#authenticate'
# get 'qbo/oauth_callback', to: 'qbo#oauth_callback'
get 'qbo', :to=> 'qbo#index'
get 'qbo/authenticate', :to => 'qbo#authenticate' #manual sync
get 'qbo/oauth_callback', :to => 'qbo#oauth_callback' get 'qbo/sync', to: 'qbo#sync'
get 'qbo/sync', :to => 'qbo#sync'
get 'qbo/estimate/:id', :to => 'estimate#show', as: :estimate #webhook
get 'qbo/invoice/:id', :to => 'invoice#show', as: :invoice post 'qbo/webhook', to: 'qbo#webhook'
resources :vehicles
resources :customers # Estimate & Invoice PDF
get 'estimates/:id', to: 'estimate#show', as: :estimate
get 'estimates/doc/', to: 'estimate#doc', as: :estimate_doc
get 'invoices/:id', to: 'invoice#show', as: :invoice
#manual billing
get 'bill/:id', to: 'qbo#bill', as: :bill
#customer issue view
get 'customers/view/:token', to: 'customers#view', as: :view
get 'customers/share/:id', to: 'customers#share', as: :share
#java script routes
get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer'
get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer'
resources :customers do
get :autocomplete_customer_name, on: :collection
end
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQbos < ActiveRecord::Migration class CreateQbos < ActiveRecord::Migration[5.1]
def change def change
create_table :qbos do |t| create_table :qbos do |t|
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboCustomers < ActiveRecord::Migration class CreateQboCustomers < ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_customers, id: false do |t| create_table :qbo_customers, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.string :name t.string :name
end end
end end
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateIssues < ActiveRecord::Migration class UpdateIssues < ActiveRecord::Migration[5.1]
def change def change
add_reference :issues, :qbo_customer, index: true add_reference :issues, :qbo_customer, index: true
add_reference :issues, :qbo_item, index: true add_reference :issues, :qbo_item, index: true
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboItems < ActiveRecord::Migration class CreateQboItems < ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_items, id: false do |t| create_table :qbo_items, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.string :name t.string :name
end end
end end
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboEmployees < ActiveRecord::Migration class CreateQboEmployees < ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_employees, id: false do |t| create_table :qbo_employees, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.string :name t.string :name
end end
end end
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateUsers < ActiveRecord::Migration class UpdateUsers < ActiveRecord::Migration[5.1]
def change def change
add_reference :users, :qbo_employee, index: true add_reference :users, :qbo_employee, index: true
end end
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,8 +8,8 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateTimeEntries < ActiveRecord::Migration class UpdateTimeEntries < ActiveRecord::Migration[5.1]
def change def change
add_column :time_entries, :qbo_billed, :boolean, :default => false add_column :time_entries, :qbo_billed, :boolean, default: false
end end
end end
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboEstimates < ActiveRecord::Migration class CreateQboEstimates < ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_estimates, id: false do |t| create_table :qbo_estimates, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.string :doc_number t.string :doc_number
end end
end end
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateQbos < ActiveRecord::Migration class UpdateQbos < ActiveRecord::Migration[5.1]
def change def change
rename_column :qbos, :token, :qb_token rename_column :qbos, :token, :qb_token
rename_column :qbos, :secret, :qb_secret rename_column :qbos, :secret, :qb_secret
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateIssuesWithEstimates < ActiveRecord::Migration class UpdateIssuesWithEstimates < ActiveRecord::Migration[5.1]
def change def change
add_reference :issues, :qbo_estimate, index: true add_reference :issues, :qbo_estimate, index: true
end end
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboInvoices < ActiveRecord::Migration class CreateQboInvoices < ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_invoices, id: false do |t| create_table :qbo_invoices, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.string :doc_number t.string :doc_number
end end
end end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateIssuesWithInvoices< ActiveRecord::Migration class UpdateIssuesWithInvoices< ActiveRecord::Migration[5.1]
def change def change
add_reference :issues, :qbo_invoice, index: true add_reference :issues, :qbo_invoice, index: true
end end
+3 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,10 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateQboPurchases< ActiveRecord::Migration class CreateQboPurchases< ActiveRecord::Migration[5.1]
def change def change
create_table :qbo_purchases, id: false do |t| create_table :qbo_purchases, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY' t.integer :id, options: 'PRIMARY KEY'
t.integer :line_id t.integer :line_id
t.string :description t.string :description
t.integer :customer_id t.integer :customer_id
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateCustomers < ActiveRecord::Migration class UpdateCustomers < ActiveRecord::Migration[5.1]
def change def change
add_reference :qbo_customers, :qbo_purchase, index: true add_reference :qbo_customers, :qbo_purchase, index: true
end end
+2 -2
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateQboPurchases < ActiveRecord::Migration class UpdateQboPurchases < ActiveRecord::Migration[5.1]
def change def change
rename_column :qbo_purchases, :customer_id, :qbo_customer_id rename_column :qbo_purchases, :customer_id, :qbo_customer_id
end end
+2 -3
View File
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,9 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class QbocustomersToCustomers< ActiveRecord::Migration class QbocustomersToCustomers< ActiveRecord::Migration[5.1]
def change def change
rename_table :qbo_customers, :customers rename_table :qbo_customers, :customers
rename_column :issues, :qbo_customer_id, :customer_id rename_column :issues, :qbo_customer_id, :customer_id
rename_column :vehicles, :qbo_customer_id, :customer_id
end end
end end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,7 +8,7 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateQbosTimeStamp < ActiveRecord::Migration class UpdateQbosTimeStamp < ActiveRecord::Migration[5.1]
def change def change
add_column :qbos, :last_sync, :datetime add_column :qbos, :last_sync, :datetime
end end
+27
View File
@@ -0,0 +1,27 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class AddIssuesQboInvoices < ActiveRecord::Migration[5.1]
def self.up
create_table :issues_qbo_invoices, id: false do |t|
t.references :issue
t.references :qbo_invoice
end
add_index :issues_qbo_invoices, [:issue_id, :qbo_invoice_id], unique: true
# Now populate it with a SQL one-liner!
execute "insert into issues_qbo_invoices(issue_id, qbo_invoice_id) select id, qbo_invoice_id from issues"
end
def self.down
drop_table :issues_qbo_invoices
end
end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,8 +8,8 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateIssuesWithVehicles < ActiveRecord::Migration class UpdateIssuesRemoveInvoice < ActiveRecord::Migration[5.1]
def change def change
add_reference :issues, :vehicles, index: true remove_reference :issues, :qbo_invoice
end end
end end
+19
View File
@@ -0,0 +1,19 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateCustomerTokens < ActiveRecord::Migration[5.1]
def change
create_table :customer_tokens do |t|
t.string :token
t.timestamp :expires_at
t.references :issue
end
end
end
@@ -0,0 +1,16 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateInvoicesAndEstimates < ActiveRecord::Migration[5.1]
def change
add_reference :qbo_invoices, :customer, index: true
add_reference :qbo_estimates, :customer, index: true
end
end
+26
View File
@@ -0,0 +1,26 @@
#The License
#
#Copyright (c) 2016 - 2026 Rick Barrette - All Rights Reserved
#
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
#
#Proprietary and confidential
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class CreateLineItems < ActiveRecord::Migration[5.1]
def change
create_table :line_items do |t|
t.integer :item_id
t.float :amount
t.string :description
t.float :unit_price
t.float :quantity
t.boolean :billed
end
add_reference :line_items, :issues, index: true
end
end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,8 +8,8 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateVehicles < ActiveRecord::Migration class AddCustomersPhoneNumber < ActiveRecord::Migration[5.1]
def change def change
add_column :vehicles, :name, :text add_column :customers, :phone_number, :string
end end
end end
@@ -0,0 +1,15 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class AddCustomersMobilePhoneNumber < ActiveRecord::Migration[5.1]
def change
add_column :customers, :mobile_phone_number, :string
end
end
+17
View File
@@ -0,0 +1,17 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateQbosTypes < ActiveRecord::Migration[5.1]
def change
change_column :qbos, :qb_token, :text
change_column :qbos, :qb_secret, :text
end
end
+17
View File
@@ -0,0 +1,17 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class UpdateQbosToken < ActiveRecord::Migration[5.1]
def change
add_column :qbos, :token, :text
add_column :qbos, :expire, :datetime
end
end
+18
View File
@@ -0,0 +1,18 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class RemoveQbosKeys < ActiveRecord::Migration[5.1]
def change
remove_column :qbos, :qb_secret
remove_column :qbos, :token_expires_at
remove_column :qbos, :reconnect_token_at
remove_column :qbos, :qb_token
end
end
+55
View File
@@ -0,0 +1,55 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class AddTxnDates < ActiveRecord::Migration[5.1]
def change
begin
add_column :qbo_invoices, :txn_date, :date
add_column :qbo_estimates, :txn_date, :date
reversible do |direction|
direction.up {
break unless Qbo.first
QboEstimate.reset_column_information
QboInvoice.reset_column_information
say "Sync Estimates"
QboEstimate.sync
say "Sync Invoices"
qbo = Qbo.first
invoices = qbo.perform_authenticated_request do |access_token|
service = Quickbooks::Service::Invoice.new(company_id: qbo.realm_id, access_token: access_token)
service.all
end
return unless invoices
invoices.each { |invoice|
# Load the invoice into the database
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.id = invoice.id
qbo_invoice.customer_id = invoice.customer_ref
qbo_invoice.txn_date = invoice.txn_date
qbo_invoice.save!
}
}
end
rescue
logger.error "AddTxnDates Failed"
end
end
end
+17
View File
@@ -0,0 +1,17 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class RemoveQboItems < ActiveRecord::Migration[5.1]
def change
drop_table :qbo_items
drop_table :qbo_purchases
drop_table :line_items
end
end
+22
View File
@@ -0,0 +1,22 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 - 2026 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class DropQboPrefix < ActiveRecord::Migration[5.1]
def change
rename_table :qbo_invoices, :invoices
rename_table :qbo_estimates, :estimates
rename_table :qbo_employees, :employees
rename_table :issues_qbo_invoices, :invoices_issues
rename_column :issues, :qbo_estimate_id, :estimate_id
rename_column :users, :qbo_employee_id, :employee_id
rename_column :invoices_issues, :qbo_invoice_id, :invoice_id
end
end
@@ -1,6 +1,6 @@
#The MIT License (MIT) #The MIT License (MIT)
# #
#Copyright (c) 2016 rick barrette #Copyright (c) 2016 - 2026 rick barrette
# #
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: #Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# #
@@ -8,10 +8,8 @@
# #
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module ActiveSupport::Callbacks::ClassMethods class RemoveQboTimeEntries < ActiveRecord::Migration[5.1]
def without_callback(*args, &block) def change
skip_callback(*args) rename_column :time_entries, :qbo_billed, :billed
yield
set_callback(*args)
end end
end end

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