mirror of
https://github.com/rickbarrette/redmine_qbo_vehicles.git
synced 2026-04-02 07:01:59 -04:00
record errors and decode existing vins on migration
This commit is contained in:
@@ -76,10 +76,20 @@ class VehiclesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# used by the polling JS in vehicle#show
|
||||
def status
|
||||
vehicle = Vehicle.find(params[:id])
|
||||
|
||||
# decode the vin if it hasn't been done for some reason
|
||||
unless vehicle.vin_decoded
|
||||
if vehicle.error.nil?
|
||||
VehicleVinDecodeJob.perform_later(vehicle)
|
||||
end
|
||||
end
|
||||
|
||||
render json: {
|
||||
decoded: vehicle.vin_decoded
|
||||
decoded: vehicle.vin_decoded,
|
||||
error: vehicle.error
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class VehicleVinDecodeJob < ApplicationJob
|
||||
|
||||
unless result.success?
|
||||
log "Failed to decode vin"
|
||||
vehicle.update(vin_decoded: false)
|
||||
vehicle.update(vin_decoded: false, error: result.error)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -33,7 +33,8 @@ class VehicleVinDecodeJob < ApplicationJob
|
||||
doors: details.doors.presence || vehicle.doors,
|
||||
trim: details.trim.presence || vehicle.trim,
|
||||
name: vehicle.to_s,
|
||||
vin_decoded: true
|
||||
vin_decoded: true,
|
||||
error: nil
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<h2><%=t(:field_vehicle)%> #<%=@vehicle.id%></h2>
|
||||
|
||||
<% unless @vehicle.vin_decoded? %>
|
||||
<div id="vin-status" class="flash notice">
|
||||
<%= t :notice_decoding_vin %>
|
||||
<div id="vin-status" class="flash <%= @vehicle.error ? "error" : "notice" %>">
|
||||
<% if @vehicle.error%>
|
||||
<%= @vehicle.error %>
|
||||
<% else %>
|
||||
<%= t :notice_decoding_vin %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
@@ -35,9 +39,11 @@
|
||||
|
||||
if (alreadyDecoded) return;
|
||||
|
||||
const interval = 3000; // 3 seconds
|
||||
const interval = 3000;
|
||||
let attempts = 0;
|
||||
const maxAttempts = 40; // ~2 minutes
|
||||
const maxAttempts = 40;
|
||||
|
||||
const statusEl = document.getElementById("vin-status");
|
||||
|
||||
const checkStatus = () => {
|
||||
fetch(`/vehicles/${vehicleId}/status`, {
|
||||
@@ -45,22 +51,54 @@
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(data => {
|
||||
|
||||
// SUCCESS → reload
|
||||
if (data.decoded) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
attempts++;
|
||||
if (attempts >= maxAttempts) {
|
||||
clearInterval(timer);
|
||||
console.warn("VIN decode polling timed out");
|
||||
return;
|
||||
}
|
||||
|
||||
// ERROR → stop + show message
|
||||
if (data.error) {
|
||||
clearInterval(timer);
|
||||
|
||||
if (statusEl) {
|
||||
statusEl.classList.remove("notice");
|
||||
statusEl.classList.add("error");
|
||||
statusEl.textContent = data.error;
|
||||
}
|
||||
|
||||
console.warn("VIN decode failed:", data.error);
|
||||
return;
|
||||
}
|
||||
|
||||
// continue polling
|
||||
attempts++;
|
||||
if (attempts >= maxAttempts) {
|
||||
clearInterval(timer);
|
||||
|
||||
if (statusEl) {
|
||||
statusEl.classList.remove("notice");
|
||||
statusEl.classList.add("warning");
|
||||
statusEl.textContent = "VIN decode timed out. Please refresh or try again.";
|
||||
}
|
||||
|
||||
console.warn("VIN decode polling timed out");
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error("Polling error:", err);
|
||||
clearInterval(timer);
|
||||
|
||||
if (statusEl) {
|
||||
statusEl.classList.remove("notice");
|
||||
statusEl.classList.add("error");
|
||||
statusEl.textContent = "Error checking VIN status.";
|
||||
}
|
||||
|
||||
console.error("Polling error:", err);
|
||||
});
|
||||
};
|
||||
|
||||
const timer = setInterval(checkStatus, interval);
|
||||
})();
|
||||
</script>
|
||||
</script>
|
||||
Reference in New Issue
Block a user