From e314dae10dd9ffd21a2ec7d3e92bc99df294d6ef Mon Sep 17 00:00:00 2001 From: Rick Barrette Date: Sat, 12 Feb 2022 09:02:46 -0500 Subject: [PATCH] Logging & exception handler for updating invoices --- app/controllers/qbo_controller.rb | 19 ++++++++++++++++--- app/models/qbo_invoice.rb | 16 +++++++++++++++- app/views/qbo/_settings.html.erb | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/controllers/qbo_controller.rb b/app/controllers/qbo_controller.rb index cdd22e4..12da934 100644 --- a/app/controllers/qbo_controller.rb +++ b/app/controllers/qbo_controller.rb @@ -87,6 +87,8 @@ class QboController < ApplicationController # Quickbooks Webhook Callback def qbo_webhook + + logger.debug "Quickbooks is calling webhook" # check the payload signature = request.headers['intuit-signature'] @@ -110,10 +112,12 @@ class QboController < ApplicationController # TODO rename all other models! name.prepend("Qbo") if not name.eql? "Customer" - + + logger.debug "Casting #{name.constantize} to obj" + # Magicly initialize the correct class obj = name.constantize - + # for merge events obj.destroy(entity['deletedId']) if entity['deletedId'] @@ -122,7 +126,13 @@ class QboController < ApplicationController obj.destroy(id) #if not then update! else - obj.sync_by_id(id) + begin + obj.sync_by_id(id) + rescue => e + logger.error "Failed to call sync_by_id on obj" + logger.error e.message + logger.error e.backtrace.join("\n") + end end end @@ -134,12 +144,15 @@ class QboController < ApplicationController else render nothing: true, status: 400 end + + logger.debug "Quickbooks webhook complete" end # # Synchronizes the QboCustomer table with QBO # def sync + logger.debug "Syncing EVERYTHING" # Update info in background Thread.new do if Qbo.exists? diff --git a/app/models/qbo_invoice.rb b/app/models/qbo_invoice.rb index 6623edf..13b7d15 100644 --- a/app/models/qbo_invoice.rb +++ b/app/models/qbo_invoice.rb @@ -23,6 +23,7 @@ class QboInvoice < ActiveRecord::Base # sync ALL the invoices def self.sync + logger.debug "Syncing all invoices" last = Qbo.first.last_sync query = "SELECT Id, DocNumber FROM Invoice" @@ -42,6 +43,7 @@ class QboInvoice < ActiveRecord::Base #sync by invoice ID def self.sync_by_id(id) + logger.debug "Syncing invoice #{id}" #update the information in the database invoice = get_base.fetch_by_id(id) process_invoice invoice @@ -56,6 +58,8 @@ class QboInvoice < ActiveRecord::Base # skip this issue if the issue customer is not the same as the invoice customer return if issue.customer_id != invoice.customer_ref.value.to_i + logger.debug "Attaching invoice #{invoice.id} to issue #{issue.id}" + # Load the invoice into the database qbo_invoice = QboInvoice.find_or_create_by(id: invoice.id) qbo_invoice.doc_number = invoice.doc_number @@ -73,6 +77,7 @@ class QboInvoice < ActiveRecord::Base # processes the invoice into the system def self.process_invoice(invoice) + logger.debug "Processing invoice" # Check the private notes if not invoice.private_note.nil? invoice.private_note.scan(/#(\w+)/).flatten.each { |issue| @@ -105,6 +110,7 @@ class QboInvoice < ActiveRecord::Base 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 @@ -149,7 +155,15 @@ class QboInvoice < ActiveRecord::Base # Push updates #invoice.sync_token += 1 if is_changed - get_base.update(invoice) if is_changed + begin + if is_changed + logger.debug "Trying to update invoice" + get_base.update(invoice) if is_changed + end + rescue + #do nothing + logger.fatal "Failed to update invoice" + end end end diff --git a/app/views/qbo/_settings.html.erb b/app/views/qbo/_settings.html.erb index a998e42..96db2a2 100644 --- a/app/views/qbo/_settings.html.erb +++ b/app/views/qbo/_settings.html.erb @@ -15,7 +15,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI