import { Customer, CustomerInvoice } from "@/contexts/customer-billing/domain"; import { InvoiceStatus } from "@/contexts/customer-billing/domain/value-objetcs"; import { PostalAddress, TINNumber, UniqueID, UtcDate } from "@/core/common/domain"; import { type ISequelizeMapper, type MapperParamsType, SequelizeMapper, } from "@/core/common/infrastructure/sequelize/sequelize-mapper"; import { Maybe, Result } from "@repo/rdx-utils"; import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel, } from "../sequelize/customer-invoice.model"; export interface ICustomerInvoiceMapper extends ISequelizeMapper< CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice > {} export class CustomerInvoiceMapper extends SequelizeMapper implements ICustomerInvoiceMapper { public mapToDomain( source: CustomerInvoiceModel, params?: MapperParamsType ): Result { const idOrError = UniqueID.create(source.id); const statusOrError = InvoiceStatus.create(source.status); const issueDateOrError = UtcDate.create(source.issue_date); const result = Result.combine([idOrError, statusOrError, issueDateOrError]); if (result.isFailure) { return Result.fail(result.error); } // Customer const customerIdOrError = UniqueID.create(source.customer_id); const tinOrError = TINNumber.create(source.customer_tin); const postalAddressOrError = PostalAddress.create({ street: source.customer_street, street2: source.customer_street2, city: source.customer_city, state: source.customer_state, postalCode: source.customer_postal_code, country: source.customer_country, }); const check2 = Result.combine([idOrError, tinOrError, postalAddressOrError]); if (check2.isFailure) { return Result.fail(check2.error); } const customerOrError = Customer.create( { name: source.customer_name, tin: tinOrError.data, address: postalAddressOrError.data, }, customerIdOrError.data ); return CustomerInvoice.create( { status: statusOrError.data, issueDate: issueDateOrError.data, invoiceNumber: source.invoice_number, invoiceType: source.invoice_type, invoiceCustomerReference: Maybe.fromNullable(source.invoice_customer_reference), customer: customerOrError.data, items: [], }, idOrError.data ); } public mapToPersistence( source: CustomerInvoice, params?: MapperParamsType ): Result { return Result.ok({ id: source.id.toString(), status: source.status.toString(), issue_date: source.issueDate.toDateString(), invoice_number: source.invoiceNumber, invoice_type: source.invoiceType, invoice_customer_reference: source.invoiceCustomerReference.getOrUndefined(), lang_code: "es", currency_code: "EUR", customer_id: source.customer.id.toString(), customer_name: source.customer.name, customer_tin: source.customer.tin.toString(), customer_street: source.customer.address.street, customer_street2: source.customer.address.street2.getOrUndefined(), customer_city: source.customer.address.city, customer_postal_code: source.customer.address.postalCode, customer_state: source.customer.address.state, customer_country: source.customer.address.country, }); } } const customerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper(); export { customerInvoiceMapper };