tristan 8e59e9fd6a
Auto Tag Develop / tag (push) Successful in 10s
fix(heures) : n'enregistrer que les lignes modifiées (anti-écrasement concurrent) (#31)
## Problème

Sur l'écran **Heures** / **Heures Conducteurs**, l'enregistrement envoyait au bulk-upsert une entrée pour **tous** les employés visibles non verrouillés, à partir de l'état en mémoire de la grille. Le backend (`WorkHourBulkUpsertProcessor`) traitant une **entrée vide comme une suppression**, un admin avec une grille **périmée** pouvait supprimer une ligne saisie entre-temps par un autre utilisateur.

### Scénario reproduit
1. Un admin ouvre l'écran ; la ligne d'un salarié `ROLE_SELF` est vide.
2. Ce salarié saisit ses heures dans sa propre session → ligne créée, **non validée** (donc non verrouillée).
3. L'admin, sur sa grille périmée, enregistre d'autres employés.
4. Le payload contient une entrée **vide** pour le salarié → le backend supprime sa ligne. **Perte de données.**

## Correctif (suivi des lignes modifiées)

`hydrateRows` capture un instantané `loadedRows` de l'état chargé depuis le serveur. `handleSave` ne transmet plus que les lignes **dont l'état courant diffère de l'instantané**.

- Ligne **intouchée** → jamais envoyée → jamais supprimée 
- Ligne **vidée volontairement** → envoyée vide → supprimée (métier conservé)
- Ligne **remplie/modifiée** → envoyée → créée/mise à jour

Symétrique dans `useHoursPage.ts` et `useDriverHoursPage.ts`.

## Limite connue
Pas de verrou optimiste backend : l'édition **explicite** d'une ligne sur données périmées peut toujours écraser une saisie concurrente sur cette même ligne (hors périmètre).

## Doc
- `doc/hours-save-dirty-tracking.md` (nouveau)
- Note `CLAUDE.md` (section *Validation Rules*)

## Vérification
- Pre-commit hook : **236 tests PHPUnit OK**.
- Pas de harnais de tests frontend (revue de code uniquement).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Reviewed-on: #31
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-06-24 07:16:42 +00:00
2026-02-03 18:04:06 +01:00
2026-06-16 13:53:14 +00:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 17:59:39 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00
2026-02-03 18:04:06 +01:00

SIRH

Application de gestion des absences employée

Importer un dump de prod en dev

Sur adminer fait un export bdd :

  • Sortie : enregistrer
  • Format : SQL
  • Tables : DROP+CREATE, Incrément automatique, Déclencheurs
  • Données : INSERT

Supprime la bdd et créer la bdd :

docker compose exec -T db psql -U root -d sirh -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"

Remplie la base avec le dump :

docker compose exec -T db psql -U root -d sirh < sirh.sql

Mettre SUPER_ADMIN sur un user

UPDATE users SET roles = '["ROLE_ADMIN","ROLE_SUPER_ADMIN"]' WHERE username = 'emilie';

Récupérer la bdd de prod en local

Sur le serveur de prod, créer le dump :

sudo -u postgres pg_dump --no-owner --no-privileges --clean --if-exists sirh_prod > /tmp/sirh_prod_$(date +%F).sql

En local, récupérer le fichier et l'importer (remplace YYYY-MM-DD par la date du dump) :

scp user@<serveur>:/tmp/sirh_prod_YYYY-MM-DD.sql ~/workspace/SIRH/sirh.sql
docker compose exec -T db psql -U root -d sirh -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
docker compose exec -T db psql -U root -d sirh < ~/workspace/SIRH/sirh.sql
S
Description
No description provided
Readme 5.3 MiB
v0.1.67 Latest
2026-03-30 13:08:13 +00:00
Languages
PHP 62%
Vue 21.2%
TypeScript 13.4%
Twig 2.6%
Shell 0.3%
Other 0.4%