Uecko_ERP/apps/server/src/contexts/customer-billing/infraestructure/mappers/customer-invoice.mapper.ts

112 lines
3.5 KiB
TypeScript
Raw Normal View History

2025-02-25 19:17:30 +00:00
import { PostalAddress, TINNumber, UniqueID, UtcDate } from "@common/domain";
2025-02-25 15:25:30 +00:00
import { Result } from "@common/helpers";
import {
ISequelizeMapper,
MapperParamsType,
SequelizeMapper,
} from "@common/infrastructure/sequelize/sequelize-mapper";
2025-02-25 19:17:30 +00:00
import { Customer, CustomerInvoice } from "@contexts/customer-billing/domain";
2025-02-25 17:27:07 +00:00
import { InvoiceStatus } from "@contexts/customer-billing/domain/value-objetcs";
2025-02-25 15:25:30 +00:00
import {
CustomerInvoiceCreationAttributes,
CustomerInvoiceModel,
} from "../sequelize/customer-invoice.model";
export interface ICustomerInvoiceMapper
extends ISequelizeMapper<
CustomerInvoiceModel,
CustomerInvoiceCreationAttributes,
CustomerInvoice
> {}
export class CustomerInvoiceMapper
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
implements ICustomerInvoiceMapper
{
public mapToDomain(
source: CustomerInvoiceModel,
params?: MapperParamsType
): Result<CustomerInvoice, Error> {
2025-02-25 17:27:07 +00:00
const idOrError = UniqueID.create(source.id);
const statusOrError = InvoiceStatus.create(source.status);
const issueDateOrError = UtcDate.create(source.issue_date);
2025-02-25 19:17:30 +00:00
const result = Result.combine([idOrError, statusOrError, issueDateOrError]);
2025-02-25 17:27:07 +00:00
if (result.isFailure) {
return Result.fail(result.error);
}
2025-02-25 19:17:30 +00:00
// Customer
const customerIdOrError = UniqueID.create(source.customer_id);
const tinOrError = TINNumber.create(source.customer_tin);
2025-02-25 15:25:30 +00:00
const postalAddressOrError = PostalAddress.create({
2025-02-25 19:17:30 +00:00
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,
2025-02-25 15:25:30 +00:00
});
2025-02-25 19:17:30 +00:00
const check2 = Result.combine([idOrError, tinOrError, postalAddressOrError]);
2025-02-25 15:25:30 +00:00
2025-02-25 19:17:30 +00:00
if (check2.isFailure) {
return Result.fail(check2.error);
2025-02-25 15:25:30 +00:00
}
2025-02-25 19:17:30 +00:00
const customerOrError = Customer.create(
2025-02-25 15:25:30 +00:00
{
2025-02-25 19:17:30 +00:00
name: source.customer_name,
2025-02-25 15:25:30 +00:00
tin: tinOrError.data,
address: postalAddressOrError.data,
2025-02-25 19:17:30 +00:00
},
customerIdOrError.data
);
return CustomerInvoice.create(
{
status: statusOrError.data,
issueDate: issueDateOrError.data,
invoiceNumber: source.invoice_number,
invoiceType: source.invoice_type,
invoiceCustomerReference: source.invoice_customer_reference,
customer: customerOrError.data,
items: [],
2025-02-25 15:25:30 +00:00
},
idOrError.data
2025-02-25 19:17:30 +00:00
);
2025-02-25 15:25:30 +00:00
}
public mapToPersistence(
source: CustomerInvoice,
params?: MapperParamsType
): Result<CustomerInvoiceCreationAttributes, Error> {
2025-02-25 17:27:07 +00:00
return Result.ok({
id: source.id.toString(),
status: source.status.toString(),
2025-02-25 15:25:30 +00:00
2025-02-25 19:17:30 +00:00
issue_date: source.issueDate.toDateString(),
invoice_number: source.invoiceNumber,
invoice_type: source.invoiceType,
invoice_customer_reference: source.invoiceCustomerReference,
2025-02-25 15:25:30 +00:00
2025-02-25 19:17:30 +00:00
lang_code: "es",
currency_code: "EUR",
2025-02-25 15:25:30 +00:00
2025-02-25 19:17:30 +00:00
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,
});
2025-02-25 15:25:30 +00:00
}
}
const customerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper();
export { customerInvoiceMapper };