feat(workshop): vehicles must be assigned to a customer
Some checks failed
CI / lint-and-test (3.11) (push) Has been cancelled
CI / lint-and-test (3.13) (push) Has been cancelled

- Added customer_id column to fleet_vehicles with FK to customers.

- Enforced customer_id on create_vehicle endpoints (workshop and fleet).

- New vehicle modal now requires a selected customer and stores customer_id.

- Migration v4.13 applied to all tenants.
This commit is contained in:
2026-06-30 19:53:00 +00:00
parent 1af66cb302
commit 66b8fe3d69
5 changed files with 76 additions and 16 deletions

View File

@@ -708,6 +708,22 @@ var Workshop = (function() {
function openNewVehicleModal(context) {
newVehicleContext = context || 'edit';
var customerId = null;
var customerName = '';
if (newVehicleContext === 'new') {
var sel = document.getElementById('noCustomer');
customerId = sel ? parseInt(sel.value, 10) || null : null;
customerName = sel && sel.selectedIndex >= 0 ? sel.options[sel.selectedIndex].text : '';
} else {
customerId = currentOrder ? currentOrder.customer_id : null;
customerName = currentOrder ? (currentOrder.customer_name || '') : '';
}
if (!customerId) {
alert('Primero selecciona un cliente para poder crear el vehículo.');
return;
}
document.getElementById('nvCustomerId').value = customerId;
document.getElementById('nvCustomerName').value = customerName;
document.getElementById('newVehicleModal').classList.add('is-open');
document.getElementById('nvPlate').value = '';
document.getElementById('nvVIN').value = '';
@@ -715,7 +731,6 @@ var Workshop = (function() {
document.getElementById('nvModel').value = '';
document.getElementById('nvYear').value = '';
document.getElementById('nvColor').value = '';
document.getElementById('nvOwner').value = '';
}
function openNewVehicleModalFromNewOrder() {
@@ -729,18 +744,23 @@ var Workshop = (function() {
async function saveNewVehicle() {
var plate = document.getElementById('nvPlate').value.trim();
var vin = document.getElementById('nvVIN').value.trim();
var customerId = parseInt(document.getElementById('nvCustomerId').value, 10) || null;
if (!plate && !vin) {
alert('Se requiere al menos placa o VIN');
return;
}
if (!customerId) {
alert('El vehículo debe estar asignado a un cliente');
return;
}
var payload = {
plate: plate,
vin: vin,
customer_id: customerId,
make: document.getElementById('nvMake').value.trim() || null,
model: document.getElementById('nvModel').value.trim() || null,
year: document.getElementById('nvYear').value ? parseInt(document.getElementById('nvYear').value, 10) : null,
color: document.getElementById('nvColor').value.trim() || null,
owner_name: document.getElementById('nvOwner').value.trim() || null,
branch_id: (currentOrder ? currentOrder.branch_id : null) || (window.POS_USER ? window.POS_USER.branch_id : null)
};
try {