Necesito que implementes dos módulos nuevos en mi sistema: 1. INGRESO DE PRODUCTO 2. SALIDA DE PRODUCTO Importante: - Deben ser módulos independientes. - No quiero mezclarlos con compras o ventas normales. - Pero sí deben reutilizar la base lógica, estructura, componentes, validaciones y flujo visual de módulos ya existentes cuando convenga. - Para INGRESO DE PRODUCTO, toma como principal referencia el módulo legacy `purchase guide-new`, porque es el más parecido y ya está implementado completamente. - Para SALIDA DE PRODUCTO, toma como principal referencia el módulo `guide new traslado`, pero simplificado, porque este flujo es interno y no necesita muchas de las cosas formales de una guía de remisión. --- ## CONTEXTO GENERAL ### INGRESO DE PRODUCTO - Se guarda en la tabla `purchase` - Debe usar `voucher_id = 12` - Aumenta stock obligatoriamente - `affect_stock = true` ### SALIDA DE PRODUCTO - Se guarda en la tabla `sale` - Es un flujo interno de salida - Similar a guía de traslado, pero más simple - Sirve para sacar productos por distintas razones internas - Puede también enviar productos a otra sucursal --- ## MÓDULO 1: INGRESO DE PRODUCTO ### Base funcional Este módulo sirve para ingresar productos al stock de forma interna. ### Casos de uso Debe servir para: - recibir productos enviados desde una SALIDA DE PRODUCTO de otra sucursal - regularizar stock por conteos erróneos - ingresar productos resultantes de conversiones - ingresar productos terminados fabricados dentro de la misma empresa ### Persistencia - Guardar en tabla `purchase` - Usar `voucher_id = 12` ### Operaciones permitidas para INGRESO DE PRODUCTO Usar únicamente las operaciones tipo INPUT definidas para este módulo: - id 47 = INGRESO PRODUCTO TERMINADOS - id 48 = INGRESO TRASPASO INTERNO No permitir otras operaciones fuera de esas dentro de este módulo. ### Reglas de negocio de INGRESO DE PRODUCTO - Siempre incrementa stock - `affect_stock = true` - Debe comportarse de forma muy similar a `purchase guide-new` - Debe permitir registrar productos con detalle - Debe permitir indicar el motivo del ingreso mediante las operaciones válidas - Si el ingreso proviene de una salida interna, debe poder relacionar cada línea con el producto de salida correspondiente ### Relación con salida de producto En `purchase_product` existe el campo: - `output_product_id` Ese campo debe usarse para identificar de qué línea de salida proviene esa línea de ingreso. Ejemplo: - una salida de producto genera líneas en `sale_product` - cuando se recibe en ingreso de producto, cada línea en `purchase_product` puede enlazarse a la línea origen mediante `output_product_id` ### Comportamiento esperado de INGRESO DE PRODUCTO - listado - crear - editar - ver detalle - consolidado o resumen - filtro por operación - filtro por sucursal - filtro por fecha - filtro por estado si aplica - posibilidad de identificar si viene de una salida interna ### Casos especiales de INGRESO DE PRODUCTO 1. **Ingreso por traspaso interno** - recibe productos enviados desde otra sucursal - debe poder identificar la salida origen 2. **Ingreso por regularización** - sirve para corregir errores de conteo o inventario 3. **Ingreso por conversión / producción** - sirve cuando se fusionan productos para crear otro - sirve para ingresar productos terminados fabricados internamente --- ## MÓDULO 2: SALIDA DE PRODUCTO ### Base funcional Este módulo sirve para sacar productos de stock por motivos internos. ### Persistencia - Guardar en tabla `sale` ### Referencia técnica - Tomar como base `guide new traslado` - Pero simplificarlo porque es un flujo interno - No debe cargar toda la complejidad de guía de remisión formal - Solo guardar datos generales necesarios ### Operaciones permitidas para SALIDA DE PRODUCTO Usar únicamente operaciones tipo OUTPUT válidas para este módulo: - id 45 = CONSUMO PROPIO - id 46 = MERMAS - id 51 = AJUSTE DE INVENTARIO - id 52 = DETERIORO - id 53 = PERDIDA - id 54 = TRASLADO - id 55 = OTROS No permitir otras operaciones fuera de estas dentro del módulo. ### Casos de uso de SALIDA DE PRODUCTO Debe servir para: - sacar productos vencidos - sacar productos robados o perdidos - registrar productos deteriorados - registrar mermas - regularizar stock - traslado interno entre sucursales - otros motivos internos ### Regla especial: traslado entre sucursales Cuando la operación sea: - id 54 = TRASLADO Entonces: - se debe elegir `secondary_branch_id` - para indicar a qué sucursal fue enviado Además: - en `sale_product` usar el campo `pending` - para controlar cuánto falta por recibir del traslado en destino Ejemplo: - si se envían 10 unidades en una salida por traslado - inicialmente: - `quantity = 10` - `pending = 10` - conforme el ingreso en destino las vaya recibiendo, `pending` debe disminuir - cuando `pending = 0`, ya fue completamente recibido ### Reglas de negocio de SALIDA DE PRODUCTO - Debe descontar stock cuando corresponda según el flujo interno - Debe permitir registrar salida por operación interna - Si es traslado, debe dejar trazabilidad hacia la sucursal destino - Debe manejar pendientes por línea cuando se trate de traslado - Debe ser más simple que una guía de remisión formal - No debe exigir todos los datos tributarios/logísticos de una guía normal ### Comportamiento esperado de SALIDA DE PRODUCTO - listado - crear - editar - ver detalle - consolidado o resumen - filtro por operación - filtro por sucursal origen - filtro por sucursal destino si aplica - filtro por fecha - filtro por estado si aplica ### Casos especiales de SALIDA DE PRODUCTO 1. **Consumo propio** 2. **Mermas** 3. **Ajuste de inventario** 4. **Deterioro** 5. **Pérdida** 6. **Traslado interno** 7. **Otros** --- ## RELACIÓN ENTRE AMBOS MÓDULOS Debe existir trazabilidad entre: - la SALIDA DE PRODUCTO - y el INGRESO DE PRODUCTO Especialmente en traslados internos. ### Relación de detalle - `sale_product.pending` indicará cuánto falta por recibir del lado de salida - `purchase_product.output_product_id` indicará desde qué línea de salida se recibió ese producto del lado de ingreso ### Comportamiento esperado en traslados internos 1. Se crea una SALIDA DE PRODUCTO con operación TRASLADO 2. Se selecciona la sucursal destino mediante `secondary_branch_id` 3. Cada línea de `sale_product` queda con su `pending` inicial 4. Cuando la sucursal destino registra el INGRESO DE PRODUCTO: - se crea el documento en `purchase` - se crean sus líneas en `purchase_product` - cada línea puede enlazarse con `output_product_id` - el `pending` de la salida debe disminuir según lo recibido 5. Cuando todo lo enviado fue recibido: - el `pending` de las líneas debe quedar en 0 --- ## REQUERIMIENTOS DE IMPLEMENTACIÓN Quiero que generes ambos módulos reutilizando al máximo la lógica existente de los módulos similares. ### Referencias principales - INGRESO DE PRODUCTO => basarse en `legacy purchase guide-new` - SALIDA DE PRODUCTO => basarse en `guide new traslado`, pero simplificado para uso interno ### Debes crear o adaptar: 1. rutas 2. controladores 3. modelos 4. vistas/componentes 5. formularios 6. listados 7. detalle 8. consolidados 9. consultas SQL / ORM 10. validaciones de negocio 11. lógica de stock 12. lógica de pendientes 13. lógica de trazabilidad entre salida e ingreso --- ## VALIDACIONES IMPORTANTES ### INGRESO DE PRODUCTO - Guardar siempre en `purchase` - Usar siempre `voucher_id = 12` - Solo permitir operaciones 47 y 48 - Siempre incrementar stock - `affect_stock = true` - Si viene de una salida interna, permitir enlazar mediante `purchase_product.output_product_id` ### SALIDA DE PRODUCTO - Guardar siempre en `sale` - Solo permitir operaciones 45, 46, 51, 52, 53, 54 y 55 - Si la operación es TRASLADO: - exigir `secondary_branch_id` - inicializar `sale_product.pending` - permitir trazabilidad con el ingreso posterior - Si no es TRASLADO: - no exigir lógica de recepción en sucursal destino - Debe ser un flujo interno simple, no una guía de remisión formal completa --- ## APARIENCIA / UX - Ambos deben sentirse consistentes con el sistema actual - INGRESO DE PRODUCTO debe parecerse visual y funcionalmente a `purchase guide-new` - SALIDA DE PRODUCTO debe parecerse visual y funcionalmente a `guide new traslado`, pero más simple - Deben tener sus propios listados, formularios, detalles y consolidados - Deben mostrar claramente el tipo de operación elegida - En traslado, debe verse claramente sucursal origen, sucursal destino y pendientes --- ## IMPORTANTE Antes de escribir código: 1. dame un plan corto de implementación 2. identifica qué archivos del sistema actual usarás como base 3. indica qué archivos nuevos crearás para INGRESO DE PRODUCTO 4. indica qué archivos nuevos crearás para SALIDA DE PRODUCTO 5. indica qué archivos existentes modificarás si hace falta Luego: - genera el código archivo por archivo - explica brevemente qué hace cada archivo - indica qué parte fue reutilizada de los módulos base - no rompas el flujo actual de compras, ventas o guías existentes - no mezcles estos módulos con los módulos normales si no es necesario - mantén clara la trazabilidad entre salida e ingreso para traslados internos Si detectas lógica reutilizable entre guía de compra, guía de traslado, ingreso de producto y salida de producto, extráela a una capa común sin romper el comportamiento actual.