Uecko_ERP/apps/server/src/contexts/accounts/infraestructure/mappers/account.mapper.ts

100 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-02-20 18:55:24 +00:00
import { EmailAddress, PhoneNumber, PostalAddress, TINNumber, UniqueID } from "@common/domain";
import { Maybe, Result } from "@common/helpers";
import {
ISequelizeMapper,
MapperParamsType,
SequelizeMapper,
} from "@common/infrastructure/sequelize/sequelize-mapper";
2025-03-04 17:08:33 +00:00
import { Account, AccountStatus } from "@contexts/accounts/domain/";
2025-02-25 17:47:42 +00:00
import { AccountCreationAttributes, AccountModel } from "../sequelize/account.model";
2025-02-20 18:55:24 +00:00
2025-02-25 17:47:42 +00:00
export interface IAccountMapper
extends ISequelizeMapper<AccountModel, AccountCreationAttributes, Account> {}
2025-02-20 18:55:24 +00:00
2025-02-25 17:47:42 +00:00
export class AccountMapper
extends SequelizeMapper<AccountModel, AccountCreationAttributes, Account>
implements IAccountMapper
2025-02-20 18:55:24 +00:00
{
2025-02-25 17:47:42 +00:00
public mapToDomain(source: AccountModel, params?: MapperParamsType): Result<Account, Error> {
2025-02-20 18:55:24 +00:00
const idOrError = UniqueID.create(source.id);
2025-03-04 17:08:33 +00:00
const statusOrError = AccountStatus.create(source.status);
2025-02-20 18:55:24 +00:00
const tinOrError = TINNumber.create(source.tin);
const emailOrError = EmailAddress.create(source.email);
const phoneOrError = PhoneNumber.create(source.phone);
const faxOrError = PhoneNumber.createNullable(source.fax);
const postalAddressOrError = PostalAddress.create({
street: source.street,
city: source.city,
state: source.state,
postalCode: source.postal_code,
country: source.country,
});
const result = Result.combine([
idOrError,
2025-03-04 17:08:33 +00:00
statusOrError,
2025-02-20 18:55:24 +00:00
tinOrError,
emailOrError,
phoneOrError,
faxOrError,
postalAddressOrError,
]);
if (result.isFailure) {
return Result.fail(result.error);
}
2025-02-25 17:47:42 +00:00
return Account.create(
2025-02-20 18:55:24 +00:00
{
2025-03-04 17:08:33 +00:00
status: statusOrError.data,
2025-02-20 18:55:24 +00:00
isFreelancer: source.is_freelancer,
name: source.name,
2025-02-25 19:17:30 +00:00
tradeName: source.trade_name ? Maybe.some(source.trade_name) : Maybe.none(),
2025-02-20 18:55:24 +00:00
tin: tinOrError.data,
address: postalAddressOrError.data,
email: emailOrError.data,
phone: phoneOrError.data,
fax: faxOrError.data,
2025-02-25 19:17:30 +00:00
website: source.website ? Maybe.some(source.website) : Maybe.none(),
2025-02-20 18:55:24 +00:00
legalRecord: source.legal_record,
defaultTax: source.default_tax,
langCode: source.lang_code,
currencyCode: source.currency_code,
2025-02-25 19:17:30 +00:00
logo: source.logo ? Maybe.some(source.logo) : Maybe.none(),
2025-02-20 18:55:24 +00:00
},
idOrError.data
);
}
2025-03-04 17:08:33 +00:00
public mapToPersistence(source: Account, params?: MapperParamsType): AccountCreationAttributes {
return {
2025-02-20 18:55:24 +00:00
id: source.id.toString(),
is_freelancer: source.isFreelancer,
name: source.name,
2025-02-25 15:25:30 +00:00
trade_name: source.tradeName.getOrUndefined(),
2025-02-20 18:55:24 +00:00
tin: source.tin.toString(),
street: source.address.street,
city: source.address.city,
state: source.address.state,
postal_code: source.address.postalCode,
country: source.address.country,
email: source.email.toString(),
phone: source.phone.toString(),
2025-02-25 15:25:30 +00:00
fax: source.fax.isSome() ? source.fax.getOrUndefined()?.toString() : undefined,
website: source.website.getOrUndefined(),
2025-02-20 18:55:24 +00:00
legal_record: source.legalRecord,
default_tax: source.defaultTax,
status: source.isActive ? "active" : "inactive",
lang_code: source.langCode,
currency_code: source.currencyCode,
2025-02-25 15:25:30 +00:00
logo: source.logo.getOrUndefined(),
2025-03-04 17:08:33 +00:00
};
2025-02-20 18:55:24 +00:00
}
}
2025-02-25 17:47:42 +00:00
const accountMapper: AccountMapper = new AccountMapper();
export { accountMapper };