feat(workshop): add new customer from new order modal
Some checks failed
CI / lint-and-test (3.11) (push) Has been cancelled
CI / lint-and-test (3.13) (push) Has been cancelled

- Added POST /pos/api/service-orders/customers endpoint for workshop.edit users.

- Added 'Nuevo cliente' modal reachable from the new service order form.

- After creation the customer is automatically selected in the order.
This commit is contained in:
2026-06-30 19:45:41 +00:00
parent 603046cb09
commit 5c700e98c3
3 changed files with 152 additions and 3 deletions

View File

@@ -23,6 +23,7 @@ var Workshop = (function() {
var vehicleSearchTimer = null;
var selectedEditVehicle = null;
var newVehicleContext = null;
var newCustomerContext = null;
var currentView = 'list';
var currentPage = 1;
var perPage = 25;
@@ -768,6 +769,65 @@ var Workshop = (function() {
}
}
function openNewCustomerModal(context) {
newCustomerContext = context || 'new';
document.getElementById('newCustomerModal').classList.add('is-open');
document.getElementById('ncName').value = '';
document.getElementById('ncPhone').value = '';
document.getElementById('ncEmail').value = '';
document.getElementById('ncRfc').value = '';
document.getElementById('ncPriceTier').value = '1';
document.getElementById('ncAddress').value = '';
}
function openNewCustomerModalFromNewOrder() {
openNewCustomerModal('new');
}
function closeNewCustomerModal() {
document.getElementById('newCustomerModal').classList.remove('is-open');
}
async function saveNewCustomer() {
var name = document.getElementById('ncName').value.trim();
if (!name) {
alert('El nombre es obligatorio');
return;
}
var payload = {
name: name,
phone: document.getElementById('ncPhone').value.trim() || null,
email: document.getElementById('ncEmail').value.trim() || null,
rfc: document.getElementById('ncRfc').value.trim() || null,
price_tier: parseInt(document.getElementById('ncPriceTier').value, 10) || 1,
address: document.getElementById('ncAddress').value.trim() || null,
branch_id: (currentOrder ? currentOrder.branch_id : null) || (window.POS_USER ? window.POS_USER.branch_id : null)
};
try {
var res = await api('POST', '/customers', payload);
var label = name + (payload.phone ? ' (' + payload.phone + ')' : '');
if (newCustomerContext === 'new') {
var sel = document.getElementById('noCustomer');
var opt = document.createElement('option');
opt.value = res.id;
opt.textContent = label.trim();
sel.appendChild(opt);
sel.value = res.id;
if (typeof customers !== 'undefined') {
customers.push({id: res.id, name: name, phone: payload.phone, rfc: payload.rfc});
}
} else {
selectedEditCustomer = {id: res.id, name: name};
document.getElementById('eoCustomerSearch').value = name;
document.getElementById('eoCustomerId').value = res.id;
}
toast('Cliente creado');
closeNewCustomerModal();
} catch (e) {
alert('Error: ' + e.message);
}
}
// ─── Actions ───
function changeStatus() {
@@ -1181,6 +1241,10 @@ var Workshop = (function() {
openNewVehicleModalFromNewOrder: openNewVehicleModalFromNewOrder,
closeNewVehicleModal: closeNewVehicleModal,
saveNewVehicle: saveNewVehicle,
openNewCustomerModal: openNewCustomerModal,
openNewCustomerModalFromNewOrder: openNewCustomerModalFromNewOrder,
closeNewCustomerModal: closeNewCustomerModal,
saveNewCustomer: saveNewCustomer,
};
})();