mirror of
https://github.com/rickbarrette/redmine_qbo.git
synced 2025-11-08 17:04:23 -05:00
Compare commits
163 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d4d4a555f8 | |||
| c2663cd0a0 | |||
| d48609361f | |||
| 70995f6e55 | |||
| 05a0472939 | |||
| cff9f3fde3 | |||
| e24b704571 | |||
| 4d99f54c79 | |||
| e65725c334 | |||
| 4829daab7c | |||
| 260e9f3e4a | |||
| e3ce2445b8 | |||
| 2b333667ed | |||
| 1077cf214c | |||
| f27fdf5274 | |||
| 1dbcca4ca0 | |||
| 558e2359f7 | |||
| f99ef648b3 | |||
| 5e4e3329c8 | |||
| b0a66aba0a | |||
| f2dd500536 | |||
| 7412ac4f91 | |||
| 2acb3efe5a | |||
| 2cc0d06bc5 | |||
| 4070cb7c49 | |||
| fcd196355a | |||
| ea502d5b7b | |||
| 1f33009f89 | |||
| 3509ae9725 | |||
| 49858c45c9 | |||
| b78cd44cc9 | |||
| 39fcd6d4dd | |||
| 8838d36793 | |||
| 63fa94e6f2 | |||
| 17183f9643 | |||
| 667d0bfa97 | |||
| 88a6be0d27 | |||
| c3eaddff97 | |||
| f03adad463 | |||
| bd03e3ac32 | |||
| 299a28a0d2 | |||
| cee8ddced1 | |||
| 738cd21b1f | |||
| b8186e4b52 | |||
| d98a8b8cc4 | |||
| dba6c4b131 | |||
| 118812f16f | |||
| 0b96a1412c | |||
| 29de191d26 | |||
| f86af9ca71 | |||
| d25de7b30f | |||
| 273bd3d6be | |||
| ac446723f1 | |||
| c21bc1333f | |||
| 4e4255995e | |||
| c68b540597 | |||
| 1358871ccc | |||
| 908511f299 | |||
| 6260de21f9 | |||
| e2f276097c | |||
| 205bb67a6a | |||
| 05edafec4c | |||
| 4a073d3a71 | |||
| f2cbf31e17 | |||
| 22b22780ea | |||
| 71cfa28817 | |||
| 8b2d88f80b | |||
| eaf0a57e51 | |||
| 512f5ad7ba | |||
| 8d2351d3f9 | |||
| c5a20c9e7f | |||
| 4a3b663333 | |||
| e43635b5d8 | |||
| 7044377f16 | |||
| 7ced1bf942 | |||
| 7ca3315ce5 | |||
| 2b8c4b4d4d | |||
| a359e8815b | |||
| 01cf82813c | |||
| 625e400c48 | |||
| 56793cee7c | |||
| 3ba5337812 | |||
| 129e3d4821 | |||
| 4d524a7d61 | |||
| 429fb920fb | |||
| 77c7f0b6fe | |||
| 1a043bea76 | |||
| e4d770c272 | |||
| fce3931858 | |||
| 43cdade6e1 | |||
| 4374f9436c | |||
| 7c63c3c816 | |||
| b3f491a60b | |||
| 4adcbba840 | |||
| baccb42455 | |||
| d0842dd803 | |||
| 02aabe6045 | |||
| 0e47f9eb5f | |||
| f1d2d63f20 | |||
| f322f9f7ab | |||
| 6db8b76902 | |||
| 61adce1299 | |||
| daffb3719e | |||
| 1b8626d28f | |||
| b119344fad | |||
| 4381d403d4 | |||
| 26bfaca1d6 | |||
| 0c68d8094a | |||
| 6230175ba5 | |||
| 5dc4dc5637 | |||
| ac15307fb8 | |||
| ec5ce497d8 | |||
| 01fe52157d | |||
| 75737cf2fd | |||
| 7824edf5aa | |||
| 6b70b447a5 | |||
| 5a6b679099 | |||
| 72835dcf65 | |||
| b9e2349983 | |||
| ef13ec7e11 | |||
| 00b40da8c4 | |||
| 2be25adf18 | |||
| 5ab9a777f6 | |||
| 7fbb1d6ba3 | |||
| 786c80609c | |||
| efb554824d | |||
| c615abc896 | |||
| 8ecc3414da | |||
| 505def8d23 | |||
| da155de514 | |||
| 7d727e1ad8 | |||
| 3dcb5155fc | |||
| 4424593e63 | |||
| 8eae838ef8 | |||
| d5e8b4bbc4 | |||
| fc8efa53e9 | |||
| 15ea3aeaa2 | |||
| 35bf300f2d | |||
| 72bf10680f | |||
| bd8706deee | |||
| e8619529d4 | |||
| fd3c8e15e6 | |||
| 166c1d3002 | |||
| 773d60fb23 | |||
| cc46902095 | |||
| acb2628c7a | |||
| e4914590f8 | |||
| e3a8e464ae | |||
| 8a6bb45b6a | |||
| 3decf83a7b | |||
| 1b7b286d1b | |||
| a8804f6704 | |||
| 5d03e261d1 | |||
| 1ae766b8bd | |||
| 119c36569f | |||
| 3be69d5efd | |||
| b55dd99efd | |||
| eff1f97ab2 | |||
| 06050bd139 | |||
| a48840ddfb | |||
| 9b9aabee11 | |||
| 7782627286 | |||
| 41a113dc59 |
2
Gemfile
2
Gemfile
@@ -5,7 +5,7 @@ gem 'quickbooks-ruby-base'
|
||||
gem 'oauth-plugin'
|
||||
gem 'oauth'
|
||||
gem 'roxml'
|
||||
gem 'edmunds_vin'
|
||||
gem 'nhtsa_vin'
|
||||
gem 'will_paginate'
|
||||
gem 'rails-jquery-autocomplete'
|
||||
gem 'jquery-rails', '~> 3.1.4'
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Rick Barrette
|
||||
Copyright (c) 2018 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
|
||||
|
||||
12
README.md
12
README.md
@@ -1,4 +1,4 @@
|
||||
#Redmine Quickbooks Online
|
||||
# Redmine Quickbooks Online
|
||||
|
||||
A plugin for Redmine to connect to Quickbooks Online
|
||||
|
||||
@@ -8,7 +8,7 @@ The goal of this project is to allow Redmine to connect with Quickbooks Online t
|
||||
|
||||
`Note: I am currently using this in a live production enviroment with no issues`
|
||||
|
||||
####Features
|
||||
#### 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.
|
||||
@@ -27,14 +27,14 @@ The goal of this project is to allow Redmine to connect with Quickbooks Online t
|
||||
+ `Invoice` Custom Fields are matched Issue Custom Fileds and are automaticly updated in Quickbooks. For example, this is usefull for extracting the Mileage In / Out from the Issue and updating the Invoice with the information.
|
||||
- `Customers` are automaticly updated in local database
|
||||
|
||||
##Prerequisites
|
||||
## Prerequisites
|
||||
|
||||
* Sign up to become a developer for Intuit https://developer.intuit.com/
|
||||
* Create your own aplication to obtain your API keys
|
||||
* Set up webhook service to https://redmine.yourdomain.com/qbo/webhook
|
||||
- See https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/webhooks
|
||||
|
||||
##The Install
|
||||
## The Install
|
||||
|
||||
1. To install, clone this repo into your plugin folder
|
||||
|
||||
@@ -73,11 +73,11 @@ Note: After the inital synchronization, this plugin will recieve push notificati
|
||||
* Fix Issue sort by Customer
|
||||
* MORE Stuff...
|
||||
|
||||
##License
|
||||
## License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 rick barrette
|
||||
Copyright (c) 2017 rick barrette
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 106 KiB |
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -33,12 +33,20 @@ class CustomersController < ApplicationController
|
||||
|
||||
default_search_scope :names
|
||||
|
||||
autocomplete :customer, :name, :full => false, :extra_data => [:id]
|
||||
autocomplete :customer, :name, :full => true, :extra_data => [:id]
|
||||
|
||||
def filter_vehicles_by_customer
|
||||
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
|
||||
end
|
||||
|
||||
def filter_invoices_by_customer
|
||||
@filtered_invoices = QboInvoice.all.where(customer_id: params[:selected_customer])
|
||||
end
|
||||
|
||||
def filter_estimates_by_customer
|
||||
@filtered_estimates = QboEstimate.all.where(customer_id: params[:selected_customer])
|
||||
end
|
||||
|
||||
# display a list of all customers
|
||||
def index
|
||||
if params[:search]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -18,7 +18,7 @@ class EstimateController < ApplicationController
|
||||
# Downloads and forwards the estimate pdf
|
||||
#
|
||||
def show
|
||||
base = QboEstimate.get_base.service
|
||||
base = QboEstimate.get_base
|
||||
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"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
96
app/controllers/line_items_controler.rb
Normal file
96
app/controllers/line_items_controler.rb
Normal file
@@ -0,0 +1,96 @@
|
||||
#The License
|
||||
#
|
||||
#Copyright (c) 2018 Rick Barrette - All Rights Reserved
|
||||
#
|
||||
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
|
||||
#
|
||||
#Proprietary and confidential
|
||||
#
|
||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
#
|
||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# This controller class will handle map management
|
||||
class LineItemsController < ApplicationController
|
||||
unloadable
|
||||
|
||||
include AuthHelper
|
||||
|
||||
before_filter :require_user
|
||||
|
||||
# display all line items for an issue
|
||||
def index
|
||||
if params[:issue_id]
|
||||
begin
|
||||
@line_items = Issue.find_by_id(params[:issue_id]).line_items
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# return an HTML form for creating a new line item
|
||||
def new
|
||||
@line_item = LineItem.new
|
||||
end
|
||||
|
||||
# create a new line item
|
||||
def create
|
||||
@line_item = LineItem.new(params[:line_item])
|
||||
if @line_item.save
|
||||
flash[:notice] = "New Line Item Created"
|
||||
redirect_to @line_item.issue
|
||||
else
|
||||
flash[:error] = @line_item.errors.full_messages.to_sentence
|
||||
redirect_to new_line_item_path
|
||||
end
|
||||
end
|
||||
|
||||
# display a specific line item
|
||||
def show
|
||||
begin
|
||||
@line_item = LineItem.find_by_id(params[:id])
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
# return an HTML form for editing a line item
|
||||
def edit
|
||||
begin
|
||||
@line_item = LineItem.find_by_id(params[:id])
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
# update a specific line item
|
||||
def update
|
||||
begin
|
||||
@line_item = LineItem.find_by_id(params[:id])
|
||||
if @line_item.update_attributes(params[:line_item])
|
||||
flash[:notice] = "Line Item updated"
|
||||
redirect_to @line_item
|
||||
else
|
||||
flash[:error] = @line_item.errors.full_messages.to_sentence if @line_item.errors
|
||||
redirect_to edit_line_item_path
|
||||
end
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
# delete a specific line item
|
||||
def destroy
|
||||
begin
|
||||
line_item = LineItem.find_by_id(params[:id])
|
||||
issue = line_item.issue
|
||||
line_item.destroy
|
||||
flash[:notice] = "Line Item deleted successfully"
|
||||
redirect_to issue
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -133,10 +133,10 @@ class QboController < ApplicationController
|
||||
Thread.new do
|
||||
if Qbo.exists?
|
||||
Customer.sync
|
||||
QboInvoice.sync
|
||||
QboItem.sync
|
||||
QboEmployee.sync
|
||||
QboEstimate.sync
|
||||
QboInvoice.sync
|
||||
|
||||
# Record the last sync time
|
||||
Qbo.update_time_stamp
|
||||
@@ -144,6 +144,6 @@ class QboController < ApplicationController
|
||||
ActiveRecord::Base.connection.close
|
||||
end
|
||||
|
||||
redirect_to qbo_path(:redmine_qbo), :flash => { :notice => "Successfully synced to Quickbooks" }
|
||||
redirect_to :back, :flash => { :notice => "Successfully synced to Quickbooks" }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -37,8 +37,7 @@ class VehiclesController < ApplicationController
|
||||
# return an HTML form for creating a new vehicle
|
||||
def new
|
||||
@vehicle = Vehicle.new
|
||||
@customers = Customer.all.order(:name)
|
||||
@customer = params[:customer_id] if params[:customer_id]
|
||||
@customer = Customer.find_by_id(params[:customer_id]) if params[:customer_id]
|
||||
end
|
||||
|
||||
# create a new vehicle
|
||||
@@ -57,6 +56,7 @@ class VehiclesController < ApplicationController
|
||||
def show
|
||||
begin
|
||||
@vehicle = Vehicle.find_by_id(params[:id])
|
||||
@vin = @vehicle.vin.scan(/.{1,9}/) if @vehicle.vin
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
@@ -66,8 +66,7 @@ class VehiclesController < ApplicationController
|
||||
def edit
|
||||
begin
|
||||
@vehicle = Vehicle.find_by_id(params[:id])
|
||||
@customer = @vehicle.customer.id
|
||||
@customers = Customer.all.order(:name)
|
||||
@customer = @vehicle.customer
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
@@ -101,15 +100,6 @@ class VehiclesController < ApplicationController
|
||||
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 )
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -13,6 +13,8 @@ class Customer < ActiveRecord::Base
|
||||
|
||||
has_many :issues
|
||||
has_many :qbo_purchases
|
||||
has_many :qbo_invoices
|
||||
has_many :qbo_estimates
|
||||
has_many :vehicles
|
||||
|
||||
attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
34
app/models/line_item.rb
Normal file
34
app/models/line_item.rb
Normal file
@@ -0,0 +1,34 @@
|
||||
#Copyright (c) 2018 Rick Barrette - All Rights Reserved
|
||||
#
|
||||
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
|
||||
#
|
||||
#Proprietary and confidential
|
||||
#
|
||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
#
|
||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
class LineItem < ActiveRecord::Base
|
||||
|
||||
unloadable
|
||||
|
||||
belongs_to :issue
|
||||
|
||||
attr_accessible :amount, :description, :unit_price, :quantity, :item_id
|
||||
validates_presence_of :amount, :description, :unit_price, :quantity
|
||||
|
||||
def add_to_invoice(invoice)
|
||||
line_item = Quickbooks::Model::InvoiceLineItem.new
|
||||
line_item.amount = amount
|
||||
line_item.description = description
|
||||
line_item.sales_item! do |detail|
|
||||
detail.unit_price = unit_price
|
||||
detail.quantity = quantity
|
||||
detail.item_id = item_id # Item ID here... Where do i get this???
|
||||
end
|
||||
|
||||
invoice.line_items << line_item
|
||||
|
||||
return invoice
|
||||
end
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -10,44 +10,49 @@
|
||||
|
||||
class QboEstimate < ActiveRecord::Base
|
||||
unloadable
|
||||
has_many :issues
|
||||
attr_accessible :doc_number
|
||||
validates_presence_of :id, :doc_number
|
||||
|
||||
has_and_belongs_to_many :issues
|
||||
belongs_to :customer
|
||||
attr_accessible :doc_number, :id
|
||||
validates_presence_of :doc_number, :id
|
||||
self.primary_key = :id
|
||||
|
||||
# return the QBO Estimate service
|
||||
def self.get_base
|
||||
Qbo.get_base(:estimate)
|
||||
Qbo.get_base(:estimate).service
|
||||
end
|
||||
|
||||
# sync all estimates
|
||||
def self.sync
|
||||
estimates = get_base.service.all
|
||||
|
||||
# Update the item table
|
||||
transaction do
|
||||
estimates.each { |estimate|
|
||||
qbo_estimate = QboEstimate.find_or_create_by(id: estimate.id)
|
||||
qbo_estimate.doc_number = estimate.doc_number
|
||||
qbo_estimate.id = estimate.id
|
||||
qbo_estimate.save!
|
||||
}
|
||||
end
|
||||
estimates = get_base.all
|
||||
estimates.each { |estimate|
|
||||
process_estimate(estimate)
|
||||
}
|
||||
|
||||
#remove deleted estimates
|
||||
where.not(estimates.map(&:id)).destroy_all
|
||||
end
|
||||
|
||||
# sync only one estimate
|
||||
def self.sync_by_id(id)
|
||||
estimate = get_base.service.fetch_by_id(id)
|
||||
qbo_estimate = QboEstimate.find_or_create_by(id: estimate.id)
|
||||
process_estimate(get_base.fetch_by_id(id))
|
||||
end
|
||||
|
||||
# update an estimate
|
||||
def self.update(id)
|
||||
# Update the item table
|
||||
estimate = get_base.fetch_by_id(id)
|
||||
qbo_estimate = find_or_create_by(id: id)
|
||||
qbo_estimate.doc_number = estimate.doc_number
|
||||
qbo_estimate.id = estimate.id
|
||||
qbo_estimate.save!
|
||||
end
|
||||
|
||||
def self.update(id)
|
||||
# Update the item table
|
||||
estimate = get_base.service.fetch_by_id(id)
|
||||
qbo_estimate = QboEstimate.find_or_create_by(id: id)
|
||||
qbo_estimate.doc_number = estimate.doc_number
|
||||
qbo_estimate.save!
|
||||
# process an estimate into the database
|
||||
def self.process_estimate(estimate)
|
||||
qbo_estimate = find_or_create_by(id: estimate.id)
|
||||
qbo_estimate.doc_number = estimate.doc_number
|
||||
qbo_estimate.customer_id = estimate.customer_ref.value
|
||||
qbo_estimate.id = estimate.id
|
||||
qbo_estimate.save!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -12,6 +12,7 @@ class QboInvoice < ActiveRecord::Base
|
||||
unloadable
|
||||
|
||||
has_and_belongs_to_many :issues
|
||||
belongs_to :customer
|
||||
attr_accessible :doc_number, :id
|
||||
validates_presence_of :doc_number, :id
|
||||
self.primary_key = :id
|
||||
@@ -59,6 +60,7 @@ class QboInvoice < ActiveRecord::Base
|
||||
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
|
||||
qbo_invoice.doc_number = invoice.doc_number
|
||||
qbo_invoice.id = invoice.id
|
||||
qbo_invoice.customer_id = invoice.customer_ref
|
||||
qbo_invoice.save!
|
||||
|
||||
unless issue.qbo_invoices.include?(qbo_invoice)
|
||||
@@ -125,19 +127,17 @@ class QboInvoice < ActiveRecord::Base
|
||||
cf.string_value = value.value.to_s
|
||||
is_changed = true
|
||||
end
|
||||
end
|
||||
|
||||
# Use the max milage
|
||||
if cf.name.eql? "Mileage Out"
|
||||
elsif 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
|
||||
else
|
||||
# Everything else
|
||||
cf.string_value = value.value.to_s
|
||||
is_changed = true
|
||||
end
|
||||
|
||||
# Everything else
|
||||
cf.string_value = value.value.to_s
|
||||
is_changed = true
|
||||
end
|
||||
end
|
||||
rescue
|
||||
@@ -148,6 +148,7 @@ class QboInvoice < ActiveRecord::Base
|
||||
# TODO Add some hooks here
|
||||
|
||||
# Push updates
|
||||
#invoice.sync_token += 1 if is_changed
|
||||
get_base.update(invoice) if is_changed
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -12,8 +12,6 @@ class Vehicle < ActiveRecord::Base
|
||||
|
||||
unloadable
|
||||
|
||||
API_KEY = Setting.plugin_redmine_qbo['settingsEdmundsAPIKey']
|
||||
|
||||
belongs_to :customer
|
||||
has_many :issues, :foreign_key => 'vehicles_id'
|
||||
|
||||
@@ -21,8 +19,6 @@ class Vehicle < ActiveRecord::Base
|
||||
|
||||
validates_presence_of :customer
|
||||
validates :vin, uniqueness: true
|
||||
#validates :year, numericality: { only_integer: true }
|
||||
|
||||
before_save :decode_vin
|
||||
after_initialize :get_details
|
||||
|
||||
@@ -30,7 +26,12 @@ class Vehicle < ActiveRecord::Base
|
||||
|
||||
# returns a human readable string
|
||||
def to_s
|
||||
return "#{year} #{make} #{model}"
|
||||
if year.nil? or make.nil? or model.nil?
|
||||
return "#{vin}"
|
||||
else
|
||||
split_vin = vin.scan(/.{1,9}/)
|
||||
return "#{year} #{make} #{model} - #{split_vin[1]}"
|
||||
end
|
||||
end
|
||||
|
||||
# returns the raw JSON details from EMUNDS
|
||||
@@ -41,7 +42,7 @@ class Vehicle < ActiveRecord::Base
|
||||
# returns the style of the vehicle
|
||||
def style
|
||||
begin
|
||||
return @details['years'][0]['styles'][0]['name'] if @details
|
||||
return @details.trim if @details
|
||||
rescue
|
||||
return nil
|
||||
end
|
||||
@@ -49,12 +50,14 @@ class Vehicle < ActiveRecord::Base
|
||||
|
||||
# returns the drive of the vehicle i.e. 2 wheel, 4 wheel, ect.
|
||||
def drive
|
||||
return @details['drivenWheels'].to_s.upcase if @details
|
||||
#todo fix this
|
||||
#return @details.drive_type if @details
|
||||
return nil
|
||||
end
|
||||
|
||||
# returns the number of doors of the vehicle
|
||||
def doors
|
||||
return @details['numOfDoors'] if @details
|
||||
return @details.doors if @details
|
||||
end
|
||||
|
||||
# Force Upper Case for VIN numbers
|
||||
@@ -71,8 +74,9 @@ class Vehicle < ActiveRecord::Base
|
||||
|
||||
# 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)
|
||||
#strip VIN of all illegal chars (for barcode scanner)
|
||||
val = val.to_s.upcase.gsub(/[^A-HJ-NPR-Za-hj-npr-z\d]+/,"")
|
||||
write_attribute(:vin, val)
|
||||
end
|
||||
|
||||
# search for a vin
|
||||
@@ -80,35 +84,29 @@ class Vehicle < ActiveRecord::Base
|
||||
where("vin LIKE ?", "%#{search}%")
|
||||
end
|
||||
|
||||
private
|
||||
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"
|
||||
query = NhtsaVin.get(self.vin)
|
||||
raise RuntimeError, query.error unless query.valid?
|
||||
@details = query.response
|
||||
rescue Exception => e
|
||||
errors.add(:vin, e.message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# returns the Edmunds decoder service
|
||||
def get_decoder
|
||||
#TODO API Code via Settings
|
||||
return decoder = Edmunds::Vin.new(API_KEY)
|
||||
end
|
||||
|
||||
# decodes a vin and updates self
|
||||
def decode_vin
|
||||
get_details
|
||||
if @details
|
||||
begin
|
||||
self.year = @details['years'][0]['year']
|
||||
self.make = @details['make']['name']
|
||||
self.model = @details['model']['name']
|
||||
self.year = @details.year unless @details.year.nil?
|
||||
self.make = @details.make unless @details.make.nil?
|
||||
self.model = @details.model unless @details.model.nil?
|
||||
rescue Exception => e
|
||||
errors.add(:vin, e.message)
|
||||
end
|
||||
@@ -116,15 +114,4 @@ class Vehicle < ActiveRecord::Base
|
||||
self.name = to_s
|
||||
end
|
||||
|
||||
# makes a squishvin
|
||||
# https://api.edmunds.com/api/vehicle/v2/squishvins/#{vin}/?fmt=json&api_key=#{ENV['edmunds_key']}
|
||||
def vin_squish
|
||||
if not self.vin? or self.vin.size < 11
|
||||
# this is to go ahead and query the API, letting them handle the error. :P
|
||||
return '1000000000A'
|
||||
end
|
||||
v = self.vin[0,11]
|
||||
return v.slice(0,8) + v.slice(9,11)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
6
app/views/customers/_search.html.erb
Normal file
6
app/views/customers/_search.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<%= form_tag(customers_path, :method => "get", id: "search-form") do %>
|
||||
<%= text_field_tag :search, params[:search], placeholder: "Search Customers" %>
|
||||
<%= submit_tag "Search" %>
|
||||
<% end %>
|
||||
<%= button_to "New Customer", new_customer_path, method: :get%>
|
||||
<%= button_to "Sync", qbo_sync_path, method: :get%>
|
||||
2
app/views/customers/_sidebar.html.erb
Normal file
2
app/views/customers/_sidebar.html.erb
Normal file
@@ -0,0 +1,2 @@
|
||||
<h3>Customers</h3>
|
||||
<%= render :partial => 'customers/search' %>
|
||||
1
app/views/customers/filter_estimates_by_customer.js.erb
Normal file
1
app/views/customers/filter_estimates_by_customer.js.erb
Normal file
@@ -0,0 +1 @@
|
||||
$('select#issue_qbo_estimate_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_estimates, :id, :doc_number) %>');
|
||||
@@ -1 +1 @@
|
||||
$('select#issue_vehicles_id').html('<%= j options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>');
|
||||
$('select#issue_vehicles_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>');
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
<h1>Customers</h1>
|
||||
<br/>
|
||||
<%= form_tag(customers_path, :method => "get", id: "search-form") do %>
|
||||
<%= text_field_tag :search, params[:search], placeholder: "Search Customers" %>
|
||||
<%= submit_tag "Search" %>
|
||||
<% end %>
|
||||
<br/>
|
||||
<h2>Customers <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
||||
<% if @customers.present? %>
|
||||
<br/>
|
||||
<% @customers.each do |c| %>
|
||||
@@ -15,6 +9,8 @@
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<p>Matching <%= @customers.count %> Customers </p>
|
||||
|
||||
<div class="actions">
|
||||
<%= will_paginate @customers %>
|
||||
</div>
|
||||
@@ -24,5 +20,5 @@
|
||||
<% end %>
|
||||
|
||||
<div>
|
||||
<%= Customer.count %> Customers - <b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
||||
<%= render :partial => 'qbo/stats' %>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<h1>New Customer</h1>
|
||||
<h2>New Customer</h2>
|
||||
<br/>
|
||||
<%= render :partial => 'customers/form' %>
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
<div id="content">
|
||||
<h2>Customer #<%= @customer.id %></h2>
|
||||
<h2>Customer #<%= @customer.id %> - <%= @customer.name %> <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
||||
<br/>
|
||||
|
||||
<div class="subject">
|
||||
<div><h3><%= @customer.name %></h3></div>
|
||||
<div><h3>Details:</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">
|
||||
|
||||
@@ -48,7 +48,7 @@ This customer link expires in <%= distance_of_time_in_words(Time.now, @token.exp
|
||||
end
|
||||
#end
|
||||
end %>
|
||||
<%= render_custom_fields_rows(@issue) %>
|
||||
<%= render_full_width_custom_fields_rows(@issue) %>
|
||||
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
|
||||
</div>
|
||||
|
||||
|
||||
29
app/views/issues/_list_simple.html.erb
Normal file
29
app/views/issues/_list_simple.html.erb
Normal file
@@ -0,0 +1,29 @@
|
||||
<% if issues && issues.any? %>
|
||||
<%= form_tag({}) do %>
|
||||
<table class="list issues">
|
||||
<thead><tr>
|
||||
<th>#</th>
|
||||
<th><%=l(:field_project)%></th>
|
||||
<th><%=l(:field_tracker)%></th>
|
||||
<th><%=l(:field_subject)%></th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<% for issue in issues %>
|
||||
<tr id="issue-<%= h(issue.id) %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>">
|
||||
<td class="id">
|
||||
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;', :id => nil) %>
|
||||
<%= link_to(issue.id, issue_path(issue)) %>
|
||||
</td>
|
||||
<td class="project"><%= link_to_project(issue.project) %></td>
|
||||
<td class="tracker"><%= issue.tracker %></td>
|
||||
<td class="subject">
|
||||
<%= link_to(issue.subject.truncate(60), issue_path(issue)) %> (<%= issue.status %>)
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% end %>
|
||||
1
app/views/qbo/_last_sync.html.erb
Normal file
1
app/views/qbo/_last_sync.html.erb
Normal file
@@ -0,0 +1 @@
|
||||
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
||||
@@ -20,14 +20,6 @@ intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_au
|
||||
|
||||
<table >
|
||||
<tbody>
|
||||
<tr>
|
||||
<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>
|
||||
|
||||
1
app/views/qbo/_stats.html.erb
Normal file
1
app/views/qbo/_stats.html.erb
Normal file
@@ -0,0 +1 @@
|
||||
<%= Customer.count %> Customers - <%= render :partial => 'qbo/last_sync' %>
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
<tr>
|
||||
<th>VIN</th>
|
||||
<td><%= vehicle.vin %></td>
|
||||
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
@@ -21,16 +21,6 @@
|
||||
<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>
|
||||
@@ -45,7 +35,6 @@
|
||||
<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>
|
||||
|
||||
@@ -4,9 +4,10 @@
|
||||
|
||||
<%= 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%>
|
||||
Customer:
|
||||
<div class="input">
|
||||
<%= f.autocomplete_field :customer, autocomplete_customer_name_customers_path, :value => @customer.name, :update_elements => {:id => '#customer_id', :value => '#issue_customer'}, :required => true %>
|
||||
<%= f.hidden_field :customer_id, :id => "customer_id", :value => @customer.id %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -41,14 +42,7 @@
|
||||
<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>
|
||||
<%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
<%= will_paginate @vehicles %>
|
||||
</div>
|
||||
|
||||
<p>Matching <%= @vehicles.count %> Vehicles </p>
|
||||
|
||||
<% else %>
|
||||
<p>There are no vehicles containing the term(s) <%= params[:search] %>.</p>
|
||||
<% end %>
|
||||
|
||||
4
app/views/vehicles/_search.html.erb
Normal file
4
app/views/vehicles/_search.html.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
<%= 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 %>
|
||||
@@ -1,9 +1,4 @@
|
||||
<h1>Customer Vehicles</h1>
|
||||
<h2>Customer Vehicles <span style="float:right"> <%= render :partial => 'vehicles/search' %> </span> </h2>
|
||||
<br/>
|
||||
|
||||
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
|
||||
<%= text_field_tag :search, params[:search], placeholder: "Search Vehicles by VIN" %>
|
||||
<%= submit_tag "Search" %>
|
||||
<% end %>
|
||||
|
||||
<%= render :partial => 'vehicles/list' %>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<h1>New Customer Vehicle</h1>
|
||||
<h2>New Customer Vehicle</h2>
|
||||
<br/>
|
||||
<%= render :partial => 'vehicles/form' %>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h1>Vehicle #<%=@vehicle.id%> </h1>
|
||||
<h2>Vehicle #<%=@vehicle.id%> <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
||||
<br/>
|
||||
|
||||
<div style="text-align: left; width:90%;">
|
||||
|
||||
@@ -5,5 +5,19 @@ $(function() {
|
||||
type: "GET",
|
||||
data: { selected_customer: $("input#issue_customer_id").val() }
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: "/filter_estimates_by_customer",
|
||||
type: "GET",
|
||||
data: { selected_customer: $("input#issue_customer_id").val() }
|
||||
});
|
||||
});
|
||||
|
||||
$("input#project_customer_id").on("change", function() {
|
||||
$.ajax({
|
||||
url: "/filter_vehicles_by_customer",
|
||||
type: "GET",
|
||||
data: { selected_customer: $("input#project_customer_id").val() }
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
Edmunds::Api.configure do |config|
|
||||
config.api_key = '2dheutzvhxs28dzukx5tgu47'
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -17,6 +17,7 @@ en:
|
||||
field_qbo_invoice: "Invoice"
|
||||
field_qbo_estimate: "Estimate"
|
||||
field_vehicles: "Vehicle"
|
||||
field_vehicle: "Vehicle"
|
||||
field_vin: "VIN"
|
||||
field_notes: "Notes"
|
||||
field_qbo_billed: "Billed"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -34,14 +34,15 @@ resources :payments
|
||||
#webhook
|
||||
post 'qbo/webhook', :to => 'qbo#qbo_webhook'
|
||||
|
||||
#ajax
|
||||
#java script routes
|
||||
get 'filter_vehicles_by_customer' => 'customers#filter_vehicles_by_customer'
|
||||
get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer'
|
||||
get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer'
|
||||
|
||||
# Nest Vehicles under customers
|
||||
resources :customers do
|
||||
resources :vehicles
|
||||
get :autocomplete_customer_name, :on => :collection
|
||||
get :autocomplete_customer_vehicles, :on => :collection
|
||||
end
|
||||
|
||||
#allow for just vehicles too
|
||||
|
||||
16
db/migrate/024_update_invoices_and_estimates.rb
Normal file
16
db/migrate/024_update_invoices_and_estimates.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
#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.
|
||||
|
||||
class UpdateInvoicesAndEstimates < ActiveRecord::Migration
|
||||
def change
|
||||
add_reference :qbo_invoices, :customer, index: true
|
||||
add_reference :qbo_estimates, :customer, index: true
|
||||
end
|
||||
end
|
||||
16
db/migrate/025_update_projects.rb
Normal file
16
db/migrate/025_update_projects.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
#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.
|
||||
|
||||
class UpdateProjects < ActiveRecord::Migration
|
||||
def change
|
||||
add_reference :projects, :customer, index: true
|
||||
add_reference :projects, :vehicle, index: true
|
||||
end
|
||||
end
|
||||
26
db/migrate/026_create_line_items.rb
Normal file
26
db/migrate/026_create_line_items.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
#The License
|
||||
#
|
||||
#Copyright (c) 2018 Rick Barrette - All Rights Reserved
|
||||
#
|
||||
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
|
||||
#
|
||||
#Proprietary and confidential
|
||||
#
|
||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
#
|
||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
class CreateLineItems < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :line_items do |t|
|
||||
t.integer :item_id
|
||||
t.float :amount
|
||||
t.string :description
|
||||
t.float :unit_price
|
||||
t.float :quantity
|
||||
t.boolean :billed
|
||||
end
|
||||
|
||||
add_reference :line_items, :issues, index: true
|
||||
end
|
||||
end
|
||||
19
init.rb
19
init.rb
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -16,9 +16,12 @@ Redmine::Plugin.register :redmine_qbo do
|
||||
require_dependency 'issues_show_hook_listener'
|
||||
require_dependency 'users_show_hook_listener'
|
||||
require_dependency 'header_footer_hook_listener'
|
||||
require_dependency 'projects_form_hook_listener'
|
||||
require_dependency 'view_hook_listener'
|
||||
|
||||
# Patches to the Redmine core. Will not work in development mode
|
||||
require_dependency 'issue_patch'
|
||||
require_dependency 'project_patch'
|
||||
require_dependency 'user_patch'
|
||||
require_dependency 'query_patch'
|
||||
require_dependency 'time_entry_query_patch'
|
||||
@@ -28,7 +31,7 @@ Redmine::Plugin.register :redmine_qbo do
|
||||
name 'Redmine Quickbooks Online plugin'
|
||||
author 'Rick Barrette'
|
||||
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
|
||||
version '0.4.3'
|
||||
version '0.7.0'
|
||||
url 'https://github.com/rickbarrette/redmine_qbo'
|
||||
author_url 'http://rickbarrette.org'
|
||||
settings :default => {'empty' => true}, :partial => 'qbo/settings'
|
||||
@@ -41,12 +44,14 @@ Redmine::Plugin.register :redmine_qbo do
|
||||
Issue.safe_attributes 'vehicles_id'
|
||||
User.safe_attributes 'qbo_employee_id'
|
||||
TimeEntry.safe_attributes 'qbo_billed'
|
||||
Project.safe_attributes 'customer_id'
|
||||
Project.safe_attributes 'vehicle_id'
|
||||
|
||||
# We are playing in the sandbox
|
||||
#Quickbooks.sandbox_mode = true
|
||||
|
||||
# set per_page globally
|
||||
WillPaginate.per_page = 10
|
||||
WillPaginate.per_page = 20
|
||||
|
||||
permission :view_customers, :customers => :index, :public => false
|
||||
permission :add_customers, :customers => :new, :public => false
|
||||
@@ -55,13 +60,7 @@ Redmine::Plugin.register :redmine_qbo do
|
||||
permission :view_vehicles, :payments => :new, :public => false
|
||||
|
||||
# Register QBO top menu item
|
||||
#menu :top_menu, :qbo, { :controller => :qbo, :action => :index }, :caption => 'Quickbooks', :if => Proc.new { User.current.admin? }
|
||||
menu :top_menu, :customers, { :controller => :customers, :action => :index }, :caption => 'Customers', :if => Proc.new {User.current.logged?}
|
||||
menu :top_menu, :vehicles, { :controller => :vehicles, :action => :index }, :caption => 'Vehicles', :if => Proc.new { User.current.allowed_to?(:view_vehicles, @project) }
|
||||
menu :top_menu, :vehicles, { :controller => :vehicles, :action => :index }, :caption => 'Vehicles', :if => Proc.new { User.current.logged? }
|
||||
|
||||
menu :application_menu, :new_customer, { :controller => :customers, :action => :new }, :caption => 'New Customer', :if => Proc.new { User.current.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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -42,6 +42,8 @@ module IssuePatch
|
||||
# Create billable time entries
|
||||
def bill_time
|
||||
|
||||
return if assigned_to.nil?
|
||||
|
||||
# Get unbilled time entries
|
||||
spent_time = time_entries.where(qbo_billed: [false, nil])
|
||||
spent_hours ||= spent_time.sum(:hours) || 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -22,6 +22,10 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener
|
||||
def view_issues_form_details_bottom(context={})
|
||||
f = context[:form]
|
||||
|
||||
#check project level customer/vehicle ownership first
|
||||
selected_customer = context[:project].customer ? context[:project].customer.id : nil
|
||||
selected_vehicle = context[:project].vehicle ? context[:project].vehicle.id : nil
|
||||
|
||||
# Check to see if there is a quickbooks user attached to the issue
|
||||
selected_customer = context[:issue].customer ? context[:issue].customer.id : nil
|
||||
selected_estimate = context[:issue].qbo_estimate ? context[:issue].qbo_estimate.id : nil
|
||||
@@ -32,15 +36,21 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener
|
||||
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 = f.select :qbo_estimate_id, QboEstimate.all.pluck(:doc_number, :id).sort! {|x, y| y <=> x}, :selected => selected_estimate, include_blank: true
|
||||
|
||||
if context[:issue].customer
|
||||
vehicles = customer.vehicles.pluck(:name, :id).sort!
|
||||
if customer.vehicles
|
||||
vehicles = customer.vehicles.pluck(:name, :id)
|
||||
else
|
||||
vehicles = [nil].compact
|
||||
end
|
||||
estimates = customer.qbo_estimates.pluck(:doc_number, :id).sort! {|x, y| y <=> x}
|
||||
else
|
||||
vehicles = [nil].compact
|
||||
estimates = [nil].compact
|
||||
end
|
||||
|
||||
# Generate the drop down list of quickbooks extimates
|
||||
select_estimate = f.select :qbo_estimate_id, estimates, :selected => selected_estimate, include_blank: true
|
||||
|
||||
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>"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
40
lib/project_patch.rb
Normal file
40
lib/project_patch.rb
Normal file
@@ -0,0 +1,40 @@
|
||||
#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.
|
||||
|
||||
require_dependency 'project'
|
||||
|
||||
# Patches Redmine's Projects dynamically.
|
||||
# Adds a relationships
|
||||
module ProjectPatch
|
||||
|
||||
def self.included(base) # :nodoc:
|
||||
base.extend(ClassMethods)
|
||||
|
||||
base.send(:include, InstanceMethods)
|
||||
|
||||
# Same as typing in the class
|
||||
base.class_eval do
|
||||
unloadable # Send unloadable so it will not be unloaded in development
|
||||
belongs_to :customer, primary_key: :id
|
||||
belongs_to :vehicle, primary_key: :id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
|
||||
end
|
||||
|
||||
# Add module to Project
|
||||
Project.send(:include, ProjectPatch)
|
||||
36
lib/projects_form_hook_listener.rb
Normal file
36
lib/projects_form_hook_listener.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
#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.
|
||||
|
||||
class ProjectsFormHookListener < Redmine::Hook::ViewListener
|
||||
|
||||
# Edit Project Form
|
||||
def view_projects_form(context={})
|
||||
f = context[:form]
|
||||
|
||||
# Check to see if there is a quickbooks user attached to the issue
|
||||
selected_customer = context[:project].customer ? context[:project].customer : nil
|
||||
selected_vehicle = context[:project].vehicle_id ? context[:project].vehicle_id : nil
|
||||
|
||||
# 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 => '#project_customer_id', :value => '#project_customer'}
|
||||
customer_id = f.hidden_field :customer_id, :id => "project_customer_id"
|
||||
|
||||
if context[:project].customer
|
||||
vehicles = customer.vehicles.pluck(:name, :id).sort!
|
||||
else
|
||||
vehicles = [nil].compact
|
||||
end
|
||||
|
||||
vehicle = f.select :vehicle_id, vehicles, :selected => selected_vehicle, include_blank: true
|
||||
|
||||
return "<p><label for=\"project_customer\">Customer</label>#{search_customer} #{customer_id}</p> <p>#{vehicle}</p>"
|
||||
end
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
@@ -52,16 +52,16 @@ module QueryPatch
|
||||
# :order => @available_filters.size + 1},
|
||||
#}
|
||||
|
||||
qbo_filters = {
|
||||
"customer_id" => {
|
||||
:id => :customer_id,
|
||||
:type => :list_optional,
|
||||
: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)
|
||||
#@available_filters.merge!(qbo_filters)
|
||||
end
|
||||
@available_filters
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#The MIT License (MIT)
|
||||
#
|
||||
#Copyright (c) 2016 rick barrette
|
||||
#Copyright (c) 2017 rick barrette
|
||||
#
|
||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
|
||||
3
lib/view_hook_listener.rb
Normal file
3
lib/view_hook_listener.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
class ViewHookListener < Redmine::Hook::ViewListener
|
||||
render_on :view_issues_sidebar_issues_bottom, :partial => "customers/sidebar"
|
||||
end
|
||||
Reference in New Issue
Block a user