diff --git a/Gemfile b/Gemfile index baf0247..a533ef1 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,6 @@ source 'https://rubygems.org' gem 'quickbooks-ruby' gem 'oauth2' gem 'roxml' -gem 'nhtsa_vin' gem 'will_paginate' gem 'rails-jquery-autocomplete' gem 'jquery-ui-rails' diff --git a/README.md b/README.md index 51ae0a2..c4357cf 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,6 @@ Note: After the inital synchronization, this plugin will recieve push notificati ## TODO * Add Setting for Sandbox Mode - * Seperate Vehicles into a seperate plugin (I use redmine for my automotive shop management 😉) * MORE Stuff as I make it up... ## License diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index dae292c..a160314 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -39,12 +39,6 @@ class CustomersController < ApplicationController params.require(:customer).permit(:name, :email, :primary_phone, :mobile_phone, :phone_number, :notes) 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 # used for customer autocomplete field / issue form def filter_invoices_by_customer @@ -88,7 +82,6 @@ class CustomersController < ApplicationController def show begin @customer = Customer.find_by_id(params[:id]) - @vehicles = @customer.vehicles.paginate(:page => params[:page]) @issues = @customer.issues.order(id: :desc) @billing_address = address_to_s(@customer.billing_address) @shipping_address = address_to_s(@customer.shipping_address) diff --git a/app/controllers/vehicles_controller.rb b/app/controllers/vehicles_controller.rb deleted file mode 100644 index e353c8e..0000000 --- a/app/controllers/vehicles_controller.rb +++ /dev/null @@ -1,126 +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. - -# This controller class will handle map management -class VehiclesController < ApplicationController - unloadable - - 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_attributes(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 diff --git a/app/models/customer.rb b/app/models/customer.rb index a4a7639..b1d5cb3 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -15,8 +15,7 @@ class Customer < ActiveRecord::Base has_many :purchases has_many :invoices has_many :estimates - has_many :vehicles - + validates_presence_of :id, :name self.primary_key = :id diff --git a/app/models/vehicle.rb b/app/models/vehicle.rb deleted file mode 100644 index bc99259..0000000 --- a/app/models/vehicle.rb +++ /dev/null @@ -1,100 +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 Vehicle < ActiveRecord::Base - - unloadable - - 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 diff --git a/app/views/customers/filter_vehicles_by_customer.js.erb b/app/views/customers/filter_vehicles_by_customer.js.erb deleted file mode 100644 index fbf2e0e..0000000 --- a/app/views/customers/filter_vehicles_by_customer.js.erb +++ /dev/null @@ -1 +0,0 @@ -$('select#issue_vehicles_id').html('<%= j content_tag(:option,'',:value=>"")+options_from_collection_for_select(@filtered_vehicles, :id, :to_s) %>'); diff --git a/app/views/customers/show.html.erb b/app/views/customers/show.html.erb index af5d5b7..0241d42 100644 --- a/app/views/customers/show.html.erb +++ b/app/views/customers/show.html.erb @@ -24,11 +24,7 @@
-

<%=t(:field_vehicles)%>:

- <%= render :partial => 'vehicles/list' %> -
- <%= button_to "New Vehicle", new_customer_vehicle_path(@customer), method: :get %> -
+ <% call_hook :show_customer_view_right %>
diff --git a/app/views/issues/_form_hook.html.erb b/app/views/issues/_form_hook.html.erb index c1833dc..49350ed 100644 --- a/app/views/issues/_form_hook.html.erb +++ b/app/views/issues/_form_hook.html.erb @@ -9,6 +9,7 @@ <%= select_estimate %>

-

- <%= vehicle %> -

\ No newline at end of file + +<%#

%> + <%# <%= call_hook here %> %> +<%#

%> \ No newline at end of file diff --git a/app/views/issues/_show_details.html.erb b/app/views/issues/_show_details.html.erb index be53694..dc8f79d 100644 --- a/app/views/issues/_show_details.html.erb +++ b/app/views/issues/_show_details.html.erb @@ -17,19 +17,6 @@
-
-
<%=t(:field_vehicle)%>:
-
<%= vehicle %>
-
- -
-
<%=t(:field_vin)%>:
-
<%=split_vin[0] if split_vin%><%=split_vin[1] if split_vin%>
-
- -
-
<%=t(:field_notes)%>:
-
<%=notes%>
-
+ <%# call_hook here %>
diff --git a/app/views/vehicles/_details.html.erb b/app/views/vehicles/_details.html.erb deleted file mode 100644 index b8293e1..0000000 --- a/app/views/vehicles/_details.html.erb +++ /dev/null @@ -1,45 +0,0 @@ -
-
-
-

<%=t(:label_details)%>:

- - - - - - - - - - - - - - - - - - - - - - - -
<%= t(:field_customer)%><%= link_to vehicle.customer.name, customer_path(vehicle.customer) %>
<%= t(:field_vehicle) %><%= vehicle.to_s %>
<%= t(:field_vin) %><%= @vin[0] if @vin %><%=@vin[1] if @vin%>
<%= t(:label_trim) %><%= vehicle.doors %> <%=t(:label_door) if vehicle.doors? %> <%= vehicle.trim %>
- -
- -
- -

<%=t(:field_notes)%>:

- <%= vehicle.notes %> - - -
-
-
- -
- <%= 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)} %> -
diff --git a/app/views/vehicles/_form.html.erb b/app/views/vehicles/_form.html.erb deleted file mode 100644 index 8e85442..0000000 --- a/app/views/vehicles/_form.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -
-
-
- - <%= form_for @vehicle do |f| %> -
- <%=t(:field_customer)%>: -
- <%= 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 %> -
-
- -
- <%=t(:label_year)%>: -
- <%= f.number_field :year, :autocomplete => "off" %> -
-
- -
- <%=t(:label_make)%>: -
- <%= f.text_field :make, :autocomplete => "off" %> -
-
- -
- <%=t(:label_model)%>: -
- <%= f.text_field :model, :autocomplete => "off" %> -
-
- -
- <%=t(:field_vin)%>: -
- <%= f.text_field :vin , :autofocus => true %> -
-
- -
- <%=t(:field_notes)%>: -
- <%= f.text_area :notes, :cols => 60, :rows => 10, :no_label => true %> -
-
- -
- <%= f.submit %> -
- <% end %> - -
-
-
diff --git a/app/views/vehicles/_list.html.erb b/app/views/vehicles/_list.html.erb deleted file mode 100644 index 6710936..0000000 --- a/app/views/vehicles/_list.html.erb +++ /dev/null @@ -1,28 +0,0 @@ -<% if @vehicles.present? %> - - <% @vehicles.each do |vehicle| %> -
-
- <%= link_to "##{vehicle.id}", vehicle_path(vehicle) %> -
- -
- <%= vehicle.to_s %> -
- <%= vehicle.customer %> -
- <%= vehicle.vin.scan(/.{1,9}/)[0] if vehicle.vin %><%=vehicle.vin.scan(/.{1,9}/)[1] if vehicle.vin%> -
-
-
- <% end %> - -
- <%= will_paginate @vehicles %> -
- -

<%=t(:label_matching)%> <%=@vehicles.count%> <%=t(:field_vehicles) %>

- -<% else %> -

<%=t(:label_no_vehicles)%> <%= params[:search] %>.

-<% end %> diff --git a/app/views/vehicles/_search.html.erb b/app/views/vehicles/_search.html.erb deleted file mode 100644 index ba79ae2..0000000 --- a/app/views/vehicles/_search.html.erb +++ /dev/null @@ -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 %> diff --git a/app/views/vehicles/_vehicle.html.erb b/app/views/vehicles/_vehicle.html.erb deleted file mode 100644 index bec180d..0000000 --- a/app/views/vehicles/_vehicle.html.erb +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/views/vehicles/edit.html.erb b/app/views/vehicles/edit.html.erb deleted file mode 100644 index 9490f6b..0000000 --- a/app/views/vehicles/edit.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -

<%=t(:label_edit_customer_vehicle)%>

-
-<%= render :partial => 'vehicles/form' %> diff --git a/app/views/vehicles/index.html.erb b/app/views/vehicles/index.html.erb deleted file mode 100644 index 2538e89..0000000 --- a/app/views/vehicles/index.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -

<%=t(:label_cusomer_vehicles)%> <%= render :partial => 'vehicles/search' %>

-
- -<%= render :partial => 'vehicles/list' %> diff --git a/app/views/vehicles/new.html.erb b/app/views/vehicles/new.html.erb deleted file mode 100644 index b99af4d..0000000 --- a/app/views/vehicles/new.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -

<%=t(:label_new_vehicle)%>

-
-<%= render :partial => 'vehicles/form' %> diff --git a/app/views/vehicles/show.html.erb b/app/views/vehicles/show.html.erb deleted file mode 100644 index d440c20..0000000 --- a/app/views/vehicles/show.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -

<%=t(:field_vehicle)%> #<%=@vehicle.id%>

- -<%= render :partial => 'vehicles/details', locals: {vehicle: @vehicle} %> - -

<%=@issues.open.count%> <%=t(:label_open_issues)%>

- -<%= render :partial => 'issues/list_simple', locals: {issues: @issues.open} %> - -

<%=@closed_issues.count%> <%=t(:label_closed_issues)%>

- -<%= render :partial => 'issues/list_simple', locals: {issues: (@closed_issues)} %> diff --git a/assets/javascripts/application.js b/assets/javascripts/application.js index 7c6b938..f240bcc 100644 --- a/assets/javascripts/application.js +++ b/assets/javascripts/application.js @@ -1,10 +1,5 @@ $(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({ 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() } - }); - }); }); diff --git a/config/locales/en.yml b/config/locales/en.yml index 8001ac6..e0d53d7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -16,9 +16,6 @@ en: field_employee: "Employee" field_invoice: "Invoice" field_estimate: "Estimate" - field_vehicles: "Vehicles" - field_vehicle: "Vehicle" - field_vin: "VIN" field_notes: "Notes" field_billed: "Billed" label_week: "Week" @@ -31,13 +28,8 @@ en: label_year: "Year" label_make: " Make" label_model: "Model" - label_no_vehicles: "There are no vehicles containing the term(s)" label_no_customers: "There are no customers containing the term(s)" label_matching: "Matching " - label_search_vin: "Search Vehicles by VIN" - label_edit_customer_vehicle: "Edit Customer Vehicle" - label_cusomer_vehicles: "Customer Vehicles" - label_new_vehicle: "New Customer Vehicle" label_open_issues: "Open Issues" label_closed_issues: "Closed Issues" label_sync: "Sync" diff --git a/config/routes.rb b/config/routes.rb index ee9844e..ea77e4b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -31,15 +31,9 @@ get 'customers/view/:token', :to => 'customers#view', as: :view get 'customers/share/:id', :to => 'customers#share', as: :share #java script routes -get 'filter_vehicles_by_customer' => 'customers#filter_vehicles_by_customer' get 'filter_estimates_by_customer' => 'customers#filter_estimates_by_customer' get 'filter_invoices_by_customer' => 'customers#filter_invoices_by_customer' -# Nest Vehicles under customers resources :customers do - resources :vehicles get :autocomplete_customer_name, :on => :collection end - -#allow for just vehicles too -resources :vehicles diff --git a/db/migrate/016_create_vehicles.rb b/db/migrate/016_create_vehicles.rb deleted file mode 100644 index 59722f1..0000000 --- a/db/migrate/016_create_vehicles.rb +++ /dev/null @@ -1,24 +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 CreateVehicles < ActiveRecord::Migration[5.1] - - def change - create_table :vehicles do |t| - t.integer :year - t.string :make - t.string :model - t.string :vin - t.text :notes - end - - add_reference :vehicles, :qbo_customer, index: true - end -end diff --git a/db/migrate/017_update_issues_with_vehicles.rb b/db/migrate/017_update_issues_with_vehicles.rb deleted file mode 100644 index 087f933..0000000 --- a/db/migrate/017_update_issues_with_vehicles.rb +++ /dev/null @@ -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 diff --git a/db/migrate/018_update_vehicles.rb b/db/migrate/018_update_vehicles.rb deleted file mode 100644 index a61a9c5..0000000 --- a/db/migrate/018_update_vehicles.rb +++ /dev/null @@ -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 diff --git a/db/migrate/019_qbocustomers_to_customers.rb b/db/migrate/019_qbocustomers_to_customers.rb index daa0753..1eb9bbb 100644 --- a/db/migrate/019_qbocustomers_to_customers.rb +++ b/db/migrate/019_qbocustomers_to_customers.rb @@ -12,6 +12,5 @@ class QbocustomersToCustomers< ActiveRecord::Migration[5.1] def change rename_table :qbo_customers, :customers rename_column :issues, :qbo_customer_id, :customer_id - rename_column :vehicles, :qbo_customer_id, :customer_id end end diff --git a/db/migrate/025_update_projects.rb b/db/migrate/025_update_projects.rb index 995f92a..c1ec9c8 100644 --- a/db/migrate/025_update_projects.rb +++ b/db/migrate/025_update_projects.rb @@ -11,6 +11,5 @@ class UpdateProjects < ActiveRecord::Migration[5.1] def change add_reference :projects, :customer, index: true - add_reference :projects, :vehicle, index: true end end diff --git a/db/migrate/033_update_vehicles_trim.rb b/db/migrate/033_update_vehicles_trim.rb deleted file mode 100644 index c94f05b..0000000 --- a/db/migrate/033_update_vehicles_trim.rb +++ /dev/null @@ -1,30 +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 UpdateVehiclesTrim < ActiveRecord::Migration[5.1] - def change - add_column :vehicles, :doors, :text - 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 - - end - -end diff --git a/init.rb b/init.rb index dddcbb0..cd2785d 100644 --- a/init.rb +++ b/init.rb @@ -33,12 +33,10 @@ Redmine::Plugin.register :redmine_qbo do Issue.safe_attributes 'item_id' Issue.safe_attributes 'estimate_id' Issue.safe_attributes 'invoice_id' - Issue.safe_attributes 'vehicles_id' User.safe_attributes 'employee_id' TimeEntry.safe_attributes 'billed' Project.safe_attributes 'customer_id' - Project.safe_attributes 'vehicle_id' - + # We are playing in the sandbox #Quickbooks.sandbox_mode = true @@ -48,10 +46,8 @@ Redmine::Plugin.register :redmine_qbo do # Permissions for security permission :view_customers, :customers => :index, :public => false permission :add_customers, :customers => :new, :public => false - permission :view_vehicles, :vehicles => :new, :public => false - + # Register top menu items 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 diff --git a/lib/issue_patch.rb b/lib/issue_patch.rb index a804bff..4ca933c 100644 --- a/lib/issue_patch.rb +++ b/lib/issue_patch.rb @@ -26,7 +26,6 @@ module IssuePatch 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 diff --git a/lib/issues_form_hook_listener.rb b/lib/issues_form_hook_listener.rb index e3d279a..9962995 100644 --- a/lib/issues_form_hook_listener.rb +++ b/lib/issues_form_hook_listener.rb @@ -26,13 +26,11 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener # 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 = context[:issue].customer ? context[:issue].customer.id : nil selected_estimate = context[:issue].estimate ? context[:issue].estimate.id : nil - selected_vehicle = context[:issue].vehicles_id ? context[:issue].vehicles_id : nil # Load customer information customer = Customer.find_by_id(selected_customer) if selected_customer @@ -52,22 +50,15 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener :id => "issue_customer_id", :onchange => "updateIssueFrom('/issues/#{context[:issue].id}/edit.js', this)" - # Load estimates & vehicles + # Load estimates if context[: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 + # Generate the drop down list of quickbooks estimates 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, { @@ -77,7 +68,6 @@ class IssuesFormHookListener < Redmine::Hook::ViewListener customer_id: customer_id, context: context, select_estimate: select_estimate, - vehicle: vehicle } } ) diff --git a/lib/issues_show_hook_listener.rb b/lib/issues_show_hook_listener.rb index 8a61e27..dceca3f 100644 --- a/lib/issues_show_hook_listener.rb +++ b/lib/issues_show_hook_listener.rb @@ -35,27 +35,13 @@ class IssuesShowHookListener < Redmine::Hook::ViewListener 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 + invoice_link: invoice_link } }) end diff --git a/lib/project_patch.rb b/lib/project_patch.rb index 907031c..ac72a1b 100644 --- a/lib/project_patch.rb +++ b/lib/project_patch.rb @@ -23,7 +23,6 @@ module ProjectPatch base.class_eval do unloadable # Send unloadable so it will not be unloaded in development belongs_to :customer, primary_key: :id - belongs_to :vehicle, primary_key: :id end end end diff --git a/lib/projects_form_hook_listener.rb b/lib/projects_form_hook_listener.rb index ef04179..bdaa6db 100644 --- a/lib/projects_form_hook_listener.rb +++ b/lib/projects_form_hook_listener.rb @@ -16,21 +16,12 @@ class ProjectsFormHookListener < Redmine::Hook::ViewListener # 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 "

#{search_customer} #{customer_id}

#{vehicle}

" + return "

#{search_customer} #{customer_id}

" end end diff --git a/lib/qbo_hook_listener.rb b/lib/qbo_hook_listener.rb deleted file mode 100644 index 1853444..0000000 --- a/lib/qbo_hook_listener.rb +++ /dev/null @@ -1,72 +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. - -# TODO move this into seperate plugin -class QboHookListener < Redmine::Hook::Listener - - # Check to see if the Invoice custom field VIN matches - def process_invoice_custom_fields(context = {}) - Rails.logger.debug "QboHookListener.process_invoice_custom_fields" - issue = context[:issue] - invoice = context[:invoice] - is_changed = false - - # update the invoive custom fields with infomation from the issue if available - invoice.custom_fields.each { |cf| - - # VIN from the attached vehicle - begin - if cf.name.eql? "VIN" - # Only update if blank to prevent infite loops - # TODO check cf_sync_confict flag once implemented - if cf.string_value.to_s.blank? - logger.debug " 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.debug "VIN has changed" - is_changed = true - end - - end - end - rescue - #do nothing - end - } - - return { issue: issue, invoice: invoice, is_changed: is_changed } - end - - # Add vehicle information to the left side of the pdf attribute block - def pdf_left(context = {}) - left = [] - issue = context[:issue] - v = Vehicle.find_by_id(issue.vehicles_id) - vehicle = v.to_s unless v.nil? - vin = v.vin.gsub(/(.{9})/, '\1 ') unless v.nil? - - left << [l(:field_vehicles), vehicle] - left << [l(:field_vin), vin] - return left - end - - # Add vehicle information to the right side of the pdf attribute block - def pdf_right(context = {}) - right = [] - issue = context[:issue] - v = Vehicle.find_by_id(issue.vehicles_id) - notes = v unless v.nil? - right << [l(:field_notes), notes] - return right - end - -end