feature/21-pdf-echeance #24

Merged
ronan.quintin merged 8 commits from feature/21-pdf-echeance into main 2025-12-28 10:35:20 +01:00
No description provided.
Backend - Implémentation:
- Event: RentDueCreatedEvent avec ID seulement (évite LazyInitializationException)
- Workflow: RentDueToGedWorkflow (3 étapes: LoadData, GeneratePDF, StoreInGed)
- Service: RentDueService.generateRentDueNoticePDF() avec findByIdWithAllRelations()
- Repository: RentDueRepository.findByIdWithAllRelations() avec JOIN FETCH
- Template: rent-due.html professionnel (bailleurs, locataires, montants)
- GED: DocumentType.RENT_DUE_NOTICE

Backend - Corrections Critiques:
1. N+1 Queries: findByIdWithAllRelations() charge tout en 1 requête (au lieu de 7+2N)
2. LazyInitializationException: RentDueCreatedEvent stocke Long rentDueId (pas entité)
3. Segmentation: shouldFilterByCreator() override pour workflows asynchrones
4. BigDecimal: Utilisation #numbers.formatDecimal() dans template (pas toString())

Tests:
- 33 tests unitaires (LoadRentDueDataStep, GeneratePDF, StoreInGed, Workflow)
- Tests isolés sans contexte Spring (pour rapidité)

Documentation:
- 02-ARCHITECTURE_TECHNIQUE.md: Workflow Engine, GED, PDF generation
- 03-GUIDE_FONCTIONNEL.md: Use case "Avis d'Échéance automatique"

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Nouvel endpoint: GET /api/rent-dues/{id}/notice

Fonctionnalité:
- Cherche dans GED si PDF RENT_DUE_NOTICE existe pour l'échéance
- Si trouvé: retourne PDF depuis GED (DocumentService.downloadLatestVersion)
- Si non trouvé: génère à la volée avec RentDueService.generateRentDueNoticePDF()
- Utile pour anciennes échéances créées avant implémentation workflow

Avantages:
- Réutilise documents GED existants (évite duplicatas)
- Support backward compatibility pour anciennes échéances
- Téléchargement direct sans passer par workflow

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Frontend - Modifications:
1. rentDueService.js: Méthode downloadNotice(id) avec téléchargement PDF
2. CrudTable.jsx: Support customActions pour actions personnalisées
3. RentDueList.jsx: Bouton téléchargement avec spinner et gestion erreur

Fonctionnalités:
- Icône Download dans liste échéances
- Appel GET /api/rent-dues/{id}/notice
- Téléchargement automatique du PDF
- Feedback utilisateur (spinner pendant téléchargement)
- Gestion erreurs avec alert()

UX:
- Bouton désactivé pendant téléchargement
- Spinner remplace icône pendant chargement
- Tooltip explicatif "Télécharger l'avis d'échéance"
- Couleur "info" pour distinguer des actions Edit/Delete

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Les tests utilisaient encore l'ancienne signature de RentDueCreatedEvent
qui prenait RentDue en paramètre au lieu de Long rentDueId.

Corrections:
- LoadRentDueDataStepTest: new RentDueCreatedEvent(rentDue.getId())
- RentDueServiceEventTest: event.rentDueId() avec fallback repository
- RentDueToGedWorkflowIntegrationTest: new RentDueCreatedEvent(rentDue.getId())

Tous les tests compilent maintenant correctement.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Issue #1 (CRITIQUE) - mapModelToEntity ne calculait pas totalAmount:
- Ajout calcul: totalAmount = rentAmount + chargesAmount
- Gestion null-safety avec BigDecimal.ZERO par défaut
- Fix bloquait complètement POST /api/rent-dues

Issue #2 (MINEUR) - Échéance inexistante retournait PDF vide:
- Ajout vérification d'existence avant génération PDF
- Retourne HTTP 404 au lieu de HTTP 200 + PDF vide
- Améliore gestion d'erreur API

Tests avec api-tester avant fixes: 82% (9/11)
Les deux issues empêchaient tests workflow complet.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Bug critique: WorkflowEngineImpl n'ajoutait pas RentDueCreatedEvent
au contexte du workflow, causant échec de LoadRentDueDataStep.

Fix:
- Ajout case RentDueCreatedEvent dans enrichissement du contexte
- context.put("event", triggerEvent) pour LoadRentDueDataStep
- Pattern cohérent avec PaymentSavedEvent existant

Impact:
- Workflow RentDueToGed fonctionne maintenant de bout en bout
- PDF généré automatiquement et stocké dans GED
- Tests confirmés: RentDue#9 → Document#136 (avis_echeance_*.pdf)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Issue #3 (NullPointerException) - RentDueController.mapEntityToModel():
- Ajout vérification null pour rentDue.getLease() avant accès getId()
- Ajout vérification null pour getLease().getLeaseHolders()
- Fix: retourne leaseId=null et leaseHolderFullNames="" si lease null
- Évite NPE quand échéance créée sans bail associé

Validation des champs obligatoires:
- RentDueModel: @NotNull sur leaseId, dueDate, rentAmount
- Messages d'erreur français ("Le bail est obligatoire", etc.)
- GenericRestController: @Valid sur create() et update()
- Retourne HTTP 400 avec erreurs détaillées si champs manquants

Tests validés:
- POST sans leaseId → HTTP 400: "Le bail est obligatoire"
- POST sans dueDate → HTTP 400: "La date d'échéance est obligatoire"
- POST sans rentAmount → HTTP 400: "Le montant du loyer est obligatoire"
- POST complet → HTTP 201 + workflow → PDF dans GED (Document #137)
- GET /api/rent-dues → Aucun NPE, tous les RentDues retournés

Impact:
- Frontend peut maintenant valider les champs avant soumission
- Erreurs claires et explicites pour l'utilisateur
- Protection contre données incomplètes

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
ronan.quintin deleted branch feature/21-pdf-echeance 2025-12-28 10:35:20 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: ronan.quintin/Keryloo#24
No description provided.