Uecko_ERP/apps/server/archive/contexts/accounts/domain/aggregates/account.ts

189 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-02-20 18:55:24 +00:00
import {
AggregateRoot,
2025-05-04 20:06:57 +00:00
type EmailAddress,
type PhoneNumber,
2025-02-20 18:55:24 +00:00
PostalAddress,
2025-05-04 20:06:57 +00:00
type TINNumber,
2025-02-20 18:55:24 +00:00
UniqueID,
2025-05-04 20:06:57 +00:00
} from "@/core";
2025-05-09 10:45:32 +00:00
import { Maybe, Result } from "@repo/rdx-utils";
2025-03-04 17:08:33 +00:00
import { AccountStatus } from "../value-objects";
2025-02-20 18:55:24 +00:00
2025-02-25 17:47:42 +00:00
export interface IAccountProps {
2025-03-04 17:08:33 +00:00
status: AccountStatus;
2025-02-20 18:55:24 +00:00
isFreelancer: boolean;
name: string;
tin: TINNumber;
address: PostalAddress;
email: EmailAddress;
phone: PhoneNumber;
legalRecord: string;
defaultTax: number;
2025-03-04 17:08:33 +00:00
2025-02-20 18:55:24 +00:00
langCode: string;
currencyCode: string;
tradeName: Maybe<string>;
website: Maybe<string>;
fax: Maybe<PhoneNumber>;
logo: Maybe<string>;
}
2025-02-25 17:47:42 +00:00
export interface IAccount {
2025-02-20 18:55:24 +00:00
id: UniqueID;
2025-03-04 17:08:33 +00:00
status: AccountStatus;
2025-02-20 18:55:24 +00:00
name: string;
tin: TINNumber;
address: PostalAddress;
email: EmailAddress;
phone: PhoneNumber;
legalRecord: string;
defaultTax: number;
2025-03-04 17:08:33 +00:00
2025-02-20 18:55:24 +00:00
langCode: string;
currencyCode: string;
tradeName: Maybe<string>;
fax: Maybe<PhoneNumber>;
website: Maybe<string>;
logo: Maybe<string>;
2025-02-25 17:47:42 +00:00
isAccount: boolean;
2025-02-20 18:55:24 +00:00
isFreelancer: boolean;
isActive: boolean;
2025-03-04 17:08:33 +00:00
activate(): boolean;
deactivate(): boolean;
2025-02-20 18:55:24 +00:00
}
2025-02-25 17:47:42 +00:00
export class Account extends AggregateRoot<IAccountProps> implements IAccount {
2025-05-04 20:06:57 +00:00
id: UniqueID;
2025-02-25 17:47:42 +00:00
static create(props: IAccountProps, id?: UniqueID): Result<Account, Error> {
const account = new Account(props, id);
2025-02-20 18:55:24 +00:00
// Reglas de negocio / validaciones
// ...
// ...
2025-02-25 17:47:42 +00:00
// 🔹 Disparar evento de dominio "AccountAuthenticatedEvent"
//const { account } = props;
//user.addDomainEvent(new AccountAuthenticatedEvent(id, account.toString()));
2025-02-20 18:55:24 +00:00
2025-02-25 17:47:42 +00:00
return Result.ok(account);
2025-02-20 18:55:24 +00:00
}
2025-03-04 17:08:33 +00:00
static update(oldAccount: Account, data: Partial<IAccountProps>): Result<Account, Error> {
const updatedPostalAddress = PostalAddress.update(oldAccount.address, data.address ?? {}).data;
return Account.create(
{
isFreelancer: data.isFreelancer ?? oldAccount.isFreelancer,
name: data.name ?? oldAccount.name,
tin: data.tin ?? oldAccount.tin,
address: updatedPostalAddress,
email: data.email ?? oldAccount.email,
phone: data.phone ?? oldAccount.phone,
legalRecord: data.legalRecord ?? oldAccount.legalRecord,
defaultTax: data.defaultTax ?? oldAccount.defaultTax,
status: oldAccount.props.status,
langCode: data.langCode ?? oldAccount.langCode,
currencyCode: data.currencyCode ?? oldAccount.currencyCode,
tradeName: data.tradeName ?? oldAccount.tradeName,
website: data.website ?? oldAccount.website,
fax: data.fax ?? oldAccount.fax,
logo: data.logo ?? oldAccount.logo,
},
oldAccount.id
).getOrElse(this);
}
activate() {
if (!this.props.status.canTransitionTo("active")) {
return false;
}
this.props.status = AccountStatus.createActive();
return true;
}
deactivate() {
if (!this.props.status.canTransitionTo("inactive")) {
return false;
}
this.props.status = AccountStatus.createInactive();
return true;
}
get status() {
return this.props.status;
}
2025-02-20 18:55:24 +00:00
get name() {
return this.props.name;
}
get tradeName() {
return this.props.tradeName;
}
get tin(): TINNumber {
return this.props.tin;
}
get address(): PostalAddress {
return this.props.address;
}
get email(): EmailAddress {
return this.props.email;
}
get phone(): PhoneNumber {
return this.props.phone;
}
get fax(): Maybe<PhoneNumber> {
return this.props.fax;
}
get website() {
return this.props.website;
}
get legalRecord() {
return this.props.legalRecord;
}
get defaultTax() {
return this.props.defaultTax;
}
get langCode() {
return this.props.langCode;
}
get currencyCode() {
return this.props.currencyCode;
}
get logo() {
return this.props.logo;
}
2025-02-25 17:47:42 +00:00
get isAccount(): boolean {
2025-02-20 18:55:24 +00:00
return !this.props.isFreelancer;
}
get isFreelancer(): boolean {
return this.props.isFreelancer;
}
get isActive(): boolean {
2025-03-04 17:08:33 +00:00
return this.props.status.equals(AccountStatus.createActive());
2025-02-20 18:55:24 +00:00
}
}