Compare commits

..

1420 Commits

Author SHA1 Message Date
ricky a34b6a07fc fixed typos 2017-03-23 05:56:26 -04:00
ricky 2ce811bbbf Update auth_helper.rb 2017-03-23 05:50:31 -04:00
ricky 02153de8b0 Added before filters add_customer, view_customer 2017-03-23 05:47:37 -04:00
ricky 68be20459b Added global_check_permission 2017-03-23 05:45:45 -04:00
ricky bbd03cc337 Update init.rb 2017-03-23 05:42:54 -04:00
ricky 4fc71a93f2 Update init.rb 2017-03-23 05:42:09 -04:00
ricky 8e7e1908e4 Update customers_controller.rb 2017-03-23 05:39:55 -04:00
ricky 89fba883ef Update customers_controller.rb 2017-03-23 05:38:06 -04:00
ricky 15f317fba1 Update customers_controller.rb 2017-03-23 05:36:51 -04:00
ricky 894ee9abfd added check_permission 2017-03-23 05:33:58 -04:00
ricky ca17807117 Update payments_controller.rb 2017-03-23 05:29:54 -04:00
ricky a70ba2f164 Update payments_controller.rb 2017-03-23 05:27:38 -04:00
ricky 78ac97298c Update payments_controller.rb 2017-03-23 05:25:57 -04:00
ricky 72cd349c1b Update payments_controller.rb 2017-03-23 05:23:44 -04:00
ricky 6fc1d27dca Update auth_helper.rb 2017-03-23 05:21:56 -04:00
ricky 525c6b99d6 Update auth_helper.rb 2017-03-23 05:19:13 -04:00
ricky 3eaff0ab30 Update auth_helper.rb 2017-03-23 05:14:47 -04:00
ricky 85b40bc9cf Update payments_controller.rb 2017-03-23 05:11:15 -04:00
ricky 37a2b95447 Update payments_controller.rb 2017-03-23 05:10:05 -04:00
ricky 33feb91713 added permission_checker 2017-03-23 05:08:33 -04:00
ricky f7357f30ce Update payments_controller.rb 2017-03-23 05:03:58 -04:00
ricky c0ae01018b Update payments_controller.rb 2017-03-23 05:01:01 -04:00
ricky 4353e910c8 Update payments_controller.rb 2017-03-23 04:57:22 -04:00
ricky bef9774c4e Update payments_controller.rb 2017-03-23 04:52:19 -04:00
ricky 863437b1b7 Added before filter to check permissions 2017-03-23 04:50:17 -04:00
ricky 7cfa15910a Update init.rb 2017-03-23 04:41:31 -04:00
ricky 2154a3d001 Update init.rb 2017-03-22 23:09:05 -04:00
ricky fdab090a3d Update init.rb 2017-03-22 23:06:12 -04:00
ricky 3f32b7fef1 Update init.rb 2017-03-22 22:53:21 -04:00
ricky 14422bc549 Update init.rb 2017-03-22 22:52:24 -04:00
ricky 6bb66597e8 Added some permissions
view_customers, add_customers, view_payments, add_payments
2017-03-22 22:44:09 -04:00
ricky 32b750b545 Version 0.4.2 2017-03-22 22:38:42 -04:00
ricky 5fd3141746 Merge pull request #7 from rickbarrette/dev
Removed un-needed js files
2017-03-22 22:26:04 -04:00
ricky 2c38361234 Removed un-needed js files 2017-03-22 22:20:12 -04:00
ricky 81b7b1492d Merge pull request #6 from rickbarrette/filter_vehicles_by_customer
Filter vehicles by customer
2017-03-22 22:07:22 -04:00
ricky 57ef1ac5a1 Fixed Typo 2017-03-22 22:05:33 -04:00
ricky 6597c5a13c Update application.js 2017-03-22 22:03:25 -04:00
ricky 8af97072fb Fixed filter_vehicles_by_customer method 2017-03-22 21:55:07 -04:00
ricky 48b6df0cef Update application.js 2017-03-22 21:34:04 -04:00
ricky 853b7ad804 Rename filter_vehicles_by_customerjs.erb to filter_vehicles_by_customer.js.erb 2017-03-22 21:27:15 -04:00
ricky 6a74baff5e Update application.js 2017-03-22 18:56:44 -04:00
ricky 8b21b0ff75 Update application.js 2017-03-22 18:54:47 -04:00
ricky d22a6303cd Update application.js 2017-03-22 18:53:47 -04:00
ricky 807d6643f4 Update application.js 2017-03-22 18:52:38 -04:00
ricky c725c2774c Update application.js 2017-03-22 18:50:21 -04:00
ricky ae0abae333 Update application.js 2017-03-22 18:48:52 -04:00
ricky fed2282212 Added debug 2017-03-22 18:37:06 -04:00
ricky 545960e676 Call autocomplete instead 2017-03-22 18:28:53 -04:00
ricky 66781f0625 Update application.js 2017-03-22 13:12:29 -04:00
ricky 504b9b93e4 Removed { 2017-03-22 13:11:19 -04:00
ricky b71bba473c Provide empty list 2017-03-22 13:09:15 -04:00
ricky aef3c453c4 Do not list all vehicles without customer 2017-03-22 13:04:50 -04:00
ricky 6de3ed94dc Update and rename app/views/filter_vehicles_by_customerjs.erb to app/views/customers/filter_vehicles_by_customerjs.erb
Also changed ID to select#issue_vehicles_id
2017-03-22 12:59:36 -04:00
ricky daada08ea7 Changed select to input 2017-03-22 12:48:43 -04:00
ricky fa37c98500 Removed ID 2017-03-22 12:47:08 -04:00
ricky 0ee59704b3 Fixed Javascript includes to += 2017-03-22 12:43:25 -04:00
ricky a22cbb9520 Added Javascript include for application.js 2017-03-22 11:09:19 -04:00
ricky c0d3f64d82 Create application.js 2017-03-22 11:08:14 -04:00
ricky 66d2bf4aa4 Create filter_vehicles_by_customerjs.erb 2017-03-22 11:04:48 -04:00
ricky 2b90c953ba Added filter_vehicles_by_customer method 2017-03-22 10:29:04 -04:00
ricky 0d5e5d679e Added route for filter_vehicles_by_customer 2017-03-22 10:24:16 -04:00
ricky 4da891cc07 Merge branch 'master' of git://github.com/sempervictus/redmine_qbo into sempervictus-master 2017-02-22 11:10:46 -05:00
ricky d3475a9b53 Delete vehicles.js 2017-02-14 14:42:13 -05:00
ricky eb583f78ec Delete update_vehicles.js.coffee 2017-02-14 14:41:55 -05:00
ricky 47bebf0a1a Delete application.js 2017-02-14 14:41:34 -05:00
ricky f9bd149f21 Commented out un-needed JS 2017-02-14 14:39:58 -05:00
ricky 5371b0f193 Update application.js 2017-01-29 22:40:48 -05:00
ricky 95497e5514 Update issues_form_hook_listener.rb 2017-01-29 22:40:02 -05:00
ricky 1a74abe76c Update issues_form_hook_listener.rb 2017-01-29 22:38:30 -05:00
ricky 7f11d3cdc4 Update issues_form_hook_listener.rb 2017-01-29 22:36:32 -05:00
ricky da01d79325 Update customers_controller.rb 2017-01-29 22:29:15 -05:00
ricky 82807cfede Update customers_controller.rb 2017-01-29 22:26:53 -05:00
ricky a268d10819 Update customers_controller.rb 2017-01-29 22:25:27 -05:00
ricky ba4bdd9ecb Update routes.rb 2017-01-29 22:19:12 -05:00
ricky 0a72e05e03 Update issues_form_hook_listener.rb 2017-01-29 22:05:29 -05:00
ricky 8d143ff06d Update customers_controller.rb 2017-01-29 22:00:19 -05:00
ricky 3ddb585a58 Update customers_controller.rb 2017-01-29 21:58:49 -05:00
ricky 1606ceb743 Update issues_form_hook_listener.rb 2017-01-29 21:49:57 -05:00
ricky 97578f8380 Update issues_form_hook_listener.rb 2017-01-29 21:47:09 -05:00
ricky 32beae70ef Update issues_form_hook_listener.rb 2017-01-29 21:45:13 -05:00
ricky 13fbc9e14f Update issues_form_hook_listener.rb 2017-01-29 21:44:00 -05:00
ricky c57a45c85e Update issues_form_hook_listener.rb 2017-01-29 21:43:25 -05:00
ricky 3711a9ca43 Update issues_form_hook_listener.rb 2017-01-29 21:38:18 -05:00
ricky d0c1693f38 Create autocomplete-rails.js 2017-01-29 21:37:27 -05:00
ricky 36534ee129 Update issues_form_hook_listener.rb 2017-01-29 21:34:28 -05:00
ricky 188c460054 Update issues_form_hook_listener.rb 2017-01-29 21:15:29 -05:00
ricky d9e3cb096b Update application.js 2017-01-29 21:10:41 -05:00
ricky b57b19493f Add files via upload 2017-01-29 21:08:29 -05:00
ricky 8c569db541 Update issues_form_hook_listener.rb 2017-01-29 20:56:30 -05:00
ricky 997257f42d Update issues_form_hook_listener.rb 2017-01-29 20:54:52 -05:00
ricky f9f1af17bc Update issues_form_hook_listener.rb 2017-01-29 20:53:09 -05:00
ricky f1f44d0048 Update issues_form_hook_listener.rb 2017-01-29 20:46:39 -05:00
ricky 7e8511090d Update issues_form_hook_listener.rb 2017-01-29 20:42:18 -05:00
ricky 4ca6a3138b Update issues_form_hook_listener.rb 2017-01-29 20:41:38 -05:00
ricky 21e1132e0e Update issues_form_hook_listener.rb 2017-01-29 20:36:19 -05:00
ricky dc15424014 Update issues_form_hook_listener.rb 2017-01-29 20:30:34 -05:00
ricky f90cdcd86b Update customers_controller.rb 2017-01-29 20:28:17 -05:00
ricky 5e53c18098 Update issues_form_hook_listener.rb 2017-01-29 20:24:06 -05:00
ricky 52d13ea7bc Update customers_controller.rb 2017-01-29 20:18:21 -05:00
ricky 5e24c5084e Update customers_controller.rb 2017-01-29 20:12:38 -05:00
ricky abdb61cc41 Update Gemfile 2017-01-29 20:07:08 -05:00
ricky 03556cc670 Update Gemfile 2017-01-29 20:03:53 -05:00
ricky 7f6cd99aba Update Gemfile 2017-01-29 19:58:11 -05:00
ricky ba513fb950 Update issues_form_hook_listener.rb 2017-01-29 19:47:24 -05:00
ricky 837ddd722c Update issues_form_hook_listener.rb 2017-01-29 19:46:21 -05:00
ricky f2b0cd3748 Update issues_form_hook_listener.rb 2017-01-29 19:45:31 -05:00
ricky f2a8878af4 Update issues_form_hook_listener.rb 2017-01-29 19:40:51 -05:00
ricky 13fccec54b Update routes.rb 2017-01-29 19:36:58 -05:00
ricky eca2b986a9 Update customers_controller.rb 2017-01-29 19:35:45 -05:00
ricky a06599b7f9 Update issues_form_hook_listener.rb 2017-01-29 19:34:31 -05:00
ricky 7fda4dc577 Create application.js 2017-01-29 19:32:59 -05:00
ricky 9e47152e12 Update Gemfile 2017-01-29 19:31:31 -05:00
ricky 83d21da41a Update issues_form_hook_listener.rb 2017-01-29 19:27:23 -05:00
ricky a692f03bfa Update init.rb 2017-01-29 19:17:37 -05:00
ricky 994cdf908f Update init.rb 2017-01-29 19:16:55 -05:00
ricky b022d17fc0 Update init.rb 2017-01-29 19:16:05 -05:00
ricky 644899c0b5 Update email_worker.rb 2017-01-29 19:15:14 -05:00
ricky be3a3b920d Update email_worker.rb 2017-01-27 12:04:58 -05:00
ricky d546eb026f Update email_worker.rb 2017-01-27 12:01:53 -05:00
ricky fdc59feb13 Create email_worker.rb 2017-01-27 11:47:30 -05:00
ricky 186b726a7b Added nil check 2017-01-27 09:38:00 -05:00
RageLtMan fa362bad55 Merge pull request #3 from sempervictus/bug-dont_call_string_method_on_nil_token
Do not permit OAUTH_CONSUMER_SECRET to be nil
2017-01-19 04:09:34 -05:00
RageLtMan fcf55bb504 Do not permit OAUTH_CONSUMER_SECRET to be nil
When QBO plugin is not configured, OAUTH_CONSUMER_SECRET can be
nil, and any codepath hitting the model raises a stack trace.

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

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

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

+167
View File
@@ -0,0 +1,167 @@
#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 :add_customer, :only => :new
before_filter :view_customer, :except => :new
skip_before_filter :verify_authenticity_token, :check_if_login_required, :only => [:view]
default_search_scope :names
autocomplete :customer, :name, :full => false, :extra_data => [:id]
def filter_vehicles_by_customer
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
end
# 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
User.current = User.find_by lastname: 'Anonymous'
@token = CustomerToken.where("token = ? and expires_at > ?", params[:token], Time.now)
@token = @token.first
if @token
session[:token] = @token.token
@issue = Issue.find @token.issue_id
@journals = @issue.journals.
preload(:details).
preload(:user => :email_address).
reorder(:created_on, :id).to_a
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project)
Journal.preload_journals_details_custom_fields(@journals)
@journals.select! {|journal| journal.notes? || journal.visible_details.any?}
@journals.reverse! if User.current.wants_comments_in_reverse_order?
@changesets = @issue.changesets.visible.preload(:repository, :user).to_a
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@priorities = IssuePriority.active
@time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project)
@relation = IssueRelation.new
else
render_403
end
end
private
def add_customer
global_check_permission(:add_customers)
end
def view_customer
global_check_permission(:view_customers)
end
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
+7 -2
View File
@@ -10,13 +10,18 @@
class EstimateController < ApplicationController
unloadable
include AuthHelper
before_filter :require_user
#
# Downloads and forwards the estimate pdf
#
def show
base = QboEstimate.get_base.service
@pdf = base.pdf(base.fetch_by_id(params[:id]))
send_data @pdf, filename: "estimate.pdf", :disposition => 'inline', :type => "application/pdf"
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
+11 -5
View File
@@ -9,13 +9,19 @@
#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, :unless => proc {|c| session[:token].nil? }
skip_before_filter :verify_authenticity_token, :check_if_login_required, :unless => proc {|c| session[:token].nil? }
#
# Downloads and forwards the invoice pdf
#
def show
base = QboInvoice.get_base.service
@pdf = base.pdf(base.fetch_by_id(params[:id]))
send_data @pdf, filename: "invoice.pdf", :disposition => 'inline', :type => "application/pdf"
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
+57
View File
@@ -0,0 +1,57 @@
#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 :check_permissions
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 check_permissions
if !allowed_to?(:add_payments)
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
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
+90 -19
View File
@@ -10,13 +10,20 @@
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 = QboCustomer.count
@customer_count = Customer.count
@qbo_item_count = QboItem.count
@qbo_employee_count = QboEmployee.count
@qbo_invoice_count = QboInvoice.count
@@ -27,9 +34,9 @@ class QboController < ApplicationController
# 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
@@ -37,42 +44,106 @@ 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]
if i.customer
i.bill_time
redirect_to i, :flash => { :notice => "Successfully Billed #{i.customer.name}" }
else
redirect_to i, :flash => { :error => "Cannot bill without a customer assigned" }
end
end
# Quickbooks Webhook Callback
def qbo_webhook
# 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?
QboCustomer.update_all
QboItem.update_all
QboEmployee.update_all
QboEstimate.update_all
QboInvoice.update_all
QboPurchase.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" }
end
end
end
+126
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
+53
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.
module AuthHelper
def require_user
return unless session[:token].nil?
if !User.current.logged?
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
def allowed_to?(action)
return false if User.current.nil?
project = Project.find(params[:project_id])
return false if project.nil?
return true if User.current.allowed_to?(action, project)
false
end
def check_permission(permission)
if !allowed_to?(permission)
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
def global_check_permission(permission)
if !globaly_allowed_to?(permission)
render :file => "public/401.html.erb", :status => :unauthorized, :layout =>true
end
end
def globaly_allowed_to?( action)
return false if User.current.nil?
projects = Project.all
projects.each { |p|
if User.current.allowed_to?(action, p)
return true
end
}
false
end
end
-2
View File
@@ -1,2 +0,0 @@
module EstimateHelper
end
-2
View File
@@ -1,2 +0,0 @@
module InvoiceHelper
end
+206
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
@@ -1,42 +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 QboCustomer < ActiveRecord::Base
unloadable
has_many :issues
has_many :qbo_purchases
attr_accessible :name
validates_presence_of :id, :name
def self.get_base
Qbo.get_base(:customer)
end
def self.get_customer (id)
get_base.service.find_by_id(id)
end
def self.update_all
customers = get_base.service.all
transaction do
# Update the customer table
customers.each { |customer|
qbo_customer = QboCustomer.find_or_create_by(id: customer.id)
qbo_customer.name = customer.display_name
qbo_customer.id = customer.id
qbo_customer.save!
}
end
#remove deleted customers
where.not(customers.map(&:id)).destroy_all
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'] || 'CONFIGURE_QBO__' + SecureRandom.uuid
def generate_token
self.token = SecureRandom.base64(15).tr('+/=lIO0', OAUTH_CONSUMER_SECRET)
end
end
+37
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
+31 -16
View File
@@ -11,24 +11,28 @@
class Qbo < ActiveRecord::Base
unloadable
validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at
QB_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
QB_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
# Quickbooks Config Info
$qb_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
:site => "https://oauth.intuit.com",
:request_token_path => "/oauth/v1/get_request_token",
:authorize_url => "https://appcenter.intuit.com/Connect/Begin",
:access_token_path => "/oauth/v1/get_access_token"
})
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
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
@@ -40,4 +44,15 @@ class Qbo < ActiveRecord::Base
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
+9 -4
View File
@@ -18,7 +18,7 @@ class QboEmployee < ActiveRecord::Base
Qbo.get_base(:employee)
end
def self.update_all
def self.sync
employees = get_base.service.all
transaction do
@@ -30,8 +30,13 @@ class QboEmployee < ActiveRecord::Base
qbo_employee.save!
}
end
#remove deleted employees
where.not(employees.map(&:id)).destroy_all
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
+9 -1
View File
@@ -18,7 +18,7 @@ class QboEstimate < ActiveRecord::Base
Qbo.get_base(:estimate)
end
def self.update_all
def self.sync
estimates = get_base.service.all
# Update the item table
@@ -35,6 +35,14 @@ class QboEstimate < ActiveRecord::Base
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)
+132 -24
View File
@@ -10,37 +10,145 @@
class QboInvoice < ActiveRecord::Base
unloadable
has_many :issues
attr_accessible :doc_number
validates_presence_of :id, :doc_number
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)
Qbo.get_base(:invoice).service
end
def self.update_all
#Pull the invoices from the quickbooks server
invoices = get_base.service.all
# 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
transaction do
invoices.each { | invoice |
qbo_invoice = find_or_create_by(id: invoice.id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.id = invoice.id
qbo_invoice.save!
}
end
#remove deleted invoices
where.not(invoices.map(&:id)).destroy_all
invoices.each { | invoice |
process_invoice invoice
}
end
def self.update(id)
# Update the item table
invoice = get_base.service.fetch_by_id(id)
qbo_invoice = find_or_create_by(id: id)
qbo_invoice.doc_number = invoice.doc_number
qbo_invoice.save!
#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
private
# Attach the invoice to the issue
def self.attach_to_issue(issue, invoice)
return if issue.nil?
# skip this issue if the issue customer is not the same as the invoice customer
return if issue.customer_id != invoice.customer_ref.value.to_i
# 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!
unless issue.qbo_invoices.include?(qbo_invoice)
issue.qbo_invoices << qbo_invoice
issue.save!
end
compare_custom_fields(issue, invoice)
end
# processes the invoice into the system
def self.process_invoice(invoice)
# Check the private notes
if not invoice.private_note.nil?
invoice.private_note.scan(/#(\w+)/).flatten.each { |issue|
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
}
end
# Scan the line items for hashtags and attach to the applicable issues
invoice.line_items.each { |line|
if line.description
line.description.scan(/#(\w+)/).flatten.each { |issue|
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
}
end
}
end
def self.compare_custom_fields(issue, invoice)
is_changed = false
# update the invoive custom fields with infomation from the work ticket if available
invoice.custom_fields.each { |cf|
# TODO Add some hooks here
# VIN from the attached vehicle
begin
if cf.name.eql? "VIN"
vin = Vehicle.find(issue.vehicles_id).vin
break if vin.nil?
if not cf.string_value.to_s.eql? vin
cf.string_value = vin.to_s
is_changed = true
end
end
rescue
#do nothing
end
# Custom Values
begin
value = issue.custom_values.find_by(custom_field_id: CustomField.find_by_name(cf.name).id)
# Check to see if the value is blank...
if not value.value.to_s.blank?
# Check to see if the value is diffrent
if not cf.string_value.to_s.eql? value.value.to_s
# 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
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
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
}
# TODO Add some hooks here
# Push updates
get_base.update(invoice) if is_changed
end
end
+24 -14
View File
@@ -13,25 +13,35 @@ class QboItem < ActiveRecord::Base
has_many :issues
attr_accessible :name
validates_presence_of :id, :name
self.primary_key = :id
def self.get_base
Qbo.get_base(:item)
end
def self.update_all
items = get_base.service.find_by(:type, "Service")
transaction do
# Update the item table
items.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!
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
#remove deleted items
where.not(items.map(&:id)).destroy_all
# QboItem.where.not(items.map(&:id)).destroy_all
end
end
+2 -2
View File
@@ -19,11 +19,11 @@ class QboPurchase < ActiveRecord::Base
Qbo.get_base(:purchase)
end
def self.get_purchase(id)
def get_purchase(id)
get_base.service.find_by_id(id)
end
def self.update_all
def self.sync
QboPurchase.get_base.service.all.each { |purchase|
purchase.line_items.all? { |line_item|
+130
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
+54
View File
@@ -0,0 +1,54 @@
<table>
<tbody>
<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>
+60
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>
+3
View File
@@ -0,0 +1,3 @@
<h1>Edit Customer</h1>
<br/>
<%= render :partial => 'customers/form' %>
@@ -0,0 +1 @@
$('select#issue_vehicles_id').html('<%= j options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>');
+28
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>
+3
View File
@@ -0,0 +1,3 @@
<h1>New Customer</h1>
<br/>
<%= render :partial => 'customers/form' %>
+27
View File
@@ -0,0 +1,27 @@
<div id="content">
<h2>Customer #<%= @customer.id %></h2>
<br/>
<div class="subject">
<div><h3><%= @customer.name %></h3></div>
</div>
<div class="attributes">
<div class="splitcontent">
<div class="splitcontentleft">
<h4>Details:</h4>
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
</div>
<div class="splitcontentleft">
<h4>Vehicles:</h4>
<%= render :partial => 'vehicles/list' %>
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
</div>
</div>
<br/>
<h2>Issues:</h2>
<%= render :partial => 'issues/list_simple', locals: {issues: @issues} %>
</div>
</div>
+109
View File
@@ -0,0 +1,109 @@
<h2><%= issue_heading(@issue) %></h2>
<div class="<%= @issue.css_classes %> details">
<%= avatar(@issue.author, :size => "50") %>
<div class="subject">
<%= render_issue_subject_with_tree(@issue) %>
This customer link expires in <%= distance_of_time_in_words(Time.now, @token.expires_at) %>
</div>
<p class="author">
<%= authoring @issue.created_on, @issue.author %>.
<% if @issue.created_on != @issue.updated_on %>
<%= l(:label_updated_time, time_tag(@issue.updated_on)).html_safe %>.
<% end %>
</p>
<div class="attributes">
<%= issue_fields_rows do |rows|
rows.left l(:field_status), @issue.status.name, :class => 'status'
rows.left l(:field_priority), @issue.priority.name, :class => 'priority'
unless @issue.disabled_core_fields.include?('assigned_to_id')
rows.left l(:field_assigned_to), avatar(@issue.assigned_to, :size => "14").to_s.html_safe + (@issue.assigned_to ? link_to_user(@issue.assigned_to) : "-"), :class => 'assigned-to'
end
unless @issue.disabled_core_fields.include?('category_id') || (@issue.category.nil? && @issue.project.issue_categories.none?)
rows.left l(:field_category), (@issue.category ? @issue.category.name : "-"), :class => 'category'
end
unless @issue.disabled_core_fields.include?('fixed_version_id') || (@issue.fixed_version.nil? && @issue.assignable_versions.none?)
rows.left l(:field_fixed_version), (@issue.fixed_version ? link_to_version(@issue.fixed_version) : "-"), :class => 'fixed-version'
end
unless @issue.disabled_core_fields.include?('start_date')
rows.right l(:field_start_date), format_date(@issue.start_date), :class => 'start-date'
end
unless @issue.disabled_core_fields.include?('due_date')
rows.right l(:field_due_date), format_date(@issue.due_date), :class => 'due-date'
end
unless @issue.disabled_core_fields.include?('done_ratio')
rows.right l(:field_done_ratio), progress_bar(@issue.done_ratio, :legend => "#{@issue.done_ratio}%"), :class => 'progress'
end
unless @issue.disabled_core_fields.include?('estimated_hours')
if @issue.estimated_hours.present? || @issue.total_estimated_hours.to_f > 0
rows.right l(:field_estimated_hours), issue_estimated_hours_details(@issue), :class => 'estimated-hours'
end
end
#if User.current.allowed_to_view_all_time_entries?(@project)
if @issue.total_spent_hours > 0
rows.right l(:label_spent_time), issue_spent_hours_details(@issue), :class => 'spent-time'
end
#end
end %>
<%= render_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}" %>
+42
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>
+3
View File
@@ -0,0 +1,3 @@
<h1>New Payment</h1>
<br/>
<%= render :partial => 'payments/form' %>
+1
View File
@@ -0,0 +1 @@
<%= flash.now[:error] = "Not Authorized" %>
+61 -12
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>
+24 -37
View File
@@ -12,44 +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, QboCustomer.all.pluck(:name, :id).sort, :selected => @selected_customer, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Item Count: "+@qbo_item_count.to_s %>
<br/>
<%= f.select :qbo_item_id, QboItem.all.pluck(:name, :id).sort.reverse, :selected => @selected_item, include_blank: true %>
</div>
<br/>
<div>
<%= f.label "Employee Count: "+@qbo_employee_count.to_s %>
<br/>
<%= f.select :qbo_employee_id, QboEmployee.all.pluck(:name, :id).sort, :selected => @selected_employee, include_blank: true %>
</div>
<p>
<%= f.label "Invoice Count: "+@qbo_invoice_count.to_s %>
<br/>
<%=f.select :qbo_invoice_id, QboInvoice.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => @selected_invoice, include_blank: true%>
</p>
<p>
<%= f.label "Estimate Count: "+@qbo_estimate_count.to_s %>
<br/>
<%=f.select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => @selected_estimate, include_blank: true%>
</p>
<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>
<% end %>
<br/>
<br/>
<%= link_to "Sync", qbo_sync_path %>
<div>
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
</div>
</body>
+54
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>
+62
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>
+26
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 %>
+1
View File
@@ -0,0 +1 @@
<option value="<%= vehicle.id %>"><%= vehicle.to_s.titleize %></option>
+3
View File
@@ -0,0 +1,3 @@
<h1>Edit Customer Vehicle</h1>
<br/>
<%= render :partial => 'vehicles/form' %>
+9
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' %>
+3
View File
@@ -0,0 +1,3 @@
<h1>New Customer Vehicle</h1>
<br/>
<%= render :partial => 'vehicles/form' %>
+8
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>
+18
View File
@@ -0,0 +1,18 @@
#The MIT License (MIT)
#
#Copyright (c) 2017 rick barrette
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
#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 sidekiq worker class will handle emailing weekly time reports
class EmailWorker
include Sidekiq::Worker
def perform()
# email something
end
end
+9
View File
@@ -0,0 +1,9 @@
$(function() {
$("input#issue_customer_id").on("change", function() {
$.ajax({
url: "/filter_vehicles_by_customer",
type: "GET",
data: { selected_customer: $("input#issue_customer_id").val() }
});
});
});
+1
View File
@@ -0,0 +1 @@
!function(t){t.fn.railsAutocomplete=function(e){var a=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};if(void 0!==t.fn.on){if(!e)return;return t(document).on("focus",e,a)}return this.live("focus",a)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.options={showNoMatches:!0,noMatchesLabel:"no existing match"},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("data-min-length")||t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,r){var n=this.element[0],o={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){o[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),o,function(){var a={};t.extend(a,t.railsAutocomplete.options),t.each(a,function(i,r){if(a.hasOwnProperty(i)){var n=t(e).attr("data-"+i);a[i]=n?n:r}}),0==arguments[0].length&&t.inArray(a.showNoMatches,[!0,"true"])>=0&&(arguments[0]=[],arguments[0][0]={id:"",label:a.noMatchesLabel}),t(arguments[0]).each(function(a,i){var r={};r[i.id]=i,t(e).data(r)}),r.apply(null,arguments),t(n).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:"").trigger("change"),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),r=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var n in i){var o=t(i[n]);o.is(":checkbox")?null!=r[n]&&o.prop("checked",r[n]):o.val(a.item?r[n]:"").trigger("change")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,r){if(r.item.value=r.item.value.toString(),-1!=r.item.value.toLowerCase().indexOf("no match")||-1!=r.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",r),!1;var n=a(this.value);if(n.pop(),n.push(r.item.value),null!=e.delimiter)n.push(""),this.value=n.join(e.delimiter);else if(this.value=n.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(r.item.id).trigger("change"),t(this).attr("data-update-elements")){var o=r.item,l=-1!=r.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?o[s]===!0||1===o[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):l&&o[s]&&-1==o[s].indexOf("Create New")||!l?t(u[s]).val(o[s]).trigger("change"):t(u[s]).val("").trigger("change")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val("").trigger("change"),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",r),!1}}),t(e).trigger("railsAutocomplete.init")}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete("input[data-autocomplete]")})}(jQuery);
+3
View File
@@ -0,0 +1,3 @@
Edmunds::Api.configure do |config|
config.api_key = '2dheutzvhxs28dzukx5tgu47'
end
+6 -1
View File
@@ -11,8 +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"
+33 -4
View File
@@ -8,12 +8,41 @@
#
#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
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 'filter_vehicles_by_customer' => 'customers#filter_vehicles_by_customer'
# Nest Vehicles under customers
resources :customers do
resources :vehicles
get :autocomplete_customer_name, :on => :collection
get :autocomplete_customer_vehicles, :on => :collection
end
#allow for just vehicles too
resources :vehicles
+24
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
@@ -8,11 +8,8 @@
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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
class UpdateIssuesWithVehicles < ActiveRecord::Migration
def change
add_reference :issues, :vehicles, index: true
end
end
+15
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
@@ -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
+15
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
+27
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
@@ -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
+19
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
+27 -5
View File
@@ -15,31 +15,53 @@ Redmine::Plugin.register :redmine_qbo do
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'
require_dependency 'attachments_controller_patch'
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.4'
version '0.4.2'
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 '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
# set per_page globally
WillPaginate.per_page = 10
permission :view_customers, :customers => :index, :public => false
permission :add_customers, :customers => :new, :public => false
permission :view_payments, :payments => :index, :public => false
permission :add_payments, :payments => :new, :public => false
permission :view_vehicles, :payments => :new, :public => false
# Register QBO top menu item
menu :top_menu, :qbo, { :controller => 'qbo', :action => 'index' }, :caption => 'Quickbooks'
#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.allowed_to?(:view_vehicles, @project) }
menu :application_menu, :new_customer, { :controller => :customers, :action => :new }, :caption => 'New Customer', :if => Proc.new { User.current.allowed_to?(:add_customers, @project) }
menu :application_menu, :new_payment, { :controller => :payments, :action => :new }, :caption => 'New Payment', :if => Proc.new { User.current.allowed_to?(:add_payments, @project)}
menu :project_menu, :customers, { :controller => 'customers', :action => 'new' }, :caption => 'New Customer', :after => :new_issue, :param => :project_id
menu :project_menu, :payments, { :controller => 'payments', :action => 'new' }, :caption => 'New Payment', :after => :customers, :param => :project_id
end
+38
View File
@@ -0,0 +1,38 @@
#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 'attachments_controller'
module AttachmentsControllerPatch
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
skip_before_action :read_authorize
end
end
module ClassMethods
end
module InstanceMethods
end
end
# Add module to AttachmentsController
AttachmentsController.send(:include, AttachmentsControllerPatch)
+19
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
+64 -4
View File
@@ -13,6 +13,7 @@ require_dependency 'issue'
# Patches Redmine's Issues dynamically.
# Adds a relationships
module IssuePatch
def self.included(base) # :nodoc:
base.extend(ClassMethods)
@@ -21,11 +22,15 @@ module IssuePatch
# Same as typing in the class
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
belongs_to :qbo_customer, primary_key: :id
belongs_to :qbo_item, primary_key: :id
belongs_to :customer, primary_key: :id
belongs_to :customer_token, primary_key: :id
belongs_to :qbo_estimate, primary_key: :id
belongs_to :qbo_invoice, 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
@@ -33,10 +38,65 @@ module IssuePatch
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 @ #{done_ratio}%)" 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 + 1.month, :issue_id => id)
end
end
# Add module to Issue
Issue.send(:include, IssuePatch)
Issue.send(:include, IssuePatch)
+25 -21
View File
@@ -9,36 +9,40 @@
#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 'application', :plugin => 'redmine_qbo'
js += javascript_include_tag 'autocomplete-rails', :plugin => 'redmine_qbo'
return js
end
# Edit Issue Form
# Show a dropdown for quickbooks contacts
def view_issues_form_details_bottom(context={})
# Update the customer and item database
#QboCustomer.update_all
#QboItem.update_all
#QboInvoice.update_all
#QboEstimate.update_all
f = context[:form]
# Check to see if there is a quickbooks user attached to the issue
@selected_customer = context[:issue].qbo_customer ? context[:issue].qbo_customer.id : nil
@selected_item = context[:issue].qbo_item ? context[:issue].qbo_item.id : nil
@selected_invoice = context[:issue].qbo_invoice ? context[:issue].qbo_invoice.id : nil
@selected_estimate = context[:issue].qbo_estimate ? context[:issue].qbo_estimate.id : nil
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
# Generate the drop down list of quickbooks customers
@select_customer = context[:form].select :qbo_customer_id, QboCustomer.all.pluck(:name, :id).sort, :selected => selected_customer, include_blank: true
# Generate the drop down list of quickbooks items
@select_item = context[:form].select :qbo_item_id, QboItem.all.pluck(:name, :id).sort, :selected => selected_item, include_blank: true
# Generate the drop down list of quickbooks invoices
@select_invoice = context[:form].select :qbo_invoice_id, QboInvoice.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => selected_invoice, include_blank: true
# Load customer information
customer = Customer.find_by_id(selected_customer) if selected_customer
search_customer = f.autocomplete_field :customer, autocomplete_customer_name_customers_path, :selected => selected_customer, :update_elements => {:id => '#issue_customer_id', :value => '#issue_customer'}
customer_id = f.hidden_field :customer_id, :id => "issue_customer_id"
# Generate the drop down list of quickbooks extimates
@select_estimate = context[:form].select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => selected_estimate, include_blank: true
select_estimate = f.select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => selected_estimate, include_blank: true
#@estimates_link = link_to qbo_update_estimates_path
if context[:issue].customer
vehicles = customer.vehicles.pluck(:name, :id).sort!
else
vehicles = [nil].compact
end
return "<p>#{@select_customer}</p> <p>#{@select_item}</p> <p>#{@select_invoice}</p> <p>#{@select_estimate} #{@estimates_link}</p>"
vehicle = f.select :vehicles_id, vehicles, :selected => selected_vehicle, include_blank: true
return "<p><label for=\"issue_customer\">Customer</label>#{search_customer} #{customer_id}</p> <p>#{select_estimate}</p> <p>#{vehicle}</p>"
end
end
+3 -53
View File
@@ -15,7 +15,7 @@ class IssuesSaveHookListener < Redmine::Hook::ViewListener
issue = context[:issue]
# Check to see if we have registered with QBO
if Qbo.first && issue.qbo_customer && issue.qbo_item
if Qbo.first && issue.customer && issue. qbo_item_id
# 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
@@ -26,7 +26,7 @@ class IssuesSaveHookListener < Redmine::Hook::ViewListener
# Create the estimate
estimate = estimate_base.qr_model(:estimate)
estimate.customer_id = issue.qbo_customer_id
estimate.customer_id = issue.customer_id
estimate.txn_date = Date.today
# Create the line item for labor
@@ -44,10 +44,6 @@ class IssuesSaveHookListener < Redmine::Hook::ViewListener
# Add the line items to the estimate
estimate.line_items << line_item
# Save the etimate to the issue
#issue.qbo_estimate_id = estimate_base.service.create(estimate).id
#issue.save!
end
end
end
@@ -55,52 +51,6 @@ class IssuesSaveHookListener < Redmine::Hook::ViewListener
# Called After Issue Saved
def controller_issues_edit_after_save(context={})
issue = context[:issue]
employee_id = issue.assigned_to.qbo_employee_id
# Check to see if we have registered with QBO and if the issue is closed.
# If so then we need to create a new billable time activity for the customer
bill_time(issue, employee_id) if Qbo.first && issue.qbo_customer && issue.qbo_item && employee_id && issue.status.is_closed?
end
# Create billable time entries
def bill_time(issue, employee_id)
# Get unbilled time entries
spent_time = issue.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
# 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
end
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
issue.bill_time if Qbo.first && issue.customer && issue.status.is_closed?
end
end
+64 -33
View File
@@ -19,50 +19,81 @@ class IssuesShowHookListener < Redmine::Hook::ViewListener
# Display the quickbooks contact in the issue
def view_issues_show_details_bottom(context={})
issue = context[:issue]
# Check to see if there is a quickbooks user attached to the issue
@customer = issue.qbo_customer ? issue.qbo_customer.name : nil
if issue.customer
customer = link_to issue.customer.name, "#{Redmine::Utils::relative_url_root}/customers/#{issue.customer.id}"
end
# Check to see if there is a quickbooks item attached to the issue
@item = issue.qbo_item ? issue.qbo_item.name : nil
@estimate = nil
@estimate_link = nil
# 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"
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
@invoice = nil
@invo = nil
# Invoice Number
if issue.qbo_invoice
@invoice = issue.qbo_invoice.doc_number
@invoice_link = link_to @invoice, "#{Redmine::Utils::relative_url_root }/qbo/invoice/#{issue.qbo_invoice.id}", :target => "_blank"
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
return "<div class=\"attributes\">
<div class=\"qbo_customer_id attribute\">
<div class=\"label\"><span>Customer</span>:</div>
<div class=\"value\">#{@customer}</div>
</div>
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>
<div class=\"qbo_item_id attribute\">
<div class=\"label\"><span>Item</span>:</div>
<div class=\"value\">#{@item}</div>
</div>
<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
<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>"
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
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 ? vin.gsub(/(.{9})/, '\1 ') : nil]
#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
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}.qbo_billed", :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)
+71
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)
+1 -1
View File
@@ -14,7 +14,7 @@ class UsersShowHookListener < Redmine::Hook::ViewListener
def view_users_form(context={})
# Update the users
QboEmployee.update_all
#QboEmployee.update_all
# Check to see if there is a quickbooks user attached to the issue
@selected = context[:user].qbo_employee.id if context[:user].qbo_employee
+9
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