feat: ajustar validaciones de entrada en el formulario de edición de inventario

This commit is contained in:
Juan Felipe Zapata Moreno 2026-03-11 21:50:17 -06:00
parent 18755271d3
commit 6fac8d0797
2 changed files with 59 additions and 53 deletions

View File

@ -770,8 +770,8 @@ watch(activeTab, (tab) => {
<FormInput <FormInput
v-model.number="eqForm.conversion_factor" v-model.number="eqForm.conversion_factor"
type="number" type="number"
min="0.001" min="0"
step="0.001" step="any"
placeholder="Ej: 24" placeholder="Ej: 24"
required required
/> />

View File

@ -227,41 +227,27 @@ const closeModal = () => {
emit('close'); emit('close');
}; };
/** Observadores */ /** Helpers */
watch(() => props.show, (isShown) => { const applySerials = (movement) => {
if (isShown) { const isTransfer = movement.movement_type === 'transfer';
loadWarehouses(); const isExit = movement.movement_type === 'exit';
if (props.movement) {
// Cargar datos del movimiento
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 const rawSerials = isTransfer
? (props.movement.transferred_serials || []) ? (movement.transferred_serials || [])
: isExit : isExit
? (props.movement.exited_serials || []) ? (movement.exited_serials || [])
: (props.movement.serials || []); : (movement.serials || []);
// Para traspasos/salidas: inicializar objetos de seriales para SerialSelector
if (isTransfer || isExit) { if (isTransfer || isExit) {
selectedSerialObjects.value = rawSerials; selectedSerialObjects.value = rawSerials;
} }
if (rawSerials.length > 0) { if (rawSerials.length > 0) {
const movementWarehouseId = props.movement.warehouse_id || props.movement.warehouse_to?.id; const movementWarehouseId = movement.warehouse_to?.id || movement.warehouse_to_id;
serialsList.value = rawSerials.map(s => { serialsList.value = rawSerials.map(s => {
let locked = false; let locked = false;
let lock_reason = null; let lock_reason = null;
// Seriales con status='salida' son propios de este movimiento editables
const isOwnExitSerial = isExit && s.status === 'salida'; const isOwnExitSerial = isExit && s.status === 'salida';
if (!isOwnExitSerial && s.status !== 'disponible') { if (!isOwnExitSerial && s.status !== 'disponible') {
@ -279,27 +265,47 @@ watch(() => props.show, (isShown) => {
return { serial_number: s.serial_number, locked, lock_reason }; 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 { } else {
serialsList.value = [{ serial_number: '', locked: false }]; serialsList.value = [{ serial_number: '', locked: false }];
} }
};
/** Observadores */
watch(() => props.show, (isShown) => {
if (isShown) {
loadWarehouses();
if (props.movement) {
// 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;
// Almacenes según tipo // Almacenes según tipo
if (props.movement.movement_type === 'entry') { 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') { } else if (props.movement.movement_type === 'exit') {
form.origin_warehouse_id = props.movement.warehouse_from_id || props.movement.warehouse_from?.id || ''; form.origin_warehouse_id = props.movement.warehouse_from_id || props.movement.warehouse_from?.id || '';
} else if (props.movement.movement_type === 'transfer') { } else if (props.movement.movement_type === 'transfer') {
form.origin_warehouse_id = props.movement.warehouse_from_id || props.movement.warehouse_from?.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 || ''; 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 { } else {
// Limpiar seriales al cerrar // Limpiar al cerrar
serialsText.value = ''; serialsText.value = '';
} }
}, { immediate: true }); }, { immediate: true });