Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e411be3c3 | ||
| 90e63a463e |
@@ -1,2 +1,2 @@
|
|||||||
parameters:
|
parameters:
|
||||||
app.version: '0.1.88'
|
app.version: '0.1.89'
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ Documents complementaires:
|
|||||||
- Onglet congés: jours fériés affichés sur le calendrier avec fond `rgb(179, 229, 252)` et nom au survol
|
- Onglet congés: jours fériés affichés sur le calendrier avec fond `rgb(179, 229, 252)` et nom au survol
|
||||||
- Écran Heures et Heures Conducteurs (vue jour): le nom du férié est affiché dans la colonne Absence sous forme de pill (fond `#b3e5fc`, icône `mdi:calendar-star`), distinct du pill absence
|
- Écran Heures et Heures Conducteurs (vue jour): le nom du férié est affiché dans la colonne Absence sous forme de pill (fond `#b3e5fc`, icône `mdi:calendar-star`), distinct du pill absence
|
||||||
- Règle courante:
|
- Règle courante:
|
||||||
- absences bloquées sur jour férié (création/édition) — bouton "Modifier" masqué comme pour les formations
|
- absences autorisées sur jour férié (création/édition depuis l'écran Heures et le Calendrier). Quand une absence est posée, le crédit virtuel férié est désactivé — c'est le `countAsWorkedHours` du type d'absence qui pilote
|
||||||
- saisie d'heures ou de jours de présence autorisée — les heures saisies comptent normalement dans le total hebdo et le calcul RTT
|
- saisie d'heures ou de jours de présence autorisée — les heures saisies comptent normalement dans le total hebdo et le calcul RTT
|
||||||
- la référence hebdomadaire n'est pas réduite par un férié: un salarié qui ne saisit rien sur un férié est en déficit de la journée correspondante
|
- la référence hebdomadaire n'est pas réduite par un férié: un salarié qui ne saisit rien sur un férié est en déficit de la journée correspondante
|
||||||
|
|
||||||
|
|||||||
@@ -45,9 +45,9 @@
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative flex h-8 w-full items-center justify-center overflow-hidden rounded-md border border-neutral-200 text-[11px] font-semibold text-neutral-800"
|
class="relative flex h-8 w-full items-center justify-center overflow-hidden rounded-md border border-neutral-200 text-[11px] font-semibold text-neutral-800"
|
||||||
:class="isHolidayDate(day.date) || getCellInfo(employee.id, day.date)?.hasFormation ? 'cursor-not-allowed opacity-80' : ''"
|
:class="getCellInfo(employee.id, day.date)?.hasFormation ? 'cursor-not-allowed opacity-80' : ''"
|
||||||
:style="getCellStyle(employee.id, day.date)"
|
:style="getCellStyle(employee.id, day.date)"
|
||||||
:disabled="isHolidayDate(day.date) || getCellInfo(employee.id, day.date)?.hasFormation"
|
:disabled="getCellInfo(employee.id, day.date)?.hasFormation"
|
||||||
@click="handleCellClick(employee, day.date)"
|
@click="handleCellClick(employee, day.date)"
|
||||||
>
|
>
|
||||||
<span v-if="!getCellInfo(employee.id, day.date)?.halfLabel">
|
<span v-if="!getCellInfo(employee.id, day.date)?.halfLabel">
|
||||||
@@ -80,9 +80,7 @@
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative flex h-8 w-full items-center justify-center rounded-md border border-neutral-200 text-[11px] font-semibold text-neutral-800 bg-white"
|
class="relative flex h-8 w-full items-center justify-center rounded-md border border-neutral-200 text-[11px] font-semibold text-neutral-800 bg-white"
|
||||||
:class="isHolidayDate(day.date) ? 'cursor-not-allowed opacity-80' : ''"
|
|
||||||
:style="getCellStyle(employee.id, day.date)"
|
:style="getCellStyle(employee.id, day.date)"
|
||||||
:disabled="isHolidayDate(day.date)"
|
|
||||||
@click="handleCellClick(employee, day.date)"
|
@click="handleCellClick(employee, day.date)"
|
||||||
>
|
>
|
||||||
<span></span>
|
<span></span>
|
||||||
|
|||||||
@@ -387,7 +387,8 @@ export const documentationSections: DocSection[] = [
|
|||||||
requiredLevel: 'admin',
|
requiredLevel: 'admin',
|
||||||
blocks: [
|
blocks: [
|
||||||
{ type: 'paragraph', content: 'Le calendrier offre une vue d\'ensemble mensuelle des absences de tous les employés.' },
|
{ type: 'paragraph', content: 'Le calendrier offre une vue d\'ensemble mensuelle des absences de tous les employés.' },
|
||||||
{ type: 'list', content: 'Code couleur par type d\'absence\nDemi-journée : affichage en dégradé diagonal\nJournée complète : fond plein\nJours fériés : fond bleu clair\nFiltres par site et par employé\nNavigation par mois (précédent / suivant)' },
|
{ type: 'list', content: 'Code couleur par type d\'absence\nDemi-journée : affichage en dégradé diagonal\nJournée complète : fond plein\nJours fériés : fond bleu clair (cliquable pour créer une absence)\nFiltres par site et par employé\nNavigation par mois (précédent / suivant)' },
|
||||||
|
{ type: 'note', content: 'Les absences peuvent être créées sur les jours fériés. Quand une absence est posée sur un férié, elle remplace l\'affichage « Férié » dans la cellule.' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -490,14 +490,15 @@ const hasFormationOn = (employeeId: number, date: string): boolean => {
|
|||||||
return cellFormationMap.value.has(`${employeeId}-${date}`)
|
return cellFormationMap.value.has(`${employeeId}-${date}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jours fériés (interdit pour la création).
|
// Jours fériés.
|
||||||
const isHolidayDate = (date: string) => {
|
const isHolidayDate = (date: string) => {
|
||||||
return Boolean(publicHolidays.value[date])
|
return Boolean(publicHolidays.value[date])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Renvoie l'absence effective pour une cellule (ou un "Férié").
|
// Renvoie l'absence effective pour une cellule (ou un "Férié" si pas d'absence).
|
||||||
const getCellAbsence = (employeeId: number, date: string) => {
|
const getCellAbsence = (employeeId: number, date: string) => {
|
||||||
if (isHolidayDate(date)) {
|
const absence = cellAbsenceMap.value.get(`${employeeId}-${date}`)
|
||||||
|
if (!absence && isHolidayDate(date)) {
|
||||||
return {
|
return {
|
||||||
id: 0,
|
id: 0,
|
||||||
code: 'Férié',
|
code: 'Férié',
|
||||||
@@ -505,7 +506,6 @@ const getCellAbsence = (employeeId: number, date: string) => {
|
|||||||
textColor: '#0f172a'
|
textColor: '#0f172a'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const absence = cellAbsenceMap.value.get(`${employeeId}-${date}`)
|
|
||||||
if (absence) return { ...absence, hasFormation: hasFormationOn(employeeId, date) }
|
if (absence) return { ...absence, hasFormation: hasFormationOn(employeeId, date) }
|
||||||
if (hasFormationOn(employeeId, date)) {
|
if (hasFormationOn(employeeId, date)) {
|
||||||
return {
|
return {
|
||||||
@@ -549,11 +549,6 @@ const getCellInfo = (employeeId: number, date: string) => {
|
|||||||
|
|
||||||
// Ouverture du drawer depuis une cellule.
|
// Ouverture du drawer depuis une cellule.
|
||||||
const openCreate = (employee: Employee, date: string) => {
|
const openCreate = (employee: Employee, date: string) => {
|
||||||
if (isHolidayDate(date)) {
|
|
||||||
window.alert("Impossible de creer une absence un jour ferie.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const existing = absences.value.find((absence) => {
|
const existing = absences.value.find((absence) => {
|
||||||
const start = normalizeDate(absence.startDate)
|
const start = normalizeDate(absence.startDate)
|
||||||
const end = normalizeDate(absence.endDate)
|
const end = normalizeDate(absence.endDate)
|
||||||
@@ -590,10 +585,6 @@ const openCreateFromToday = () => {
|
|||||||
form.typeId = ''
|
form.typeId = ''
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
const today = toYmd(now.getFullYear(), now.getMonth(), now.getDate())
|
const today = toYmd(now.getFullYear(), now.getMonth(), now.getDate())
|
||||||
if (isHolidayDate(today)) {
|
|
||||||
window.alert("Impossible de creer une absence un jour ferie.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
form.startDate = today
|
form.startDate = today
|
||||||
form.endDate = today
|
form.endDate = today
|
||||||
form.startHalf = 'AM'
|
form.startHalf = 'AM'
|
||||||
|
|||||||
Reference in New Issue
Block a user