Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1110069b5 | ||
| 4901c58ebf | |||
| 4de891579c |
@@ -46,6 +46,7 @@
|
||||
- CUSTOM contracts (weeklyHours ≠ 35 and ≠ 39, not INTERIM/FORFAIT): reference = actual contractual hours, no 25%/50% bonuses (1h overtime = 1h recovery), deficit doesn't impact balance
|
||||
- INTERIM: no overtime bonuses, no recovery time
|
||||
- Driver contracts: no overtime calculation
|
||||
- FORFAIT weekend/holiday bonus: each weekend or public holiday day worked gives bonus leave (full day if morning+afternoon, 0.5 if only one). Added to acquired days, no cap. PRESENCE mode only.
|
||||
|
||||
## Frais (MileageAllowance)
|
||||
- Onglet "Frais" (anciennement "Frais Kms") sur la fiche employé
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
parameters:
|
||||
app.version: '0.1.59'
|
||||
app.version: '0.1.60'
|
||||
|
||||
@@ -231,6 +231,7 @@ Tous les filtres checkbox sont cochés par défaut à l'ouverture du drawer.
|
||||
- en cas de suspension en cours de mois, l'acquisition est proratisée en jours ouvrés (lun-ven hors fériés) travaillés / 22
|
||||
- contrat `FORFAIT`:
|
||||
- base annuelle: `jours ouvrés de l'exercice (lundi-vendredi, hors jours fériés métropole) - 218`
|
||||
- bonus weekend/férié: chaque jour travaillé un weekend ou jour férié donne 1 jour de congé supplémentaire (journée ≥ 5h = 1.0 jour, demi-journée > 0h et < 5h = 0.5 jour), sans plafond
|
||||
- prorata: en cas de démarrage/fin de contrat en cours d'année civile, le calcul ne couvre que l'intervalle actif du contrat dans l'année
|
||||
- reste à prendre: `acquis - absences` (toutes absences, demi-journées incluses)
|
||||
- pas de samedi (`0`)
|
||||
|
||||
@@ -191,6 +191,57 @@ final class WorkHourRepository extends ServiceEntityRepository implements WorkHo
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Count weekend and public holiday worked days for forfait bonus leave (PRESENCE mode only).
|
||||
* Morning + afternoon = 1.0 day, one only = 0.5 day.
|
||||
*
|
||||
* @param list<string> $publicHolidayDates Y-m-d formatted weekday public holiday dates
|
||||
*/
|
||||
public function countWeekendAndHolidayWorkedDays(Employee $employee, DateTimeImmutable $from, DateTimeImmutable $to, array $publicHolidayDates = []): float
|
||||
{
|
||||
$targetDates = [];
|
||||
|
||||
// Collect weekend dates in range
|
||||
for ($cursor = $from; $cursor <= $to; $cursor = $cursor->modify('+1 day')) {
|
||||
if ((int) $cursor->format('N') >= 6) {
|
||||
$targetDates[] = $cursor;
|
||||
}
|
||||
}
|
||||
|
||||
// Add weekday public holidays
|
||||
foreach ($publicHolidayDates as $date) {
|
||||
$targetDates[] = new DateTimeImmutable($date);
|
||||
}
|
||||
|
||||
if ([] === $targetDates) {
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
$dateStrings = array_map(static fn (DateTimeImmutable $d): string => $d->format('Y-m-d'), $targetDates);
|
||||
|
||||
/** @var list<WorkHour> $rows */
|
||||
$rows = $this->createQueryBuilder('w')
|
||||
->andWhere('w.employee = :employee')
|
||||
->andWhere('w.workDate IN (:dates)')
|
||||
->andWhere('w.isPresentMorning = true OR w.isPresentAfternoon = true')
|
||||
->setParameter('employee', $employee)
|
||||
->setParameter('dates', $dateStrings)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
|
||||
$total = 0.0;
|
||||
foreach ($rows as $row) {
|
||||
if ($row->isPresentMorning() && $row->isPresentAfternoon()) {
|
||||
$total += 1.0;
|
||||
} else {
|
||||
$total += 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
return $total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the set of Y-m-d dates where the employee has worked hours on the given dates.
|
||||
*
|
||||
|
||||
@@ -535,10 +535,21 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface
|
||||
$type = $employee->getContract()?->getType();
|
||||
if (ContractType::FORFAIT === $type) {
|
||||
$businessDaysInPeriod = $this->countBusinessDays($from, $to);
|
||||
$publicHolidays = $this->buildPublicHolidayMap($from, $to);
|
||||
$weekdayHolidays = array_filter(
|
||||
array_keys($publicHolidays),
|
||||
static fn (string $date): bool => (int) new DateTimeImmutable($date)->format('N') <= 5
|
||||
);
|
||||
$bonusDays = $this->workHourRepository->countWeekendAndHolidayWorkedDays(
|
||||
$employee,
|
||||
$from,
|
||||
$to,
|
||||
array_values($weekdayHolidays)
|
||||
);
|
||||
|
||||
return [
|
||||
'ruleCode' => LeaveRuleCode::FORFAIT_218->value,
|
||||
'acquiredDays' => (float) max(0, $businessDaysInPeriod - self::FORFAIT_TARGET_WORKED_DAYS),
|
||||
'acquiredDays' => (float) max(0, $businessDaysInPeriod - self::FORFAIT_TARGET_WORKED_DAYS) + $bonusDays,
|
||||
'acquiredSaturdays' => 0.0,
|
||||
'accrualPerMonth' => 0.0,
|
||||
'saturdayAccrualPerMonth' => 0.0,
|
||||
|
||||
Reference in New Issue
Block a user