- Suppression .gitea/workflows/discord-notify.yml (plus de notification Discord a chaque push)
- Suppression controller_resolver.auto_mapping deprecie dans les 2 fichiers doctrine.yaml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/Entity/AppLog.php:
- createdAt initialise avec date('Y-m-d H:i:s') au lieu de
new DateTimeImmutable() pour tronquer les microsecondes
(PostgreSQL arrondit les microsecondes differemment de PHP,
ce qui causait des HMAC invalides a la relecture)
- generateHmac(): format Y-m-d\TH:i:s sans microsecondes
templates/admin/logs/pdf.html.twig (reecrit):
- Meme style que les attestations RGPD (templates/pdf/rgpd_*.html.twig):
banniere gold avec logo, doc-type badge indigo, titre italic uppercase,
info-grid avec cellules bordure indigo, tableaux data avec header dark,
bloc HMAC avec encadre vert/rouge, footer SARL SITECONSEIL
- Logo passe au template via base64
src/Controller/Admin/LogsController.php:
- pdf(): injection de kernel.project_dir, chargement du logo en base64
et passage au template
src/Command/PurgeEmailTrackingCommand.php:
- Ajout de la purge des AppLog de plus de 90 jours (meme seuil
que EmailTracking), affiche le nombre de logs supprimes
templates/components/pagination/glass.html.twig (nouveau):
- Template de pagination KnpPaginator style glassmorphism:
boutons glass avec hover, page active en glass-gold,
fleches precedent/suivant
config/packages/knp_paginator.yaml (nouveau):
- Configuration KnpPaginator pour utiliser le template glass
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/Controller/DevisPdfController.php:
- Route changee de /devis/pdf/{id}/{type} vers /uploads/devis/{id}/{type}
pour garder une URL coherente avec le dossier uploads
config/packages/vich_uploader.yaml:
- uri_prefix change de /devis/pdf vers /uploads/devis
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/Controller/DevisPdfController.php (nouveau):
- Route /devis/pdf/{id}/{type} avec type = unsigned|signed|audit
- Requiert ROLE_USER minimum
- checkAccess(): les ROLE_EMPLOYE ont toujours acces,
pour les clients un TODO est prepare pour verifier que le
client connecte est bien lie au devis (a implementer quand
la relation Customer sera ajoutee sur Devis)
- Sert le fichier via BinaryFileResponse en inline (affichage
dans le navigateur) avec nom de telechargement propre
(ex: signed-04-2026-00001.pdf)
config/packages/vich_uploader.yaml:
- Mapping devis_pdf: stockage deplace de public/uploads/devis
vers var/uploads/devis (hors du dossier public, inaccessible
directement par URL)
- uri_prefix change en /devis/pdf (pointe vers le controller)
config/packages/security.yaml:
- Suppression de la regle access_control sur /uploads/devis
(remplacee par le controller avec verification plus fine)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/Entity/Devis.php:
- submitterSiteconseilId (int nullable): ID du soumetteur cote SITECONSEIL
dans DocuSeal apres signature
- submitterCustomerId (int nullable): ID du soumetteur cote client
dans DocuSeal apres signature
- unsignedPdf (string nullable) + unsignedPdfFile (Vich): PDF non signe
- signedPdf (string nullable) + signedPdfFile (Vich): PDF signe
- auditPdf (string nullable) + auditPdfFile (Vich): certificat d'audit
- updatedAt (DateTimeImmutable nullable): mis a jour automatiquement
a chaque upload de fichier via les setters *File()
- Annotation #[Vich\Uploadable] sur la classe
- Les 3 champs fichier utilisent le mapping 'devis_pdf'
config/packages/vich_uploader.yaml:
- Nouveau mapping devis_pdf: stockage dans public/uploads/devis
avec SmartUniqueNamer pour eviter les collisions de noms
config/packages/security.yaml:
- Nouvelle regle access_control: /uploads/devis requiert ROLE_USER
(empeche l'acces aux PDF de devis sans etre connecte)
migrations/Version20260402203334.php:
- Ajout colonnes submitter_siteconseil_id, submitter_customer_id,
unsigned_pdf, signed_pdf, audit_pdf, updated_at sur la table devis
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
config/packages/cache.yaml:
- Ajout du pool dns_infra_cache avec adapter cache.app et TTL 3600s
- Le pool etait dans config/packages/packages/cache.yaml qui est
surcharge par config/packages/cache.yaml, donc le service
dns_infra_cache n'existait pas
config/packages/packages/cache.yaml:
- Suppression du pool dns_infra_cache (doublon)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/Controller/DnsReportController.php:
- Injection du pool cache dns_infra_cache via #[Autowire]
- Les resultats des checks sont caches avec la cle dns_infra_check_{token}
pendant 1 heure (3600s) pour eviter de rappeler toutes les APIs
(Cloudflare, AWS SES, Mailcow, RDAP, dig) a chaque rechargement
- La date du rapport est stockee dans le cache au format ISO 8601
config/packages/packages/cache.yaml:
- Nouveau pool dns_infra_cache sur Redis avec default_lifetime 3600s
src/Command/PurgeEmailTrackingCommand.php (nouveau):
- Commande app:email-tracking:purge qui supprime les EmailTracking
dont sentAt est anterieur au seuil (90 jours par defaut)
- Option --days pour changer la retention (ex: --days=30)
- Utilise une requete DQL DELETE pour performance
ansible/deploy.yml.disabled:
- Nouveau cron "crm-siteconseil email-tracking purge": tous les jours
a 5h du matin, supprime les EmailTracking de plus de 90 jours
docker/cron/entrypoint.sh:
- Liste complete des taches cron mise a jour avec:
- */5 min: expire-pending, infra:snapshot
- */15 min: services:check
- toutes les heures: monitor:messenger
- toutes les 2h: dns:check
- toutes les 6h: stripe:sync
- 3h: meilisearch consistency
- 4h: attestations clean
- 5h: email-tracking purge
- 6h: cloudflare clean
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>