diff --git a/src/components/POS/SerialInputList.vue b/src/components/POS/SerialInputList.vue index b8240cd..dca3371 100644 --- a/src/components/POS/SerialInputList.vue +++ b/src/components/POS/SerialInputList.vue @@ -10,6 +10,10 @@ const props = defineProps({ disabled: { type: Boolean, default: false + }, + allowRemove: { + type: Boolean, + default: true } }); @@ -133,17 +137,26 @@ watch(() => props.modelValue, (val) => { }" /> - + - Vendido + {{ + item.lock_reason === 'traspasado' ? 'Traspasado' : + item.lock_reason === 'salida' ? 'Salida' : + 'Vendido' + }} props.modelValue, (val) => { { }; const validateSerialsAndUnit = () => { - if (form.track_serials && selectedUnit.value && selectedUnit.value.allows_decimals) { - Notify.warning('No se pueden usar números de serie con esta unidad de medida.'); + if (!selectedUnit.value) return; + + if (selectedUnit.value.allows_decimals) { + if (form.track_serials) { + Notify.warning('No se pueden usar números de serie con esta unidad de medida.'); + } form.track_serials = false; + return; + } + + const unitName = (selectedUnit.value.name || '').toLowerCase(); + const unitAbbr = (selectedUnit.value.abbreviation || '').toLowerCase(); + if (unitName.includes('serial') || unitAbbr.includes('serial')) { + form.track_serials = true; } }; @@ -200,7 +211,7 @@ watch(() => form.track_serials, () => { v-model="form.barcode" type="text" placeholder="1234567890123" - maxlength="100" + maxlength="14" /> diff --git a/src/pages/POS/Inventory/EditModal.vue b/src/pages/POS/Inventory/EditModal.vue index 2c0bd93..ada0859 100644 --- a/src/pages/POS/Inventory/EditModal.vue +++ b/src/pages/POS/Inventory/EditModal.vue @@ -134,9 +134,20 @@ const loadEquivalences = () => { }; const validateSerialsAndUnit = () => { - if (form.track_serials && selectedUnit.value && selectedUnit.value.allows_decimals) { - Notify.warning('No se pueden usar números de serie con esta unidad de medida.'); + if (!selectedUnit.value) return; + + if (selectedUnit.value.allows_decimals) { + if (form.track_serials) { + Notify.warning('No se pueden usar números de serie con esta unidad de medida.'); + } form.track_serials = false; + return; + } + + const unitName = (selectedUnit.value.name || '').toLowerCase(); + const unitAbbr = (selectedUnit.value.abbreviation || '').toLowerCase(); + if (unitName.includes('serial') || unitAbbr.includes('serial')) { + form.track_serials = true; } }; @@ -282,7 +293,7 @@ watch(() => props.show, (newValue) => { } }); -watch(() => form.unit_of_measure_id, () => { +watch(selectedUnit, () => { validateSerialsAndUnit(); }); diff --git a/src/pages/POS/Movements/Edit.vue b/src/pages/POS/Movements/Edit.vue index 7e627f9..f5f8f56 100644 --- a/src/pages/POS/Movements/Edit.vue +++ b/src/pages/POS/Movements/Edit.vue @@ -222,12 +222,40 @@ watch(() => props.show, (isShown) => { form.notes = props.movement.notes || ''; form.supplier_id = props.movement.supplier_id || null; - // Cargar números de serie si existen - if (props.movement.serials && props.movement.serials.length > 0) { - serialsList.value = props.movement.serials.map(s => ({ - serial_number: s.serial_number, - locked: s.status === 'vendido' - })); + // 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 || []); + + 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, @@ -241,10 +269,10 @@ watch(() => props.show, (isShown) => { if (props.movement.movement_type === 'entry') { form.destination_warehouse_id = props.movement.warehouse_id || ''; } else if (props.movement.movement_type === 'exit') { - form.origin_warehouse_id = props.movement.warehouse_id || ''; + 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.origin_warehouse_id || ''; - form.destination_warehouse_id = props.movement.destination_warehouse_id || ''; + 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 || ''; } } } else { @@ -337,7 +365,11 @@ watch(() => props.show, (isShown) => { NÚMEROS DE SERIE - + @@ -410,7 +442,7 @@ watch(() => props.show, (isShown) => { Seleccionar almacén... @@ -429,7 +461,8 @@ watch(() => props.show, (isShown) => { Seleccionar... @@ -437,7 +470,6 @@ watch(() => props.show, (isShown) => { v-for="wh in warehouses" :key="wh.id" :value="wh.id" - :disabled="wh.id === form.destination_warehouse_id" > {{ wh.name }} ({{ wh.code }}) @@ -450,8 +482,9 @@ watch(() => props.show, (isShown) => { Seleccionar... props.show, (isShown) => { - + - PROVEEDOR (opcional) + PROVEEDOR - - Seleccionar proveedor... - - {{ supplier.business_name }} - - - + + {{ movement?.supplier?.business_name || 'Sin proveedor' }} +