Périmètre 1-6 du design 2026-05-22-absence-legal-compliance-fixes (points lourds — ancienneté, CP pendant maladie, rétention — reportés en backlog). - Événements familiaux sans solde : AbsenceType::decrementsBalance() ne vaut true que pour les CP. Mariage/PACS, naissance, décès = droits par événement ; congé parental = suspension ; maladie = Sécu. Plus de solde fantôme. - Décès : daysPerEvent = null (selon lien de parenté) + motif obligatoire à la création (REST + MCP), les minimums légaux étant rappelés dans l'aide. - Ajout du congé naissance (type, policy 3 j, justificatif, libellés/couleur front). - Garde-fou demi-journée : -0,5 appliqué uniquement si le jour-borne est réellement décompté (corrige un sous-décompte week-end/férié) — TDD. - CCN documentée : paramètre app.absence.convention = "Syntec (IDCC 1486)", rappelée en sous-titre admin et dans l'aide /help. Tests : AbsenceDayCalculatorTest (garde-fou demi-journée), AbsenceRequestLifecycle (motif décès obligatoire + aucun solde touché). make test 52/52, build Nuxt OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
94 lines
2.2 KiB
TypeScript
94 lines
2.2 KiB
TypeScript
export type AbsenceType = 'cp' | 'mariage_pacs' | 'naissance' | 'conge_parental' | 'deces' | 'maladie'
|
|
export type AbsenceStatus = 'pending' | 'approved' | 'rejected' | 'cancelled'
|
|
export type HalfDay = 'matin' | 'apres_midi'
|
|
|
|
export type AbsenceUserRef = {
|
|
'@id'?: string
|
|
id: number
|
|
username: string
|
|
avatarUrl: string | null
|
|
}
|
|
|
|
export type AbsenceRequest = {
|
|
'@id'?: string
|
|
id: number
|
|
user: AbsenceUserRef
|
|
type: AbsenceType
|
|
label: string
|
|
startDate: string
|
|
endDate: string
|
|
startHalfDay: HalfDay | null
|
|
endHalfDay: HalfDay | null
|
|
countedDays: number
|
|
reason: string | null
|
|
justificationFileName: string | null
|
|
justificationUrl: string | null
|
|
status: AbsenceStatus
|
|
rejectionReason: string | null
|
|
createdAt: string
|
|
reviewedAt: string | null
|
|
reviewedBy: AbsenceUserRef | null
|
|
}
|
|
|
|
export type AbsenceRequestWrite = {
|
|
type: AbsenceType
|
|
startDate: string
|
|
endDate: string
|
|
startHalfDay?: HalfDay | null
|
|
endHalfDay?: HalfDay | null
|
|
reason?: string | null
|
|
}
|
|
|
|
export type AbsenceBalance = {
|
|
'@id'?: string
|
|
id: number
|
|
user: AbsenceUserRef
|
|
type: AbsenceType
|
|
label: string
|
|
period: string
|
|
acquired: number
|
|
acquiring: number
|
|
acquiredTotal: number
|
|
taken: number
|
|
pending: number
|
|
available: number
|
|
}
|
|
|
|
export type AbsencePolicy = {
|
|
'@id'?: string
|
|
id: number
|
|
type: AbsenceType
|
|
label: string
|
|
daysPerYear: number | null
|
|
daysPerEvent: number | null
|
|
justificationRequired: boolean
|
|
noticeDays: number
|
|
countWorkingDaysOnly: boolean
|
|
active: boolean
|
|
}
|
|
|
|
export type AbsencePolicyWrite = {
|
|
daysPerYear?: number | null
|
|
daysPerEvent?: number | null
|
|
justificationRequired?: boolean
|
|
noticeDays?: number
|
|
countWorkingDaysOnly?: boolean
|
|
active?: boolean
|
|
}
|
|
|
|
export type AbsencePreviewPayload = {
|
|
type: AbsenceType
|
|
startDate: string
|
|
endDate: string
|
|
startHalfDay?: HalfDay | null
|
|
endHalfDay?: HalfDay | null
|
|
}
|
|
|
|
export type AbsencePreviewResult = {
|
|
countedDays: number
|
|
period: string | null
|
|
available: number | null
|
|
projectedAvailable: number | null
|
|
justificationRequired: boolean
|
|
}
|