- Updated general requirements document to clarify its historical context and remove outdated technical details. - Revised template documentation to serve as a base for writing prompts, emphasizing its auxiliary nature. - Enhanced architecture documentation with clear distinctions between canonical and complementary documents. - Added a new document for backend prompt base to centralize common context for backend prompts. - Created a dedicated README for customer invoices, organizing current contracts, operational support, and historical context. - Improved clarity and structure in various customer invoice documents, consolidating operational semantics and referencing canonical sources.
3.9 KiB
3.9 KiB
Prompt Customer Invoices
Base comun reutilizada: backend-prompt-base.md
Este prompt añade solo las reglas especificas de customer-invoices.
Contexto especifico
Este modulo es para facturas de cliente y adapta la base comun a datos, reglas y operaciones de facturacion.
DDD y SOLID aplicados
CustomerInvoicees agregado raizInvoiceLinese modela como entidad o Value Object dentro del agregado- usar mapper para dominio <-> persistencia
ICustomerInvoiceRepositorymaneja agregados- operaciones como
createInvoice,updateInvoiceygetInvoiceByIdviven enCustomerInvoiceApplicationService - usar SRP y contratos como
ICustomerInvoiceRepository,ITransactionManagereIInvoicePresenter
Estructura de datos
La entidad CustomerInvoice tendrá:
id: UUID (ValueObjectUniqueID)status: string (ValueObject) (Draft,Issued,Sent,Rejected)invoiceNumber: string (ValueObject )invoiceSeries: string (ValueObject )customerId: UUID (ValueObject)issueDate: UtcDate (ValueObject)operationDate: UtcDate (ValueObject)lines: array deInvoiceLine, cada una con:productId: (Optional) UUID (ValueObjectUniqueID)description: string (ValueObject)quantity: Amount (number) and scale (number) (ValueObject Quantity)unitPrice: Amount (number), scale (number) and currency (string) (ValueObject MoneyValue)totalLineAmount: Amount (number), scale (number) and currency (string) (ValueObject MoneyValue)
subtotalPrice: Amount (number), scale (number) and currency (string) (ValueObject MoneyValue)discount: Amount (number) and scale (number) (ValueObject Percentage)tax: Amount (number) and scale (number) (ValueObject Percentage)totalAmount: Amount (number), scale (number) and currency (string) (ValueObject MoneyValue)
Operaciones principales
createInvoice(data: CreateCustomerInvoiceDTO)getInvoiceById(id: string)updateInvoice(id: string, changes: UpdateCustomerInvoiceDTO)listInvoices(filter?)deleteInvoice(id: string)markAsPaid(id: string)
Validaciones
- usar
Zoden Value Objects comoInvoiceNumber,InvoiceDateeInvoiceLine - no lanzar excepciones para errores de validacion esperados; usar
Result<T, E>
Presentacion
- los controladores convierten el agregado a
CustomerInvoiceDTO - usar
CustomerInvoicePresenterpara construir DTOs - DTOs solo exponen campos necesarios
- se puede extender con
CsvInvoicePresenter,PdfInvoicePresenter, etc.
Autorizacion y acceso
- proteger rutas con middleware JWT o equivalente vigente del modulo
- validar que el usuario autenticado pueda acceder o modificar la factura de su empresa
Persistencia
SequelizeCustomerInvoiceRepositoryaccede mediante mapperCustomerInvoiceMappermapea agregado <-> persistencia- soportar transacciones con
TransactionManager.complete(...) - seguir
snake_caseen tablas, columnas y timestampscreated_at,updated_at,deleted_at
Errores
- usar
ApiErrorpara errores de API - capturar errores de Sequelize y convertirlos con mensajes claros mediante
errorMapper
Testing
- testear
CustomerInvoiceApplicationServicecon mocks de repositorio - testear rutas con
supertest - cubrir Value Objects con pruebas unitarias
Nomenclatura
- Agregado:
CustomerInvoice - Línea:
CustomerInvoiceLine - DTOs:
CustomerInvoiceDTO,InvoiceLineDTO - Presentadores:
CustomerInvoicePresenter - Repositorio:
ICustomerInvoiceRepository,SequelizeCustomerInvoiceRepository - ValueObjects:
CustomerInvoiceNumber,CustomerInvoiceDate,CustomerInvoiceTotal,CustomerInvoiceItemQuantity, etc.
Restricciones
- no incluir
passwords,tokensu otros datos sensibles en responses - no usar Sequelize directamente en servicios ni controllers
- no devolver el agregado bruto; usar DTOs
- tipar explicitamente metodos y resultados