ldc-arcadia-api/src/Infra/Adapters/Mappers/EmployeeMapper.php

95 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Infra\Adapters\Mappers;
use Domain\Models\Entities\Employee;
use Domain\Models\ValueObjects\Employees\ArcadiaEmployeeId;
use Domain\Models\ValueObjects\EstablishmentCode;
use Domain\Models\ValueObjects\ServiceId;
use Domain\Models\ValueObjects\SiteId;
use Shared\Helpers\DatesHelper;
final readonly class EmployeeMapper
{
/**
* @param array<string, mixed>|object $row
*/
public static function tryToDomain(array | object $row): ?Employee
{
try {
return self::toDomain($row);
} catch (\DomainException) {
return null;
}
}
/**
* @param array<string, mixed>|object $row
*/
// phpcs:disable Generic.Metrics.CyclomaticComplexity
public static function toDomain(array | object $row): Employee
{
// phpcs:enable Generic.Metrics.CyclomaticComplexity
/** @var array<string, mixed> $data */
$data = is_object($row) ? (array) $row : $row;
$rawMatricule = trim(self::castString(
$data['MATRICULE_FIC'] ?? $data['matricule_fic'] ?? $data['public_employee_number'] ?? null,
''
));
// Garantir un format 7 ou 8 chiffres pour ArcadiaEmployeeId
if (is_numeric($rawMatricule) && strlen($rawMatricule) < 7) {
$rawMatricule = str_pad($rawMatricule, 7, '0', STR_PAD_LEFT);
}
$lastName = self::castString($data['NOM_FIC'] ?? $data['nom_fic'] ?? $data['NOM_PERSONNE'] ?? $data['last_name'] ?? null, '');
$firstName = self::castString($data['PRENOM_FIC'] ?? $data['prenom_fic'] ?? $data['PRENOM_PERSONNE'] ?? $data['first_name'] ?? null, '');
$startDate = self::parseDate(
$data['DATE_DEB_FIC'] ?? $data['date_deb_fic'] ?? $data['DATE_ENTREE'] ?? $data['start_date'] ?? null
) ?? new \DateTimeImmutable('2000-01-01');
$endDate = self::parseDate($data['DATE_FIN_FIC'] ?? $data['date_fin_fic'] ?? $data['end_date'] ?? null);
$plannedEndDate = self::parseDate($data['DF_CARRIERE'] ?? $data['df_carriere'] ?? $data['planned_end_date'] ?? null);
$establishment = self::castString($data['ETAB_FIC'] ?? $data['etab_fic'] ?? $data['ETABLISSEMENT'] ?? $data['establishment'] ?? null, '01');
$site = self::castString($data['SITE_FIC'] ?? $data['site_fic'] ?? $data['site'] ?? null, 'DEFAULT');
$service = self::castString($data['SERVICE_FIC'] ?? $data['service_fic'] ?? $data['NUM_SERV'] ?? $data['service'] ?? null, '001');
$createdAt = self::parseDate($data['DAT_CRE'] ?? $data['dat_cre'] ?? $data['created_at'] ?? null) ?? $startDate;
$updatedAt = self::parseDate($data['DAT_MAJ'] ?? $data['dat_maj'] ?? $data['updated_at'] ?? null);
return Employee::hydrate(
publicEmployeeNumber: new ArcadiaEmployeeId($rawMatricule),
lastName: $lastName,
firstName: $firstName,
startDate: $startDate,
endDate: $endDate,
plannedEndDate: $plannedEndDate,
establishment: new EstablishmentCode($establishment),
site: new SiteId($site),
service: new ServiceId($service),
createdAt: $createdAt,
updatedAt: $updatedAt,
);
}
private static function castString(mixed $val, string $default = ''): string
{
return is_scalar($val) ? (string) $val : $default;
}
private static function parseDate(mixed $value): ?\DateTimeInterface
{
if ($value instanceof \DateTimeInterface) {
return $value;
}
if (is_string($value) && trim($value) !== '') {
return DatesHelper::parseDateTime($value);
}
return null;
}
}