Uecko_ERP/modules/customer-invoices/src/api/infrastructure/mappers/customer-invoice.mapper.ts

190 lines
5.0 KiB
TypeScript
Raw Normal View History

2025-09-03 10:41:12 +00:00
import {
ISequelizeMapper,
MapperParamsType,
SequelizeMapper,
ValidationErrorCollection,
ValidationErrorDetail,
extractOrPushError,
} from "@erp/core/api";
2025-09-04 17:57:04 +00:00
import {
CurrencyCode,
LanguageCode,
Percentage,
TextValue,
UniqueID,
UtcDate,
maybeFromNullableVO,
} from "@repo/rdx-ddd";
2025-06-11 15:13:44 +00:00
import { Result } from "@repo/rdx-utils";
2025-06-12 06:55:17 +00:00
import {
CustomerInvoice,
CustomerInvoiceNumber,
2025-09-03 10:41:12 +00:00
CustomerInvoiceProps,
2025-06-12 06:55:17 +00:00
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../../domain";
2025-06-11 15:13:44 +00:00
import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize";
2025-06-12 06:55:17 +00:00
import { CustomerInvoiceItemMapper } from "./customer-invoice-item.mapper";
2025-06-11 15:13:44 +00:00
export interface ICustomerInvoiceMapper
2025-06-12 06:55:17 +00:00
extends ISequelizeMapper<
CustomerInvoiceModel,
CustomerInvoiceCreationAttributes,
CustomerInvoice
> {}
2025-06-11 15:13:44 +00:00
export class CustomerInvoiceMapper
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
implements ICustomerInvoiceMapper
{
2025-09-04 17:57:04 +00:00
private _itemsMapper: CustomerInvoiceItemMapper;
2025-06-11 15:13:44 +00:00
constructor() {
super();
2025-09-04 17:57:04 +00:00
this._itemsMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items
2025-06-11 15:13:44 +00:00
}
2025-06-12 06:55:17 +00:00
public mapToDomain(
source: CustomerInvoiceModel,
params?: MapperParamsType
): Result<CustomerInvoice, Error> {
2025-09-04 17:57:04 +00:00
try {
const errors: ValidationErrorDetail[] = [];
const invoiceId = extractOrPushError(UniqueID.create(source.id), "id", errors);
const companyId = extractOrPushError(
UniqueID.create(source.company_id),
"company_id",
errors
2025-09-03 10:41:12 +00:00
);
2025-06-11 15:13:44 +00:00
2025-09-04 17:57:04 +00:00
const status = extractOrPushError(
CustomerInvoiceStatus.create(source.status),
"status",
errors
);
const series = extractOrPushError(
maybeFromNullableVO(source.series, (value) => CustomerInvoiceSerie.create(value)),
"serie",
errors
);
2025-06-11 15:13:44 +00:00
2025-09-04 17:57:04 +00:00
const invoiceNumber = extractOrPushError(
CustomerInvoiceNumber.create(source.invoice_number),
"invoice_number",
errors
);
const invoiceDate = extractOrPushError(
UtcDate.createFromISO(source.invoice_date),
"invoice_date",
errors
);
const operationDate = extractOrPushError(
maybeFromNullableVO(source.operation_date, (value) => UtcDate.createFromISO(value)),
"operation_date",
errors
);
const notes = extractOrPushError(
maybeFromNullableVO(source.notes, (value) => TextValue.create(value)),
"notes",
errors
);
const languageCode = extractOrPushError(
LanguageCode.create(source.language_code),
"language_code",
errors
);
const currencyCode = extractOrPushError(
CurrencyCode.create(source.currency_code),
"currency_code",
errors
);
const discountPercentage = extractOrPushError(
Percentage.create({
value: source.discount_percentage_value,
scale: source.discount_percentage_scale,
}),
"discount_percentage",
errors
);
if (errors.length > 0) {
return Result.fail(
new ValidationErrorCollection("Customer invoice props mapping failed", errors)
);
}
// Mapear los items de la factura
const items = this._itemsMapper.mapArrayToDomain(source.items, {
sourceParent: source,
errors,
...params,
});
if (errors.length > 0) {
return Result.fail(
new ValidationErrorCollection("Customer invoice item props mapping failed", errors)
);
}
const invoiceProps: CustomerInvoiceProps = {
companyId: companyId!,
status: status!,
series: series!,
invoiceNumber: invoiceNumber!,
invoiceDate: invoiceDate!,
operationDate: operationDate!,
notes: notes!,
languageCode: languageCode!,
currencyCode: currencyCode!,
discountPercentage: discountPercentage!,
items: items!,
};
return CustomerInvoice.create(invoiceProps, invoiceId);
} catch (err: unknown) {
return Result.fail(err as Error);
}
2025-06-11 15:13:44 +00:00
}
2025-06-12 06:55:17 +00:00
public mapToPersistence(
source: CustomerInvoice,
params?: MapperParamsType
): CustomerInvoiceCreationAttributes {
2025-06-11 15:13:44 +00:00
const subtotal = source.calculateSubtotal();
const total = source.calculateTotal();
2025-09-04 17:57:04 +00:00
const items = this._itemsMapper.mapCollectionToPersistence(source.items, params);
2025-06-11 15:13:44 +00:00
return {
id: source.id.toString(),
2025-06-12 06:55:17 +00:00
invoice_status: source.status.toPrimitive(),
2025-06-26 11:32:55 +00:00
invoice_series: source.invoiceSeries.toPrimitive(),
invoice_number: source.invoiceNumber.toPrimitive(),
2025-09-04 17:57:04 +00:00
invoice_date: source.invoiceDate.toPrimitive(),
2025-06-11 15:13:44 +00:00
operation_date: source.operationDate.toPrimitive(),
2025-06-12 06:55:17 +00:00
invoice_language: "es",
2025-06-26 18:05:33 +00:00
invoice_currency: source.currency || "EUR",
2025-06-11 15:13:44 +00:00
subtotal_amount: subtotal.amount,
subtotal_scale: subtotal.scale,
total_amount: total.amount,
total_scale: total.scale,
items,
};
}
}