feat(workshop): allow admin/owner to delete service orders
Some checks failed
CI / lint-and-test (3.11) (push) Has been cancelled
CI / lint-and-test (3.13) (push) Has been cancelled

- Soft-delete service orders via is_deleted flag.

- Added DELETE /pos/api/service-orders/<id> restricted to owner/admin.

- Updated list, detail, summary, status and assignment queries to exclude deleted orders.

- Added 'Eliminar orden' button in the detail modal for administrators.
This commit is contained in:
2026-06-30 17:51:09 +00:00
parent 2863cf8e9f
commit e9cfb2e756
5 changed files with 68 additions and 7 deletions

View File

@@ -27,6 +27,7 @@ var Workshop = (function() {
var hidePrices = role === 'workshop' || role === 'mechanic';
var perms = user.permissions || [];
var canEdit = role === 'owner' || role === 'admin' || perms.indexOf('workshop.edit') !== -1;
var canDelete = role === 'owner' || role === 'admin';
var canSell = role === 'owner' || role === 'admin' || perms.indexOf('pos.sell') !== -1;
var COLUMNS = [
@@ -413,6 +414,7 @@ var Workshop = (function() {
'</div>' : '';
footer.innerHTML = statusHtml +
'<button class="btn btn--ghost" onclick="Workshop.closeDetailModal()">Cerrar</button>' +
(canDelete ? '<button class="btn btn--danger" onclick="Workshop.deleteOrder()">Eliminar orden</button>' : '') +
'<button class="btn btn--secondary" onclick="Workshop.printOrder()">' +
'<svg viewBox="0 0 24 24"><polyline points="6 9 6 2 18 2 18 9"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="6" y="14" width="12" height="8"/></svg>' +
'Imprimir orden</button>' +
@@ -699,6 +701,18 @@ var Workshop = (function() {
}).catch(function(e) { alert('Error: ' + e.message); });
}
function deleteOrder() {
if (!currentOrderId) return;
if (!confirm('¿Eliminar esta orden de servicio? Se ocultará del taller pero las reservas de inventario y la venta asociada (si existe) no se verán afectadas.')) return;
api('DELETE', '/' + currentOrderId, {})
.then(function() {
closeDetailModal();
loadSummary();
loadOrders();
})
.catch(function(e) { alert('Error: ' + e.message); });
}
function printOrder() {
if (!currentOrderId) return;
if (!window.NexusPrinter || !window.NexusPrinter.isConnected()) {
@@ -907,6 +921,7 @@ var Workshop = (function() {
addSelectedItem: addSelectedItem,
addLabor: addLabor,
convertToSale: convertToSale,
deleteOrder: deleteOrder,
printOrder: printOrder,
openNewOrderModal: openNewOrderModal,
closeNewOrderModal: closeNewOrderModal,