72 lines
1.7 KiB
TypeScript
72 lines
1.7 KiB
TypeScript
import { UserProfileDto } from '../types';
|
|
|
|
/**
|
|
* Entidade de Domínio: Colaborador
|
|
*/
|
|
export class Colaborador {
|
|
private constructor(
|
|
public readonly matricula: number,
|
|
public readonly userName: string,
|
|
public readonly nome: string,
|
|
public readonly codigoFilial: string,
|
|
public readonly nomeFilial: string,
|
|
public readonly codigoRCA: number,
|
|
private readonly _percentualDesconto: number,
|
|
public readonly codigoSetor: number,
|
|
public readonly codigoSupervisor: number
|
|
) {}
|
|
|
|
// ========== FACTORY METHODS ==========
|
|
|
|
static criarAPartirDoDto(dto: UserProfileDto): Colaborador {
|
|
return new Colaborador(
|
|
dto.matricula,
|
|
dto.userName,
|
|
dto.nome,
|
|
dto.codigoFilial,
|
|
dto.nomeFilial,
|
|
dto.rca,
|
|
dto.discountPercent,
|
|
dto.sectorId,
|
|
dto.supervisorId
|
|
);
|
|
}
|
|
|
|
// ========== COMPUTED PROPERTIES ==========
|
|
|
|
get iniciais(): string {
|
|
if (!this.nome) return 'U';
|
|
const partes = this.nome.trim().split(' ').filter(Boolean);
|
|
if (partes.length === 1) {
|
|
return partes[0][0].toUpperCase();
|
|
}
|
|
return (partes[0][0] + partes[partes.length - 1][0]).toUpperCase();
|
|
}
|
|
|
|
get ehRepresentanteComercial(): boolean {
|
|
return this.codigoRCA > 0;
|
|
}
|
|
|
|
get podeAplicarDesconto(): boolean {
|
|
return this._percentualDesconto > 0 && this.ehRepresentanteComercial;
|
|
}
|
|
|
|
get percentualDesconto(): number {
|
|
return this._percentualDesconto;
|
|
}
|
|
|
|
get nomeComFilial(): string {
|
|
return `${this.nome} - ${this.nomeFilial}`;
|
|
}
|
|
|
|
// ========== BUSINESS METHODS ==========
|
|
|
|
aplicarDescontoAoValor(valorOriginal: number): number {
|
|
if (!this.podeAplicarDesconto) {
|
|
return valorOriginal;
|
|
}
|
|
return valorOriginal * (1 - this._percentualDesconto / 100);
|
|
}
|
|
}
|
|
|