factuges_2025/modules/invoices/src/server/intrastructure/mappers/invoiceParticipant.mapper.ts.bak
2025-04-27 22:47:47 +02:00

120 lines
3.6 KiB
TypeScript

import { ISequelizeMapper, SequelizeMapper } from "@/contexts/common/infrastructure";
import { Name, TINNumber, UniqueID } from "@shared/contexts";
import {
IInvoiceCustomerProps,
Invoice,
InvoiceCustomer,
InvoiceParticipantBillingAddress,
InvoiceParticipantShippingAddress,
} from "../../domain";
import { IInvoicingContext } from "../InvoicingContext";
import { InvoiceParticipant_Model, TCreationInvoiceParticipant_Model } from "../sequelize";
import {
IInvoiceParticipantAddressMapper,
createInvoiceParticipantAddressMapper,
} from "./invoiceParticipantAddress.mapper";
export interface IInvoiceParticipantMapper
extends ISequelizeMapper<
InvoiceParticipant_Model,
TCreationInvoiceParticipant_Model,
InvoiceCustomer
> {}
export const createInvoiceParticipantMapper = (
context: IInvoicingContext
): IInvoiceParticipantMapper =>
new InvoiceParticipantMapper({
context,
addressMapper: createInvoiceParticipantAddressMapper(context),
});
class InvoiceParticipantMapper
extends SequelizeMapper<
InvoiceParticipant_Model,
TCreationInvoiceParticipant_Model,
InvoiceCustomer
>
implements IInvoiceParticipantMapper
{
public constructor(props: {
addressMapper: IInvoiceParticipantAddressMapper;
context: IInvoicingContext;
}) {
super(props);
}
protected toDomainMappingImpl(source: InvoiceParticipant_Model, params: any) {
/*if (!source.billingAddress) {
this.handleRequiredFieldError(
"billingAddress",
new Error("Missing participant's billing address"),
);
}
if (!source.shippingAddress) {
this.handleRequiredFieldError(
"shippingAddress",
new Error("Missing participant's shipping address"),
);
}
*/
const billingAddress = source.billingAddress
? ((this.props.addressMapper as IInvoiceParticipantAddressMapper).mapToDomain(
source.billingAddress,
params
) as InvoiceParticipantBillingAddress)
: undefined;
const shippingAddress = source.shippingAddress
? ((this.props.addressMapper as IInvoiceParticipantAddressMapper).mapToDomain(
source.shippingAddress,
params
) as InvoiceParticipantShippingAddress)
: undefined;
const props: IInvoiceCustomerProps = {
tin: this.mapsValue(source, "tin", TINNumber.create),
firstName: this.mapsValue(source, "first_name", Name.create),
lastName: this.mapsValue(source, "last_name", Name.create),
companyName: this.mapsValue(source, "company_name", Name.create),
billingAddress,
shippingAddress,
};
const id = this.mapsValue(source, "participant_id", UniqueID.create);
const participantOrError = InvoiceCustomer.create(props, id);
if (participantOrError.isFailure) {
throw participantOrError.error;
}
return participantOrError.object;
}
protected toPersistenceMappingImpl(
source: InvoiceCustomer,
params: { sourceParent: Invoice }
): TCreationInvoiceParticipant_Model {
const { sourceParent } = params;
return {
invoice_id: sourceParent.id.toPrimitive(),
participant_id: source.id.toPrimitive(),
tin: source.tin.toPrimitive(),
first_name: source.firstName.toPrimitive(),
last_name: source.lastName.toPrimitive(),
company_name: source.companyName.toPrimitive(),
billingAddress: (
this.props.addressMapper as IInvoiceParticipantAddressMapper
).mapToPersistence(source.billingAddress!, { sourceParent: source }),
shippingAddress: (
this.props.addressMapper as IInvoiceParticipantAddressMapper
).mapToPersistence(source.shippingAddress!, { sourceParent: source }),
};
}
}