mirror of
https://github.com/rickbarrette/redmine_qbo.git
synced 2026-02-13 09:13:58 -05:00
Compare commits
44 Commits
623510b474
...
dev-6
| Author | SHA1 | Date | |
|---|---|---|---|
| ef7faee685 | |||
| 02b48d2de4 | |||
| e670d99766 | |||
| 241dd594d0 | |||
| b603cb634a | |||
| 1308a05011 | |||
| 334ed60bf7 | |||
| d63bf809f2 | |||
| 31406af681 | |||
| 479be461a6 | |||
| c1af031d22 | |||
| a741cd0217 | |||
| 4ae9374401 | |||
| b096244454 | |||
| 4983cd661c | |||
| 5f6fb4af27 | |||
| 2f2c74403f | |||
| 43579d73e5 | |||
| a90d6b839f | |||
| e76f977ca8 | |||
| 7f821d241c | |||
| 1bc9227c7f | |||
| 3c2f1d0edd | |||
| 35e303d54b | |||
| 2aeb3fa028 | |||
| c85e45b544 | |||
| 6cd7825430 | |||
| 14f411c2e1 | |||
| f0a3b0193c | |||
| b531076c18 | |||
| 9e342ced28 | |||
| 0537d9bd86 | |||
| a531ef4f87 | |||
| 1fae647381 | |||
| d1764e2203 | |||
| f830881883 | |||
| fb87e8a33a | |||
| 8bdec410c4 | |||
| dec9eee90b | |||
| 2745ecf242 | |||
| 13472c3b3a | |||
| b686110145 | |||
| d91e7892c3 | |||
| f26224de56 |
1
Gemfile
1
Gemfile
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
|
|||||||
gem 'quickbooks-ruby'
|
gem 'quickbooks-ruby'
|
||||||
gem 'oauth2'
|
gem 'oauth2'
|
||||||
gem 'roxml'
|
gem 'roxml'
|
||||||
gem 'nhtsa_vin'
|
|
||||||
gem 'will_paginate'
|
gem 'will_paginate'
|
||||||
gem 'rails-jquery-autocomplete'
|
gem 'rails-jquery-autocomplete'
|
||||||
gem 'jquery-ui-rails'
|
gem 'jquery-ui-rails'
|
||||||
|
|||||||
@@ -92,8 +92,7 @@ To enable automatic Time Activity entries for an Issue, you simply need to assig
|
|||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
* Separate Vehicles into a separate plugin (I use Redmine for my automotive shop management 😉)
|
* Add hooks to intergrate other plugins, i.e. customer vehicles for example
|
||||||
|
|
||||||
* MORE Stuff as I make it up...
|
* MORE Stuff as I make it up...
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
@@ -38,12 +38,6 @@ class CustomersController < ApplicationController
|
|||||||
params.require(:customer).permit(:name, :email, :primary_phone, :mobile_phone, :phone_number, :notes)
|
params.require(:customer).permit(:name, :email, :primary_phone, :mobile_phone, :phone_number, :notes)
|
||||||
end
|
end
|
||||||
|
|
||||||
# getter method for a customer's vehicles
|
|
||||||
# used for customer autocomplete field / issue form
|
|
||||||
def filter_vehicles_by_customer
|
|
||||||
@filtered_vehicles = Vehicle.all.where(customer_id: params[:selected_customer])
|
|
||||||
end
|
|
||||||
|
|
||||||
# getter method for a customer's invoices
|
# getter method for a customer's invoices
|
||||||
# used for customer autocomplete field / issue form
|
# used for customer autocomplete field / issue form
|
||||||
def filter_invoices_by_customer
|
def filter_invoices_by_customer
|
||||||
@@ -87,7 +81,6 @@ class CustomersController < ApplicationController
|
|||||||
def show
|
def show
|
||||||
begin
|
begin
|
||||||
@customer = Customer.find_by_id(params[:id])
|
@customer = Customer.find_by_id(params[:id])
|
||||||
@vehicles = @customer.vehicles.paginate(:page => params[:page])
|
|
||||||
@issues = @customer.issues.order(id: :desc)
|
@issues = @customer.issues.order(id: :desc)
|
||||||
@billing_address = address_to_s(@customer.billing_address)
|
@billing_address = address_to_s(@customer.billing_address)
|
||||||
@shipping_address = address_to_s(@customer.shipping_address)
|
@shipping_address = address_to_s(@customer.shipping_address)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2026 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 - 2025 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,125 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2024 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
# This controller class will handle map management
|
|
||||||
class VehiclesController < ApplicationController
|
|
||||||
|
|
||||||
include AuthHelper
|
|
||||||
|
|
||||||
before_action :require_user
|
|
||||||
|
|
||||||
def allowed_params
|
|
||||||
params.require(:vehicle).permit(:year, :make, :model, :customer_id, :notes, :vin)
|
|
||||||
end
|
|
||||||
|
|
||||||
# display a list of all vehicles
|
|
||||||
def index
|
|
||||||
if params[:customer_id]
|
|
||||||
begin
|
|
||||||
@vehicles = Customer.find_by_id(params[:customer_id]).vehicles.paginate(:page => params[:page])
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# search for a vehicle by vin
|
|
||||||
if params[:search]
|
|
||||||
@vehicles = Vehicle.search(params[:search]).paginate(:page => params[:page])
|
|
||||||
if only_one_non_zero?(@vehicles)
|
|
||||||
redirect_to @vehicles.first
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# return an HTML form for creating a new vehicle
|
|
||||||
def new
|
|
||||||
@vehicle = Vehicle.new
|
|
||||||
@customer = Customer.find_by_id(params[:customer_id]) if params[:customer_id]
|
|
||||||
end
|
|
||||||
|
|
||||||
# create a new vehicle
|
|
||||||
def create
|
|
||||||
@vehicle = Vehicle.new(allowed_params)
|
|
||||||
if @vehicle.save
|
|
||||||
flash[:notice] = "New Vehicle Created"
|
|
||||||
redirect_to @vehicle
|
|
||||||
else
|
|
||||||
flash[:error] = @vehicle.errors.full_messages.to_sentence
|
|
||||||
redirect_to Vehicle.find_by_vin @vehicle.vin
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# display a specific vehicle
|
|
||||||
def show
|
|
||||||
begin
|
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
|
||||||
@vin = @vehicle.vin.scan(/.{1,9}/) if @vehicle.vin
|
|
||||||
@issues = @vehicle.issues.order(id: :desc)
|
|
||||||
@closed_issues = (@issues - @issues.open)
|
|
||||||
rescue
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# return an HTML form for editing a vehicle
|
|
||||||
def edit
|
|
||||||
begin
|
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
|
||||||
@customer = @vehicle.customer
|
|
||||||
rescue
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# update a specific vehicle
|
|
||||||
def update
|
|
||||||
@customer = params[:customer]
|
|
||||||
begin
|
|
||||||
@vehicle = Vehicle.find_by_id(params[:id])
|
|
||||||
if @vehicle.update(allowed_params)
|
|
||||||
flash[:notice] = "Vehicle updated"
|
|
||||||
redirect_to @vehicle
|
|
||||||
else
|
|
||||||
redirect_to edit_vehicle_path
|
|
||||||
end
|
|
||||||
#show any errors anyways
|
|
||||||
flash[:error] = @vehicle.errors.full_messages.to_sentence unless @vehicle.errors.empty?
|
|
||||||
rescue
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# delete a specific vehicle
|
|
||||||
def destroy
|
|
||||||
begin
|
|
||||||
Vehicle.find_by_id(params[:id]).destroy
|
|
||||||
flash[:notice] = "Vehicle deleted successfully"
|
|
||||||
redirect_to action: :index
|
|
||||||
rescue
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
# checks to see if there is only one item in an array
|
|
||||||
# @return true if array only has one item
|
|
||||||
def only_one_non_zero?( array )
|
|
||||||
found_non_zero = false
|
|
||||||
array.each do |val|
|
|
||||||
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) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 - 2025 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 - 2025 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 @@ class Customer < ActiveRecord::Base
|
|||||||
has_many :issues
|
has_many :issues
|
||||||
has_many :invoices
|
has_many :invoices
|
||||||
has_many :estimates
|
has_many :estimates
|
||||||
has_many :vehicles
|
|
||||||
|
|
||||||
validates_presence_of :id, :name
|
validates_presence_of :id, :name
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
@@ -109,33 +109,18 @@ class Invoice < ActiveRecord::Base
|
|||||||
# TODO break if Invoice.find(invoice.id).cf_sync_confict
|
# TODO break if Invoice.find(invoice.id).cf_sync_confict
|
||||||
is_changed = false
|
is_changed = false
|
||||||
|
|
||||||
# update the invoive custom fields with infomation from the issue if available
|
logger.debug "Calling :process_invoice_custom_fields hook"
|
||||||
invoice.custom_fields.each { |cf|
|
context = Redmine::Hook.call_hook :process_invoice_custom_fields, { issue: issue, invoice: invoice }
|
||||||
|
|
||||||
# VIN from the attached vehicle
|
# Process updates from the hooks
|
||||||
# TODO move this into seperate plugin
|
context.each do |c|
|
||||||
# TODO create hook for seperate plugin
|
unless c.nil?
|
||||||
begin
|
logger.debug "Invoice.compare_custom_fields: We have a responce from a hook"
|
||||||
if cf.name.eql? "VIN"
|
push_updates c[:invoice] if c[:is_changed]
|
||||||
# Only update if blank to prevent infite loops
|
end
|
||||||
# TODO check cf_sync_confict flag once implemented
|
|
||||||
if cf.string_value.to_s.blank?
|
|
||||||
logger.info " VIN was blank, updating the invoice vin in quickbooks"
|
|
||||||
vin = Vehicle.find(issue.vehicles_id).vin
|
|
||||||
break if vin.nil?
|
|
||||||
if not cf.string_value.to_s.eql? vin
|
|
||||||
cf.string_value = vin.to_s
|
|
||||||
logger.info "VIN has changed"
|
|
||||||
is_changed = true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
# Process Issue Custom Values
|
||||||
end
|
|
||||||
rescue
|
|
||||||
#do nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
# Custom Values
|
|
||||||
begin
|
begin
|
||||||
value = issue.custom_values.find_by(custom_field_id: CustomField.find_by_name(cf.name).id)
|
value = issue.custom_values.find_by(custom_field_id: CustomField.find_by_name(cf.name).id)
|
||||||
|
|
||||||
@@ -151,15 +136,18 @@ class Invoice < ActiveRecord::Base
|
|||||||
rescue
|
rescue
|
||||||
# Nothing to do here, there is no match
|
# Nothing to do here, there is no match
|
||||||
end
|
end
|
||||||
}
|
|
||||||
|
|
||||||
# Push updates
|
push_updates invoice if is_changed
|
||||||
|
end
|
||||||
|
|
||||||
|
# pushes invoice updates
|
||||||
|
def self.push_updates(invoice)
|
||||||
begin
|
begin
|
||||||
logger.info "Trying to update invoice"
|
logger.info "Invoice.push_updates"
|
||||||
qbo = Qbo.first
|
qbo = Qbo.first
|
||||||
qbo.perform_authenticated_request do |access_token|
|
qbo.perform_authenticated_request do |access_token|
|
||||||
service = Quickbooks::Service::Invoice.new(:company_id => qbo.realm_id, :access_token => access_token)
|
service = Quickbooks::Service::Invoice.new(:company_id => qbo.realm_id, :access_token => access_token)
|
||||||
service.update(invoice) if is_changed
|
service.update invoice
|
||||||
end
|
end
|
||||||
rescue
|
rescue
|
||||||
# Do nothing, probaly custome field sync confict on the invoice.
|
# Do nothing, probaly custome field sync confict on the invoice.
|
||||||
@@ -170,6 +158,16 @@ class Invoice < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# download the pdf from quickbooks
|
||||||
|
def pdf
|
||||||
|
qbo = Qbo.first
|
||||||
|
qbo.perform_authenticated_request do |access_token|
|
||||||
|
service = Quickbooks::Service::Invoice.new(:company_id => qbo.realm_id, :access_token => access_token)
|
||||||
|
invoice = service.fetch_by_id(id)
|
||||||
|
return service.pdf(invoice)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Magic Method
|
# Magic Method
|
||||||
# Maps Get/Set methods to QBO invoice object
|
# Maps Get/Set methods to QBO invoice object
|
||||||
def method_missing(sym, *arguments)
|
def method_missing(sym, *arguments)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 - 2025 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,98 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2024 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class Vehicle < ActiveRecord::Base
|
|
||||||
|
|
||||||
belongs_to :customer
|
|
||||||
has_many :issues, :foreign_key => 'vehicles_id'
|
|
||||||
|
|
||||||
validates_presence_of :customer
|
|
||||||
validates :vin, uniqueness: true
|
|
||||||
before_save :decode_vin
|
|
||||||
|
|
||||||
self.primary_key = :id
|
|
||||||
|
|
||||||
# returns a human readable string
|
|
||||||
def to_s
|
|
||||||
if year.nil? or make.nil? or model.nil?
|
|
||||||
return "#{vin}"
|
|
||||||
else
|
|
||||||
split_vin = vin.scan(/.{1,9}/)
|
|
||||||
return "#{year} #{make} #{model} - #{split_vin[1]}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# returns the raw JSON details from NHTSA
|
|
||||||
def details
|
|
||||||
get_details if @details.nil?
|
|
||||||
return @details
|
|
||||||
end
|
|
||||||
|
|
||||||
# Force Upper Case for make numbers
|
|
||||||
def make=(val)
|
|
||||||
# The to_s is in case you get nil/non-string
|
|
||||||
write_attribute(:make, val.to_s.titleize)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Force Upper Case for model numbers
|
|
||||||
def model=(val)
|
|
||||||
# The to_s is in case you get nil/non-string
|
|
||||||
write_attribute(:model, val.to_s.titleize)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Force Upper Case & strip VIN of all illegal chars (for barcode scanner)
|
|
||||||
def vin=(val)
|
|
||||||
val = val.to_s.upcase.gsub(/[^A-HJ-NPR-Za-hj-npr-z\d]+/,"")
|
|
||||||
write_attribute(:vin, val)
|
|
||||||
end
|
|
||||||
|
|
||||||
# search for a vin
|
|
||||||
def self.search(search)
|
|
||||||
where("vin LIKE ?", "%#{search}%")
|
|
||||||
end
|
|
||||||
|
|
||||||
# decodes a vin and updates self
|
|
||||||
def decode_vin
|
|
||||||
get_details
|
|
||||||
if @details
|
|
||||||
begin
|
|
||||||
self.year = @details.year unless @details.year.nil?
|
|
||||||
self.make = @details.make unless @details.make.nil?
|
|
||||||
self.model = @details.model unless @details.model.nil?
|
|
||||||
self.doors = @details.doors unless @details.doors.nil?
|
|
||||||
self.trim = @details.trim unless @details.trim.nil?
|
|
||||||
rescue Exception => e
|
|
||||||
errors.add(:vin, e.message)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
self.name = to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
# init method to pull JSON details from NHTSA
|
|
||||||
def get_details
|
|
||||||
if self.vin?
|
|
||||||
#validate the vin before calling a remote server
|
|
||||||
validation = NhtsaVin.validate(self.vin)
|
|
||||||
begin
|
|
||||||
#if the vin validation failed, raise an exception and exit
|
|
||||||
raise RuntimeError, validation.error unless validation.valid?
|
|
||||||
# query NHTSA for details on the vin
|
|
||||||
query = NhtsaVin.get(self.vin)
|
|
||||||
raise RuntimeError, query.error unless query.valid?
|
|
||||||
@details = query.response
|
|
||||||
rescue Exception => e
|
|
||||||
errors.add(:vin, e.message)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@@ -37,8 +37,11 @@
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th><%=t(:field_notes)%></th>
|
<th colspan="2"><h4><%=t(:field_notes)%></hr></th>
|
||||||
<td>
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
<pre id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit;">
|
<pre id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit;">
|
||||||
<%= customer.notes %>
|
<%= customer.notes %>
|
||||||
</pre>
|
</pre>
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
$('select#issue_vehicles_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>');
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<h2><%=t(:field_customer)%> #<%= @customer.id %> - <%= link_to @customer.to_s, "https://app.qbo.intuit.com/app/customerdetail?nameId=#{@customer.id}", target: :_blank %> </h2>
|
<h2><%=t(:field_customer)%> #<%= @customer.id %> - <%= link_to @customer.to_s, "https://#{Setting.plugin_redmine_qbo['sandbox'] ? "sandbox" : "app"}.qbo.intuit.com/app/customerdetail?nameId=#{@customer.id}", target: :_blank %> </h2>
|
||||||
<div class="issue">
|
<div class="issue">
|
||||||
|
|
||||||
<div class="splitcontent">
|
<div class="splitcontent">
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
<div class="splitcontent">
|
<div class="splitcontent">
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<h4><%=t(:label_customer)%>:</h4>
|
<h4><%=t(:field_customer)%>:</h4>
|
||||||
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
|
<%= render :partial => 'customers/details', locals: {customer: @customer} %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -39,11 +39,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<h4><%=t(:field_vehicles)%>:</h4>
|
<%= call_hook :show_customer_view_right, {customer: @customer} %>
|
||||||
<%= render :partial => 'vehicles/list' %>
|
|
||||||
<div style="float: right;">
|
|
||||||
<%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,14 @@
|
|||||||
|
|
||||||
<%= form_with(url: invoice_path, method: :get) do |form| %>
|
<%= form_with(url: invoice_path, method: :get) do |form| %>
|
||||||
|
|
||||||
|
<% if @customer.invoices.count > 1 %>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<%= check_box_tag "select-all-invoices", "1", false, id: "select-all-invoices" %>
|
<%= check_box_tag "select-all-invoices", "1", false, id: "select-all-invoices" %>
|
||||||
<%= label_tag "select-all-invoices", "Select All Invioces" %>
|
<%= label_tag "select-all-invoices", t(:label_select_all) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% @customer.invoices.order(id: :desc).each do |invoice| %>
|
<% @customer.invoices.order(id: :desc).each do |invoice| %>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -16,7 +18,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= form.submit "Bulk PDF" %>
|
<% if @customer.invoices.count > 1 %>
|
||||||
|
<%= form.submit t(:button_bulk_pdf) %>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% else %>
|
<% else %>
|
||||||
|
|||||||
@@ -2,13 +2,8 @@
|
|||||||
<label for="issue_customer"><%= t(:customer) %></label>
|
<label for="issue_customer"><%= t(:customer) %></label>
|
||||||
<%= search_customer %>
|
<%= search_customer %>
|
||||||
<%= customer_id %>
|
<%= customer_id %>
|
||||||
<%= link_to t(:label_load_customer), '#', onclick: "#{js_link}; return false;" %>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= select_estimate %>
|
<%= select_estimate %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
<%= vehicle %>
|
|
||||||
</p>
|
|
||||||
@@ -17,23 +17,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<div class="vehicle attribute">
|
<%= call_hook :show_issue_view_right, {issue: issue} %>
|
||||||
<div class="label"><span><%=t(:field_vehicle)%></span>:</div>
|
|
||||||
<div class="value"><%= vehicle %></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="vehicle_vin attribute">
|
|
||||||
<div class="label"><span><%=t(:field_vin)%></span>:</div>
|
|
||||||
<div class="value"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="vehicle_notes attribute">
|
|
||||||
<div class="label"><span><%=t(:field_notes)%></span>:</div>
|
|
||||||
<div class="value">
|
|
||||||
<pre id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit; ">
|
|
||||||
<%=notes%>
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2022 rick barrette
|
Copyright (c) 2016 - 2026 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:
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 rick barrette
|
Copyright (c) 2016 - 2026 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:
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 rick barrette
|
Copyright (c) 2016 - 2026 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:
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2024 rick barrette
|
Copyright (c) 2016 - 2026 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:
|
||||||
|
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
<div class="issue">
|
|
||||||
<div class="splitcontent">
|
|
||||||
<div class="splitcontentleft">
|
|
||||||
<h4><%=t(:label_details)%>:</h4>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th><%= t(:field_customer)%></th>
|
|
||||||
<td><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th><%= t(:field_vehicle) %></th>
|
|
||||||
<td><%= vehicle.to_s %></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<th><%= t(:field_vin) %></th>
|
|
||||||
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<th><%= t(:label_trim) %></th>
|
|
||||||
<td><%= vehicle.doors %> <%=t(:label_door) if vehicle.doors? %> <%= vehicle.trim %></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
|
||||||
|
|
||||||
<h4><%=t(:field_notes)%>:</h4>
|
|
||||||
<pre id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit; ">
|
|
||||||
<td><%= vehicle.notes %></td>
|
|
||||||
</pre>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const preElement = document.getElementById('note-display');
|
|
||||||
// This takes the text, trims the edges, and puts it back
|
|
||||||
preElement.textContent = preElement.textContent.trim();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</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>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<div class="row">
|
|
||||||
<div class="span6 columns">
|
|
||||||
<fieldset>
|
|
||||||
|
|
||||||
<%= form_for @vehicle do |f| %>
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:field_customer)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.autocomplete_field :customer, autocomplete_customer_name_customers_path, :value => @customer.name, :update_elements => {:id => '#customer_id', :value => '#issue_customer'}, :required => true %>
|
|
||||||
<%= f.hidden_field :customer_id, :id => "customer_id", :value => @customer.id %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:label_year)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.number_field :year, :autocomplete => "off" %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:label_make)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.text_field :make, :autocomplete => "off" %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:label_model)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.text_field :model, :autocomplete => "off" %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:field_vin)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.text_field :vin , :autofocus => true %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix">
|
|
||||||
<%=t(:field_notes)%>:
|
|
||||||
<div class="input">
|
|
||||||
<%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="actions">
|
|
||||||
<%= f.submit %>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
</fieldset>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<% if @vehicles.present? %>
|
|
||||||
|
|
||||||
<% @vehicles.each do |vehicle| %>
|
|
||||||
<div class="row">
|
|
||||||
<div>
|
|
||||||
<b><%= link_to "##{vehicle.id}", vehicle_path(vehicle) %> </b>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<%= vehicle.to_s %>
|
|
||||||
<br/>
|
|
||||||
<%= vehicle.customer %>
|
|
||||||
<br/>
|
|
||||||
<%= vehicle.vin.scan(/.{1,9}/)[0] if vehicle.vin %><b><%=vehicle.vin.scan(/.{1,9}/)[1] if vehicle.vin%></b>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br/>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<div class="actions">
|
|
||||||
<%= will_paginate @vehicles %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p><%=t(:label_matching)%> <%=@vehicles.count%> <%=t(:field_vehicles) %> </p>
|
|
||||||
|
|
||||||
<% else %>
|
|
||||||
<p><%=t(:label_no_vehicles)%> <%= params[:search] %>.</p>
|
|
||||||
<% end %>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<%= form_tag(vehicles_path, :method => "get", id: "search-form") do %>
|
|
||||||
<%= text_field_tag :search, params[:search], placeholder: t(:label_search_vin), :autocomplete => "off" %>
|
|
||||||
<%= submit_tag t(:label_search) %>
|
|
||||||
<% end %>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<option value="<%= vehicle.id %>"><%= vehicle.to_s.titleize %></option>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<h1><%=t(:label_edit_customer_vehicle)%></h1>
|
|
||||||
<br/>
|
|
||||||
<%= render :partial => 'vehicles/form' %>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<h2><%=t(:label_cusomer_vehicles)%> <span style="float:right"> <%= render :partial => 'vehicles/search' %> </span> </h2>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<%= render :partial => 'vehicles/list' %>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<h2><%=t(:label_new_vehicle)%></h2>
|
|
||||||
<br/>
|
|
||||||
<%= render :partial => 'vehicles/form' %>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<h2><%=t(:field_vehicle)%> #<%=@vehicle.id%></h2>
|
|
||||||
|
|
||||||
<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %>
|
|
||||||
|
|
||||||
<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)} %>
|
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
$(function() {
|
$(function() {
|
||||||
$("input#issue_customer_id").on("change", function() {
|
$("input#issue_customer_id").on("change", function() {
|
||||||
$.ajax({
|
|
||||||
url: "/filter_vehicles_by_customer",
|
|
||||||
type: "GET",
|
|
||||||
data: { selected_customer: $("input#issue_customer_id").val() }
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "/filter_estimates_by_customer",
|
url: "/filter_estimates_by_customer",
|
||||||
@@ -13,11 +8,4 @@ $(function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$("input#project_customer_id").on("change", function() {
|
|
||||||
$.ajax({
|
|
||||||
url: "/filter_vehicles_by_customer",
|
|
||||||
type: "GET",
|
|
||||||
data: { selected_customer: $("input#project_customer_id").val() }
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
@@ -16,9 +16,6 @@ en:
|
|||||||
field_employee: "Employee"
|
field_employee: "Employee"
|
||||||
field_invoice: "Invoice"
|
field_invoice: "Invoice"
|
||||||
field_estimate: "Estimate"
|
field_estimate: "Estimate"
|
||||||
field_vehicles: "Vehicles"
|
|
||||||
field_vehicle: "Vehicle"
|
|
||||||
field_vin: "VIN"
|
|
||||||
field_notes: "Notes"
|
field_notes: "Notes"
|
||||||
field_billed: "Billed"
|
field_billed: "Billed"
|
||||||
label_week: "Week"
|
label_week: "Week"
|
||||||
@@ -31,13 +28,8 @@ en:
|
|||||||
label_year: "Year"
|
label_year: "Year"
|
||||||
label_make: " Make"
|
label_make: " Make"
|
||||||
label_model: "Model"
|
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_no_customers: "There are no customers containing the term(s)"
|
||||||
label_matching: "Matching "
|
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_open_issues: "Open Issues"
|
||||||
label_closed_issues: "Closed Issues"
|
label_closed_issues: "Closed Issues"
|
||||||
label_sync: "Sync"
|
label_sync: "Sync"
|
||||||
@@ -94,3 +86,5 @@ en:
|
|||||||
label_create_estimate: "Create Estimate"
|
label_create_estimate: "Create Estimate"
|
||||||
label_syncing: "Syncing Quickbooks"
|
label_syncing: "Syncing Quickbooks"
|
||||||
label_sandbox: "Sandbox"
|
label_sandbox: "Sandbox"
|
||||||
|
button_bulk_pdf: "Bulk PDF"
|
||||||
|
label_select_all: "Select All"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
@@ -31,15 +31,9 @@ get 'customers/view/:token', :to => 'customers#view', as: :view
|
|||||||
get 'customers/share/:id', :to => 'customers#share', as: :share
|
get 'customers/share/:id', :to => 'customers#share', as: :share
|
||||||
|
|
||||||
#java script routes
|
#java script routes
|
||||||
get 'filter_vehicles_by_customer' => 'customers#filter_vehicles_by_customer'
|
|
||||||
get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer'
|
get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer'
|
||||||
get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer'
|
get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer'
|
||||||
|
|
||||||
# Nest Vehicles under customers
|
|
||||||
resources :customers do
|
resources :customers do
|
||||||
resources :vehicles
|
|
||||||
get :autocomplete_customer_name, :on => :collection
|
get :autocomplete_customer_name, :on => :collection
|
||||||
end
|
end
|
||||||
|
|
||||||
#allow for just vehicles too
|
|
||||||
resources :vehicles
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class UpdateIssuesWithVehicles < ActiveRecord::Migration[5.1]
|
|
||||||
def change
|
|
||||||
add_reference :issues, :vehicles, index: true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class UpdateVehicles < ActiveRecord::Migration[5.1]
|
|
||||||
def change
|
|
||||||
add_column :vehicles, :name, :text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 +12,5 @@ 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
|
||||||
rename_column :vehicles, :qbo_customer_id, :customer_id
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class UpdateProjects < ActiveRecord::Migration[5.1]
|
|
||||||
def change
|
|
||||||
add_reference :projects, :customer, index: true
|
|
||||||
add_reference :projects, :vehicle, index: true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The License
|
#The License
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 Rick Barrette - All Rights Reserved
|
#Copyright (c) 2016 - 2026 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.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2023 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
19
init.rb
19
init.rb
@@ -11,10 +11,10 @@
|
|||||||
Redmine::Plugin.register :redmine_qbo do
|
Redmine::Plugin.register :redmine_qbo do
|
||||||
|
|
||||||
# About
|
# About
|
||||||
name 'Redmine Quickbooks Online plugin'
|
name 'Redmine QBO DEVELOPMENT plugin'
|
||||||
author 'Rick Barrette'
|
author 'Rick Barrette'
|
||||||
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
|
description 'This is a plugin for Redmine to intergrate with Quickbooks Online to allow for seamless intergration CRM and invoicing of completed issues'
|
||||||
version '2026.1.0'
|
version '2026.1.2'
|
||||||
url 'https://github.com/rickbarrette/redmine_qbo'
|
url 'https://github.com/rickbarrette/redmine_qbo'
|
||||||
author_url 'https://barrettefabrication.com'
|
author_url 'https://barrettefabrication.com'
|
||||||
settings :default => {'empty' => true}, :partial => 'qbo/settings'
|
settings :default => {'empty' => true}, :partial => 'qbo/settings'
|
||||||
@@ -25,11 +25,8 @@ Redmine::Plugin.register :redmine_qbo do
|
|||||||
Issue.safe_attributes 'item_id'
|
Issue.safe_attributes 'item_id'
|
||||||
Issue.safe_attributes 'estimate_id'
|
Issue.safe_attributes 'estimate_id'
|
||||||
Issue.safe_attributes 'invoice_id'
|
Issue.safe_attributes 'invoice_id'
|
||||||
Issue.safe_attributes 'vehicles_id'
|
|
||||||
User.safe_attributes 'employee_id'
|
User.safe_attributes 'employee_id'
|
||||||
TimeEntry.safe_attributes 'billed'
|
TimeEntry.safe_attributes 'billed'
|
||||||
Project.safe_attributes 'customer_id'
|
|
||||||
Project.safe_attributes 'vehicle_id'
|
|
||||||
|
|
||||||
# set per_page globally
|
# set per_page globally
|
||||||
WillPaginate.per_page = 20
|
WillPaginate.per_page = 20
|
||||||
@@ -37,16 +34,16 @@ Redmine::Plugin.register :redmine_qbo do
|
|||||||
# Permissions for security
|
# Permissions for security
|
||||||
permission :view_customers, :customers => :index, :public => false
|
permission :view_customers, :customers => :index, :public => false
|
||||||
permission :add_customers, :customers => :new, :public => false
|
permission :add_customers, :customers => :new, :public => false
|
||||||
permission :view_vehicles, :vehicles => :new, :public => false
|
|
||||||
|
|
||||||
# Register top menu items
|
# Register top menu items
|
||||||
menu :top_menu, :customers, { :controller => :customers, :action => :index }, :caption => 'Customers', :if => Proc.new {User.current.logged?}
|
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
|
||||||
|
|
||||||
# Dynamically load all Hooks & Patches
|
# Dynamically load all Hooks & Patches recursively
|
||||||
Dir::foreach(File.join(File.dirname(__FILE__), 'lib')) do |file|
|
base_dir = File.join(File.dirname(__FILE__), 'lib')
|
||||||
next unless file.end_with?('.rb')
|
|
||||||
require_relative "lib/#{file.delete_suffix(".rb") }"
|
# '**' looks inside subdirectories, '*.rb' matches Ruby files
|
||||||
|
Dir.glob(File.join(base_dir, '**', '*.rb')).sort.each do |file|
|
||||||
|
require file
|
||||||
end
|
end
|
||||||
@@ -1,14 +1,19 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 rick barrette
|
||||||
#
|
#
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
#
|
#
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
module Hooks
|
||||||
|
|
||||||
class HeaderFooterHookListener < Redmine::Hook::ViewListener
|
class HeaderFooterHookListener < Redmine::Hook::ViewListener
|
||||||
def view_layouts_base_body_bottom(context = {})
|
def view_layouts_base_body_bottom(context = {})
|
||||||
return "<div id='footer' align='center'><b>#{I18n.translate(:label_last_sync)}: </b> #{Qbo.last_sync if Qbo.exists?}</div>"
|
return "<div id='footer' align='center'><b>#{I18n.translate(:label_last_sync)}: </b> #{Qbo.last_sync if Qbo.exists?}</div>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
71
lib/hooks/issues_form_hook_listener.rb
Normal file
71
lib/hooks/issues_form_hook_listener.rb
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
#The MIT License (MIT)
|
||||||
|
#
|
||||||
|
#Copyright (c) 2016 - 2026 rick barrette
|
||||||
|
#
|
||||||
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
module Hooks
|
||||||
|
|
||||||
|
class IssuesFormHookListener < Redmine::Hook::ViewListener
|
||||||
|
|
||||||
|
include IssuesHelper
|
||||||
|
|
||||||
|
# Edit Issue Form
|
||||||
|
# Here we build the required form components before passing them to a partial view formatting.
|
||||||
|
def view_issues_form_details_bottom(context={})
|
||||||
|
f = context[:form]
|
||||||
|
issue = context[:issue]
|
||||||
|
|
||||||
|
# Check to see if the issue already belongs to a customer
|
||||||
|
selected_customer = issue.customer ? issue.customer.id : nil
|
||||||
|
selected_estimate = issue.estimate ? issue.estimate.id : nil
|
||||||
|
|
||||||
|
# Gernerate edit.js link
|
||||||
|
js_link = "updateIssueFrom('#{escape_javascript update_issue_form_path(issue.project, issue)}', this)"
|
||||||
|
|
||||||
|
# Load customer information
|
||||||
|
customer = Customer.find_by_id(selected_customer) if selected_customer
|
||||||
|
|
||||||
|
# Customer Name Text Box with database backed autocomplete
|
||||||
|
search_customer = f.autocomplete_field :customer,
|
||||||
|
autocomplete_customer_name_customers_path,
|
||||||
|
:selected => selected_customer,
|
||||||
|
:onchange => js_link,
|
||||||
|
: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 => js_link
|
||||||
|
|
||||||
|
# Load estimates
|
||||||
|
if issue.customer
|
||||||
|
estimates = customer.estimates.pluck(:doc_number, :id).sort! {|x, y| y <=> x}
|
||||||
|
else
|
||||||
|
estimates = [nil].compact
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate the drop down list of quickbooks estimates
|
||||||
|
select_estimate = f.select :estimate_id, estimates, :selected => selected_estimate, include_blank: true
|
||||||
|
|
||||||
|
# Pass all prebuilt form components to our partial
|
||||||
|
context[:controller].send(:render_to_string, {
|
||||||
|
:partial => 'issues/form_hook',
|
||||||
|
locals: {
|
||||||
|
search_customer: search_customer,
|
||||||
|
customer_id: customer_id,
|
||||||
|
select_estimate: select_estimate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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,24 +8,24 @@
|
|||||||
#
|
#
|
||||||
#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 UpdateVehiclesTrim < ActiveRecord::Migration[5.1]
|
module Hooks
|
||||||
def change
|
|
||||||
|
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
|
||||||
|
def controller_issues_edit_after_save(context={})
|
||||||
|
issue = context[:issue]
|
||||||
begin
|
begin
|
||||||
add_column :vehicles, :doors, :text
|
issue.bill_time if issue.status.is_closed?
|
||||||
add_column :vehicles, :trim, :text
|
|
||||||
|
|
||||||
reversible do |direction|
|
|
||||||
direction.up {
|
|
||||||
|
|
||||||
# Update local vehicle database by forcing a save, look at before_save
|
|
||||||
vehicles = Vehicle.all
|
|
||||||
vehicles.each { |vehicle|
|
|
||||||
vehicle.save!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end
|
|
||||||
rescue
|
rescue
|
||||||
logger.error "Failed to update vehicles"
|
# TODO flash[:error] = "Unable to bill, check QBO Auth"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
54
lib/hooks/issues_show_hook_listener.rb
Normal file
54
lib/hooks/issues_show_hook_listener.rb
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#The MIT License (MIT)
|
||||||
|
#
|
||||||
|
#Copyright (c) 2016 - 2026 rick barrette
|
||||||
|
#
|
||||||
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
module Hooks
|
||||||
|
|
||||||
|
class IssuesShowHookListener < Redmine::Hook::ViewListener
|
||||||
|
|
||||||
|
# View Issue
|
||||||
|
# Display the quickbooks contact in the issue
|
||||||
|
def view_issues_show_details_bottom(context={})
|
||||||
|
issue = context[:issue]
|
||||||
|
|
||||||
|
# Check to see if there is a quickbooks user attached to the issue
|
||||||
|
if issue.customer
|
||||||
|
customer = link_to issue.customer.name, customer_path( issue.customer.id )
|
||||||
|
end
|
||||||
|
|
||||||
|
# Estimate Number
|
||||||
|
if issue.estimate
|
||||||
|
estimate = issue.estimate.doc_number
|
||||||
|
estimate_link = link_to estimate, estimate_path( issue.estimate.id ), :target => "_blank"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Invoice Number
|
||||||
|
invoice_link = ""
|
||||||
|
if issue.invoice_ids
|
||||||
|
issue.invoice_ids.each do |i|
|
||||||
|
invoice = Invoice.find i
|
||||||
|
invoice_link = invoice_link + link_to( invoice.doc_number, invoice_path( i ), :target => "_blank").to_s + " "
|
||||||
|
invoice_link = invoice_link.html_safe
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context[:controller].send(:render_to_string, {
|
||||||
|
:partial => 'issues/show_details',
|
||||||
|
locals: {
|
||||||
|
customer: customer,
|
||||||
|
estimate_link: estimate_link,
|
||||||
|
invoice_link: invoice_link,
|
||||||
|
issue: issue
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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,17 +8,22 @@
|
|||||||
#
|
#
|
||||||
#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[5.1]
|
module Hooks
|
||||||
|
|
||||||
def change
|
class UsersShowHookListener < Redmine::Hook::ViewListener
|
||||||
create_table :vehicles do |t|
|
|
||||||
t.integer :year
|
# View User
|
||||||
t.string :make
|
def view_users_form(context={})
|
||||||
t.string :model
|
|
||||||
t.string :vin
|
# Update the users
|
||||||
t.text :notes
|
#Employee.update_all
|
||||||
|
|
||||||
|
# Check to see if there is a quickbooks user attached to the issue
|
||||||
|
@selected = context[:user].employee.id if context[:user].employee
|
||||||
|
|
||||||
|
# Generate the drop down list of quickbooks contacts
|
||||||
|
return "<p>#{context[:form].select :employee_id, Employee.all.pluck(:name, :id), :selected => @selected, include_blank: true}</p>"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
add_reference :vehicles, :qbo_customer, index: true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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,8 +8,12 @@
|
|||||||
#
|
#
|
||||||
#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.
|
||||||
|
|
||||||
|
module Hooks
|
||||||
|
|
||||||
class ViewHookListener < Redmine::Hook::ViewListener
|
class ViewHookListener < Redmine::Hook::ViewListener
|
||||||
|
|
||||||
render_on :view_layouts_base_sidebar, :partial => "qbo/sidebar"
|
render_on :view_layouts_base_sidebar, :partial => "qbo/sidebar"
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2017 rick barrette
|
#Copyright (c) 2016 - 2026 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,22 +8,18 @@
|
|||||||
#
|
#
|
||||||
#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 IssuesSaveHookListener < Redmine::Hook::ViewListener
|
module Hooks
|
||||||
|
|
||||||
# Called Before Issue Saved
|
class ViewLayoutsHookListener < Redmine::Hook::ViewListener
|
||||||
def controller_issues_edit_before_save(context={})
|
|
||||||
issue = context[:issue]
|
# Load the javascript to support the autocomplete forms
|
||||||
issue.subject = issue.subject.titleize
|
def view_layouts_base_html_head(context = {})
|
||||||
end
|
js = javascript_include_tag 'application.js', :plugin => 'redmine_qbo'
|
||||||
|
js += javascript_include_tag 'autocomplete-rails.js', :plugin => 'redmine_qbo'
|
||||||
|
js += javascript_include_tag 'checkbox_controller.js', :plugin => 'redmine_qbo'
|
||||||
|
return js
|
||||||
|
end
|
||||||
|
|
||||||
# Called After Issue Saved
|
|
||||||
def controller_issues_edit_after_save(context={})
|
|
||||||
issue = context[:issue]
|
|
||||||
begin
|
|
||||||
issue.bill_time if issue.status.is_closed?
|
|
||||||
rescue
|
|
||||||
# TODO flash[:error] = "Unable to bill, check QBO Auth"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2024 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
require_dependency 'issue'
|
|
||||||
|
|
||||||
# Patches Redmine's Issues dynamically.
|
|
||||||
# Adds a relationships
|
|
||||||
module IssuePatch
|
|
||||||
|
|
||||||
def self.included(base) # :nodoc:
|
|
||||||
base.extend(ClassMethods)
|
|
||||||
|
|
||||||
base.send(:include, InstanceMethods)
|
|
||||||
|
|
||||||
# Same as typing in the class
|
|
||||||
base.class_eval do
|
|
||||||
belongs_to :customer, primary_key: :id
|
|
||||||
belongs_to :customer_token, primary_key: :id
|
|
||||||
belongs_to :estimate, primary_key: :id
|
|
||||||
has_and_belongs_to_many :invoices
|
|
||||||
belongs_to :vehicle, primary_key: :id
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module ClassMethods
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module InstanceMethods
|
|
||||||
|
|
||||||
# Create billable time entries
|
|
||||||
def bill_time
|
|
||||||
|
|
||||||
# Check to see if we have everything we need to bill the customer
|
|
||||||
return if assigned_to.nil?
|
|
||||||
return unless Qbo.first
|
|
||||||
return unless customer
|
|
||||||
|
|
||||||
# Get unbilled time entries
|
|
||||||
spent_time = time_entries.where(billed: [false, nil])
|
|
||||||
spent_hours ||= spent_time.sum(:hours) || 0
|
|
||||||
|
|
||||||
if spent_hours > 0 then
|
|
||||||
|
|
||||||
# Prepare to create a new Time Activity
|
|
||||||
qbo = Qbo.first
|
|
||||||
qbo.perform_authenticated_request do |access_token|
|
|
||||||
time_service = Quickbooks::Service::TimeActivity.new(:company_id => qbo.realm_id, :access_token => access_token)
|
|
||||||
item_service = Quickbooks::Service::Item.new(:company_id => qbo.realm_id, :access_token => access_token)
|
|
||||||
time_entry = Quickbooks::Model::TimeActivity.new
|
|
||||||
|
|
||||||
# Lets total up each activity before billing.
|
|
||||||
# This will simpify the invoicing with a single billable time entry per time activity
|
|
||||||
h = Hash.new(0)
|
|
||||||
spent_time.each do |entry|
|
|
||||||
h[entry.activity.name] += entry.hours
|
|
||||||
# update time entries billed status
|
|
||||||
entry.billed = true
|
|
||||||
entry.save
|
|
||||||
end
|
|
||||||
|
|
||||||
# Now letes upload our totals for each activity as their own billable time entry
|
|
||||||
h.each do |key, val|
|
|
||||||
|
|
||||||
# Convert float spent time to hours and minutes
|
|
||||||
hours = val.to_i
|
|
||||||
minutesDecimal = (( val - hours) * 60)
|
|
||||||
minutes = minutesDecimal.to_i
|
|
||||||
|
|
||||||
# Lets match the activity to an qbo item
|
|
||||||
item = item_service.query("SELECT * FROM Item WHERE Name = '#{key}' ").first
|
|
||||||
next if item.nil?
|
|
||||||
|
|
||||||
# Create the new billable time entry and upload it
|
|
||||||
time_entry.description = "#{tracker} ##{id}: #{subject} #{"(Partial @ #{done_ratio}%)" if not closed?}"
|
|
||||||
time_entry.employee_id = assigned_to.employee_id
|
|
||||||
time_entry.customer_id = customer_id
|
|
||||||
time_entry.billable_status = "Billable"
|
|
||||||
time_entry.hours = hours
|
|
||||||
time_entry.minutes = minutes
|
|
||||||
time_entry.name_of = "Employee"
|
|
||||||
time_entry.txn_date = Date.today
|
|
||||||
time_entry.hourly_rate = item.unit_price
|
|
||||||
time_entry.item_id = item.id
|
|
||||||
time_entry.start_time = start_date
|
|
||||||
time_entry.end_time = Time.now
|
|
||||||
time_service.create(time_entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Create a shareable link for a customer
|
|
||||||
def share_token
|
|
||||||
CustomerToken.get_token self
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
# Add module to Issue
|
|
||||||
Issue.send(:include, IssuePatch)
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class IssuesFormHookListener < Redmine::Hook::ViewListener
|
|
||||||
|
|
||||||
# Edit Issue Form
|
|
||||||
# Here we build the required form components before passing them to a partial view formatting.
|
|
||||||
def view_issues_form_details_bottom(context={})
|
|
||||||
f = context[:form]
|
|
||||||
issue = context[:issue]
|
|
||||||
|
|
||||||
# check project level customer ownership first
|
|
||||||
# This is done to preload customer information if the entire project is dedicated to a customer
|
|
||||||
if context[:project]
|
|
||||||
selected_customer = context[:project].customer ? context[:project].customer.id : nil
|
|
||||||
selected_vehicle = context[:project].vehicle ? context[:project].vehicle.id : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
# Check to see if the issue already belongs to a customer
|
|
||||||
selected_customer = issue.customer ? issue.customer.id : nil
|
|
||||||
selected_estimate = issue.estimate ? issue.estimate.id : nil
|
|
||||||
selected_vehicle = issue.vehicles_id ? issue.vehicles_id : nil
|
|
||||||
|
|
||||||
# Gernerate edit.js link
|
|
||||||
js_link = issue.new_record? ? "updateIssueFrom('/projects/rmt/issues/new.js', this)" : "updateIssueFrom('/issues/#{issue.id}/edit.js', this)"
|
|
||||||
|
|
||||||
# Load customer information
|
|
||||||
customer = Customer.find_by_id(selected_customer) if selected_customer
|
|
||||||
|
|
||||||
# Customer Name Text Box with database backed autocomplete
|
|
||||||
search_customer = f.autocomplete_field :customer,
|
|
||||||
autocomplete_customer_name_customers_path,
|
|
||||||
:selected => selected_customer,
|
|
||||||
:onchange => js_link,
|
|
||||||
: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 => js_link
|
|
||||||
|
|
||||||
# Load estimates & vehicles
|
|
||||||
if issue.customer
|
|
||||||
if customer.vehicles
|
|
||||||
vehicles = customer.vehicles.pluck(:name, :id)
|
|
||||||
else
|
|
||||||
vehicles = [nil].compact
|
|
||||||
end
|
|
||||||
estimates = customer.estimates.pluck(:doc_number, :id).sort! {|x, y| y <=> x}
|
|
||||||
else
|
|
||||||
vehicles = [nil].compact
|
|
||||||
estimates = [nil].compact
|
|
||||||
end
|
|
||||||
|
|
||||||
# Generate the drop down list of quickbooks estimates & vehicles
|
|
||||||
select_estimate = f.select :estimate_id, estimates, :selected => selected_estimate, include_blank: true
|
|
||||||
vehicle = f.select :vehicles_id, vehicles, :selected => selected_vehicle, include_blank: true
|
|
||||||
|
|
||||||
# Pass all prebuilt form components to our partial
|
|
||||||
context[:controller].send(:render_to_string, {
|
|
||||||
:partial => 'issues/form_hook',
|
|
||||||
locals: {
|
|
||||||
search_customer: search_customer,
|
|
||||||
customer_id: customer_id,
|
|
||||||
js_link: js_link,
|
|
||||||
select_estimate: select_estimate,
|
|
||||||
vehicle: vehicle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class IssuesShowHookListener < Redmine::Hook::ViewListener
|
|
||||||
|
|
||||||
# View Issue
|
|
||||||
# Display the quickbooks contact in the issue
|
|
||||||
def view_issues_show_details_bottom(context={})
|
|
||||||
issue = context[:issue]
|
|
||||||
|
|
||||||
# Check to see if there is a quickbooks user attached to the issue
|
|
||||||
if issue.customer
|
|
||||||
customer = link_to issue.customer.name, customer_path( issue.customer.id )
|
|
||||||
end
|
|
||||||
|
|
||||||
# Estimate Number
|
|
||||||
if issue.estimate
|
|
||||||
estimate = issue.estimate.doc_number
|
|
||||||
estimate_link = link_to estimate, estimate_path( issue.estimate.id ), :target => "_blank"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Invoice Number
|
|
||||||
invoice_link = ""
|
|
||||||
if issue.invoice_ids
|
|
||||||
issue.invoice_ids.each do |i|
|
|
||||||
invoice = Invoice.find i
|
|
||||||
invoice_link = invoice_link + link_to( invoice.doc_number, invoice_path( i ), :target => "_blank").to_s + " "
|
|
||||||
invoice_link = invoice_link.html_safe
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
v = Vehicle.find(issue.vehicles_id)
|
|
||||||
vehicle = link_to v.to_s, vehicle_path( v.id )
|
|
||||||
vin = v.vin
|
|
||||||
notes = v.notes
|
|
||||||
rescue
|
|
||||||
#do nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
split_vin = vin.scan(/.{1,9}/) if vin
|
|
||||||
|
|
||||||
context[:controller].send(:render_to_string, {
|
|
||||||
:partial => 'issues/show_details',
|
|
||||||
locals: {
|
|
||||||
customer: customer,
|
|
||||||
estimate_link: estimate_link,
|
|
||||||
invoice_link: invoice_link,
|
|
||||||
vehicle: vehicle,
|
|
||||||
split_vin: split_vin,
|
|
||||||
notes: notes
|
|
||||||
}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 +10,8 @@
|
|||||||
|
|
||||||
require_dependency 'attachments_controller'
|
require_dependency 'attachments_controller'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
module AttachmentsControllerPatch
|
module AttachmentsControllerPatch
|
||||||
|
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
@@ -40,3 +42,5 @@ end
|
|||||||
|
|
||||||
# Add module to AttachmentsController
|
# Add module to AttachmentsController
|
||||||
AttachmentsController.send(:include, AttachmentsControllerPatch)
|
AttachmentsController.send(:include, AttachmentsControllerPatch)
|
||||||
|
|
||||||
|
end
|
||||||
114
lib/patches/issue_patch.rb
Normal file
114
lib/patches/issue_patch.rb
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
#The MIT License (MIT)
|
||||||
|
#
|
||||||
|
#Copyright (c) 2016 - 2026 rick barrette
|
||||||
|
#
|
||||||
|
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
require_dependency 'issue'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
|
|
||||||
|
# Patches Redmine's Issues dynamically.
|
||||||
|
# Adds a relationships
|
||||||
|
module IssuePatch
|
||||||
|
|
||||||
|
def self.included(base) # :nodoc:
|
||||||
|
base.extend(ClassMethods)
|
||||||
|
|
||||||
|
base.send(:include, InstanceMethods)
|
||||||
|
|
||||||
|
# Same as typing in the class
|
||||||
|
base.class_eval do
|
||||||
|
belongs_to :customer, primary_key: :id
|
||||||
|
belongs_to :customer_token, primary_key: :id
|
||||||
|
belongs_to :estimate, primary_key: :id
|
||||||
|
has_and_belongs_to_many :invoices
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module ClassMethods
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module InstanceMethods
|
||||||
|
|
||||||
|
# Create billable time entries
|
||||||
|
def bill_time
|
||||||
|
|
||||||
|
# Check to see if we have everything we need to bill the customer
|
||||||
|
return if assigned_to.nil?
|
||||||
|
return unless Qbo.first
|
||||||
|
return unless customer
|
||||||
|
|
||||||
|
# Get unbilled time entries
|
||||||
|
spent_time = time_entries.where(billed: [false, nil])
|
||||||
|
spent_hours ||= spent_time.sum(:hours) || 0
|
||||||
|
|
||||||
|
if spent_hours > 0 then
|
||||||
|
|
||||||
|
# Prepare to create a new Time Activity
|
||||||
|
qbo = Qbo.first
|
||||||
|
qbo.perform_authenticated_request do |access_token|
|
||||||
|
time_service = Quickbooks::Service::TimeActivity.new(:company_id => qbo.realm_id, :access_token => access_token)
|
||||||
|
item_service = Quickbooks::Service::Item.new(:company_id => qbo.realm_id, :access_token => access_token)
|
||||||
|
time_entry = Quickbooks::Model::TimeActivity.new
|
||||||
|
|
||||||
|
# Lets total up each activity before billing.
|
||||||
|
# This will simpify the invoicing with a single billable time entry per time activity
|
||||||
|
h = Hash.new(0)
|
||||||
|
spent_time.each do |entry|
|
||||||
|
h[entry.activity.name] += entry.hours
|
||||||
|
# update time entries billed status
|
||||||
|
entry.billed = true
|
||||||
|
entry.save
|
||||||
|
end
|
||||||
|
|
||||||
|
# Now letes upload our totals for each activity as their own billable time entry
|
||||||
|
h.each do |key, val|
|
||||||
|
|
||||||
|
# Convert float spent time to hours and minutes
|
||||||
|
hours = val.to_i
|
||||||
|
minutesDecimal = (( val - hours) * 60)
|
||||||
|
minutes = minutesDecimal.to_i
|
||||||
|
|
||||||
|
# Lets match the activity to an qbo item
|
||||||
|
item = item_service.query("SELECT * FROM Item WHERE Name = '#{key}' ").first
|
||||||
|
next if item.nil?
|
||||||
|
|
||||||
|
# Create the new billable time entry and upload it
|
||||||
|
time_entry.description = "#{tracker} ##{id}: #{subject} #{"(Partial @ #{done_ratio}%)" if not closed?}"
|
||||||
|
time_entry.employee_id = assigned_to.employee_id
|
||||||
|
time_entry.customer_id = customer_id
|
||||||
|
time_entry.billable_status = "Billable"
|
||||||
|
time_entry.hours = hours
|
||||||
|
time_entry.minutes = minutes
|
||||||
|
time_entry.name_of = "Employee"
|
||||||
|
time_entry.txn_date = Date.today
|
||||||
|
time_entry.hourly_rate = item.unit_price
|
||||||
|
time_entry.item_id = item.id
|
||||||
|
time_entry.start_time = start_date
|
||||||
|
time_entry.end_time = Time.now
|
||||||
|
time_service.create(time_entry)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Create a shareable link for a customer
|
||||||
|
def share_token
|
||||||
|
CustomerToken.get_token self
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# Add module to Issue
|
||||||
|
Issue.send(:include, IssuePatch)
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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,8 @@
|
|||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
#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 'issues_controller'
|
require_dependency 'issues_controller'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
module IssuesControllerPatch
|
module IssuesControllerPatch
|
||||||
|
|
||||||
module Helper
|
module Helper
|
||||||
@@ -32,3 +34,5 @@ end
|
|||||||
|
|
||||||
# Add module to IssuessController
|
# Add module to IssuessController
|
||||||
IssuesController.send(:include, IssuesControllerPatch)
|
IssuesController.send(:include, IssuesControllerPatch)
|
||||||
|
|
||||||
|
end
|
||||||
276
lib/patches/pdf_patch.rb
Normal file
276
lib/patches/pdf_patch.rb
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
#The MIT License (MIT)
|
||||||
|
#
|
||||||
|
#Copyright (c) 2016 - 2026 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/issues_pdf_helper'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
|
module PdfPatch
|
||||||
|
|
||||||
|
def self.included(base)
|
||||||
|
base.send(:include, InstanceMethods)
|
||||||
|
base.class_eval do
|
||||||
|
alias_method :issue_to_pdf, :issue_to_pdf_with_patch
|
||||||
|
alias_method :issue_to_pdf_with_patch, :issue_to_pdf
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module InstanceMethods
|
||||||
|
|
||||||
|
def issue_to_pdf_with_patch(issue, assoc={})
|
||||||
|
pdf = ::Redmine::Export::PDF::ITCPDF.new(current_language)
|
||||||
|
pdf.set_title("#{issue.project} - #{issue.tracker} ##{issue.id}")
|
||||||
|
pdf.alias_nb_pages
|
||||||
|
pdf.footer_date = format_date(Date.today)
|
||||||
|
pdf.add_page
|
||||||
|
pdf.SetFontStyle('B',11)
|
||||||
|
buf = "#{issue.project} - #{issue.tracker} ##{issue.id}"
|
||||||
|
pdf.RDMMultiCell(190, 5, buf)
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
base_x = pdf.get_x
|
||||||
|
i = 1
|
||||||
|
issue.ancestors.visible.each do |ancestor|
|
||||||
|
pdf.set_x(base_x + i)
|
||||||
|
buf = "#{ancestor.tracker} # #{ancestor.id} (#{ancestor.status.to_s}): #{ancestor.subject}"
|
||||||
|
pdf.RDMMultiCell(190 - i, 5, buf)
|
||||||
|
i += 1 if i < 35
|
||||||
|
end
|
||||||
|
pdf.SetFontStyle('B',11)
|
||||||
|
pdf.RDMMultiCell(190 - i, 5, issue.subject.to_s)
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
pdf.RDMMultiCell(190, 5, "#{format_time(issue.created_on)} - #{issue.author}")
|
||||||
|
pdf.ln
|
||||||
|
|
||||||
|
customer = issue.customer.name if issue.customer
|
||||||
|
left = []
|
||||||
|
left << [l(:field_status), issue.status]
|
||||||
|
left << [l(:field_priority), issue.priority]
|
||||||
|
left << [l(:field_customer), customer]
|
||||||
|
left << [l(:field_assigned_to), issue.assigned_to] unless issue.disabled_core_fields.include?('assigned_to_id')
|
||||||
|
#left << [l(:field_category), issue.category] unless issue.disabled_core_fields.include?('category_id')
|
||||||
|
#left << [l(:field_fixed_version), issue.fixed_version] unless issue.disabled_core_fields.include?('fixed_version_id')
|
||||||
|
|
||||||
|
logger.debug "Calling :pdf_left hook"
|
||||||
|
left_hook_output = Redmine::Hook.call_hook :pdf_left, { issue: issue }
|
||||||
|
unless left_hook_output.nil?
|
||||||
|
left_hook_output.each do |l|
|
||||||
|
left.concat l unless l.nil?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
right = []
|
||||||
|
right << [l(:field_start_date), format_date(issue.start_date)] unless issue.disabled_core_fields.include?('start_date')
|
||||||
|
right << [l(:field_due_date), format_date(issue.due_date)] unless issue.disabled_core_fields.include?('due_date')
|
||||||
|
right << [l(:field_done_ratio), "#{issue.done_ratio}%"] unless issue.disabled_core_fields.include?('done_ratio')
|
||||||
|
right << [l(:field_estimated_hours), l_hours(issue.estimated_hours)] unless issue.disabled_core_fields.include?('estimated_hours')
|
||||||
|
right << [l(:label_spent_time), l_hours(issue.total_spent_hours)] if User.current.allowed_to?(:view_time_entries, issue.project)
|
||||||
|
|
||||||
|
logger.debug "Calling :pdf_right hook"
|
||||||
|
right_hook_output = Redmine::Hook.call_hook :pdf_right, { issue: issue }
|
||||||
|
unless right_hook_output.nil?
|
||||||
|
right_hook_output.each do |r|
|
||||||
|
right.concat r unless r.nil?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
rows = left.size > right.size ? left.size : right.size
|
||||||
|
while left.size < rows
|
||||||
|
left << nil
|
||||||
|
end
|
||||||
|
while right.size < rows
|
||||||
|
right << nil
|
||||||
|
end
|
||||||
|
|
||||||
|
half = (issue.visible_custom_field_values.size / 2.0).ceil
|
||||||
|
issue.visible_custom_field_values.each_with_index do |custom_value, i|
|
||||||
|
(i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value, false)]
|
||||||
|
end
|
||||||
|
|
||||||
|
if pdf.get_rtl
|
||||||
|
border_first_top = 'RT'
|
||||||
|
border_last_top = 'LT'
|
||||||
|
border_first = 'R'
|
||||||
|
border_last = 'L'
|
||||||
|
else
|
||||||
|
border_first_top = 'LT'
|
||||||
|
border_last_top = 'RT'
|
||||||
|
border_first = 'L'
|
||||||
|
border_last = 'R'
|
||||||
|
end
|
||||||
|
|
||||||
|
rows = left.size > right.size ? left.size : right.size
|
||||||
|
rows.times do |i|
|
||||||
|
heights = []
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
item = left[i]
|
||||||
|
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
|
||||||
|
item = right[i]
|
||||||
|
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
|
||||||
|
pdf.SetFontStyle('',9)
|
||||||
|
item = left[i]
|
||||||
|
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
|
||||||
|
item = right[i]
|
||||||
|
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
|
||||||
|
height = heights.max
|
||||||
|
|
||||||
|
item = left[i]
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
|
||||||
|
pdf.SetFontStyle('',9)
|
||||||
|
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 0)
|
||||||
|
|
||||||
|
item = right[i]
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
|
||||||
|
pdf.SetFontStyle('',9)
|
||||||
|
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 2)
|
||||||
|
|
||||||
|
pdf.set_x(base_x)
|
||||||
|
end
|
||||||
|
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(35+155, 5, l(:field_description), "LRT", 1)
|
||||||
|
pdf.SetFontStyle('',9)
|
||||||
|
|
||||||
|
# Set resize image scale
|
||||||
|
pdf.set_image_scale(1.6)
|
||||||
|
text = textilizable(issue, :description,
|
||||||
|
:only_path => false,
|
||||||
|
:edit_section_links => false,
|
||||||
|
:headings => false,
|
||||||
|
:inline_attachments => false
|
||||||
|
)
|
||||||
|
pdf.RDMwriteFormattedCell(35+155, 5, '', '', text, issue.attachments, "LRB")
|
||||||
|
|
||||||
|
unless issue.leaf?
|
||||||
|
truncate_length = (!is_cjk? ? 90 : 65)
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(35+155,5, l(:label_subtask_plural) + ":", "LTR")
|
||||||
|
pdf.ln
|
||||||
|
issue_list(issue.descendants.visible.sort_by(&:lft)) do |child, level|
|
||||||
|
buf = "#{child.tracker} # #{child.id}: #{child.subject}".
|
||||||
|
truncate(truncate_length)
|
||||||
|
level = 10 if level >= 10
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
pdf.RDMCell(35+135,5, (level >=1 ? " " * level : "") + buf, border_first)
|
||||||
|
pdf.SetFontStyle('B',8)
|
||||||
|
pdf.RDMCell(20,5, child.status.to_s, border_last)
|
||||||
|
pdf.ln
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
relations = issue.relations.select { |r| r.other_issue(issue).visible? }
|
||||||
|
unless relations.empty?
|
||||||
|
truncate_length = (!is_cjk? ? 80 : 60)
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(35+155,5, l(:label_related_issues) + ":", "LTR")
|
||||||
|
pdf.ln
|
||||||
|
relations.each do |relation|
|
||||||
|
buf = relation.to_s(issue) {|other|
|
||||||
|
text = ""
|
||||||
|
if Setting.cross_project_issue_relations?
|
||||||
|
text += "#{relation.other_issue(issue).project} - "
|
||||||
|
end
|
||||||
|
text += "#{other.tracker} ##{other.id}: #{other.subject}"
|
||||||
|
text
|
||||||
|
}
|
||||||
|
buf = buf.truncate(truncate_length)
|
||||||
|
pdf.SetFontStyle('', 8)
|
||||||
|
pdf.RDMCell(35+155-60, 5, buf, border_first)
|
||||||
|
pdf.SetFontStyle('B',8)
|
||||||
|
pdf.RDMCell(20,5, relation.other_issue(issue).status.to_s, "")
|
||||||
|
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).start_date), "")
|
||||||
|
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).due_date), border_last)
|
||||||
|
pdf.ln
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pdf.RDMCell(190,5, "", "T")
|
||||||
|
pdf.ln
|
||||||
|
|
||||||
|
if issue.changesets.any? &&
|
||||||
|
User.current.allowed_to?(:view_changesets, issue.project)
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
|
||||||
|
pdf.ln
|
||||||
|
for changeset in issue.changesets
|
||||||
|
pdf.SetFontStyle('B',8)
|
||||||
|
csstr = "#{l(:label_revision)} #{changeset.format_identifier} - "
|
||||||
|
csstr += format_time(changeset.committed_on) + " - " + changeset.author.to_s
|
||||||
|
pdf.RDMCell(190, 5, csstr)
|
||||||
|
pdf.ln
|
||||||
|
unless changeset.comments.blank?
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
pdf.RDMwriteHTMLCell(190,5,'','',
|
||||||
|
changeset.comments.to_s, issue.attachments, "")
|
||||||
|
end
|
||||||
|
pdf.ln
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if assoc[:journals].present?
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(190,5, l(:label_history), "B")
|
||||||
|
pdf.ln
|
||||||
|
assoc[:journals].each do |journal|
|
||||||
|
pdf.SetFontStyle('B',8)
|
||||||
|
title = "##{journal.indice} - #{format_time(journal.created_on)} - #{journal.user}"
|
||||||
|
title << " (#{l(:field_private_notes)})" if journal.private_notes?
|
||||||
|
pdf.RDMCell(190,5, title)
|
||||||
|
pdf.ln
|
||||||
|
pdf.SetFontStyle('I',8)
|
||||||
|
details_to_strings(journal.visible_details, true).each do |string|
|
||||||
|
pdf.RDMMultiCell(190,5, "- " + string)
|
||||||
|
end
|
||||||
|
if journal.notes?
|
||||||
|
pdf.ln unless journal.details.empty?
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
text = textilizable(journal, :notes,
|
||||||
|
:only_path => false,
|
||||||
|
:edit_section_links => false,
|
||||||
|
:headings => false,
|
||||||
|
:inline_attachments => false
|
||||||
|
)
|
||||||
|
pdf.RDMwriteFormattedCell(190,5,'','', text, issue.attachments, "")
|
||||||
|
end
|
||||||
|
pdf.ln
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if issue.attachments.any?
|
||||||
|
pdf.SetFontStyle('B',9)
|
||||||
|
pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
|
||||||
|
pdf.ln
|
||||||
|
for attachment in issue.attachments
|
||||||
|
pdf.SetFontStyle('',8)
|
||||||
|
pdf.RDMCell(80,5, attachment.filename)
|
||||||
|
pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
|
||||||
|
pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
|
||||||
|
pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
|
||||||
|
pdf.ln
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check to see if there is an estimate attached, then combine them
|
||||||
|
if issue.estimate
|
||||||
|
pdf = CombinePDF.parse(pdf.output, allow_optional_content: true)
|
||||||
|
pdf << CombinePDF.parse(issue.estimate.pdf)
|
||||||
|
return pdf.to_pdf
|
||||||
|
end
|
||||||
|
|
||||||
|
return pdf.output
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Redmine::Export::PDF::IssuesPdfHelper.send(:include, PdfPatch)
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 +10,8 @@
|
|||||||
|
|
||||||
require_dependency 'issue_query'
|
require_dependency 'issue_query'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
module QueryPatch
|
module QueryPatch
|
||||||
|
|
||||||
# Add qbo options to the aviable columns
|
# Add qbo options to the aviable columns
|
||||||
@@ -32,3 +34,5 @@ end
|
|||||||
|
|
||||||
# Add module to Issue
|
# Add module to Issue
|
||||||
IssueQuery.send(:prepend, QueryPatch)
|
IssueQuery.send(:prepend, QueryPatch)
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2022 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 +10,8 @@
|
|||||||
|
|
||||||
require_dependency 'time_entry_query'
|
require_dependency 'time_entry_query'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
module TimeEntryQueryPatch
|
module TimeEntryQueryPatch
|
||||||
|
|
||||||
# Add QBO options to columns
|
# Add QBO options to columns
|
||||||
@@ -31,3 +33,5 @@ end
|
|||||||
|
|
||||||
# Add module to TimeEntryQuery
|
# Add module to TimeEntryQuery
|
||||||
TimeEntryQuery.send(:prepend, QueryPatch)
|
TimeEntryQuery.send(:prepend, QueryPatch)
|
||||||
|
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2024 rick barrette
|
#Copyright (c) 2016 - 2026 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,6 +10,8 @@
|
|||||||
|
|
||||||
require_dependency 'user'
|
require_dependency 'user'
|
||||||
|
|
||||||
|
module Patches
|
||||||
|
|
||||||
# Patches Redmine's User dynamically.
|
# Patches Redmine's User dynamically.
|
||||||
# Adds a relationships
|
# Adds a relationships
|
||||||
module UserPatch
|
module UserPatch
|
||||||
@@ -36,3 +38,5 @@ end
|
|||||||
|
|
||||||
# Add module to Issue
|
# Add module to Issue
|
||||||
User.send(:include, UserPatch)
|
User.send(:include, UserPatch)
|
||||||
|
|
||||||
|
end
|
||||||
257
lib/pdf_patch.rb
257
lib/pdf_patch.rb
@@ -1,257 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2024 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/issues_pdf_helper'
|
|
||||||
|
|
||||||
module PdfPatch
|
|
||||||
|
|
||||||
def self.included(base)
|
|
||||||
base.send(:include, InstanceMethods)
|
|
||||||
base.class_eval do
|
|
||||||
alias_method :issue_to_pdf, :issue_to_pdf_with_patch
|
|
||||||
alias_method :issue_to_pdf_with_patch, :issue_to_pdf
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module InstanceMethods
|
|
||||||
|
|
||||||
def issue_to_pdf_with_patch(issue, assoc={})
|
|
||||||
pdf = ::Redmine::Export::PDF::ITCPDF.new(current_language)
|
|
||||||
pdf.set_title("#{issue.project} - #{issue.tracker} ##{issue.id}")
|
|
||||||
pdf.alias_nb_pages
|
|
||||||
pdf.footer_date = format_date(Date.today)
|
|
||||||
pdf.add_page
|
|
||||||
pdf.SetFontStyle('B',11)
|
|
||||||
buf = "#{issue.project} - #{issue.tracker} ##{issue.id}"
|
|
||||||
pdf.RDMMultiCell(190, 5, buf)
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
base_x = pdf.get_x
|
|
||||||
i = 1
|
|
||||||
issue.ancestors.visible.each do |ancestor|
|
|
||||||
pdf.set_x(base_x + i)
|
|
||||||
buf = "#{ancestor.tracker} # #{ancestor.id} (#{ancestor.status.to_s}): #{ancestor.subject}"
|
|
||||||
pdf.RDMMultiCell(190 - i, 5, buf)
|
|
||||||
i += 1 if i < 35
|
|
||||||
end
|
|
||||||
pdf.SetFontStyle('B',11)
|
|
||||||
pdf.RDMMultiCell(190 - i, 5, issue.subject.to_s)
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.RDMMultiCell(190, 5, "#{format_time(issue.created_on)} - #{issue.author}")
|
|
||||||
pdf.ln
|
|
||||||
|
|
||||||
customer = issue.customer.name if issue.customer
|
|
||||||
left = []
|
|
||||||
left << [l(:field_status), issue.status]
|
|
||||||
left << [l(:field_priority), issue.priority]
|
|
||||||
left << [l(:field_customer), customer]
|
|
||||||
left << [l(:field_assigned_to), issue.assigned_to] unless issue.disabled_core_fields.include?('assigned_to_id')
|
|
||||||
#left << [l(:field_category), issue.category] unless issue.disabled_core_fields.include?('category_id')
|
|
||||||
#left << [l(:field_fixed_version), issue.fixed_version] unless issue.disabled_core_fields.include?('fixed_version_id')
|
|
||||||
|
|
||||||
v = Vehicle.find_by_id(issue.vehicles_id)
|
|
||||||
vehicle = v ? v.to_s : nil
|
|
||||||
vin = v ? v.vin : nil
|
|
||||||
notes = v ? v.notes : nil
|
|
||||||
left << [l(:field_vehicles), vehicle]
|
|
||||||
left << [l(:field_vin), vin ? vin.gsub(/(.{9})/, '\1 ') : nil]
|
|
||||||
#left << [l(:field_notes), notes]
|
|
||||||
|
|
||||||
right = []
|
|
||||||
right << [l(:field_start_date), format_date(issue.start_date)] unless issue.disabled_core_fields.include?('start_date')
|
|
||||||
right << [l(:field_due_date), format_date(issue.due_date)] unless issue.disabled_core_fields.include?('due_date')
|
|
||||||
right << [l(:field_done_ratio), "#{issue.done_ratio}%"] unless issue.disabled_core_fields.include?('done_ratio')
|
|
||||||
right << [l(:field_estimated_hours), l_hours(issue.estimated_hours)] unless issue.disabled_core_fields.include?('estimated_hours')
|
|
||||||
right << [l(:label_spent_time), l_hours(issue.total_spent_hours)] if User.current.allowed_to?(:view_time_entries, issue.project)
|
|
||||||
right << [l(:field_notes), notes]
|
|
||||||
|
|
||||||
rows = left.size > right.size ? left.size : right.size
|
|
||||||
while left.size < rows
|
|
||||||
left << nil
|
|
||||||
end
|
|
||||||
while right.size < rows
|
|
||||||
right << nil
|
|
||||||
end
|
|
||||||
|
|
||||||
half = (issue.visible_custom_field_values.size / 2.0).ceil
|
|
||||||
issue.visible_custom_field_values.each_with_index do |custom_value, i|
|
|
||||||
(i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value, false)]
|
|
||||||
end
|
|
||||||
|
|
||||||
if pdf.get_rtl
|
|
||||||
border_first_top = 'RT'
|
|
||||||
border_last_top = 'LT'
|
|
||||||
border_first = 'R'
|
|
||||||
border_last = 'L'
|
|
||||||
else
|
|
||||||
border_first_top = 'LT'
|
|
||||||
border_last_top = 'RT'
|
|
||||||
border_first = 'L'
|
|
||||||
border_last = 'R'
|
|
||||||
end
|
|
||||||
|
|
||||||
rows = left.size > right.size ? left.size : right.size
|
|
||||||
rows.times do |i|
|
|
||||||
heights = []
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
item = left[i]
|
|
||||||
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
|
|
||||||
item = right[i]
|
|
||||||
heights << pdf.get_string_height(35, item ? "#{item.first}:" : "")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
item = left[i]
|
|
||||||
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
|
|
||||||
item = right[i]
|
|
||||||
heights << pdf.get_string_height(60, item ? item.last.to_s : "")
|
|
||||||
height = heights.max
|
|
||||||
|
|
||||||
item = left[i]
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 0)
|
|
||||||
|
|
||||||
item = right[i]
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMMultiCell(35, height, item ? "#{item.first}:" : "", (i == 0 ? border_first_top : border_first), '', 0, 0)
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.RDMMultiCell(60, height, item ? item.last.to_s : "", (i == 0 ? border_last_top : border_last), '', 0, 2)
|
|
||||||
|
|
||||||
pdf.set_x(base_x)
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(35+155, 5, l(:field_description), "LRT", 1)
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
|
|
||||||
# Set resize image scale
|
|
||||||
pdf.set_image_scale(1.6)
|
|
||||||
text = textilizable(issue, :description,
|
|
||||||
:only_path => false,
|
|
||||||
:edit_section_links => false,
|
|
||||||
:headings => false,
|
|
||||||
:inline_attachments => false
|
|
||||||
)
|
|
||||||
pdf.RDMwriteFormattedCell(35+155, 5, '', '', text, issue.attachments, "LRB")
|
|
||||||
|
|
||||||
unless issue.leaf?
|
|
||||||
truncate_length = (!is_cjk? ? 90 : 65)
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(35+155,5, l(:label_subtask_plural) + ":", "LTR")
|
|
||||||
pdf.ln
|
|
||||||
issue_list(issue.descendants.visible.sort_by(&:lft)) do |child, level|
|
|
||||||
buf = "#{child.tracker} # #{child.id}: #{child.subject}".
|
|
||||||
truncate(truncate_length)
|
|
||||||
level = 10 if level >= 10
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.RDMCell(35+135,5, (level >=1 ? " " * level : "") + buf, border_first)
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
pdf.RDMCell(20,5, child.status.to_s, border_last)
|
|
||||||
pdf.ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
relations = issue.relations.select { |r| r.other_issue(issue).visible? }
|
|
||||||
unless relations.empty?
|
|
||||||
truncate_length = (!is_cjk? ? 80 : 60)
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(35+155,5, l(:label_related_issues) + ":", "LTR")
|
|
||||||
pdf.ln
|
|
||||||
relations.each do |relation|
|
|
||||||
buf = relation.to_s(issue) {|other|
|
|
||||||
text = ""
|
|
||||||
if Setting.cross_project_issue_relations?
|
|
||||||
text += "#{relation.other_issue(issue).project} - "
|
|
||||||
end
|
|
||||||
text += "#{other.tracker} ##{other.id}: #{other.subject}"
|
|
||||||
text
|
|
||||||
}
|
|
||||||
buf = buf.truncate(truncate_length)
|
|
||||||
pdf.SetFontStyle('', 8)
|
|
||||||
pdf.RDMCell(35+155-60, 5, buf, border_first)
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
pdf.RDMCell(20,5, relation.other_issue(issue).status.to_s, "")
|
|
||||||
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).start_date), "")
|
|
||||||
pdf.RDMCell(20,5, format_date(relation.other_issue(issue).due_date), border_last)
|
|
||||||
pdf.ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
pdf.RDMCell(190,5, "", "T")
|
|
||||||
pdf.ln
|
|
||||||
|
|
||||||
if issue.changesets.any? &&
|
|
||||||
User.current.allowed_to?(:view_changesets, issue.project)
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
|
|
||||||
pdf.ln
|
|
||||||
for changeset in issue.changesets
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
csstr = "#{l(:label_revision)} #{changeset.format_identifier} - "
|
|
||||||
csstr += format_time(changeset.committed_on) + " - " + changeset.author.to_s
|
|
||||||
pdf.RDMCell(190, 5, csstr)
|
|
||||||
pdf.ln
|
|
||||||
unless changeset.comments.blank?
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.RDMwriteHTMLCell(190,5,'','',
|
|
||||||
changeset.comments.to_s, issue.attachments, "")
|
|
||||||
end
|
|
||||||
pdf.ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if assoc[:journals].present?
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(190,5, l(:label_history), "B")
|
|
||||||
pdf.ln
|
|
||||||
assoc[:journals].each do |journal|
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
title = "##{journal.indice} - #{format_time(journal.created_on)} - #{journal.user}"
|
|
||||||
title << " (#{l(:field_private_notes)})" if journal.private_notes?
|
|
||||||
pdf.RDMCell(190,5, title)
|
|
||||||
pdf.ln
|
|
||||||
pdf.SetFontStyle('I',8)
|
|
||||||
details_to_strings(journal.visible_details, true).each do |string|
|
|
||||||
pdf.RDMMultiCell(190,5, "- " + string)
|
|
||||||
end
|
|
||||||
if journal.notes?
|
|
||||||
pdf.ln unless journal.details.empty?
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
text = textilizable(journal, :notes,
|
|
||||||
:only_path => false,
|
|
||||||
:edit_section_links => false,
|
|
||||||
:headings => false,
|
|
||||||
:inline_attachments => false
|
|
||||||
)
|
|
||||||
pdf.RDMwriteFormattedCell(190,5,'','', text, issue.attachments, "")
|
|
||||||
end
|
|
||||||
pdf.ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if issue.attachments.any?
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
|
|
||||||
pdf.ln
|
|
||||||
for attachment in issue.attachments
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.RDMCell(80,5, attachment.filename)
|
|
||||||
pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
|
|
||||||
pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
|
|
||||||
pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
|
|
||||||
pdf.ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
pdf.output
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Redmine::Export::PDF::IssuesPdfHelper.send(:include, PdfPatch)
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2024 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
require_dependency 'project'
|
|
||||||
|
|
||||||
# Patches Redmine's Projects dynamically.
|
|
||||||
# Adds a relationships
|
|
||||||
module ProjectPatch
|
|
||||||
|
|
||||||
def self.included(base) # :nodoc:
|
|
||||||
base.extend(ClassMethods)
|
|
||||||
|
|
||||||
base.send(:include, InstanceMethods)
|
|
||||||
|
|
||||||
# Same as typing in the class
|
|
||||||
base.class_eval do
|
|
||||||
belongs_to :customer, primary_key: :id
|
|
||||||
belongs_to :vehicle, primary_key: :id
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module ClassMethods
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module InstanceMethods
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
# Add module to Project
|
|
||||||
Project.send(:include, ProjectPatch)
|
|
||||||
@@ -1,36 +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 ProjectsFormHookListener < Redmine::Hook::ViewListener
|
|
||||||
|
|
||||||
# Edit Project Form
|
|
||||||
def view_projects_form(context={})
|
|
||||||
f = context[:form]
|
|
||||||
|
|
||||||
# Check to see if there is a quickbooks user attached to the issue
|
|
||||||
selected_customer = context[:project].customer ? context[:project].customer : nil
|
|
||||||
selected_vehicle = context[:project].vehicle_id ? context[:project].vehicle_id : nil
|
|
||||||
|
|
||||||
# Load customer information
|
|
||||||
customer = Customer.find_by_id(selected_customer) if selected_customer
|
|
||||||
search_customer = f.autocomplete_field :customer, autocomplete_customer_name_customers_path, :selected => selected_customer, :update_elements => {:id => '#project_customer_id', :value => '#project_customer'}
|
|
||||||
customer_id = f.hidden_field :customer_id, :id => "project_customer_id"
|
|
||||||
|
|
||||||
if context[:project].customer
|
|
||||||
vehicles = customer.vehicles.pluck(:name, :id).sort!
|
|
||||||
else
|
|
||||||
vehicles = [nil].compact
|
|
||||||
end
|
|
||||||
|
|
||||||
vehicle = f.select :vehicle_id, vehicles, :selected => selected_vehicle, include_blank: true
|
|
||||||
|
|
||||||
return "<p><label for=\"project_customer\">Customer</label>#{search_customer} #{customer_id}</p> <p>#{vehicle}</p>"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2022 rick barrette
|
|
||||||
#
|
|
||||||
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
class UsersShowHookListener < Redmine::Hook::ViewListener
|
|
||||||
|
|
||||||
# View User
|
|
||||||
def view_users_form(context={})
|
|
||||||
|
|
||||||
# Update the users
|
|
||||||
#Employee.update_all
|
|
||||||
|
|
||||||
# Check to see if there is a quickbooks user attached to the issue
|
|
||||||
@selected = context[:user].employee.id if context[:user].employee
|
|
||||||
|
|
||||||
# Generate the drop down list of quickbooks contacts
|
|
||||||
return "<p>#{context[:form].select :employee_id, Employee.all.pluck(:name, :id), :selected => @selected, include_blank: true}</p>"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#The MIT License (MIT)
|
|
||||||
#
|
|
||||||
#Copyright (c) 2026 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 ViewLayoutsHookListener < Redmine::Hook::ViewListener
|
|
||||||
|
|
||||||
# Load the javascript to support the autocomplete forms
|
|
||||||
def view_layouts_base_html_head(context = {})
|
|
||||||
js = javascript_include_tag 'application.js', :plugin => 'redmine_qbo'
|
|
||||||
js += javascript_include_tag 'autocomplete-rails.js', :plugin => 'redmine_qbo'
|
|
||||||
js += javascript_include_tag 'checkbox_controller.js', :plugin => 'redmine_qbo'
|
|
||||||
return js
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#The MIT License (MIT)
|
#The MIT License (MIT)
|
||||||
#
|
#
|
||||||
#Copyright (c) 2016 rick barrette
|
#Copyright (c) 2016 - 2026 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:
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user