diff --git a/src/pages/POS/Inventory/EditModal.vue b/src/pages/POS/Inventory/EditModal.vue index 34b4859..32b485a 100644 --- a/src/pages/POS/Inventory/EditModal.vue +++ b/src/pages/POS/Inventory/EditModal.vue @@ -770,8 +770,8 @@ watch(activeTab, (tab) => { diff --git a/src/pages/POS/Movements/Edit.vue b/src/pages/POS/Movements/Edit.vue index 852e8a7..4c38dfe 100644 --- a/src/pages/POS/Movements/Edit.vue +++ b/src/pages/POS/Movements/Edit.vue @@ -227,79 +227,85 @@ const closeModal = () => { emit('close'); }; +/** Helpers */ +const applySerials = (movement) => { + const isTransfer = movement.movement_type === 'transfer'; + const isExit = movement.movement_type === 'exit'; + const rawSerials = isTransfer + ? (movement.transferred_serials || []) + : isExit + ? (movement.exited_serials || []) + : (movement.serials || []); + + if (isTransfer || isExit) { + selectedSerialObjects.value = rawSerials; + } + + if (rawSerials.length > 0) { + const movementWarehouseId = movement.warehouse_to?.id || movement.warehouse_to_id; + + serialsList.value = rawSerials.map(s => { + let locked = false; + let lock_reason = null; + + const isOwnExitSerial = isExit && s.status === 'salida'; + + if (!isOwnExitSerial && s.status !== 'disponible') { + locked = true; + lock_reason = s.status; + } else if ( + !isTransfer && !isExit && + s.warehouse_id && + movementWarehouseId && + s.warehouse_id !== movementWarehouseId + ) { + locked = true; + lock_reason = 'traspasado'; + } + + return { serial_number: s.serial_number, locked, lock_reason }; + }); + } else { + serialsList.value = [{ serial_number: '', locked: false }]; + } +}; + /** Observadores */ watch(() => props.show, (isShown) => { if (isShown) { loadWarehouses(); if (props.movement) { - // Cargar datos del movimiento + // Cargar datos básicos del formulario desde el prop form.quantity = props.movement.quantity || 0; form.unit_cost = props.movement.unit_cost || 0; form.invoice_reference = props.movement.invoice_reference || ''; form.notes = props.movement.notes || ''; form.supplier_id = props.movement.supplier_id || null; - // Cargar números de serie según tipo de movimiento - const isTransfer = props.movement.movement_type === 'transfer'; - const isExit = props.movement.movement_type === 'exit'; - const rawSerials = isTransfer - ? (props.movement.transferred_serials || []) - : isExit - ? (props.movement.exited_serials || []) - : (props.movement.serials || []); - - // Para traspasos/salidas: inicializar objetos de seriales para SerialSelector - if (isTransfer || isExit) { - selectedSerialObjects.value = rawSerials; - } - - if (rawSerials.length > 0) { - const movementWarehouseId = props.movement.warehouse_id || props.movement.warehouse_to?.id; - - serialsList.value = rawSerials.map(s => { - let locked = false; - let lock_reason = null; - - // Seriales con status='salida' son propios de este movimiento → editables - const isOwnExitSerial = isExit && s.status === 'salida'; - - if (!isOwnExitSerial && s.status !== 'disponible') { - locked = true; - lock_reason = s.status; - } else if ( - !isTransfer && !isExit && - s.warehouse_id && - movementWarehouseId && - s.warehouse_id !== movementWarehouseId - ) { - locked = true; - lock_reason = 'traspasado'; - } - - return { serial_number: s.serial_number, locked, lock_reason }; - }); - } else if (props.movement.serial_numbers && props.movement.serial_numbers.length > 0) { - serialsList.value = props.movement.serial_numbers.map(sn => ({ - serial_number: sn, - locked: false - })); - } else { - serialsList.value = [{ serial_number: '', locked: false }]; - } - // Almacenes según tipo if (props.movement.movement_type === 'entry') { - form.destination_warehouse_id = props.movement.warehouse_id || ''; + form.destination_warehouse_id = props.movement.warehouse_to_id || props.movement.warehouse_to?.id || ''; } else if (props.movement.movement_type === 'exit') { form.origin_warehouse_id = props.movement.warehouse_from_id || props.movement.warehouse_from?.id || ''; } else if (props.movement.movement_type === 'transfer') { form.origin_warehouse_id = props.movement.warehouse_from_id || props.movement.warehouse_from?.id || ''; form.destination_warehouse_id = props.movement.warehouse_to_id || props.movement.warehouse_to?.id || ''; } + + // Limpiar seriales mientras se carga el detalle + serialsList.value = [{ serial_number: '', locked: false }]; + selectedSerialObjects.value = []; + + // Obtener el movimiento completo con seriales desde el endpoint de detalle + api.get(apiURL(`movimientos/${props.movement.id}`), { + onSuccess: (data) => { + applySerials(data.movement); + } + }); } } else { - // Limpiar seriales al cerrar + // Limpiar al cerrar serialsText.value = ''; } }, { immediate: true });