'01155902', 'NOM_FIC' => 'DOE', 'PRENOM_FIC' => 'John', 'DATE_DEB_FIC' => '2024-01-15', 'DATE_FIN_FIC' => null, 'DF_CARRIERE' => '2026-12-31', 'ETAB_FIC' => '01', 'SITE_FIC' => 'LDCSER', 'SERVICE_FIC' => '097', 'DAT_CRE' => '2024-01-15', 'DAT_MAJ' => '2024-06-20', ]; $employee = EmployeeMapper::toDomain($row); expect($employee)->toBeInstanceOf(Employee::class) ->and((string) $employee->publicEmployeeNumber->value)->toBe('01155902') ->and($employee->lastName)->toBe('DOE') ->and($employee->firstName)->toBe('John') ->and($employee->establishment->value)->toBe('01') ->and($employee->site->value)->toBe('LDCSER') ->and($employee->service->value)->toBe('097') ->and($employee->plannedEndDate?->format('Y-m-d'))->toBe('2026-12-31'); }); it('pads matricule to 7 digits if shorter numeric', function (): void { $row = [ 'MATRICULE_FIC' => '12345', 'NOM_FIC' => 'SMITH', 'PRENOM_FIC' => 'Jane', 'DATE_DEB_FIC' => '2024-01-01', ]; $employee = EmployeeMapper::toDomain($row); expect((string) $employee->publicEmployeeNumber->value)->toBe('0012345'); }); it('supports object input and fallback column names', function (): void { $row = (object) [ 'public_employee_number' => '1234567', 'nom_fic' => 'DUPONT', 'prenom_fic' => 'Louis', 'start_date' => '2023-05-15', 'etablissement' => 'PA', 'site' => 'SLELA', 'service' => '097', ]; $employee = EmployeeMapper::toDomain($row); expect($employee)->toBeInstanceOf(Employee::class) ->and((string) $employee->publicEmployeeNumber->value)->toBe('1234567') ->and($employee->lastName)->toBe('DUPONT') ->and($employee->firstName)->toBe('Louis'); }); it('returns null on tryToDomain when matricule is invalid', function (): void { $row = [ 'MATRICULE_FIC' => '# s996008', 'NOM_FIC' => 'ARRIVE SAINT FULGENT', 'PRENOM_FIC' => 'Baie de stockage', ]; expect(EmployeeMapper::tryToDomain($row))->toBeNull(); }); it('returns Employee on tryToDomain when matricule is valid', function (): void { $row = [ 'MATRICULE_FIC' => '01155902', 'NOM_FIC' => 'DOE', 'PRENOM_FIC' => 'John', ]; expect(EmployeeMapper::tryToDomain($row))->toBeInstanceOf(Employee::class); }); });