Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b5b673ebf | |||
| c72d0a83ca | |||
| 3159289ac0 | |||
| a9cc5fac73 | |||
| fe06fccacd | |||
| 8b4a46f7eb | |||
| cf362caaf2 | |||
| de1be7d296 | |||
| d8e3e1a72f | |||
| 64a7ad844f | |||
| 9201c4ca96 | |||
| dab6b6f723 | |||
| 495243d177 | |||
| 332f07c93d | |||
| 54d4be9762 | |||
| f1e3c29c97 | |||
| 66d393a465 | |||
| 218d3392f0 | |||
| 0136d91cc3 | |||
| a95f0350d8 | |||
| 55c04b6585 | |||
| ea21bc362a | |||
| 117d92b879 | |||
| 440c8e4618 | |||
| 1344526f7f | |||
| 19acfbc76f | |||
| 9dfb27f0a4 | |||
| 51cd830710 | |||
| 956ba2ad46 | |||
| 3ae3107760 | |||
| 925d4b8bcf | |||
| ca6dbfd12d | |||
| 9ea03d0c6d | |||
| 6ad4929d53 | |||
| 446f419af0 | |||
| f3c5de82e0 | |||
| 56e24752cf | |||
| 255af13b20 | |||
| 02b4f1eb43 | |||
| 8c735d3921 | |||
| 70e6038215 | |||
| fc7501c4fe | |||
| 45b60cfea1 | |||
| 09313ad471 | |||
| 1b15aecbff | |||
| 2bea7dbc8d | |||
| 3468b5f236 | |||
| 1c431d14dc | |||
| 7234a70265 | |||
| a459d84b00 | |||
| 49d2ed8244 | |||
| d6aebfcb99 | |||
| 2085eb7869 | |||
| c101a86f02 | |||
| 2d32769a59 | |||
| a2f755388e | |||
| 8a8f1af2bd | |||
| 4582b8c5b9 | |||
| f66fbf6656 | |||
| 41d49ccce5 | |||
| c85f450742 | |||
| e314dae10d | |||
| b1192a1912 | |||
| 7cc8a946fd | |||
| 4b34852c72 | |||
| 5d7fc9dabd | |||
| db61952e67 | |||
| 016dca242c | |||
| 983811af97 | |||
| d18a9726ac | |||
| cdef838d3e | |||
| 7703d724e1 | |||
| 94b5efbd00 | |||
| f43020b864 | |||
| 0d0f808305 | |||
| 279e8b15e0 | |||
| 099f729303 | |||
| 5150a31cdb | |||
| b5d17dc862 | |||
| e6c5feb3f3 | |||
| 5573e941c6 | |||
| 29dbca20e0 | |||
| d6c114d52b | |||
| 87b8daf283 | |||
| 719abe20a6 | |||
| 4a5b83265d | |||
| 8d103d3fc6 | |||
| 9310f207a3 | |||
| 000b67b329 | |||
| ebee9395ba | |||
| 2cd6731f0c | |||
| ebdbd25082 | |||
| 18ada91fcd | |||
| 1cf3926585 | |||
| e776deeece | |||
| 8c2f30949a | |||
| 015a989f72 | |||
| 0d4d5a6136 | |||
| 0364989fe1 | |||
| fb47eaba0e | |||
| 725d511be5 | |||
| fd85f296de | |||
| 9549bb8fe2 | |||
| 6a1c8b0551 |
4
Gemfile
@@ -1,9 +1,7 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
gem 'quickbooks-ruby'
|
gem 'quickbooks-ruby'
|
||||||
gem 'quickbooks-ruby-base'
|
gem 'oauth2', '1.4.7'
|
||||||
gem 'oauth-plugin'
|
|
||||||
gem 'oauth2'
|
|
||||||
gem 'roxml'
|
gem 'roxml'
|
||||||
gem 'nhtsa_vin'
|
gem 'nhtsa_vin'
|
||||||
gem 'will_paginate'
|
gem 'will_paginate'
|
||||||
|
|||||||
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2018 Rick Barrette
|
Copyright (c) 2022 Rick Barrette
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
13
README.md
@@ -4,9 +4,11 @@ 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: Although the core functionality is complete, this project is still under heavy development. I am still working on refining everthing and adding other features. Tags should be stable`
|
#### Disclaimer
|
||||||
|
|
||||||
`Note: I am currently using this in a live production enviroment with no issues`
|
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
|
||||||
|
|
||||||
|
Use tags Version 1.0.0 & up for Redmine 4+ and Version 0.8.1 for Redine 3
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
* Issues can be assigned to a `Customer` via drop down in the edit Issue form
|
* Issues can be assigned to a `Customer` via drop down in the edit Issue form
|
||||||
@@ -50,11 +52,6 @@ The goal of this project is to allow Redmine to connect with Quickbooks Online t
|
|||||||
|
|
||||||
5. Assign an Employee to each of your users via the User Administration Page
|
5. Assign an Employee to each of your users via the User Administration Page
|
||||||
|
|
||||||
## 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
|
## Usage
|
||||||
|
|
||||||
To enable automatic `Time Activity` entries for an Issue , you need only to assign a `Customer` to an Issue via drop downs in the issue creation/update form.
|
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.
|
||||||
@@ -77,7 +74,7 @@ Note: After the inital synchronization, this plugin will recieve push notificati
|
|||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2020 rick barrette
|
Copyright (c) 2022 rick barrette
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
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:
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 346 KiB |
BIN
Screenshots/plugin_cusomer_search.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
Screenshots/plugin_customer_detail.png
Normal file
|
After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 512 KiB |
|
Before Width: | Height: | Size: 49 KiB |
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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:
|
||||||
#
|
#
|
||||||
@@ -27,22 +27,32 @@ class CustomersController < ApplicationController
|
|||||||
include SortHelper
|
include SortHelper
|
||||||
helper :timelog
|
helper :timelog
|
||||||
|
|
||||||
before_filter :add_customer, :only => :new
|
before_action :add_customer, :only => :new
|
||||||
before_filter :view_customer, :except => :new
|
before_action :view_customer, :except => [:new, :view]
|
||||||
skip_before_filter :verify_authenticity_token, :check_if_login_required, :only => [:view]
|
skip_before_action :verify_authenticity_token, :check_if_login_required, :only => [:view]
|
||||||
|
|
||||||
default_search_scope :names
|
default_search_scope :names
|
||||||
|
|
||||||
autocomplete :customer, :name, :full => true, :extra_data => [:id]
|
autocomplete :customer, :name, :full => true, :extra_data => [:id]
|
||||||
|
|
||||||
|
def allowed_params
|
||||||
|
params.require(:customer).permit(:name, :email, :primary_phone, :mobile_phone, :phone_number)
|
||||||
|
end
|
||||||
|
|
||||||
|
# getter method for a customer's vehicles
|
||||||
|
# used for customer autocomplete field / issue form
|
||||||
def filter_vehicles_by_customer
|
def filter_vehicles_by_customer
|
||||||
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
|
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# getter method for a customer's invoices
|
||||||
|
# used for customer autocomplete field / issue form
|
||||||
def filter_invoices_by_customer
|
def filter_invoices_by_customer
|
||||||
@filtered_invoices = QboInvoice.all.where(customer_id: params[:selected_customer])
|
@filtered_invoices = QboInvoice.all.where(customer_id: params[:selected_customer])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# getter method for a customer's estimates
|
||||||
|
# used for customer autocomplete field / issue form
|
||||||
def filter_estimates_by_customer
|
def filter_estimates_by_customer
|
||||||
@filtered_estimates = QboEstimate.all.where(customer_id: params[:selected_customer])
|
@filtered_estimates = QboEstimate.all.where(customer_id: params[:selected_customer])
|
||||||
end
|
end
|
||||||
@@ -57,12 +67,14 @@ class CustomersController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# initialize a new customer
|
||||||
def new
|
def new
|
||||||
@customer = Customer.new
|
@customer = Customer.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# create a new customer
|
||||||
def create
|
def create
|
||||||
@customer = Customer.new(params[:customer])
|
@customer = Customer.new(allowed_params)
|
||||||
if @customer.save
|
if @customer.save
|
||||||
flash[:notice] = "New Customer Created"
|
flash[:notice] = "New Customer Created"
|
||||||
redirect_to @customer
|
redirect_to @customer
|
||||||
@@ -77,8 +89,11 @@ class CustomersController < ApplicationController
|
|||||||
begin
|
begin
|
||||||
@customer = Customer.find_by_id(params[:id])
|
@customer = Customer.find_by_id(params[:id])
|
||||||
@vehicles = @customer.vehicles.paginate(:page => params[:page])
|
@vehicles = @customer.vehicles.paginate(:page => params[:page])
|
||||||
@issues = @customer.issues
|
@issues = @customer.issues.order(id: :desc)
|
||||||
rescue ActiveRecord::RecordNotFound
|
@billing_address = address_to_s(@customer.billing_address)
|
||||||
|
@shipping_address = address_to_s(@customer.shipping_address)
|
||||||
|
@closed_issues = (@issues - @issues.open)
|
||||||
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -87,7 +102,7 @@ class CustomersController < ApplicationController
|
|||||||
def edit
|
def edit
|
||||||
begin
|
begin
|
||||||
@customer = Customer.find_by_id(params[:id])
|
@customer = Customer.find_by_id(params[:id])
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -96,29 +111,30 @@ class CustomersController < ApplicationController
|
|||||||
def update
|
def update
|
||||||
begin
|
begin
|
||||||
@customer = Customer.find_by_id(params[:id])
|
@customer = Customer.find_by_id(params[:id])
|
||||||
if @customer.update_attributes(params[:customer])
|
if @customer.update_attributes(allowed_params)
|
||||||
flash[:notice] = "Customer updated"
|
flash[:notice] = "Customer updated"
|
||||||
redirect_to @customer
|
redirect_to @customer
|
||||||
else
|
else
|
||||||
redirect_to edit_customer_path
|
redirect_to edit_customer_path
|
||||||
flash[:error] = @customer.errors.full_messages.to_sentence if @customer.errors
|
flash[:error] = @customer.errors.full_messages.to_sentence if @customer.errors
|
||||||
end
|
end
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# delete a customer
|
||||||
def destroy
|
def destroy
|
||||||
begin
|
begin
|
||||||
Customer.find_by_id(params[:id]).destroy
|
Customer.find_by_id(params[:id]).destroy
|
||||||
flash[:notice] = "Customer deleted successfully"
|
flash[:notice] = "Customer deleted successfully"
|
||||||
redirect_to action: :index
|
redirect_to action: :index
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Customer view for an issue
|
# displays an issue for a customer with a provided security CustomerToken
|
||||||
def view
|
def view
|
||||||
|
|
||||||
User.current = User.find_by lastname: 'Anonymous'
|
User.current = User.find_by lastname: 'Anonymous'
|
||||||
@@ -153,14 +169,18 @@ class CustomersController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# redmine permission - add customers
|
||||||
def add_customer
|
def add_customer
|
||||||
global_check_permission(:add_customers)
|
global_check_permission(:add_customers)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# redmine permission - view customers
|
||||||
def view_customer
|
def view_customer
|
||||||
global_check_permission(:view_customers)
|
global_check_permission(:view_customers)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# checks to see if there is only one item in an array
|
||||||
|
# @return true if array only has one item
|
||||||
def only_one_non_zero?( array )
|
def only_one_non_zero?( array )
|
||||||
found_non_zero = false
|
found_non_zero = false
|
||||||
array.each do |val|
|
array.each do |val|
|
||||||
@@ -172,4 +192,18 @@ class CustomersController < ApplicationController
|
|||||||
found_non_zero
|
found_non_zero
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# format a quickbooks address to a human readable string
|
||||||
|
def address_to_s (address)
|
||||||
|
return if address.nil?
|
||||||
|
string = address.line1
|
||||||
|
string << "\n" + address.line2 if address.line2
|
||||||
|
string << "\n" + address.line3 if address.line3
|
||||||
|
string << "\n" + address.line4 if address.line4
|
||||||
|
string << "\n" + address.line5 if address.line5
|
||||||
|
string << " " + address.city
|
||||||
|
string << ", " + address.country_sub_division_code
|
||||||
|
string << " " + address.postal_code
|
||||||
|
return string
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -12,16 +12,34 @@ class EstimateController < ApplicationController
|
|||||||
|
|
||||||
include AuthHelper
|
include AuthHelper
|
||||||
|
|
||||||
before_filter :require_user
|
before_action :require_user
|
||||||
|
|
||||||
#
|
#
|
||||||
# Downloads and forwards the estimate pdf
|
# Downloads and forwards the estimate pdf
|
||||||
#
|
#
|
||||||
def show
|
def show
|
||||||
base = QboEstimate.get_base
|
e = QboEstimate.find_by_id(params[:id]) if params[:id]
|
||||||
estimate = base.fetch_by_id(params[:id])
|
e = QboEstimate.find_by_doc_number(params[:search]) if params[:search]
|
||||||
@pdf = base.pdf(estimate)
|
|
||||||
send_data @pdf, filename: "estimate #{estimate.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
|
begin
|
||||||
|
send_data e.pdf, filename: "estimate #{e.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
|
||||||
|
rescue
|
||||||
|
redirect_to :back, :flash => { :error => "Estimate not found" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Downloads estimate by document number
|
||||||
|
#
|
||||||
|
def doc
|
||||||
|
e = QboEstimate.find_by_doc_number(params[:id]) if params[:id]
|
||||||
|
e = QboEstimate.find_by_doc_number(params[:search]) if params[:search]
|
||||||
|
|
||||||
|
begin
|
||||||
|
send_data e.pdf, filename: "estimate #{e.doc_number}.pdf", :disposition => 'inline', :type => "application/pdf"
|
||||||
|
rescue
|
||||||
|
redirect_to :back, :flash => { :error => "Estimate not found" }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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,8 @@ class InvoiceController < ApplicationController
|
|||||||
|
|
||||||
include AuthHelper
|
include AuthHelper
|
||||||
|
|
||||||
before_filter :require_user, :unless => proc {|c| session[:token].nil? }
|
before_action :require_user, :unless => proc {|c| session[:token].nil? }
|
||||||
skip_before_filter :verify_authenticity_token, :check_if_login_required, :unless => proc {|c| session[:token].nil? }
|
skip_before_action :verify_authenticity_token, :check_if_login_required, :unless => proc {|c| session[:token].nil? }
|
||||||
|
|
||||||
#
|
#
|
||||||
# Downloads and forwards the invoice pdf
|
# Downloads and forwards the invoice pdf
|
||||||
|
|||||||
@@ -1,94 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#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 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 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,57 +0,0 @@
|
|||||||
#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 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).query("SELECT Id, Name FROM Account WHERE AccountType = 'Bank' Order By Name")
|
|
||||||
|
|
||||||
@payment_methods = Qbo.get_base(:payment_method).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
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -15,8 +15,12 @@ class QboController < ApplicationController
|
|||||||
|
|
||||||
include AuthHelper
|
include AuthHelper
|
||||||
|
|
||||||
before_filter :require_user, :except => :qbo_webhook
|
before_action :require_user, :except => :qbo_webhook
|
||||||
skip_before_filter :verify_authenticity_token, :check_if_login_required, :only => [:qbo_webhook]
|
skip_before_action :verify_authenticity_token, :check_if_login_required, :only => [:qbo_webhook]
|
||||||
|
|
||||||
|
def allowed_params
|
||||||
|
params.permit(:code, :state, :realmId, :id)
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Called when the QBO Top Menu us shown
|
# Called when the QBO Top Menu us shown
|
||||||
@@ -35,7 +39,7 @@ class QboController < ApplicationController
|
|||||||
#
|
#
|
||||||
def authenticate
|
def authenticate
|
||||||
oauth2_client = Qbo.get_client
|
oauth2_client = Qbo.get_client
|
||||||
callback = "https://redmine.rickbarrette.org/qbo/oauth_callback/"
|
callback = Setting.host_name + "/qbo/oauth_callback/"
|
||||||
#callback = qbo_oauth_callback_url
|
#callback = qbo_oauth_callback_url
|
||||||
grant_url = oauth2_client.auth_code.authorize_url(redirect_uri: callback, response_type: "code", state: SecureRandom.hex(12), scope: "com.intuit.quickbooks.accounting")
|
grant_url = oauth2_client.auth_code.authorize_url(redirect_uri: callback, response_type: "code", state: SecureRandom.hex(12), scope: "com.intuit.quickbooks.accounting")
|
||||||
redirect_to grant_url
|
redirect_to grant_url
|
||||||
@@ -49,24 +53,19 @@ class QboController < ApplicationController
|
|||||||
oauth2_client = Qbo.get_client
|
oauth2_client = Qbo.get_client
|
||||||
# use the state value to retrieve from your backend any information you need to identify the customer in your system
|
# use the state value to retrieve from your backend any information you need to identify the customer in your system
|
||||||
#redirect_uri = qbo_oauth_callback_url
|
#redirect_uri = qbo_oauth_callback_url
|
||||||
redirect_uri = "https://redmine.rickbarrette.org/qbo/oauth_callback/"
|
redirect_uri = Setting.host_name + "/qbo/oauth_callback/"
|
||||||
if resp = oauth2_client.auth_code.get_token(params[:code], redirect_uri: redirect_uri)
|
if resp = oauth2_client.auth_code.get_token(params[:code], redirect_uri: redirect_uri)
|
||||||
# save your tokens here. For example:
|
|
||||||
# quickbooks_credentials.update_attributes(access_token: resp.token, refresh_token: resp.refresh_token,
|
|
||||||
# realm_id: params[:realmId])
|
|
||||||
|
|
||||||
|
# Remove the last authentication information
|
||||||
Qbo.delete_all
|
Qbo.delete_all
|
||||||
|
|
||||||
# Save the authentication information
|
# Save the authentication information
|
||||||
qbo = Qbo.new
|
qbo = Qbo.new
|
||||||
qbo.qb_token = resp.token
|
|
||||||
qbo.qb_secret = resp.refresh_token
|
|
||||||
qbo.token_expires_at = 6.months.from_now.utc
|
|
||||||
qbo.reconnect_token_at = 3.months.from_now.utc
|
|
||||||
qbo.company_id = params[:realmId]
|
qbo.company_id = params[:realmId]
|
||||||
|
|
||||||
|
# Generate Access Token & Serialize it into the database
|
||||||
access_token = OAuth2::AccessToken.new(oauth2_client, resp.token, refresh_token: resp.refresh_token)
|
access_token = OAuth2::AccessToken.new(oauth2_client, resp.token, refresh_token: resp.refresh_token)
|
||||||
qbo.token = access_token
|
qbo.token = access_token.to_hash
|
||||||
qbo.expire = 1.hour.from_now.utc
|
qbo.expire = 1.hour.from_now.utc
|
||||||
|
|
||||||
if qbo.save!
|
if qbo.save!
|
||||||
@@ -93,6 +92,8 @@ class QboController < ApplicationController
|
|||||||
# Quickbooks Webhook Callback
|
# Quickbooks Webhook Callback
|
||||||
def qbo_webhook
|
def qbo_webhook
|
||||||
|
|
||||||
|
logger.info "Quickbooks is calling webhook"
|
||||||
|
|
||||||
# check the payload
|
# check the payload
|
||||||
signature = request.headers['intuit-signature']
|
signature = request.headers['intuit-signature']
|
||||||
key = Setting.plugin_redmine_qbo['settingsWebhookToken']
|
key = Setting.plugin_redmine_qbo['settingsWebhookToken']
|
||||||
@@ -116,6 +117,8 @@ class QboController < ApplicationController
|
|||||||
# TODO rename all other models!
|
# TODO rename all other models!
|
||||||
name.prepend("Qbo") if not name.eql? "Customer"
|
name.prepend("Qbo") if not name.eql? "Customer"
|
||||||
|
|
||||||
|
logger.debug "Casting #{name.constantize} to obj"
|
||||||
|
|
||||||
# Magicly initialize the correct class
|
# Magicly initialize the correct class
|
||||||
obj = name.constantize
|
obj = name.constantize
|
||||||
|
|
||||||
@@ -127,7 +130,13 @@ class QboController < ApplicationController
|
|||||||
obj.destroy(id)
|
obj.destroy(id)
|
||||||
#if not then update!
|
#if not then update!
|
||||||
else
|
else
|
||||||
obj.sync_by_id(id)
|
begin
|
||||||
|
obj.sync_by_id(id)
|
||||||
|
rescue => e
|
||||||
|
logger.error "Failed to call sync_by_id on obj"
|
||||||
|
logger.error e.message
|
||||||
|
logger.error e.backtrace.join("\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -139,12 +148,15 @@ class QboController < ApplicationController
|
|||||||
else
|
else
|
||||||
render nothing: true, status: 400
|
render nothing: true, status: 400
|
||||||
end
|
end
|
||||||
|
|
||||||
|
logger.info "Quickbooks webhook complete"
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Synchronizes the QboCustomer table with QBO
|
# Synchronizes the QboCustomer table with QBO
|
||||||
#
|
#
|
||||||
def sync
|
def sync
|
||||||
|
logger.info "Syncing EVERYTHING"
|
||||||
# Update info in background
|
# Update info in background
|
||||||
Thread.new do
|
Thread.new do
|
||||||
if Qbo.exists?
|
if Qbo.exists?
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -14,7 +14,11 @@ class VehiclesController < ApplicationController
|
|||||||
|
|
||||||
include AuthHelper
|
include AuthHelper
|
||||||
|
|
||||||
before_filter :require_user
|
before_action :require_user
|
||||||
|
|
||||||
|
def allowed_params
|
||||||
|
params.require(:vehicle).permit(:year, :make, :model, :customer_id, :notes, :vin)
|
||||||
|
end
|
||||||
|
|
||||||
# display a list of all vehicles
|
# display a list of all vehicles
|
||||||
def index
|
def index
|
||||||
@@ -26,6 +30,7 @@ class VehiclesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# search for a vehicle by vin
|
||||||
if params[:search]
|
if params[:search]
|
||||||
@vehicles = Vehicle.search(params[:search]).paginate(:page => params[:page])
|
@vehicles = Vehicle.search(params[:search]).paginate(:page => params[:page])
|
||||||
if only_one_non_zero?(@vehicles)
|
if only_one_non_zero?(@vehicles)
|
||||||
@@ -42,7 +47,7 @@ class VehiclesController < ApplicationController
|
|||||||
|
|
||||||
# create a new vehicle
|
# create a new vehicle
|
||||||
def create
|
def create
|
||||||
@vehicle = Vehicle.new(params[:vehicle])
|
@vehicle = Vehicle.new(allowed_params)
|
||||||
if @vehicle.save
|
if @vehicle.save
|
||||||
flash[:notice] = "New Vehicle Created"
|
flash[:notice] = "New Vehicle Created"
|
||||||
redirect_to @vehicle
|
redirect_to @vehicle
|
||||||
@@ -57,7 +62,9 @@ class VehiclesController < ApplicationController
|
|||||||
begin
|
begin
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
@vehicle = Vehicle.find_by_id(params[:id])
|
||||||
@vin = @vehicle.vin.scan(/.{1,9}/) if @vehicle.vin
|
@vin = @vehicle.vin.scan(/.{1,9}/) if @vehicle.vin
|
||||||
rescue ActiveRecord::RecordNotFound
|
@issues = @vehicle.issues.order(id: :desc)
|
||||||
|
@closed_issues = (@issues - @issues.open)
|
||||||
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -67,7 +74,7 @@ class VehiclesController < ApplicationController
|
|||||||
begin
|
begin
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
@vehicle = Vehicle.find_by_id(params[:id])
|
||||||
@customer = @vehicle.customer
|
@customer = @vehicle.customer
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -77,7 +84,7 @@ class VehiclesController < ApplicationController
|
|||||||
@customer = params[:customer]
|
@customer = params[:customer]
|
||||||
begin
|
begin
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
@vehicle = Vehicle.find_by_id(params[:id])
|
||||||
if @vehicle.update_attributes(params[:vehicle])
|
if @vehicle.update_attributes(allowed_params)
|
||||||
flash[:notice] = "Vehicle updated"
|
flash[:notice] = "Vehicle updated"
|
||||||
redirect_to @vehicle
|
redirect_to @vehicle
|
||||||
else
|
else
|
||||||
@@ -85,7 +92,7 @@ class VehiclesController < ApplicationController
|
|||||||
end
|
end
|
||||||
#show any errors anyways
|
#show any errors anyways
|
||||||
flash[:error] = @vehicle.errors.full_messages.to_sentence unless @vehicle.errors.empty?
|
flash[:error] = @vehicle.errors.full_messages.to_sentence unless @vehicle.errors.empty?
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -96,13 +103,15 @@ class VehiclesController < ApplicationController
|
|||||||
Vehicle.find_by_id(params[:id]).destroy
|
Vehicle.find_by_id(params[:id]).destroy
|
||||||
flash[:notice] = "Vehicle deleted successfully"
|
flash[:notice] = "Vehicle deleted successfully"
|
||||||
redirect_to action: :index
|
redirect_to action: :index
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# checks to see if there is only one item in an array
|
||||||
|
# @return true if array only has one item
|
||||||
def only_one_non_zero?( array )
|
def only_one_non_zero?( array )
|
||||||
found_non_zero = false
|
found_non_zero = false
|
||||||
array.each do |val|
|
array.each do |val|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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,7 +17,7 @@ class Customer < ActiveRecord::Base
|
|||||||
has_many :qbo_estimates
|
has_many :qbo_estimates
|
||||||
has_many :vehicles
|
has_many :vehicles
|
||||||
|
|
||||||
attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone, :phone_number
|
#attr_accessible :name, :notes, :email, :primary_phone, :mobile_phone, :phone_number
|
||||||
validates_presence_of :id, :name
|
validates_presence_of :id, :name
|
||||||
|
|
||||||
self.primary_key = :id
|
self.primary_key = :id
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
class CustomerToken < ActiveRecord::Base
|
class CustomerToken < ActiveRecord::Base
|
||||||
unloadable
|
unloadable
|
||||||
has_many :issues
|
has_many :issues
|
||||||
attr_accessible :token, :expires_at, :issue_id
|
#attr_accessible :token, :expires_at, :issue_id
|
||||||
validates_presence_of :expires_at, :issue_id
|
validates_presence_of :expires_at, :issue_id
|
||||||
before_create :generate_token
|
before_create :generate_token
|
||||||
|
|
||||||
|
|||||||
@@ -10,41 +10,57 @@
|
|||||||
|
|
||||||
class Qbo < ActiveRecord::Base
|
class Qbo < ActiveRecord::Base
|
||||||
unloadable
|
unloadable
|
||||||
validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at
|
#validates_presence_of :qb_token, :qb_secret, :company_id, :token_expires_at, :reconnect_token_at
|
||||||
|
validates_presence_of :token, :company_id, :expire
|
||||||
|
serialize :token
|
||||||
|
|
||||||
OAUTH_CONSUMER_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
|
OAUTH_CONSUMER_KEY = Setting.plugin_redmine_qbo['settingsOAuthConsumerKey']
|
||||||
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
|
OAUTH_CONSUMER_SECRET = Setting.plugin_redmine_qbo['settingsOAuthConsumerSecret']
|
||||||
|
|
||||||
|
#
|
||||||
|
# Getter for quickbooks OAuth2 client
|
||||||
|
#
|
||||||
def self.get_client
|
def self.get_client
|
||||||
oauth_params = {
|
oauth_params = {
|
||||||
site: "https://appcenter.intuit.com/connect/oauth2",
|
site: "https://appcenter.intuit.com/connect/oauth2",
|
||||||
authorize_url: "https://appcenter.intuit.com/connect/oauth2",
|
authorize_url: "https://appcenter.intuit.com/connect/oauth2",
|
||||||
token_url: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
|
token_url: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
|
||||||
}
|
}
|
||||||
return OAuth2::Client.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, oauth_params)
|
return OAuth2::Client.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, oauth_params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Getter for oauth consumer
|
||||||
|
#
|
||||||
def self.get_oauth_consumer
|
def self.get_oauth_consumer
|
||||||
# Quickbooks Config Info
|
# Quickbooks Config Info
|
||||||
return $qb_oauth_consumer
|
return $qb_oauth_consumer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
# Get a quickbooks base service object for type
|
# Get a quickbooks base service object for type
|
||||||
# @params type of base
|
# @params type of base
|
||||||
|
#
|
||||||
def self.get_base(type)
|
def self.get_base(type)
|
||||||
|
# lets getnourbold access token from the database
|
||||||
oauth2_client = get_client
|
oauth2_client = get_client
|
||||||
qbo = self.first
|
qbo = self.first
|
||||||
access_token = OAuth2::AccessToken.new(oauth2_client, qbo.qb_token , refresh_token: qbo.qb_secret)
|
access_token = OAuth2::AccessToken.from_hash(oauth2_client, qbo.token)
|
||||||
|
|
||||||
# check to see if we need to refest the token
|
# check to see if we need to refresh the acesstoken
|
||||||
#if qbo.expire.to_date.past?
|
if qbo.expire.to_time.utc.past?
|
||||||
# new_access_token_object = access_token.refresh!
|
puts "Updating access token"
|
||||||
# qbo.token = new_access_token_object
|
new_access_token_object = access_token.refresh!
|
||||||
# qbo.expire = 1.hour.from_now.utc
|
qbo.token = new_access_token_object.to_hash
|
||||||
# qbo.save!
|
qbo.expire = 1.hour.from_now.utc
|
||||||
# access_token = new_access_token_object
|
qbo.save!
|
||||||
#end
|
access_token = new_access_token_object
|
||||||
|
else
|
||||||
|
puts "Using current token"
|
||||||
|
end
|
||||||
|
|
||||||
|
# build the reqiested service
|
||||||
case type
|
case type
|
||||||
when :item
|
when :item
|
||||||
return Quickbooks::Service::Item.new(:company_id => qbo.company_id, :access_token => access_token)
|
return Quickbooks::Service::Item.new(:company_id => qbo.company_id, :access_token => access_token)
|
||||||
@@ -58,6 +74,8 @@ class Qbo < ActiveRecord::Base
|
|||||||
return Quickbooks::Service::Estimate.new(:company_id => qbo.company_id, :access_token => access_token)
|
return Quickbooks::Service::Estimate.new(:company_id => qbo.company_id, :access_token => access_token)
|
||||||
when :account
|
when :account
|
||||||
return Quickbooks::Service::Account.new(:company_id => qbo.company_id, :access_token => access_token)
|
return Quickbooks::Service::Account.new(:company_id => qbo.company_id, :access_token => access_token)
|
||||||
|
when :employee
|
||||||
|
return Quickbooks::Service:: Employee.new(:company_id => qbo.company_id, :access_token => access_token)
|
||||||
else
|
else
|
||||||
return access_token
|
return access_token
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
class QboEmployee < ActiveRecord::Base
|
class QboEmployee < ActiveRecord::Base
|
||||||
unloadable
|
unloadable
|
||||||
has_many :users
|
has_many :users
|
||||||
attr_accessible :name
|
#attr_accessible :name
|
||||||
validates_presence_of :id, :name
|
validates_presence_of :id, :name
|
||||||
|
|
||||||
def self.get_base
|
def self.get_base
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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,7 +13,7 @@ class QboEstimate < ActiveRecord::Base
|
|||||||
|
|
||||||
has_and_belongs_to_many :issues
|
has_and_belongs_to_many :issues
|
||||||
belongs_to :customer
|
belongs_to :customer
|
||||||
attr_accessible :doc_number, :id
|
#attr_accessible :doc_number, :id
|
||||||
validates_presence_of :doc_number, :id
|
validates_presence_of :doc_number, :id
|
||||||
self.primary_key = :id
|
self.primary_key = :id
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@ class QboEstimate < ActiveRecord::Base
|
|||||||
|
|
||||||
# sync all estimates
|
# sync all estimates
|
||||||
def self.sync
|
def self.sync
|
||||||
|
logger.debug "Syncing ALL estimates"
|
||||||
estimates = get_base.all
|
estimates = get_base.all
|
||||||
estimates.each { |estimate|
|
estimates.each { |estimate|
|
||||||
process_estimate(estimate)
|
process_estimate(estimate)
|
||||||
@@ -35,6 +36,7 @@ class QboEstimate < ActiveRecord::Base
|
|||||||
|
|
||||||
# sync only one estimate
|
# sync only one estimate
|
||||||
def self.sync_by_id(id)
|
def self.sync_by_id(id)
|
||||||
|
logger.debug "Syncing estimate #{id}"
|
||||||
process_estimate(get_base.fetch_by_id(id))
|
process_estimate(get_base.fetch_by_id(id))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -44,15 +46,56 @@ class QboEstimate < ActiveRecord::Base
|
|||||||
estimate = get_base.fetch_by_id(id)
|
estimate = get_base.fetch_by_id(id)
|
||||||
qbo_estimate = find_or_create_by(id: id)
|
qbo_estimate = find_or_create_by(id: id)
|
||||||
qbo_estimate.doc_number = estimate.doc_number
|
qbo_estimate.doc_number = estimate.doc_number
|
||||||
|
qbo_estimate.txn_date = estimate.txn_date
|
||||||
qbo_estimate.save!
|
qbo_estimate.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
# process an estimate into the database
|
# process an estimate into the database
|
||||||
def self.process_estimate(estimate)
|
def self.process_estimate(estimate)
|
||||||
|
logger.info "Processing estimate #{estimate.id}"
|
||||||
qbo_estimate = find_or_create_by(id: estimate.id)
|
qbo_estimate = find_or_create_by(id: estimate.id)
|
||||||
qbo_estimate.doc_number = estimate.doc_number
|
qbo_estimate.doc_number = estimate.doc_number
|
||||||
qbo_estimate.customer_id = estimate.customer_ref.value
|
qbo_estimate.customer_id = estimate.customer_ref.value
|
||||||
qbo_estimate.id = estimate.id
|
qbo_estimate.id = estimate.id
|
||||||
|
qbo_estimate.txn_date = estimate.txn_date
|
||||||
qbo_estimate.save!
|
qbo_estimate.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# download the pdf from quickbooks
|
||||||
|
def pdf
|
||||||
|
base = QboEstimate.get_base
|
||||||
|
estimate = base.fetch_by_id(id)
|
||||||
|
return base.pdf(estimate)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Magic Method
|
||||||
|
# Maps Get/Set methods to QBO estimate object
|
||||||
|
def method_missing(sym, *arguments)
|
||||||
|
# Check to see if the method exists
|
||||||
|
if Quickbooks::Model::Estimate.method_defined?(sym)
|
||||||
|
# download details if required
|
||||||
|
pull unless @details
|
||||||
|
method_name = sym.to_s
|
||||||
|
# Setter
|
||||||
|
if method_name[-1, 1] == "="
|
||||||
|
@details.method(method_name).call(arguments[0])
|
||||||
|
# Getter
|
||||||
|
else
|
||||||
|
return @details.method(method_name).call
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# pull the details
|
||||||
|
def pull
|
||||||
|
begin
|
||||||
|
raise Exception unless self.id
|
||||||
|
@details = Qbo.get_base(:estimate).fetch_by_id(self.id)
|
||||||
|
rescue Exception => e
|
||||||
|
@details = Quickbooks::Model::Estimate.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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,31 +10,32 @@
|
|||||||
|
|
||||||
class QboInvoice < ActiveRecord::Base
|
class QboInvoice < ActiveRecord::Base
|
||||||
unloadable
|
unloadable
|
||||||
|
|
||||||
has_and_belongs_to_many :issues
|
has_and_belongs_to_many :issues
|
||||||
belongs_to :customer
|
belongs_to :customer
|
||||||
attr_accessible :doc_number, :id
|
validates_presence_of :doc_number, :id, :customer_id, :txn_date
|
||||||
validates_presence_of :doc_number, :id
|
|
||||||
self.primary_key = :id
|
self.primary_key = :id
|
||||||
|
|
||||||
|
# Get the quickbooks-ruby base for invoice
|
||||||
def self.get_base
|
def self.get_base
|
||||||
Qbo.get_base(:invoice)
|
Qbo.get_base(:invoice)
|
||||||
end
|
end
|
||||||
|
|
||||||
# sync ALL the invoices
|
# sync ALL the invoices
|
||||||
def self.sync
|
def self.sync
|
||||||
|
logger.debug "Syncing all invoices"
|
||||||
last = Qbo.first.last_sync
|
last = Qbo.first.last_sync
|
||||||
|
|
||||||
query = "SELECT Id, DocNumber FROM Invoice"
|
query = "SELECT Id, DocNumber FROM Invoice"
|
||||||
query << " WHERE Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
|
query << " WHERE Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
|
||||||
|
|
||||||
|
# TODO actually do something with the above query
|
||||||
|
# .all() is never called since count is never initialized
|
||||||
if count == 0
|
if count == 0
|
||||||
invoices = get_base.all
|
invoices = get_base.all
|
||||||
else
|
else
|
||||||
invoices = get_base.query()
|
invoices = get_base.query()
|
||||||
end
|
end
|
||||||
|
|
||||||
# Update the invoice table
|
|
||||||
invoices.each { | invoice |
|
invoices.each { | invoice |
|
||||||
process_invoice invoice
|
process_invoice invoice
|
||||||
}
|
}
|
||||||
@@ -42,26 +43,23 @@ class QboInvoice < ActiveRecord::Base
|
|||||||
|
|
||||||
#sync by invoice ID
|
#sync by invoice ID
|
||||||
def self.sync_by_id(id)
|
def self.sync_by_id(id)
|
||||||
#update the information in the database
|
logger.debug "Syncing invoice #{id}"
|
||||||
invoice = get_base.fetch_by_id(id)
|
invoice = get_base.fetch_by_id(id)
|
||||||
process_invoice invoice
|
process_invoice invoice
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Attach the invoice to the issue
|
# Attach the invoice to the issue
|
||||||
def self.attach_to_issue(issue, invoice)
|
def self.attach_to_issue(issue, invoice)
|
||||||
return if issue.nil?
|
return if issue.nil?
|
||||||
|
|
||||||
# skip this issue if the issue customer is not the same as the invoice customer
|
# 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
|
return if issue.customer_id != invoice.customer_ref.value.to_i
|
||||||
|
|
||||||
# Load the invoice into the database
|
logger.debug "Attaching invoice #{invoice.id} to issue #{issue.id}"
|
||||||
|
|
||||||
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
|
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)
|
unless issue.qbo_invoices.include?(qbo_invoice)
|
||||||
issue.qbo_invoices << qbo_invoice
|
issue.qbo_invoices << qbo_invoice
|
||||||
@@ -71,9 +69,19 @@ class QboInvoice < ActiveRecord::Base
|
|||||||
compare_custom_fields(issue, invoice)
|
compare_custom_fields(issue, invoice)
|
||||||
end
|
end
|
||||||
|
|
||||||
# processes the invoice into the system
|
# processes the invoice into the database
|
||||||
def self.process_invoice(invoice)
|
def self.process_invoice(invoice)
|
||||||
# Check the private notes
|
logger.info "Processing invoice #{invoice.id}"
|
||||||
|
|
||||||
|
# Load the invoice into the database
|
||||||
|
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
|
||||||
|
qbo_invoice.doc_number = invoice.doc_number
|
||||||
|
qbo_invoice.id = invoice.id
|
||||||
|
qbo_invoice.customer_id = invoice.customer_ref
|
||||||
|
qbo_invoice.txn_date = invoice.txn_date
|
||||||
|
qbo_invoice.save!
|
||||||
|
|
||||||
|
# Scan the private notes for hashtags and attach to the applicable issues
|
||||||
if not invoice.private_note.nil?
|
if not invoice.private_note.nil?
|
||||||
invoice.private_note.scan(/#(\w+)/).flatten.each { |issue|
|
invoice.private_note.scan(/#(\w+)/).flatten.each { |issue|
|
||||||
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
|
attach_to_issue(Issue.find_by_id(issue.to_i), invoice)
|
||||||
@@ -90,22 +98,36 @@ class QboInvoice < ActiveRecord::Base
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# compares the custome fields on invoices & issues and updates the invoice as needed
|
||||||
|
#
|
||||||
|
# the issue here is when two or more issues share an invoice with the same custom field, but diffrent values
|
||||||
|
# this condions causes an infinite loop as the webhook is called when an invoice is updated
|
||||||
|
# TODO maybe add a cf_sync_confict flag to invoices
|
||||||
def self.compare_custom_fields(issue, invoice)
|
def self.compare_custom_fields(issue, invoice)
|
||||||
|
logger.debug "Comparing custom fields"
|
||||||
|
# TODO break if QboInvoice.find(invoice.id).cf_sync_confict
|
||||||
is_changed = false
|
is_changed = false
|
||||||
|
|
||||||
# update the invoive custom fields with infomation from the work ticket if available
|
# update the invoive custom fields with infomation from the issue if available
|
||||||
invoice.custom_fields.each { |cf|
|
invoice.custom_fields.each { |cf|
|
||||||
|
|
||||||
# TODO Add some hooks here
|
|
||||||
|
|
||||||
# VIN from the attached vehicle
|
# VIN from the attached vehicle
|
||||||
|
# TODO move this into seperate plugin
|
||||||
|
# TODO create hook for seperate plugin
|
||||||
begin
|
begin
|
||||||
if cf.name.eql? "VIN"
|
if cf.name.eql? "VIN"
|
||||||
vin = Vehicle.find(issue.vehicles_id).vin
|
# Only update if blank to prevent infite loops
|
||||||
break if vin.nil?
|
# TODO check cf_sync_confict flag once implemented
|
||||||
if not cf.string_value.to_s.eql? vin
|
if cf.string_value.to_s.blank?
|
||||||
cf.string_value = vin.to_s
|
logger.debug " VIN was blank, updating the invoice vin in quickbooks"
|
||||||
is_changed = true
|
vin = Vehicle.find(issue.vehicles_id).vin
|
||||||
|
break if vin.nil?
|
||||||
|
if not cf.string_value.to_s.eql? vin
|
||||||
|
cf.string_value = vin.to_s
|
||||||
|
logger.debug "VIN has changed"
|
||||||
|
is_changed = true
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
rescue
|
rescue
|
||||||
@@ -120,24 +142,9 @@ class QboInvoice < ActiveRecord::Base
|
|||||||
if not value.value.to_s.blank?
|
if not value.value.to_s.blank?
|
||||||
# Check to see if the value is diffrent
|
# Check to see if the value is diffrent
|
||||||
if not cf.string_value.to_s.eql? value.value.to_s
|
if not cf.string_value.to_s.eql? value.value.to_s
|
||||||
|
# update the custom field on the invoice
|
||||||
# Use the lowest Milage
|
cf.string_value = value.value.to_s
|
||||||
if cf.name.eql? "Mileage In"
|
is_changed = true
|
||||||
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
|
|
||||||
# Use the max milage
|
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
rescue
|
rescue
|
||||||
@@ -145,11 +152,45 @@ class QboInvoice < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO Add some hooks here
|
|
||||||
|
|
||||||
# Push updates
|
# Push updates
|
||||||
#invoice.sync_token += 1 if is_changed
|
begin
|
||||||
get_base.update(invoice) if is_changed
|
logger.debug "Trying to update invoice"
|
||||||
|
get_base.update(invoice) if is_changed
|
||||||
|
rescue
|
||||||
|
# Do nothing, probaly custome field sync confict on the invoice.
|
||||||
|
# This is a problem with how it's billed
|
||||||
|
# TODO Add notes in memo area
|
||||||
|
# TODO flag QboInvoice.cf_sync_confict here
|
||||||
|
logger.error "Failed to update invoice"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Magic Method
|
||||||
|
# Maps Get/Set methods to QBO invoice object
|
||||||
|
def method_missing(sym, *arguments)
|
||||||
|
# Check to see if the method exists
|
||||||
|
if Quickbooks::Model::Invoice.method_defined?(sym)
|
||||||
|
# download details if required
|
||||||
|
pull unless @details
|
||||||
|
method_name = sym.to_s
|
||||||
|
# Setter
|
||||||
|
if method_name[-1, 1] == "="
|
||||||
|
@details.method(method_name).call(arguments[0])
|
||||||
|
# Getter
|
||||||
|
else
|
||||||
|
return @details.method(method_name).call
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# pull the details from quickbooks
|
||||||
|
def pull
|
||||||
|
begin
|
||||||
|
raise Exception unless self.id
|
||||||
|
@details = Qbo.get_base(:invoice).fetch_by_id(self.id)
|
||||||
|
rescue Exception => e
|
||||||
|
@details = Quickbooks::Model::Invoice.new
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2020 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class QboPurchase < ActiveRecord::Base
|
|
||||||
unloadable
|
|
||||||
belongs_to :issues
|
|
||||||
belongs_to :qbo_customer
|
|
||||||
attr_accessible :description
|
|
||||||
validates_presence_of :id, :line_id, :description, :qbo_customer_id
|
|
||||||
|
|
||||||
def self.get_base
|
|
||||||
Qbo.get_base(:purchase)
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_purchase(id)
|
|
||||||
get_base.find_by_id(id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.sync
|
|
||||||
QboPurchase.get_base.all.each { |purchase|
|
|
||||||
|
|
||||||
purchase.line_items.all? { |line_item|
|
|
||||||
|
|
||||||
detail = line_item.account_based_expense_line_detail ? line_item.account_based_expense_line_detail : line_item.item_based_expense_line_detail
|
|
||||||
|
|
||||||
if detail.billable_status = "Billable"
|
|
||||||
qbo_purchase = find_or_create_by(id: purchase.id)
|
|
||||||
qbo_purchase.line_id = line_item.id
|
|
||||||
qbo_purchase.description = line_item.description
|
|
||||||
qbo_purchase.qbo_customer_id = detail.customer_ref
|
|
||||||
|
|
||||||
#TODO attach to issues
|
|
||||||
#qbo_purchase.issue_id = Issue.find_by_invoice()
|
|
||||||
|
|
||||||
qbo_purchase.save
|
|
||||||
end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -15,12 +15,9 @@ class Vehicle < ActiveRecord::Base
|
|||||||
belongs_to :customer
|
belongs_to :customer
|
||||||
has_many :issues, :foreign_key => 'vehicles_id'
|
has_many :issues, :foreign_key => 'vehicles_id'
|
||||||
|
|
||||||
attr_accessible :year, :make, :model, :customer_id, :notes, :vin
|
|
||||||
|
|
||||||
validates_presence_of :customer
|
validates_presence_of :customer
|
||||||
validates :vin, uniqueness: true
|
validates :vin, uniqueness: true
|
||||||
before_save :decode_vin
|
before_save :decode_vin
|
||||||
#after_find :get_details
|
|
||||||
|
|
||||||
self.primary_key = :id
|
self.primary_key = :id
|
||||||
|
|
||||||
@@ -34,35 +31,12 @@ class Vehicle < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# returns the raw JSON details from EMUNDS
|
# returns the raw JSON details from NHTSA
|
||||||
def details
|
def details
|
||||||
get_details if @details.nil?
|
get_details if @details.nil?
|
||||||
return @details
|
return @details
|
||||||
end
|
end
|
||||||
|
|
||||||
# returns the style of the vehicle
|
|
||||||
def style
|
|
||||||
get_details if @details.nil?
|
|
||||||
begin
|
|
||||||
return @details.trim if @details
|
|
||||||
rescue
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# returns the drive of the vehicle i.e. 2 wheel, 4 wheel, ect.
|
|
||||||
def drive
|
|
||||||
#todo fix this
|
|
||||||
#return @details.drive_type if @details
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
# returns the number of doors of the vehicle
|
|
||||||
def doors
|
|
||||||
get_details if @details.nil?
|
|
||||||
return @details.doors if @details
|
|
||||||
end
|
|
||||||
|
|
||||||
# Force Upper Case for make numbers
|
# Force Upper Case for make numbers
|
||||||
def make=(val)
|
def make=(val)
|
||||||
# The to_s is in case you get nil/non-string
|
# The to_s is in case you get nil/non-string
|
||||||
@@ -75,9 +49,8 @@ class Vehicle < ActiveRecord::Base
|
|||||||
write_attribute(:model, val.to_s.titleize)
|
write_attribute(:model, val.to_s.titleize)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Force Upper Case for VIN numbers
|
# Force Upper Case & strip VIN of all illegal chars (for barcode scanner)
|
||||||
def vin=(val)
|
def vin=(val)
|
||||||
#strip VIN of all illegal chars (for barcode scanner)
|
|
||||||
val = val.to_s.upcase.gsub(/[^A-HJ-NPR-Za-hj-npr-z\d]+/,"")
|
val = val.to_s.upcase.gsub(/[^A-HJ-NPR-Za-hj-npr-z\d]+/,"")
|
||||||
write_attribute(:vin, val)
|
write_attribute(:vin, val)
|
||||||
end
|
end
|
||||||
@@ -93,8 +66,10 @@ class Vehicle < ActiveRecord::Base
|
|||||||
if @details
|
if @details
|
||||||
begin
|
begin
|
||||||
self.year = @details.year unless @details.year.nil?
|
self.year = @details.year unless @details.year.nil?
|
||||||
self.make = @details.make unless @details.make.nil?
|
self.make = @details.make unless @details.make.nil?
|
||||||
self.model = @details.model unless @details.model.nil?
|
self.model = @details.model unless @details.model.nil?
|
||||||
|
self.doors = @details.doors unless @details.doors.nil?
|
||||||
|
self.trim = @details.trim unless @details.trim.nil?
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
errors.add(:vin, e.message)
|
errors.add(:vin, e.message)
|
||||||
end
|
end
|
||||||
@@ -102,17 +77,17 @@ class Vehicle < ActiveRecord::Base
|
|||||||
self.name = to_s
|
self.name = to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# init method to pull JSON details from Edmunds
|
# init method to pull JSON details from NHTSA
|
||||||
def get_details
|
def get_details
|
||||||
if self.vin?
|
if self.vin?
|
||||||
#validate the vin before calling a remote server
|
#validate the vin before calling a remote server
|
||||||
validation = NhtsaVin.validate(self.vin)
|
validation = NhtsaVin.validate(self.vin)
|
||||||
begin
|
begin
|
||||||
#if the vin validation failed, raise an exception and exit
|
#if the vin validation failed, raise an exception and exit
|
||||||
raise RuntimeError, validation.error unless validation.valid?
|
raise RuntimeError, validation.error unless validation.valid?
|
||||||
# query NHTSA for details on the vin
|
# query NHTSA for details on the vin
|
||||||
query = NhtsaVin.get(self.vin)
|
query = NhtsaVin.get(self.vin)
|
||||||
raise RuntimeError, query.error unless query.valid?
|
raise RuntimeError, query.error unless query.valid?
|
||||||
@details = query.response
|
@details = query.response
|
||||||
|
|||||||
@@ -1,54 +1,43 @@
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Email</th>
|
<th><%=t(:label_email)%></th>
|
||||||
<td><%= customer.email %></td>
|
<td><%= customer.email %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Primary Phone</th>
|
<th><%=t(:label_primary_phone)%></th>
|
||||||
<td><%= number_to_phone(customer.primary_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.primary_phone %></td>
|
<td><%= number_to_phone(customer.primary_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.primary_phone %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Mobile Phone</th>
|
<th><%=t(:label_mobile_phone)%></th>
|
||||||
<td><%= number_to_phone(customer.mobile_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.mobile_phone %></td>
|
<td><%= number_to_phone(customer.mobile_phone.gsub(/[^\d]/, '').to_i, area_code: true) if customer.mobile_phone %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Bill Address</th>
|
<th><%=t(:label_billing_address)%></th>
|
||||||
<td><%= customer.billing_address %></td>
|
<td><%= @billing_address %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Shipping Address</th>
|
<th><%=t(:label_shipping_address)%></th>
|
||||||
<td><%= customer.shipping_address %></td>
|
<td><%= @shipping_address %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Issues</th>
|
<th><%=t(:label_account_balance)%></th>
|
||||||
<td><%= customer.issues.count %></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th>Account Balance</th>
|
|
||||||
<td>$<%= customer.balance %></td>
|
<td>$<%= customer.balance %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Balance With Jobs</th>
|
<th><%=t(:field_notes)%></th>
|
||||||
<td>$<%= customer.balance_with_jobs %></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th>Notes</th>
|
|
||||||
<td><%= customer.notes %></td>
|
<td><%= customer.notes %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<%= button_to "Edit Customer", edit_customer_path(customer), method: :get%>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div style="float: right;">
|
||||||
|
<%= button_to t(:label_edit_customer), edit_customer_path(customer), method: :get%>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|||||||
@@ -5,35 +5,35 @@
|
|||||||
<%= form_for @customer do |f| %>
|
<%= form_for @customer do |f| %>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Display Name:
|
<%=t(:label_display_name)%>
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.text_field :name, :required => true %>
|
<%= f.text_field :name, :required => true, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Phone Number:
|
<%=t(:label_primary_phone)%>
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.telephone_field :primary_phone %>
|
<%= f.telephone_field :primary_phone, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Mobile Phone Number:
|
<%=t(:label_mobile_phone)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.telephone_field :mobile_phone %>
|
<%= f.telephone_field :mobile_phone, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Email:
|
<%=t(:label_email)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.email_field :email %>
|
<%= f.email_field :email, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Notes:
|
<%=t(:field_notes)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<p>
|
<p>
|
||||||
<%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @customer.new_record? %>
|
<%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @customer.new_record? %>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<%= form_tag(customers_path, :method => "get", id: "search-form") do %>
|
<%= form_tag(customers_path, :method => "get", id: "search-form") do %>
|
||||||
<%= text_field_tag :search, params[:search], placeholder: "Search Customers" %>
|
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_customers), :autocomplete => "off" %>
|
||||||
<%= submit_tag "Search" %>
|
<%= submit_tag t(:label_search) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= button_to "New Customer", new_customer_path, method: :get%>
|
<%= button_to t(:label_new_customer), new_customer_path, method: :get%>
|
||||||
<%= button_to "Sync", qbo_sync_path, method: :get%>
|
<%= button_to(t(:label_sync), qbo_sync_path, method: :get) if User.current.admin?%>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
<h3>Customers</h3>
|
<h3><%=t(:label_customers)%></h3>
|
||||||
<%= render :partial => 'customers/search' %>
|
<%= render :partial => 'customers/search' %>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<h1>Edit Customer</h1>
|
<h1><%=t(:label_edit_customer)%></h1>
|
||||||
<br/>
|
<br/>
|
||||||
<%= render :partial => 'customers/form' %>
|
<%= render :partial => 'customers/form' %>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<h2>Customers <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
<h2><%=t(:field_customers)%> <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
||||||
<% if @customers.present? %>
|
<% if @customers.present? %>
|
||||||
<br/>
|
<br/>
|
||||||
<% @customers.each do |c| %>
|
<% @customers.each do |c| %>
|
||||||
@@ -9,14 +9,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<p>Matching <%= @customers.count %> Customers </p>
|
<p><%=t(:label_matching)%> <%= @customers.count %> <%=t(:field_customers)%> </p>
|
||||||
|
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<%= will_paginate @customers %>
|
<%= will_paginate @customers %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<p>There are no customers containing the term(s) <%= params[:search] %>.</p>
|
<p><%=t(:label_no_customers)%> <%= params[:search] %>.</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<h2>New Customer</h2>
|
<h2><%=t(:label_new_customer)%></h2>
|
||||||
<br/>
|
<br/>
|
||||||
<%= render :partial => 'customers/form' %>
|
<%= render :partial => 'customers/form' %>
|
||||||
|
|||||||
@@ -1,24 +1,42 @@
|
|||||||
<h2>Customer #<%= @customer.id %> - <%= @customer.name %> </h2>
|
<h2><%=t(:field_customer)%> #<%= @customer.id %> - <%= @customer.name %> </h2>
|
||||||
<br/>
|
<div class="issue">
|
||||||
|
|
||||||
<div class="subject">
|
|
||||||
<div><h3>Details:</h3></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="attributes">
|
|
||||||
|
|
||||||
<div class="splitcontent">
|
<div class="splitcontent">
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
|
|
||||||
|
<h4><%=t(:label_details)%>:</h4>
|
||||||
|
|
||||||
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
|
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
|
||||||
|
|
||||||
|
<div class="splitcontent">
|
||||||
|
<div class="splitcontentleft">
|
||||||
|
<h4><%=t(:estimates)%>:</h4>
|
||||||
|
<%= render :partial => 'estimates/list', locals: {customer: @customer} %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="splitcontentleft">
|
||||||
|
<h4><%=t(:label_invoices)%>:</h4>
|
||||||
|
<%= render :partial => 'invoices/list', locals: {customer: @customer} %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<h4>Vehicles:</h4>
|
<h4><%=t(:field_vehicles)%>:</h4>
|
||||||
<%= render :partial => 'vehicles/list' %>
|
<%= render :partial => 'vehicles/list' %>
|
||||||
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
|
<div style="float: right;">
|
||||||
|
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br/>
|
|
||||||
<h2>Issues:</h2>
|
|
||||||
<%= render :partial => 'issues/list_simple', locals: {issues: @issues} %>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<h3><%=@issues.open.count%> <%=t(:label_open_issues)%>:</h3>
|
||||||
|
<%= render :partial => 'issues/list_simple', locals: {issues: @issues.open} %>
|
||||||
|
|
||||||
|
<h3><%=@closed_issues.count%> <%=t(:label_closed_issues)%>:</h3>
|
||||||
|
<%= render :partial => 'issues/list_simple', locals: {issues: @closed_issues} %>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<div class="subject">
|
<div class="subject">
|
||||||
<%= render_issue_subject_with_tree(@issue) %>
|
<%= render_issue_subject_with_tree(@issue) %>
|
||||||
This customer link expires in <%= distance_of_time_in_words(Time.now, @token.expires_at) %>
|
<%=t(:label_customer_link_expires)%> <%= distance_of_time_in_words(Time.now, @token.expires_at) %>
|
||||||
</div>
|
</div>
|
||||||
<p class="author">
|
<p class="author">
|
||||||
<%= authoring @issue.created_on, @issue.author %>.
|
<%= authoring @issue.created_on, @issue.author %>.
|
||||||
|
|||||||
11
app/views/estimates/_list.html.erb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<% if @customer.present? %>
|
||||||
|
|
||||||
|
<% @customer.qbo_estimates.order(doc_number: :desc).each do |estimate| %>
|
||||||
|
<div class="row">
|
||||||
|
<b><%= link_to "##{estimate.doc_number}", estimate_path(estimate), target: :_blank %></b> <%= estimate.txn_date %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% else %>
|
||||||
|
<p><%=t(:label_no_estimates)%>.</p>
|
||||||
|
<% end %>
|
||||||
4
app/views/estimates/_search.html.erb
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<%= form_tag("/qbo/estimate/doc", :method => "get", id: "est-search-form") do %>
|
||||||
|
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_estimates), :autocomplete => "off" %>
|
||||||
|
<%= submit_tag t(:label_search), :formtarget => "_blank" %>
|
||||||
|
<% end %>
|
||||||
2
app/views/estimates/_sidebar.html.erb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<h3><%=t(:label_estimates) %></h3>
|
||||||
|
<%= render :partial => 'estimates/search' %>
|
||||||
11
app/views/invoices/_list.html.erb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<% if @customer.present? %>
|
||||||
|
|
||||||
|
<% @customer.qbo_invoices.order(doc_number: :desc).each do |invoice| %>
|
||||||
|
<div class="row">
|
||||||
|
<b><%= link_to "##{invoice.doc_number}", invoice_path(invoice), target: :_blank %></b> <%= invoice.txn_date %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% else %>
|
||||||
|
<p><%=t(:label_no_invoices)%>.</p>
|
||||||
|
<% end %>
|
||||||
35
app/views/issues/_history.html.erb
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<% reply_links = issue.notes_addable? -%>
|
||||||
|
<% for journal in journals %>
|
||||||
|
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
|
||||||
|
<div id="note-<%= journal.indice %>">
|
||||||
|
<div class="contextual">
|
||||||
|
<span class="journal-actions"><%= render_journal_actions(issue, journal, :reply_links => reply_links) %></span>
|
||||||
|
<a href="#note-<%= journal.indice %>" class="journal-link">#<%= journal.indice %></a>
|
||||||
|
</div>
|
||||||
|
<h4>
|
||||||
|
<%= avatar(journal.user, :size => "24") %>
|
||||||
|
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %>
|
||||||
|
<%= render_private_notes_indicator(journal) %>
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<% if journal.details.any? %>
|
||||||
|
<ul class="details">
|
||||||
|
<% details_to_strings(journal.visible_details).each do |string| %>
|
||||||
|
<li><%= string %></li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<% if Setting.thumbnails_enabled? && (thumbnail_attachments = journal_thumbnail_attachments(journal)).any? %>
|
||||||
|
<div class="thumbnails">
|
||||||
|
<% thumbnail_attachments.each do |attachment| %>
|
||||||
|
<div><%= thumbnail_tag(attachment) %></div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<%= render_notes(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<%= call_hook(:view_issues_history_journal_bottom, { :journal => journal }) %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% heads_for_wiki_formatter if User.current.allowed_to?(:edit_issue_notes, issue.project) || User.current.allowed_to?(:edit_own_issue_notes, issue.project) %>
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<div class="row">
|
|
||||||
<div class="span6 columns">
|
|
||||||
<fieldset>
|
|
||||||
|
|
||||||
<%= form_for @payment do |f| %>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
Customer:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.collection_select :customer_id, @customers, :id, :name, include_blank: true, :selected => @customer, :required => true%>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
Deposit to Account:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.collection_select :account_id, @accounts, :id, :name, include_blank: true, :selected => @account, :required => true%>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
Payment Method:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.collection_select :payment_method_id, @payment_methods, :id, :name, include_blank: true, :selected => @payment_method, :required => true%>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
Amount:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.number_field :total_amount %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="actions">
|
|
||||||
<%= f.submit %>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
</fieldset>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<h1>New Payment</h1>
|
|
||||||
<br/>
|
|
||||||
<%= render :partial => 'payments/form' %>
|
|
||||||
@@ -1 +1 @@
|
|||||||
<%= flash.now[:error] = "Not Authorized" %>
|
<%= flash.now[:error] = t(:label_401) %>
|
||||||
|
|||||||
@@ -1,34 +1,34 @@
|
|||||||
<div class="splitcontent">
|
<div class="splitcontent">
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<div class="customer_id attribute">
|
<div class="customer_id attribute">
|
||||||
<div class="label"><span>Customer</span>:</div>
|
<div class="label"><span><%=t(:field_customer)%></span>:</div>
|
||||||
<div class="value"><%= customer %></div>
|
<div class="value"><%= customer %></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="qbo_estimate_id attribute">
|
<div class="qbo_estimate_id attribute">
|
||||||
<div class="label"><span>Estimate</span>:</div>
|
<div class="label"><span><%=t(:field_qbo_estimate)%></span>:</div>
|
||||||
<div class="value"><%= estimate_link %></div>
|
<div class="value"><%= estimate_link %></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="qbo_invoice_id attribute">
|
<div class="qbo_invoice_id attribute">
|
||||||
<div class="label"><span>Invoice</span>:</div>
|
<div class="label"><span><%=t(:field_qbo_invoice)%></span>:</div>
|
||||||
<div class="value"><%= invoice_link %></div>
|
<div class="value"><%= invoice_link %></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<div class="vehicle attribute">
|
<div class="vehicle attribute">
|
||||||
<div class="label"><span>Vehicle</span>:</div>
|
<div class="label"><span><%=t(:field_vehicle)%></span>:</div>
|
||||||
<div class="value"><%= vehicle %></div>
|
<div class="value"><%= vehicle %></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="vehicle_vin attribute">
|
<div class="vehicle_vin attribute">
|
||||||
<div class="label"><span>VIN</span>:</div>
|
<div class="label"><span><%=t(:field_vin)%></span>:</div>
|
||||||
<div class="value"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></div>
|
<div class="value"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="vehicle_notes attribute">
|
<div class="vehicle_notes attribute">
|
||||||
<div class="label"><span>Notes</span>:</div>
|
<div class="label"><span><%=t(:field_notes)%></span>:</div>
|
||||||
<div class="value"><%=notes%></div>
|
<div class="value"><%=notes%></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
<b><%=t(:label_last_sync)%>: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 rick barrette
|
Copyright (c) 2020 rick barrette
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
@@ -15,14 +15,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
<!-- configure the Intuit object: 'grantUrl' is a URL in your application which kicks off the flow, see below -->
|
<!-- configure the Intuit object: 'grantUrl' is a URL in your application which kicks off the flow, see below -->
|
||||||
<script>
|
<script>
|
||||||
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_authenticate_url %>'});
|
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= Setting.host_name %>/qbo/authenticate'});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<table >
|
<table >
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Intuit QBO OAuth Consumer Key</th>
|
<th><%=t(:label_client_id)%></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" style="width:350px" id="settingsOAuthConsumerKey"
|
<input type="text" style="width:350px" id="settingsOAuthConsumerKey"
|
||||||
value="<%= settings['settingsOAuthConsumerKey'] %>"
|
value="<%= settings['settingsOAuthConsumerKey'] %>"
|
||||||
@@ -31,7 +31,7 @@ intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_au
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Intuit QBO OAuth Consumer Secret</th>
|
<th><%=t(:label_client_secret)%></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" style="width:350px" id="settingsOAuthConsumerSecret"
|
<input type="text" style="width:350px" id="settingsOAuthConsumerSecret"
|
||||||
value="<%= settings['settingsOAuthConsumerSecret'] %>"
|
value="<%= settings['settingsOAuthConsumerSecret'] %>"
|
||||||
@@ -40,7 +40,7 @@ intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_au
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Intuit QBO Webhook Token</th>
|
<th><%=t(:label_webhook_token)%></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" style="width:350px" id="settingsWebhookToken"
|
<input type="text" style="width:350px" id="settingsWebhookToken"
|
||||||
value="<%= settings['settingsWebhookToken'] %>"
|
value="<%= settings['settingsWebhookToken'] %>"
|
||||||
@@ -49,20 +49,15 @@ intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= qbo_au
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Token Expires At</th>
|
<th><%=t(:label_oauth_expires)%></th>
|
||||||
<td><%= if Qbo.exists? then Qbo.first.token_expires_at end %>
|
<td><%= if Qbo.exists? then Qbo.first.expire end %>
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th>Reconnect Token At</th>
|
|
||||||
<td><%= if Qbo.exists? then Qbo.first.reconnect_token_at end %>
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
Note: You need to authenticate after saving your key and secret above
|
<%=t(:label_oauth_note)%>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
@@ -73,27 +68,27 @@ Note: You need to authenticate after saving your key and secret above
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Customer Count:</b> <%= Customer.count%>
|
<b><%=t(:label_customer_count)%>:</b> <%= Customer.count%>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Item Count:</b> <%= QboItem.count %>
|
<b><%=t(:label_item_count)%>:</b> <%= QboItem.count %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Employee Count:</b> <%= QboEmployee.count %>
|
<b><%=t(:label_employee_count)%>:</b> <%= QboEmployee.count %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Invoice Count:</b> <%= QboInvoice.count %>
|
<b><%=t(:label_invoice_count)%>:</b> <%= QboInvoice.count %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Estimate Count:</b> <%= QboEstimate.count %>
|
<b><%=t(:label_estimate_count)%>:</b> <%= QboEstimate.count %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %> <%= link_to " Sync Now", qbo_sync_path %>
|
<b><%=t(:label_last_sync)%> </b> <%= Qbo.last_sync if Qbo.exists? %> <%= link_to " Sync Now", qbo_sync_path %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
6
app/views/qbo/_sidebar.html.erb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<% if User.current.logged? %>
|
||||||
|
|
||||||
|
<%= render :partial => 'customers/sidebar' %>
|
||||||
|
<%= render :partial => 'estimates/sidebar' %>
|
||||||
|
|
||||||
|
<% end %>
|
||||||
@@ -1 +1 @@
|
|||||||
<%= Customer.count %> Customers - <%= render :partial => 'qbo/last_sync' %>
|
<%= Customer.count %> <%=t(:field_customers)%> - <%= render :partial => 'qbo/last_sync' %>
|
||||||
|
|||||||
@@ -30,4 +30,3 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= authenticate_vendors_url %>'});
|
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '<%= authenticate_vendors_url %>'});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -11,32 +11,32 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1> Redmine Quickbooks</h1>
|
<h1><%=t(:label_redmine_qbo)%></h1>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Customer Count:</b> <%= @customer_count.to_s%>
|
<b><%=t(:label_customer_count)%>:</b> <%= @customer_count.to_s%>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Item Count:</b> <%= @qbo_item_count.to_s %>
|
<b><%=t(:label_item_count)%>:</b> <%= @qbo_item_count.to_s %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Employee Count:</b> <%= @qbo_employee_count.to_s %>
|
<b><%=t(:label_employee_count)%>:</b> <%= @qbo_employee_count.to_s %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Invoice Count:</b> <%= @qbo_invoice_count.to_s %>
|
<b><%=t(:label_invoice_count)%>:</b> <%= @qbo_invoice_count.to_s %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Estimate Count:</b> <%= @qbo_estimate_count.to_s %>
|
<b><%=t(:label_estimate_count)%>:</b> <%= @qbo_estimate_count.to_s %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<b>Last Sync: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
<b><%=t(:label_last_sync)%>: </b> <%= Qbo.last_sync if Qbo.exists? %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,38 +1,45 @@
|
|||||||
<table>
|
<div class="issue">
|
||||||
<tbody>
|
<div class="splitcontent">
|
||||||
|
<div class="splitcontentleft">
|
||||||
|
<h4><%=t(:label_details)%>:</h4>
|
||||||
|
|
||||||
<tr>
|
<table>
|
||||||
<th>Customer</th>
|
<tbody>
|
||||||
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Vehicle</th>
|
<th><%= t(:field_customer)%></th>
|
||||||
<td><%= vehicle.to_s %></td>
|
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>VIN</th>
|
<th><%= t(:field_vehicle) %></th>
|
||||||
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td>
|
<td><%= vehicle.to_s %></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Notes</th>
|
<th><%= t(:field_vin) %></th>
|
||||||
<td><%= vehicle.notes %></td>
|
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<th><%= t(:label_trim) %></th>
|
||||||
<th>Issues</th>
|
<td><%= vehicle.doors %> <%=t(:label_door) if vehicle.doors? %> <%= vehicle.trim %></td>
|
||||||
<td><%= vehicle.issues.count %></td>
|
</tr>
|
||||||
</tr>
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
<tr>
|
</div>
|
||||||
<td/>
|
|
||||||
<td>
|
|
||||||
|
|
||||||
<%= button_to "Edit", edit_vehicle_path(vehicle), method: :get%>
|
<div class="splitcontentleft">
|
||||||
<%= button_to "Delete", vehicle, method: :delete, data: {confirm: "You sure?"} %>
|
|
||||||
</td>
|
<h4><%=t(:field_notes)%>:</h4>
|
||||||
</tr>
|
<td><%= vehicle.notes %></td>
|
||||||
</tbody>
|
</tr>
|
||||||
</table>
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="float: right;">
|
||||||
|
<%= button_to t(:label_edit), edit_vehicle_path(vehicle), method: :get%>
|
||||||
|
<%= button_to t(:label_delete), vehicle, method: :delete, data: {confirm: t(:warn_ru_sure)} %>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -4,43 +4,43 @@
|
|||||||
|
|
||||||
<%= form_for @vehicle do |f| %>
|
<%= form_for @vehicle do |f| %>
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Customer:
|
<%=t(:field_customer)%>:
|
||||||
<div class="input">
|
<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.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 %>
|
<%= f.hidden_field :customer_id, :id => "customer_id", :value => @customer.id %>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
Year:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.number_field :year %>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Make:
|
<%=t(:label_year)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.text_field :make %>
|
<%= f.number_field :year, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Model:
|
<%=t(:label_make)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.text_field :model %>
|
<%= f.text_field :make, :autocomplete => "off" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
VIN:
|
<%=t(:label_model)%>:
|
||||||
|
<div class="input">
|
||||||
|
<%= f.text_field :model, :autocomplete => "off" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clearfix">
|
||||||
|
<%=t(:field_vin)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.text_field :vin , :autofocus => true %>
|
<%= f.text_field :vin , :autofocus => true %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clearfix">
|
<div class="clearfix">
|
||||||
Notes:
|
<%=t(:field_notes)%>:
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %>
|
<%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<br/>
|
<br/>
|
||||||
<%= vehicle.customer %>
|
<%= vehicle.customer %>
|
||||||
<br/>
|
<br/>
|
||||||
<%= vehicle.vin %>
|
<%= vehicle.vin.scan(/.{1,9}/)[0] if vehicle.vin %><b><%=vehicle.vin.scan(/.{1,9}/)[1] if vehicle.vin%></b>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br/>
|
<br/>
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
<%= will_paginate @vehicles %>
|
<%= will_paginate @vehicles %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>Matching <%= @vehicles.count %> Vehicles </p>
|
<p><%=t(:label_matching)%> <%=@vehicles.count%> <%=t(:field_vehicles) %> </p>
|
||||||
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<p>There are no vehicles containing the term(s) <%= params[:search] %>.</p>
|
<p><%=t(:label_no_vehicles)%> <%= params[:search] %>.</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
|
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
|
||||||
<%= text_field_tag :search, params[:search], placeholder: "Search Vehicles by VIN" %>
|
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_vin), :autocomplete => "off" %>
|
||||||
<%= submit_tag "Search" %>
|
<%= submit_tag t(:label_search) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<h1>Edit Customer Vehicle</h1>
|
<h1><%=t(:label_edit_customer_vehicle)%></h1>
|
||||||
<br/>
|
<br/>
|
||||||
<%= render :partial => 'vehicles/form' %>
|
<%= render :partial => 'vehicles/form' %>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<h2>Customer Vehicles <span style="float:right"> <%= render :partial => 'vehicles/search' %> </span> </h2>
|
<h2><%=t(:label_cusomer_vehicles)%> <span style="float:right"> <%= render :partial => 'vehicles/search' %> </span> </h2>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<%= render :partial => 'vehicles/list' %>
|
<%= render :partial => 'vehicles/list' %>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<h2>New Customer Vehicle</h2>
|
<h2><%=t(:label_new_vehicle)%></h2>
|
||||||
<br/>
|
<br/>
|
||||||
<%= render :partial => 'vehicles/form' %>
|
<%= render :partial => 'vehicles/form' %>
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
<h2>Vehicle #<%=@vehicle.id%> <span style="float:right"> <%= render :partial => 'customers/search' %> </span> </h2>
|
<h2><%=t(:field_vehicle)%> #<%=@vehicle.id%></h2>
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div style="text-align: left; width:90%;">
|
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
|
||||||
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
|
|
||||||
|
|
||||||
<%= render :partial => 'issues/list_simple', locals: {issues: @vehicle.issues} %>
|
<h3><%=@issues.open.count%> <%=t(:label_open_issues)%></h3>
|
||||||
</div>
|
|
||||||
|
<%= render :partial => 'issues/list_simple', locals: {issues: @issues.open} %>
|
||||||
|
|
||||||
|
<h3><%=@closed_issues.count%> <%=t(:label_closed_issues)%></h3>
|
||||||
|
|
||||||
|
<%= render :partial => 'issues/list_simple', locals: {issues: (@closed_issues)} %>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
# English strings go here for Rails i18n
|
# English strings go here for Rails i18n
|
||||||
|
# Usage t(:label)
|
||||||
en:
|
en:
|
||||||
# my_label: "My label"
|
# my_label: "My label"
|
||||||
field_customer: "Customer"
|
field_customer: "Customer"
|
||||||
@@ -16,9 +17,67 @@ en:
|
|||||||
field_qbo_employee: "Employee"
|
field_qbo_employee: "Employee"
|
||||||
field_qbo_invoice: "Invoice"
|
field_qbo_invoice: "Invoice"
|
||||||
field_qbo_estimate: "Estimate"
|
field_qbo_estimate: "Estimate"
|
||||||
field_vehicles: "Vehicle"
|
field_vehicles: "Vehicles"
|
||||||
field_vehicle: "Vehicle"
|
field_vehicle: "Vehicle"
|
||||||
field_vin: "VIN"
|
field_vin: "VIN"
|
||||||
field_notes: "Notes"
|
field_notes: "Notes"
|
||||||
field_qbo_billed: "Billed"
|
field_qbo_billed: "Billed"
|
||||||
label_week: "Week"
|
label_week: "Week"
|
||||||
|
label_search_estimates: "Search Estimates"
|
||||||
|
label_search: "Search"
|
||||||
|
label_estimates: "Estimates"
|
||||||
|
label_401: "Not Authorized"
|
||||||
|
warn_ru_sure: "You sure?"
|
||||||
|
label_delete: "Delete"
|
||||||
|
label_edit: "Edit"
|
||||||
|
label_year: "Year"
|
||||||
|
label_make: " Make"
|
||||||
|
label_model: "Model"
|
||||||
|
label_no_vehicles: "There are no vehicles containing the term(s)"
|
||||||
|
label_no_customers: "There are no customers containing the term(s)"
|
||||||
|
label_matching: "Matching "
|
||||||
|
label_search_vin: "Search Vehicles by VIN"
|
||||||
|
label_edit_customer_vehicle: "Edit Customer Vehicle"
|
||||||
|
label_cusomer_vehicles: "Customer Vehicles"
|
||||||
|
label_new_vehicle: "New Customer Vehicle"
|
||||||
|
label_open_issues: "Open Issues"
|
||||||
|
label_closed_issues: "Closed Issues"
|
||||||
|
label_sync: "Sync"
|
||||||
|
label_new_customer: "New Customer"
|
||||||
|
label_search_customers: "Search Customers"
|
||||||
|
label_customers: "Customers"
|
||||||
|
label_edit_customer: "Edit Customer"
|
||||||
|
label_email: "Email"
|
||||||
|
label_primary_phone: "Primary Phone"
|
||||||
|
label_mobile_phone: "Mobile Phone"
|
||||||
|
label_billing_address: "Billing Address"
|
||||||
|
label_shipping_address: "Shipping Address"
|
||||||
|
label_account_balance: "Account Balance"
|
||||||
|
label_balance_with_jobs: "Balance With Jobs"
|
||||||
|
label_display_name: "Display Name"
|
||||||
|
label_details: "Details"
|
||||||
|
label_customer_link_expires: "This customer link expires in"
|
||||||
|
label_new_payment: "New Payment"
|
||||||
|
label_amount: "Amount"
|
||||||
|
label_payment_method: "Payment Method"
|
||||||
|
label_deposit_into: "Deposit to Account"
|
||||||
|
label_last_sync: "Last Sync"
|
||||||
|
label_redmine_qbo: "Redmine Quickbooks"
|
||||||
|
label_customer_count: "Customer Count"
|
||||||
|
label_invoice_count: "Invoice Count"
|
||||||
|
label_estimate_count: "Estimate Count"
|
||||||
|
label_item_count: "Item Count"
|
||||||
|
label_employee_count: "Employee Count"
|
||||||
|
label_client_id: "Intuit QBO OAuth2 Client ID"
|
||||||
|
label_client_secret: "Intuit QBO OAuth2 Client Secret"
|
||||||
|
label_webhook_token: "Intuit QBO Webhook Token"
|
||||||
|
label_oauth_expires: "OAuth2 Access Token Expires At"
|
||||||
|
label_oauth_note: "Note: You need to authenticate with Quickbooks after saving your key and secret above"
|
||||||
|
field_customers: "Customers"
|
||||||
|
label_no_estimates: "No Estimates"
|
||||||
|
label_no_invoices: "No Invoices"
|
||||||
|
label_invoices: "Invoices"
|
||||||
|
label_load_customer: "Load Customer"
|
||||||
|
label_door: "Door"
|
||||||
|
label_trim: "Trim"
|
||||||
|
|
||||||
@@ -20,6 +20,7 @@ get 'qbo/sync', :to => 'qbo#sync'
|
|||||||
|
|
||||||
# Estimate & Invoice PDF
|
# Estimate & Invoice PDF
|
||||||
get 'qbo/estimate/:id', :to => 'estimate#show', as: :estimate
|
get 'qbo/estimate/:id', :to => 'estimate#show', as: :estimate
|
||||||
|
get 'qbo/estimate/doc/:id', :to => 'estimate#doc', as: :estimate_doc
|
||||||
get 'qbo/invoice/:id', :to => 'invoice#show', as: :invoice
|
get 'qbo/invoice/:id', :to => 'invoice#show', as: :invoice
|
||||||
|
|
||||||
#manual billing
|
#manual billing
|
||||||
@@ -47,3 +48,5 @@ end
|
|||||||
|
|
||||||
#allow for just vehicles too
|
#allow for just vehicles too
|
||||||
resources :vehicles
|
resources :vehicles
|
||||||
|
|
||||||
|
#resources :qbo_estimates
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQbos < ActiveRecord::Migration
|
class CreateQbos < ActiveRecord::Migration[5.1]
|
||||||
|
|
||||||
def change
|
def change
|
||||||
create_table :qbos do |t|
|
create_table :qbos do |t|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboCustomers < ActiveRecord::Migration
|
class CreateQboCustomers < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_customers, id: false do |t|
|
create_table :qbo_customers, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateIssues < ActiveRecord::Migration
|
class UpdateIssues < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :issues, :qbo_customer, index: true
|
add_reference :issues, :qbo_customer, index: true
|
||||||
add_reference :issues, :qbo_item, index: true
|
add_reference :issues, :qbo_item, index: true
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboItems < ActiveRecord::Migration
|
class CreateQboItems < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_items, id: false do |t|
|
create_table :qbo_items, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboEmployees < ActiveRecord::Migration
|
class CreateQboEmployees < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_employees, id: false do |t|
|
create_table :qbo_employees, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateUsers < ActiveRecord::Migration
|
class UpdateUsers < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :users, :qbo_employee, index: true
|
add_reference :users, :qbo_employee, index: true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateTimeEntries < ActiveRecord::Migration
|
class UpdateTimeEntries < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_column :time_entries, :qbo_billed, :boolean, :default => false
|
add_column :time_entries, :qbo_billed, :boolean, :default => false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboEstimates < ActiveRecord::Migration
|
class CreateQboEstimates < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_estimates, id: false do |t|
|
create_table :qbo_estimates, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateQbos < ActiveRecord::Migration
|
class UpdateQbos < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
rename_column :qbos, :token, :qb_token
|
rename_column :qbos, :token, :qb_token
|
||||||
rename_column :qbos, :secret, :qb_secret
|
rename_column :qbos, :secret, :qb_secret
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateIssuesWithEstimates < ActiveRecord::Migration
|
class UpdateIssuesWithEstimates < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :issues, :qbo_estimate, index: true
|
add_reference :issues, :qbo_estimate, index: true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboInvoices < ActiveRecord::Migration
|
class CreateQboInvoices < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_invoices, id: false do |t|
|
create_table :qbo_invoices, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateIssuesWithInvoices< ActiveRecord::Migration
|
class UpdateIssuesWithInvoices< ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :issues, :qbo_invoice, index: true
|
add_reference :issues, :qbo_invoice, index: true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateQboPurchases< ActiveRecord::Migration
|
class CreateQboPurchases< ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :qbo_purchases, id: false do |t|
|
create_table :qbo_purchases, id: false do |t|
|
||||||
t.integer :id, :options => 'PRIMARY KEY'
|
t.integer :id, :options => 'PRIMARY KEY'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateCustomers < ActiveRecord::Migration
|
class UpdateCustomers < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :qbo_customers, :qbo_purchase, index: true
|
add_reference :qbo_customers, :qbo_purchase, index: true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateQboPurchases < ActiveRecord::Migration
|
class UpdateQboPurchases < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
rename_column :qbo_purchases, :customer_id, :qbo_customer_id
|
rename_column :qbo_purchases, :customer_id, :qbo_customer_id
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateVehicles < ActiveRecord::Migration
|
class CreateVehicles < ActiveRecord::Migration[5.1]
|
||||||
|
|
||||||
def change
|
def change
|
||||||
create_table :vehicles do |t|
|
create_table :vehicles do |t|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateIssuesWithVehicles < ActiveRecord::Migration
|
class UpdateIssuesWithVehicles < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :issues, :vehicles, index: true
|
add_reference :issues, :vehicles, index: true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateVehicles < ActiveRecord::Migration
|
class UpdateVehicles < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_column :vehicles, :name, :text
|
add_column :vehicles, :name, :text
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class QbocustomersToCustomers< ActiveRecord::Migration
|
class QbocustomersToCustomers< ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
rename_table :qbo_customers, :customers
|
rename_table :qbo_customers, :customers
|
||||||
rename_column :issues, :qbo_customer_id, :customer_id
|
rename_column :issues, :qbo_customer_id, :customer_id
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateQbosTimeStamp < ActiveRecord::Migration
|
class UpdateQbosTimeStamp < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_column :qbos, :last_sync, :datetime
|
add_column :qbos, :last_sync, :datetime
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class AddIssuesQboInvoices < ActiveRecord::Migration
|
class AddIssuesQboInvoices < ActiveRecord::Migration[5.1]
|
||||||
def self.up
|
def self.up
|
||||||
create_table :issues_qbo_invoices, :id => false do |t|
|
create_table :issues_qbo_invoices, :id => false do |t|
|
||||||
t.references :issue
|
t.references :issue
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateIssuesRemoveInvoice < ActiveRecord::Migration
|
class UpdateIssuesRemoveInvoice < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
remove_reference :issues, :qbo_invoice
|
remove_reference :issues, :qbo_invoice
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateCustomerTokens < ActiveRecord::Migration
|
class CreateCustomerTokens < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :customer_tokens do |t|
|
create_table :customer_tokens do |t|
|
||||||
t.string :token
|
t.string :token
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateInvoicesAndEstimates < ActiveRecord::Migration
|
class UpdateInvoicesAndEstimates < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :qbo_invoices, :customer, index: true
|
add_reference :qbo_invoices, :customer, index: true
|
||||||
add_reference :qbo_estimates, :customer, index: true
|
add_reference :qbo_estimates, :customer, index: true
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateProjects < ActiveRecord::Migration
|
class UpdateProjects < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_reference :projects, :customer, index: true
|
add_reference :projects, :customer, index: true
|
||||||
add_reference :projects, :vehicle, index: true
|
add_reference :projects, :vehicle, index: true
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The License
|
#The License
|
||||||
#
|
#
|
||||||
#Copyright (c) 2018 Rick Barrette - All Rights Reserved
|
#Copyright (c) 2022 Rick Barrette - All Rights Reserved
|
||||||
#
|
#
|
||||||
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
|
#Unauthorized copying of this software and associated documentation files (the "Software"), via any medium is strictly prohibited.
|
||||||
#
|
#
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class CreateLineItems < ActiveRecord::Migration
|
class CreateLineItems < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
create_table :line_items do |t|
|
create_table :line_items do |t|
|
||||||
t.integer :item_id
|
t.integer :item_id
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2019 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class AddCustomersPhoneNumber < ActiveRecord::Migration
|
class AddCustomersPhoneNumber < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_column :customers, :phone_number, :string
|
add_column :customers, :phone_number, :string
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2019 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class AddCustomersMobilePhoneNumber < ActiveRecord::Migration
|
class AddCustomersMobilePhoneNumber < ActiveRecord::Migration[5.1]
|
||||||
def change
|
def change
|
||||||
add_column :customers, :mobile_phone_number, :string
|
add_column :customers, :mobile_phone_number, :string
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateQbosTypes < ActiveRecord::Migration
|
class UpdateQbosTypes < ActiveRecord::Migration[5.1]
|
||||||
|
|
||||||
def change
|
def change
|
||||||
change_column :qbos, :qb_token, :text
|
change_column :qbos, :qb_token, :text
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,10 +8,10 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class UpdateQbosToken < ActiveRecord::Migration
|
class UpdateQbosToken < ActiveRecord::Migration[5.1]
|
||||||
|
|
||||||
def change
|
def change
|
||||||
add_column :qbos, :token, :text
|
add_column :qbos, :token, :text
|
||||||
add_column :qbos, :expire, :date
|
add_column :qbos, :expire, :datetime
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,30 +8,11 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class Payment
|
class RemoveQbosKeys < ActiveRecord::Migration[5.1]
|
||||||
unloadable
|
def change
|
||||||
|
remove_column :qbos, :qb_secret
|
||||||
include ActiveModel::Model
|
remove_column :qbos, :token_expires_at
|
||||||
|
remove_column :qbos, :reconnect_token_at
|
||||||
attr_accessor :errors, :customer_id, :account_id, :payment_method_id, :total_amount
|
remove_column :qbos, :qb_token
|
||||||
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).update(payment)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def save!
|
|
||||||
save
|
|
||||||
end
|
|
||||||
|
|
||||||
# Dummy stub to make validtions happy.
|
|
||||||
def update_attribute
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,40 +8,37 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class QboItem < ActiveRecord::Base
|
class AddTxnDates < ActiveRecord::Migration[5.1]
|
||||||
unloadable
|
def change
|
||||||
has_many :issues
|
add_column :qbo_invoices, :txn_date, :date
|
||||||
attr_accessible :name
|
add_column :qbo_estimates, :txn_date, :date
|
||||||
validates_presence_of :id, :name
|
|
||||||
|
|
||||||
self.primary_key = :id
|
reversible do |direction|
|
||||||
|
direction.up {
|
||||||
|
break unless Qbo.first
|
||||||
|
|
||||||
def self.get_base
|
QboEstimate.reset_column_information
|
||||||
Qbo.get_base(:item)
|
QboInvoice.reset_column_information
|
||||||
end
|
|
||||||
|
|
||||||
def self.sync
|
say "Sync Estimates"
|
||||||
last = Qbo.first.last_sync
|
|
||||||
|
|
||||||
query = "SELECT Id, Name FROM Item WHERE Type = 'Service' "
|
QboEstimate.sync
|
||||||
query << " AND Metadata.LastUpdatedTime >= '#{last.iso8601}' " if last
|
|
||||||
|
|
||||||
if count == 0
|
say "Sync Invoices"
|
||||||
items = get_base.all
|
|
||||||
else
|
|
||||||
items = get_base.query(query)
|
|
||||||
end
|
|
||||||
|
|
||||||
unless items.count = 0
|
invoices = QboInvoice.get_base.all
|
||||||
items.find_by(:type, "Service").each { |i|
|
|
||||||
qbo_item = QboItem.find_or_create_by(id: i.id)
|
invoices.each { |invoice|
|
||||||
qbo_item.name = i.name
|
# Load the invoice into the database
|
||||||
qbo_item.id = i.id
|
qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id)
|
||||||
qbo_item.save
|
qbo_invoice.doc_number = invoice.doc_number
|
||||||
|
qbo_invoice.id = invoice.id
|
||||||
|
qbo_invoice.customer_id = invoice.customer_ref
|
||||||
|
qbo_invoice.txn_date = invoice.txn_date
|
||||||
|
qbo_invoice.save!
|
||||||
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
# QboItem.where.not(items.map(&:id)).destroy_all
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2018 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,27 +8,23 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class LineItem < ActiveRecord::Base
|
class UpdateVehiclesTrim < ActiveRecord::Migration[5.1]
|
||||||
|
def change
|
||||||
|
add_column :vehicles, :doors, :text
|
||||||
|
add_column :vehicles, :trim, :text
|
||||||
|
|
||||||
unloadable
|
reversible do |direction|
|
||||||
|
direction.up {
|
||||||
|
|
||||||
belongs_to :issue
|
# Update local vehicle database by forcing a save, look at before_save
|
||||||
|
vehicles = Vehicle.all
|
||||||
|
vehicles.each { |vehicle|
|
||||||
|
vehicle.save!
|
||||||
|
}
|
||||||
|
|
||||||
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
|
end
|
||||||
|
|
||||||
invoice.line_items << line_item
|
|
||||||
|
|
||||||
return invoice
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,11 +8,10 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
# This sidekiq worker class will handle emailing weekly time reports
|
class RemoveQboItems < ActiveRecord::Migration[5.1]
|
||||||
class EmailWorker
|
def change
|
||||||
include Sidekiq::Worker
|
drop_table :qbo_items
|
||||||
|
drop_table :qbo_purchases
|
||||||
def perform()
|
drop_table :line_items
|
||||||
# email something
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
89
init.rb
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2020 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
@@ -8,59 +8,52 @@
|
|||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
# Dynamically load all Hooks & Patches
|
||||||
|
ActiveSupport::Reloader.to_prepare do
|
||||||
|
Dir::foreach(File.join(File.dirname(__FILE__), 'lib')) do |file|
|
||||||
|
next unless /\.rb$/ =~ file
|
||||||
|
require_dependency file
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Redmine::Plugin.register :redmine_qbo do
|
Redmine::Plugin.register :redmine_qbo do
|
||||||
|
|
||||||
# View Hook Listeners
|
# About
|
||||||
require_dependency 'issues_form_hook_listener'
|
name 'Redmine Quickbooks Online plugin'
|
||||||
require_dependency 'issues_save_hook_listener'
|
author 'Rick Barrette'
|
||||||
require_dependency 'issues_show_hook_listener'
|
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
|
||||||
require_dependency 'users_show_hook_listener'
|
version '1.1.2'
|
||||||
require_dependency 'header_footer_hook_listener'
|
url 'https://github.com/rickbarrette/redmine_qbo'
|
||||||
require_dependency 'projects_form_hook_listener'
|
author_url 'http://rickbarrette.org'
|
||||||
require_dependency 'view_hook_listener'
|
settings :default => {'empty' => true}, :partial => 'qbo/settings'
|
||||||
|
requires_redmine :version_or_higher => '4.0.0'
|
||||||
|
|
||||||
# Patches to the Redmine core. Will not work in development mode
|
# Add safe attributes for core models
|
||||||
require_dependency 'issue_patch'
|
Issue.safe_attributes 'customer_id'
|
||||||
require_dependency 'project_patch'
|
Issue.safe_attributes 'qbo_item_id'
|
||||||
require_dependency 'user_patch'
|
Issue.safe_attributes 'qbo_estimate_id'
|
||||||
require_dependency 'query_patch'
|
Issue.safe_attributes 'qbo_invoice_id'
|
||||||
require_dependency 'time_entry_query_patch'
|
Issue.safe_attributes 'vehicles_id'
|
||||||
require_dependency 'pdf_patch'
|
User.safe_attributes 'qbo_employee_id'
|
||||||
require_dependency 'attachments_controller_patch'
|
TimeEntry.safe_attributes 'qbo_billed'
|
||||||
|
Project.safe_attributes 'customer_id'
|
||||||
|
Project.safe_attributes 'vehicle_id'
|
||||||
|
|
||||||
name 'Redmine Quickbooks Online plugin'
|
# We are playing in the sandbox
|
||||||
author 'Rick Barrette'
|
#Quickbooks.sandbox_mode = true
|
||||||
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.8.0'
|
|
||||||
url 'https://github.com/rickbarrette/redmine_qbo'
|
|
||||||
author_url 'http://rickbarrette.org'
|
|
||||||
settings :default => {'empty' => true}, :partial => 'qbo/settings'
|
|
||||||
|
|
||||||
# Add safe attributes
|
# set per_page globally
|
||||||
Issue.safe_attributes 'customer_id'
|
WillPaginate.per_page = 20
|
||||||
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'
|
|
||||||
Project.safe_attributes 'customer_id'
|
|
||||||
Project.safe_attributes 'vehicle_id'
|
|
||||||
|
|
||||||
# We are playing in the sandbox
|
# Permissions for security
|
||||||
#Quickbooks.sandbox_mode = true
|
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
|
||||||
|
|
||||||
# set per_page globally
|
# Register top menu items
|
||||||
WillPaginate.per_page = 20
|
menu :top_menu, :customers, { :controller => :customers, :action => :index }, :caption => 'Customers', :if => Proc.new {User.current.logged?}
|
||||||
|
menu :top_menu, :vehicles, { :controller => :vehicles, :action => :index }, :caption => 'Vehicles', :if => Proc.new { User.current.logged? }
|
||||||
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, :customers, { :controller => :customers, :action => :index }, :caption => 'Customers', :if => Proc.new {User.current.logged?}
|
|
||||||
menu :top_menu, :vehicles, { :controller => :vehicles, :action => :index }, :caption => 'Vehicles', :if => Proc.new { User.current.logged? }
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -14,6 +14,6 @@ class HeaderFooterHookListener < Redmine::Hook::ViewListener
|
|||||||
end
|
end
|
||||||
|
|
||||||
def view_layouts_base_body_bottom(context = {})
|
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>"
|
return "<div id='qbo_footer' align='center'><b>#{I18n.translate(:label_last_sync)}: </b> #{Qbo.last_sync if Qbo.exists?}</div>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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 IssuesFormHookListener < Redmine::Hook::ViewListener
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Edit Issue Form
|
# Edit Issue Form
|
||||||
# Show a dropdown for quickbooks contacts
|
# TODO figure out how to do this with a view
|
||||||
def view_issues_form_details_bottom(context={})
|
def view_issues_form_details_bottom(context={})
|
||||||
f = context[:form]
|
f = context[:form]
|
||||||
|
|
||||||
@@ -28,16 +28,30 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener
|
|||||||
selected_vehicle = context[:project].vehicle ? context[:project].vehicle.id : nil
|
selected_vehicle = context[:project].vehicle ? context[:project].vehicle.id : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Check to see if there is a quickbooks user attached to the issue
|
# Check to see if there are things attached to the issue
|
||||||
selected_customer = context[:issue].customer ? context[:issue].customer.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_estimate = context[:issue].qbo_estimate ? context[:issue].qbo_estimate.id : nil
|
||||||
selected_vehicle = context[:issue].vehicles_id ? context[:issue].vehicles_id : nil
|
selected_vehicle = context[:issue].vehicles_id ? context[:issue].vehicles_id : nil
|
||||||
|
|
||||||
# Load customer information
|
# Load customer information
|
||||||
customer = Customer.find_by_id(selected_customer) if selected_customer
|
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"
|
|
||||||
|
|
||||||
|
# Customer Name Text Box with database backed autocomplete
|
||||||
|
search_customer = f.autocomplete_field :customer,
|
||||||
|
autocomplete_customer_name_customers_path,
|
||||||
|
:selected => selected_customer,
|
||||||
|
:onchange => "updateIssueFrom('/issues/#{context[:issue].id}/edit.js', this)",
|
||||||
|
:update_elements => {
|
||||||
|
:id => '#issue_customer_id',
|
||||||
|
:value => '#issue_customer'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Customer ID - Hidden Field
|
||||||
|
customer_id = f.hidden_field :customer_id,
|
||||||
|
:id => "issue_customer_id",
|
||||||
|
:onchange => "updateIssueFrom('/issues/#{context[:issue].id}/edit.js', this)"
|
||||||
|
|
||||||
|
# Load estimates & vehicles
|
||||||
if context[:issue].customer
|
if context[:issue].customer
|
||||||
if customer.vehicles
|
if customer.vehicles
|
||||||
vehicles = customer.vehicles.pluck(:name, :id)
|
vehicles = customer.vehicles.pluck(:name, :id)
|
||||||
@@ -50,11 +64,10 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener
|
|||||||
estimates = [nil].compact
|
estimates = [nil].compact
|
||||||
end
|
end
|
||||||
|
|
||||||
# Generate the drop down list of quickbooks extimates
|
# Generate the drop down list of quickbooks extimates & vehicles
|
||||||
select_estimate = f.select :qbo_estimate_id, estimates, :selected => selected_estimate, include_blank: true
|
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
|
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>"
|
return "<p><label for=\"issue_customer\">Customer</label>#{search_customer} #{customer_id} #{link_to_function I18n.t(:label_load_customer), "updateIssueFrom('/issues/#{context[:issue].id}/edit.js', this)"}</p> <p>#{select_estimate}</p> <p>#{vehicle}</p>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,6 +10,12 @@
|
|||||||
|
|
||||||
class IssuesSaveHookListener < Redmine::Hook::ViewListener
|
class IssuesSaveHookListener < Redmine::Hook::ViewListener
|
||||||
|
|
||||||
|
# Called Before Issue Saved
|
||||||
|
def controller_issues_edit_before_save(context={})
|
||||||
|
issue = context[:issue]
|
||||||
|
issue.subject = issue.subject.titleize
|
||||||
|
end
|
||||||
|
|
||||||
# Called After Issue Saved
|
# Called After Issue Saved
|
||||||
def controller_issues_edit_after_save(context={})
|
def controller_issues_edit_after_save(context={})
|
||||||
issue = context[:issue]
|
issue = context[:issue]
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class IssuesShowHookListener < Redmine::Hook::ViewListener
|
|||||||
issue.qbo_invoice_ids.each do |i|
|
issue.qbo_invoice_ids.each do |i|
|
||||||
invoice = QboInvoice.find 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 + " "
|
invoice_link = invoice_link + link_to( invoice.doc_number, "#{Redmine::Utils::relative_url_root}/qbo/invoice/#{i}", :target => "_blank").to_s + " "
|
||||||
invoice_link = invoice_link.html_safe
|
invoice_link = invoice_link.html_safe
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -51,11 +51,11 @@ class IssuesShowHookListener < Redmine::Hook::ViewListener
|
|||||||
:partial => 'qbo/issues_show_details',
|
:partial => 'qbo/issues_show_details',
|
||||||
locals: {
|
locals: {
|
||||||
customer: customer,
|
customer: customer,
|
||||||
estimate_link: estimate_link,
|
estimate_link: estimate_link,
|
||||||
invoice_link: invoice_link,
|
invoice_link: invoice_link,
|
||||||
vehicle: vehicle,
|
vehicle: vehicle,
|
||||||
split_vin: split_vin,
|
split_vin: split_vin,
|
||||||
notes: notes
|
notes: notes
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,13 @@
|
|||||||
|
#The MIT License (MIT)
|
||||||
|
#
|
||||||
|
#Copyright (c) 2022 rick barrette
|
||||||
|
#
|
||||||
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
require_dependency 'redmine/export/pdf'
|
require_dependency 'redmine/export/pdf'
|
||||||
require_dependency 'redmine/export/pdf/issues_pdf_helper'
|
require_dependency 'redmine/export/pdf/issues_pdf_helper'
|
||||||
|
|
||||||
@@ -7,7 +17,9 @@ module IssuesPdfHelperPatch
|
|||||||
base.send(:include, InstanceMethods)
|
base.send(:include, InstanceMethods)
|
||||||
base.class_eval do
|
base.class_eval do
|
||||||
unloadable # Send unloadable so it will not be unloaded in development
|
unloadable # Send unloadable so it will not be unloaded in development
|
||||||
alias_method_chain :issue_to_pdf, :patch
|
alias_method :issue_to_pdf, :issue_to_pdf_with_patch
|
||||||
|
alias_method :issue_to_pdf_with_patch, :issue_to_pdf
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ class ProjectsFormHookListener < Redmine::Hook::ViewListener
|
|||||||
vehicle = f.select :vehicle_id, vehicles, :selected => selected_vehicle, include_blank: true
|
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>"
|
return "<p><label for=\"project_customer\">Customer</label>#{search_customer} #{customer_id}</p> <p>#{vehicle}</p>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2022 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#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,61 +12,23 @@ require_dependency 'issue_query'
|
|||||||
|
|
||||||
module QueryPatch
|
module QueryPatch
|
||||||
|
|
||||||
def self.included(base) # :nodoc:
|
# Add qbo options to the aviable columns
|
||||||
base.extend(ClassMethods)
|
def available_columns
|
||||||
|
unless @available_columns
|
||||||
base.send(:include, InstanceMethods)
|
@available_columns = self.class.available_columns.dup
|
||||||
|
@available_columns << QueryColumn.new(:customer, :sortable => "#{Issue.table_name}.customer_id", :groupable => true, :caption => :field_customer)
|
||||||
# Same as typing in the class
|
@available_columns << QueryColumn.new(:qbo_billed, :sortable => "#{TimeEntry.table_name}.qbo_billed", :groupable => true, :caption => :field_qbo_billed)
|
||||||
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
|
||||||
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
module ClassMethods
|
# Add customers to filters
|
||||||
|
def initialize_available_filters
|
||||||
|
#add_available_filter "customer", :type => :text
|
||||||
|
super
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
# Add module to Issue
|
# Add module to Issue
|
||||||
IssueQuery.send(:include, QueryPatch)
|
IssueQuery.send(:prepend, QueryPatch)
|
||||||
|
|||||||