feat(sales): Domain Contracts para Sales Document con Coverage #57
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
Definir los contratos de la capa Domain para el nuevo módulo de documentos comerciales de venta, incorporando explícitamente el concepto de Coverage como fuente de verdad de lo cubierto por cada documento.
La story debe preparar el terreno para las próximas capas sin implementar todavía repositorios, servicios Core, endpoints API, UI ni homologación ARCA.
Contexto funcional
El proyecto PhronCare usa arquitectura estricta:
La Story #55 (Data) dejó creadas y scaffolded las tablas base del módulo de facturación comercial interna:
Decisiones funcionales ya tomadas:
Esto permite representar correctamente:
El repositorio actual ya contiene patrones similares en
Domain:E, por ejemploEDeliveryNote,EQuoteHeader,EQuoteDetail;Domain/Dtos, conDomain/Dtos/Salespara ventas;Domain/Constants;Models/Modelsy contratos Domain propios.Esta story existe para crear los contratos limpios de Domain antes de avanzar con Core/Data/API/UI.
Alcance
Crear los contratos Domain necesarios para Sales Document.
1. Entities
Crear entidades Domain en
Domain/Entities:Lineamientos:
E, consistente con el resto de Domain;Relación esperada:
La implementación concreta del nombre de las colecciones debe priorizar compatibilidad con los patrones actuales de
EntityMappery las entidades existentes.2. Enums
Crear enums en
Domain/Constantsusando tipo baseint:Valores sugeridos iniciales:
SalesDocumentType
SalesDocumentStatus
SalesFiscalDocumentStatus
SalesDocumentOriginType
Nota: aunque
PhS_SalesDocumentDetails.OriginTypeestá scaffolded comostring, el contrato Domain debe definir el enumintcomo referencia semántica interna. En la próxima story se deberá decidir si Core/Data persiste el nombre, el valor o realiza conversión explícita.SalesDocumentCoverageType
3. DTOs
Crear DTOs en
Domain/Dtos/Sales.Create
Debe permitir crear un documento con:
Detail / lectura completa
Debe representar el documento completo para lectura interna/API futura.
Summary
Debe servir para listados, búsquedas y grillas sin cargar todo el detalle.
Fiscal
Los DTOs fiscales deben quedar separados conceptualmente del documento comercial:
La separación es obligatoria porque el documento comercial interno puede existir sin estar autorizado fiscalmente.
Coverage
SalesDocumentCoverageDtoySalesDocumentCreateCoverageRequestdeben ser contratos explícitos, no un dato derivado implícito desdeQuoteId.Campos mínimos esperados:
Fuera de alcance
Esta story NO incluye:
Models/Models;PhronCareOperationsHubContext;Criterios de aceptación
✔ El proyecto
Domaincompila sin errores.✔ No se modifica ningún modelo EF generado por scaffold.
✔ Las entidades Domain usan prefijo
E.✔ Los enums quedan en
Domain/Constants.✔ Los enums solicitados usan tipo base
int.✔ Los DTOs quedan agrupados en
Domain/Dtos/Sales.✔
Coveragequeda modelado como contrato explícito.✔
Coverageno depende dequote_idcomo lógica principal.✔ El diseño permite facturación 1 a 1 usando Coverage.
✔ El diseño permite cápita usando Coverage.
✔ El diseño permite facturación parcial, por ejemplo 60/40.
✔ El documento comercial queda separado del documento fiscal.
✔ La capa Domain queda preparada para una futura integración ARCA sin implementarla todavía.
✔ El patch futuro debe poder validarse con
git apply --checkantes de aplicarse.Decisiones de diseño
1. Coverage es obligatorio conceptualmente
Toda creación futura de Sales Document debe incluir coverage, incluso en facturación directa 1 a 1.
Motivo:
QuoteIden cabecera puede existir como referencia útil, pero no debe ser usado como fuente de verdad para determinar cobertura o pendiente de facturación.2. Separación entre lo facturado y lo cubierto
El contrato debe dejar clara la separación:
Esto evita forzar una relación 1 a 1 entre línea facturada y presupuesto.
Ejemplos soportados:
3. Documento comercial separado del documento fiscal
ESalesDocumentrepresenta el documento comercial interno.ESalesFiscalDocumentrepresenta el estado fiscal asociado, preparado para ARCA/AFIP.Motivo:
4. Preparación ARCA sin implementación
La story puede incluir contratos con campos fiscales previstos:
Pero no debe implementar:
5. Enums int alineados con DB
Los enums nuevos deben usar
intpara quedar alineados con columnasintya scaffolded.Excepción a revisar en próxima story:
Para esta story se define
SalesDocumentOriginType : intcomo contrato semántico. La conversión concreta queda para Core/Data.6. No sobreingeniería
Domain debe contener contratos, no resolver todavía reglas complejas de emisión, cálculo fiscal o validación de coverage.
La validación fuerte debe quedar para Core en stories posteriores.
Diseño propuesto de relaciones
Relación conceptual recomendada:
ESalesDocumentCoveragedebe poder apuntar opcionalmente a una línea:Motivo:
Entregable esperado
Archivos a crear o modificar en una futura implementación:
No se esperan cambios en:
Plan de implementación de abajo hacia arriba
1. Data / Models
No modificar.
Validar solamente que las clases scaffolded existen:
2. Domain / Constants
Crear enums
intpara tipos y estados comerciales/fiscales.3. Domain / Entities
Crear entidades
E*reflejando los contratos de cabecera, detalle, fiscal, asociaciones fiscales y coverage.4. Domain / DTOs
Crear DTOs de create, lectura completa, summary, fiscal y coverage bajo
Domain/Dtos/Sales.5. Core
Fuera de alcance en esta story.
La próxima story debería definir interfaces y servicios Core para crear/listar/consultar Sales Documents usando coverage obligatorio.
6. API
Fuera de alcance.
7. UI
Fuera de alcance.
Branch sugerido
Commit sugerido
Checklist técnico previo al patch
Antes de generar el patch de implementación:
feat(sales): Sales Document Domain Contractsto feat(sales): Domain Contracts para Sales Document con Coverage