Sales Document Item Selection & Partial Billing #76
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Objetivo
Permitir que un Sales Document pueda construirse desde una selección parcial de ítems provenientes de uno o más Delivery Notes, desacoplando el concepto de:
del concepto de:
La story debe permitir seleccionar líneas, excluir ítems completos y modificar cantidades facturables antes de generar el documento comercial.
Contexto funcional
El módulo Sales Document ya cuenta con persistencia, contratos de dominio, DTOs, Core Flow, repositorios, API oficial, UI BackOffice y Draft Review & Validation implementados en stories previas.
Actualmente el flujo funcional es:
Cuando el usuario selecciona uno o más remitos, el sistema copia automáticamente todo el contenido del remito hacia
SalesDocumentDetails.Ese comportamiento es insuficiente para la operatoria real de ortopedias, financiadores y coberturas médicas, donde pueden existir escenarios como:
Por lo tanto, la evolución correcta del modelo es pasar de:
a:
sin rediseñar el módulo completo ni romper los contratos existentes que puedan seguir siendo útiles.
Diagnóstico técnico inicial
Antes de implementar, Codex debe revisar el repositorio actualizado y confirmar las rutas reales de los archivos. No asumir nombres si difieren del código actual.
El análisis previo detectó que hoy el flujo crea
SalesDocumentDetailsa partir de todos los ítems de los remitos seleccionados.Flujo esperado actual aproximado:
Restricción detectada:
parece operar como marca de remito ya facturado. Ese criterio sirve para facturación total, pero no sirve como criterio principal para facturación parcial, porque no permite distinguir saldos por línea.
La solución de esta story debe evitar que
SalesinvoiceIdsiga siendo el único mecanismo de control de elegibilidad para facturar.Alcance
Implementar soporte comercial para selección parcial de ítems de remitos al crear un Sales Document.
La implementación debe respetar estrictamente la arquitectura:
1. Data / Models
PhS_SalesDocumentDetailspara mejorar consultas por origen..sql.2. Domain
Agregar o ajustar contratos de dominio para representar candidatos facturables por línea.
DTOs sugeridos, ajustando nombres a convenciones reales del repo:
Cada candidato debe poder exponer como mínimo:
3. Core
Agregar flujo de negocio para:
Métodos sugeridos, ajustando nombres al repo:
Reglas mínimas:
4. Repository
Agregar consultas para obtener saldos por línea.
El cálculo conceptual debe ser:
donde:
filtrado por el origen correcto de la línea.
Decisión recomendada:
No usar
DeliveryNote.Idcomo origen principal del detail para este nuevo flujo, porque impide trazabilidad granular por línea.Si existen documentos anulados, cancelados o descartados, sus cantidades no deben descontar saldo pendiente. Codex debe revisar los estados reales disponibles antes de implementar el filtro definitivo.
5. API
Agregar endpoints nuevos sin romper los endpoints existentes.
Endpoints sugeridos, ajustando rutas y nombres al patrón actual:
El endpoint de candidatos debe permitir consultar uno o más remitos y devolver líneas facturables con saldo pendiente.
El endpoint de creación debe recibir una selección explícita de líneas y cantidades.
6. UI BackOffice
Actualizar la creación de Sales Document para que el usuario pueda:
La UI debe preservar el estilo y patrones ya usados en BackOffice.
Fuera de alcance
Esta story NO debe implementar ni modificar:
Tampoco debe rediseñar por completo el módulo Sales Document ni eliminar contratos existentes si todavía son usados por UI/API.
Decisiones de diseño
1. Modelo conceptual correcto
La unidad facturable debe ser la línea del remito, no el remito completo.
Modelo objetivo:
2. Trazabilidad
Para el nuevo flujo,
SalesDocumentDetaildebe poder trazar el origen granular:El snapshot puede incluir información adicional para auditoría:
3. Control de doble facturación
No debe depender exclusivamente de
PhSDeliveryNote.SalesinvoiceId.La elegibilidad debe calcularse por línea mediante
SalesDocumentDetailsya existentes y sus cantidades acumuladas.4. Coverage
Coverage debe seguir siendo consistente con lo efectivamente facturado.
Para facturación parcial, el coverage debe reflejar la línea seleccionada y el importe seleccionado, no el total completo del remito.
Conceptualmente:
Ajustar el cálculo según los campos y reglas reales existentes en el repo.
5. Drafts y reserva de saldo
Decisión recomendada:
Motivo: evita que dos documentos comerciales en draft consuman la misma línea pendiente.
Si el repo tiene estados anulados/cancelados, esos documentos no deben reservar saldo.
Preguntas de negocio a validar si el código no permite inferirlas
Codex debe avanzar con la opción conservadora si no hay evidencia en el repo, pero dejar documentada la decisión.
¿Un Sales Document en Draft debe reservar saldo?
¿Se permite facturar parcialmente una línea más de una vez hasta completar el total entregado?
¿Se permite facturar una línea sin
QuoteDetailId?¿
SalesinvoiceIddebe mantenerse sólo como dato legacy/compatibilidad?Criterios de aceptación
✔ El código compila sin errores.
✔ No se modifican manualmente modelos EF generados por scaffold.
✔ La arquitectura Data → Domain → Core → API → UI se respeta.
✔ El usuario puede consultar candidatos facturables por ítem desde uno o más remitos.
✔ La respuesta de candidatos muestra cantidad entregada, cantidad ya facturada y cantidad pendiente.
✔ El usuario puede seleccionar líneas completas o parciales para crear el Sales Document.
✔ No se permite crear un Sales Document sin líneas seleccionadas.
✔ No se permite facturar una cantidad mayor al saldo pendiente de una línea.
✔ No se permite duplicar facturación sobre una misma línea por encima de la cantidad entregada.
✔
SalesDocumentDetailsse crean únicamente para los ítems seleccionados.✔
SalesDocumentCoveragese genera de forma consistente con las líneas efectivamente facturadas.✔ El flujo existente de Draft Review & Validation continúa funcionando.
✔ La UI BackOffice permite seleccionar/excluir ítems y modificar cantidades facturables.
✔ Los endpoints actuales no se rompen.
✔ Swagger/API queda usable para el nuevo flujo.
✔ Se incluyen pruebas manuales básicas documentadas.
Pruebas manuales sugeridas
Caso 1 — Facturación total equivalente al flujo anterior
Caso 2 — Exclusión de línea completa
Caso 3 — Cantidad parcial
Caso 4 — Evitar doble facturación
Caso 5 — Múltiples remitos
Caso 6 — Clientes incompatibles
Entregable esperado
Codex debe entregar:
Archivos/rutas a revisar y posiblemente modificar, ajustando según el repo real:
Branch sugerido
Commit sugerido
Instrucciones específicas para Codex
Antes de escribir código:
Reglas obligatorias: