import { AggregateRoot, UniqueID, UtcDate } from "@/core/common/domain"; import { Maybe, Result } from "@repo/rdx-utils"; import { Customer, CustomerInvoiceItem } from "../entities"; import { InvoiceStatus } from "../value-objetcs"; export interface ICustomerInvoiceProps { status: InvoiceStatus; issueDate: UtcDate; invoiceNumber: string; invoiceType: string; invoiceCustomerReference: Maybe; customer: Customer; items: CustomerInvoiceItem[]; } export interface ICustomerInvoice { id: UniqueID; status: InvoiceStatus; issueDate: UtcDate; invoiceNumber: string; invoiceType: string; invoiceCustomerReference: Maybe; customer: Customer; items: CustomerInvoiceItem[]; //send(); //accept(); } export class CustomerInvoice extends AggregateRoot implements ICustomerInvoice { id: UniqueID; static create(props: ICustomerInvoiceProps, id?: UniqueID): Result { const invoice = new CustomerInvoice(props, id); // Reglas de negocio / validaciones // ... // ... // 🔹 Disparar evento de dominio "CustomerAuthenticatedEvent" //const { customer } = props; //user.addDomainEvent(new CustomerAuthenticatedEvent(id, customer.toString())); return Result.ok(invoice); } get status(): InvoiceStatus { return this.props.status; } get issueDate(): UtcDate { return this.props.issueDate; } get invoiceNumber(): string { return this.props.invoiceNumber; } get invoiceType(): string { return this.props.invoiceType; } get invoiceCustomerReference(): Maybe { return this.props.invoiceCustomerReference; } get customer(): Customer { return this.props.customer; } get items(): CustomerInvoiceItem[] { return this.props.items; } }