95 lines
3.7 KiB
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;
|
|
}
|
|
}
|