711 Commits
0.4.0 ... 1.1.3

Author SHA1 Message Date
c821774e9b Version 1.1.3 2022-03-09 23:17:38 -05:00
47a19a7e77 Removed Qbo index & sync html, methods, & routes
This stuff isn't really used for anything
2022-03-09 23:06:54 -05:00
a75f1abd71 Removed extra white spaces 2022-03-09 22:53:03 -05:00
09c497ff96 Removed old #attr_accessible... comments 2022-03-09 22:31:19 -05:00
cae1d9de02 Removed old commented out code 2022-03-09 22:27:33 -05:00
1050a4f6a7 Use rails router, not hard coded links 2022-03-09 22:18:47 -05:00
be4ef44c13 Added strings for Flash messages, not used yet 2022-03-09 22:10:16 -05:00
89e4132fc1 Update readme & comments 2022-03-09 21:51:06 -05:00
8d8201822b No longer need to prepend("Qbo") 2022-03-09 21:45:07 -05:00
726eb4632e use plural for routes 2022-03-09 21:43:08 -05:00
ffcb2ee608 Remove payment orphans 2022-03-09 21:40:40 -05:00
24f8be6e80 Drop the Qbo prefix 2022-03-09 21:31:56 -05:00
08fa4aefc4 Added button text to locale file 2022-03-09 19:09:37 -05:00
13bbd5dfc1 Use rails router, not hard coded links 2022-03-09 19:05:12 -05:00
8e6eeab680 Moved HTML code into partial _from_hook.html.erb 2022-03-09 18:55:44 -05:00
70d9d5063a Moved issues show details to issue folder 2022-03-09 18:25:07 -05:00
374429f161 Added 2016 2022-03-08 20:50:39 -05:00
c69666e747 Added first year 2022-03-08 20:49:55 -05:00
7dc04b4a07 QboItem doesn’t exist anymore 2022-03-08 20:30:52 -05:00
7b5e54aaba Merge branch 'master' of https://github.com/rickbarrette/redmine_qbo 2022-03-07 07:52:26 -05:00
30b704c90f Don't generate new customer view token every time 2022-03-07 07:52:17 -05:00
2f98b5afaa Update README.md
formatting
2022-03-06 19:04:29 -05:00
3c3b43cfc5 Readme update
formatting
2022-03-06 19:02:31 -05:00
09f2a534be Readme update
Cleaning things up
2022-03-06 19:01:42 -05:00
7b5b673ebf Version 1.1.2 2022-03-06 18:20:30 -05:00
c72d0a83ca New line @ EOF & formating 2022-03-06 17:50:22 -05:00
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
a9cc5fac73 Removed unsed code & cleaned up comments 2022-03-06 17:05:04 -05:00
fe06fccacd Only show sync button if User is an admin 2022-03-06 16:49:07 -05:00
8b4a46f7eb H3 not H2 2022-03-06 16:27:39 -05:00
cf362caaf2 Cleaning up html formatting 2022-03-06 16:24:17 -05:00
de1be7d296 Make last 8 bold 2022-03-06 16:17:08 -05:00
d8e3e1a72f Styling & formatting 2022-03-06 13:46:55 -05:00
64a7ad844f Styling & formatting 2022-03-06 13:46:26 -05:00
9201c4ca96 render 404 on all exceptions 2022-03-06 09:23:05 -05:00
dab6b6f723 don't show doors if vehicle.doors is nil 2022-03-06 09:17:06 -05:00
495243d177 Add trim & doors to vehicle 2022-03-06 08:59:48 -05:00
332f07c93d Version 1.1.1 2022-03-06 07:51:39 -05:00
54d4be9762 Only show sidebar views when user is logged in 2022-03-06 07:32:01 -05:00
f1e3c29c97 Added Load Customer Link on Issue Form 2022-03-05 08:26:57 -05:00
66d393a465 Dynamically load hooks/patches & require redmine4+ 2022-03-02 07:15:54 -05:00
218d3392f0 Moved string to en.yml 2022-02-24 18:34:17 -05:00
0136d91cc3 Comments & formatting 2022-02-24 04:58:41 -05:00
a95f0350d8 Fixed missing transation error 2022-02-23 20:20:47 -05:00
55c04b6585 update Issue form on customer name change 2022-02-23 18:36:08 -05:00
ea21bc362a autocomplete off for forms & search 2022-02-23 18:24:57 -05:00
117d92b879 Fixed customer sorting & removed customer filter 2022-02-21 20:23:57 -05:00
440c8e4618 list issues in desc order 2022-02-21 19:33:38 -05:00
1344526f7f update txn_date too 2022-02-21 08:51:24 -05:00
19acfbc76f Added logging 2022-02-21 08:51:01 -05:00
9dfb27f0a4 Prevent webhook loops 2022-02-21 07:54:24 -05:00
51cd830710 Updated screenshots 2022-02-21 06:53:50 -05:00
956ba2ad46 Version 1.1.0 2022-02-21 06:25:51 -05:00
3ae3107760 desc sort issues, estimates, & invoices 2022-02-21 06:22:13 -05:00
925d4b8bcf Updated comments & removed unused code 2022-02-21 06:06:24 -05:00
ca6dbfd12d Removed duplicate private declaration 2022-02-21 05:26:54 -05:00
9ea03d0c6d Removed sync on view 2022-02-21 05:23:11 -05:00
6ad4929d53 Sync Estimates & Invoices on database update 2022-02-21 05:17:35 -05:00
446f419af0 Sync invoice when viewing 2022-02-20 19:37:03 -05:00
f3c5de82e0 Bug fix 2022-02-20 18:02:37 -05:00
56e24752cf Import invoice fix 2022-02-20 17:53:01 -05:00
255af13b20 Add txn_date to invoice & estimate databse 2022-02-20 17:40:41 -05:00
02b4f1eb43 Added Invoice date 2022-02-20 17:26:24 -05:00
8c735d3921 Added Estimate date 2022-02-20 17:19:56 -05:00
70e6038215 Moved customer issue counts 2022-02-20 15:22:31 -05:00
fc7501c4fe address not a 2022-02-20 14:57:21 -05:00
45b60cfea1 PhysicalAddress to_s 2022-02-20 14:52:11 -05:00
09313ad471 exclude before filter for customer/view 2022-02-20 13:42:06 -05:00
1b15aecbff Disable autocomplete suggestions for search 2022-02-20 08:11:57 -05:00
2bea7dbc8d fixed customer link - missing view issues/history 2022-02-20 07:56:25 -05:00
3468b5f236 Open links in new window 2022-02-19 22:53:39 -05:00
1c431d14dc remove gem faraday_middleware & set oauth2 1.4.7 2022-02-19 22:48:44 -05:00
7234a70265 Added allowed params for qbo controller 2022-02-19 21:47:12 -05:00
a459d84b00 Added Estimate & Invoice List to Customer view 2022-02-19 21:19:08 -05:00
49d2ed8244 Readme update 2022-02-19 20:56:54 -05:00
d6aebfcb99 Moved strings to Ruby I18n en.yml 2022-02-19 20:46:39 -05:00
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
c101a86f02 Open Estimate PDF in new windows 2022-02-17 09:19:32 -05:00
2d32769a59 Error not fatal 2022-02-13 13:19:04 -05:00
a2f755388e Fixed merge error 2022-02-13 12:34:03 -05:00
8a8f1af2bd Updated Copyright 2022 2022-02-13 11:57:43 -05:00
4582b8c5b9 Added estimate search in side bar 2022-02-13 10:03:43 -05:00
f66fbf6656 specified the rails version in migrations 2022-02-12 16:14:36 -05:00
41d49ccce5 Setting.host_name for hooks not a hardcoded URL 2022-02-12 09:24:21 -05:00
c85f450742 Merge branch 'master' into redmine-4 2022-02-12 09:19:36 -05:00
e314dae10d Logging & exception handler for updating invoices 2022-02-12 09:12:11 -05:00
b1192a1912 Use host name from settings for auth & added exception handing in QboInvoice 2022-02-06 16:37:00 -05:00
7cc8a946fd Inital update for redmine 4.0+ compatibility 2022-02-01 20:53:20 -05:00
4b34852c72 Don't include open issues in closed issue list 2020-03-30 20:56:38 -04:00
5d7fc9dabd Don't include open issues in closed issue list 2020-03-28 20:39:04 -04:00
db61952e67 added notes to regaurding customer autocomplete field 2020-03-28 20:19:58 -04:00
016dca242c Added comments to clearify methods 2020-03-28 20:16:54 -04:00
983811af97 Added comments to clearify methods 2020-03-28 20:08:44 -04:00
d18a9726ac Added onchange event to customer_id 2020-03-28 19:56:42 -04:00
cdef838d3e comment out missing method call 2020-03-26 20:31:00 -04:00
7703d724e1 Update issues_save_hook_listener.rb
titleize all subjects
2020-03-26 20:22:07 -04:00
94b5efbd00 forgot a comma 2020-03-26 12:53:59 -04:00
f43020b864 Update issues_form_hook_listener.rb
Added onchange listener to customer form field
2020-03-26 12:50:32 -04:00
0d0f808305 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2020-01-24 13:55:15 -05:00
279e8b15e0 Added open/closed issue lists for customer/vehicles 2020-01-24 13:54:26 -05:00
099f729303 Update README.md 2020-01-06 08:52:36 -05:00
5150a31cdb Removed unused gems 2020-01-05 12:33:52 -05:00
b5d17dc862 Removed oauth1 database columns & updated settings 2020-01-05 12:21:36 -05:00
e6c5feb3f3 Remove uneeded columns from qbos table 2020-01-05 12:03:19 -05:00
5573e941c6 Cleaning up uneeded code 2020-01-05 11:58:27 -05:00
29dbca20e0 Update copyright 2020-01-05 11:44:02 -05:00
d6c114d52b Version 0.8.1 2020-01-05 09:20:23 -05:00
87b8daf283 Fixed expired token check 2020-01-05 09:17:50 -05:00
719abe20a6 Update qbo.rb 2020-01-05 01:22:27 -05:00
4a5b83265d Update qbo.rb 2020-01-05 01:20:23 -05:00
8d103d3fc6 Update qbo.rb 2020-01-05 01:12:48 -05:00
9310f207a3 Update qbo.rb 2020-01-05 01:08:42 -05:00
000b67b329 Added employee 2020-01-05 00:08:00 -05:00
ebee9395ba Update qbo_employee.rb 2020-01-05 00:06:45 -05:00
2cd6731f0c Update qbo_employee.rb 2020-01-05 00:05:25 -05:00
ebdbd25082 Update qbo.rb 2020-01-04 23:45:00 -05:00
18ada91fcd Update qbo.rb 2020-01-04 23:38:46 -05:00
1cf3926585 Update qbo.rb 2020-01-04 23:33:33 -05:00
e776deeece Update qbo.rb 2020-01-04 23:07:53 -05:00
8c2f30949a Update qbo.rb 2020-01-04 23:04:09 -05:00
015a989f72 Update qbo.rb 2020-01-04 22:57:53 -05:00
0d4d5a6136 Update qbo.rb 2020-01-04 22:52:01 -05:00
0364989fe1 Update qbo_controller.rb 2020-01-04 22:46:20 -05:00
fb47eaba0e Update qbo.rb 2020-01-04 22:45:31 -05:00
725d511be5 Update qbo.rb 2020-01-04 22:30:43 -05:00
fd85f296de Update 030_update_qbos_token.rb 2020-01-04 22:16:07 -05:00
9549bb8fe2 Update qbo.rb 2020-01-04 20:24:29 -05:00
6a1c8b0551 Update README.md 2020-01-04 16:09:03 -05:00
086632e804 Version 0.8.0 (OAuth 2.0) 2020-01-04 16:01:16 -05:00
d37ff922fc Update customer.rb 2020-01-04 15:51:04 -05:00
3483efa100 Oauth2 Upgrade 2020-01-04 15:41:15 -05:00
f65eea2820 Oauth2 Upgrade 2020-01-04 15:37:17 -05:00
a4111e0a11 oAuth2 Upgrade 2020-01-04 15:36:36 -05:00
ebe5373d82 Oauth2 Upgrade 2020-01-04 15:34:57 -05:00
5b8c7d42c5 Oauth2 Upgrade 2020-01-04 15:34:04 -05:00
b8fc57d583 Oauth2 Upgrade 2020-01-04 15:31:19 -05:00
7c42197cb1 Oauth2 Upgrade 2020-01-04 15:30:03 -05:00
cc0ffce892 Oauth2 Upgrade 2020-01-04 15:29:18 -05:00
0fd2abbec3 Oauth2 Upgrade 2020-01-04 15:28:43 -05:00
215b219a6d Oauth2 Upgrade 2020-01-04 15:28:04 -05:00
ea71542d81 Oauth2 Upgrade 2020-01-04 15:26:35 -05:00
5dbf486b50 Update qbo_controller.rb 2020-01-04 15:21:14 -05:00
b734125d6b Update qbo_controller.rb 2020-01-04 15:19:31 -05:00
06e6295c6e Update qbo.rb 2020-01-04 14:32:32 -05:00
fd383ad9d4 Update qbo.rb 2020-01-04 14:29:23 -05:00
4eb6c533f1 Update qbo.rb 2020-01-04 14:21:07 -05:00
5af7d73768 Update qbo_controller.rb 2020-01-04 14:18:42 -05:00
1d0ae34261 Update qbo.rb 2020-01-04 14:13:29 -05:00
21656b3e14 Update qbo.rb 2020-01-04 14:09:37 -05:00
131976cd71 Update issue_patch.rb 2020-01-04 14:08:48 -05:00
88c1b9c9a2 Update issue_patch.rb 2020-01-04 14:06:42 -05:00
5ea9aed3cb Update qbo.rb 2020-01-04 14:05:00 -05:00
41e10d9b0e Update qbo.rb 2020-01-04 13:59:09 -05:00
45859bef3e Update qbo.rb 2020-01-04 13:56:38 -05:00
f5c40738dc Update issue_patch.rb 2020-01-04 13:54:29 -05:00
bfa37ee634 Update issue_patch.rb 2020-01-04 13:51:31 -05:00
787b55f3d7 Update qbo.rb 2020-01-04 13:46:13 -05:00
61f882e98c Update qbo.rb 2020-01-04 13:45:00 -05:00
37db0d3d72 Update qbo.rb 2020-01-04 13:31:40 -05:00
4f2dec3069 Update qbo.rb 2020-01-04 13:29:36 -05:00
35a7c3cfeb Create 030_update_qbos_token.rb 2020-01-04 13:28:22 -05:00
cbbaf5a95c Update qbo.rb 2020-01-04 13:22:27 -05:00
647923e5e6 Update 029_update_qbos_types.rb 2020-01-04 13:19:21 -05:00
70ca4e9964 Create 029_update_qbos_types.rb 2020-01-04 13:17:15 -05:00
7fb40ad4a8 Update qbo_controller.rb 2020-01-04 13:09:09 -05:00
36083d23a0 Update qbo_controller.rb 2020-01-04 13:07:36 -05:00
2ec57f2bbf Update qbo_controller.rb 2020-01-04 13:06:23 -05:00
278708e566 Update qbo_controller.rb 2020-01-04 12:47:30 -05:00
23f2b92e8d Update qbo_controller.rb 2020-01-04 12:45:16 -05:00
5d92eeddfb Update qbo_controller.rb 2020-01-04 12:44:05 -05:00
384a8c033c Update qbo_controller.rb 2020-01-04 12:39:23 -05:00
32b12b60f9 Update qbo_controller.rb 2020-01-04 12:33:54 -05:00
93db447239 Update qbo_controller.rb 2020-01-04 12:29:54 -05:00
19a6180e15 Update qbo.rb 2020-01-04 12:26:04 -05:00
3408ee173c Update qbo.rb 2020-01-04 12:25:12 -05:00
b817e842dd Update qbo.rb 2020-01-04 12:23:59 -05:00
51c3b8338e Update qbo.rb 2020-01-04 12:23:05 -05:00
c6a3edfbc1 Update qbo_controller.rb 2020-01-04 12:21:45 -05:00
21d8d90465 Update qbo.rb 2020-01-04 12:21:24 -05:00
04c0fa57c6 Update qbo_controller.rb 2020-01-04 12:17:26 -05:00
f5ad761712 Update qbo_controller.rb 2020-01-04 12:14:54 -05:00
9b80485915 Update qbo.rb 2020-01-04 12:14:05 -05:00
87de865c00 oauth2 2020-01-04 11:51:25 -05:00
1ea27e8511 Only show error flash if errors are not empty 2019-11-12 12:50:44 -05:00
8f0ca00b09 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:45:20 -05:00
859a1d505b always show errors 2019-11-12 12:45:14 -05:00
cd109653a2 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:37:12 -05:00
cab723bbcd Removed styles & removed after find call 2019-11-12 12:36:25 -05:00
3dd712629b added local vin validation 2019-11-12 12:35:54 -05:00
cdf2603e12 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 12:16:30 -05:00
5df9d324bc Update vehicle.rb 2019-11-12 12:15:59 -05:00
f78c0338b4 Made decode_vin not private 2019-11-12 12:08:04 -05:00
fe6aa7908f Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2019-11-12 11:51:54 -05:00
aa45338e36 Update vehicle.rb 2019-11-11 10:10:23 -05:00
213dca2621 Fixed redicect to :home 2019-07-08 11:30:53 -04:00
fee710d717 Rediect to vehicle if vin is already taken 2019-06-26 11:39:07 -04:00
65eac58f6c Update customer.rb 2019-06-25 12:48:35 -04:00
b4f5112fc3 Create 028_add_customers_mobile_phone_number.rb 2019-06-25 12:46:03 -04:00
fa5dcbf9a9 Fixed redirect to for new vehicles 2019-06-25 12:37:49 -04:00
e0aebb1c23 Update customer.rb 2019-06-25 11:59:08 -04:00
6d176acc2b Update customer.rb 2019-06-25 11:54:26 -04:00
9e9b29fef9 Update 027_add_customers_phone_number.rb 2019-06-25 11:53:40 -04:00
1af846537d Update customer.rb 2019-06-25 11:50:14 -04:00
d6c5daff49 Added phone number 2019-06-25 11:15:57 -04:00
61c76ad80a Create 027_add_customers_phone_number.rb 2019-06-25 10:59:34 -04:00
0d514790fd Moved issue.status.is_closed? check back into issue save hook 2019-03-26 12:15:03 -04:00
748d431d35 Removed controller_issues_edit_before_save hook 2019-03-26 12:11:54 -04:00
87b8d99c41 Working on issue.bill_time 2019-03-26 12:09:38 -04:00
a0da53b6cf Fixed formatting & removed search from heading 2018-10-15 21:10:41 -04:00
02d630c631 Fixed Invoice Link to be HTML safe 2018-10-15 21:07:36 -04:00
15b214c800 Moved html into partial view 2018-10-15 20:57:03 -04:00
1b5e185087 Added nil check 2018-10-15 19:42:41 -04:00
102309600e Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2018-10-15 19:36:09 -04:00
6acc7db91b Changed Customer search to shown on all pages 2018-10-15 19:34:51 -04:00
02898883a8 Update line_item.rb 2018-10-14 23:35:13 -04:00
ce02b70bc3 Update line_items_controler.rb 2018-10-14 23:34:17 -04:00
d4d4a555f8 Forgot to add sidebar files 2018-10-14 23:32:07 -04:00
c2663cd0a0 License update 2018-10-14 23:31:17 -04:00
d48609361f Added customer search to sidebar 2018-10-14 23:27:19 -04:00
70995f6e55 Fixed formating 2018-10-04 20:59:46 -04:00
05a0472939 Changed redirect to :back 2018-10-04 20:57:24 -04:00
cff9f3fde3 Fixed new vehicle add missing customer 2018-09-22 00:29:54 -04:00
e24b704571 Added qbo partial views 2018-09-19 22:57:45 -04:00
4d99f54c79 Added autocomplete to vehicle customer field 2018-09-19 22:33:36 -04:00
e65725c334 Update init.rb 2018-09-19 10:15:13 -04:00
4829daab7c Update new.html.erb 2018-09-19 10:10:54 -04:00
260e9f3e4a Update _list.html.erb 2018-09-19 10:07:52 -04:00
e3ce2445b8 Update index.html.erb 2018-09-19 10:05:45 -04:00
2b333667ed Update init.rb 2018-09-19 09:52:58 -04:00
1077cf214c Update show.html.erb 2018-09-19 09:51:27 -04:00
f27fdf5274 Update index.html.erb 2018-09-19 09:50:58 -04:00
1dbcca4ca0 Create _search.html.erb 2018-09-19 09:49:51 -04:00
558e2359f7 Added partial customers/search & fixed formatting 2018-09-19 09:45:36 -04:00
f99ef648b3 Rename _search.erb to _search.html.erb 2018-09-19 09:24:05 -04:00
5e4e3329c8 Create _search.erb 2018-09-19 09:23:37 -04:00
b0a66aba0a Fixed custom field redering 2018-07-31 15:22:46 -04:00
f2dd500536 Merge branch 'line_items' of github.com:rickbarrette/redmine_qbo into line_items 2018-03-31 08:04:17 -04:00
7412ac4f91 Added boolean billed 2018-03-31 08:03:26 -04:00
2acb3efe5a Create line_items_controler.rb 2018-03-31 08:00:56 -04:00
2cc0d06bc5 Merge branch 'master' into line_items 2018-03-29 22:42:54 -04:00
4070cb7c49 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2018-03-29 22:42:03 -04:00
fcd196355a Create line_item.rb 2018-03-29 10:17:01 -04:00
ea502d5b7b Create 026_create_line_items.rb 2018-03-29 10:05:37 -04:00
1f33009f89 Update LICENSE 2018-03-28 15:24:44 -04:00
3509ae9725 Removed squish_vin and added last 8 of vin to vehicle name 2018-03-27 09:40:01 -04:00
49858c45c9 do a full search by setting the full parameter to true. 2018-03-27 09:38:44 -04:00
b78cd44cc9 don't bill time if not assigned to anyone EE 2018-03-05 08:58:33 -05:00
39fcd6d4dd Removed Drive & Doors 2018-03-03 13:55:22 -05:00
8838d36793 Fixed vin decoding 2018-03-03 13:54:19 -05:00
63fa94e6f2 Merge branch 'master' into nhtsa_vin 2018-03-03 13:14:05 -05:00
17183f9643 Update vehicle.rb 2018-03-03 13:11:58 -05:00
667d0bfa97 Remove Edmunds API & Added NhtsaVin 2018-03-03 12:38:56 -05:00
88a6be0d27 Remove Edmunds API Key Setting 2018-03-03 12:26:25 -05:00
c3eaddff97 Start work to switch from edmunds_vin to nhtsa_vin 2018-03-03 12:22:44 -05:00
f03adad463 Update issues_form_hook_listener.rb 2017-11-19 22:17:25 -05:00
bd03e3ac32 Did things 2017-11-19 22:14:40 -05:00
299a28a0d2 Create controller_issues_listener.rb 2017-11-19 22:01:20 -05:00
cee8ddced1 Added safe_attributes for ProjecT 2017-11-17 20:54:14 -05:00
738cd21b1f Update issues_form_hook_listener.rb 2017-11-17 10:56:13 -05:00
b8186e4b52 More customer/project relations 2017-11-17 10:51:25 -05:00
d98a8b8cc4 Fixed Project releationships and database migration 2017-11-17 10:14:05 -05:00
dba6c4b131 Update vehicle.rb 2017-11-13 22:19:20 -05:00
118812f16f Update vehicle.rb 2017-11-13 22:17:03 -05:00
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
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
f86af9ca71 Create list_simple.html.erb 2017-11-13 22:04:04 -05:00
d25de7b30f Merge remote-tracking branch 'origin/dev' 2017-11-13 21:37:28 -05:00
273bd3d6be Update application.js 2017-11-13 21:01:17 -05:00
ac446723f1 Update application.js 2017-11-13 20:59:45 -05:00
c21bc1333f Update projects_form_hook_listener.rb 2017-11-13 20:38:33 -05:00
4e4255995e Update projects_form_hook_listener.rb 2017-11-13 20:37:59 -05:00
c68b540597 Update projects_form_hook_listener.rb 2017-11-13 20:36:44 -05:00
1358871ccc Update init.rb 2017-11-13 20:31:16 -05:00
908511f299 Update init.rb 2017-11-13 20:30:28 -05:00
6260de21f9 Update query_patch.rb 2017-11-13 20:28:19 -05:00
e2f276097c Update query_patch.rb 2017-11-13 20:27:36 -05:00
205bb67a6a Update query_patch.rb 2017-11-13 20:20:46 -05:00
05edafec4c Update query_patch.rb 2017-11-13 20:13:26 -05:00
4a073d3a71 Update query_patch.rb 2017-11-13 20:12:23 -05:00
f2cbf31e17 Create projects_form_hook_listener.rb 2017-11-13 19:53:37 -05:00
22b22780ea Create project_patch.rb
Add relationships to projects
2017-11-13 19:47:39 -05:00
71cfa28817 Create 025_update_projects.rb
Added customer & vehicle reference to a project.
2017-11-13 19:40:14 -05:00
8b2d88f80b Create qbo_controller.rb 2017-06-14 09:43:52 -04:00
eaf0a57e51 Create qbo_controller.rb 2017-06-13 21:58:42 -04:00
512f5ad7ba Create index.html.erb 2017-06-13 21:55:13 -04:00
8d2351d3f9 Create vehicle.rb 2017-06-13 21:51:36 -04:00
c5a20c9e7f Create vehicle.rb 2017-06-13 21:50:50 -04:00
4a3b663333 Create vehicle.rb 2017-06-13 21:49:10 -04:00
e43635b5d8 Update vehicle.rb 2017-06-13 12:31:07 -04:00
7044377f16 Update vehicle.rb 2017-06-13 12:27:22 -04:00
7ced1bf942 Create vehicle.rb 2017-06-13 12:22:48 -04:00
7ca3315ce5 Update vehicle.rb 2017-06-13 11:44:46 -04:00
2b8c4b4d4d Update vehicle.rb 2017-06-06 08:58:11 -04:00
a359e8815b Update issues_form_hook_listener.rb 2017-06-06 08:53:36 -04:00
01cf82813c Update vehicle.rb 2017-06-06 08:32:21 -04:00
625e400c48 Update vehicle.rb 2017-06-06 08:27:55 -04:00
56793cee7c Update vehicle.rb 2017-06-06 08:25:35 -04:00
3ba5337812 Update vehicle.rb
Updated regex to remove invalid chars
2017-06-06 08:22:50 -04:00
129e3d4821 Update issues_form_hook_listener.rb 2017-06-06 08:12:08 -04:00
4d524a7d61 Update issues_form_hook_listener.rb 2017-06-06 08:10:28 -04:00
429fb920fb Update index.html.erb 2017-04-04 22:29:06 -04:00
77c7f0b6fe Update index.html.erb 2017-04-04 22:28:20 -04:00
1a043bea76 Added Permission Check 2017-04-04 22:26:58 -04:00
e4d770c272 Update index.html.erb 2017-04-04 22:23:33 -04:00
fce3931858 Added new customer button 2017-04-04 22:22:29 -04:00
43cdade6e1 Merge branch 'master' into dev 2017-04-04 09:32:50 -04:00
4374f9436c Removed .service from get_base call 2017-04-04 09:31:02 -04:00
7c63c3c816 Fixed typo 2017-04-04 08:49:08 -04:00
b3f491a60b Fixed logic 2017-04-04 08:48:36 -04:00
4adcbba840 Update vehicle.rb 2017-04-04 08:47:15 -04:00
baccb42455 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-04 08:46:44 -04:00
d0842dd803 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-04 08:45:45 -04:00
02aabe6045 Forgot End 2017-04-04 08:45:34 -04:00
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
f1d2d63f20 Removed un-needed initializer 2017-04-04 08:37:49 -04:00
f322f9f7ab Update Copyright 2017-04-04 08:34:03 -04:00
6db8b76902 Update Copyright 2017-04-04 08:33:37 -04:00
61adce1299 0.5.0 2017-04-03 22:59:09 -04:00
daffb3719e Copyright Update & Formating 2017-04-03 22:57:25 -04:00
1b8626d28f Update init.rb 2017-04-03 22:53:34 -04:00
b119344fad Copyright Update 2017-04-03 22:52:37 -04:00
4381d403d4 Copyright Update 2017-04-03 22:52:14 -04:00
26bfaca1d6 Copyright Update 2017-04-03 22:52:00 -04:00
0c68d8094a Copyright Update 2017-04-03 22:51:43 -04:00
6230175ba5 Copyright Update 2017-04-03 22:51:25 -04:00
5dc4dc5637 Copyright Update 2017-04-03 22:51:03 -04:00
ac15307fb8 Copyright Update 2017-04-03 22:50:50 -04:00
ec5ce497d8 Copyright Update 2017-04-03 22:50:38 -04:00
01fe52157d Update issue_patch.rb 2017-04-03 22:50:19 -04:00
75737cf2fd Copyright Update 2017-04-03 22:50:05 -04:00
7824edf5aa Copyright Update 2017-04-03 22:49:52 -04:00
6b70b447a5 Copyright Update 2017-04-03 22:48:07 -04:00
5a6b679099 Copyright Update 2017-04-03 22:47:49 -04:00
72835dcf65 Copyright Update 2017-04-03 22:47:36 -04:00
b9e2349983 Update qbo.rb 2017-04-03 22:47:21 -04:00
ef13ec7e11 Update qbo_employee.rb 2017-04-03 22:47:10 -04:00
00b40da8c4 Copyright Update 2017-04-03 22:46:48 -04:00
2be25adf18 Copyright Update 2017-04-03 22:46:35 -04:00
5ab9a777f6 Copyright Update 2017-04-03 22:46:19 -04:00
7fbb1d6ba3 Copyright Update 2017-04-03 22:46:04 -04:00
786c80609c Copyright Update 2017-04-03 22:45:21 -04:00
efb554824d Update vehicles_controller.rb 2017-04-03 22:44:40 -04:00
c615abc896 Update qbo_controller.rb 2017-04-03 22:44:29 -04:00
8ecc3414da Update payments_controller.rb 2017-04-03 22:44:17 -04:00
505def8d23 Update invoice_controller.rb 2017-04-03 22:44:03 -04:00
da155de514 Copyright Update 2017-04-03 22:43:42 -04:00
7d727e1ad8 Copyright Update 2017-04-03 22:43:25 -04:00
3dcb5155fc Add Blank Option 2017-04-03 22:40:07 -04:00
4424593e63 Add Blank to Select 2017-04-03 22:38:45 -04:00
8eae838ef8 Update filter_estimates_by_customer.js.erb 2017-04-03 22:34:19 -04:00
d5e8b4bbc4 Update qbo_estimate.rb 2017-04-03 22:26:53 -04:00
fc8efa53e9 Merge branch 'dev' of github.com:rickbarrette/redmine_qbo into dev 2017-04-03 22:25:29 -04:00
15ea3aeaa2 Update qbo_estimate.rb 2017-04-03 22:24:04 -04:00
35bf300f2d Show only estimates attached to the customer 2017-04-03 22:07:06 -04:00
72bf10680f Added ajax to update estimates 2017-04-03 21:57:56 -04:00
bd8706deee Create filter_estimates_by_customer.js.erb 2017-04-03 21:55:47 -04:00
e8619529d4 Added routes for filtering estimates & invoices 2017-04-03 21:52:39 -04:00
fd3c8e15e6 Added filter methods for estimates & invoices 2017-04-03 21:49:57 -04:00
166c1d3002 Add files via upload 2017-04-02 17:13:21 -04:00
773d60fb23 Delete plugin_issue_view.png 2017-04-02 17:12:53 -04:00
cc46902095 Update qbo_estimate.rb 2017-04-02 08:45:02 -04:00
acb2628c7a Update qbo_estimate.rb 2017-04-02 08:41:36 -04:00
e4914590f8 Moved Invoice Sync up in the order 2017-04-02 08:31:22 -04:00
e3a8e464ae Update qbo_estimate.rb 2017-04-02 08:21:36 -04:00
8a6bb45b6a Fixed Custom Field Logic 2017-04-02 08:06:07 -04:00
3decf83a7b Update qbo_invoice.rb 2017-04-02 07:54:33 -04:00
1b7b286d1b Update qbo_invoice.rb 2017-04-02 07:31:28 -04:00
a8804f6704 Increment the sync token 2017-04-02 07:28:53 -04:00
5d03e261d1 Added customer association 2017-04-02 07:19:12 -04:00
1ae766b8bd Added customer association 2017-04-02 07:13:28 -04:00
119c36569f Added association for invoices & estimates 2017-04-02 07:08:24 -04:00
3be69d5efd Update 024_update_invoices_and_estimates.rb 2017-04-02 07:00:43 -04:00
b55dd99efd Merge branch 'master' into dev 2017-04-02 06:59:01 -04:00
eff1f97ab2 Create 024_update_invoices_and_estimates.rb 2017-04-02 06:56:17 -04:00
06050bd139 Removed unused method update_vehicles 2017-03-31 16:23:42 -04:00
a48840ddfb Fixed typo 2017-03-31 16:12:21 -04:00
9b9aabee11 Format the VIN 2017-03-31 16:11:19 -04:00
7782627286 Split the VIN 2017-03-31 16:07:09 -04:00
41a113dc59 Do not hide notes 2017-03-31 16:02:48 -04:00
b84e249dfb 0.4.3 2017-03-23 06:05:43 -04:00
6b45f767a4 Merge pull request #8 from rickbarrette/permissions
Permissions
2017-03-23 06:03:06 -04:00
a34b6a07fc fixed typos 2017-03-23 05:56:26 -04:00
2ce811bbbf Update auth_helper.rb 2017-03-23 05:50:31 -04:00
02153de8b0 Added before filters add_customer, view_customer 2017-03-23 05:47:37 -04:00
68be20459b Added global_check_permission 2017-03-23 05:45:45 -04:00
bbd03cc337 Update init.rb 2017-03-23 05:42:54 -04:00
4fc71a93f2 Update init.rb 2017-03-23 05:42:09 -04:00
8e7e1908e4 Update customers_controller.rb 2017-03-23 05:39:55 -04:00
89fba883ef Update customers_controller.rb 2017-03-23 05:38:06 -04:00
15f317fba1 Update customers_controller.rb 2017-03-23 05:36:51 -04:00
894ee9abfd added check_permission 2017-03-23 05:33:58 -04:00
ca17807117 Update payments_controller.rb 2017-03-23 05:29:54 -04:00
a70ba2f164 Update payments_controller.rb 2017-03-23 05:27:38 -04:00
78ac97298c Update payments_controller.rb 2017-03-23 05:25:57 -04:00
72cd349c1b Update payments_controller.rb 2017-03-23 05:23:44 -04:00
6fc1d27dca Update auth_helper.rb 2017-03-23 05:21:56 -04:00
525c6b99d6 Update auth_helper.rb 2017-03-23 05:19:13 -04:00
3eaff0ab30 Update auth_helper.rb 2017-03-23 05:14:47 -04:00
85b40bc9cf Update payments_controller.rb 2017-03-23 05:11:15 -04:00
37a2b95447 Update payments_controller.rb 2017-03-23 05:10:05 -04:00
33feb91713 added permission_checker 2017-03-23 05:08:33 -04:00
f7357f30ce Update payments_controller.rb 2017-03-23 05:03:58 -04:00
c0ae01018b Update payments_controller.rb 2017-03-23 05:01:01 -04:00
4353e910c8 Update payments_controller.rb 2017-03-23 04:57:22 -04:00
bef9774c4e Update payments_controller.rb 2017-03-23 04:52:19 -04:00
863437b1b7 Added before filter to check permissions 2017-03-23 04:50:17 -04:00
7cfa15910a Update init.rb 2017-03-23 04:41:31 -04:00
2154a3d001 Update init.rb 2017-03-22 23:09:05 -04:00
fdab090a3d Update init.rb 2017-03-22 23:06:12 -04:00
3f32b7fef1 Update init.rb 2017-03-22 22:53:21 -04:00
14422bc549 Update init.rb 2017-03-22 22:52:24 -04:00
6bb66597e8 Added some permissions
view_customers, add_customers, view_payments, add_payments
2017-03-22 22:44:09 -04:00
32b750b545 Version 0.4.2 2017-03-22 22:38:42 -04:00
5fd3141746 Merge pull request #7 from rickbarrette/dev
Removed un-needed js files
2017-03-22 22:26:04 -04:00
2c38361234 Removed un-needed js files 2017-03-22 22:20:12 -04:00
81b7b1492d Merge pull request #6 from rickbarrette/filter_vehicles_by_customer
Filter vehicles by customer
2017-03-22 22:07:22 -04:00
57ef1ac5a1 Fixed Typo 2017-03-22 22:05:33 -04:00
6597c5a13c Update application.js 2017-03-22 22:03:25 -04:00
8af97072fb Fixed filter_vehicles_by_customer method 2017-03-22 21:55:07 -04:00
48b6df0cef Update application.js 2017-03-22 21:34:04 -04:00
853b7ad804 Rename filter_vehicles_by_customerjs.erb to filter_vehicles_by_customer.js.erb 2017-03-22 21:27:15 -04:00
6a74baff5e Update application.js 2017-03-22 18:56:44 -04:00
8b21b0ff75 Update application.js 2017-03-22 18:54:47 -04:00
d22a6303cd Update application.js 2017-03-22 18:53:47 -04:00
807d6643f4 Update application.js 2017-03-22 18:52:38 -04:00
c725c2774c Update application.js 2017-03-22 18:50:21 -04:00
ae0abae333 Update application.js 2017-03-22 18:48:52 -04:00
fed2282212 Added debug 2017-03-22 18:37:06 -04:00
545960e676 Call autocomplete instead 2017-03-22 18:28:53 -04:00
66781f0625 Update application.js 2017-03-22 13:12:29 -04:00
504b9b93e4 Removed { 2017-03-22 13:11:19 -04:00
b71bba473c Provide empty list 2017-03-22 13:09:15 -04:00
aef3c453c4 Do not list all vehicles without customer 2017-03-22 13:04:50 -04:00
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
daada08ea7 Changed select to input 2017-03-22 12:48:43 -04:00
fa37c98500 Removed ID 2017-03-22 12:47:08 -04:00
0ee59704b3 Fixed Javascript includes to += 2017-03-22 12:43:25 -04:00
a22cbb9520 Added Javascript include for application.js 2017-03-22 11:09:19 -04:00
c0d3f64d82 Create application.js 2017-03-22 11:08:14 -04:00
66d2bf4aa4 Create filter_vehicles_by_customerjs.erb 2017-03-22 11:04:48 -04:00
2b90c953ba Added filter_vehicles_by_customer method 2017-03-22 10:29:04 -04:00
0d5e5d679e Added route for filter_vehicles_by_customer 2017-03-22 10:24:16 -04:00
4da891cc07 Merge branch 'master' of git://github.com/sempervictus/redmine_qbo into sempervictus-master 2017-02-22 11:10:46 -05:00
d3475a9b53 Delete vehicles.js 2017-02-14 14:42:13 -05:00
eb583f78ec Delete update_vehicles.js.coffee 2017-02-14 14:41:55 -05:00
47bebf0a1a Delete application.js 2017-02-14 14:41:34 -05:00
f9bd149f21 Commented out un-needed JS 2017-02-14 14:39:58 -05:00
5371b0f193 Update application.js 2017-01-29 22:40:48 -05:00
95497e5514 Update issues_form_hook_listener.rb 2017-01-29 22:40:02 -05:00
1a74abe76c Update issues_form_hook_listener.rb 2017-01-29 22:38:30 -05:00
7f11d3cdc4 Update issues_form_hook_listener.rb 2017-01-29 22:36:32 -05:00
da01d79325 Update customers_controller.rb 2017-01-29 22:29:15 -05:00
82807cfede Update customers_controller.rb 2017-01-29 22:26:53 -05:00
a268d10819 Update customers_controller.rb 2017-01-29 22:25:27 -05:00
ba4bdd9ecb Update routes.rb 2017-01-29 22:19:12 -05:00
0a72e05e03 Update issues_form_hook_listener.rb 2017-01-29 22:05:29 -05:00
8d143ff06d Update customers_controller.rb 2017-01-29 22:00:19 -05:00
3ddb585a58 Update customers_controller.rb 2017-01-29 21:58:49 -05:00
1606ceb743 Update issues_form_hook_listener.rb 2017-01-29 21:49:57 -05:00
97578f8380 Update issues_form_hook_listener.rb 2017-01-29 21:47:09 -05:00
32beae70ef Update issues_form_hook_listener.rb 2017-01-29 21:45:13 -05:00
13fbc9e14f Update issues_form_hook_listener.rb 2017-01-29 21:44:00 -05:00
c57a45c85e Update issues_form_hook_listener.rb 2017-01-29 21:43:25 -05:00
3711a9ca43 Update issues_form_hook_listener.rb 2017-01-29 21:38:18 -05:00
d0c1693f38 Create autocomplete-rails.js 2017-01-29 21:37:27 -05:00
36534ee129 Update issues_form_hook_listener.rb 2017-01-29 21:34:28 -05:00
188c460054 Update issues_form_hook_listener.rb 2017-01-29 21:15:29 -05:00
d9e3cb096b Update application.js 2017-01-29 21:10:41 -05:00
b57b19493f Add files via upload 2017-01-29 21:08:29 -05:00
8c569db541 Update issues_form_hook_listener.rb 2017-01-29 20:56:30 -05:00
997257f42d Update issues_form_hook_listener.rb 2017-01-29 20:54:52 -05:00
f9f1af17bc Update issues_form_hook_listener.rb 2017-01-29 20:53:09 -05:00
f1f44d0048 Update issues_form_hook_listener.rb 2017-01-29 20:46:39 -05:00
7e8511090d Update issues_form_hook_listener.rb 2017-01-29 20:42:18 -05:00
4ca6a3138b Update issues_form_hook_listener.rb 2017-01-29 20:41:38 -05:00
21e1132e0e Update issues_form_hook_listener.rb 2017-01-29 20:36:19 -05:00
dc15424014 Update issues_form_hook_listener.rb 2017-01-29 20:30:34 -05:00
f90cdcd86b Update customers_controller.rb 2017-01-29 20:28:17 -05:00
5e53c18098 Update issues_form_hook_listener.rb 2017-01-29 20:24:06 -05:00
52d13ea7bc Update customers_controller.rb 2017-01-29 20:18:21 -05:00
5e24c5084e Update customers_controller.rb 2017-01-29 20:12:38 -05:00
abdb61cc41 Update Gemfile 2017-01-29 20:07:08 -05:00
03556cc670 Update Gemfile 2017-01-29 20:03:53 -05:00
7f6cd99aba Update Gemfile 2017-01-29 19:58:11 -05:00
ba513fb950 Update issues_form_hook_listener.rb 2017-01-29 19:47:24 -05:00
837ddd722c Update issues_form_hook_listener.rb 2017-01-29 19:46:21 -05:00
f2b0cd3748 Update issues_form_hook_listener.rb 2017-01-29 19:45:31 -05:00
f2a8878af4 Update issues_form_hook_listener.rb 2017-01-29 19:40:51 -05:00
13fccec54b Update routes.rb 2017-01-29 19:36:58 -05:00
eca2b986a9 Update customers_controller.rb 2017-01-29 19:35:45 -05:00
a06599b7f9 Update issues_form_hook_listener.rb 2017-01-29 19:34:31 -05:00
7fda4dc577 Create application.js 2017-01-29 19:32:59 -05:00
9e47152e12 Update Gemfile 2017-01-29 19:31:31 -05:00
83d21da41a Update issues_form_hook_listener.rb 2017-01-29 19:27:23 -05:00
a692f03bfa Update init.rb 2017-01-29 19:17:37 -05:00
994cdf908f Update init.rb 2017-01-29 19:16:55 -05:00
b022d17fc0 Update init.rb 2017-01-29 19:16:05 -05:00
644899c0b5 Update email_worker.rb 2017-01-29 19:15:14 -05:00
be3a3b920d Update email_worker.rb 2017-01-27 12:04:58 -05:00
d546eb026f Update email_worker.rb 2017-01-27 12:01:53 -05:00
fdc59feb13 Create email_worker.rb 2017-01-27 11:47:30 -05:00
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
08e047c90e Added done_ratio to partial billing 2016-10-12 10:31:05 -04:00
b3c3314385 Remove Breaks 2016-09-26 16:41:41 -04:00
9fd5e01bb4 Update qbo_invoice.rb 2016-09-26 16:39:12 -04:00
cd62f65fcd Update qbo_invoice.rb 2016-09-26 16:34:56 -04:00
fb40833abd Update qbo_invoice.rb 2016-09-26 16:33:56 -04:00
6aae155933 Update qbo_invoice.rb 2016-09-21 19:51:22 -04:00
f9e0ae8fef Update qbo_invoice.rb 2016-09-21 19:48:26 -04:00
489e335ca4 Update qbo_invoice.rb 2016-09-21 19:46:55 -04:00
874d0b4db9 Update qbo_invoice.rb 2016-09-21 19:43:40 -04:00
49e8f70b46 Update qbo_invoice.rb 2016-09-21 16:17:07 -04:00
77ea20171e Don't tie invoice to issue if customer is diffrent 2016-09-21 16:15:43 -04:00
11d4034c37 Update query_patch.rb 2016-09-19 23:19:53 -04:00
64369470de Update auth_helper.rb 2016-09-19 23:01:58 -04:00
7b483f3290 Update invoice_controller.rb 2016-09-19 23:01:27 -04:00
32bec79c28 Update invoice_controller.rb 2016-09-19 22:59:44 -04:00
dfd9622ab7 Update invoice_controller.rb 2016-09-19 22:59:02 -04:00
334d3c930b Update auth_helper.rb 2016-09-19 22:57:19 -04:00
8cf2f370bf Update invoice_controller.rb 2016-09-19 22:54:58 -04:00
3965bed6c4 Update invoice_controller.rb 2016-09-19 22:50:18 -04:00
52396eb384 Update invoice_controller.rb 2016-09-19 22:49:06 -04:00
9cfab7bea1 Update invoice_controller.rb 2016-09-19 22:44:52 -04:00
c8ef3bbd4e Update invoice_controller.rb 2016-09-19 22:38:48 -04:00
39e7d3c062 Update invoice_controller.rb 2016-09-19 22:37:53 -04:00
6fa96e11df Update invoice_controller.rb 2016-09-19 22:35:51 -04:00
ecde64193a Update invoice_controller.rb 2016-09-19 22:32:30 -04:00
f701af9a4d Update auth_helper.rb 2016-09-19 22:30:14 -04:00
6d99702a11 Update customers_controller.rb 2016-09-19 22:27:03 -04:00
138f8f2c2f Update auth_helper.rb 2016-09-19 22:21:37 -04:00
61ddf7378d Update auth_helper.rb 2016-09-19 22:18:19 -04:00
f5b72f30be Update customers_controller.rb 2016-09-19 22:17:15 -04:00
1863b33955 Update view.html.erb 2016-09-19 22:05:48 -04:00
a4573fce1c Update issue_patch.rb 2016-09-19 22:01:32 -04:00
0461801ee0 Update issues_form_hook_listener.rb 2016-09-19 21:29:28 -04:00
4c2eaac013 Update routes.rb 2016-09-19 21:26:40 -04:00
7ca56ccd2e Update routes.rb 2016-09-19 20:27:26 -04:00
915a59afa4 Update issues_form_hook_listener.rb 2016-09-19 20:17:00 -04:00
ac61950d48 Update routes.rb 2016-09-19 20:13:57 -04:00
b257fef563 Update customers_controller.rb 2016-09-19 20:10:11 -04:00
504c27c197 Update qbo_invoice.rb 2016-09-19 11:10:26 -04:00
a7a5e2c731 Update qbo_invoice.rb 2016-09-19 11:07:33 -04:00
21d72dcc33 Update qbo_invoice.rb 2016-09-19 11:06:35 -04:00
da7ba40e61 Added Private Note Scanning
Also removed redundant checks
2016-09-19 10:59:20 -04:00
b4d6fc55ea Update customers_controller.rb 2016-09-19 07:57:49 -04:00
515b8feff7 Update attachments_controller_patch.rb 2016-09-19 07:44:03 -04:00
8bc05db033 Update init.rb 2016-09-19 07:30:07 -04:00
34cd6b08dc Create attachments_controller_patch.rb 2016-09-19 07:29:16 -04:00
41195dc095 Update show.html.erb 2016-09-18 22:55:12 -04:00
33a83c8f76 Update _details.html.erb 2016-09-18 22:53:54 -04:00
4f613d3fe1 Update show.html.erb 2016-09-18 22:52:48 -04:00
1c7cdec600 Update show.html.erb 2016-09-18 22:41:24 -04:00
7ae60c0e62 Update show.html.erb 2016-09-18 22:38:26 -04:00
5dd04925e0 Update show.html.erb 2016-09-18 22:37:23 -04:00
92eedbd4d3 Update show.html.erb 2016-09-18 22:32:45 -04:00
5545d72adf Update view.html.erb 2016-09-16 23:11:59 -04:00
226d44cd28 Update customers_controller.rb 2016-09-16 23:10:21 -04:00
b7152d6124 Update view.html.erb 2016-09-16 23:07:05 -04:00
f3e9b58c87 Update customers_controller.rb 2016-09-16 23:06:20 -04:00
5209315236 Update view.html.erb 2016-09-16 23:05:23 -04:00
f38a9e1ff0 Update view.html.erb 2016-09-16 23:04:47 -04:00
80fb296e24 Update customers_controller.rb 2016-09-16 23:03:07 -04:00
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
1098accc8a Bug Fix #2 2016-09-15 07:06:52 -04:00
12826cf436 Bug Fix #2 2016-09-15 07:05:19 -04:00
f9f77fdcb1 Bug Fix #2 2016-09-15 07:04:50 -04:00
0bc935d3dd Bug Fix #2 2016-09-15 07:03:54 -04:00
fc40e4a6fe Update README.md 2016-09-14 17:04:33 -04:00
99b658a03d Update qbo_invoice.rb 2016-09-14 16:49:54 -04:00
dacde1e050 Update qbo_invoice.rb 2016-09-14 14:34:50 -04:00
365219eddb Update issues_form_hook_listener.rb 2016-09-14 09:31:22 -04:00
bc4dbbadbb Update issues_form_hook_listener.rb 2016-09-14 09:30:07 -04:00
c06d2300f2 Update vehicles.js 2016-09-14 09:25:05 -04:00
5e34587a53 Update issues_form_hook_listener.rb 2016-09-14 09:24:04 -04:00
eb39b297f9 Update and rename vehicles.js.coffee to vehicles.js 2016-09-14 09:23:38 -04:00
798a7c9933 Update issues_form_hook_listener.rb 2016-09-14 09:00:23 -04:00
9dee336e76 Rename update_vehicles.coffee.js to update_vehicles.js.coffee 2016-09-14 08:59:22 -04:00
9ba43d63b9 Rename vehicles.coffee.js to vehicles.js.coffee 2016-09-14 08:59:05 -04:00
8126671df9 Update vehicles.coffee.js 2016-09-14 08:54:29 -04:00
3f0ccd79f3 Update vehicles.coffee.js 2016-09-14 08:47:56 -04:00
e61023acd5 Update issues_form_hook_listener.rb 2016-09-14 08:43:05 -04:00
35c2e7a951 Update issues_form_hook_listener.rb 2016-09-14 08:42:11 -04:00
81e8a9594f Update issues_form_hook_listener.rb 2016-09-14 08:40:10 -04:00
63415f8e58 Delete autocomplete.js 2016-09-14 08:37:15 -04:00
ed9b1ea7b9 Update issues_form_hook_listener.rb 2016-09-14 08:36:54 -04:00
6026f9cdfc Update issues_form_hook_listener.rb 2016-09-14 08:31:30 -04:00
1924156a8c Rename vehicles.js.coffee to vehicles.coffee.js 2016-09-14 08:30:19 -04:00
3927b2b007 Rename update_vehicles.js.coffee to update_vehicles.coffee.js 2016-09-14 08:29:54 -04:00
7a2e984df7 Update issues_form_hook_listener.rb 2016-09-14 00:31:06 -04:00
2c9559104a Update issues_form_hook_listener.rb 2016-09-14 00:10:40 -04:00
07e342845a Update Gemfile 2016-09-14 00:04:46 -04:00
dbab5bfbca Update issues_form_hook_listener.rb 2016-09-13 23:58:32 -04:00
cc70c95115 Create update_vehicles.js.coffee 2016-09-13 23:57:12 -04:00
03bcff2b9a Create vehicles.js.coffee 2016-09-13 23:55:54 -04:00
9c4ed3d9e1 Update vehicles_controller.rb 2016-09-13 23:43:06 -04:00
8156657eb2 Update issues_show_hook_listener.rb 2016-09-13 23:37:27 -04:00
c2ffedc8de Update issues_show_hook_listener.rb 2016-09-13 23:33:48 -04:00
3600c3e80a Update issues_show_hook_listener.rb 2016-09-13 23:32:45 -04:00
2970bd092c Update issues_show_hook_listener.rb 2016-09-13 23:28:36 -04:00
a2cac188bb Update issues_show_hook_listener.rb 2016-09-13 23:26:37 -04:00
e542f098a8 Update issues_show_hook_listener.rb 2016-09-13 23:24:34 -04:00
04a1670ac2 Update qbo_invoice.rb 2016-09-13 23:17:51 -04:00
c189bc5dca Update qbo_invoice.rb 2016-09-13 23:14:18 -04:00
4b7cf407e8 Update qbo_invoice.rb 2016-09-13 22:57:45 -04:00
332deed21e Update qbo_invoice.rb 2016-09-13 22:56:36 -04:00
41313029cd Update qbo_invoice.rb 2016-09-13 22:54:52 -04:00
bbc3b138cf Update qbo_invoice.rb 2016-09-13 22:48:11 -04:00
e4d5770bdc Update qbo_invoice.rb 2016-09-13 22:44:12 -04:00
53a0a47dd6 Update qbo_invoice.rb 2016-09-13 22:41:51 -04:00
48edc85e2c Update qbo_invoice.rb 2016-09-13 22:39:25 -04:00
c685aaa245 Update qbo_invoice.rb 2016-09-13 22:30:52 -04:00
2a79389b18 Update qbo_invoice.rb 2016-09-13 22:23:36 -04:00
c3e4d0dbc2 Update invoice_controller.rb 2016-09-06 23:33:39 -04:00
89123fed31 Update header_footer_hook_listener.rb 2016-09-06 23:05:24 -04:00
571811ace6 Update header_footer_hook_listener.rb 2016-09-06 23:01:26 -04:00
cb24967713 Update qbo_invoice.rb 2016-09-06 19:09:59 -04:00
449a59188c Update qbo_invoice.rb 2016-09-06 19:02:32 -04:00
907448ce3e Update qbo_invoice.rb 2016-09-06 19:01:27 -04:00
4f08af3987 Update _form.html.erb 2016-09-06 11:00:07 -05:00
00285e1f24 Update vehicle.rb 2016-09-06 10:56:30 -05:00
5b56d7a878 Update customers_controller.rb 2016-09-05 20:40:32 -04:00
5c0d1def9f Update customers_controller.rb 2016-09-05 20:35:10 -04:00
fc3e252fff Update customers_controller.rb 2016-09-05 20:33:27 -04:00
d605f617e4 Update issues_show_hook_listener.rb 2016-09-05 19:58:40 -04:00
eb390e09d8 Update issues_show_hook_listener.rb 2016-09-05 19:57:17 -04:00
bde29ef9d0 Update issue_patch.rb 2016-09-05 19:54:13 -04:00
5ffc9ed01c Update issue_patch.rb 2016-09-05 19:53:06 -04:00
c992370962 Update issues_show_hook_listener.rb 2016-09-05 19:49:17 -04:00
b3acf9f29d Update customers_controller.rb 2016-09-05 19:27:03 -04:00
dca3735ce1 Update customers_controller.rb 2016-09-05 19:25:32 -04:00
c7a5c1147f Update customers_controller.rb 2016-09-03 23:50:24 -04:00
8940e72091 Update customers_controller.rb 2016-09-03 23:48:54 -04:00
1ed7c6fe63 Update customers_controller.rb 2016-09-03 23:47:05 -04:00
a197dcdefc Update README.md 2016-09-03 23:31:11 -04:00
e00f73a48d Update en.yml 2016-09-03 09:53:26 -04:00
1c977a6687 Update query_patch.rb 2016-09-03 09:37:27 -04:00
b3e93bb465 Update time_entry_query_patch.rb 2016-09-03 09:35:23 -04:00
628c798238 Update init.rb 2016-09-03 09:34:17 -04:00
b34bd9dd7c Update en.yml 2016-09-03 09:32:09 -04:00
4d40093fe9 Update time_entry_query_patch.rb 2016-09-03 09:31:38 -04:00
e573da2c11 Update init.rb 2016-09-03 09:30:52 -04:00
f47316efbe Create time_entry_query_patch.rb 2016-09-03 09:28:51 -04:00
f57c3c3df0 Update issue_patch.rb 2016-09-03 09:17:55 -04:00
9b91e4fd63 Update issue_patch.rb 2016-09-03 09:16:13 -04:00
a264e707a8 Update issue_patch.rb 2016-09-03 09:15:37 -04:00
a75a784e8d Update customers_controller.rb 2016-09-03 09:06:52 -04:00
1e04b6ae9f Update view.html.erb 2016-09-02 11:40:18 -04:00
6dfbfccced Update view.html.erb 2016-09-02 11:38:13 -04:00
27288c2eb2 Update view.html.erb 2016-09-02 11:36:59 -04:00
53a1be9761 Update view.html.erb 2016-09-02 11:28:06 -04:00
d1c6492ea3 Update view.html.erb 2016-09-02 11:26:51 -04:00
0f72d88c71 Update customers_controller.rb 2016-09-02 11:22:05 -04:00
9edfcecdaa Update customers_controller.rb 2016-09-02 11:20:31 -04:00
5303b3dfef Update view.html.erb 2016-09-02 11:18:42 -04:00
1213c2e57a Update view.html.erb 2016-09-02 11:17:54 -04:00
49ca69aa78 Update view.html.erb 2016-09-02 11:17:22 -04:00
586f7c8fb9 Update view.html.erb 2016-09-02 11:16:40 -04:00
7a68fcfa92 Update customers_controller.rb 2016-09-02 11:15:18 -04:00
357e5d4490 Update customers_controller.rb 2016-09-02 11:14:01 -04:00
af25326c23 Update view.html.erb 2016-09-02 11:09:12 -04:00
e1db312982 Update view.html.erb 2016-09-02 11:04:46 -04:00
59a418727e Update view.html.erb 2016-09-02 11:04:36 -04:00
c3d9833acb Update view.html.erb 2016-09-02 11:03:48 -04:00
59ebeb48ce Update view.html.erb 2016-09-02 11:03:10 -04:00
7bd23e993e Update view.html.erb 2016-09-02 11:01:54 -04:00
9b15f3f4f6 Update view.html.erb 2016-09-02 11:00:40 -04:00
f087d3c6c0 Update view.html.erb 2016-09-02 10:59:55 -04:00
806b4719fe Update customers_controller.rb 2016-09-02 10:54:58 -04:00
126f4abe0a Update customer_token.rb 2016-09-02 10:52:19 -04:00
5ec76737b3 Update customer_token.rb 2016-09-02 10:50:32 -04:00
1d7bcc24fe Update issue_patch.rb 2016-09-02 10:46:37 -04:00
76a6fce406 Update customer_token.rb 2016-09-02 10:43:50 -04:00
3d44bcb04d Update customers_controller.rb 2016-09-02 10:40:15 -04:00
fd8b5c280c Create view.html.erb 2016-09-02 10:39:43 -04:00
ef6f104d5f Update customers_controller.rb 2016-09-02 10:34:51 -04:00
92538a58e3 Update customers_controller.rb 2016-09-02 10:34:09 -04:00
44bc2f47f1 Update customers_controller.rb 2016-09-02 10:32:58 -04:00
3c9316340f Update routes.rb 2016-09-02 10:31:05 -04:00
3ef9236388 Update customers_controller.rb 2016-09-02 10:29:48 -04:00
dfdde631f9 Update routes.rb 2016-09-02 10:29:26 -04:00
372a6a1b6a Update auth_helper.rb 2016-09-02 10:28:17 -04:00
5a4996abac Update qbo_controller.rb 2016-09-02 10:10:55 -04:00
416df8d3f1 Update auth_helper.rb 2016-09-02 00:29:47 -04:00
0aa7fe8e73 Update auth_helper.rb 2016-09-02 00:25:32 -04:00
f14e82a01b Update auth_helper.rb 2016-09-02 00:24:59 -04:00
5a10065bb0 Update auth_helper.rb 2016-09-02 00:23:49 -04:00
fb801e9260 Update auth_helper.rb 2016-09-02 00:21:52 -04:00
0fa31f815e Update auth_helper.rb 2016-09-02 00:11:01 -04:00
76bd0d4e08 Update customer_token.rb 2016-09-02 00:04:33 -04:00
b31c3ad550 Update customer_token.rb 2016-09-02 00:02:39 -04:00
af7c1b0130 Update customer_token.rb 2016-09-02 00:00:48 -04:00
224b0b4238 Update 023_create_customer_tokens.rb 2016-09-01 23:57:24 -04:00
e6fee6bd97 Update customer_token.rb 2016-09-01 23:52:39 -04:00
731b811cfe Update customer_token.rb 2016-09-01 23:48:48 -04:00
63d969c844 Added Customer Token Model 2016-09-01 23:45:51 -04:00
1138b0d5c9 Rename 21_add_issues_qbo_invoices.rb to 021_add_issues_qbo_invoices.rb 2016-09-01 23:37:07 -04:00
758810135d Rename 20_update_qbos_time_stamp.rb to 020_update_qbos_time_stamp.rb 2016-09-01 23:36:53 -04:00
6eff61b19d Create 022_update_issues_remove_invoice.rb 2016-09-01 23:36:40 -04:00
b3bc17f327 Update Gemfile 2016-09-01 23:30:58 -04:00
67d4ac0ebf Update init.rb 2016-09-01 23:30:25 -04:00
11d3a2d0bf Update init.rb 2016-09-01 23:28:34 -04:00
1f76333af7 Update init.rb 2016-09-01 23:27:26 -04:00
816daeb429 Update init.rb 2016-09-01 23:24:28 -04:00
b1bc19fb7a Update init.rb 2016-09-01 23:23:20 -04:00
578258f9e2 Update Gemfile 2016-09-01 23:19:14 -04:00
41fe8f6a5d Update issues_show_hook_listener.rb 2016-09-01 12:13:06 -04:00
121 changed files with 2114 additions and 1260 deletions

15
Gemfile
View File

@@ -1,10 +1,13 @@
source 'https://rubygems.org'
gem 'quickbooks-ruby'
gem 'quickbooks-ruby-base'
gem 'oauth-plugin'
gem 'oauth'
gem 'oauth2', '1.4.7'
gem 'roxml'
gem 'edmunds_vin'
gem 'will_paginate', '~> 3.1.0'
gem 'rails4-autocomplete'
gem 'nhtsa_vin'
gem 'will_paginate'
gem 'rails-jquery-autocomplete'
gem 'jquery-ui-rails'
group :assets do
gem 'coffee-rails'
end

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 Rick Barrette
Copyright (c) 2016 - 2022 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

View File

@@ -1,45 +1,46 @@
#Redmine Quickbooks Online
# Redmine 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 loged when an Issue is closed.
`Note: Although the core functionality is complete, this project is still under heavy development. I am still working on refining everthing and adding other features. Tags should be stable`
#### Disclaimer
####Features
* Issues can be assigned to a `Customer` via drop down in the edit Issue form
* The `Employee` for the Issue is assigned via the assigned Redmine User
- This is set via a drop down in the user admistration page.
* IF an `Issue` has been assined a `Customer` when an Issue is closed the following will happen:
- A new `Time Activity` will be created for the `Customer` assinged to the issue for each Redmine Time Entery.
Note: Although the core functionality is complete, this project is still under development & the master branch may be unstable. Tags should be stable and are recommended
Use tags Version 1.0.0+ for Redmine 4+ and Version 0.8.1 for Redine 3
#### Features
* Issues can be assigned to a Customer via drop down in the edit Issue form
- Once a customer is attached to an Issue, you can attach an Estimate to the issue via a drop down menu
* Employee is assigned to a user via a drop down in the user admistration page.
* IF an Issue has been assined a Customer when an Issue is closed the following will happen:
- A new Time Activity will be billed agaist the Customer assinged to the issue for each Redmine Time Entery.
+ Time Entries will be totalled up by Activity name. This will allow billing for diffrent activities without having to create seperate Issues.
+ The Time Activity names are used to lookup `Items` in Quickbooks.
+ IF there isn'tany Items that match the Activity name it will be skipped, and will not be billed to the `Customer`
- Labor Rates are set by the `Item` in Quickbooks
* `Issues` with the Tracker `Quote` will generate an estimate based on the estimated hours and `Item` rates.
- Needs to have a `Customer` Assiged
* `Payments` Can be created via the Redmine application menu
* `Customers` Can be created via the Redmine application menu
* `Customers` can be searched
* Basic information for the `Customer` can be viewed via the customer page
* `Custmoer` information can be update
+ The Time Activity names are used to dynamically lookup Items in Quickbooks.
+ IF there isn't any Items that match the Activity name it will be skipped, and will not be billed to the Customer
- Labor Rates are set by corresponding the Item in Quickbooks
* 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/edit via the Customer page
* Webhook Support
- `Invoices` are automaticly attached to an Issue if a line item has a hashtag number in a `Line Item`
+ `Invoice` Custom Fields are matched Issue Custom Fileds and are automaticly updated in Quickbooks. For example, this is usefull for extracting the Mileage In / Out from the Issue and updating the Invoice with the information.
- `Customers` are automaticly updated in local database
- Invoices are automaticly attached to an Issue if a line item has a hashtag number in a Line Item
+ Invoice Custom Fields are matched Issue Custom Fileds and are automaticly updated in Quickbooks. For example, this is usefull for extracting the Mileage In / Out from the Issue and updating the Invoice with the information.
- Customers are automaticly updated in local database
##Prerequisites
## Prerequisites
* Sign up to become a developer for Intuit https://developer.intuit.com/
* Create your own aplication to obtain your API keys
* Set up webhook service to https://redmine.yourdomain.com/qbo/webhook
- See https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/webhooks
##The Install
## The Install
1. To install, clone this repo into your plugin folder
`git clone git@github.com:rickbarrette/redmine_qbo.git`
then
`git checkout <tag>`
2. Migrate your database
@@ -47,41 +48,29 @@ The goal of this project is to allow Redmine to connect with Quickbooks Online t
3. Navigate to the plugin configuration page and suppy your own OAuth key & secret.
![Alt plugin_config](/Screenshots/plugin_config.png)
4. After saving your key & secret, you need to click on the Authenticate link on the plugin configuration page to authenticate with QBO.
5. Assign an Employee to each of your users via the User Administration Page
![Alt plugin_user_edit](/Screenshots/plugin_user_edit.png)
## Usage
To enable automatic `Time Activity` entries for an Issue , you need only to assign a `Customer` to an Issue via drop downs in the issue creation/update form.
![Alt plugin_issue-edit](/Screenshots/plugin_issue_edit.png)
To enable automatic Time Activity entries for an Issue , you need only to assign a Customer to an Issue via drop downs in the issue creation/update form.
Note: After the inital synchronization, this plugin will recieve push notifications via Intuit's webhook service.
## TODO
* 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 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
* Customer link option to allow for temporary sharing of an issue
* Add Setting for Sandbox Mode
* Refactor Models prefixed with Qbo...
* Allow multiple Invoices to be attached to an Issue
* Seperate Vehicles into a seperate plugin
* Make HTML Pretty
* Seperate Vehicles into a seperate plugin (I use redmine for my automotive shop management 😉)
* Make HTML Pretty (It's ugly right now but it works)
* Intergrate Customer Search into Redmine Search
* Fix Issue sort by Customer
* MORE Stuff...
* MORE Stuff as I make it up...
##License
## License
The MIT License (MIT)
Copyright (c) 2016 rick barrette
Copyright (c) 2016 - 2022 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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 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: 72 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

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -13,11 +13,50 @@ class CustomersController < ApplicationController
unloadable
include AuthHelper
helper :issues
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_filter :require_user
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)
end
# getter method for a customer's vehicles
# used for customer autocomplete field / issue form
def filter_vehicles_by_customer
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
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
def index
if params[:search]
@@ -28,12 +67,14 @@ class CustomersController < ApplicationController
end
end
# initialize a new customer
def new
@customer = Customer.new
end
# create a new customer
def create
@customer = Customer.new(params[:customer])
@customer = Customer.new(allowed_params)
if @customer.save
flash[:notice] = "New Customer Created"
redirect_to @customer
@@ -48,8 +89,11 @@ class CustomersController < ApplicationController
begin
@customer = Customer.find_by_id(params[:id])
@vehicles = @customer.vehicles.paginate(:page => params[:page])
@issues = @customer.issues
rescue ActiveRecord::RecordNotFound
@issues = @customer.issues.order(id: :desc)
@billing_address = address_to_s(@customer.billing_address)
@shipping_address = address_to_s(@customer.shipping_address)
@closed_issues = (@issues - @issues.open)
rescue
render_404
end
end
@@ -58,7 +102,7 @@ class CustomersController < ApplicationController
def edit
begin
@customer = Customer.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound
rescue
render_404
end
end
@@ -67,30 +111,93 @@ class CustomersController < ApplicationController
def update
begin
@customer = Customer.find_by_id(params[:id])
if @customer.update_attributes(params[:customer])
if @customer.update_attributes(allowed_params)
flash[:notice] = "Customer updated"
redirect_to @customer
else
redirect_to edit_customer_path
flash[:error] = @customer.errors.full_messages.to_sentence if @customer.errors
end
rescue ActiveRecord::RecordNotFound
rescue
render_404
end
end
# delete a customer
def destroy
begin
Customer.find_by_id(params[:id]).destroy
flash[:notice] = "Customer deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
rescue
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.debug "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
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.where("token = ? and expires_at > ?", params[:token], Time.now)
@token = @token.first
if @token
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
else
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|
@@ -102,4 +209,18 @@ class CustomersController < ApplicationController
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
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
string << ", " + address.country_sub_division_code
string << " " + address.postal_code
return string
end
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -12,16 +12,34 @@ class EstimateController < ApplicationController
include AuthHelper
before_filter :require_user
before_action :require_user
#
# Downloads and forwards the estimate pdf
#
def show
base = QboEstimate.get_base.service
estimate = base.fetch_by_id(params[:id])
@pdf = base.pdf(estimate)
send_data @pdf, filename: "estimate #{estimate.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
e = Estimate.find_by_id(params[:id]) if params[:id]
e = Estimate.find_by_doc_number(params[:search]) if params[:search]
begin
send_data e.pdf, filename: "estimate #{e.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
rescue
redirect_to :back, :flash => { :error => "Estimate not found" }
end
end
#
# Downloads estimate by document number
#
def doc
e = Estimate.find_by_doc_number(params[:id]) if params[:id]
e = Estimate.find_by_doc_number(params[:search]) if params[:search]
begin
send_data e.pdf, filename: "estimate #{e.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
rescue
redirect_to :back, :flash => { :error => "Estimate not found" }
end
end
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -12,15 +12,20 @@ class InvoiceController < ApplicationController
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? }
#
# Downloads and forwards the invoice pdf
#
def show
base = QboInvoice.get_base.service
invoice = base.fetch_by_id(params[:id])
@pdf = base.pdf(invoice)
send_data @pdf, filename: "invoice #{invoice.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
begin
base = Invoice.get_base
invoice = base.fetch_by_id(params[:id])
@pdf = base.pdf(invoice)
send_data @pdf, filename: "invoice #{invoice.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
rescue
redirect_to :back, :flash => { :error => "Invoice not found" }
end
end
end

View File

@@ -1,51 +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 PaymentsController < ApplicationController
unloadable
include AuthHelper
before_filter :require_user
def new
@payment = Payment.new
@customers = Customer.all.sort_by &:name
@accounts = Qbo.get_base(:account).service.query("SELECT Id, Name FROM Account WHERE AccountType = 'Bank' Order By Name")
@payment_methods = Qbo.get_base(:payment_method).service.all
end
def create
@payment = Payment.new(params[:payment])
if @payment.save
flash[:notice] = "Payment Saved"
redirect_to Customer.find_by_id(@payment.customer_id)
else
flash[:error] = @payment.errors.full_messages.to_sentence
redirect_to new_customer_path
end
end
private
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
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -15,63 +15,70 @@ class QboController < ApplicationController
include AuthHelper
before_filter :require_user, :except => :qbo_webhook
skip_before_filter :verify_authenticity_token, :check_if_login_required
before_action :require_user, :except => :webhook
skip_before_action :verify_authenticity_token, :check_if_login_required, :only => [:webhook]
#
# Called when the QBO Top Menu us shown
#
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
def allowed_params
params.permit(:code, :state, :realmId, :id)
end
#
# Called when the user requests that Redmine to connect to QBO
#
def authenticate
callback = qbo_oauth_callback_url
token = Qbo.get_oauth_consumer.get_request_token(:oauth_callback => callback)
session[:qb_request_token] = Marshal.dump(token)
redirect_to("https://appcenter.intuit.com/Connect/Begin?oauth_token=#{token.token}") and return
oauth2_client = Qbo.get_client
callback = Setting.host_name + "/qbo/oauth_callback/"
grant_url = oauth2_client.auth_code.authorize_url(redirect_uri: callback, response_type: "code", state: SecureRandom.hex(12), scope: "com.intuit.quickbooks.accounting")
redirect_to grant_url
end
#
# Called by QBO after authentication has been processed
#
def oauth_callback
at = Marshal.load(session[:qb_request_token]).get_access_token(:oauth_verifier => params[:oauth_verifier])
if params[:state].present?
oauth2_client = Qbo.get_client
# use the state value to retrieve from your backend any information you need to identify the customer in your system
redirect_uri = Setting.host_name + "/qbo/oauth_callback/"
if resp = oauth2_client.auth_code.get_token(params[:code], redirect_uri: redirect_uri)
#There can only be one...
Qbo.destroy_all
# Remove the last authentication information
Qbo.delete_all
# Save the authentication information
qbo = Qbo.new
qbo.qb_token = at.token
qbo.qb_secret = at.secret
qbo.token_expires_at = 6.months.from_now.utc
qbo.reconnect_token_at = 5.months.from_now.utc
qbo.company_id = params['realmId']
if qbo.save!
redirect_to qbo_sync_path, :flash => { :notice => "Successfully connected to Quickbooks" }
else
redirect_to plugin_settings_path(:redmine_qbo), :flash => { :error => "Error" }
# Save the authentication information
qbo = Qbo.new
qbo.company_id = params[:realmId]
# Generate Access Token & Serialize it into the database
access_token = OAuth2::AccessToken.new(oauth2_client, resp.token, refresh_token: resp.refresh_token)
qbo.token = access_token.to_hash
qbo.expire = 1.hour.from_now.utc
if qbo.save!
redirect_to sync_path, :flash => { :notice => "Successfully connected to Quickbooks" }
else
redirect_to plugin_settings_path(:redmine_qbo), :flash => { :error => "Error" }
end
end
end
end
# Manual Billing
def bill
i = Issue.find_by_id params[:id]
i.bill_time
redirect_to i, :flash => { :notice => "Successfully Billed #{i.customer.name}" }
if i.customer
i.bill_time
redirect_to i, :flash => { :notice => "Successfully Billed #{i.customer.name}" }
else
redirect_to i, :flash => { :error => "Cannot bill without a customer assigned" }
end
end
# Quickbooks Webhook Callback
def qbo_webhook
def webhook
logger.info "Quickbooks is calling webhook"
# check the payload
signature = request.headers['intuit-signature']
@@ -93,8 +100,7 @@ class QboController < ApplicationController
id = entity['id'].to_i
name = entity['name']
# TODO rename all other models!
name.prepend("Qbo") if not name.eql? "Customer"
logger.debug "Casting #{name.constantize} to obj"
# Magicly initialize the correct class
obj = name.constantize
@@ -107,7 +113,13 @@ class QboController < ApplicationController
obj.destroy(id)
#if not then update!
else
obj.sync_by_id(id)
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
@@ -119,20 +131,23 @@ class QboController < ApplicationController
else
render nothing: true, status: 400
end
logger.info "Quickbooks webhook complete"
end
#
# Synchronizes the QboCustomer table with QBO
#
def sync
logger.info "Syncing EVERYTHING"
# Update info in background
Thread.new do
if Qbo.exists?
Customer.sync
Invoice.sync
QboItem.sync
QboEmployee.sync
QboEstimate.sync
QboInvoice.sync
Employee.sync
Estimate.sync
# Record the last sync time
Qbo.update_time_stamp
@@ -140,6 +155,6 @@ class QboController < ApplicationController
ActiveRecord::Base.connection.close
end
redirect_to qbo_path(:redmine_qbo), :flash => { :notice => "Successfully synced to Quickbooks" }
redirect_to :home, :flash => { :notice => "Successfully synced to Quickbooks" }
end
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -14,7 +14,11 @@ class VehiclesController < ApplicationController
include AuthHelper
before_filter :require_user
before_action :require_user
def allowed_params
params.require(:vehicle).permit(:year, :make, :model, :customer_id, :notes, :vin)
end
# display a list of all vehicles
def index
@@ -26,6 +30,7 @@ class VehiclesController < ApplicationController
end
end
# search for a vehicle by vin
if params[:search]
@vehicles = Vehicle.search(params[:search]).paginate(:page => params[:page])
if only_one_non_zero?(@vehicles)
@@ -37,19 +42,18 @@ class VehiclesController < ApplicationController
# return an HTML form for creating a new vehicle
def new
@vehicle = Vehicle.new
@customers = Customer.all.order(:name)
@customer = params[:customer_id] if params[:customer_id]
@customer = Customer.find_by_id(params[:customer_id]) if params[:customer_id]
end
# create a new vehicle
def create
@vehicle = Vehicle.new(params[:vehicle])
@vehicle = Vehicle.new(allowed_params)
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
redirect_to Vehicle.find_by_vin @vehicle.vin
end
end
@@ -57,7 +61,10 @@ class VehiclesController < ApplicationController
def show
begin
@vehicle = Vehicle.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound
@vin = @vehicle.vin.scan(/.{1,9}/) if @vehicle.vin
@issues = @vehicle.issues.order(id: :desc)
@closed_issues = (@issues - @issues.open)
rescue
render_404
end
end
@@ -66,9 +73,8 @@ class VehiclesController < ApplicationController
def edit
begin
@vehicle = Vehicle.find_by_id(params[:id])
@customer = @vehicle.customer.id
@customers = Customer.all.order(:name)
rescue ActiveRecord::RecordNotFound
@customer = @vehicle.customer
rescue
render_404
end
end
@@ -78,14 +84,15 @@ class VehiclesController < ApplicationController
@customer = params[:customer]
begin
@vehicle = Vehicle.find_by_id(params[:id])
if @vehicle.update_attributes(params[:vehicle])
if @vehicle.update_attributes(allowed_params)
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
#show any errors anyways
flash[:error] = @vehicle.errors.full_messages.to_sentence unless @vehicle.errors.empty?
rescue
render_404
end
end
@@ -96,22 +103,15 @@ class VehiclesController < ApplicationController
Vehicle.find_by_id(params[:id]).destroy
flash[:notice] = "Vehicle deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
rescue
render_404
end
end
# returns a dynamic list of vehicles owned by a customer
def update_vehicles
@vehicles = Customer.find_by_id(params[:customer_id].to_i).vehicles
respond_to do |format|
format.html { render(:text => "not implemented") }
format.js
end
end
private
# 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|

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2017 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:
#
@@ -11,8 +11,43 @@
module AuthHelper
def require_user
return unless session[:token].nil?
if !User.current.logged?
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
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 :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
def global_check_permission(permission)
if !globaly_allowed_to?(permission)
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
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

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -12,10 +12,11 @@ class Customer < ActiveRecord::Base
unloadable
has_many :issues
has_many :qbo_purchases
has_many :purchases
has_many :invoices
has_many :estimates
has_many :vehicles
attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone
validates_presence_of :id, :name
self.primary_key = :id
@@ -61,6 +62,8 @@ class Customer < ActiveRecord::Base
pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n
@details.primary_phone = pn
#update our locally stored number too
update_phone_number
end
# Convenience Method
@@ -81,6 +84,26 @@ class Customer < ActiveRecord::Base
pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n
@details.mobile_phone = pn
#update our locally stored number too
update_mobile_phone_number
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
# Convenience Method
@@ -112,7 +135,7 @@ class Customer < ActiveRecord::Base
# proforms a bruteforce sync operation
# This needs to be simplified
def self.sync
service = Qbo.get_base(:customer).service
service = Qbo.get_base(:customer)
# Sync ALL customers if the database is empty
#if count == 0
@@ -125,53 +148,43 @@ class Customer < ActiveRecord::Base
#end
customers.each do |customer|
qbo_customer = Customer.find_or_create_by(id: customer.id)
customer = Customer.find_or_create_by(id: customer.id)
if customer.active?
if not qbo_customer.name.eql? customer.display_name
qbo_customer.name = customer.display_name
qbo_customer.id = customer.id
qbo_customer.save_without_push
if not customer.name.eql? customer.display_name
customer.name = customer.display_name
customer.id = customer.id
customer.save_without_push
end
else
if not qbo_customer.new_record?
qbo_customer.delete
if not customer.new_record?
customer.delete
end
end
end
end
# Searchs the database for a customer by name
# Searchs the database for a customer by name or phone number with out special chars
def self.search(search)
customers = where("name LIKE ?", "%#{search}%")
#if customers.empty?
# service = Qbo.get_base(:customer).service
# results = service.query("Select Id From Customer Where PrimaryPhone LIKE '%#{search}%' AND Mobile LIKE '%#{search}%'")
# results.each do |customer|
# customers << Customer.find_by_id(customer.id)
# end
#end
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)
service = Qbo.get_base(:customer).service
service = Qbo.get_base(:customer)
customer = service.fetch_by_id(id)
qbo_customer = Customer.find_or_create_by(id: customer.id)
customer = Customer.find_or_create_by(id: customer.id)
if customer.active?
if not qbo_customer.name.eql? customer.display_name
qbo_customer.name = customer.display_name
qbo_customer.id = customer.id
qbo_customer.save_without_push
if not customer.name.eql? customer.display_name
customer.name = customer.display_name
customer.id = customer.id
customer.save_without_push
end
else
if not qbo_customer.new_record?
qbo_customer.delete
if not customer.new_record?
customer.delete
end
end
end
@@ -179,7 +192,7 @@ class Customer < ActiveRecord::Base
# Push the updates
def save_with_push
begin
@details = Qbo.get_base(:customer).service.update(@details)
@details = Qbo.get_base(:customer).update(@details)
#raise "QBO Fault" if @details.fault?
self.id = @details.id
rescue Exception => e
@@ -197,7 +210,7 @@ class Customer < ActiveRecord::Base
def pull
begin
raise Exception unless self.id
@details = Qbo.get_base(:customer).find_by_id(self.id)
@details = Qbo.get_base(:customer).fetch_by_id(self.id)
rescue Exception => e
@details = Quickbooks::Model::Customer.new
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -8,30 +8,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.
class Payment
class CustomerToken < ActiveRecord::Base
unloadable
has_many :issues
validates_presence_of :expires_at, :issue_id
before_create :generate_token
include ActiveModel::Model
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret'] || 'CONFIGURE__' + SecureRandom.uuid
attr_accessor :errors, :customer_id, :account_id, :payment_method_id, :total_amount
validates_presence_of :customer_id, :account_id, :payment_method_id, :total_amount
validates :total_amount, numericality: true
def save
payment = Quickbooks::Model::Payment.new
payment.customer_id = @customer_id.to_i
payment.deposit_to_account_id = @account_id.to_i
payment.payment_method_id = @payment_method_id.to_i
payment.total = @total_amount
Qbo.get_base(:payment).service.update(payment)
def generate_token
self.token = SecureRandom.base64(15).tr('+/=lIO0', OAUTH_CONSUMER_SECRET)
end
def save!
save
end
# Dummy stub to make validtions happy.
def update_attribute
def remove_expired_tokens
CustomerToken.where("expires_at < ?", Time.now).destroy_all
end
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class QboEmployee < ActiveRecord::Base
class Employee < ActiveRecord::Base
unloadable
has_many :users
attr_accessible :name
validates_presence_of :id, :name
def self.get_base
@@ -19,24 +18,24 @@ class QboEmployee < ActiveRecord::Base
end
def self.sync
employees = get_base.service.all
employees = get_base.all
transaction do
# Update the item table
employees.each { |employee|
qbo_employee = find_or_create_by(id: employee.id)
qbo_employee.name = employee.display_name
qbo_employee.id = employee.id
qbo_employee.save!
employee = find_or_create_by(id: employee.id)
employee.name = employee.display_name
employee.id = employee.id
employee.save!
}
end
end
def self.sync_by_id(id)
employee = get_base.service.fetch_by_id(id)
qbo_employee = find_or_create_by(id: employee.id)
qbo_employee.name = employee.display_name
qbo_employee.id = employee.id
qbo_employee.save!
employee = get_base.fetch_by_id(id)
employee = find_or_create_by(id: employee.id)
employee.name = employee.display_name
employee.id = employee.id
employee.save!
end
end

100
app/models/estimate.rb Normal file
View File

@@ -0,0 +1,100 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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
unloadable
has_and_belongs_to_many :issues
belongs_to :customer
validates_presence_of :doc_number, :id
self.primary_key = :id
# return the QBO Estimate service
def self.get_base
Qbo.get_base(:estimate)
end
# sync all estimates
def self.sync
logger.debug "Syncing ALL estimates"
estimates = get_base.all
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.debug "Syncing estimate #{id}"
process_estimate(get_base.fetch_by_id(id))
end
# update an estimate
def self.update(id)
# Update the item table
estimate = get_base.fetch_by_id(id)
estimate = find_or_create_by(id: id)
estimate.doc_number = estimate.doc_number
estimate.txn_date = estimate.txn_date
estimate.save!
end
# process an estimate into the database
def self.process_estimate(estimate)
logger.info "Processing estimate #{estimate.id}"
estimate = find_or_create_by(id: estimate.id)
estimate.doc_number = estimate.doc_number
estimate.customer_id = estimate.customer_ref.value
estimate.id = estimate.id
estimate.txn_date = estimate.txn_date
estimate.save!
end
# download the pdf from quickbooks
def pdf
base = Estimate.get_base
estimate = base.fetch_by_id(id)
return base.pdf(estimate)
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
@details = Qbo.get_base(:estimate).fetch_by_id(self.id)
rescue Exception => e
@details = Quickbooks::Model::Estimate.new
end
end
end

196
app/models/invoice.rb Normal file
View File

@@ -0,0 +1,196 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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
unloadable
has_and_belongs_to_many :issues
belongs_to :customer
validates_presence_of :doc_number, :id, :customer_id, :txn_date
self.primary_key = :id
# Get the quickbooks-ruby base for invoice
def self.get_base
Qbo.get_base(:invoice)
end
# sync ALL the invoices
def self.sync
logger.debug "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
if count == 0
invoices = get_base.all
else
invoices = get_base.query()
end
invoices.each { | invoice |
process_invoice invoice
}
end
#sync by invoice ID
def self.sync_by_id(id)
logger.debug "Syncing invoice #{id}"
invoice = get_base.fetch_by_id(id)
process_invoice invoice
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.debug "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(invoice)
logger.info "Processing invoice #{invoice.id}"
# Load the invoice into the database
invoice = Invoice.find_or_create_by(id: invoice.id)
invoice.doc_number = invoice.doc_number
invoice.id = invoice.id
invoice.customer_id = invoice.customer_ref
invoice.txn_date = invoice.txn_date
invoice.save!
# Scan the private notes for hashtags and attach to the applicable issues
if not invoice.private_note.nil?
invoice.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
invoice.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.debug "Comparing custom fields"
# TODO break if Invoice.find(invoice.id).cf_sync_confict
is_changed = false
# update the invoive custom fields with infomation from the issue if available
invoice.custom_fields.each { |cf|
# VIN from the attached vehicle
# TODO move this into seperate plugin
# TODO create hook for seperate plugin
begin
if cf.name.eql? "VIN"
# Only update if blank to prevent infite loops
# TODO check cf_sync_confict flag once implemented
if cf.string_value.to_s.blank?
logger.debug " VIN was blank, updating the invoice vin in quickbooks"
vin = Vehicle.find(issue.vehicles_id).vin
break if vin.nil?
if not cf.string_value.to_s.eql? vin
cf.string_value = vin.to_s
logger.debug "VIN has changed"
is_changed = true
end
end
end
rescue
#do nothing
end
# 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
begin
logger.debug "Trying to update invoice"
get_base.update(invoice) if is_changed
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
# 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
@details = Qbo.get_base(:invoice).fetch_by_id(self.id)
rescue Exception => e
@details = Quickbooks::Model::Invoice.new
end
end
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -10,34 +10,74 @@
class Qbo < ActiveRecord::Base
unloadable
validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at
validates_presence_of :token, :company_id, :expire
serialize :token
OAUTH_CONSUMER_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
$qb_oauth_consumer = OAuth::Consumer.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_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'
#
# Getter for quickbooks OAuth2 client
#
def self.get_client
oauth_params = {
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"
}
return OAuth2::Client.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, oauth_params)
end
#
# Getter for oauth consumer
#
def self.get_oauth_consumer
# Quickbooks Config Info
return $qb_oauth_consumer
end
# Get a quickbooks base object for type
#
# Get a quickbooks base service object for type
# @params type of base
#
def self.get_base(type)
Quickbooks::Base.new(first, type)
# lets getnourbold access token from the database
oauth2_client = get_client
qbo = self.first
access_token = OAuth2::AccessToken.from_hash(oauth2_client, qbo.token)
# check to see if we need to refresh the acesstoken
if qbo.expire.to_time.utc.past?
puts "Updating access token"
new_access_token_object = access_token.refresh!
qbo.token = new_access_token_object.to_hash
qbo.expire = 1.hour.from_now.utc
qbo.save!
access_token = new_access_token_object
else
puts "Using current token"
end
# build the reqiested service
case type
when :item
return Quickbooks::Service::Item.new(:company_id => qbo.company_id, :access_token => access_token)
when :time_activity
return Quickbooks::Service::TimeActivity.new(:company_id => qbo.company_id, :access_token => access_token)
when :customer
return Quickbooks::Service::Customer.new(:company_id => qbo.company_id, :access_token => access_token)
when :invoice
return Quickbooks::Service::Invoice.new(:company_id => qbo.company_id, :access_token => access_token)
when :estimate
return Quickbooks::Service::Estimate.new(:company_id => qbo.company_id, :access_token => access_token)
when :account
return Quickbooks::Service::Account.new(:company_id => qbo.company_id, :access_token => access_token)
when :employee
return Quickbooks::Service::Employee.new(:company_id => qbo.company_id, :access_token => access_token)
else
return access_token
end
end
# Get the QBO account

View File

@@ -1,53 +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.sync_by_id(id)
estimate = get_base.service.fetch_by_id(id)
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
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

View File

@@ -1,103 +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_and_belongs_to_many :issues
attr_accessible :doc_number
validates_presence_of :doc_number
self.primary_key = :id
def self.get_base
Qbo.get_base(:invoice)
end
def self.sync
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 |
sync_by_id invoice.id
}
end
def self.sync_by_id(id)
#update the information in the database
invoice = Qbo.get_base(:invoice).service.fetch_by_id(id)
qbo_invoice = find_or_create_by(id: invoice.id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.id = invoice.id
qbo_invoice.save!
is_changed = false
# Scan the line items for hashtags and attach to the applicable issues
invoice.line_items.each { |line|
if line.description
line.description.scan(/#(\w+)/).flatten.each { |issue|
i = Issue.find_by_id(issue.to_i)
begin
i.qbo_invoices << QboInvoice.find_by_id(invoice.id.to_i)
i.save!
rescue
# do nothing, the reccord exists
end
# update the invoive custom fields with infomation from the work ticket if available
invoice.custom_fields.each { |cf|
# VIN
begin
if cf.name.eql? "VIN"
vin = Vehicle.find(i.vehicles_id).vin
break if vin.blank?
cf.string_value = vin if not cf.string_value.to_s.eql? vin
break
end
rescue
#do nothing
end
# Custom Values
begin
value = i.custom_values.find_by(custom_field_id: CustomField.find_by_name(cf.name).id)
if not value.value.to_s.blank?
if not cf.string_value.to_s.eql? value.value.to_s
cf.string_value = value.value.to_s
is_changed = true
end
end
rescue
# Nothing to do here, there is no match
end
}
# Push updates
Qbo.get_base(:invoice).service.update(invoice) if is_changed
}
end
}
end
def self.update(id)
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

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

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -12,67 +12,47 @@ class Vehicle < ActiveRecord::Base
unloadable
API_KEY = Setting.plugin_redmine_qbo['settingsEdmundsAPIKey']
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
if year.nil? or make.nil? or model.nil?
return "#{vin}"
else
split_vin = vin.scan(/.{1,9}/)
return "#{year} #{make} #{model} - #{split_vin[1]}"
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
# returns the raw JSON details from NHTSA
def details
get_details if @details.nil?
return @details
end
# returns the number of doors of the vehicle
def doors
return @details['numOfDoors'] if @details
end
# Force Upper Case for VIN numbers
# Force Upper Case for make 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
# Force Upper Case for model 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
# Force Upper Case & strip VIN of all illegal chars (for barcode scanner)
def vin=(val)
# The to_s is in case you get nil/non-string
write_attribute(:vin, val.to_s.scan(/^[A-Za-z0-9]+$/).join.upcase)
val = val.to_s.upcase.gsub(/[^A-HJ-NPR-Za-hj-npr-z\d]+/,"")
write_attribute(:vin, val)
end
# search for a vin
@@ -80,35 +60,16 @@ class Vehicle < ActiveRecord::Base
where("vin LIKE ?", "%#{search}%")
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(API_KEY)
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']
self.year = @details.year unless @details.year.nil?
self.make = @details.make unless @details.make.nil?
self.model = @details.model unless @details.model.nil?
self.doors = @details.doors unless @details.doors.nil?
self.trim = @details.trim unless @details.trim.nil?
rescue Exception => e
errors.add(:vin, e.message)
end
@@ -116,15 +77,24 @@ class Vehicle < ActiveRecord::Base
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'
private
# init method to pull JSON details from NHTSA
def get_details
if self.vin?
#validate the vin before calling a remote server
validation = NhtsaVin.validate(self.vin)
begin
#if the vin validation failed, raise an exception and exit
raise RuntimeError, validation.error unless validation.valid?
# query NHTSA for details on the vin
query = NhtsaVin.get(self.vin)
raise RuntimeError, query.error unless query.valid?
@details = query.response
rescue Exception => e
errors.add(:vin, e.message)
end
end
v = self.vin[0,11]
return v.slice(0,8) + v.slice(9,11)
end
end

View File

@@ -1,59 +1,43 @@
<table>
<tbody>
<tr>
<th>Customer</th>
<td><%= customer.name %></td>
</tr>
<tr>
<th>Email</th>
<th><%=t(:label_email)%></th>
<td><%= customer.email %></td>
</tr>
<tr>
<th>Primary Phone</th>
<th><%=t(:label_primary_phone)%></th>
<td><%= number_to_phone(customer.primary_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.primary_phone %></td>
</tr>
<tr>
<th>Mobile Phone</th>
<th><%=t(:label_mobile_phone)%></th>
<td><%= number_to_phone(customer.mobile_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.mobile_phone %></td>
</tr>
<tr>
<th>Bill Address</th>
<td><%= customer.billing_address %></td>
<th><%=t(:label_billing_address)%></th>
<td><%= @billing_address %></td>
</tr>
<tr>
<th>Shipping Address</th>
<td><%= customer.shipping_address %></td>
<th><%=t(:label_shipping_address)%></th>
<td><%= @shipping_address %></td>
</tr>
<tr>
<th>Issues</th>
<td><%= customer.issues.count %></td>
</tr>
<tr>
<th>Account Balance</th>
<th><%=t(:label_account_balance)%></th>
<td>$<%= customer.balance %></td>
</tr>
<tr>
<th>Balance With Jobs</th>
<td>$<%= customer.balance_with_jobs %></td>
</tr>
<tr>
<th>Notes</th>
<th><%=t(:field_notes)%></th>
<td><%= customer.notes %></td>
</tr>
<tr>
<td>
<%= button_to "Edit Customer", edit_customer_path(customer), method: :get%>
</td>
</tr>
</tbody>
</table>
<div style="float: right;">
<%= button_to t(:label_edit_customer), edit_customer_path(customer), method: :get%>
</div>
<br/>
<br/>

View File

@@ -5,35 +5,35 @@
<%= form_for @customer do |f| %>
<div class="clearfix">
Display Name:
<%=t(:label_display_name)%>
<div class="input">
<%= f.text_field :name, :required => true %>
<%= f.text_field :name, :required => true, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Phone Number:
<%=t(:label_primary_phone)%>
<div class="input">
<%= f.telephone_field :primary_phone %>
<%= f.telephone_field :primary_phone, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Mobile Phone Number:
<%=t(:label_mobile_phone)%>:
<div class="input">
<%= f.telephone_field :mobile_phone %>
<%= f.telephone_field :mobile_phone, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Email:
<%=t(:label_email)%>:
<div class="input">
<%= f.email_field :email %>
<%= f.email_field :email, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Notes:
<%=t(:field_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 @customer.new_record? %>

View File

@@ -0,0 +1,6 @@
<%= 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%>
<%= button_to(t(:label_sync), qbo_sync_path, method: :get) if User.current.admin?%>

View File

@@ -0,0 +1,2 @@
<h3><%=t(:label_customers)%></h3>
<%= render :partial => 'customers/search' %>

View File

@@ -1,3 +1,3 @@
<h1>Edit Customer</h1>
<h1><%=t(:label_edit_customer)%></h1>
<br/>
<%= render :partial => 'customers/form' %>

View File

@@ -0,0 +1 @@
$('select#issue_estimate_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_estimates, :id, :doc_number) %>');

View File

@@ -0,0 +1 @@
$('select#issue_vehicles_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>');

View File

@@ -1,10 +1,4 @@
<h1>Customers</h1>
<br/>
<%= form_tag(customers_path, :method => "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Customers" %>
<%= submit_tag "Search" %>
<% end %>
<br/>
<h2><%=t(:field_customers)%> <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
<% if @customers.present? %>
<br/>
<% @customers.each do |c| %>
@@ -15,14 +9,16 @@
</div>
<% end %>
<p><%=t(:label_matching)%> <%= @customers.count %> <%=t(:field_customers)%> </p>
<div class="actions">
<%= will_paginate @customers %>
</div>
<% else %>
<p>There are no customers containing the term(s) <%= params[:search] %>.</p>
<p><%=t(:label_no_customers)%> <%= params[:search] %>.</p>
<% end %>
<div>
<%= Customer.count %> Customers - <b>Last Sync: </b> <%= Qbo.last_sync %>
<%= render :partial => 'qbo/stats' %>
</div>

View File

@@ -1,3 +1,3 @@
<h1>New Customer</h1>
<h2><%=t(:label_new_customer)%></h2>
<br/>
<%= render :partial => 'customers/form' %>

View File

@@ -1,12 +1,42 @@
<h1>Customer #<%= @customer.id %></h1>
<h2><%=t(:field_customer)%> #<%= @customer.id %> - <%= @customer.name %> </h2>
<div class="issue">
<div class="splitcontent">
<div class="splitcontentleft">
<h4><%=t(:label_details)%>:</h4>
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
<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">
<h4><%=t(:field_vehicles)%>:</h4>
<%= render :partial => 'vehicles/list' %>
<div style="float: right;">
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
</div>
</div>
</div>
</div>
<br/>
<h2>Details:</h2>
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
<br/>
<h2>Vehicles:</h2>
<%= render :partial => 'vehicles/list' %>
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
<br/>
<br/>
<h2>Issues:</h2>
<%= render :partial => 'issues/list_simple', locals: {issues: @issues} %>
<h3><%=@issues.open.count%> <%=t(:label_open_issues)%>:</h3>
<%= render :partial => 'issues/list_simple', locals: {issues: @issues.open} %>
<h3><%=@closed_issues.count%> <%=t(:label_closed_issues)%>:</h3>
<%= render :partial => 'issues/list_simple', locals: {issues: @closed_issues} %>

View File

@@ -0,0 +1,109 @@
<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 ? link_to_user(@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 ? link_to_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}" %>

View File

@@ -0,0 +1,11 @@
<% if @customer.present? %>
<% @customer.estimates.order(doc_number: :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 %>

View File

@@ -0,0 +1,4 @@
<%= form_tag("/qbo/estimate/doc", :method => "get", id: "est-search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_estimates), :autocomplete => "off" %>
<%= submit_tag t(:label_search), :formtarget => "_blank" %>
<% end %>

View File

@@ -0,0 +1,2 @@
<h3><%=t(:label_estimates) %></h3>
<%= render :partial => 'estimates/search' %>

View File

@@ -0,0 +1,11 @@
<% if @customer.present? %>
<% @customer.invoices.order(doc_number: :desc).each do |invoice| %>
<div class="row">
<b><%= link_to "##{invoice.doc_number}", invoice_path(invoice), target: :_blank %></b> <%= invoice.txn_date %>
</div>
<% end %>
<% else %>
<p><%=t(:label_no_invoices)%>.</p>
<% end %>

View File

@@ -0,0 +1,14 @@
<p>
<label for="issue_customer"><%= t(:customer) %></label>
<%= search_customer %>
<%= customer_id %>
<%= link_to_function(t(:label_load_customer), "updateIssueFrom('/issues/#{context[:issue].id}/edit.js', this)") %>
</p>
<p>
<%= select_estimate %>
</p>
<p>
<%= vehicle %>
</p>

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) %>

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 %>

View File

@@ -0,0 +1,35 @@
<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">
<div class="vehicle attribute">
<div class="label"><span><%=t(:field_vehicle)%></span>:</div>
<div class="value"><%= vehicle %></div>
</div>
<div class="vehicle_vin attribute">
<div class="label"><span><%=t(:field_vin)%></span>:</div>
<div class="value"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></div>
</div>
<div class="vehicle_notes attribute">
<div class="label"><span><%=t(:field_notes)%></span>:</div>
<div class="value"><%=notes%></div>
</div>
</div>
</div>

View File

@@ -1,42 +0,0 @@
<div class="row">
<div class="span6 columns">
<fieldset>
<%= form_for @payment 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">
Deposit to Account:
<div class="input">
<%= f.collection_select :account_id, @accounts, :id, :name, include_blank: true, :selected => @account, :required => true%>
</div>
</div>
<div class="clearfix">
Payment Method:
<div class="input">
<%= f.collection_select :payment_method_id, @payment_methods, :id, :name, include_blank: true, :selected => @payment_method, :required => true%>
</div>
</div>
<div class="clearfix">
Amount:
<div class="input">
<%= f.number_field :total_amount %>
</div>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</fieldset>
</div>
</div>

View File

@@ -1,3 +0,0 @@
<h1>New Payment</h1>
<br/>
<%= render :partial => 'payments/form' %>

View File

@@ -1 +1 @@
<%= flash.now[:error] = "Not Authorized" %>
<%= flash.now[:error] = t(:label_401) %>

View File

@@ -0,0 +1 @@
<b><%=t(:label_last_sync)%>: </b> <%= Qbo.last_sync if Qbo.exists? %>

View File

@@ -1,7 +1,7 @@
<!--
The MIT License (MIT)
Copyright (c) 2016 rick barrette
Copyright (c) 2022 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:
@@ -15,62 +15,58 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
<!-- 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_url %>'});
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= Setting.host_name %>/qbo/authenticate'});
</script>
<table >
<tbody>
<tr>
<th>Edmunds API Key</th>
<th><%=t(:label_client_id)%></th>
<td>
<input type="text" style="width:350px" id="settingsEdmundsAPIKey"
value="<%= settings['settingsEdmundsAPIKey'] %>"
name="settings[settingsEdmundsAPIKey]" >
<input
type="text"
style="width:350px"
id="settingsOAuthConsumerKey"
value="<%= settings['settingsOAuthConsumerKey'] %>"
name="settings[settingsOAuthConsumerKey]" >
</td>
</tr>
<tr>
<th>Intuit QBO OAuth Consumer Key</th>
<th><%=t(:label_client_secret)%></th>
<td>
<input type="text" style="width:350px" id="settingsOAuthConsumerKey"
value="<%= settings['settingsOAuthConsumerKey'] %>"
name="settings[settingsOAuthConsumerKey]" >
<input
type="text"
style="width:350px"
id="settingsOAuthConsumerSecret"
value="<%= settings['settingsOAuthConsumerSecret'] %>"
name="settings[settingsOAuthConsumerSecret]" >
</td>
</tr>
<tr>
<th>Intuit QBO OAuth Consumer Secret</th>
<th><%=t(:label_webhook_token)%></th>
<td>
<input type="text" style="width:350px" id="settingsOAuthConsumerSecret"
value="<%= settings['settingsOAuthConsumerSecret'] %>"
name="settings[settingsOAuthConsumerSecret]" >
</td>
</tr>
<tr>
<th>Intuit QBO Webhook Token</th>
<td>
<input type="text" style="width:350px" id="settingsWebhookToken"
value="<%= settings['settingsWebhookToken'] %>"
name="settings[settingsWebhookToken]" >
<input
type="text"
style="width:350px"
id="settingsWebhookToken"
value="<%= settings['settingsWebhookToken'] %>"
name="settings[settingsWebhookToken]" >
</td>
</tr>
<tr>
<th>Token Expires At</th>
<td><%= if Qbo.exists? then Qbo.first.token_expires_at end %>
</tr>
<tr>
<th>Reconnect Token At</th>
<td><%= if Qbo.exists? then Qbo.first.reconnect_token_at end %>
<th><%=t(:label_oauth_expires)%></th>
<td><%= if Qbo.exists? then Qbo.first.expire end %>
</tr>
</tbody>
</table>
<br/>
Note: You need to authenticate after saving your key and secret above
<%=t(:label_oauth_note)%>
<br/>
<br/>
@@ -81,27 +77,23 @@ Note: You need to authenticate after saving your key and secret above
<br/>
<div>
<b>Customer Count:</b> <%= Customer.count%>
<b><%=t(:label_customer_count)%>:</b> <%= Customer.count%>
</div>
<div>
<b>Item Count:</b> <%= QboItem.count %>
<b><%=t(:label_employee_count)%>:</b> <%= Employee.count %>
</div>
<div>
<b>Employee Count:</b> <%= QboEmployee.count %>
<b><%=t(:label_invoice_count)%>:</b> <%= Invoice.count %>
</div>
<div>
<b>Invoice Count:</b> <%= QboInvoice.count %>
</div>
<div>
<b>Estimate Count:</b> <%= QboEstimate.count %>
<b><%=t(:label_estimate_count)%>:</b> <%= Estimate.count %>
</div>
<br/>
<div>
<b>Last Sync: </b> <%= Qbo.last_sync %> <%= link_to " Sync Now", qbo_sync_path %>
<b><%=t(:label_last_sync)%> </b> <%= Qbo.last_sync if Qbo.exists? %> <%= link_to t(:label_sync_now), qbo_sync_path %>
</div>

View File

@@ -0,0 +1,6 @@
<% if User.current.logged? %>
<%= render :partial => 'customers/sidebar' %>
<%= render :partial => 'estimates/sidebar' %>
<% end %>

View File

@@ -0,0 +1 @@
<%= Customer.count %> <%=t(:field_customers)%> - <%= render :partial => 'qbo/last_sync' %>

View File

@@ -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 %>'});
</script>
</body>

View File

@@ -1,42 +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>
<div>
<b>Customer Count:</b> <%= @customer_count.to_s%>
</div>
<div>
<b>Item Count:</b> <%= @qbo_item_count.to_s %>
</div>
<div>
<b>Employee Count:</b> <%= @qbo_employee_count.to_s %>
</div>
<div>
<b>Invoice Count:</b> <%= @qbo_invoice_count.to_s %>
</div>
<div>
<b>Estimate Count:</b> <%= @qbo_estimate_count.to_s %>
</div>
<br/>
<div>
<b>Last Sync: </b> <%= Qbo.last_sync %>
</div>
</body>

View File

@@ -1,17 +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>
<h2>QboController#sync</h2>
</body>

View File

@@ -1,54 +1,45 @@
<table>
<tbody>
<div class="issue">
<div class="splitcontent">
<div class="splitcontentleft">
<h4><%=t(:label_details)%>:</h4>
<tr>
<th>Customer</th>
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
</tr>
<table>
<tbody>
<tr>
<th>Vehicle</th>
<td><%= vehicle.to_s %></td>
</tr>
<tr>
<th><%= t(:field_customer)%></th>
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
</tr>
<tr>
<th>VIN</th>
<td><%= vehicle.vin %></td>
</tr>
<tr>
<th><%= t(:field_vehicle) %></th>
<td><%= vehicle.to_s %></td>
</tr>
<tr>
<th>Style</th>
<td><%= vehicle.style %></td>
</tr>
<tr>
<th><%= t(:field_vin) %></th>
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td>
</tr>
<tr>
<th>Drive</th>
<td><%= vehicle.drive %></td>
</tr>
<th><%= t(:label_trim) %></th>
<td><%= vehicle.doors %> <%=t(:label_door) if vehicle.doors? %> <%= vehicle.trim %></td>
</tr>
</tbody>
</table>
<tr>
<th>Doors</th>
<td><%= vehicle.doors %></td>
</tr>
</div>
<tr>
<th>Notes</th>
<td><%= vehicle.notes %></td>
</tr>
<div class="splitcontentleft">
<tr>
<th>Issues</th>
<td><%= vehicle.issues.count %></td>
</tr>
<h4><%=t(:field_notes)%>:</h4>
<td><%= vehicle.notes %></td>
</tr>
<tr>
<td/>
<td>
</div>
</div>
</div>
<%= button_to "New Issue", new_issue_path(:vehicle_id => vehicle.id, :customer_id => vehicle.customer.id), method: :get%>
<%= button_to "Edit", edit_vehicle_path(vehicle), method: :get%>
<%= button_to "Delete", vehicle, method: :delete, data: {confirm: "You sure?"} %>
</td>
</tr>
</tbody>
</table>
<div style="float: right;">
<%= button_to t(:label_edit), edit_vehicle_path(vehicle), method: :get%>
<%= button_to t(:label_delete), vehicle, method: :delete, data: {confirm: t(:warn_ru_sure)} %>
</div>

View File

@@ -4,51 +4,45 @@
<%= form_for @vehicle do |f| %>
<div class="clearfix">
Customer:
<%=t(:field_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 %>
<%= f.autocomplete_field :customer, autocomplete_customer_name_customers_path, :value => @customer.name, :update_elements => {:id => '#customer_id', :value => '#issue_customer'}, :required => true %>
<%= f.hidden_field :customer_id, :id => "customer_id", :value => @customer.id %>
</div>
</div>
<div class="clearfix">
Make:
<%=t(:label_year)%>:
<div class="input">
<%= f.text_field :make %>
<%= f.number_field :year, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Model:
<%=t(:label_make)%>:
<div class="input">
<%= f.text_field :model %>
<%= f.text_field :make, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
VIN:
<%=t(:label_model)%>:
<div class="input">
<%= f.text_field :vin %>
<%= f.text_field :model, :autocomplete => "off" %>
</div>
</div>
<div class="clearfix">
Notes:
<%=t(:field_vin)%>:
<div class="input">
<p>
<%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@vehicle.new_record? ? nil : 'display:none') do %>
<%= f.text_area :notes,
:cols => 60,
:rows => 10,
:no_label => true %>
<% end %>
</p>
<%= f.text_field :vin , :autofocus => true %>
</div>
</div>
<div class="clearfix">
<%=t(:field_notes)%>:
<div class="input">
<%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %>
</div>
</div>

View File

@@ -11,7 +11,7 @@
<br/>
<%= vehicle.customer %>
<br/>
<%= vehicle.vin %>
<%= vehicle.vin.scan(/.{1,9}/)[0] if vehicle.vin %><b><%=vehicle.vin.scan(/.{1,9}/)[1] if vehicle.vin%></b>
</div>
</div>
<br/>
@@ -21,6 +21,8 @@
<%= will_paginate @vehicles %>
</div>
<p><%=t(:label_matching)%> <%=@vehicles.count%> <%=t(:field_vehicles) %> </p>
<% else %>
<p>There are no vehicles containing the term(s) <%= params[:search] %>.</p>
<p><%=t(:label_no_vehicles)%> <%= params[:search] %>.</p>
<% end %>

View File

@@ -0,0 +1,4 @@
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_vin), :autocomplete => "off" %>
<%= submit_tag t(:label_search) %>
<% end %>

View File

@@ -1,3 +1,3 @@
<h1>Edit Customer Vehicle</h1>
<h1><%=t(:label_edit_customer_vehicle)%></h1>
<br/>
<%= render :partial => 'vehicles/form' %>

View File

@@ -1,9 +1,4 @@
<h1>Customer Vehicles</h1>
<h2><%=t(:label_cusomer_vehicles)%> <span style="float:right"> <%= render :partial => 'vehicles/search' %> </span> </h2>
<br/>
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Vehicles by VIN" %>
<%= submit_tag "Search" %>
<% end %>
<%= render :partial => 'vehicles/list' %>

View File

@@ -1,3 +1,3 @@
<h1>New Customer Vehicle</h1>
<h2><%=t(:label_new_vehicle)%></h2>
<br/>
<%= render :partial => 'vehicles/form' %>

View File

@@ -1,8 +1,11 @@
<h1>Vehicle #<%=@vehicle.id%> </h1>
<br/>
<h2><%=t(:field_vehicle)%> #<%=@vehicle.id%></h2>
<div style="text-align: left; width:90%;">
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
<%= render :partial => 'issues/list_simple', locals: {issues: @vehicle.issues} %>
</div>
<h3><%=@issues.open.count%> <%=t(:label_open_issues)%></h3>
<%= render :partial => 'issues/list_simple', locals: {issues: @issues.open} %>
<h3><%=@closed_issues.count%> <%=t(:label_closed_issues)%></h3>
<%= render :partial => 'issues/list_simple', locals: {issues: (@closed_issues)} %>

View File

@@ -0,0 +1,23 @@
$(function() {
$("input#issue_customer_id").on("change", function() {
$.ajax({
url: "/filter_vehicles_by_customer",
type: "GET",
data: { selected_customer: $("input#issue_customer_id").val() }
});
$.ajax({
url: "/filter_estimates_by_customer",
type: "GET",
data: { selected_customer: $("input#issue_customer_id").val() }
});
});
$("input#project_customer_id").on("change", function() {
$.ajax({
url: "/filter_vehicles_by_customer",
type: "GET",
data: { selected_customer: $("input#project_customer_id").val() }
});
});
});

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);

View File

@@ -1,4 +0,0 @@
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require autocomplete-rails

View File

@@ -1,3 +0,0 @@
Edmunds::Api.configure do |config|
config.api_key = '2dheutzvhxs28dzukx5tgu47'
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -9,13 +9,82 @@
#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
# Usage I18n.t(:label)
en:
# my_label: "My label"
field_customer: "Customer"
field_qbo_item: "Item"
field_qbo_employee: "Employee"
field_qbo_invoice: "Invoice"
field_qbo_estimate: "Estimate"
field_vehicles: "Vehicle"
field_item: "Item"
field_employee: "Employee"
field_invoice: "Invoice"
field_estimate: "Estimate"
field_vehicles: "Vehicles"
field_vehicle: "Vehicle"
field_vin: "VIN"
field_notes: "Notes"
field_billed: "Billed"
label_week: "Week"
label_search_estimates: "Search Estimates"
label_search: "Search"
label_estimates: "Estimates"
label_401: "Not Authorized"
warn_ru_sure: "You sure?"
label_delete: "Delete"
label_edit: "Edit"
label_year: "Year"
label_make: " Make"
label_model: "Model"
label_no_vehicles: "There are no vehicles containing the term(s)"
label_no_customers: "There are no customers containing the term(s)"
label_matching: "Matching "
label_search_vin: "Search Vehicles by VIN"
label_edit_customer_vehicle: "Edit Customer Vehicle"
label_cusomer_vehicles: "Customer Vehicles"
label_new_vehicle: "New Customer Vehicle"
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_item_count: "Item 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"

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -8,9 +8,6 @@
#
#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.
# Main Quickbooks landing page
get 'qbo', :to=> 'qbo#index'
#authentication
get 'qbo/authenticate', :to => 'qbo#authenticate'
get 'qbo/oauth_callback', :to => 'qbo#oauth_callback'
@@ -18,25 +15,30 @@ get 'qbo/oauth_callback', :to => 'qbo#oauth_callback'
#manual sync
get 'qbo/sync', :to => 'qbo#sync'
#webhook
post 'qbo/webhook', :to => 'qbo#webhook'
# Estimate & Invoice PDF
get 'qbo/estimate/:id', :to => 'estimate#show', as: :estimate
get 'qbo/invoice/:id', :to => 'invoice#show', as: :invoice
get 'estimates/:id', :to => 'estimate#show', as: :estimate
get 'estimates/doc/:id', :to => 'estimate#doc', as: :estimate_doc
get 'invoices/:id', :to => 'invoice#show', as: :invoice
#manual billing
get 'qbo/bill/:id', :to => 'qbo#bill', as: :bill
get 'bill/:id', :to => 'qbo#bill', as: :bill
#payments
resources :payments
#customer issue view
get 'customers/view/:token', :to => 'customers#view', as: :view
get 'customers/share/:id', :to => 'customers#share', as: :share
#webhook
post 'qbo/webhook', :to => 'qbo#qbo_webhook'
#ajax
get "update_vehicles" => 'vehicles#update_vehicles', as: 'update_vehicles'
#java script routes
get 'filter_vehicles_by_customer' => 'customers#filter_vehicles_by_customer'
get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer'
get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer'
# Nest Vehicles under customers
resources :customers do
resources :vehicles
get :autocomplete_customer_name, :on => :collection
end
#allow for just vehicles too

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQbos < ActiveRecord::Migration
class CreateQbos < ActiveRecord::Migration[5.1]
def change
create_table :qbos do |t|

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboCustomers < ActiveRecord::Migration
class CreateQboCustomers < ActiveRecord::Migration[5.1]
def change
create_table :qbo_customers, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateIssues < ActiveRecord::Migration
class UpdateIssues < ActiveRecord::Migration[5.1]
def change
add_reference :issues, :qbo_customer, index: true
add_reference :issues, :qbo_item, index: true

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboItems < ActiveRecord::Migration
class CreateQboItems < ActiveRecord::Migration[5.1]
def change
create_table :qbo_items, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboEmployees < ActiveRecord::Migration
class CreateQboEmployees < ActiveRecord::Migration[5.1]
def change
create_table :qbo_employees, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateUsers < ActiveRecord::Migration
class UpdateUsers < ActiveRecord::Migration[5.1]
def change
add_reference :users, :qbo_employee, index: true
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateTimeEntries < ActiveRecord::Migration
class UpdateTimeEntries < ActiveRecord::Migration[5.1]
def change
add_column :time_entries, :qbo_billed, :boolean, :default => false
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboEstimates < ActiveRecord::Migration
class CreateQboEstimates < ActiveRecord::Migration[5.1]
def change
create_table :qbo_estimates, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateQbos < ActiveRecord::Migration
class UpdateQbos < ActiveRecord::Migration[5.1]
def change
rename_column :qbos, :token, :qb_token
rename_column :qbos, :secret, :qb_secret

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateIssuesWithEstimates < ActiveRecord::Migration
class UpdateIssuesWithEstimates < ActiveRecord::Migration[5.1]
def change
add_reference :issues, :qbo_estimate, index: true
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboInvoices < ActiveRecord::Migration
class CreateQboInvoices < ActiveRecord::Migration[5.1]
def change
create_table :qbo_invoices, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateIssuesWithInvoices< ActiveRecord::Migration
class UpdateIssuesWithInvoices< ActiveRecord::Migration[5.1]
def change
add_reference :issues, :qbo_invoice, index: true
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateQboPurchases< ActiveRecord::Migration
class CreateQboPurchases< ActiveRecord::Migration[5.1]
def change
create_table :qbo_purchases, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateCustomers < ActiveRecord::Migration
class UpdateCustomers < ActiveRecord::Migration[5.1]
def change
add_reference :qbo_customers, :qbo_purchase, index: true
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateQboPurchases < ActiveRecord::Migration
class UpdateQboPurchases < ActiveRecord::Migration[5.1]
def change
rename_column :qbo_purchases, :customer_id, :qbo_customer_id
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class CreateVehicles < ActiveRecord::Migration
class CreateVehicles < ActiveRecord::Migration[5.1]
def change
create_table :vehicles do |t|

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateIssuesWithVehicles < ActiveRecord::Migration
class UpdateIssuesWithVehicles < ActiveRecord::Migration[5.1]
def change
add_reference :issues, :vehicles, index: true
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateVehicles < ActiveRecord::Migration
class UpdateVehicles < ActiveRecord::Migration[5.1]
def change
add_column :vehicles, :name, :text
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class QbocustomersToCustomers< ActiveRecord::Migration
class QbocustomersToCustomers< ActiveRecord::Migration[5.1]
def change
rename_table :qbo_customers, :customers
rename_column :issues, :qbo_customer_id, :customer_id

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class UpdateQbosTimeStamp < ActiveRecord::Migration
class UpdateQbosTimeStamp < ActiveRecord::Migration[5.1]
def change
add_column :qbos, :last_sync, :datetime
end

View File

@@ -1,6 +1,6 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#Copyright (c) 2022 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:
#
@@ -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.
class AddIssuesQboInvoices < ActiveRecord::Migration
class AddIssuesQboInvoices < ActiveRecord::Migration[5.1]
def self.up
create_table :issues_qbo_invoices, :id => false do |t|
t.references :issue

View File

@@ -0,0 +1,15 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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 UpdateIssuesRemoveInvoice < ActiveRecord::Migration[5.1]
def change
remove_reference :issues, :qbo_invoice
end
end

View File

@@ -0,0 +1,19 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,16 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,16 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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 UpdateProjects < ActiveRecord::Migration[5.1]
def change
add_reference :projects, :customer, index: true
add_reference :projects, :vehicle, index: true
end
end

View File

@@ -0,0 +1,26 @@
#The License
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,15 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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 AddCustomersPhoneNumber < ActiveRecord::Migration[5.1]
def change
add_column :customers, :phone_number, :string
end
end

View File

@@ -0,0 +1,15 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,17 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,17 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

View File

@@ -0,0 +1,18 @@
#The MIT License (MIT)
#
#Copyright (c) 2022 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

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