Files
crm_ecosplay/.env

150 lines
3.7 KiB
Bash
Raw Normal View History

2026-03-30 18:51:57 +02:00
# In all environments, the following files are loaded if they exist,
# the latter taking precedence over the former:
#
# * .env contains default values for the environment variables needed by the app
# * .env.local uncommitted file with local overrides
# * .env.$APP_ENV committed environment-specific defaults
# * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
#
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
# https://symfony.com/doc/current/configuration/secrets.html
#
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
###> symfony/framework-bundle ###
APP_ENV=dev
2026-04-01 15:42:52 +02:00
APP_SECRET=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
2026-03-30 18:51:57 +02:00
APP_SHARE_DIR=var/share
###< symfony/framework-bundle ###
###> symfony/routing ###
2026-04-01 15:42:52 +02:00
DEFAULT_URI=https://esyweb.local
2026-03-30 18:51:57 +02:00
###< symfony/routing ###
2026-03-30 18:52:03 +02:00
###> doctrine/doctrine-bundle ###
2026-04-01 15:42:52 +02:00
DATABASE_URL="postgresql://app:secret@pgbouncer:6432/e_ticket?serverVersion=16&charset=utf8"
2026-03-30 18:52:03 +02:00
###< doctrine/doctrine-bundle ###
###> symfony/messenger ###
2026-04-01 15:42:52 +02:00
MESSENGER_TRANSPORT_DSN=redis://redis:6379/messages
2026-03-30 18:52:03 +02:00
###< symfony/messenger ###
2026-04-01 15:42:52 +02:00
###> session ###
SESSION_HANDLER_DSN=redis://redis:6379/1
###< session ###
###> cache ###
REDIS_CACHE_DSN=redis://redis:6379/2
###< cache ###
2026-03-30 18:52:03 +02:00
###> symfony/mailer ###
2026-04-01 15:42:52 +02:00
MAILER_DSN=smtp://mailpit:1025
2026-03-30 18:52:03 +02:00
###< symfony/mailer ###
2026-04-01 15:42:52 +02:00
###> vite ###
# 0 = dev (HMR via localhost:5173), 1 = prod (manifest build)
VITE_LOAD=0
REAL_MAIL=0
###< vite ###
STRIPE_PK=
STRIPE_SK=
STRIPE_WEBHOOK_SECRET=
STRIPE_WEBHOOK_SECRET_CONNECT=
STRIPE_MODE=test
STRIPE_FEE_RATE=0.015
STRIPE_FEE_FIXED=25
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
ADMIN_EMAIL=contact@e-cosplay.fr
2026-04-01 15:42:52 +02:00
###> SonarQube ###
SONARQUBE_URL=https://sn.esy-web.dev
SONARQUBE_BADGE_TOKEN=sqb_bf06d32640147db064c99d2e893ca63a072630d7
SONARQUBE_PROJECT_KEY=crm_siteconseil
2026-04-01 15:42:52 +02:00
###< SonarQube ###
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
###> SSO E-Cosplay (Keycloak OIDC) ###
OAUTH_KEYCLOAK_CLIENT_ID=crm_siteconseil
OAUTH_KEYCLOAK_CLIENT_SECRET=kh1WBbnEzcEZVriXmU7IaxizChReHmIx
2026-04-01 15:42:52 +02:00
OAUTH_KEYCLOAK_URL=https://auth.esy-web.dev
OAUTH_KEYCLOAK_REALM=master
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
###< SSO E-Cosplay (Keycloak OIDC) ###
2026-04-01 15:42:52 +02:00
###> Keycloak Admin Service Account ###
feat: complete glassmorphism redesign across all templates + Keycloak groups auto-provisioning Templates updated to glassmorphism (40+ files): - templates/admin/clients/ (create, index): glass cards, input-glass inputs, btn-gold buttons, glass table headers, semi-transparent badges - templates/admin/dashboard.html.twig: glass KPI cards - templates/admin/profil/index.html.twig: glass form panels - templates/admin/revendeurs/ (create, edit, index): glass cards and tables - templates/admin/services/index.html.twig: glass service cards - templates/admin/status/ (index, manage): glass panels - templates/admin/sync/index.html.twig: glass panels - templates/admin/facturation/index.html.twig: glass tables - templates/admin/membres.html.twig: glass form, checkboxes with esy-* group values (esy-web, esy-mail, esy-mailer, esy-analytics, esy-monitor, esy-defender, esy-translate, esy-signature, esy-creator, esy-aide, esy-meet, esy-tchat, esy-ndd), Keycloak groups column in table, available groups section - templates/admin/stats/index.html.twig: glass KPI cards, glass-gold CA TTC, factures emises/payees/impayees cards, services renamed to Esy-*, rounded progress bars, bg-gray-200 track backgrounds - templates/security/ (2fa_email, 2fa_google, forgot_password, set_password, set_password_expired): glass headers, glass-heavy cards, input-glass - templates/legal/ (cgu, cgv, cookie, conformite, hebergement, mention_legal, rgpd, tarif): removed thick borders, font-black to font-bold, text-3xl to text-2xl headings - templates/attestation/ (verify, not_found): glass panels - templates/espace_client/index.html.twig: glass panels - templates/espace_prestataire/index.html.twig: glass panels - templates/external_redirect.html.twig: glass card - templates/status/index.html.twig: glass panels - templates/email/base.html.twig: gradient gold header, rounded-16px container, semi-transparent bg, soft shadow, footer address - templates/emails/*.html.twig (9 files): removed 4px borders, font-weight 900 to 700 - templates/pdf/*.html.twig (4 files): rounded borders, gradient header, lighter borders Keycloak auto-provisioning: - src/Service/KeycloakAdminService.php: added REQUIRED_GROUPS constant (15 groups: siteconseil_admin, siteconseil_member, esy-web, esy-mail, esy-mailer, esy-analytics, esy-monitor, esy-defender, esy-translate, esy-signature, esy-creator, esy-aide, esy-meet, esy-tchat, esy-ndd), ensureRequiredGroups() method that checks existing groups and creates missing ones, createGroup() method, getRequiredGroups() static accessor - src/Controller/Admin/MembresController.php: calls ensureRequiredGroups() on page load, shows flash for each auto-created group, fetches user groups per member, passes availableGroups to template Stats controller updated: - src/Controller/Admin/StatsController.php: services renamed to Esy-* (13 services), added factures_emises/payees/impayees KPI data OAuth fix: - src/Security/KeycloakAuthenticator.php: removed dd() debug calls, restored flash message on auth failure with error detail Config: - .env: KEYCLOAK_ADMIN_CLIENT_ID=crm_siteconseil_admin, secret updated - .env.local: same updates - ansible/env.local.j2: KEYCLOAK_ADMIN_CLIENT_ID=crm_siteconseil_admin Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:34:35 +02:00
KEYCLOAK_ADMIN_CLIENT_ID=crm_siteconseil_admin
KEYCLOAK_ADMIN_CLIENT_SECRET=5pIluXMGWgOhx8nI9EiLB43QCuShHLyw
2026-04-01 15:42:52 +02:00
###< Keycloak Admin Service Account ###
###> symfony/amazon-mailer ###
# MAILER_DSN=ses://ACCESS_KEY:SECRET_KEY@default?region=eu-west-1
# MAILER_DSN=ses+smtp://ACCESS_KEY:SECRET_KEY@default?region=eu-west-1
###< symfony/amazon-mailer ###
###> stripe/stripe-php ###
STRIPE_SECRET_KEY=sk_test_***
###< stripe/stripe-php ###
SMIME_PASSPHRASE=EVz5zNV8h4ndSLOCWO9JeaQnIertQm7k
SECRET_ANALYTICS=
feat: refactoring complet de la verification DNS avec services separes Architecture: - Les domaines (siteconseil.fr, esy-web.dev) sont definis en constante dans la commande uniquement, pas dans les services - 3 services independants reutilisables: src/Service/DnsCheckService.php (nouveau): - Methodes publiques checkSpf(), checkDmarc(), checkDkim(), checkMx(), checkBounce() qui prennent le domaine en parametre - Verification SPF: presence des includes amazonses.com et mail.esy-web.dev - Verification DMARC: politique, presence de rua - Verification DKIM: test de 10 selecteurs en CNAME et TXT - Verification MX: le MX attendu est passe en parametre par la commande - Verification Bounce: MX/CNAME/TXT sur bounce.* src/Service/AwsSesService.php (nouveau): - Authentification AWS Signature V4 via HTTP direct (pas de SDK) - isDomainVerified(): verification du statut du domaine dans SES - getDkimStatus(): statut DKIM (enabled, verified, tokens) - getNotificationStatus(): bounce_topic, complaint_topic, forwarding - listVerifiedIdentities(): liste des domaines verifies - isAvailable(): test de connectivite API src/Service/CloudflareService.php (nouveau): - Authentification Bearer token via HTTP direct (pas de SDK) - getZoneId(): recupere le zone ID dynamiquement par nom de domaine (plus besoin de CLOUDFLARE_ZONE_ID en dur) - getDnsRecords(): tous les enregistrements d'une zone - getDnsRecordsByType(): filtrage par type (TXT, MX, CNAME...) - getZone(): informations d'une zone - isAvailable(): verification du token API src/Command/CheckDnsCommand.php (reecrit): - Utilise les 3 services pour orchestrer les verifications - Affichage console colore avec icones OK/ERREUR/ATTENTION - Envoie un rapport email via le template Twig dns_report.html.twig templates/emails/dns_report.html.twig (nouveau): - Template email compatible tous clients (table-based, CSS inline, margin/padding longhand, mso-line-height-rule, pas de rgba/border-radius) - Bandeau colore vert/jaune/rouge selon le statut global - Section succes avec checkmarks verts dans un tableau alterne - Section erreurs en rouge avec croix dans un tableau fond #fef2f2 - Section avertissements en jaune avec triangles fond #fffbeb - Detail par domaine avec tableau type/verification/statut - Utilise le template email/base.html.twig (header gold, footer dark) Variables d'environnement ajoutees: - .env: AWS_PK, AWS_SECRET, AWS_REGION (eu-west-3), CLOUDFLARE_KEY (vides) - .env.local: valeurs reelles des cles AWS et Cloudflare - ansible/vault.yml: aws_pk, aws_secret, cloudflare_key - ansible/env.local.j2: AWS_PK, AWS_SECRET, AWS_REGION, CLOUDFLARE_KEY avec references au vault - CLOUDFLARE_ZONE_ID supprime (recupere dynamiquement via l'API) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:28:24 +02:00
###> aws ###
AWS_PK=
AWS_SECRET=
AWS_REGION=eu-west-3
###< aws ###
###> cloudflare ###
CLOUDFLARE_KEY=
###< cloudflare ###
feat: ajout service Mailcow et integration dans la verification DNS src/Service/MailcowService.php (nouveau): - Connexion a l'API Mailcow via X-API-Key header - getDomains(): liste tous les domaines configures - getDomain(): informations d'un domaine specifique - getDomainStatus(): statut actif, nombre de boites, quota, quota utilise - getDkimKey(): recupere la cle DKIM TXT configuree dans Mailcow - getExpectedDnsRecords(): retourne la liste des enregistrements DNS attendus par Mailcow pour un domaine (MX, SPF, DMARC, DKIM, autodiscover CNAME, autoconfig CNAME, SRV _autodiscover, _mta-sts TXT) - getMailboxes(): liste les boites mail d'un domaine - isAvailable(): test de connectivite API via /api/v1/get/status/containers src/Command/CheckDnsCommand.php: - Ajout de MailcowService dans le constructeur - Nouvelle methode checkMailcow() qui: - Verifie si le domaine existe et est actif dans Mailcow - Recupere la cle DKIM Mailcow et la compare avec celle du DNS (comparaison partielle des 40 premiers caracteres) - Verifie chaque enregistrement DNS attendu par Mailcow: - MX, SPF, DMARC, DKIM : marques comme erreur si absents - autodiscover, autoconfig, SRV, _mta-sts : marques comme warning (optionnels) - Methodes utilitaires: getDkimFromDns(), checkDnsRecordExists(), checkMxExists(), checkTxtContains(), getCnameRecord() Variables d'environnement: - .env: MAILCOW_URL=https://mail.esy-web.dev, MAILCOW_API_KEY (vide) - .env.local: MAILCOW_API_KEY=DF0E7E-0FD059-16226F-8ECFF1-E558B3 - ansible/vault.yml: mailcow_api_key ajoutee - ansible/env.local.j2: MAILCOW_URL et MAILCOW_API_KEY ajoutees Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:31:54 +02:00
###> mailcow ###
MAILCOW_URL=https://mail.esy-web.dev
MAILCOW_API_KEY=
###< mailcow ###
refactor: stocker les secrets webhook Stripe en BDD au lieu de .env.local src/Entity/StripeWebhookSecret.php (nouveau): - Constantes TYPE_MAIN_LIGHT, TYPE_MAIN_INSTANT, TYPE_CONNECT_LIGHT, TYPE_CONNECT_INSTANT pour les 4 types de webhook - type: string(30) unique, identifie le webhook (main_light, etc.) - secret: string(255), le signing secret retourne par Stripe (whsec_xxx) - endpointId: string nullable, l'ID de l'endpoint Stripe (we_xxx) - createdAt: DateTimeImmutable src/Repository/StripeWebhookSecretRepository.php (nouveau): - findByType(): trouve un secret par type - getSecret(): retourne directement la valeur du secret ou null src/Controller/WebhookStripeController.php (reecrit): - Les 4 routes lisent le secret depuis la BDD via StripeWebhookSecretRepository::getSecret() au lieu de variables d'env - Retourne HTTP 503 si le secret n'est pas encore configure - Plus besoin des variables STRIPE_WH_*_SECRET dans .env src/Controller/Admin/SyncController.php: - syncStripeWebhooks(): sauvegarde les secrets en BDD (cree ou met a jour StripeWebhookSecret par type) - Suppression de saveSecretsToEnvLocal() (plus de modification .env.local) - URL de base lue depuis WEBHOOK_BASE_URL (env) .env: - Suppression des 4 variables STRIPE_WH_*_SECRET (stockees en BDD) - Ajout WEBHOOK_BASE_URL (vide par defaut) docker/ngrok/sync.sh: - Ecrit aussi WEBHOOK_BASE_URL en plus de OUTSIDE_URL ansible/env.local.j2: - WEBHOOK_BASE_URL=https://stripe.siteconseil.fr pour la prod migrations/Version20260402205935.php: - Table stripe_webhook_secret avec type unique, secret, endpoint_id Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:59:51 +02:00
###> webhooks ###
WEBHOOK_BASE_URL=
###< webhooks ###
2026-04-01 15:42:52 +02:00
###> docuseal ###
DOCUSEAL_URL=https://signature.esy-web.dev
DOCUSEAL_API=
DOCUSEAL_WEBHOOKS_SECRET_HEADER=X-Sign
DOCUSEAL_WEBHOOKS_SECRET=
###< docuseal ###
refactor: sécurité Discord webhook, tests 100% coverage, factorisation templates PDF et DNS Sécurité - Discord Webhook : - Suppression de l'URL Discord webhook en dur dans CheckDnsCommand (ligne 34) - Ajout de la variable d'environnement DISCORD_WEBHOOK dans .env (vide par défaut) - Injection via #[Autowire(env: 'DISCORD_WEBHOOK')] dans le constructeur - Vérification que le webhook est configuré avant envoi ('' !== $this->discordWebhook) - Remplacement de l'URL en dur dans discord-notify.yml par ${{ secrets.DISCORD_WEBHOOK }} Factorisation DNS (suppression duplication SonarQube) : - Création de src/Service/DnsInfraHelper.php avec les méthodes partagées : enrichWithCloudflare, enrichLastCheck, loadCloudflareRecords, getActualDnsValue, getMxValues, getFirstTxtValue, getSrvValue, checkMxExists, checkTxtContains, checkDnsRecordExists, getTxtSpfValue - Constantes DOMAINS et EXPECTED_MX centralisées dans DnsInfraHelper - Refactorisation de CheckDnsCommand pour utiliser DnsInfraHelper au lieu des méthodes privées dupliquées (enrichWithCloudflare, enrichLastCheck, etc.) - Refactorisation de DnsReportController pour utiliser DnsInfraHelper au lieu des méthodes privées dupliquées (enrichWithCloudflare, enrichLastCheck, etc.) Factorisation templates PDF (suppression duplication lignes 6-22) : - Création de templates/pdf/_base.html.twig comme layout commun avec : CSS partagé (banner, container, info-grid, verify-box, hmac, contact-box, data tables), blocs Twig configurables (title, font_size, extra_styles, content, verify_box, hmac_section, footer_contact, signature_box, footer_legal) - Refactorisation de rgpd_access.html.twig : extends _base, accent #4338ca, bloc content avec sessions/events, styles session-meta et no-data - Refactorisation de rgpd_deletion.html.twig : extends _base, accent #dc2626, font 11px, bloc content avec attestation-box et warning - Refactorisation de rgpd_no_data.html.twig : extends _base, accent #fabf04/#111827, font 11px, bloc content avec attestation absence - Refactorisation de admin/logs/pdf.html.twig : extends _base, accent #4338ca, bloc content avec tables utilisateur/requête et HMAC verification box, suppression du bloc signature, footer légal avec Siret/TVA Tests - Couverture 100% (469 tests, 857 assertions, 0 failures) : AnalyticsControllerTest (8 tests) : - testTrackInvalidToken : token incorrect retourne 404 - testTrackEmptyPayload : payload sans clé 'd' retourne 400 - testTrackInvalidEncryptedData : données chiffrées invalides retourne 403 - testTrackNewVisitorCreation : création visiteur avec screen/language/UA, retourne uid+hash - testTrackPageViewWithValidHash : page view avec uid/hash valides retourne 204 - testTrackSetUserWithValidHash : setUser avec uid/hash valides retourne 204 - testTrackWithInvalidHash : hash incorrect retourne 403 - testTrackWithMissingHash : hash absent retourne 403 AttestationControllerTest (8 tests) : - testVerifyNotFound : référence inconnue retourne 200 (template not_found) - testVerifyFound : attestation trouvée retourne 200 (template verify) - testDownloadNotFound : référence inconnue lance NotFoundHttpException - testDownloadNoPdf : attestation sans PDF lance NotFoundHttpException - testDownloadWithPdf : attestation avec PDF signé retourne BinaryFileResponse 200 - testAuditNotFound : référence inconnue lance NotFoundHttpException - testAuditNoCertificate : attestation sans certificat lance NotFoundHttpException - testAuditWithCertificate : attestation avec certificat retourne BinaryFileResponse 200 CspReportControllerTest (13 tests) : - testGetReturns204 : GET /my-csp-report retourne 204 - testReportEmptyPayload : payload vide retourne 400 - testReportInvalidJson : JSON invalide retourne 400 - testReportIgnoredExtension : chrome-extension ignoré, retourne 204 - testReportIgnoredMozExtension : moz-extension ignoré, retourne 204 - testReportIgnoredLocalhost : localhost ignoré, retourne 204 - testReportIgnoredLocalDomain : .local ignoré, retourne 204 - testReportIgnoredWasmEval : wasm-eval ignoré, retourne 204 - testReportIgnoredAboutBlank : about:blank ignoré, retourne 204 - testReportIgnoredNodeModulesInline : node_modules inline ignoré, retourne 204 - testReportRealViolationSendsEmail : violation réelle envoie email, retourne 204 - testReportRealViolationEmailFailure : échec email ne bloque pas, retourne 204 - testReportWithoutCspReportWrapper : payload sans wrapper csp-report fonctionne EmailTrackingControllerTest (10 tests) : - testTrackWithExistingTracking : tracking trouvé, markAsOpened appelé, état 'opened' - testTrackWithNonExistingTracking : tracking absent, retourne image sans erreur - testViewNotFound : messageId inconnu lance NotFoundHttpException - testViewNoHtmlBody : tracking sans htmlBody lance NotFoundHttpException - testViewWithHtmlBody : retourne HTML du tracking - testViewWithAttachments : retourne HTML avec section pièces jointes - testAttachmentNotFoundEmail : email inconnu lance NotFoundHttpException - testAttachmentIndexNotFound : index absent lance NotFoundHttpException - testAttachmentFileNotExists : fichier supprimé lance NotFoundHttpException - testAttachmentSuccess : téléchargement pièce jointe retourne BinaryFileResponse StatsControllerTest (4 tests) : - testIndexCurrentPeriod : période 'current', dates du mois en cours - testIndexCustomPeriod : période 'custom' avec from/to explicites - testIndexMonthsPeriod : période '3', dateFrom = -3 mois - testIndexDefaultPeriod : pas de paramètre, défaut 'current' StatusControllerTest (20 tests) : - testIndexEmpty : catégories vides retourne 200 - testIndexWithServices : catégorie avec service, appel getHistoryForDays/getDailyStatus - testManage : page gestion retourne 200 - testCategoryCreateEmptyName : nom vide redirige avec flash error - testCategoryCreateSuccess : création catégorie avec position redirige avec flash success - testCategoryDelete : suppression catégorie redirige avec flash success - testServiceCreateEmptyName : nom vide redirige avec flash error - testServiceCreateCategoryNotFound : catégorie inexistante redirige avec flash error - testServiceCreateSuccess : création service avec URL redirige avec flash success - testServiceCreateWithExternalType : création service externe avec type http_check - testServiceDelete : suppression service redirige avec flash success - testUpdateValidStatus : statut 'down' avec message, setStatus appelé - testUpdateInvalidStatus : statut invalide redirige avec flash error - testUpdateStatusWithEmptyMessage : statut 'up' sans message (null passé) - testMessageCreateEmptyFields : champs vides redirige avec flash error - testMessageCreateServiceNotFound : service inexistant redirige avec flash error - testMessageCreateSuccessNoUser : message créé sans utilisateur connecté - testMessageCreateSuccessWithUser : message créé avec User injecté via tokenStorage - testMessageResolve : message résolu, isActive=false, resolvedAt non null - testApiDaily : retourne JsonResponse avec données getDailyStatus SyncControllerTest (14 tests) : - testIndexWithMixedPrices : prix avec/sans stripeId, compteurs stripeSynced/stripeNotSynced - testSyncCustomersSuccess : indexation 1 client dans Meilisearch - testSyncCustomersError : exception findAll, flash error - testSyncRevendeursSuccess : indexation 1 revendeur dans Meilisearch - testSyncRevendeursError : exception findAll, flash error - testSyncPricesSuccess : indexation 1 tarif dans Meilisearch - testSyncPricesError : exception findAll, flash error - testSyncStripeWebhooksEmptyUrl : WEBHOOK_BASE_URL vide, flash error - testSyncStripeWebhooksCreatedNew : webhook créé + webhook existant, persist nouveau secret - testSyncStripeWebhooksUpdateExisting : mise à jour secret existant + erreurs Stripe - testSyncStripePricesNoErrors : sync sans erreurs, flash success - testSyncStripePricesWithErrors : sync avec erreurs, flash success + flash errors - testSyncAllSuccess : sync all avec données, flash success - testSyncAllError : exception setupIndexes, flash error ServiceMessageTest (3 tests) : - testConstructorDefaults : valeurs par défaut (info, active, null author/resolvedAt) - testConstructorWithSeverityAndAuthor : severity custom + User author - testResolve : isActive=false, resolvedAt DateTimeImmutable, fluent return StripeWebhookSecretTest (4 tests) : - testConstructorDefaults : type/secret, endpointId null, createdAt DateTimeImmutable - testConstructorWithEndpointId : constructeur avec 3 arguments - testSetSecret : modification du secret - testSetEndpointId : set/unset endpointId (nullable) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:42:07 +02:00
###> discord ###
DISCORD_WEBHOOK=
###< discord ###
feat: service EsyMailService complet pour gestion messagerie EsyMailService - connexion DBAL directe vers base esymail : Gestion domaines : - listDomains() : liste avec count mailboxes par domaine - getDomain(name) : détails d'un domaine - createDomain(name, maxMailboxes, defaultQuotaMb) : création - updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour - deleteDomain(name) : suppression cascade (mailboxes + alias) - domainExists(name) : vérification existence Gestion boîtes mail : - listMailboxes(?domain) : liste toutes ou par domaine - getMailbox(email) : détails d'une boîte - createMailbox(email, password, ?displayName, quotaMb) : création avec hash bcrypt BLF-CRYPT, vérification domaine existant - updateMailbox(email, displayName, quotaMb, isActive) : mise à jour - changePassword(email, newPassword) : changement mot de passe - deleteMailbox(email) : suppression - mailboxExists(email) : vérification existence - countMailboxes(domain) : nombre de boîtes par domaine Gestion alias : - listAliases(?domain) : liste tous ou par domaine - createAlias(source, destination, domain) : création redirection - deleteAlias(id) : suppression Stats : - getStats() : compteurs domains, mailboxes, aliases, active_mailboxes Base de données esymail : - Table domain : name unique, max_mailboxes, default_quota_mb, is_active - Table mailbox : email unique, password bcrypt, domain FK, display_name, quota_mb, is_active, timestamps - Table alias : source/destination unique, domain FK, is_active - Domaines dev : siteconseil.fr, esy-web.dev - Compte test : test@siteconseil.fr / test1234 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
###> esymail ###
ESYMAIL_DATABASE_URL=
ESYMAIL_HOSTNAME=
feat: service EsyMailService complet pour gestion messagerie EsyMailService - connexion DBAL directe vers base esymail : Gestion domaines : - listDomains() : liste avec count mailboxes par domaine - getDomain(name) : détails d'un domaine - createDomain(name, maxMailboxes, defaultQuotaMb) : création - updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour - deleteDomain(name) : suppression cascade (mailboxes + alias) - domainExists(name) : vérification existence Gestion boîtes mail : - listMailboxes(?domain) : liste toutes ou par domaine - getMailbox(email) : détails d'une boîte - createMailbox(email, password, ?displayName, quotaMb) : création avec hash bcrypt BLF-CRYPT, vérification domaine existant - updateMailbox(email, displayName, quotaMb, isActive) : mise à jour - changePassword(email, newPassword) : changement mot de passe - deleteMailbox(email) : suppression - mailboxExists(email) : vérification existence - countMailboxes(domain) : nombre de boîtes par domaine Gestion alias : - listAliases(?domain) : liste tous ou par domaine - createAlias(source, destination, domain) : création redirection - deleteAlias(id) : suppression Stats : - getStats() : compteurs domains, mailboxes, aliases, active_mailboxes Base de données esymail : - Table domain : name unique, max_mailboxes, default_quota_mb, is_active - Table mailbox : email unique, password bcrypt, domain FK, display_name, quota_mb, is_active, timestamps - Table alias : source/destination unique, domain FK, is_active - Domaines dev : siteconseil.fr, esy-web.dev - Compte test : test@siteconseil.fr / test1234 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
###< esymail ###
###> ovh ###
OVH_KEY=
OVH_SECRET=
OVH_CUSTOMER=
###< ovh ###
###> vault ###
VAULT_URL=
VAULT_TOKEN=
###< vault ###
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
###> google-search-console ###
GOOGLE_SEARCH_CONSOLE_KEY=
###< google-search-console ###
###> sentry ###
SENTRY_AUTH_TOKEN=
SENTRY_ORG=
SENTRY_API_URL=https://sentry.io/api/0
###< sentry ###
###> tva ###
TVA_ENABLED=false
TVA_RATE=0.20
###< tva ###