1335 Commits
0.0.2 ... 0.4.1

Author SHA1 Message Date
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
fee0548899 Version Bump 0.4.0
Added "Bill Time" button to Issue view to allow for manual billing of a work ticket without closing. This will be useful for work orders that might take months to complete.

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

Added Last Sync to footer
2016-09-01 08:57:53 -04:00
5ddb45ba24 Update qbo_invoice.rb 2016-09-01 08:52:23 -04:00
98c965c607 Update qbo_invoice.rb 2016-09-01 08:41:22 -04:00
6e1d23af4e Update qbo_invoice.rb 2016-09-01 08:37:21 -04:00
8da45bd348 Update qbo_invoice.rb 2016-09-01 08:33:59 -04:00
620c4b395e Update issue_patch.rb 2016-09-01 08:31:24 -04:00
d75208a75a Update qbo_invoice.rb 2016-09-01 08:31:04 -04:00
4f08825fb1 Update qbo_invoice.rb 2016-09-01 08:29:12 -04:00
865470fc11 Update qbo_invoice.rb 2016-09-01 08:28:01 -04:00
d827936c85 Update issue_patch.rb 2016-09-01 08:26:20 -04:00
fcc614ff54 Update 21_add_issues_qbo_invoices.rb 2016-09-01 08:22:51 -04:00
b7abe2610e Update issue_patch.rb 2016-09-01 08:20:47 -04:00
d916464423 Update qbo_invoice.rb 2016-09-01 08:19:03 -04:00
32164157c2 Update qbo_invoice.rb 2016-09-01 08:06:24 -04:00
ce4b957c8e Update qbo_invoice.rb 2016-09-01 08:00:16 -04:00
3735629073 Update qbo_invoice.rb 2016-09-01 07:58:38 -04:00
d41d618be5 Update issues_save_hook_listener.rb 2016-09-01 02:37:31 -04:00
d97f3cb2a3 Update header_footer_hook_listener.rb 2016-09-01 02:29:33 -04:00
dcf31116b4 Update header_footer_hook_listener.rb 2016-09-01 02:28:25 -04:00
219141eeee Update header_footer_hook_listener.rb 2016-09-01 02:26:47 -04:00
765b5b6024 Update header_footer_hook_listener.rb 2016-09-01 02:25:57 -04:00
4efca93d03 Update header_footer_hook_listener.rb 2016-09-01 02:25:17 -04:00
e2a4908420 Update header_footer_hook_listener.rb 2016-09-01 02:22:58 -04:00
183b8d17e6 Update header_footer_hook_listener.rb 2016-09-01 02:22:29 -04:00
ed2b84c697 Update init.rb 2016-09-01 02:20:31 -04:00
59410e6d77 Create header_footer_hook_listener.rb 2016-09-01 02:19:06 -04:00
a134d1b601 Update issues_show_hook_listener.rb 2016-09-01 01:59:42 -04:00
56161f12d0 Update issues_form_hook_listener.rb 2016-09-01 01:58:10 -04:00
146dbb137c Update issues_form_hook_listener.rb 2016-09-01 01:55:44 -04:00
4f23439dac Update issues_show_hook_listener.rb 2016-09-01 01:52:45 -04:00
8b33aa6f6a Update issues_form_hook_listener.rb 2016-09-01 01:52:19 -04:00
4f72a8e5ad Update issue_patch.rb 2016-09-01 01:48:43 -04:00
fae4782ef0 Update qbo_controller.rb 2016-09-01 01:47:43 -04:00
37ea01de8c Update qbo_controller.rb 2016-09-01 01:42:45 -04:00
2c53155207 Update qbo_controller.rb 2016-09-01 01:41:54 -04:00
dbe585ca2a Update issue_patch.rb 2016-09-01 01:40:09 -04:00
6434092306 Update qbo_controller.rb 2016-09-01 01:38:59 -04:00
8720176b57 Update qbo_controller.rb 2016-09-01 01:37:57 -04:00
5bdf313fa5 Update qbo_controller.rb 2016-09-01 01:36:33 -04:00
4527e74d29 Update issues_show_hook_listener.rb 2016-09-01 01:35:11 -04:00
8e6e543c5b Update issues_show_hook_listener.rb 2016-09-01 01:32:22 -04:00
dbbd4a2593 Update issues_show_hook_listener.rb 2016-09-01 01:31:43 -04:00
6b55f92454 Update issues_show_hook_listener.rb 2016-09-01 01:29:53 -04:00
fba9645932 Update routes.rb 2016-09-01 01:28:16 -04:00
0cc867b410 Update issues_show_hook_listener.rb 2016-09-01 01:27:24 -04:00
40f738d976 Update routes.rb 2016-09-01 01:24:14 -04:00
82ecaae156 Update qbo_controller.rb 2016-09-01 01:22:16 -04:00
8d4ac896fa Update issue_patch.rb 2016-09-01 01:14:55 -04:00
7c6246a539 Update issues_show_hook_listener.rb 2016-09-01 01:11:46 -04:00
ce88cdd258 No Duplicates! 2016-09-01 01:10:17 -04:00
f179b04af1 Update and rename 21_add_qbo_invoices_issues.rb to 21_add_issues_qbo_invoices.rb 2016-09-01 00:49:15 -04:00
0070264d51 Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:18:56 -04:00
22db89a6d9 Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:17:45 -04:00
78dfad9875 Update issues_show_hook_listener.rb 2016-09-01 00:12:01 -04:00
6a55138f7c Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:04:27 -04:00
f95ee10290 Update qbo_invoice.rb 2016-09-01 00:01:56 -04:00
adb864c9ca Update 21_add_qbo_invoices_issues.rb 2016-09-01 00:00:10 -04:00
f3f92e48e0 Create 21_add_qbo_invoices_issues.rb 2016-08-31 23:58:52 -04:00
87a9d978c2 Update qbo_invoice.rb 2016-08-31 23:54:20 -04:00
9981b9ef70 Update issue_patch.rb 2016-08-31 23:54:00 -04:00
94f10dc9cd Update issue_patch.rb 2016-08-31 23:52:55 -04:00
e3fdc070df Update issue_patch.rb 2016-08-31 23:50:35 -04:00
4cae63d02b Update issues_show_hook_listener.rb 2016-08-31 23:47:40 -04:00
d856ceeec7 Update issues_show_hook_listener.rb 2016-08-31 23:45:26 -04:00
d461570b14 Update issues_show_hook_listener.rb 2016-08-31 23:44:02 -04:00
924e0d7bc9 Update issues_show_hook_listener.rb 2016-08-31 23:43:14 -04:00
6b3280edaf Update issues_show_hook_listener.rb 2016-08-31 23:41:44 -04:00
722d66f130 Added bill_time 2016-08-31 23:37:57 -04:00
16083a6f30 Update qbo_invoice.rb 2016-08-15 08:37:07 -04:00
1b6fe073dc Update payments_controller.rb 2016-08-15 07:48:40 -04:00
9f6103ad89 Update payments_controller.rb 2016-08-15 07:47:44 -04:00
8a67cdf37c Update payments_controller.rb 2016-08-15 07:46:48 -04:00
9b444d638b Update payments_controller.rb 2016-08-15 07:45:32 -04:00
abab81158f Update payments_controller.rb 2016-08-15 07:44:47 -04:00
26c0716d35 Sort! 2016-08-15 07:43:46 -04:00
7f7c724ef1 Update qbo_invoice.rb 2016-08-15 07:41:56 -04:00
f083e8257a Simplified & Removed the unnecessary nested loops 2016-08-15 07:39:51 -04:00
4cb588e992 Added is_changed to stop endless update loop with webhook 2016-08-12 19:25:03 -04:00
245d2b49a2 Update invoice outside of loop (woops) 2016-08-12 16:56:35 -04:00
e888bd0d38 Update README.md 2016-08-11 00:49:54 -04:00
6cfd56ed01 Update qbo_invoice.rb 2016-08-11 00:42:49 -04:00
647af6f87a Update qbo_invoice.rb 2016-08-11 00:35:53 -04:00
0e2f9b1031 Update qbo_invoice.rb 2016-08-11 00:34:09 -04:00
86ee8908b3 Update qbo_invoice.rb 2016-08-11 00:31:45 -04:00
a0618b51ba Update qbo_invoice.rb 2016-08-11 00:18:14 -04:00
272369ba4c Delete vehicles.js 2016-08-10 23:40:51 -04:00
6319c24b5c Update customer.rb 2016-08-10 23:39:52 -04:00
a3180a318c Delete _dropdown.html.erb 2016-08-10 23:37:06 -04:00
aeb890cbed Delete update_vehicles.js.erb 2016-08-10 23:36:27 -04:00
4a94ca1d17 Delete without_callback.rb 2016-08-10 23:35:47 -04:00
63d845ed97 Update issue_patch.rb 2016-08-10 23:33:53 -04:00
cb67cab974 Update routes.rb 2016-08-10 23:33:34 -04:00
df94564d9b Update issues_form_hook_listener.rb 2016-08-10 23:33:15 -04:00
540e008f68 Update issues_form_hook_listener.rb 2016-08-10 23:32:14 -04:00
c85d3ba8d5 Update routes.rb 2016-08-10 23:31:42 -04:00
1df335ed16 Update issue_patch.rb 2016-08-10 23:30:48 -04:00
7ca5076477 Update customers_controller.rb 2016-08-10 23:30:16 -04:00
6605946e62 Update issues_form_hook_listener.rb 2016-08-10 23:20:56 -04:00
ba45c776ae Update routes.rb 2016-08-10 23:19:54 -04:00
dcf17052b6 Update customers_controller.rb 2016-08-10 23:17:57 -04:00
8b9acccb8a Update issues_form_hook_listener.rb 2016-08-10 23:16:09 -04:00
2afed176f0 Update issues_form_hook_listener.rb 2016-08-10 23:10:23 -04:00
577788110e Update issues_form_hook_listener.rb 2016-08-10 23:09:00 -04:00
d251ea066f Update issues_form_hook_listener.rb 2016-08-10 23:07:39 -04:00
609e65b7cd Update issues_form_hook_listener.rb 2016-08-10 23:04:16 -04:00
6c2dd29a57 Update issues_form_hook_listener.rb 2016-08-10 23:01:56 -04:00
98896ac0a6 Update issues_form_hook_listener.rb 2016-08-10 22:59:37 -04:00
19ba3abade Update issues_form_hook_listener.rb 2016-08-10 22:55:12 -04:00
3347490b82 Update routes.rb 2016-08-10 22:54:37 -04:00
d1457b09be Update customers_controller.rb 2016-08-10 22:54:05 -04:00
1b71439f19 Update Gemfile 2016-08-10 22:51:29 -04:00
55c09d7e9d Update Gemfile 2016-08-10 22:50:26 -04:00
8429c29c30 Update issues_save_hook_listener.rb 2016-08-10 22:47:45 -04:00
10f8a7e124 Update issues_form_hook_listener.rb 2016-08-10 22:46:16 -04:00
e8763ea923 Update issues_form_hook_listener.rb 2016-08-10 22:44:20 -04:00
e5601030b1 Update issues_form_hook_listener.rb 2016-08-10 22:42:43 -04:00
ad8d15203e Update customers_controller.rb 2016-08-10 22:38:26 -04:00
3b4e55727c Update routes.rb 2016-08-10 22:36:45 -04:00
5dc2921d40 Update issues_form_hook_listener.rb 2016-08-10 22:34:49 -04:00
0c4ef8abe9 Create autocomplete.js 2016-08-10 22:33:46 -04:00
8165523acf Update Gemfile 2016-08-10 22:32:42 -04:00
7d1e9bb838 Update routes.rb 2016-08-10 22:09:16 -04:00
0d9140958f Update issue_patch.rb 2016-08-10 22:06:54 -04:00
16ca8177e9 Update README.md 2016-08-10 22:03:50 -04:00
a0e9061a8f Update qbo_controller.rb 2016-08-10 01:24:18 -04:00
a56c01fe6d Update README.md 2016-08-10 01:20:24 -04:00
1cb9639f03 Added skipping of unknown items 2016-08-10 00:33:41 -04:00
7af89db442 Removed Item & Invoice Dropdowns 2016-08-10 00:29:25 -04:00
fae815fd7f Removed Item 2016-08-10 00:26:59 -04:00
1b533d6dd8 Update issues_save_hook_listener.rb 2016-08-10 00:22:16 -04:00
bc38361348 Update issues_save_hook_listener.rb 2016-08-10 00:19:22 -04:00
a0a365c10e Update issues_save_hook_listener.rb 2016-08-10 00:14:56 -04:00
162c76471b Update issues_save_hook_listener.rb 2016-08-10 00:13:16 -04:00
328a50be47 Update issues_save_hook_listener.rb 2016-08-10 00:08:13 -04:00
7cc84277c6 Update issues_save_hook_listener.rb 2016-08-10 00:03:04 -04:00
fbac6b6d77 Update issues_save_hook_listener.rb 2016-08-09 23:47:58 -04:00
33b5ac8c87 Update issues_save_hook_listener.rb 2016-08-09 23:35:03 -04:00
74f179d64b Update init.rb 2016-08-06 23:20:54 -04:00
3cef188ff3 Update customer.rb 2016-08-06 23:19:32 -04:00
1b767f78d2 Version bump 0.3.0
* Added Payments
* Other things that I don't remember...
2016-08-05 22:00:57 -04:00
f380969082 Update payments_controller.rb 2016-08-05 21:59:21 -04:00
df6acde327 Update payments_controller.rb 2016-08-05 21:57:31 -04:00
0318ffaa10 Update payments_controller.rb 2016-08-05 21:56:23 -04:00
51c1b38197 Update init.rb 2016-08-05 21:45:08 -04:00
d96bd1a3f4 Update init.rb 2016-08-05 21:44:00 -04:00
b6e43b5837 Update payment.rb 2016-08-05 21:41:52 -04:00
62fa98a656 Update payment.rb 2016-08-05 21:39:53 -04:00
bb5a080f25 Update payment.rb 2016-08-05 21:37:20 -04:00
2afa9e4166 Update payment.rb 2016-08-05 21:36:01 -04:00
b489a2771f Update payment.rb 2016-08-05 21:28:56 -04:00
0495ac1bc5 Update payment.rb 2016-08-05 21:26:11 -04:00
e3b49358bb Update payment.rb 2016-08-05 21:25:37 -04:00
08b365e69e Update payment.rb 2016-08-05 21:24:49 -04:00
5d4c49c85d Update payment.rb 2016-08-05 21:23:07 -04:00
5bc9ca34a4 Update payment.rb 2016-08-05 21:20:58 -04:00
630a1d144b Update payment.rb 2016-08-05 21:20:06 -04:00
491684f7df Update payment.rb 2016-08-05 21:18:33 -04:00
9a28247b7f Update payment.rb 2016-08-05 21:17:31 -04:00
5a91e21d45 Update payments_controller.rb 2016-08-05 21:08:05 -04:00
f6f1ca4c04 Update _form.html.erb 2016-08-05 21:01:31 -04:00
8daa10888f Update routes.rb 2016-08-05 21:00:03 -04:00
82449642d3 Update routes.rb 2016-08-05 20:58:55 -04:00
06ad2d6971 Update and rename app/views/payment/new.html.erb to app/views/payments/new.html.erb 2016-08-05 20:58:27 -04:00
4c4ca67be8 Rename app/views/payment/_form.html.erb to app/views/payments/_form.html.erb 2016-08-05 20:58:06 -04:00
b994f7c142 Update and rename payment_controller.rb to payments_controller.rb 2016-08-05 20:57:44 -04:00
97b483031d Update payment.rb 2016-08-05 20:56:04 -04:00
c624c20354 Update payment.rb 2016-08-05 20:53:55 -04:00
695e3bd24c Update payment.rb 2016-08-05 20:43:27 -04:00
ce4883cd4c Update payment_controller.rb 2016-08-05 20:42:25 -04:00
49e19cb73f Create payment.rb 2016-08-05 20:41:52 -04:00
31bb242a61 Update new.html.erb 2016-08-05 20:39:18 -04:00
2e533e8798 Rename app/views/payments/new.html.erb to app/views/payment/new.html.erb 2016-08-05 20:37:47 -04:00
e70d0c8d17 Rename app/views/payments/_form.html.erb to app/views/payment/_form.html.erb 2016-08-05 20:37:31 -04:00
d96ecd2b66 Create new.html.erb 2016-08-05 20:28:35 -04:00
a588ac19a6 Fixed typo 2016-08-05 20:27:25 -04:00
2bc8ec4f56 Added payments 2016-08-05 20:25:34 -04:00
578a5a1228 Create payment_controller.rb 2016-08-05 20:20:05 -04:00
416595ffea Create _form.html.erb 2016-08-05 20:09:49 -04:00
d3be59fbc5 Update _details.html.erb 2016-08-05 09:07:50 -04:00
3c3b4da313 Update _details.html.erb 2016-08-05 09:06:58 -04:00
501834419b Update _details.html.erb 2016-08-05 09:02:46 -04:00
75b25a9e44 Account Balance & Adresses 2016-08-05 09:01:09 -04:00
15912b2197 QueryValidationError: property 'PrimaryPhone' is not queryable 2016-08-05 08:52:33 -04:00
b093f6136e Update customer.rb 2016-08-05 08:49:59 -04:00
33db0a53ba Update customer.rb 2016-08-05 08:46:48 -04:00
7237d2e643 Search Phone Numbers 2016-08-05 08:43:44 -04:00
77b1c1dbef Update vehicle.rb 2016-08-05 00:56:28 -04:00
f3090bd1a4 Update vehicle.rb 2016-08-05 00:54:34 -04:00
89a131018c Update vehicles_controller.rb 2016-08-05 00:47:37 -04:00
de17fb80d1 Update _form.html.erb 2016-08-05 00:45:55 -04:00
a5f1d15156 Update vehicles_controller.rb 2016-08-05 00:45:23 -04:00
d3463ce41b Removed link 2016-08-05 00:39:53 -04:00
4503150b02 Removed hiding of notes 2016-08-05 00:37:29 -04:00
36cd00822e Removed New Vehicle Button 2016-08-05 00:33:14 -04:00
d285344a61 Added customer count 2016-08-05 00:30:00 -04:00
8418dfc0b5 Update vehicles_controller.rb 2016-08-05 00:04:31 -04:00
eb039368bb Version bump 0.2.0
* New Top & Application Menus
* Move quickbooks stats into QBO settings page
* Fixed New vehicle for customer link
* Added issue linking from hashtag numbers in QBO invoice line items
* Cleaned up customer & vehicle lists
* Implemented delete calls from web hook
* Added webhook token verification
* More...
2016-08-04 10:12:12 -04:00
0dea5917a7 Update _settings.html.erb 2016-08-04 10:06:07 -04:00
a8ccde6c81 Update _settings.html.erb 2016-08-04 10:05:07 -04:00
787ae1b8df Update _settings.html.erb 2016-08-04 10:03:28 -04:00
276c89d4ac Update init.rb 2016-08-04 09:59:12 -04:00
9a395ee25c Update _list.html.erb 2016-08-04 09:53:02 -04:00
475c86eabe Update show.html.erb 2016-08-04 09:52:32 -04:00
259737a488 Update show.html.erb 2016-08-04 09:51:47 -04:00
362cb77381 Update show.html.erb 2016-08-04 09:50:55 -04:00
8cfab17136 Update show.html.erb 2016-08-04 09:50:37 -04:00
f0018ab87d Update _details.html.erb 2016-08-04 09:49:52 -04:00
8f87eb3e60 Update show.html.erb 2016-08-04 09:48:19 -04:00
2b093903b3 Update show.html.erb 2016-08-04 09:46:22 -04:00
05017dcc4f Update show.html.erb 2016-08-04 09:45:39 -04:00
0e9b5fa17a Update show.html.erb 2016-08-04 09:44:09 -04:00
dd335aff71 Update _form.html.erb 2016-08-04 00:18:32 -04:00
0f61bf54ce Update index.html.erb 2016-08-04 00:15:33 -04:00
14cb22d743 Update vehicles_controller.rb 2016-08-04 00:13:47 -04:00
702ab5013e Update index.html.erb 2016-08-04 00:11:54 -04:00
235e2c6e7b Update routes.rb 2016-08-04 00:10:46 -04:00
2e89a60d63 Update vehicles_controller.rb 2016-08-04 00:09:52 -04:00
3d5ef2cd8a Update vehicles_controller.rb 2016-08-04 00:08:21 -04:00
de8eff9bd2 Update vehicles_controller.rb 2016-08-04 00:03:35 -04:00
a9561d1694 Update vehicles_controller.rb 2016-08-04 00:02:56 -04:00
aa33de00d2 Update index.html.erb 2016-08-04 00:01:15 -04:00
ffc589fe80 Update index.html.erb 2016-08-03 23:59:50 -04:00
229e4e8d39 Update index.html.erb 2016-08-03 23:57:28 -04:00
d6dda2cdd6 Update init.rb 2016-08-03 23:54:17 -04:00
b8a101fddb Update routes.rb 2016-08-03 23:50:55 -04:00
c8a875b301 Update init.rb 2016-08-03 23:45:30 -04:00
df8e3a7465 Update init.rb 2016-08-03 23:35:43 -04:00
d91a6e3939 Update init.rb 2016-08-03 23:15:38 -04:00
48a2d683dd Update init.rb 2016-08-03 23:13:55 -04:00
44bf42c548 Update init.rb 2016-08-03 23:11:00 -04:00
d34e6cb0fd Update issues_form_hook_listener.rb 2016-08-03 23:05:19 -04:00
d8e7356ca3 Update init.rb 2016-08-03 23:03:59 -04:00
60e6dbaa6f Update issues_form_hook_listener.rb 2016-08-03 22:50:53 -04:00
47e5a7d0e4 Update issues_form_hook_listener.rb 2016-08-03 22:48:26 -04:00
9fa2165907 Update issues_form_hook_listener.rb 2016-08-03 22:46:42 -04:00
7385d7018c Update issues_form_hook_listener.rb 2016-08-03 22:45:23 -04:00
6124c1b307 Update issues_form_hook_listener.rb 2016-08-03 22:44:56 -04:00
b73535c6da Update issues_form_hook_listener.rb 2016-08-03 22:43:40 -04:00
1581023656 Update vehicles.js 2016-08-03 22:39:33 -04:00
0d21e2967d Rename vehicles.js.cof to vehicles.js 2016-08-03 22:37:48 -04:00
0dc7d83fbe Update issues_form_hook_listener.rb 2016-08-03 22:37:30 -04:00
cd18067384 Rename vehicles.js to vehicles.js.coffee 2016-08-03 22:36:12 -04:00
6c99f7095c Update issues_form_hook_listener.rb 2016-08-03 22:35:49 -04:00
eeaafce427 Rename vehicles.js.coffee to vehicles.js 2016-08-03 22:32:19 -04:00
b7cb27b5da Update vehicles.js.coffee 2016-08-03 22:30:04 -04:00
3e6286da7c Update vehicles.js.coffee 2016-08-03 22:28:31 -04:00
30ceea7fd5 Update vehicles_controller.rb 2016-08-03 22:23:07 -04:00
de9e973fd9 Update routes.rb 2016-08-03 22:22:23 -04:00
49a3bd5790 Update routes.rb 2016-08-03 22:19:23 -04:00
f1745930b1 Update routes.rb 2016-08-03 22:15:43 -04:00
d9beda8171 Rename update_vehicles.js.coffee.erb to update_vehicles.js.erb 2016-08-03 22:14:23 -04:00
65f343fb74 Update vehicles_controller.rb 2016-08-03 22:13:18 -04:00
892bd65fac Rename update_vehicles.js.coffee to update_vehicles.js.coffee.erb 2016-08-03 22:10:50 -04:00
0251191844 Update vehicles_controller.rb 2016-08-03 22:05:25 -04:00
65f6f52252 Update update_vehicles.js.coffee 2016-08-03 21:58:47 -04:00
4d94308bcc Update vehicles_controller.rb 2016-08-03 21:57:50 -04:00
7dcd8b24d2 Update vehicles.js.coffee 2016-08-03 21:55:31 -04:00
11da8e7a43 Update vehicles_controller.rb 2016-08-03 21:54:05 -04:00
56c895388d Update vehicles.js.coffee 2016-08-03 21:53:31 -04:00
8ec9567f15 Update issues_form_hook_listener.rb 2016-08-03 21:50:02 -04:00
be3dd0d131 Rename assets/javascripts/app/assets/vehicles.js.coffee to assets/javascripts/vehicles.js.coffee 2016-08-03 21:40:04 -04:00
92f51d9884 Create _vehicle.html.erb 2016-08-03 21:34:10 -04:00
c4904a0ac2 Create update_vehicles.js.coffee 2016-08-03 21:29:01 -04:00
0d87e5fb21 Create vehicles.js.coffee 2016-08-03 21:26:21 -04:00
d38e3e1702 Update routes.rb 2016-08-03 21:22:34 -04:00
fec59a7495 Update vehicles_controller.rb 2016-08-03 21:20:08 -04:00
a3b5ad0cb0 Update show.html.erb 2016-08-03 21:16:31 -04:00
bf21451819 Update show.html.erb 2016-08-03 21:15:40 -04:00
c6d3d9673b Update show.html.erb 2016-08-03 21:15:03 -04:00
3f5334a92d Update show.html.erb 2016-08-03 21:14:25 -04:00
bde7b83752 Update show.html.erb 2016-08-03 21:13:40 -04:00
c788e5724a Update show.html.erb 2016-08-03 21:12:54 -04:00
295cd12f9d Update show.html.erb 2016-08-03 21:11:57 -04:00
4a432481d9 Update show.html.erb 2016-08-03 21:11:05 -04:00
4a37d83694 Update show.html.erb 2016-08-03 21:09:15 -04:00
15a2a16379 Update show.html.erb 2016-08-03 21:08:42 -04:00
18fc7a6c8c Update vehicles_controller.rb 2016-08-03 21:02:45 -04:00
7aba8cdce3 Update qbo_invoice.rb 2016-08-03 16:40:05 -04:00
382e6675f1 Update qbo_invoice.rb 2016-08-03 16:39:07 -04:00
116d6896f4 Update qbo_invoice.rb 2016-08-03 16:38:09 -04:00
c9ced52112 Update qbo_invoice.rb 2016-08-03 16:36:50 -04:00
01b4bb4e53 Update qbo_invoice.rb 2016-08-03 16:35:04 -04:00
a266da2cd7 Update qbo_invoice.rb 2016-08-03 16:33:38 -04:00
578e7ba807 Update qbo_invoice.rb 2016-08-03 16:32:52 -04:00
b923e15d46 Update qbo_invoice.rb 2016-08-03 16:31:17 -04:00
1310d1e63e Update qbo_invoice.rb 2016-08-03 16:27:30 -04:00
a8e1e8429c Update qbo_invoice.rb 2016-08-03 16:25:33 -04:00
1b54b40f6c Update qbo_invoice.rb 2016-08-03 16:22:44 -04:00
6d7530922d Update qbo_invoice.rb 2016-08-03 16:20:26 -04:00
23698986b1 Update qbo_invoice.rb 2016-08-03 16:15:50 -04:00
1b4c377940 Update _details.html.erb 2016-08-01 22:35:12 -04:00
d33c0c9aa5 Update _details.html.erb 2016-08-01 22:34:38 -04:00
09d8c0024f Update _details.html.erb 2016-08-01 22:33:32 -04:00
06e827fff8 Version bump 0.1.0 2016-08-01 22:30:47 -04:00
b1844689df Update qbo_controller.rb 2016-08-01 22:29:53 -04:00
a4263a92ca Update issues_show_hook_listener.rb 2016-08-01 22:20:57 -04:00
14cc251809 Update Gemfile 2016-08-01 21:56:17 -04:00
471e8f3398 Update qbo_controller.rb 2016-08-01 21:56:00 -04:00
dadbda62c6 Update qbo_controller.rb 2016-08-01 21:55:30 -04:00
df47efe816 Update qbo_controller.rb 2016-08-01 21:54:31 -04:00
03cc6943a3 Update Gemfile 2016-08-01 21:51:04 -04:00
6f0163ce7d Update qbo_controller.rb 2016-08-01 21:49:17 -04:00
91110adad5 Update qbo_controller.rb 2016-08-01 21:47:30 -04:00
c2f48d0277 Update qbo_controller.rb 2016-08-01 21:41:47 -04:00
06344b6498 Update qbo_controller.rb 2016-08-01 21:34:14 -04:00
4ff2b2bdc6 Update _settings.html.erb 2016-08-01 21:28:15 -04:00
a71dd310fe Update issues_show_hook_listener.rb 2016-08-01 21:24:22 -04:00
90da7a5d74 Update issues_show_hook_listener.rb 2016-08-01 21:23:15 -04:00
6505f54c7f Update issues_show_hook_listener.rb 2016-08-01 21:22:31 -04:00
c4a488e5a7 Update issues_show_hook_listener.rb 2016-08-01 21:21:41 -04:00
71817f5ca8 Update issues_show_hook_listener.rb 2016-08-01 21:18:31 -04:00
77c97ef2c1 Update vehicle.rb 2016-08-01 21:14:02 -04:00
875ec19e38 Update customer.rb 2016-08-01 21:09:39 -04:00
f47e77f816 Version bump 0.0.8 2016-08-01 21:08:49 -04:00
144a52f813 Add files via upload 2016-08-01 21:07:01 -04:00
f9a5269fd7 Delete plugin_issue_edit.png 2016-08-01 21:06:48 -04:00
bc1445f8bb Update qbo_employee.rb 2016-08-01 21:01:06 -04:00
01e5415074 Update qbo_controller.rb 2016-08-01 20:57:51 -04:00
697ff4f9d5 Update qbo_controller.rb 2016-08-01 20:54:42 -04:00
fe7cfc6b1d Update qbo_controller.rb 2016-08-01 20:52:24 -04:00
7a7e148719 Update README.md 2016-08-01 20:38:04 -04:00
95db8f9839 Update _list.html.erb 2016-08-01 20:31:48 -04:00
7fb91ae10b Update _list.html.erb 2016-08-01 20:29:58 -04:00
0c5c778c75 Update _list.html.erb 2016-08-01 20:28:18 -04:00
38865bd062 Update vehicle.rb 2016-08-01 19:34:28 -04:00
e201765f02 Update vehicles_controller.rb 2016-08-01 19:31:51 -04:00
d9ccffe3d6 Update vehicles_controller.rb 2016-08-01 19:30:25 -04:00
86e084574e Update _list.html.erb 2016-08-01 19:28:22 -04:00
756e60b865 Update index.html.erb 2016-08-01 19:09:41 -04:00
5c49094b40 Update index.html.erb 2016-08-01 19:08:49 -04:00
336d1c7c7b Update vehicles_controller.rb 2016-08-01 19:05:49 -04:00
632b788082 Update vehicle.rb 2016-08-01 19:04:46 -04:00
ddd00a3e9a Update show.html.erb 2016-08-01 19:02:49 -04:00
54e59fbd98 Update show.html.erb 2016-08-01 17:00:54 -04:00
3f29a024f9 Update show.html.erb 2016-08-01 17:00:25 -04:00
c5f03ed03c Update _details.html.erb 2016-08-01 16:59:35 -04:00
547880443c Update _details.html.erb 2016-08-01 16:58:51 -04:00
838733fdc3 Update README.md 2016-08-01 16:55:56 -04:00
4b068266a9 Add files via upload 2016-08-01 16:48:46 -04:00
57c78f27a7 Delete plugin_config.png 2016-08-01 16:48:31 -04:00
3af5caef4a Update index.html.erb 2016-08-01 16:41:59 -04:00
49425656ee Update index.html.erb 2016-08-01 16:40:50 -04:00
3e85216e66 Update qbo.rb 2016-08-01 16:39:58 -04:00
443d6fc47c Update customer.rb 2016-08-01 16:13:58 -04:00
4d7bc59bd3 Update customer.rb 2016-08-01 16:12:08 -04:00
4dbeee0aa1 Update index.html.erb 2016-08-01 16:09:30 -04:00
9b137fed69 Update index.html.erb 2016-08-01 16:02:05 -04:00
9c667c20da Update index.html.erb 2016-08-01 16:01:24 -04:00
e503c965c3 Update index.html.erb 2016-08-01 15:59:51 -04:00
933d1eb730 Update qbo_controller.rb 2016-08-01 15:54:40 -04:00
c99fe57074 Update qbo_controller.rb 2016-08-01 15:52:02 -04:00
77fc54dc31 Update customer.rb 2016-08-01 15:48:28 -04:00
37f6518a15 Update customer.rb 2016-08-01 15:47:10 -04:00
bcaf011166 Update customers_controller.rb 2016-08-01 15:46:37 -04:00
27807e963d Update customers_controller.rb 2016-08-01 15:45:57 -04:00
f0fabc5e10 Update customers_controller.rb 2016-08-01 15:45:10 -04:00
e7c85eac4d Update index.html.erb 2016-08-01 15:43:45 -04:00
01ea01fef6 Update index.html.erb 2016-08-01 15:42:42 -04:00
134fb776f9 Update index.html.erb 2016-08-01 15:40:17 -04:00
9cd143c5ef Update index.html.erb 2016-08-01 15:39:04 -04:00
ba18275ef8 Update index.html.erb 2016-08-01 15:37:32 -04:00
6e92648d8b Update customers_controller.rb 2016-08-01 15:36:10 -04:00
8ddc612bba Extended search 2016-08-01 15:34:17 -04:00
2324aadcd5 Extended search 2016-08-01 15:31:54 -04:00
baff3f5a1b Extended search 2016-08-01 15:30:00 -04:00
68b6ea7649 Update _list.html.erb 2016-07-28 23:33:15 -04:00
c46cab6a6f Update customers_controller.rb 2016-07-28 23:30:49 -04:00
74807c73b0 Jump to customer is there is only one result 2016-07-28 23:27:02 -04:00
a26214fef7 Search 2016-07-28 20:50:23 -04:00
ec77a004a2 Search 2016-07-28 20:49:38 -04:00
f33203b0e3 Search 2016-07-28 20:48:34 -04:00
297dd8ec4e Search 2016-07-28 20:46:49 -04:00
bbc2ae4750 Search 2016-07-28 20:45:29 -04:00
fb1a560751 Search 2016-07-28 20:44:15 -04:00
bee48c4f0f Version Bump 0.0.7! 2016-07-28 20:37:13 -04:00
0f8fbfb8df Update qbo.rb 2016-07-28 20:34:31 -04:00
d71e9a78a1 Update qbo_controller.rb 2016-07-28 20:06:06 -04:00
7ac778586c Update qbo.rb 2016-07-28 20:03:36 -04:00
2558cb69b1 Update qbo_controller.rb 2016-07-28 19:52:42 -04:00
55ac8d12a5 Update qbo_controller.rb 2016-07-28 19:51:48 -04:00
a5dc5ce921 Update qbo.rb 2016-07-28 19:42:09 -04:00
de65cc0926 Update qbo.rb 2016-07-28 19:41:02 -04:00
80d3eed224 Update qbo_controller.rb 2016-07-28 19:32:24 -04:00
76beccfb9f Update qbo_controller.rb 2016-07-28 19:31:24 -04:00
5579cd9255 Update _settings.html.erb 2016-07-28 19:27:00 -04:00
236e84f11a Update _settings.html.erb 2016-07-28 19:23:20 -04:00
ed61dc6bbf Update qbo_controller.rb 2016-07-28 19:21:40 -04:00
2b7ac05338 Update qbo.rb 2016-07-28 19:19:13 -04:00
36e63995aa Update qbo_controller.rb 2016-07-28 19:15:19 -04:00
58d16fbc7d Update qbo_controller.rb 2016-07-28 19:12:36 -04:00
aa78482c36 Update qbo_controller.rb 2016-07-28 19:11:09 -04:00
c35b6a3f6b Update qbo_controller.rb 2016-07-28 18:35:44 -04:00
8d52c46a53 Update qbo_controller.rb 2016-07-28 18:31:54 -04:00
325f124e4e Update qbo_controller.rb 2016-07-28 18:30:48 -04:00
18d71a69f8 Update qbo_controller.rb 2016-07-28 18:27:00 -04:00
7d5fd72297 Update qbo_controller.rb 2016-07-28 18:21:58 -04:00
a625f6d9fc Update qbo_controller.rb 2016-07-28 18:17:44 -04:00
ede89cc6cf Update qbo_controller.rb 2016-07-28 18:15:56 -04:00
c60f06e8ed Webhook 2016-07-28 09:18:50 -04:00
863a5efa38 Webhook 2016-07-28 09:17:21 -04:00
670b0aac67 Webhook 2016-07-28 09:16:13 -04:00
d261b156bd Webhook 2016-07-28 09:14:18 -04:00
c49bdb731a Webhook 2016-07-28 09:13:16 -04:00
dc2993bdea Webhook 2016-07-28 09:09:38 -04:00
09e1c0ad48 Webhook 2016-07-28 09:07:51 -04:00
370153bed9 Webhook 2016-07-28 09:04:17 -04:00
b115c4bf67 Webhook 2016-07-28 09:03:55 -04:00
90a7ac1267 Webhook 2016-07-28 09:02:29 -04:00
887d330ba9 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2016-07-28 09:02:04 -04:00
fe97a589d9 Update 2016-07-28 09:01:41 -04:00
37d0b2321f Webhook 2016-07-28 08:59:43 -04:00
47aa454895 Webhook 2016-07-28 08:57:28 -04:00
fecc4956b4 Webhook 2016-07-28 08:52:30 -04:00
0d5fb8d3e3 Update qbo_controller.rb 2016-07-28 08:47:39 -04:00
ca6e51911b Webhook 2016-07-28 08:41:23 -04:00
8159487631 Webhook 2016-07-28 08:33:26 -04:00
392b27563a Webhooks 2016-07-28 07:55:20 -04:00
60dced41db Webhook 2016-07-28 01:07:54 -04:00
8b02a80904 Webhooks 2016-07-28 01:04:00 -04:00
ff977cc364 Update pdf_patch.rb 2016-07-22 19:01:43 -04:00
3578908832 Update pdf_patch.rb 2016-07-22 19:00:24 -04:00
4fcde967f1 Update issues_show_hook_listener.rb 2016-07-22 19:00:03 -04:00
4e81c16617 Update pdf_patch.rb 2016-07-22 16:02:57 -04:00
8149f5ab9b Update issues_show_hook_listener.rb 2016-07-22 15:59:49 -04:00
7800e52299 Update users_show_hook_listener.rb 2016-07-13 16:33:04 -04:00
c6f8fd7561 Update issues_form_hook_listener.rb 2016-06-04 10:09:27 -04:00
e3d26cea23 Update issue_patch.rb 2016-06-02 09:47:42 -04:00
4fd35d4cb6 Update issues_form_hook_listener.rb 2016-06-02 09:45:54 -04:00
cf00331497 Update issues_form_hook_listener.rb 2016-06-02 09:45:28 -04:00
dc8ea82b61 Update issues_form_hook_listener.rb 2016-06-02 09:41:54 -04:00
aab99e3abe Update issues_form_hook_listener.rb 2016-06-02 09:41:14 -04:00
f240a5a6a4 Update issues_form_hook_listener.rb 2016-06-02 09:40:13 -04:00
05ce348d8a Update issues_form_hook_listener.rb 2016-06-02 09:36:34 -04:00
67afbff93d Update issues_form_hook_listener.rb 2016-06-02 09:35:41 -04:00
bd92ca8f2c Fixed Vehicle Drop down 2016-06-02 09:25:52 -04:00
7ef3e31465 New Issue Button 2016-06-02 09:20:44 -04:00
f59aa18be8 Fixed Formatting 2016-06-02 09:02:06 -04:00
2699b37e4f Edmunds API Key 2016-06-02 08:56:13 -04:00
22f8138422 Edmunds API Key Setting 2016-06-02 08:54:37 -04:00
0727257d72 Update issues_save_hook_listener.rb 2016-06-01 12:01:51 -04:00
f8a9ffbe15 Setter for email 2016-05-31 11:16:41 -04:00
aac442ab55 Version Bump 0.0.6 2016-05-31 10:04:30 -04:00
b7f0bf6049 Update README.md 2016-05-31 10:03:42 -04:00
b7b9177edf Removed unneeded gems 2016-05-31 10:01:29 -04:00
f5d7e00ec6 Added Customer Name 2016-05-31 09:57:57 -04:00
4f8c57032c nil check for customer & moved notes to the right 2016-05-31 09:55:48 -04:00
96fcb81d9e Removed Customer Name from to_s 2016-05-31 09:47:39 -04:00
1b5663fa99 Update _list.html.erb 2016-05-31 09:41:40 -04:00
a2588040ff Update _details.html.erb 2016-05-31 09:40:59 -04:00
947f56899d Fixed typo 2016-05-31 09:39:16 -04:00
731e709174 Update customer.rb 2016-05-31 08:50:56 -04:00
c3cce531d6 Update customer.rb 2016-05-31 08:48:31 -04:00
ca63852b4f Update customer.rb 2016-05-31 08:47:11 -04:00
9342ef146c Update vehicle.rb 2016-05-31 08:21:05 -04:00
00b6939571 Update vehicles_controller.rb 2016-05-31 08:20:26 -04:00
0376233ace Update vehicles_controller.rb 2016-05-31 08:18:04 -04:00
70533ae3c3 Update _form.html.erb 2016-05-31 08:09:35 -04:00
d7613bd5ba Update _form.html.erb 2016-05-31 08:07:45 -04:00
06bd0dfcce Update vehicle.rb 2016-05-31 08:06:02 -04:00
78708733be Update vehicle.rb 2016-05-31 07:58:02 -04:00
e7ae654066 Update vehicle.rb 2016-05-31 07:53:29 -04:00
5c0c0cc657 Update vehicle.rb 2016-05-31 07:52:37 -04:00
9d043e4bc8 Update customer.rb 2016-05-31 07:47:18 -04:00
08b539dc1e Comments & Sync 2016-05-31 07:42:41 -04:00
e5147b3893 Update customer.rb 2016-05-31 07:23:13 -04:00
01a2b2a1b1 Update customer.rb 2016-05-31 07:21:05 -04:00
e89f2d17e7 Update customer.rb 2016-05-31 06:55:32 -04:00
7e0888d375 Update customer.rb 2016-05-31 06:54:11 -04:00
f435f7f3c8 Update customer.rb 2016-05-31 06:49:15 -04:00
0d2be843f5 Update customer.rb 2016-05-31 06:37:11 -04:00
6e7ec44188 More progress 2016-05-30 09:30:33 -04:00
ba152e69d2 Update query_patch.rb 2016-05-29 11:54:49 -04:00
42212a073c Update query_patch.rb 2016-05-29 11:54:08 -04:00
469f8c739c Update query_patch.rb 2016-05-29 11:50:27 -04:00
53505857d6 Update query_patch.rb 2016-05-29 11:49:54 -04:00
89a02d85fe Update query_patch.rb 2016-05-29 11:47:34 -04:00
6249b057af Update query_patch.rb 2016-05-29 11:45:46 -04:00
f760ee057d Update query_patch.rb 2016-05-29 11:44:33 -04:00
291bff0813 Update query_patch.rb 2016-05-29 11:43:35 -04:00
79edbed9ce Update query_patch.rb 2016-05-29 11:37:45 -04:00
54c797c114 Update query_patch.rb 2016-05-29 11:31:25 -04:00
201a577588 Update qbo_item.rb 2016-05-29 11:18:43 -04:00
4dfbdbfdda Update customer.rb 2016-05-29 11:17:38 -04:00
3e5008aeb2 Update qbo_invoice.rb 2016-05-29 11:16:33 -04:00
bfb6d3bc4e Removed after init call back from customer 2016-05-29 11:14:26 -04:00
d829c2f83a Fixed various issues 2016-05-29 10:30:09 -04:00
ec1063f80f Update qbo_controller.rb 2016-05-25 10:49:38 -04:00
3b20c29d0a Update Gemfile 2016-05-25 10:47:22 -04:00
f2dc4b03ef Delete vehicle_helper.rb 2016-05-25 10:46:40 -04:00
22e4aba1cf Delete qbo_helper.rb 2016-05-25 10:46:34 -04:00
ece22c73ae Delete invoice_helper.rb 2016-05-25 10:46:26 -04:00
ed7e5d04ec Delete estimate_helper.rb 2016-05-25 10:46:21 -04:00
6a595ab30c Delete CustomerBackgroundHelper.rb 2016-05-25 10:46:14 -04:00
821606ee5e Delete BaseBackgroundHelper.rb 2016-05-25 10:46:08 -04:00
61440a2aca Create CustomerBackgroundHelper.rb 2016-05-25 10:28:46 -04:00
01eefe0a04 Update BaseBackgroundHelper.rb 2016-05-25 10:25:26 -04:00
9057ef3edb Update BaseBackgroundHelper.rb 2016-05-25 10:25:01 -04:00
4f333c9b94 Update BaseBackgroundHelper.rb 2016-05-25 10:24:08 -04:00
b64d91108e Update BaseBackgroundHelper.rb
http://www.takeofflabs.com/posts/21-Waiting-for-Background-Jobs
2016-05-25 10:17:11 -04:00
fe063a029e Create BaseBackgroundHelper.rb 2016-05-25 10:14:43 -04:00
b6504333c0 Update qbo_controller.rb 2016-05-25 09:14:28 -04:00
d0c3fefa77 Update qbo_controller.rb 2016-05-25 09:14:10 -04:00
a81e6b9b66 Update qbo.rb 2016-05-25 09:09:22 -04:00
a760ddc7c1 Update customer.rb 2016-05-24 12:34:16 -04:00
3e0b327ea7 Update customer.rb 2016-05-24 12:33:19 -04:00
c5296e7c5f Update customer.rb 2016-05-24 12:04:33 -04:00
fec454f43e Update customer.rb 2016-05-24 12:01:27 -04:00
bd18574bba Update customer.rb 2016-05-24 12:00:02 -04:00
c22272143d Update customer.rb 2016-05-24 11:58:35 -04:00
c3e8fb22c1 Update customer.rb 2016-05-24 11:42:40 -04:00
75defce2dc Update customer.rb 2016-05-24 11:38:55 -04:00
327d59d380 Update customer.rb 2016-05-24 11:35:13 -04:00
10ddd6731e Update customer.rb 2016-05-24 07:51:14 -04:00
181da3fef1 Update customer.rb 2016-05-24 07:33:20 -04:00
fbcc3eba9d Update customer.rb 2016-05-24 07:27:04 -04:00
d265d765d1 Update customer.rb 2016-05-24 06:56:55 -04:00
948c5d0146 Update customer.rb 2016-05-24 06:50:08 -04:00
d0adb4ed4e Less Vehicle Details in List 2016-05-24 06:37:42 -04:00
86cf0b2edd Update customer.rb 2016-05-17 13:47:58 -04:00
4ac76a62a2 Update customer.rb 2016-05-17 13:46:25 -04:00
2995060ec6 Update customer.rb 2016-05-17 13:44:04 -04:00
6e092922ac Update customer.rb 2016-05-17 13:42:32 -04:00
07b72c9cb1 Update customer.rb 2016-05-17 13:39:00 -04:00
a4904c80a0 Update customer.rb 2016-05-17 13:37:28 -04:00
181b928d19 Update customer.rb 2016-05-17 13:33:02 -04:00
fd8ca2d44d Update customer.rb 2016-05-17 13:28:41 -04:00
c72d375aea Update customer.rb 2016-05-17 13:17:44 -04:00
68e3a7cc7c Update customer.rb 2016-05-17 13:13:20 -04:00
69d047e687 Update customer.rb 2016-05-17 13:11:37 -04:00
12166839b2 Update customer.rb 2016-05-17 13:06:58 -04:00
dfb59025f6 Update customer.rb 2016-05-17 13:03:49 -04:00
684e7a45aa Update customer.rb 2016-05-17 13:00:59 -04:00
7503c68820 Update customer.rb 2016-05-17 12:59:37 -04:00
dcfe88b447 Update customer.rb 2016-05-17 12:47:17 -04:00
b5eb3e2568 Update customer.rb 2016-05-17 12:46:55 -04:00
8cf39301bd Update customer.rb 2016-05-17 12:40:53 -04:00
0bb97a4e37 Update qbo_item.rb 2016-05-17 12:30:14 -04:00
1fe10d53dd Update qbo_item.rb 2016-05-17 12:29:25 -04:00
c6b234bde1 Update customer.rb 2016-05-17 11:52:41 -04:00
68169de61d Update customer.rb 2016-05-17 11:48:58 -04:00
e82d09c027 Update qbo_controller.rb 2016-05-17 11:42:50 -04:00
65a89407ff Update customer.rb 2016-05-17 11:34:02 -04:00
76778ece82 Update customer.rb 2016-05-17 11:31:01 -04:00
dfbf5ab1af Update qbo_item.rb 2016-05-17 11:21:44 -04:00
b771199e3d Update qbo_item.rb 2016-05-17 11:06:10 -04:00
a715434f42 Update customer.rb 2016-05-17 11:03:22 -04:00
7009387a00 Update customer.rb 2016-05-17 10:56:31 -04:00
5117e7a479 Update customer.rb 2016-05-17 10:54:03 -04:00
cae904b5a8 Update customer.rb 2016-05-17 10:48:59 -04:00
9876ebf6ed Update customer.rb 2016-05-17 10:42:19 -04:00
c665f5e27b Update qbo_item.rb 2016-05-17 10:40:44 -04:00
77e5022708 Update qbo_item.rb 2016-05-17 08:01:05 -04:00
a8a97ce748 Update qbo_item.rb 2016-05-17 08:00:12 -04:00
bb9d9e5650 Update qbo_item.rb 2016-05-17 07:57:44 -04:00
c5a461f12a Update qbo_item.rb 2016-05-17 07:54:51 -04:00
4c659f9aca Update qbo_item.rb 2016-05-17 07:48:29 -04:00
7bd74df165 Update qbo_item.rb 2016-05-17 07:45:17 -04:00
5d04a8b246 Update qbo_item.rb 2016-05-17 07:22:20 -04:00
4c847a5435 Update qbo_item.rb 2016-05-17 07:21:03 -04:00
dd79571272 Update qbo_item.rb 2016-05-17 07:16:52 -04:00
b931e2967f Update customer.rb 2016-05-17 07:14:44 -04:00
4ec8ceca1b Update customer.rb 2016-05-17 07:06:22 -04:00
798aea6a8b Update customer.rb 2016-05-16 19:31:36 -04:00
e3fcc8c9be Update customer.rb 2016-05-16 18:23:07 -04:00
30255f1db8 Update customer.rb 2016-05-16 17:44:42 -04:00
24f4e9ecf2 Update customer.rb 2016-05-16 17:39:52 -04:00
454613c1ba Update customer.rb 2016-05-16 17:38:36 -04:00
eeccece2a7 Update customer.rb 2016-05-16 17:30:31 -04:00
c9c49c9425 Update customer.rb 2016-05-16 17:26:54 -04:00
d345365e0b Update customer.rb 2016-05-16 17:19:35 -04:00
897f56eb23 Update issues_form_hook_listener.rb 2016-05-16 17:14:50 -04:00
4db96a1792 Update customer.rb 2016-05-12 16:58:40 -04:00
ae572557a1 Update Gemfile 2016-05-12 12:21:39 -04:00
6605bd9467 Update vehicle.rb 2016-05-12 11:46:51 -04:00
3f352f1f19 Update vehicles_controller.rb 2016-05-12 11:43:52 -04:00
939cd63d41 Update _form.html.erb 2016-05-12 11:42:58 -04:00
42c5eb797e Update _form.html.erb 2016-05-12 11:39:12 -04:00
16bb039917 Update _form.html.erb 2016-05-12 11:37:52 -04:00
2db29e1eec Update customer.rb 2016-05-12 11:36:52 -04:00
843c355a64 Update vehicles_controller.rb 2016-05-12 10:11:34 -04:00
8b7cc3ffb6 Update vehicles_controller.rb 2016-05-12 10:10:58 -04:00
a1135115bc Update vehicles_controller.rb 2016-05-12 10:08:44 -04:00
7c37cda14e Update customers_controller.rb 2016-05-12 09:57:25 -04:00
b1614941af Update index.html.erb 2016-05-12 09:56:29 -04:00
f19daef1d7 Update issues_form_hook_listener.rb 2016-05-12 09:50:43 -04:00
9d5d6d6c26 Update issues_form_hook_listener.rb 2016-05-12 09:42:08 -04:00
72d9bbebd0 Update issues_form_hook_listener.rb 2016-05-12 09:40:55 -04:00
fc6ab6bb4e Update issues_form_hook_listener.rb 2016-05-12 09:40:07 -04:00
1360424d34 Update issues_form_hook_listener.rb 2016-05-12 09:38:41 -04:00
9838b831ec Update issues_form_hook_listener.rb 2016-05-12 09:34:38 -04:00
402f6f1097 Update issues_form_hook_listener.rb 2016-05-12 09:32:39 -04:00
a64dc10471 Update customer.rb 2016-05-12 09:25:23 -04:00
a9dcb183fd Update customer.rb 2016-05-12 09:23:51 -04:00
1259abc6c7 Update customer.rb 2016-05-12 09:22:22 -04:00
77438191fe Update customer.rb 2016-05-12 09:20:57 -04:00
0c2b6a8134 Rename config/initializers/without_callback.rb to app/helpers/without_callback.rb 2016-05-12 09:19:11 -04:00
b2c3e31671 Update customer.rb 2016-05-12 09:17:29 -04:00
8e62740d4d Update issues_form_hook_listener.rb 2016-05-12 09:10:24 -04:00
fc93862528 Update vehicles_controller.rb 2016-05-12 09:06:03 -04:00
a68c7d5803 Create without_callback.rb 2016-05-12 09:03:47 -04:00
263030fd93 Update customer.rb 2016-05-11 14:37:31 -04:00
12a6bb575c Update customer.rb 2016-05-11 14:12:08 -04:00
0c2a5c0297 Update customer.rb 2016-05-11 14:03:12 -04:00
64b38aedea Update customer.rb 2016-05-11 13:46:42 -04:00
ad1bd78afe Update customer.rb 2016-05-11 12:50:04 -04:00
74c3535335 Update customers_controller.rb 2016-05-11 12:23:56 -04:00
d8798547b1 Update customer.rb 2016-05-11 12:22:05 -04:00
d48df86a49 Update customer.rb 2016-05-11 12:18:41 -04:00
cd4e21daf4 Update customer.rb 2016-05-11 12:17:25 -04:00
eed8daf87c Update customer.rb 2016-05-11 12:14:34 -04:00
b4c79b08a2 Bring Back The Magic 2016-05-11 12:12:33 -04:00
cec63b48ef Update customer.rb 2016-05-11 12:05:25 -04:00
2ebeef3f42 Update customer.rb 2016-05-11 12:03:23 -04:00
bac9778203 Update customer.rb 2016-05-11 11:57:42 -04:00
0c4b8a24d9 Update customer.rb 2016-05-11 11:56:36 -04:00
476a194410 Update customer.rb 2016-05-11 11:50:33 -04:00
10ec2a1b1b Update customer.rb 2016-05-11 11:47:28 -04:00
936a48f205 Update customer.rb 2016-05-11 11:38:41 -04:00
aba1cdf6d9 Update customer.rb 2016-05-11 11:31:18 -04:00
c80e90b2d4 Update customer.rb 2016-05-11 11:23:21 -04:00
b2e1d649ff Update _form.html.erb 2016-05-11 11:20:42 -04:00
eaf2d9785c Update _form.html.erb 2016-05-11 11:19:24 -04:00
3925337df0 Create edit.html.erb 2016-05-11 11:17:10 -04:00
b35b9cf478 Update _form.html.erb 2016-05-11 11:16:04 -04:00
65577b57dd Update customers_controller.rb 2016-05-11 11:07:34 -04:00
8120296154 Update customers_controller.rb 2016-05-11 11:06:00 -04:00
7a1d769581 Update vehicles_controller.rb 2016-05-11 10:59:44 -04:00
5c9cd88279 Update customers_controller.rb 2016-05-11 09:26:21 -04:00
ec56b59d57 Update vehicles_controller.rb 2016-05-11 09:23:35 -04:00
ee088c65f2 Update vehicles_controller.rb 2016-05-11 09:09:00 -04:00
d7c2ef388f Update _list.html.erb 2016-05-11 09:07:02 -04:00
5a9aaa801a Update show.html.erb 2016-05-11 09:05:15 -04:00
3f06e790f0 Update show.html.erb 2016-05-11 09:04:20 -04:00
1d475185fb Update _form.html.erb 2016-05-11 09:00:58 -04:00
a611afb475 Update vehicles_controller.rb 2016-05-11 09:00:16 -04:00
b65da8e2d9 Update show.html.erb 2016-05-11 08:57:31 -04:00
d9be3323f0 Update _list.html.erb 2016-05-11 08:56:33 -04:00
f04e8e8ab2 Update _details.html.erb 2016-05-11 08:54:54 -04:00
d13609ff4a Update index.html.erb 2016-05-11 07:31:52 -04:00
6305dc73ac Update _details.html.erb 2016-05-11 07:30:37 -04:00
4e61d363ee Update show.html.erb 2016-05-11 07:26:32 -04:00
9fe2119d5a Update _details.html.erb 2016-05-11 07:26:16 -04:00
1500493108 Update customers_controller.rb 2016-05-11 07:25:57 -04:00
6896c94457 Update show.html.erb 2016-05-11 07:23:45 -04:00
13dfca39d3 Update _details.html.erb 2016-05-11 07:22:30 -04:00
7570376f1b Update customer.rb 2016-05-11 07:19:54 -04:00
fc626d4619 Update customer.rb 2016-05-11 07:14:36 -04:00
b77c4eaf37 Update customer.rb 2016-05-11 06:42:29 -04:00
c1ab2848df Update customer.rb 2016-05-11 06:30:18 -04:00
6318c2f7e0 Update customers_controller.rb 2016-05-11 05:52:04 -04:00
1d5bf9f1c9 Update show.html.erb 2016-05-10 07:25:48 -04:00
8447de006a Update _form.html.erb 2016-05-10 05:51:21 -04:00
82bab537b5 Update _form.html.erb 2016-05-10 05:46:08 -04:00
c74c40f08d Update _form.html.erb 2016-05-10 05:43:18 -04:00
e2d8f2f16c Update _list.html.erb 2016-05-10 05:30:02 -04:00
7f2a918f9e Update _details.html.erb 2016-05-10 05:23:56 -04:00
0b2fbba330 Update _list.html.erb 2016-05-10 05:23:22 -04:00
4df82ea8e1 Update show.html.erb 2016-05-10 05:15:06 -04:00
3af5e28c9e Update show.html.erb 2016-05-10 05:10:38 -04:00
319df60b51 Update vehicles_controller.rb 2016-05-10 05:09:25 -04:00
cf30ff3fe1 Update vehicles_controller.rb 2016-05-10 05:07:19 -04:00
767f42c326 Update show.html.erb 2016-05-10 05:06:26 -04:00
51c90f5fef Update issues_form_hook_listener.rb 2016-05-09 09:10:31 -04:00
b82849938d Update issues_form_hook_listener.rb 2016-05-09 09:08:35 -04:00
1adfaa1fdb Update vehicles_controller.rb 2016-05-09 09:04:41 -04:00
1542697ca1 Update issues_show_hook_listener.rb 2016-05-09 07:39:00 -04:00
9c63ffc08a Update issues_show_hook_listener.rb 2016-05-09 07:33:46 -04:00
9e331b83d3 Update issues_show_hook_listener.rb 2016-05-09 07:32:48 -04:00
e3d4be434b Update issues_show_hook_listener.rb 2016-05-09 07:31:18 -04:00
f919ae9b00 Update issues_show_hook_listener.rb 2016-05-09 07:27:37 -04:00
8fdcf7fb43 Update issues_show_hook_listener.rb 2016-05-09 07:26:38 -04:00
3fcb49a56b Update issue_patch.rb 2016-05-09 07:25:06 -04:00
53629c59c3 Update issues_show_hook_listener.rb 2016-05-09 07:10:11 -04:00
7976c033ad Update vehicle.rb 2016-05-09 07:06:17 -04:00
0627722806 Update vehicle.rb 2016-05-09 06:51:19 -04:00
903ae789d2 Update _details.html.erb 2016-05-09 06:49:38 -04:00
8d5154a456 Update _form.html.erb 2016-05-09 06:48:21 -04:00
b002730a95 Update vehicle.rb 2016-05-09 06:46:48 -04:00
20d3d61d1d Update vehicle.rb 2016-05-09 05:01:41 -04:00
8e6c5f81a1 Update vehicles_controller.rb 2016-05-06 12:27:01 -04:00
a70561b5bd Update vehicles_controller.rb 2016-05-06 12:25:30 -04:00
5d6ff72ef7 Update vehicles_controller.rb 2016-05-06 12:20:00 -04:00
039e9f97c6 Update vehicles_controller.rb 2016-05-06 12:18:48 -04:00
3896560184 Update vehicles_controller.rb 2016-05-06 12:17:33 -04:00
3d9c7f8ad9 Update vehicles_controller.rb 2016-05-06 12:16:30 -04:00
d70ce7b156 Update vehicles_controller.rb 2016-05-06 12:10:45 -04:00
a939804dd5 Update customers_controller.rb 2016-05-06 12:10:04 -04:00
b6ee0bb482 Update vehicles_controller.rb 2016-05-06 12:07:49 -04:00
a0b0c3762a Update vehicles_controller.rb 2016-05-06 12:04:54 -04:00
6134906fdd Update vehicles_controller.rb 2016-05-06 12:03:43 -04:00
1af02ec3de Update vehicle.rb 2016-05-06 11:59:30 -04:00
757ddf87ac Update vehicle.rb 2016-05-06 11:37:01 -04:00
5fb42e8cd8 Update vehicle.rb 2016-05-06 10:36:50 -04:00
836653fc38 Update vehicle.rb 2016-05-06 07:19:46 -04:00
604dd0830e Update vehicles_controller.rb 2016-05-06 07:09:22 -04:00
3427b00e25 Update vehicles_controller.rb 2016-05-06 07:06:04 -04:00
ecaa0cda6a Update vehicles_controller.rb 2016-05-06 07:02:15 -04:00
822dc4b705 Update vehicles_controller.rb 2016-05-06 06:59:21 -04:00
259a4fdc58 Update customers_controller.rb 2016-05-06 06:58:55 -04:00
29ea58db36 Update customers_controller.rb 2016-05-06 06:56:53 -04:00
b217126316 Update vehicle.rb 2016-05-06 06:55:29 -04:00
5dd7de79ab Update vehicle.rb 2016-05-06 06:53:56 -04:00
dd280ddf51 Update vehicle.rb 2016-05-06 06:49:57 -04:00
2210b11a57 Update vehicle.rb 2016-05-06 06:45:55 -04:00
70cd5a5cdd Update vehicles_controller.rb 2016-05-06 06:30:01 -04:00
23d4debc3a Update vehicle.rb 2016-05-06 06:21:45 -04:00
1a708a8a56 Update _form.html.erb 2016-05-06 06:13:37 -04:00
2bb87b74da Update qbo_item.rb 2016-05-04 08:01:54 -04:00
ccff5a5e8a Update customers_controller.rb 2016-05-02 14:35:54 -04:00
573502ee77 Update qbo_invoice.rb 2016-05-02 14:08:26 -04:00
a020231224 Update customer.rb 2016-05-02 14:07:14 -04:00
a1530fb952 Update qbo_item.rb 2016-05-02 14:06:44 -04:00
98bbad8471 Update qbo_invoice.rb 2016-05-02 14:05:46 -04:00
3de06cad11 Update customer.rb 2016-05-02 14:03:32 -04:00
6f5b903e5d Update customer.rb 2016-05-02 14:02:13 -04:00
5b6043a5de Update qbo.rb 2016-05-02 13:41:48 -04:00
0d6240c089 Update qbo_purchase.rb 2016-05-02 13:40:31 -04:00
56a3b2cffb Update qbo_purchase.rb 2016-05-02 13:39:12 -04:00
ca2992e334 Update qbo_item.rb 2016-05-02 13:38:54 -04:00
9def9eb2c3 Update qbo_invoice.rb 2016-05-02 13:38:38 -04:00
81b0902378 Update qbo_estimate.rb 2016-05-02 13:38:20 -04:00
d4a747e3a8 Update qbo_employee.rb 2016-05-02 13:38:03 -04:00
a24f9b78b5 Update customer.rb 2016-05-02 13:36:32 -04:00
5d2acdac08 Update customer.rb 2016-05-02 13:33:08 -04:00
f0b6c237cc Update customer.rb 2016-05-02 13:32:02 -04:00
aea9bf5f40 Update customer.rb 2016-05-02 13:29:47 -04:00
97c65b703f Update customer.rb 2016-05-02 13:28:05 -04:00
23b06ced47 Update customer.rb 2016-05-02 13:13:53 -04:00
c5164684ac Update customer.rb 2016-05-02 13:10:52 -04:00
0304acd2b2 Update customer.rb 2016-05-02 13:03:37 -04:00
86327723b8 Update customer.rb 2016-05-02 13:02:11 -04:00
40f4e6e00e Update qbo_purchase.rb 2016-05-02 13:00:42 -04:00
49a42d2374 Update qbo_item.rb 2016-05-02 13:00:10 -04:00
75f5cd2619 Update qbo_invoice.rb 2016-05-02 12:59:54 -04:00
be95de7066 Update qbo_estimate.rb 2016-05-02 12:59:37 -04:00
3189d227fc Update qbo_employee.rb 2016-05-02 12:59:12 -04:00
a4a043a2d9 Update customer.rb 2016-05-02 12:58:40 -04:00
19f1ffa89c Update qbo_controller.rb 2016-05-02 12:58:10 -04:00
f51fa5c7d0 Update qbo_controller.rb 2016-05-02 12:55:56 -04:00
813a74d1af Update index.html.erb 2016-05-02 12:54:10 -04:00
a55f3e03de Update and rename 20_update_qbos.rb to 20_update_qbos_time_stamp.rb 2016-05-02 12:52:14 -04:00
89e3e50a64 Update and rename 20_update_qbo.rb to 20_update_qbos.rb 2016-05-02 12:51:09 -04:00
6e60b11be1 Update customer.rb 2016-05-02 12:41:15 -04:00
c9225e028c Update qbo_controller.rb 2016-05-02 12:20:50 -04:00
16ed209cc9 Update qbo.rb 2016-05-02 12:19:13 -04:00
47f6a0fa79 Update qbo.rb 2016-05-02 12:18:47 -04:00
e935f514c1 Create 20_update_qbo.rb 2016-05-02 12:15:28 -04:00
55913d3b5a Update customer.rb 2016-05-02 12:11:11 -04:00
781a1bfe61 Update customer.rb 2016-05-02 10:57:30 -04:00
b6f0b35bf0 Create new.html.erb 2016-05-02 10:17:53 -04:00
7d3c21771f Create _form.html.erb 2016-05-02 09:24:52 -04:00
e26b593702 Merge branch 'master' of github.com:rickbarrette/redmine_qbo 2016-05-02 08:24:49 -04:00
28324eb6ff Bug Fix 2016-05-02 08:24:17 -04:00
fea0979030 Update vehicles_controller.rb 2016-04-29 09:59:49 -04:00
346fddad27 Update customer.rb 2016-04-29 09:59:21 -04:00
a66adfc6d1 Update vehicles_controller.rb 2016-04-29 09:46:23 -04:00
53a35e0fc3 Update _form.html.erb 2016-04-29 09:44:01 -04:00
325e8cd71c Update vehicles_controller.rb 2016-04-29 09:43:20 -04:00
8c6d5acea1 Update _form.html.erb 2016-04-29 09:15:38 -04:00
832b948f80 Update _form.html.erb 2016-04-29 09:11:46 -04:00
cba21fa1b6 Update _form.html.erb 2016-04-29 09:03:47 -04:00
1934ec9cfc Update _form.html.erb 2016-04-29 09:01:15 -04:00
783b63c9a0 Update _form.html.erb 2016-04-29 08:59:28 -04:00
f9a31fd3f2 Update _form.html.erb 2016-04-29 08:57:43 -04:00
090fbba6f5 Update customer.rb 2016-04-29 08:56:05 -04:00
92baf905cd Update customer.rb 2016-04-29 08:47:39 -04:00
22241a3be4 Update customer.rb 2016-04-29 08:45:44 -04:00
ed27fc559d Update customer.rb 2016-04-29 08:43:14 -04:00
cb07f397e0 Update customer.rb 2016-04-29 08:40:32 -04:00
916a9bdb70 Update customer.rb 2016-04-29 08:38:15 -04:00
9750ef2f3b Update customer.rb 2016-04-29 08:34:02 -04:00
ab6851ff2b Update customer.rb 2016-04-29 08:29:29 -04:00
ebf0177dd7 Update customer.rb 2016-04-29 08:25:42 -04:00
a8ce05d8a6 Update vehicle.rb 2016-04-29 07:26:30 -04:00
43876fb61d Update vehicle.rb 2016-04-29 07:14:34 -04:00
5b87733b54 Update customer.rb 2016-04-29 06:57:00 -04:00
0497220c68 Update issues_show_hook_listener.rb 2016-04-28 14:27:15 -04:00
9d3cbfa2e0 Update issues_show_hook_listener.rb 2016-04-28 14:26:33 -04:00
240b5de58b Update issues_show_hook_listener.rb 2016-04-28 14:24:54 -04:00
0a98e7cb74 Update issues_show_hook_listener.rb 2016-04-28 14:23:48 -04:00
04f64eadc7 Update issues_show_hook_listener.rb 2016-04-28 14:22:31 -04:00
b5b30b2b03 Update query_patch.rb 2016-04-28 13:26:04 -04:00
f96f01784a Update en.yml 2016-04-28 12:29:02 -04:00
fa09a50e84 Update _form.html.erb 2016-04-28 12:26:33 -04:00
923d09328b Update _list.html.erb 2016-04-28 12:25:21 -04:00
5a7cfbd2a6 Update 019_qbocustomers_to_customers.rb 2016-04-28 12:22:23 -04:00
d2d61b5e87 Update 019_qbocustomers_to_customers.rb 2016-04-28 12:17:41 -04:00
253c566e90 Update issues_save_hook_listener.rb 2016-04-28 12:14:30 -04:00
39d2e172bc Update query_patch.rb 2016-04-28 12:11:22 -04:00
1bddea1e8f Update qbo_controller.rb 2016-04-28 12:08:41 -04:00
e928ad58dc Update qbo_helper.rb 2016-04-28 12:07:13 -04:00
002e62f723 Update qbo_helper.rb 2016-04-28 12:07:04 -04:00
d809e90627 Update 019_qbocustomers_to_customers.rb 2016-04-28 12:06:22 -04:00
150e18a2d0 Update pdf_patch.rb 2016-04-28 12:04:14 -04:00
4155547fb9 Update issues_show_hook_listener.rb 2016-04-28 12:03:28 -04:00
108ed72560 Update issues_form_hook_listener.rb 2016-04-28 12:02:17 -04:00
701112311d Update issues_form_hook_listener.rb 2016-04-28 12:01:04 -04:00
5f2c6d2c20 Update issue_patch.rb 2016-04-28 12:00:04 -04:00
e70adfd335 Update init.rb 2016-04-28 11:59:04 -04:00
a9ebc4107f Update customers_controller.rb 2016-04-28 11:58:24 -04:00
76ffda9cad Update vehicles_controller.rb 2016-04-28 11:57:54 -04:00
b5d42fcd7b Rename Customer 2016-04-28 11:56:45 -04:00
11e215189b Update and rename qbo_customer.rb to customer.rb 2016-04-28 11:55:40 -04:00
1e426a8295 Create 019_qbocustomers_to_customers.rb 2016-04-28 11:54:01 -04:00
8aa3240c7e Update README.md 2016-04-28 11:48:10 -04:00
8812d7a11d Version Bump 0.0.5 2016-04-28 11:28:18 -04:00
fe1388108c Update customers_controller.rb 2016-04-28 10:43:58 -04:00
b98cdbec8b Update qbo_customer.rb 2016-04-28 10:39:35 -04:00
d7f8e51c4a Update qbo_customer.rb 2016-04-28 10:20:41 -04:00
2ce4e8b346 Update qbo_customer.rb 2016-04-28 10:03:52 -04:00
dd8bf530c9 Update qbo_customer.rb 2016-04-28 10:01:25 -04:00
1103355cb7 Update qbo_customer.rb 2016-04-28 09:59:45 -04:00
e400a7cee3 Update _details.html.erb 2016-04-28 09:50:17 -04:00
b32df9525c Update _details.html.erb 2016-04-28 09:48:31 -04:00
967a727392 Update _details.html.erb 2016-04-28 09:41:21 -04:00
79539dd57f Update _details.html.erb 2016-04-28 09:22:29 -04:00
9d96c813e9 Update qbo_customer.rb 2016-04-28 09:20:41 -04:00
073447a4ce Update qbo_customer.rb 2016-04-28 09:18:37 -04:00
1a6b6fb321 Update qbo_customer.rb 2016-04-28 09:15:22 -04:00
543841ad64 Update index.html.erb 2016-04-28 09:14:09 -04:00
5ad4b53b30 Update index.html.erb 2016-04-28 09:12:58 -04:00
bfec64de54 Update qbo_customer.rb 2016-04-28 09:09:59 -04:00
198e2d5934 Update qbo_customer.rb 2016-04-28 09:08:13 -04:00
95c39fb9c5 Update qbo_customer.rb 2016-04-28 09:03:57 -04:00
dc7ee21aad Update qbo_customer.rb 2016-04-28 09:01:48 -04:00
8c8966a859 Merge branch 'vehicles' of github.com:rickbarrette/redmine_qbo into vehicles 2016-04-28 08:57:40 -04:00
b95aa41b3d Fixed bug 2016-04-28 08:57:15 -04:00
2012774ae8 Update _details.html.erb 2016-04-28 08:54:19 -04:00
be7e9ef2cc Update show.html.erb 2016-04-28 08:49:21 -04:00
5ac1c44e41 Update show.html.erb 2016-04-28 08:48:27 -04:00
b1120c3849 Comments 2016-04-28 08:47:31 -04:00
847669376f Comments & Such 2016-04-28 08:43:54 -04:00
c2b62fbf88 Update qbo_customer.rb 2016-04-28 08:07:34 -04:00
21d0d25c78 Update qbo_customer.rb 2016-04-28 08:06:59 -04:00
365a36390b Added an init method and some convenience methods 2016-04-28 08:05:54 -04:00
68846f7910 Update vehicle.rb 2016-04-27 14:44:21 -04:00
3a64e0d5bd Update _details.html.erb 2016-04-27 14:23:56 -04:00
2f5607b8ef Update vehicle.rb 2016-04-27 14:22:48 -04:00
2a713d7f13 Update _details.html.erb 2016-04-27 14:17:12 -04:00
61f0ee6f81 Update _details.html.erb 2016-04-27 14:16:00 -04:00
d6a75f8ed0 Update vehicle.rb 2016-04-27 14:14:43 -04:00
14d10bd0e6 Update vehicle.rb 2016-04-27 14:13:19 -04:00
bb9f251e69 Update vehicle.rb 2016-04-27 14:11:18 -04:00
f2a7c034d0 Update vehicle.rb 2016-04-27 14:10:40 -04:00
3589ea8685 Update vehicles_controller.rb 2016-04-27 14:09:09 -04:00
f71be3f1a5 Update _details.html.erb 2016-04-27 14:08:48 -04:00
cf3983adc4 Update vehicle.rb 2016-04-27 14:06:30 -04:00
55f6666328 Update vehicles_controller.rb 2016-04-27 13:52:32 -04:00
933a0bb12d Update vehicles_controller.rb 2016-04-27 13:51:39 -04:00
0c5d2195d2 Update vehicle.rb 2016-04-27 13:50:31 -04:00
3518f0acfe Update vehicles_controller.rb 2016-04-27 13:45:09 -04:00
d4bcccf598 Update vehicle.rb 2016-04-27 13:41:09 -04:00
3aa2798463 Update vehicle.rb 2016-04-27 13:20:25 -04:00
0cb9863000 Update vehicle.rb 2016-04-27 13:18:17 -04:00
deb648e3d6 Rename update_vehicles.rb to 018_update_vehicles.rb 2016-04-27 13:16:54 -04:00
384854d701 Update vehicle.rb 2016-04-27 13:15:10 -04:00
f192fe8d5f Create update_vehicles.rb 2016-04-27 13:14:22 -04:00
8a89af88c3 Update issues_form_hook_listener.rb 2016-04-27 13:11:10 -04:00
a4944f2a3b Update vehicle.rb 2016-04-27 13:10:16 -04:00
0160a58c86 Update _details.html.erb 2016-04-27 13:01:45 -04:00
f7d809e90a Update _details.html.erb 2016-04-27 13:00:28 -04:00
8e80277a15 Update _details.html.erb 2016-04-27 12:59:47 -04:00
962e954d6e Update _details.html.erb 2016-04-27 12:58:17 -04:00
9d1bfa3951 Update _details.html.erb 2016-04-27 12:54:59 -04:00
b20a343cd2 Formating 2016-04-27 12:41:16 -04:00
593d8e603b Update qbo_controller.rb 2016-04-27 12:34:05 -04:00
5a5a531700 Update invoice_controller.rb 2016-04-27 12:33:35 -04:00
f7464e1d47 Update estimate_controller.rb 2016-04-27 12:33:10 -04:00
c39c9ab95c Update issues_form_hook_listener.rb 2016-04-27 12:25:51 -04:00
5aa32b735f Update issues_form_hook_listener.rb 2016-04-27 12:24:53 -04:00
9d4774a31b Update issues_show_hook_listener.rb 2016-04-27 12:19:14 -04:00
63c446673f Update issues_show_hook_listener.rb 2016-04-27 12:17:22 -04:00
8d1038ac0c Update issues_show_hook_listener.rb 2016-04-27 12:16:50 -04:00
ae903bede2 Update issues_show_hook_listener.rb 2016-04-27 12:15:33 -04:00
b82d5091b7 Update issues_show_hook_listener.rb 2016-04-27 12:14:59 -04:00
48a2c0cb45 Update issues_show_hook_listener.rb 2016-04-27 12:11:47 -04:00
092fa85dd8 Update issues_show_hook_listener.rb 2016-04-27 12:10:54 -04:00
5100b111e9 Update issues_show_hook_listener.rb 2016-04-27 12:09:53 -04:00
69273b5dc8 Update issues_show_hook_listener.rb 2016-04-27 12:09:10 -04:00
52bf4f916d Update issues_show_hook_listener.rb 2016-04-27 12:08:14 -04:00
7fa41d6574 Update issues_show_hook_listener.rb 2016-04-27 12:06:50 -04:00
bbe1b22020 Update vehicle.rb 2016-04-27 11:40:56 -04:00
892e57084d Squish VIN 2016-04-27 11:40:36 -04:00
d6e15f90ef Update vehicle.rb 2016-04-27 11:32:42 -04:00
39872107bc Update _details.html.erb 2016-04-27 10:53:51 -04:00
1de5712f8c Update _details.html.erb 2016-04-27 10:52:45 -04:00
38518fa5e9 Update show.html.erb 2016-04-27 10:43:44 -04:00
46df203e00 Update show.html.erb 2016-04-27 10:42:31 -04:00
642406365d Update vehicle.rb 2016-04-27 10:40:06 -04:00
ee40dbf5a4 Update vehicles_controller.rb 2016-04-27 10:39:02 -04:00
828a59f989 Update vehicle.rb 2016-04-27 10:38:40 -04:00
79d05350db Update vehicle.rb 2016-04-27 10:33:34 -04:00
12aeb22ac3 Update vehicles_controller.rb 2016-04-27 10:30:14 -04:00
09f531ce39 Update vehicles_controller.rb 2016-04-27 10:28:31 -04:00
2b4bba7a88 Update vehicle.rb 2016-04-27 10:25:23 -04:00
9e2f9f5a7a Update vehicle.rb 2016-04-27 09:23:09 -04:00
7a6e35adff Update 401.html.erb 2016-04-27 09:17:25 -04:00
5047077b07 Update customers_controller.rb 2016-04-27 09:10:31 -04:00
5242ed5a94 Update index.html.erb 2016-04-27 09:03:59 -04:00
a316c0f8d6 Update index.html.erb 2016-04-27 09:03:04 -04:00
3c6bce713b Update customers_controller.rb 2016-04-27 08:56:23 -04:00
d4b0ac1e38 Update show.html.erb 2016-04-27 08:49:31 -04:00
d80df26df1 Update show.html.erb 2016-04-27 08:47:18 -04:00
dd9c945fcc Update _details.html.erb 2016-04-27 08:46:54 -04:00
43e6fff6d8 Update index.html.erb 2016-04-27 08:45:27 -04:00
1650577d4d Update index.html.erb 2016-04-27 08:43:56 -04:00
c2b798e32c Update show.html.erb 2016-04-27 08:38:40 -04:00
1817095d00 Update show.html.erb 2016-04-27 08:38:06 -04:00
27bb6ea4a2 Create show.html.erb 2016-04-27 08:37:39 -04:00
ef2aebb7e4 Update _details.html.erb 2016-04-27 08:35:45 -04:00
bc23dfad56 Update index.html.erb 2016-04-27 08:35:04 -04:00
3be2a73422 Create _list.html.erb 2016-04-27 08:34:21 -04:00
4896241df1 Update index.html.erb 2016-04-27 08:18:40 -04:00
75b159bf4e Update index.html.erb 2016-04-27 08:18:15 -04:00
75a651dd3b Update index.html.erb 2016-04-27 08:02:40 -04:00
76e230770b Update index.html.erb 2016-04-27 08:02:11 -04:00
70d7b65741 Update init.rb 2016-04-27 08:01:05 -04:00
c251dc8407 Update index.html.erb 2016-04-27 07:59:37 -04:00
6464904caf Update index.html.erb 2016-04-27 07:55:20 -04:00
98cf1ed140 Update vehicles_controller.rb 2016-04-27 07:54:54 -04:00
0d367245ce Update customers_controller.rb 2016-04-27 07:54:18 -04:00
c053c91a64 Update Gemfile 2016-04-27 07:53:04 -04:00
8f5467638e Update customers_controller.rb 2016-04-27 07:39:32 -04:00
723d9024c1 Update customers_controller.rb 2016-04-27 07:37:18 -04:00
8374f0ae3e Update customers_controller.rb 2016-04-27 07:35:02 -04:00
4f9a3ed046 Update routes.rb 2016-04-27 06:44:14 -04:00
cd5ed4f3a7 Update index.html.erb 2016-04-26 14:09:15 -04:00
792773b945 Update customers_controller.rb 2016-04-26 14:08:27 -04:00
d09f5e9afe Update routes.rb 2016-04-26 14:02:42 -04:00
f07c90cf90 Update routes.rb 2016-04-26 14:01:20 -04:00
774ce239c2 Update routes.rb 2016-04-26 11:50:12 -04:00
3ec2670209 Update _details.html.erb 2016-04-26 10:16:55 -04:00
76cbb42309 Update index.html.erb 2016-04-26 09:24:32 -04:00
3e9138f802 Create _details.html.erb 2016-04-26 09:23:56 -04:00
1ac799d318 Update index.html.erb 2016-04-26 09:20:21 -04:00
5e4d7c7686 Added Customer to top menu 2016-04-26 09:18:22 -04:00
6a6fcf093c Added Resources Customers 2016-04-26 09:17:06 -04:00
ab68b1cf89 Create index.html.erb 2016-04-26 09:16:32 -04:00
b692abcb64 Create customers_controller.rb 2016-04-26 09:13:45 -04:00
94fe2f2d05 Commented out Category & Target Version 2016-04-26 09:02:08 -04:00
26f861a493 Update issues_show_hook_listener.rb 2016-04-26 08:55:44 -04:00
0f94675ba5 Update issues_show_hook_listener.rb 2016-04-26 08:54:23 -04:00
4816229c5e Update vehicle.rb 2016-04-26 06:46:46 -04:00
98b2d2078c Update vehicle.rb 2016-04-26 06:44:58 -04:00
6cf2a2640b before_validation 2016-04-26 06:41:25 -04:00
58c9544a22 Update vehicle.rb 2016-04-26 06:36:26 -04:00
d14b6a1b54 Can't use symbols 2016-04-26 06:34:08 -04:00
ec37439577 Update Gemfile 2016-04-26 06:31:38 -04:00
b5716595e4 Update vehicle.rb 2016-04-26 06:31:09 -04:00
d968885e1e Update vehicle.rb 2016-04-26 06:27:27 -04:00
1231b776b7 Update Gemfile 2016-04-25 12:58:46 -04:00
f8f3870405 Update vehicle.rb 2016-04-25 12:55:06 -04:00
723ad5bc53 Update edmunds.rb 2016-04-25 12:53:58 -04:00
c4c4d6156d Update edmunds.rb 2016-04-25 12:53:38 -04:00
28eaecabff Update Gemfile 2016-04-25 12:49:53 -04:00
6819e2a826 Update vehicle.rb 2016-04-25 12:44:24 -04:00
9e1ae8d40b Update vehicle.rb 2016-04-25 12:43:25 -04:00
467677d73c Update vehicle.rb 2016-04-25 12:42:29 -04:00
ee2be0d8c9 Update vehicle.rb 2016-04-25 12:34:53 -04:00
0fb358edf3 Update vehicle.rb 2016-04-25 12:33:18 -04:00
9972e18632 Added vin decoder 2016-04-25 12:22:48 -04:00
b1c0f965f8 Added Edmunds API Key 2016-04-25 12:06:03 -04:00
d523584ca1 Add edmunds_ruby GEM 2016-04-25 09:32:40 -04:00
de7b534572 Update pdf_patch.rb 2016-04-25 09:15:57 -04:00
24e3c29353 Update pdf_patch.rb 2016-04-25 09:13:27 -04:00
800058a3c0 Update pdf_patch.rb 2016-04-25 09:10:06 -04:00
9c230d6423 Update pdf_patch.rb 2016-04-25 09:09:14 -04:00
497f4661bd Update en.yml 2016-04-25 09:04:44 -04:00
d5b1187076 Added Vehicle to PDF 2016-04-25 09:03:56 -04:00
0468af9e53 Display vheicle info in issues 2016-04-24 12:03:43 -04:00
8ac9cfae93 Fixed vehicles dropdown 2016-04-24 10:54:43 -04:00
c07e4cb427 Fixed Issue Vehicle Selection 2016-04-24 10:49:57 -04:00
380315e207 Fixed vehicles_id 2016-04-24 10:23:23 -04:00
950dfd9af9 Update _dropdown.html.erb 2016-04-22 13:54:36 -04:00
c4abee7415 Update issues_form_hook_listener.rb 2016-04-22 13:38:32 -04:00
27d282f244 Update issues_form_hook_listener.rb 2016-04-22 13:36:47 -04:00
610582bce8 Update issues_form_hook_listener.rb 2016-04-22 13:25:44 -04:00
655f0c3dcd Update issues_form_hook_listener.rb 2016-04-22 13:22:41 -04:00
d9ce3981a3 Update issues_form_hook_listener.rb 2016-04-22 13:21:18 -04:00
8e6bdc6d38 Update issues_form_hook_listener.rb 2016-04-22 13:19:57 -04:00
0a167c33ee Update issues_form_hook_listener.rb 2016-04-22 13:18:05 -04:00
b8002df5af Update issue_patch.rb 2016-04-22 13:16:46 -04:00
7356e99981 Update issues_form_hook_listener.rb 2016-04-22 13:15:14 -04:00
4eb2718b2b Update issues_form_hook_listener.rb 2016-04-22 13:13:29 -04:00
3c849ca5dd Update issues_form_hook_listener.rb 2016-04-22 13:12:35 -04:00
dd40c045cf Update issues_form_hook_listener.rb 2016-04-22 13:10:46 -04:00
6505f8114d Update issues_form_hook_listener.rb 2016-04-22 13:09:00 -04:00
eeb5e96aae Update issues_form_hook_listener.rb 2016-04-22 12:59:57 -04:00
9c61ecd0c0 Update issues_form_hook_listener.rb 2016-04-22 12:44:55 -04:00
a771085a33 Update issues_form_hook_listener.rb 2016-04-22 12:42:03 -04:00
5f1dea77cc Update issues_form_hook_listener.rb 2016-04-22 12:40:51 -04:00
9ae11bac49 Create _dropdown.html.erb 2016-04-22 12:35:07 -04:00
77239122c0 Update and rename 017_update_issues.rb to 017_update_issues_with_vehicles.rb 2016-04-22 12:29:12 -04:00
804b4066ce Added Vehicle ID as a safe attribute to Issues 2016-04-22 12:27:59 -04:00
2cc8c83071 Add vehicle refrence to issues 2016-04-22 12:26:48 -04:00
a7ba05db29 Added Nil check to show 2016-04-22 12:22:33 -04:00
a8c353945d Update vehicles_controller.rb 2016-04-22 12:17:59 -04:00
f90921fb00 Update vehicles_controller.rb 2016-04-22 12:14:44 -04:00
84fd9770c9 Added VIN 2016-04-22 12:12:08 -04:00
f7ee1dbcec Update _details.html.erb 2016-04-22 12:10:28 -04:00
d8d0572a1a Update _details.html.erb 2016-04-22 12:09:39 -04:00
1688ebd327 Update index.html.erb 2016-04-22 12:08:34 -04:00
26d4f09f97 Update index.html.erb 2016-04-22 12:07:55 -04:00
fe831cf259 Update index.html.erb 2016-04-22 12:06:34 -04:00
35e4c5f9da User new vehicle details partial 2016-04-22 12:04:49 -04:00
66779e60f6 Use new vehicle details partial 2016-04-22 12:04:01 -04:00
1e0e608ca1 Create _details.html.erb 2016-04-22 12:02:19 -04:00
fbf074e3c3 Update vehicle.rb 2016-04-22 09:50:32 -04:00
a33a1eeb94 Update _form.html.erb 2016-04-22 09:50:02 -04:00
266a3ed921 Update _form.html.erb 2016-04-22 09:48:27 -04:00
fc0a416175 Update vehicle.rb 2016-04-22 09:47:11 -04:00
e561b52e9b Update index.html.erb
Float left
2016-04-22 09:41:46 -04:00
51586800a0 Update index.html.erb 2016-04-22 09:40:41 -04:00
fec1512930 Update index.html.erb
Display notes
2016-04-22 09:37:59 -04:00
559a846f1e Update vehicles_controller.rb
Change ID to Name
2016-04-22 09:34:32 -04:00
f936e61684 Update vehicles_controller.rb 2016-04-22 09:32:25 -04:00
dfd7dfcf79 Update show.html.erb
Display Notes
2016-04-22 09:31:03 -04:00
a409514467 Update vehicles_controller.rb
Added nil check
2016-04-22 09:28:10 -04:00
8b44e5b51b Update vehicles_controller.rb 2016-04-22 09:26:27 -04:00
e350657d89 Update vehicles_controller.rb 2016-04-22 09:24:34 -04:00
7fea7042a5 Update _form.html.erb 2016-04-22 09:18:50 -04:00
9c57878fd1 Update _form.html.erb 2016-04-22 09:17:01 -04:00
fd6c70860c Update _form.html.erb 2016-04-22 09:12:37 -04:00
48114de428 Update vehicles_controller.rb 2016-04-22 09:10:49 -04:00
7267bac43d Update vehicles_controller.rb 2016-04-22 09:10:01 -04:00
fd92d72ac3 Update _form.html.erb 2016-04-22 09:09:13 -04:00
5457ae51c2 Update index.html.erb 2016-04-22 08:15:45 -04:00
6647e533df Update index.html.erb 2016-04-22 08:14:41 -04:00
6d961addbe Update index.html.erb 2016-04-22 08:08:30 -04:00
af654ef9d0 Update index.html.erb
Floating
2016-04-22 08:06:57 -04:00
3b5f6691fb Update index.html.erb
Strong Customers
2016-04-22 08:03:54 -04:00
aa770bb1f0 Update index.html.erb
Updated formatting
2016-04-22 07:59:50 -04:00
0c2d57c826 More Progress! 2016-04-21 20:44:18 -04:00
fa3322d530 Update new.html.erb
Fixed formatting
2016-04-21 14:35:18 -04:00
3bbc0a16ff Update new.html.erb
Removed Selected Customer
2016-04-21 14:33:50 -04:00
2e7c26d90e Update new.html.erb 2016-04-21 14:32:37 -04:00
75fae59bcf Update new.html.erb 2016-04-21 14:31:09 -04:00
a1b72a1dd0 Update new.html.erb 2016-04-21 14:20:30 -04:00
4c9b48bd91 Update new.html.erb 2016-04-21 14:18:39 -04:00
e3c7047999 Update index.html.erb 2016-04-21 13:29:58 -04:00
07fe12e65b Update vehicles_controller.rb 2016-04-21 13:27:41 -04:00
8955053e64 Update vehicles_controller.rb 2016-04-21 13:23:06 -04:00
b534e94c38 Update vehicles_controller.rb 2016-04-21 12:47:10 -04:00
64a7b4fb29 Update vehicles_controller.rb 2016-04-21 12:44:58 -04:00
a6c88c85c4 Update and rename vehicle_controller.rb to vehicles_controller.rb 2016-04-21 12:33:13 -04:00
bbed60c2ca Update routes.rb 2016-04-21 12:31:07 -04:00
20b31d47be Rename app/views/vehicle/new.html.erb to app/views/vehicles/new.html.erb 2016-04-21 12:30:28 -04:00
b48a21c8fe Rename app/views/vehicle/index.html.erb to app/views/vehicles/index.html.erb 2016-04-21 12:30:06 -04:00
d4930227ba Update index.html.erb 2016-04-21 12:26:50 -04:00
ad27e98e48 Update vehicle_controller.rb 2016-04-21 12:24:18 -04:00
29fa5ff510 Create new.html.erb 2016-04-21 12:23:11 -04:00
b08f3adc39 Update index.html.erb 2016-04-21 12:10:56 -04:00
40f2358c26 Update index.html.erb
New Button!
2016-04-21 12:04:38 -04:00
952baff6f2 Update index.html.erb
Updated Buttons
2016-04-21 12:03:42 -04:00
31797585c8 Update vehicle_controller.rb
Added resourceful methods
2016-04-21 11:56:36 -04:00
2d50c4c454 Update routes.rb
Updated vehicle to use resoruces
2016-04-21 11:49:29 -04:00
ae491e0902 Update index.html.erb 2016-04-21 10:00:20 -04:00
c205479975 Update index.html.erb 2016-04-21 09:59:09 -04:00
ffede26929 Rename app/views/vehicles/index.html.erb to app/views/vehicle/index.html.erb 2016-04-21 09:57:40 -04:00
8a553c0129 Rename app/views/qbo/vehicles/index.html.erb to app/views/vehicles/index.html.erb 2016-04-21 09:51:21 -04:00
d5f9cee2e1 Create 401.html.erb 2016-04-21 09:49:03 -04:00
28d5187d40 Update vehicle_controller.rb 2016-04-21 09:47:40 -04:00
48709cdceb Create auth_helper.rb 2016-04-21 09:46:45 -04:00
22a6492e8b Update routes.rb 2016-04-21 09:44:27 -04:00
82f4ced404 Update routes.rb 2016-04-21 09:40:49 -04:00
3348173cbe Update routes.rb 2016-04-21 09:38:49 -04:00
9d83175bd7 Update routes.rb
Added Vehicle Index
2016-04-21 09:35:27 -04:00
b6f8304d13 Update qbo_customer.rb
Added ownership of vehicles
2016-04-21 09:31:22 -04:00
cd31ecf1f0 Create index.html.erb 2016-04-21 09:30:35 -04:00
15cd8e756c Create vehicle_helper.rb 2016-04-21 09:24:47 -04:00
3caaaa52dd Create vehicle.rb
Initial Vehicle model creation
2016-04-21 09:23:13 -04:00
03b12d08ef Create vehicle_controller.rb
Initial controller creation
2016-04-21 09:17:50 -04:00
a69ad1cef2 Create 016_create_vehicles.rb
Create the vehicle table
2016-04-21 09:09:41 -04:00
eb3d8160a1 Update init.rb 2016-04-18 12:32:37 -04:00
9cd5440bc8 Update init.rb
Check to see if the current user is an admin
2016-04-18 12:30:56 -04:00
f10114d43c Update query_patch.rb 2016-04-18 12:14:14 -04:00
fd8a068f16 Update invoice_controller.rb
Added Document Number to filename
2016-04-18 12:09:41 -04:00
e115e8fe94 Update estimate_controller.rb
Added Document Number to the file name
2016-04-18 12:08:08 -04:00
b4255135c4 Update query_patch.rb
Fixed Filter
2016-04-13 12:21:46 -04:00
9fc94e93c6 Update query_patch.rb 2016-04-13 12:14:12 -04:00
3e50c037e0 Update query_patch.rb
removed typo
2016-04-13 12:13:14 -04:00
dc5b8419a4 Update query_patch.rb
Added Customer Filter
2016-04-13 12:11:52 -04:00
c1002cb93c Merge pull request #1 from rickbarrette/pdf
Pdf
2016-04-13 09:27:39 -04:00
fcaa5f55cf Update pdf_patch.rb
fixed typo
2016-04-13 09:23:47 -04:00
195359ce0b Update init.rb
Added PDF Patch
2016-04-13 09:18:46 -04:00
b5c8823dda Create pdf_patch.rb
Added QBO Customer Name to PDF
2016-04-13 09:17:30 -04:00
d9317e717b Update query_patch.rb
Fixed Formatting
2016-04-13 08:53:39 -04:00
9e9c111256 Added QBO Customer to Issues Query 2016-04-12 23:15:47 -04:00
c254c78ee5 Removed @ from variables 2016-04-09 21:53:38 -04:00
dc1edaa651 Update issues_form_hook_listener.rb
Fixed Typos
2016-04-01 12:29:52 -04:00
028b309a60 0.0.4
Version Bump
2016-04-01 06:39:04 -04:00
e0b07764c0 Update qbo_customer.rb
Removed delete all
2016-04-01 06:37:30 -04:00
73dc8b3b44 Merge branch 'import' 2016-04-01 06:35:02 -04:00
1bc23ab553 Fixed import errors 2016-03-31 09:22:04 -04:00
5be8d987b6 Update qbo_estimate.rb
Added Transaction
2016-03-31 09:10:41 -04:00
f89cdf8ab2 Update qbo_employee.rb
Added Transaction
2016-03-31 09:09:52 -04:00
d33eba2b20 Update qbo_customer.rb
Added Transaction
2016-03-31 09:08:56 -04:00
39a2e1564f Update qbo_invoice.rb
Added Transaction
2016-03-31 09:07:30 -04:00
3070192485 Update qbo_item.rb
Formatting
2016-03-31 09:05:38 -04:00
ed5959d8e0 Added transaction to items 2016-03-31 09:05:04 -04:00
79d990dd01 Added Sorting to drop downs 2016-03-31 09:02:54 -04:00
b1cf8363a9 Update issues_form_hook_listener.rb
Sort the options!
2016-03-29 09:19:39 -04:00
3d251da80b Update index.html.erb
Sort the options!
2016-03-29 09:18:50 -04:00
cc9af5dc36 Added more garbage collection & removed automatic sync from show hook 2016-03-10 21:00:54 -05:00
2c3503f4ac Added garbage colllection for instance variables 2016-03-10 20:38:15 -05:00
5104509106 Update qbo_estimate.rb
Fixed ID
2016-03-10 12:29:21 -05:00
77be0b9d4c Update qbo_item.rb
Fixed ID
2016-03-10 12:28:18 -05:00
897810b029 Update qbo_customer.rb
Fixed ID
2016-03-10 12:27:43 -05:00
37371d2373 Update qbo_employee.rb
Fixed ID
2016-03-10 12:27:16 -05:00
95fbad525d Update qbo_invoice.rb
Fixed id
2016-03-10 12:26:35 -05:00
9ce8fa4661 Update issues_form_hook_listener.rb
Remove automatic sync of items.
2016-03-10 12:24:42 -05:00
c6ac6141d9 Update qbo_item.rb 2016-03-10 12:23:28 -05:00
f25fac1190 Update qbo_estimate.rb 2016-03-10 12:21:49 -05:00
49f2baed9f Update qbo_employee.rb
Fixed noob mistake
2016-03-10 12:20:34 -05:00
9acc33e373 Update qbo_employee.rb
Fixed removal of customers
2016-03-10 12:19:17 -05:00
4f6d194615 Fixed bug where the selected drop down items were not instance variables 2016-03-02 21:43:07 -05:00
0308a67a86 Simplified all quickbooks inporting
no more loops
2016-03-02 21:11:38 -05:00
7b63e64da0 Update qbo_invoice.rb
Loose the loop!
2016-03-02 14:43:22 -05:00
eb8e2fa018 Update qbo_invoice.rb
Added a block to find_or_create_by to succinctly update doc_number
2016-02-29 11:43:10 -05:00
62ac1bf295 Update qbo_estimate.rb
Fixed Loop
2016-02-29 09:42:51 -05:00
d044024981 Update qbo_item.rb
Removed all call
2016-02-29 09:41:48 -05:00
65be0c5f7a Update qbo_item.rb
Simplified Item Deletion
2016-02-29 09:39:33 -05:00
e9db63ea82 Update qbo_estimate.rb
Simplified Estimate Deletion
2016-02-29 09:37:24 -05:00
c8107c418f Update qbo_employee.rb
Simplified Employee Deletion
2016-02-29 09:36:22 -05:00
2d96f6653b Update qbo_customer.rb
Simplified Customer Deletion
2016-02-29 09:33:43 -05:00
b4833d7a5f Fixed destroy call 2016-02-29 09:27:37 -05:00
12cebb1cd1 Update qbo_invoice.rb 2016-02-29 09:15:11 -05:00
ad4ce232b5 Added removal for deleted entery while syncing
Added Invoices & Estimates to QBO#Index
2016-02-28 12:07:58 -05:00
82a273c0c2 Merge branch 'billable-purchases' 2016-02-25 22:53:46 -05:00
88b66c4b41 Fixed Estiamte & Invoice Link
Added Estimate Drop down
Disabled Automatic Estimate Creation
Added Controllers for Estimates & Invoices
2016-02-25 22:51:38 -05:00
e9038a56c1 Updated locale with Estimate 2016-02-25 20:54:20 -05:00
f2df6b5128 Update qbo_purchase.rb
Updated to use qbo_customer_id
2016-01-27 14:33:27 -05:00
b57d51d80a Create 015_update_qbo_purchases.rb 2016-01-27 14:32:44 -05:00
970a2fa681 Update qbo_purchase.rb
Simplified line item detail logic...

untested
2016-01-27 14:14:31 -05:00
3d2176c5bd Update qbo_purchase.rb
WIP Fixing Purchase Sync Methods
2016-01-27 12:42:56 -05:00
baf251e211 Update qbo_purchase.rb
Fixed Typo
2016-01-27 12:33:32 -05:00
def5b72aa3 Update qbo_customer.rb
Added a separate has_many line for purchases
2016-01-27 12:32:18 -05:00
89498c9559 Update qbo_purchase.rb
Added seprate belongs_to line for customer
2016-01-27 12:31:33 -05:00
b28e9b5a5b Update qbo_purchase.rb
Fixed typo for QBO Customer
2016-01-27 12:29:10 -05:00
d529139a9f Update qbo_customer.rb 2016-01-27 09:52:04 -05:00
5155c0bc68 Create 014_update_customers.rb
Added reference to customers for purchases
2016-01-27 09:31:51 -05:00
798bfde516 Update qbo_controller.rb
Added Purchases to sync
2016-01-27 09:21:28 -05:00
d79daa7a28 Fixed migration for purchases 2016-01-26 12:32:49 -05:00
6bcf210f79 Create 013_create_qbo_purchases.rb 2016-01-26 12:24:48 -05:00
7244455bf2 Update README.md
Better Documentation!
2016-01-26 04:42:14 -05:00
e65d78bb25 Create qbo_purchase.rb
Initial & untested commit for billable-purchases.

TODO:
Create database table
Add relationships
Attach to Issues
2016-01-25 12:31:26 -05:00
0b74f2cf52 Added Invoice Support 2016-01-24 18:54:34 -05:00
98b89e7875 Added Patch to Users to add releation ship for Users to Employees 2016-01-24 17:35:07 -05:00
b1996aa309 Update users_show_hook_listener.rb
Cleaned up nil checks
2016-01-22 05:43:06 -05:00
f4712ad849 Update issues_show_hook_listener.rb
Cleaned up nil checks
2016-01-22 05:38:31 -05:00
a8546934ee Cleaned up issue save hook 2016-01-22 05:22:09 -05:00
a7b7db690d Fixed Issue Save Hook 2016-01-22 04:08:21 -05:00
0ed61b191f Update issues_save_hook_listener.rb
Removed un-needed code, and added parenthesis on line 33
2016-01-21 13:37:30 -05:00
0fb4ec1157 Update issues_save_hook_listener.rb
Fixed conventions, Removed explicit non-nil checks, updated comments
2016-01-21 13:27:08 -05:00
d22257e8ab Update issues_form_hook_listener.rb
Fixed conventions, Removed explicit non-nil checks
2016-01-21 13:09:49 -05:00
e1bb565c59 Update qbo_controller.rb
Updating to the following conventions
https://github.com/bbatsov/ruby-style-guide
2016-01-21 12:19:13 -05:00
03e1e7e0b2 Update users_show_hook_listener.rb
Updating to the following conventions
https://github.com/bbatsov/ruby-style-guide
2016-01-21 12:15:20 -05:00
aa3fefd628 Update issues_show_hook_listener.rb
Updating to the following conventions
https://github.com/bbatsov/ruby-style-guide
2016-01-21 12:13:00 -05:00
5e635f9e2b Update issues_form_hook_listener.rb
Updating to the following conventions
https://github.com/bbatsov/ruby-style-guide
2016-01-21 12:09:40 -05:00
2aad7115c4 Update issues_save_hook_listener.rb
Updating to the following conventions
https://github.com/bbatsov/ruby-style-guide
2016-01-21 12:07:36 -05:00
80ee5287a0 Update README.md 2016-01-21 09:52:37 -05:00
26d8d9d3e9 Update README.md 2016-01-21 09:49:29 -05:00
f0c08e155f Update LICENSE
Formating
2016-01-21 06:08:55 -05:00
afb3af18d4 Update README.md 2016-01-20 12:46:24 -05:00
20be533a19 Update issues_save_hook_listener.rb
to ues Qbo.get_base
2016-01-20 12:21:08 -05:00
f07809eacb Update qbo_employee.rb 2016-01-20 12:16:51 -05:00
d1653da540 Update qbo_estimate.rb
to use Qbo.get_base
2016-01-20 12:16:15 -05:00
d9b1b45f89 Update qbo_item.rb
to use Qbo.get_base
2016-01-20 12:15:42 -05:00
2f85d2f56d Updated QBO Customer touse Qbo.get_base 2016-01-20 12:13:44 -05:00
430579d622 Removed nil check 2016-01-20 12:12:37 -05:00
2357b002c6 Update qbo.rb
Added get_base convenience method
2016-01-20 06:39:42 -05:00
191cfd5fff Fixed issue hooks 2016-01-20 06:27:26 -05:00
eb911f195c Removed unneeded code 2016-01-17 10:45:18 -05:00
98cd3d51e9 Estimate PDF is now dowloaded and served
TODO: The routes are somehow messed up and need to be fixed.

example: example.com/redmine/redmine/qbo/estimate/1
in lieu: example.com/redmine/qbo/estimate/1
2016-01-17 10:40:37 -05:00
2365fc2cf8 Corrected get_base to use :customer 2016-01-15 14:26:24 -05:00
6556197dd0 Readded nil checks 2016-01-14 21:49:26 -05:00
e19688a525 Fixed QBO#Index 2016-01-13 21:00:15 -05:00
ec1c263347 Added relationship to issues, renamed qbp_customer, started cleaning up
listeners
2016-01-13 20:37:02 -05:00
6f194e37bd Cleaned up the show_issue hook 2016-01-12 22:39:45 -05:00
135850b74d Estimates are now attached to issues and displayed on the issue 2016-01-12 21:45:56 -05:00
98e94da39b Added qbo_estimate_id to issues safe attribute list 2016-01-12 21:08:04 -05:00
3a4b3c0646 Added qbo_estimate to issues 2016-01-12 21:00:57 -05:00
ddb4f40486 Updated to quickbooks-ruby-base and added QboEstimate 2016-01-12 20:55:56 -05:00
a10b075ab8 Rename columns of QBO table 2016-01-12 20:55:00 -05:00
77448e8dc1 Create table qbo_estimates 2016-01-12 19:40:20 -05:00
cf97b341ab Updated Gemfile to work off my branch 2016-01-12 19:39:30 -05:00
7637a6fa28 Updated Gemfile to use my copy of quickbooks-ruby
Also Added quickbooks-ruby-base
2016-01-12 19:01:33 -05:00
aad4597265 Removed unneeded Code & Fixed Estimate Field Check 2016-01-11 23:37:01 -05:00
f9e271cbcb Added sanity checks for QBO info 2016-01-11 23:24:35 -05:00
2ec9e43951 Added estimate generation capability
TODO: check to see if we can get the PDF link
2016-01-11 23:20:27 -05:00
c2808c7e8f Broke billing of time into a seprate method 2016-01-11 22:18:40 -05:00
77 changed files with 2957 additions and 266 deletions

13
Gemfile
View File

@@ -1,8 +1,13 @@
source 'https://rubygems.org'
gem 'quickbooks-ruby'#, :git => 'https://github.com/ruckus/quickbooks-ruby.git'
gem 'oauth-plugin'#, '~> 0.5.1'
gem 'quickbooks-ruby'
gem 'quickbooks-ruby-base'
gem 'oauth-plugin'
gem 'oauth'
gem 'roxml'
gem 'nokogiri'
gem 'edmunds_vin'
gem 'will_paginate', '~> 3.1.0'
group :assets do
gem 'coffee-rails'
end

20
LICENSE
View File

@@ -1,9 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 rick barrette
Copyright (c) 2016 Rick Barrette
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,41 +1,77 @@
#Redmine Quickbooks Online
A simple plugin for Redmine to connect to Quickbooks Online
A plugin for Redmine to connect to Quickbooks Online
The goal of this project is to allow redmine to connect with Quickbooks Online to create time activity entries for completed work when an issue is closed.
The goal of this project is to allow Redmine to connect with Quickbooks Online to create `Time Activity Entries` for completed work when an Issue is closed.
####How it works
* A QBO customer and service item can be assigned to a redmine issue.
* A QBO employee can be assigned to a redmine user
* When a issue is closed, the following things happen:
- The plugin checks to see if the user assinged to the issue has a QBO employee assinged to them
- The plugin checks to see if the issue has a QBO customer & service item attached
- If the above statements are true, then a new QBO Time Activity is created
- The total time for the Time Activity will be total spent time.
- The rate will be the set be the service item
`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`
`Note: I am currently using this in a live production enviroment with no issues`
####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 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
* `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/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
##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
1. To install, clone this repo into your plugin folder
1. To install, clone this repo into your plugin folder
' git clone git@github.com:rickbarrette/redmine_qbo.git '
`git clone git@github.com:rickbarrette/redmine_qbo.git`
2. Migrate your database
' rake redmine:plugins:migrate RAILS_ENV=production '
`rake redmine:plugins:migrate RAILS_ENV=production`
3. Navigate to the plugin configuration page (https://your.redmine.com/settings/plugin/redmine_qbo) and suppy your own OAuth key & secret.
3. Navigate to the plugin configuration page and suppy your own OAuth key & secret.
4. After saving your key & secret, you need to click on the Authenticate link on the plugin configuration page to authenticate with QBO.
5. Enjoy
5. Assign an Employee to each of your users via the User Administration Page
Note: Customers, Employees, and Service Items with automaticly update during normal usage of redmine i.e. a page refresh. You can also manualy force redmine to sync its database with QBO clicking the sync link in the Quickbooks top menu page (https://your.redmine.com/redmine/qbo)
## Automatic Deploy
If you want the redmine server to be automaticly restarted after a git pull event add this hook to your git hook directory
https://gist.github.com/rickbarrette/3c999c7f37e321f9c60380de99e494f5
## 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.
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 Setting for Sandbox Mode
* Refactor Models prefixed with Qbo...
* Seperate Vehicles into a seperate plugin
* Make HTML Pretty
* Intergrate Customer Search into Redmine Search
* Fix Issue sort by Customer
* MORE Stuff...
##License

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -0,0 +1,147 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# This controller class will handle map management
class 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, :except => :view
skip_before_filter :verify_authenticity_token, :check_if_login_required, :only => [:view]
default_search_scope :names
# display a list of all customers
def index
if params[:search]
@customers = Customer.search(params[:search]).paginate(:page => params[:page])
if only_one_non_zero?(@customers)
redirect_to @customers.first
end
end
end
def new
@customer = Customer.new
end
def create
@customer = Customer.new(params[:customer])
if @customer.save
flash[:notice] = "New Customer Created"
redirect_to @customer
else
flash[:error] = @customer.errors.full_messages.to_sentence
redirect_to new_customer_path
end
end
# display a specific customer
def show
begin
@customer = Customer.find_by_id(params[:id])
@vehicles = @customer.vehicles.paginate(:page => params[:page])
@issues = @customer.issues
rescue ActiveRecord::RecordNotFound
render_404
end
end
# return an HTML form for editing a customer
def edit
begin
@customer = Customer.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
end
# update a specific customer
def update
begin
@customer = Customer.find_by_id(params[:id])
if @customer.update_attributes(params[:customer])
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
render_404
end
end
def destroy
begin
Customer.find_by_id(params[:id]).destroy
flash[:notice] = "Customer deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
render_404
end
end
# Customer view for an issue
def view
token = CustomerToken.where("token = ? and expires_at > ?", params[:token], Time.now)
if token.first
@issue = Issue.find token.first.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
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

@@ -0,0 +1,27 @@
#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 EstimateController < ApplicationController
unloadable
include AuthHelper
before_filter :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"
end
end

View File

@@ -0,0 +1,26 @@
#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 InvoiceController < ApplicationController
unloadable
include AuthHelper
before_filter :require_user
#
# Downloads and forwards the invoice pdf
#
def show
base = QboInvoice.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"
end
end

View File

@@ -0,0 +1,51 @@
#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

@@ -10,27 +10,33 @@
class QboController < ApplicationController
unloadable
require 'openssl'
include AuthHelper
before_filter :require_user, :except => :qbo_webhook
skip_before_filter :verify_authenticity_token, :check_if_login_required, :only => [:qbo_webhook]
#
# Called when the QBO Top Menu us shown
#
def index
@qbo = Qbo.first
@qbo_customer_count = QboCustomers.count
@customer_count = Customer.count
@qbo_item_count = QboItem.count
@qbo_employee_count = QboEmployee.count
@selected_customer
@selected_item
@selected_employee
@qbo_invoice_count = QboInvoice.count
@qbo_estimate_count = QboEstimate.count
end
#
# Called when the user requests that Redmine to connect to QBO
#
def authenticate
callback = request.base_url + qbo_oauth_callback_path
callback = qbo_oauth_callback_url
token = Qbo.get_oauth_consumer.get_request_token(:oauth_callback => callback)
session[:qb_request_token] = token
session[:qb_request_token] = Marshal.dump(token)
redirect_to("https://appcenter.intuit.com/Connect/Begin?oauth_token=#{token.token}") and return
end
@@ -38,37 +44,100 @@ class QboController < ApplicationController
# Called by QBO after authentication has been processed
#
def oauth_callback
at = session[:qb_request_token].get_access_token(:oauth_verifier => params[:oauth_verifier])
token = at.token
secret = at.secret
realm_id = params['realmId']
at = Marshal.load(session[:qb_request_token]).get_access_token(:oauth_verifier => params[:oauth_verifier])
#There can only be one...
Qbo.destroy_all
# Save the authentication information
qbo = Qbo.new
qbo.token = token
qbo.secret = secret
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.realmId = realm_id
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" }
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}" }
end
# Quickbooks Webhook Callback
def qbo_webhook
# check the payload
signature = request.headers['intuit-signature']
key = Setting.plugin_redmine_qbo['settingsWebhookToken']
data = request.body.read
hash = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha256'), key, data)).strip()
# proceed if the request is good
if hash.eql? signature
if request.headers['content-type'] == 'application/json'
data = JSON.parse(data)
else
# application/x-www-form-urlencoded
data = params.as_json
end
# Process the information
entities = data['eventNotifications'][0]['dataChangeEvent']['entities']
entities.each do |entity|
id = entity['id'].to_i
name = entity['name']
# TODO rename all other models!
name.prepend("Qbo") if not name.eql? "Customer"
# Magicly initialize the correct class
obj = name.constantize
# for merge events
obj.destroy(entity['deletedId']) if entity['deletedId']
#Check to see if we are deleting a record
if entity['operation'].eql? "Delete"
obj.destroy(id)
#if not then update!
else
obj.sync_by_id(id)
end
end
# Record that last time we updated
Qbo.update_time_stamp
# The webhook doesn't require a response but let's make sure we don't send anything
render :nothing => true
else
render nothing: true, status: 400
end
end
#
# Synchronizes the QboCustomer table with QBO
#
def sync
if Qbo.exists? then
QboCustomers.update_all
QboItem.update_all
QboEmployee.update_all
# Update info in background
Thread.new do
if Qbo.exists?
Customer.sync
QboItem.sync
QboEmployee.sync
QboEstimate.sync
QboInvoice.sync
# Record the last sync time
Qbo.update_time_stamp
end
ActiveRecord::Base.connection.close
end
redirect_to qbo_path(:redmine_qbo), :flash => { :notice => "Successfully synced to Quickbooks" }

View File

@@ -0,0 +1,126 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# This controller class will handle map management
class VehiclesController < ApplicationController
unloadable
include AuthHelper
before_filter :require_user
# display a list of all vehicles
def index
if params[:customer_id]
begin
@vehicles = Customer.find_by_id(params[:customer_id]).vehicles.paginate(:page => params[:page])
rescue ActiveRecord::RecordNotFound
render_404
end
end
if params[:search]
@vehicles = Vehicle.search(params[:search]).paginate(:page => params[:page])
if only_one_non_zero?(@vehicles)
redirect_to @vehicles.first
end
end
end
# 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]
end
# create a new vehicle
def create
@vehicle = Vehicle.new(params[:vehicle])
if @vehicle.save
flash[:notice] = "New Vehicle Created"
redirect_to @vehicle
else
flash[:error] = @vehicle.errors.full_messages.to_sentence
redirect_to new_vehicle_path
end
end
# display a specific vehicle
def show
begin
@vehicle = Vehicle.find_by_id(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
end
# return an HTML form for editing a vehicle
def edit
begin
@vehicle = Vehicle.find_by_id(params[:id])
@customer = @vehicle.customer.id
@customers = Customer.all.order(:name)
rescue ActiveRecord::RecordNotFound
render_404
end
end
# update a specific vehicle
def update
@customer = params[:customer]
begin
@vehicle = Vehicle.find_by_id(params[:id])
if @vehicle.update_attributes(params[:vehicle])
flash[:notice] = "Vehicle updated"
redirect_to @vehicle
else
flash[:error] = @vehicle.errors.full_messages.to_sentence if @vehicle.errors
redirect_to edit_vehicle_path
end
rescue ActiveRecord::RecordNotFound
render_404
end
end
# delete a specific vehicle
def destroy
begin
Vehicle.find_by_id(params[:id]).destroy
flash[:notice] = "Vehicle deleted successfully"
redirect_to action: :index
rescue ActiveRecord::RecordNotFound
render_404
end
end
# returns a dynamic list of vehicles owned by a customer
def update_vehicles
@vehicles = Customer.find_by(customer_id: params[:customer_id].to_i).vehicles
respond_to do |format|
format.html { render(:text => "not implemented") }
format.js
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

@@ -8,11 +8,11 @@
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module QboHelper
def qbo_customer_dropdown
select = context[:form].select :qbo_customer_id, QboCustomers.all.pluck(:name, :id), :selected => selected, include_blank: true
return "<p>#{select}</p>"
end
module AuthHelper
def require_user
if !User.current.logged?
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
end

206
app/models/customer.rb Normal file
View File

@@ -0,0 +1,206 @@
#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 Customer < ActiveRecord::Base
unloadable
has_many :issues
has_many :qbo_purchases
has_many :vehicles
attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone
validates_presence_of :id, :name
self.primary_key = :id
# returns a human readable string
def to_s
return name
end
# Convenience Method
# returns the customer's email
def email
pull unless @details
begin
return @details.email_address.address
rescue
return nil
end
end
# Convenience Method
# Sets the email
def email=(s)
pull unless @details
@details.email_address = s
end
# Convenience Method
# returns the customer's primary phone
def primary_phone
pull unless @details
begin
return @details.primary_phone.free_form_number
rescue
return nil
end
end
# Convenience Method
# Updates the customer's primary phone number
def primary_phone=(n)
pull unless @details
pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n
@details.primary_phone = pn
end
# Convenience Method
# returns the customer's mobile phone
def mobile_phone
pull unless @details
begin
return @details.mobile_phone.free_form_number
rescue
return nil
end
end
# Convenience Method
# Updates the custome's mobile phone number
def mobile_phone=(n)
pull unless @details
pn = Quickbooks::Model::TelephoneNumber.new
pn.free_form_number = n
@details.mobile_phone = pn
end
# Convenience Method
# Updates Both local DB name & QBO display_name
def name=(s)
pull unless @details
@details.display_name = s
super
end
# Magic Method
# Maps Get/Set methods to QBO customer object
def method_missing(sym, *arguments)
# Check to see if the method exists
if Quickbooks::Model::Customer.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
# proforms a bruteforce sync operation
# This needs to be simplified
def self.sync
service = Qbo.get_base(:customer).service
# Sync ALL customers if the database is empty
#if count == 0
customers = service.all
#else
# last = Qbo.first.last_sync
# query = "Select Id, DisplayName From Customer"
# query << " Where Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
# customers = service.query(query)
#end
customers.each do |customer|
qbo_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
end
else
if not qbo_customer.new_record?
qbo_customer.delete
end
end
end
end
# Searchs the database for a customer by name
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
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
customer = service.fetch_by_id(id)
qbo_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
end
else
if not qbo_customer.new_record?
qbo_customer.delete
end
end
end
# Push the updates
def save_with_push
begin
@details = Qbo.get_base(:customer).service.update(@details)
#raise "QBO Fault" if @details.fault?
self.id = @details.id
rescue Exception => e
errors.add(e.message)
end
save_without_push
end
alias_method :save_without_push, :save
alias_method :save, :save_with_push
private
# pull the details
def pull
begin
raise Exception unless self.id
@details = Qbo.get_base(:customer).find_by_id(self.id)
rescue Exception => e
@details = Quickbooks::Model::Customer.new
end
end
end

View File

@@ -1,29 +1,23 @@
#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 QboCustomers < ActiveRecord::Base
unloadable
has_many :issues
attr_accessible :name
validates_presence_of :id, :name
def self.update_all
qbo = Qbo.first
service = Quickbooks::Service::Customer.new(:company_id => qbo.realmId, :access_token => Qbo.get_auth_token)
# Update the customer table
service.all.each { |customer|
qbo_customer = QboCustomers.find_or_create_by(id: customer.id)
qbo_customer.id = customer.id
qbo_customer.name = customer.display_name
qbo_customer.save!
}
end
end
#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 CustomerToken < ActiveRecord::Base
unloadable
has_many :issues
attr_accessible :token, :expires_at, :issue_id
validates_presence_of :expires_at, :issue_id
before_create :generate_token
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
def generate_token
self.token = SecureRandom.base64(15).tr('+/=lIO0', OAUTH_CONSUMER_SECRET)
end
end

37
app/models/payment.rb Normal file
View File

@@ -0,0 +1,37 @@
#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 Payment
unloadable
include ActiveModel::Model
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)
end
def save!
save
end
# Dummy stub to make validtions happy.
def update_attribute
end
end

View File

@@ -10,24 +10,49 @@
class Qbo < ActiveRecord::Base
unloadable
validates_presence_of :token, :secret, :realmId, :token_expires_at, :reconnect_token_at
QB_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
QB_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
$qb_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
:site => "https://oauth.intuit.com",
:request_token_path => "/oauth/v1/get_request_token",
:authorize_url => "https://appcenter.intuit.com/Connect/Begin",
:access_token_path => "/oauth/v1/get_access_token"
})
def self.get_auth_token
qbo = first
return OAuth::AccessToken.new($qb_oauth_consumer, qbo.token, qbo.secret)
validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at
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'
end
def self.get_oauth_consumer
# Quickbooks Config Info
return $qb_oauth_consumer
end
# Get a quickbooks base object for type
# @params type of base
def self.get_base(type)
Quickbooks::Base.new(first, type)
end
# Get the QBO account
def self.get_account
first
end
# Updates last sync time stamp
def self.update_time_stamp
qbo = Qbo.first
qbo.last_sync = DateTime.now
qbo.save
end
def self.last_sync
format_time(Qbo.first.last_sync)
end
end

View File

@@ -14,16 +14,29 @@ class QboEmployee < ActiveRecord::Base
attr_accessible :name
validates_presence_of :id, :name
def self.update_all
qbo = Qbo.first
service = Quickbooks::Service::Employee.new(:company_id => qbo.realmId, :access_token => Qbo.get_auth_token)
# Update the item table
service.all.each { |employee|
qbo_employee = QboEmployee.find_or_create_by(id: employee.id)
qbo_employee.name = employee.display_name
qbo_employee.id = employee.id
qbo_employee.save!
}
def self.get_base
Qbo.get_base(:employee)
end
end
def self.sync
employees = get_base.service.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!
}
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!
end
end

View File

@@ -0,0 +1,53 @@
#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

134
app/models/qbo_invoice.rb Normal file
View File

@@ -0,0 +1,134 @@
#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, :id
validates_presence_of :doc_number, :id
self.primary_key = :id
def self.get_base
Qbo.get_base(:invoice).service
end
# sync ALL the invoices
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.all
else
invoices = get_base.query()
end
# Update the invoice table
invoices.each { | invoice |
process_invoice invoice
}
end
#sync by invoice ID
def self.sync_by_id(id)
#update the information in the database
invoice = get_base.fetch_by_id(id)
process_invoice invoice
end
# processes the invoice into the system
def self.process_invoice(invoice)
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)
# Load the invoice into the database
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.id = invoice.id
qbo_invoice.save!
# Attach the invoice to the issue
unless i.qbo_invoices.include?(qbo_invoice)
i.qbo_invoices << qbo_invoice
i.save!
end
# update the invoive custom fields with infomation from the work ticket if available
invoice.custom_fields.each { |cf|
# VIN from the attached vehicle
begin
if cf.name.eql? "VIN"
vin = Vehicle.find(i.vehicles_id).vin
break if vin.nil?
if not cf.string_value.to_s.eql? vin
cf.string_value = vin.to_s
is_changed = true
break
end
end
rescue
#do nothing
end
# Custom Values
begin
value = i.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
# Use the lowest Milage
if cf.name.eql? "Mileage In"
if cf.string_value.to_i > value.value.to_i or cf.string_value.blank?
cf.string_value = value.value.to_s
is_changed = true
end
break
end
# Use the max milage
if cf.name.eql? "Mileage Out"
if cf.string_value.to_i < value.value.to_i or cf.string_value.blank?
cf.string_value = value.value.to_s
is_changed = true
end
break
end
# Everything else
cf.string_value = value.value.to_s
is_changed = true
end
end
rescue
# Nothing to do here, there is no match
end
}
}
end
}
# Push updates
get_base.update(invoice) if is_changed
end
end

View File

@@ -13,17 +13,35 @@ class QboItem < ActiveRecord::Base
has_many :issues
attr_accessible :name
validates_presence_of :id, :name
def self.update_all
qbo = Qbo.first
service = Quickbooks::Service::Item.new(:company_id => qbo.realmId, :access_token => Qbo.get_auth_token)
# Update the item table
service.find_by(:type, "Service").each { |item|
qbo_item = QboItem.find_or_create_by(id: item.id)
qbo_item.name = item.name
qbo_item.id = item.id
qbo_item.save!
}
self.primary_key = :id
def self.get_base
Qbo.get_base(:item)
end
def self.sync
last = Qbo.first.last_sync
query = "SELECT Id, Name FROM Item WHERE Type = 'Service' "
query << " AND Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
if count == 0
items = get_base.service.all
else
items = get_base.service.query(query)
end
unless items.count = 0
items.find_by(:type, "Service").each { |i|
qbo_item = QboItem.find_or_create_by(id: i.id)
qbo_item.name = i.name
qbo_item.id = i.id
qbo_item.save
}
end
# QboItem.where.not(items.map(&:id)).destroy_all
end
end

View File

@@ -0,0 +1,47 @@
#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

130
app/models/vehicle.rb Normal file
View File

@@ -0,0 +1,130 @@
#The MIT License (MIT)
#
#Copyright (c) 2016 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class Vehicle < ActiveRecord::Base
unloadable
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
end
end
# returns the drive of the vehicle i.e. 2 wheel, 4 wheel, ect.
def drive
return @details['drivenWheels'].to_s.upcase if @details
end
# returns the number of doors of the vehicle
def doors
return @details['numOfDoors'] if @details
end
# Force Upper Case for VIN numbers
def make=(val)
# The to_s is in case you get nil/non-string
write_attribute(:make, val.to_s.titleize)
end
# Force Upper Case for VIN numbers
def model=(val)
# The to_s is in case you get nil/non-string
write_attribute(:model, val.to_s.titleize)
end
# Force Upper Case for VIN numbers
def vin=(val)
# The to_s is in case you get nil/non-string
write_attribute(:vin, val.to_s.scan(/^[A-Za-z0-9]+$/).join.upcase)
end
# search for a vin
def self.search(search)
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'].to_s.eql? "NOT_FOUND"
raise @details['message'] if @details['status'].to_s.eql? "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']
rescue Exception => e
errors.add(:vin, e.message)
end
end
self.name = to_s
end
# makes a squishvin
# https://api.edmunds.com/api/vehicle/v2/squishvins/#{vin}/?fmt=json&api_key=#{ENV['edmunds_key']}
def vin_squish
if not self.vin? or self.vin.size < 11
# this is to go ahead and query the API, letting them handle the error. :P
return '1000000000A'
end
v = self.vin[0,11]
return v.slice(0,8) + v.slice(9,11)
end
end

View File

@@ -0,0 +1,59 @@
<table>
<tbody>
<tr>
<th>Customer</th>
<td><%= customer.name %></td>
</tr>
<tr>
<th>Email</th>
<td><%= customer.email %></td>
</tr>
<tr>
<th>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>
<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>
</tr>
<tr>
<th>Shipping Address</th>
<td><%= customer.shipping_address %></td>
</tr>
<tr>
<th>Issues</th>
<td><%= customer.issues.count %></td>
</tr>
<tr>
<th>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>
<td><%= customer.notes %></td>
</tr>
<tr>
<td>
<%= button_to "Edit Customer", edit_customer_path(customer), method: :get%>
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,60 @@
<div class="row">
<div class="span6 columns">
<fieldset>
<%= form_for @customer do |f| %>
<div class="clearfix">
Display Name:
<div class="input">
<%= f.text_field :name, :required => true %>
</div>
</div>
<div class="clearfix">
Phone Number:
<div class="input">
<%= f.telephone_field :primary_phone %>
</div>
</div>
<div class="clearfix">
Mobile Phone Number:
<div class="input">
<%= f.telephone_field :mobile_phone %>
</div>
</div>
<div class="clearfix">
Email:
<div class="input">
<%= f.email_field :email %>
</div>
</div>
<div class="clearfix">
Notes:
<div class="input">
<p>
<%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @customer.new_record? %>
<%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@customer.new_record? ? nil : 'display:none') do %>
<%= f.text_area :notes,
:cols => 60,
:rows => 10,
:accesskey => accesskey(:edit),
:class => 'wiki-edit',
:no_label => true %>
<% end %>
</p>
<%= wikitoolbar_for 'issue_description' %>
</div>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</fieldset>
</div>
</div>

View File

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

View File

@@ -0,0 +1,28 @@
<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/>
<% if @customers.present? %>
<br/>
<% @customers.each do |c| %>
<div class="row">
<div class="span6 columns">
<%= link_to c, customer_path(c.id) %>
</div>
</div>
<% end %>
<div class="actions">
<%= will_paginate @customers %>
</div>
<% else %>
<p>There are no customers containing the term(s) <%= params[:search] %>.</p>
<% end %>
<div>
<%= Customer.count %> Customers - <b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
</div>

View File

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

View File

@@ -0,0 +1,12 @@
<h1>Customer #<%= @customer.id %></h1>
<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} %>

View File

@@ -0,0 +1,108 @@
<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) %>
</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_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,42 @@
<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

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

View File

@@ -0,0 +1 @@
<%= flash.now[:error] = "Not Authorized" %>

View File

@@ -10,10 +10,27 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-->
<!-- somewhere in your document include the Javascript -->
<script type="text/javascript" src="https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js"></script>
<!-- configure the Intuit object: 'grantUrl' is a URL in your application which kicks off the flow, see below -->
<script>
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_authenticate_url %>'});
</script>
<table >
<tbody>
<tr>
<th>OAuth Consumer Key</th>
<th>Edmunds API Key</th>
<td>
<input type="text" style="width:350px" id="settingsEdmundsAPIKey"
value="<%= settings['settingsEdmundsAPIKey'] %>"
name="settings[settingsEdmundsAPIKey]" >
</td>
</tr>
<tr>
<th>Intuit QBO OAuth Consumer Key</th>
<td>
<input type="text" style="width:350px" id="settingsOAuthConsumerKey"
value="<%= settings['settingsOAuthConsumerKey'] %>"
@@ -22,21 +39,22 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
</tr>
<tr>
<th>OAuth Consumer Secret</th>
<th>Intuit QBO OAuth Consumer Secret</th>
<td>
<input type="text" style="width:350px" id="settingsOAuthConsumerSecret"
value="<%= settings['settingsOAuthConsumerSecret'] %>"
name="settings[settingsOAuthConsumerSecret]" >
</td>
</tr>
</tbody>
</table>
<br/>
<table>
<tbody>
<tr>
<th>Intuit QBO Webhook Token</th>
<td>
<input type="text" style="width:350px" id="settingsWebhookToken"
value="<%= settings['settingsWebhookToken'] %>"
name="settings[settingsWebhookToken]" >
</td>
</tr>
<tr>
<th>Token Expires At</th>
@@ -54,5 +72,36 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
<br/>
Note: You need to authenticate after saving your key and secret above
<br/>
<%= link_to "Authenticate", qbo_authenticate_path, :method => :get %>
<br/>
<!-- this will display a button that the user clicks to start the flow -->
<ipp:connectToIntuit></ipp:connectToIntuit>
<br/>
<br/>
<div>
<b>Customer Count:</b> <%= Customer.count%>
</div>
<div>
<b>Item Count:</b> <%= QboItem.count %>
</div>
<div>
<b>Employee Count:</b> <%= QboEmployee.count %>
</div>
<div>
<b>Invoice Count:</b> <%= QboInvoice.count %>
</div>
<div>
<b>Estimate Count:</b> <%= QboEstimate.count %>
</div>
<br/>
<div>
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %> <%= link_to " Sync Now", qbo_sync_path %>
</div>

View File

@@ -12,31 +12,31 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
<body>
<h1> Redmine Quickbooks</h1>
<%= form_for @qbo do |f|%>
<div>
<%= f.label "Customer Count:"+@qbo_customer_count.to_s%>
<br/>
<%= f.select :qbo_customer_id, QboCustomers.all.pluck(:name, :id), :selected => @selected_customer, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Item Count: "+@qbo_item_count.to_s %>
<br/>
<%= f.select :qbo_item_id, QboItem.all.pluck(:name, :id).reverse, :selected => @selected_item, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Employee Count: "+@qbo_employee_count.to_s %>
<br/>
<%= f.select :qbo_employee_id, QboEmployee.all.pluck(:name, :id), :selected => @selected_employee, include_blank: true %>
</div>
<% end %>
<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/>
<br/>
<%= link_to "Sync", qbo_sync_path %>
</body>
<div>
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
</div>
</body>

View File

@@ -0,0 +1,54 @@
<table>
<tbody>
<tr>
<th>Customer</th>
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
</tr>
<tr>
<th>Vehicle</th>
<td><%= vehicle.to_s %></td>
</tr>
<tr>
<th>VIN</th>
<td><%= vehicle.vin %></td>
</tr>
<tr>
<th>Style</th>
<td><%= vehicle.style %></td>
</tr>
<tr>
<th>Drive</th>
<td><%= vehicle.drive %></td>
</tr>
<tr>
<th>Doors</th>
<td><%= vehicle.doors %></td>
</tr>
<tr>
<th>Notes</th>
<td><%= vehicle.notes %></td>
</tr>
<tr>
<th>Issues</th>
<td><%= vehicle.issues.count %></td>
</tr>
<tr>
<td/>
<td>
<%= button_to "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>

View File

@@ -0,0 +1,62 @@
<div class="row">
<div class="span6 columns">
<fieldset>
<%= form_for @vehicle do |f| %>
<div class="clearfix">
Customer:
<div class="input">
<%= f.collection_select :customer_id, @customers, :id, :name, include_blank: true, :selected => @customer, :required => true%>
</div>
</div>
<div class="clearfix">
Year:
<div class="input">
<%= f.number_field :year %>
</div>
</div>
<div class="clearfix">
Make:
<div class="input">
<%= f.text_field :make %>
</div>
</div>
<div class="clearfix">
Model:
<div class="input">
<%= f.text_field :model %>
</div>
</div>
<div class="clearfix">
VIN:
<div class="input">
<%= f.text_field :vin , :autofocus => true %>
</div>
</div>
<div class="clearfix">
Notes:
<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>
</div>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</fieldset>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<% if @vehicles.present? %>
<% @vehicles.each do |vehicle| %>
<div class="row">
<div>
<b><%= link_to "##{vehicle.id}", vehicle_path(vehicle) %> </b>
</div>
<div>
<%= vehicle.to_s %>
<br/>
<%= vehicle.customer %>
<br/>
<%= vehicle.vin %>
</div>
</div>
<br/>
<% end %>
<div class="actions">
<%= will_paginate @vehicles %>
</div>
<% else %>
<p>There are no vehicles containing the term(s) <%= params[:search] %>.</p>
<% end %>

View File

@@ -0,0 +1 @@
<option value="<%= vehicle.id %>"><%= vehicle.to_s.titleize %></option>

View File

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

View File

@@ -0,0 +1,9 @@
<h1>Customer Vehicles</h1>
<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

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

View File

@@ -0,0 +1,8 @@
<h1>Vehicle #<%=@vehicle.id%> </h1>
<br/>
<div style="text-align: left; width:90%;">
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
<%= render :partial => 'issues/list_simple', locals: {issues: @vehicle.issues} %>
</div>

View File

@@ -0,0 +1,2 @@
$("#issue_vehicles_id").empty()
.append("<%= escape_javascript(render(:partial => @vehicles)) %>")

View File

@@ -0,0 +1,10 @@
function customerSelected() {
customer_id = $('issue_customer_id').getValue();
console.log(customer_id);
}
document.observe('dom:loaded', function() {
customerSelected();
$('issue_customer_id').observe('change', customerSelected);
});

View File

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

View File

@@ -11,6 +11,13 @@
# English strings go here for Rails i18n
en:
# my_label: "My label"
field_qbo_customer: "Customer"
field_customer: "Customer"
field_qbo_item: "Item"
field_qbo_employee: "Employee"
field_qbo_invoice: "Invoice"
field_qbo_estimate: "Estimate"
field_vehicles: "Vehicle"
field_vin: "VIN"
field_notes: "Notes"
field_qbo_billed: "Billed"
label_week: "Week"

View File

@@ -8,11 +8,39 @@
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Plugin's routes
# See: http://guides.rubyonrails.org/routing.html
#
# Main Quickbooks landing page
get 'qbo', :to=> 'qbo#index'
#authentication
get 'qbo/authenticate', :to => 'qbo#authenticate'
get 'qbo/oauth_callback', :to => 'qbo#oauth_callback'
#manual sync
get 'qbo/sync', :to => 'qbo#sync'
# Estimate & Invoice PDF
get 'qbo/estimate/:id', :to => 'estimate#show', as: :estimate
get 'qbo/invoice/:id', :to => 'invoice#show', as: :invoice
#manual billing
get 'qbo/bill/:id', :to => 'qbo#bill', as: :bill
#customer issue view
get 'customers/view/:token', :to => 'customers#view', as: :view
#payments
resources :payments
#webhook
post 'qbo/webhook', :to => 'qbo#qbo_webhook'
#ajax
get "update_vehicles" => 'vehicles#update_vehicles', as: 'update_vehicles'
# Nest Vehicles under customers
resources :customers do
resources :vehicles
end
#allow for just vehicles too
resources :vehicles

View File

@@ -0,0 +1,18 @@
#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 CreateQboEstimates < ActiveRecord::Migration
def change
create_table :qbo_estimates, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'
t.string :doc_number
end
end
end

View File

@@ -0,0 +1,17 @@
#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 UpdateQbos < ActiveRecord::Migration
def change
rename_column :qbos, :token, :qb_token
rename_column :qbos, :secret, :qb_secret
rename_column :qbos, :realmId, :company_id
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateIssuesWithEstimates < ActiveRecord::Migration
def change
add_reference :issues, :qbo_estimate, index: true
end
end

View File

@@ -0,0 +1,18 @@
#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 CreateQboInvoices < ActiveRecord::Migration
def change
create_table :qbo_invoices, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'
t.string :doc_number
end
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateIssuesWithInvoices< ActiveRecord::Migration
def change
add_reference :issues, :qbo_invoice, index: true
end
end

View File

@@ -0,0 +1,21 @@
#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 CreateQboPurchases< ActiveRecord::Migration
def change
create_table :qbo_purchases, id: false do |t|
t.integer :id, :options => 'PRIMARY KEY'
t.integer :line_id
t.string :description
t.integer :customer_id
t.integer :issue_id
end
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateCustomers < ActiveRecord::Migration
def change
add_reference :qbo_customers, :qbo_purchase, index: true
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateQboPurchases < ActiveRecord::Migration
def change
rename_column :qbo_purchases, :customer_id, :qbo_customer_id
end
end

View File

@@ -0,0 +1,24 @@
#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 CreateVehicles < ActiveRecord::Migration
def change
create_table :vehicles do |t|
t.integer :year
t.string :make
t.string :model
t.string :vin
t.text :notes
end
add_reference :vehicles, :qbo_customer, index: true
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateIssuesWithVehicles < ActiveRecord::Migration
def change
add_reference :issues, :vehicles, index: true
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateVehicles < ActiveRecord::Migration
def change
add_column :vehicles, :name, :text
end
end

View File

@@ -0,0 +1,17 @@
#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 QbocustomersToCustomers< ActiveRecord::Migration
def change
rename_table :qbo_customers, :customers
rename_column :issues, :qbo_customer_id, :customer_id
rename_column :vehicles, :qbo_customer_id, :customer_id
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateQbosTimeStamp < ActiveRecord::Migration
def change
add_column :qbos, :last_sync, :datetime
end
end

View File

@@ -0,0 +1,27 @@
#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 AddIssuesQboInvoices < ActiveRecord::Migration
def self.up
create_table :issues_qbo_invoices, :id => false do |t|
t.references :issue
t.references :qbo_invoice
end
add_index :issues_qbo_invoices, [:issue_id, :qbo_invoice_id], :unique => true
# Now populate it with a SQL one-liner!
execute "insert into issues_qbo_invoices(issue_id, qbo_invoice_id) select id, qbo_invoice_id from issues"
end
def self.down
drop_table :issues_qbo_invoices
end
end

View File

@@ -0,0 +1,15 @@
#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 UpdateIssuesRemoveInvoice < ActiveRecord::Migration
def change
remove_reference :issues, :qbo_invoice
end
end

View File

@@ -0,0 +1,19 @@
#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 CreateCustomerTokens < ActiveRecord::Migration
def change
create_table :customer_tokens do |t|
t.string :token
t.timestamp :expires_at
t.references :issue
end
end
end

73
init.rb
View File

@@ -10,29 +10,58 @@
Redmine::Plugin.register :redmine_qbo do
require_dependency 'issues_form_hook_listener'
require_dependency 'issues_save_hook_listener'
require_dependency 'issues_show_hook_listener'
require_dependency 'users_show_hook_listener'
# View Hook Listeners
require_dependency 'issues_form_hook_listener'
require_dependency 'issues_save_hook_listener'
require_dependency 'issues_show_hook_listener'
require_dependency 'users_show_hook_listener'
require_dependency 'header_footer_hook_listener'
# Patches to the Redmine core. Will not work in development mode
require_dependency 'issue_patch'
require_dependency 'user_patch'
require_dependency 'query_patch'
require_dependency 'time_entry_query_patch'
require_dependency 'pdf_patch'
Rails.configuration.to_prepare do
Redmine::Search.available_search_types << 'customers'
end
name 'Redmine Quickbooks Online plugin'
author 'Rick Barrette'
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
version '0.0.2'
url 'https://github.com/rickbarrette/redmine_qbo'
author_url 'http://rickbarrette.org'
settings :default => {'empty' => true}, :partial => 'qbo/settings'
name 'Redmine Quickbooks Online plugin'
author 'Rick Barrette'
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
version '0.4.1'
url 'https://github.com/rickbarrette/redmine_qbo'
author_url 'http://rickbarrette.org'
settings :default => {'empty' => true}, :partial => 'qbo/settings'
# Add safe attributes
Issue.safe_attributes 'qbo_customer_id'
Issue.safe_attributes 'qbo_item_id'
User.safe_attributes 'qbo_employee_id'
TimeEntry.safe_attributes 'qbo_billed'
# We are playing in the sandbox
#Quickbooks.sandbox_mode = true
# Add safe attributes
Issue.safe_attributes 'customer_id'
Issue.safe_attributes 'qbo_item_id'
Issue.safe_attributes 'qbo_estimate_id'
Issue.safe_attributes 'qbo_invoice_id'
Issue.safe_attributes 'vehicles_id'
User.safe_attributes 'qbo_employee_id'
TimeEntry.safe_attributes 'qbo_billed'
# We are playing in the sandbox
#Quickbooks.sandbox_mode = true
# Register QBO top menu item
menu :top_menu, :qbo, { :controller => 'qbo', :action => 'index' }, :caption => 'Quickbooks'
# set per_page globally
WillPaginate.per_page = 10
end
# Register QBO top menu item
#menu :top_menu, :qbo, { :controller => :qbo, :action => :index }, :caption => 'Quickbooks', :if => Proc.new { User.current.admin? }
menu :top_menu, :customers, { :controller => :customers, :action => :index }, :caption => 'Customers', :if => Proc.new { User.current.logged? }
menu :top_menu, :vehicles, { :controller => :vehicles, :action => :index }, :caption => 'Vehicles', :if => Proc.new { User.current.logged? }
menu :application_menu, :new_customer, { :controller => :customers, :action => :new }, :caption => 'New Customer', :if => Proc.new { User.current.logged? }
menu :application_menu, :new_payment, { :controller => :payments, :action => :new }, :caption => 'New Payment', :if => Proc.new { User.current.logged? }
permission :customers, { :customers => [:index, :new] }, :public => false
menu :project_menu, :customers, { :controller => 'customers', :action => 'new' }, :caption => 'New Customer', :after => :new_issue, :param => :project_id
permission :payments, { :payments => [:index, :new] }, :public => false
menu :project_menu, :payments, { :controller => 'payments', :action => 'new' }, :caption => 'New Payment', :after => :customers, :param => :project_id
end

View File

@@ -0,0 +1,19 @@
#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 HeaderFooterHookListener < Redmine::Hook::ViewListener
def view_layouts_base_html_head(context = {})
#nothing
end
def view_layouts_base_body_bottom(context = {})
return "<div id='qbo_footer' align='center'><b>Last Sync: </b> #{Qbo.last_sync if Qbo.exists?}</div>"
end
end

102
lib/issue_patch.rb Normal file
View File

@@ -0,0 +1,102 @@
#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.
require_dependency 'issue'
# Patches Redmine's Issues dynamically.
# Adds a relationships
module IssuePatch
def self.included(base) # :nodoc:
base.extend(ClassMethods)
base.send(:include, InstanceMethods)
# Same as typing in the class
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
belongs_to :customer, primary_key: :id
belongs_to :customer_token, primary_key: :id
belongs_to :qbo_estimate, primary_key: :id
has_and_belongs_to_many :qbo_invoices
#, :association_foreign_key => 'issue_id', :class_name => 'Issue', :join_table => 'issues_qbo_invoices'
belongs_to :vehicle, primary_key: :id
end
end
module ClassMethods
end
module InstanceMethods
# Create billable time entries
def bill_time
# Get unbilled time entries
spent_time = time_entries.where(qbo_billed: [false, nil])
spent_hours ||= spent_time.sum(:hours) || 0
if spent_hours > 0 then
# Prepare to create a new Time Activity
time_service = Qbo.get_base(:time_activity).service
item_service = Qbo.get_base(:item).service
time_entry = Quickbooks::Model::TimeActivity.new
h = Hash.new(0)
spent_time.each do |entry|
# Lets tottal up each activity
h[entry.activity.name] += entry.hours
# update time entries billed status
entry.qbo_billed = true
entry.save
end
h.each do |key, val|
# Convert float spent time to hours and minutes
hours = val.to_i
minutesDecimal = (( val - hours) * 60)
minutes = minutesDecimal.to_i
item = item_service.query("SELECT * FROM Item WHERE Name = '#{key}' ").first
next if item.nil?
time_entry.description = "#{tracker} ##{id}: #{subject} #{"(Partial)" if not closed?}"
# TODO entry.user.qbo_employee.id
time_entry.employee_id = assigned_to.qbo_employee_id
time_entry.customer_id = customer_id
time_entry.billable_status = "Billable"
time_entry.hours = hours
time_entry.minutes = minutes
time_entry.name_of = "Employee"
time_entry.txn_date = Date.today
time_entry.hourly_rate = item.unit_price
time_entry.item_id = item.id
time_entry.start_time = start_date
time_entry.end_time = Time.now
time_service.create(time_entry)
end
end
end
end
# Create a shareable link for a customer
def share_token
CustomerToken.create(:expires_at => Time.now + 24.hours, :issue_id => id)
end
end
# Add module to Issue
Issue.send(:include, IssuePatch)

View File

@@ -9,27 +9,43 @@
#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 IssuesFormHookListener < Redmine::Hook::ViewListener
# Load the javascript
def view_layouts_base_html_head(context = {})
js = javascript_include_tag 'vehicles', :plugin => 'redmine_qbo'
#js += javascript_include_tag 'update_vehicles', :plugin => 'redmine_qbo'
return js
end
# Edit Issue Form
# Show a dropdown for quickbooks contacts
def view_issues_form_details_bottom(context={})
selected = ""
QboCustomers.update_all
QboItem.update_all
f = context[:form]
# Check to see if there is a quickbooks user attached to the issue
if not context[:issue].qbo_customer_id.nil? then
selected_customer = context[:issue].qbo_customer_id
selected_item = context[:issue].qbo_item_id
selected_customer = context[:issue].customer ? context[:issue].customer.id : nil
selected_estimate = context[:issue].qbo_estimate ? context[:issue].qbo_estimate.id : nil
selected_vehicle = context[:issue].vehicles_id ? context[:issue].vehicles_id : nil
# Load customer information without callbacks
customer = Customer.find_by_id(selected_customer) if selected_customer
select_customer = f.select :customer_id,
Customer.all.pluck(:name, :id).sort,
:selected => selected_customer,
include_blank: true,
onchange: "$customerSelected;"
# Generate the drop down list of quickbooks extimates
select_estimate = f.select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => selected_estimate, include_blank: true
if context[:issue].customer
vehicles = customer.vehicles.pluck(:name, :id).sort!
else
vehicles = Vehicle.all.order(:name).pluck(:name, :id)
end
# Generate the drop down list of quickbooks contacts
select_customer = context[:form].select :qbo_customer_id, QboCustomers.all.pluck(:name, :id), :selected => selected_customer, include_blank: true
# Generate the drop down list of quickbooks contacts
select_item = context[:form].select :qbo_item_id, QboItem.all.pluck(:name, :id).reverse, :selected => selected_item, include_blank: true
return "<p>#{select_customer}</p> <p>#{select_item}</p>"
vehicle = f.select :vehicles_id, vehicles, :selected => selected_vehicle, include_blank: true
return "<p>#{select_customer}</p> <p>#{select_estimate}</p> <p>#{vehicle}</p>"
end
end
end

View File

@@ -10,54 +10,47 @@
class IssuesSaveHookListener < Redmine::Hook::ViewListener
# New Issue Saved
def controller_issues_edit_after_save(context={})
#Before Issue Saved
def controller_issues_edit_before_save(context={})
issue = context[:issue]
qbo = Qbo.first
# Check to see if we have registered with QBO
if not qbo.nil? then
if Qbo.first && issue.customer && issue. qbo_item_id
# Prepare to create a new Time Activity
time_service = Quickbooks::Service::TimeActivity.new(:company_id => qbo.realmId, :access_token => Qbo.get_auth_token)
item_service = Quickbooks::Service::Item.new(:company_id => qbo.realmId, :access_token => Qbo.get_auth_token)
time_entry = Quickbooks::Model::TimeActivity.new
# Get unbilled time entries
spent_time = issue.time_entries.where(qbo_billed: [false, nil])
spent_hours ||= spent_time.sum(:hours) || 0
# Convert float spent time to hours and minutes
hours = spent_hours.to_i
minutesDecimal = (( spent_hours - hours) * 60)
minutes = minutesDecimal.to_i
# update time entries billed status
spent_time.each do |entry|
entry.qbo_billed = true
entry.save
# if this is a quote, lets create a new estimate based off estimated hours
if issue.tracker.name = "Quote" && issue.status.name = "New" && issue.qbo_estimate
# Get QBO Services
item_service = QboItem.get_base.service
estimate_base = QboEstimate.get_base
# Create the estimate
estimate = estimate_base.qr_model(:estimate)
estimate.customer_id = issue.customer_id
estimate.txn_date = Date.today
# Create the line item for labor
item = item_service.fetch_by_id(issue.qbo_item_id)
line_item = Quickbooks::Model::InvoiceLineItem.new
line_item.amount = item.unit_price * issue.estimated_hours
line_item.description = issue.subject
line_item.sales_item! do |detail|
detail.unit_price = item.unit_price
detail.quantity = issue.estimated_hours
detail.item_id = issue.qbo_item_id
end
# Add the line items to the estimate
estimate.line_items << line_item
end
end
employee_id = User.find_by_id(issue.assigned_to_id).qbo_employee_id
# If the issue is closed, then create a new billable time activty for the customer
# TODO Add configuration settings for employee_id, hourly_rate, item_id
if issue.status.is_closed? and not issue.qbo_customer_id.nil? and not issue.qbo_item_id.nil? and not employee_id.nil? and spent_hours > 0 then
item = item_service.fetch_by_id issue.qbo_item_id
time_entry.description = "#{issue.tracker} ##{issue.id}: #{issue.subject}"
time_entry.employee_id = employee_id
time_entry.customer_id = issue.qbo_customer_id
time_entry.billable_status = "Billable"
time_entry.hours = hours
time_entry.minutes = minutes
time_entry.name_of = "Employee"
time_entry.txn_date = Date.today
time_entry.hourly_rate = item.unit_price
time_entry.item_id = issue.qbo_item_id
time_entry.start_time = issue.start_date
time_entry.end_time = Time.now
time_service.create(time_entry)
end
end
end
# Called After Issue Saved
def controller_issues_edit_after_save(context={})
issue = context[:issue]
issue.bill_time if Qbo.first && issue.customer && issue.status.is_closed?
end
end

View File

@@ -10,31 +10,90 @@
class IssuesShowHookListener < Redmine::Hook::ViewListener
# Additional context fields
# :issue => the issue this is edited
# :f => the form object to create additional fields
#render_on :view_issues_show_details_bottom, :partial => 'hooks/redmine_qbo/_view_issues_show_details_bottom.html.erb'
# View Issue
# Display the quickbooks contact in the issue
def view_issues_show_details_bottom(context={})
value = ""
issue = context[:issue]
# Check to see if there is a quickbooks user attached to the issue
if not context[:issue].qbo_customer_id.nil? then
value = QboCustomers.find_by_id(context[:issue].qbo_customer_id).name
if issue.customer
customer = link_to issue.customer.name, "#{Redmine::Utils::relative_url_root}/customers/#{issue.customer.id}"
end
output = content_tag(:div, content_tag(:div, content_tag(:div, content_tag(:span,"Customer") + ":", class:"label") + content_tag(:div, value, class:"value") , class:"qbo_customer_id attribute"), class:"attributes")
value = ""
# Estimate Number
if issue.qbo_estimate
estimate = issue.qbo_estimate.doc_number
estimate_link = link_to estimate, "#{Redmine::Utils::relative_url_root}/qbo/estimate/#{issue.qbo_estimate.id}", :target => "_blank"
end
# Check to see if there is a quickbooks item attached to the issue
if not context[:issue].qbo_customer_id.nil? then
if not QboItem.find_by_id(context[:issue].qbo_item_id).nil? then
value = QboItem.find_by_id(context[:issue].qbo_item_id).name
# Invoice Number
invoice_link = ""
if issue.qbo_invoice_ids
issue.qbo_invoice_ids.each do |i|
invoice = QboInvoice.find i
invoice_link = invoice_link + link_to( invoice.doc_number, "#{Redmine::Utils::relative_url_root}/qbo/invoice/#{i}", :target => "_blank").to_s + " "
end
end
output << content_tag(:div, content_tag(:div, content_tag(:div, content_tag(:span,"Item") + ":", class:"label") + content_tag(:div, value, class:"value") , class:"qbo_item_id attribute"), class:"attributes")
begin
v = Vehicle.find(issue.vehicles_id)
vehicle = link_to v.to_s, "#{Redmine::Utils::relative_url_root}/vehicles/#{v.id}"
vin = v.vin
notes = v.notes
rescue
#do nothing
end
split_vin = vin.scan(/.{1,9}/) if vin
return "
<div class=\"splitcontent\">
<div class=\"splitcontentleft\">
<div class=\"customer_id attribute\">
<div class=\"label\"><span>Customer</span>:</div>
<div class=\"value\">#{customer}</div>
</div>
# Display the Customers name in the Issue attributes
return output
<div class=\"qbo_estimate_id attribute\">
<div class=\"label\"><span>Estimate</span>:</div>
<div class=\"value\">#{estimate_link}</div>
</div>
<div class=\"qbo_invoice_id attribute\">
<div class=\"label\"><span>Invoice</span>:</div>
<div class=\"value\">#{invoice_link}</div>
</div>
</div>
<div class=\"splitcontentleft\">
<div class=\"vehicle attribute\">
<div class=\"label\"><span>Vehicle</span>:</div>
<div class=\"value\">#{vehicle}</div>
</div>
<div class=\"vehicle_vin attribute\">
<div class=\"label\"><span>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>Notes</span>:</div>
<div class=\"value\">#{notes}</div>
</div>
</div>
</div>"
end
end
def view_issues_show_description_bottom(context={})
bill_button = button_to "Bill Time", "#{Redmine::Utils::relative_url_root}/qbo/bill/#{context[:issue].id}", method: :get if User.current.admin?
share_button = button_to "Share", "#{Redmine::Utils::relative_url_root}/customers/view/#{context[:issue].share_token.token}", method: :get if User.current.logged?
return "<br/> #{bill_button} #{share_button}"
end
end

247
lib/pdf_patch.rb Normal file
View File

@@ -0,0 +1,247 @@
require_dependency 'redmine/export/pdf'
require_dependency 'redmine/export/pdf/issues_pdf_helper'
module IssuesPdfHelperPatch
def self.included(base)
base.send(:include, InstanceMethods)
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
alias_method_chain :issue_to_pdf, :patch
end
end
module InstanceMethods
def issue_to_pdf_with_patch(issue, assoc={})
pdf = ::Redmine::Export::PDF::ITCPDF.new(current_language)
pdf.set_title("#{issue.project} - #{issue.tracker} ##{issue.id}")
pdf.alias_nb_pages
pdf.footer_date = format_date(Date.today)
pdf.add_page
pdf.SetFontStyle('B',11)
buf = "#{issue.project} - #{issue.tracker} ##{issue.id}"
pdf.RDMMultiCell(190, 5, buf)
pdf.SetFontStyle('',8)
base_x = pdf.get_x
i = 1
issue.ancestors.visible.each do |ancestor|
pdf.set_x(base_x + i)
buf = "#{ancestor.tracker} # #{ancestor.id} (#{ancestor.status.to_s}): #{ancestor.subject}"
pdf.RDMMultiCell(190 - i, 5, buf)
i += 1 if i < 35
end
pdf.SetFontStyle('B',11)
pdf.RDMMultiCell(190 - i, 5, issue.subject.to_s)
pdf.SetFontStyle('',8)
pdf.RDMMultiCell(190, 5, "#{format_time(issue.created_on)} - #{issue.author}")
pdf.ln
customer = issue.customer.name if issue.customer
left = []
left << [l(:field_status), issue.status]
left << [l(:field_priority), issue.priority]
left << [l(:field_customer), customer]
left << [l(:field_assigned_to), issue.assigned_to] unless issue.disabled_core_fields.include?('assigned_to_id')
#left << [l(:field_category), issue.category] unless issue.disabled_core_fields.include?('category_id')
#left << [l(:field_fixed_version), issue.fixed_version] unless issue.disabled_core_fields.include?('fixed_version_id')
v = Vehicle.find_by_id(issue.vehicles_id)
vehicle = v ? v.to_s : nil
vin = v ? v.vin : nil
notes = v ? v.notes : nil
left << [l(:field_vehicles), vehicle]
left << [l(:field_vin), vin.gsub(/(.{9})/, '\1 ')]
#left << [l(:field_notes), notes]
right = []
right << [l(:field_start_date), format_date(issue.start_date)] unless issue.disabled_core_fields.include?('start_date')
right << [l(:field_due_date), format_date(issue.due_date)] unless issue.disabled_core_fields.include?('due_date')
right << [l(:field_done_ratio), "#{issue.done_ratio}%"] unless issue.disabled_core_fields.include?('done_ratio')
right << [l(:field_estimated_hours), l_hours(issue.estimated_hours)] unless issue.disabled_core_fields.include?('estimated_hours')
right << [l(:label_spent_time), l_hours(issue.total_spent_hours)] if User.current.allowed_to?(:view_time_entries, issue.project)
right << [l(:field_notes), notes]
rows = left.size > right.size ? left.size : right.size
while left.size < rows
left << nil
end
while right.size < rows
right << nil
end
half = (issue.visible_custom_field_values.size / 2.0).ceil
issue.visible_custom_field_values.each_with_index do |custom_value, i|
(i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value, false)]
end
if pdf.get_rtl
border_first_top = 'RT'
border_last_top = 'LT'
border_first = 'R'
border_last = 'L'
else
border_first_top = 'LT'
border_last_top = 'RT'
border_first = 'L'
border_last = 'R'
end
rows = left.size > right.size ? left.size : right.size
rows.times do |i|
heights = []
pdf.SetFontStyle('B',9)
item = left[i]
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
item = right[i]
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
pdf.SetFontStyle('',9)
item = left[i]
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
item = right[i]
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
height = heights.max
item = left[i]
pdf.SetFontStyle('B',9)
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
pdf.SetFontStyle('',9)
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 0)
item = right[i]
pdf.SetFontStyle('B',9)
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
pdf.SetFontStyle('',9)
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 2)
pdf.set_x(base_x)
end
pdf.SetFontStyle('B',9)
pdf.RDMCell(35+155, 5, l(:field_description), "LRT", 1)
pdf.SetFontStyle('',9)
# Set resize image scale
pdf.set_image_scale(1.6)
text = textilizable(issue, :description,
:only_path => false,
:edit_section_links => false,
:headings => false,
:inline_attachments => false
)
pdf.RDMwriteFormattedCell(35+155, 5, '', '', text, issue.attachments, "LRB")
unless issue.leaf?
truncate_length = (!is_cjk? ? 90 : 65)
pdf.SetFontStyle('B',9)
pdf.RDMCell(35+155,5, l(:label_subtask_plural) + ":", "LTR")
pdf.ln
issue_list(issue.descendants.visible.sort_by(&:lft)) do |child, level|
buf = "#{child.tracker} # #{child.id}: #{child.subject}".
truncate(truncate_length)
level = 10 if level >= 10
pdf.SetFontStyle('',8)
pdf.RDMCell(35+135,5, (level >=1 ? " " * level : "") + buf, border_first)
pdf.SetFontStyle('B',8)
pdf.RDMCell(20,5, child.status.to_s, border_last)
pdf.ln
end
end
relations = issue.relations.select { |r| r.other_issue(issue).visible? }
unless relations.empty?
truncate_length = (!is_cjk? ? 80 : 60)
pdf.SetFontStyle('B',9)
pdf.RDMCell(35+155,5, l(:label_related_issues) + ":", "LTR")
pdf.ln
relations.each do |relation|
buf = relation.to_s(issue) {|other|
text = ""
if Setting.cross_project_issue_relations?
text += "#{relation.other_issue(issue).project} - "
end
text += "#{other.tracker} ##{other.id}: #{other.subject}"
text
}
buf = buf.truncate(truncate_length)
pdf.SetFontStyle('', 8)
pdf.RDMCell(35+155-60, 5, buf, border_first)
pdf.SetFontStyle('B',8)
pdf.RDMCell(20,5, relation.other_issue(issue).status.to_s, "")
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).start_date), "")
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).due_date), border_last)
pdf.ln
end
end
pdf.RDMCell(190,5, "", "T")
pdf.ln
if issue.changesets.any? &&
User.current.allowed_to?(:view_changesets, issue.project)
pdf.SetFontStyle('B',9)
pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
pdf.ln
for changeset in issue.changesets
pdf.SetFontStyle('B',8)
csstr = "#{l(:label_revision)} #{changeset.format_identifier} - "
csstr += format_time(changeset.committed_on) + " - " + changeset.author.to_s
pdf.RDMCell(190, 5, csstr)
pdf.ln
unless changeset.comments.blank?
pdf.SetFontStyle('',8)
pdf.RDMwriteHTMLCell(190,5,'','',
changeset.comments.to_s, issue.attachments, "")
end
pdf.ln
end
end
if assoc[:journals].present?
pdf.SetFontStyle('B',9)
pdf.RDMCell(190,5, l(:label_history), "B")
pdf.ln
assoc[:journals].each do |journal|
pdf.SetFontStyle('B',8)
title = "##{journal.indice} - #{format_time(journal.created_on)} - #{journal.user}"
title << " (#{l(:field_private_notes)})" if journal.private_notes?
pdf.RDMCell(190,5, title)
pdf.ln
pdf.SetFontStyle('I',8)
details_to_strings(journal.visible_details, true).each do |string|
pdf.RDMMultiCell(190,5, "- " + string)
end
if journal.notes?
pdf.ln unless journal.details.empty?
pdf.SetFontStyle('',8)
text = textilizable(journal, :notes,
:only_path => false,
:edit_section_links => false,
:headings => false,
:inline_attachments => false
)
pdf.RDMwriteFormattedCell(190,5,'','', text, issue.attachments, "")
end
pdf.ln
end
end
if issue.attachments.any?
pdf.SetFontStyle('B',9)
pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
pdf.ln
for attachment in issue.attachments
pdf.SetFontStyle('',8)
pdf.RDMCell(80,5, attachment.filename)
pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
pdf.ln
end
end
pdf.output
end
end
end
Redmine::Export::PDF::IssuesPdfHelper.send(:include, IssuesPdfHelperPatch)

72
lib/query_patch.rb Normal file
View File

@@ -0,0 +1,72 @@
#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.
require_dependency 'issue_query'
module QueryPatch
def self.included(base) # :nodoc:
base.extend(ClassMethods)
base.send(:include, InstanceMethods)
# Same as typing in the class
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
alias_method_chain :available_columns, :qbo
alias_method_chain :available_filters, :qbo
end
end
module ClassMethods
end
module InstanceMethods
def available_columns_with_qbo
unless @available_columns
@available_columns = available_columns_without_qbo
@available_columns << QueryColumn.new(:customer, :sortable => "#{Customer.table_name}.name", :groupable => true, :caption => :field_customer)
@available_columns << QueryColumn.new(:qbo_billed, :sortable => "#{TimeEntry.table_name}.name", :groupable => true, :caption => :field_qbo_billed)
end
@available_columns
end
def available_filters_with_qbo
unless @available_filters
@available_filters = available_filters_without_qbo
#qbo_filters = {
# :customer => {
# :id => l(:field_customer),
# :type => :integer,
# :order => @available_filters.size + 1},
#}
qbo_filters = {
"customer_id" => {
:id => :customer_id,
:type => :list_optional,
:order => @available_filters.size + 1,
#:values => Customer.find(:all).collect { |c| [c.name, c.id.to_s]}
}
}
@available_filters.merge!(qbo_filters)
end
@available_filters
end
end
end
# Add module to Issue
IssueQuery.send(:include, QueryPatch)

View File

@@ -0,0 +1,71 @@
#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.
require_dependency 'time_entry_query'
module TimeEntryQueryPatch
def self.included(base) # :nodoc:
base.extend(ClassMethods)
base.send(:include, InstanceMethods)
# Same as typing in the class
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
alias_method_chain :available_columns, :qbo_billed
alias_method_chain :available_filters, :qbo_billed
end
end
module ClassMethods
end
module InstanceMethods
def available_columns_with_qbo_billed
unless @available_columns
@available_columns = available_columns_without_qbo
@available_columns << QueryColumn.new(:qbo_billed, :sortable => "#{TimeEntry.table_name}.name", :groupable => true, :caption => :field_qbo_billed)
end
@available_columns
end
def available_filters_with_qbo_billed
unless @available_filters
@available_filters = available_filters_without_qbo
#qbo_filters = {
# :customer => {
# :id => l(:field_qbo_billed),
# :type => :boolean,
# :order => @available_filters.size + 1},
#}
qbo_filters = {
"qbo_billed" => {
:id => :qbo_billed,
:type => :list_optional,
:order => @available_filters.size + 1,
#:values => Customer.find(:all).collect { |c| [c.name, c.id.to_s]}
}
}
@available_filters.merge!(qbo_filters)
end
@available_filters
end
end
end
# Add module to TimeEntryQuery
TimeEntryQuery.send(:include, QueryPatch)

39
lib/user_patch.rb Normal file
View File

@@ -0,0 +1,39 @@
#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.
require_dependency 'user'
# Patches Redmine's User dynamically.
# Adds a relationships
module UserPatch
def self.included(base) # :nodoc:
base.extend(ClassMethods)
base.send(:include, InstanceMethods)
# Same as typing in the class
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
belongs_to :qbo_employee, primary_key: :id
end
end
module ClassMethods
end
module InstanceMethods
end
end
# Add module to Issue
User.send(:include, UserPatch)

View File

@@ -12,16 +12,14 @@ class UsersShowHookListener < Redmine::Hook::ViewListener
# View User
def view_users_form(context={})
selected = ""
QboEmployee.update_all
# Update the users
#QboEmployee.update_all
# Check to see if there is a quickbooks user attached to the issue
if not context[:user].qbo_employee_id.nil? then
selected = context[:user].qbo_employee_id
end
@selected = context[:user].qbo_employee.id if context[:user].qbo_employee
# Generate the drop down list of quickbooks contacts
return "<p>#{context[:form].select :qbo_employee_id, QboEmployee.all.pluck(:name, :id), :selected => selected, include_blank: true}</p>"
return "<p>#{context[:form].select :qbo_employee_id, QboEmployee.all.pluck(:name, :id), :selected => @selected, include_blank: true}</p>"
end
end
end

View File

@@ -0,0 +1,8 @@
require File.expand_path('../../test_helper', __FILE__)
class EstimateControllerTest < ActionController::TestCase
# Replace this with your real tests.
def test_truth
assert true
end
end

View File

@@ -0,0 +1,8 @@
require File.expand_path('../../test_helper', __FILE__)
class InvoiceControllerTest < ActionController::TestCase
# Replace this with your real tests.
def test_truth
assert true
end
end

View File

@@ -0,0 +1,9 @@
require File.expand_path('../../test_helper', __FILE__)
class CustomerTokenTest < ActiveSupport::TestCase
# Replace this with your real tests.
def test_truth
assert true
end
end