feat(absences) : fondation backend du module de gestion des absences

Module type Payfit (étapes 1+2 de la spec V1) : demande d'absence, validation
admin, soldes à jour.

- Enums : AbsenceType, AbsenceStatus, HalfDay, ContractType, FamilySituation
- Entités : AbsencePolicy, AbsenceBalance, AbsenceRequest + champs RH sur User
- Services : PublicHolidayProvider (fériés FR métropole en PHP pur, Computus),
  AbsenceDayCalculator (décompte jours ouvrés/ouvrables + demi-journées, TDD),
  AbsenceBalanceService (périodes + pending/taken/recrédit)
- API Platform : providers/processors (création, approve/reject/cancel) + RBAC
  me/admin, contrôleurs preview (dry-run), upload/download justificatif, calendrier
- Migrations : une par table + colonnes RH user (DEFAULT puis DROP DEFAULT)
- Fixtures : 5 policies par défaut, salariés démo, soldes et demandes
- Tests unitaires : PublicHolidayProvider, AbsenceDayCalculator (12 tests)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-05-21 14:45:14 +02:00
parent 325a7b07f9
commit de98924fd3
32 changed files with 2554 additions and 3 deletions

View File

@@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Absence management: create the absence_policy table.
*/
final class Version20260521123520 extends AbstractMigration
{
public function getDescription(): string
{
return 'Create absence_policy table';
}
public function up(Schema $schema): void
{
$this->addSql(<<<'SQL'
CREATE TABLE absence_policy (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
type VARCHAR(32) NOT NULL,
days_per_year DOUBLE PRECISION DEFAULT NULL,
days_per_event DOUBLE PRECISION DEFAULT NULL,
justification_required BOOLEAN NOT NULL,
notice_days INT NOT NULL,
count_working_days_only BOOLEAN NOT NULL,
active BOOLEAN NOT NULL,
PRIMARY KEY (id)
)
SQL);
$this->addSql('CREATE UNIQUE INDEX uniq_absence_policy_type ON absence_policy (type)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE absence_policy');
}
}