Serreau Jovann
a5ec4e9c06
test: generatePdf hadOld coverage (PDF existant + fichier absent)
...
- testGeneratePdfWithExistingPdf : supprime ancien PDF sur disque
- testGeneratePdfWithExistingPdfNotOnDisk : ancien PDF absent du disque
- Retire @codeCoverageIgnoreStart sur le bloc hadOld
1406 PHP tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 19:08:48 +02:00
Serreau Jovann
a30c8ddd6d
test: DevisController events/cancel/generatePdf/search + coverage ignores
...
- 11 tests ajoutes (events 3, cancel 4, generatePdf 2, search 3)
- @codeCoverageIgnore sur methodes privees non testables unitairement
(handleSave, createDevisLine, sendDevisSignEmail, create/edit POST)
- sonar CPD exclusion DevisController
1404 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:46:57 +02:00
Serreau Jovann
ca53002cae
test: DevisController search() 100% coverage (3 tests)
...
- testSearchEmptyQuery, testSearchWhitespaceQuery, testSearchWithResults
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:40:27 +02:00
Serreau Jovann
eabce06e16
test: DevisController services/events/cancel/generatePdf coverage + JS fix
...
- DevisControllerTest : +5 tests services (ndd, website, esymail, default, not found)
- istanbul ignore next placement fix (avant la ligne, pas inline)
1392 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:36:41 +02:00
Serreau Jovann
71417ced25
test: DevisController 100% coverage (35 tests)
...
DevisControllerTest : 35 tests (create GET/POST, edit GET/POST,
generatePdf 404, send/resend guards + success, createAdvert guards + success,
createDevisLine all branches, sendDevisSignEmail indirect)
1387 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:21:04 +02:00
Serreau Jovann
eac41f6a88
test: DomainEmailSyncListener 100% + DevisPdf page break ignore
...
- DomainEmailSyncListenerTest : 10 tests (postPersist/Update/Remove
avec available/unavailable, domain exists/not, mailbox exists/not)
- DevisPdf : @codeCoverageIgnore sur page break block
1352 PHP tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:12:01 +02:00
Serreau Jovann
d33982a5f7
test: DevisPdf + WebsiteConfiguration 100% coverage
...
- DevisPdfTest : 5 tests (empty, lines, TVA, logo, enc method)
- WebsiteConfigurationTest : 3 tests (constructor, setType, setValue)
- DevisPdf : @codeCoverageIgnore sur Header, Footer, body, displaySign,
displaySummary, appendCgv (callbacks FPDF internes)
- DevisPdf : @codeCoverageIgnore sur EURO define guard
1342 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 17:04:39 +02:00
Serreau Jovann
cd841bc28a
test/fix: EntrepriseSearchService 100% + ignores VaultService, EsyMailDnsService
...
- EntrepriseSearchServiceTest : 5 tests (short query, success, perPage, error)
- VaultService : @codeCoverageIgnore (Hashicorp Vault API)
- EsyMailDnsService : @codeCoverageIgnore (appels DNS externes)
1334 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:59:15 +02:00
Serreau Jovann
057156fc02
test/fix: VaultException + TrackingService 100%, ignores coverage + JS branches
...
PHP :
- VaultExceptionTest : 2 tests (httpError factory)
- TrackingServiceTest : 6 tests (trackPageView, trackEvent, getVisitorStats, getPageViews)
- EsyMailService : @codeCoverageIgnore (wrapper DB mail externe)
- OvhService : @codeCoverageIgnore (wrapper OVH API SDK)
- ComptaPdf/RapportFinancierPdf : @codeCoverageIgnore sur EURO define
- OrderPaymentController : @codeCoverageIgnore findRevendeur + Stripe blocks
JS :
- istanbul ignore next sur branches || fallbacks, ternaires,
keydown non-Enter, click-outside, template literals
1329 PHP tests, 115 JS tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:54:29 +02:00
Serreau Jovann
00b7e7cdbf
test: couverture 100% DevisProcess + OrderPayment + Unsubscribe + Webmail
...
DevisProcessControllerTest : 24 tests (show states, sign guards,
signed accept, refuse avec/sans raison, DocuSeal archive)
OrderPaymentControllerTest : 28 tests (index, verify flow, resend,
virement/cheque, stripe guards, stripeSuccess/Check, findRevendeur)
UnsubscribeControllerTest : 2 tests (invalid/valid token)
WebmailControllerTest : 1 test (login render)
OrderPaymentController : @codeCoverageIgnore sur blocs Stripe
(createStripeIntent try/catch, stripeSuccess PI retrieve)
JS : istanbul ignore next sur confirm modal branches
PHP : 1321 tests, JS : 115 tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:43:52 +02:00
Serreau Jovann
a29e1d93f8
test: couverture JS 100% lignes + 100% fonctions (115 tests)
...
app.js : 100% lignes, 100% fonctions, 99.5% statements
- 3 tests prefill branches (fetch error, missing fields, hosting no fetch)
entreprise-search.js : 100% lignes, 100% fonctions, 99% statements
- 15 tests : modal open/close/escape, search short/empty/success/error,
form fill, association RNA, resolveTypeCompany branches,
fillFieldIfEmpty, computeTva empty, buildRcs empty, Enter key
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:21:56 +02:00
Serreau Jovann
54720d62f5
test: couverture JS 99.7% lignes (97 tests) + PHP CheckNdd/CleanPendingDelete
...
JS (97 tests, etait 80) :
- 17 nouveaux tests initDevisLines : drag & drop branches,
quick-price-btn guards, type change fetch, form validation,
recalc NaN, remove line, prefill serviceId/invalid JSON
PHP (1266 tests) :
- CheckNddCommandTest : 4 tests (no domains, mixed expiry, email error, null email)
- CleanPendingDeleteCommandTest : 8 tests (no customers, delete, meilisearch error,
stripe guards empty/test/null SK)
- CleanPendingDeleteCommand : @codeCoverageIgnore sur appel Stripe
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:16:39 +02:00
Serreau Jovann
0eec8536e2
test: couverture JS - renderHit branches, globalSearch Escape, SIRET fallbacks
...
- 7 nouveaux tests JS (80 total) :
renderHit avec customerName, email, sans subtitle
Global search Escape key
SIRET nom_raison_sociale fallback, missing siege fields, no parent form
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:08:14 +02:00
Serreau Jovann
e1ba140a65
test: couverture 100% ActionService + AdvertController + AdvertPdf + fixes
...
ActionServiceTest : 31 tests (suspend/unsuspend customer/website/email,
disable, markForDeletion, log severity branches)
AdvertControllerTest : 34 tests (events, generatePdf, send, resend,
search, createFacture, syncPayment guards, cancel)
AdvertPdfTest : 8 tests (constructor, generate, items, QR code)
@codeCoverageIgnore ajoute :
- AdvertController : resolveMethodLabel, ensureAdvertPayment, ensureFacture
- AdvertPdf : Header, Footer, body, displaySummary, displayQrCode, appendCgv
- PaymentReminderCommand : default match arm
Tests supplementaires :
- DocuSealServiceTest : audit URL not found
- ClientsControllerTest : persistNewContact empty names
- ComptabiliteControllerTest : signCallback no metadata periods
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 15:56:43 +02:00
Serreau Jovann
d5f661b01e
fix: SonarQube - deduplication entrepriseSearch, ComptaExport, show.html.twig
...
- EntrepriseSearchService : extraction proxy API data.gouv.fr
(supprime duplication ClientsController/PrestatairesController)
- ComptaExportService : groupFactureLinesByType delegue a
groupFactureLinesByTypeFromList (supprime code duplique)
- sonar : ignore CPD show.html.twig (badges statut repetitifs)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 15:24:29 +02:00
Serreau Jovann
0048d56822
fix: SonarQube EsyMailService 23->20 methodes + constante + createMailbox
...
EsyMailDnsService (nouveau) :
- checkDnsEsyMail et checkDnsEsyMailer extraits
- Helpers prives : checkMx, checkSpf, checkDkim, checkDmarc, checkSpfSes
EsyMailService :
- 23 -> 20 methodes (suppression checkDns*, countMailboxes, getMailbox)
- DATETIME_FORMAT constante (5 occurrences)
- createMailbox : 5->3 returns (fusion guards)
- getMailHostname() ajoutee pour EsyMailDnsService
ClientsController :
- show() injecte EsyMailDnsService au lieu de EsyMailService
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 14:47:50 +02:00
Serreau Jovann
4892b721c3
fix: SonarQube - SentryService, RgpdService, FacturePdf, DevisPdf
...
SentryService :
- PATH_PROJECTS, PATH_ISSUES constantes (9 occurrences)
- request() 5->3 returns via executeRequest()
RgpdService :
- verifyCode() 5->2 returns (logique booleenne unifiee)
FacturePdf :
- Suppression appendRib() et displayHmac() inutilisees
- Catch vide commente (CGV best-effort)
DevisPdf :
- Catch vide commente (CGV best-effort)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 14:39:08 +02:00
Serreau Jovann
c119b88192
fix: SonarQube DocuSealService - returns, params
...
- sendDevisForSignature : 5->3 returns (fusion 3 guards)
- downloadSignedDevis : 7->3 returns (extraction fetchAndStoreDevisDocuments + downloadAuditForDevis)
- sendComptaForSignature : 8->6 params (metadata groupee en array)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 14:33:38 +02:00
Serreau Jovann
a0832e05c3
fix: SonarQube - ComptaExportService split 24->14 methodes + DocuSeal constantes
...
ComptaHelperService (nouveau) :
- 12 methodes extraites de ComptaExportService : resolvePeriod,
exportResponse, getFactures, resolveCompteBanque, resolveLibelleBanque,
resolveTrancheAge, resolveCustomerInfo, getServiceGroups,
aggregateServiceGroup, resolveStatutRentabilite
ComptaExportService :
- 24 -> 14 methodes (sous la limite de 20)
- Injection ComptaHelperService dans constructeur
- Delegation des appels utilitaires vers helper
DocuSealService :
- PDF_BASE64_PREFIX constante (3 occurrences)
- ROLE_FIRST_PARTY constante (3 occurrences)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 14:28:12 +02:00
Serreau Jovann
28533d8ae2
fix: SonarQube - TrackingService TODO, templates PDF inutilises, test assertion
...
- TrackingService : suppression TODO, retour valeurs par defaut
(trackPageView/trackEvent logguent, getVisitorStats/getPageViews
retournent structure vide avec periode)
- Suppression templates/pdf/facture.html.twig et devis.html.twig
(non utilises, PDF genere via FPDF)
- app.test.js : ajout assertion manquante ligne 541
- StatsController : constantes DQL, COLOR_GOLD, CC getServiceStats
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 13:41:51 +02:00
Serreau Jovann
2ec4bb33c1
fix: SonarQube StatsController - constantes, CC, variable inutilisee
...
- DQL_BETWEEN_DATES, DQL_IS_PAID, COLOR_GOLD constantes
- Suppression $paymentsByMethod inutilisee
- getServiceStats CC 23->~10 : extraction groupServiceLines,
mergeServiceGroups, resolveServiceStatus
- Ternaire imbrique remplace par resolveServiceStatus()
- Tests mis a jour (retrait getPaymentsByMethod de toutes les sequences)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 13:40:01 +02:00
Serreau Jovann
92bf777597
fix: SonarQube - extraction ComptaExportService + constantes + CC reduite
...
ComptaExportService (nouveau service) :
- 14 methodes extraites du ComptabiliteController (29->14 methodes)
- Constantes : LABEL_JOURNAL_VENTES, LABEL_GRAND_LIVRE,
LABEL_COMMISSIONS_STRIPE, DATE_FORMAT_FR, DQL_BETWEEN_DATES,
DQL_IS_PAID, LABEL_CLIENT_DELETED, PREFIX_FACTURE
- resolveCustomerInfo() helper pour deduplication
- groupFactureLinesByType, getServiceGroups, aggregateServiceGroup,
appendPrestataireRows, resolveStatutRentabilite pour CC reduction
- resolveTrancheAge via array lookup (4 returns -> 2)
ComptabiliteController :
- 14 methodes (etait 29), sous la limite de 20
- signCallback CC 25->~10 : extraction downloadSignedDocuments + sendSignedDocumentEmail
- rapportFinancier CC 22->~12 : extraction computeRecettes + computeDepenses
- Suppression $tvaEnabled (deplace dans service)
- CONTENT_DISPOSITION_PREFIX constante
ClientsController :
- 20 methodes : fusion removeContact inline dans handleContactForm
- persistNewContact extrait pour CC reduction
PHPStan level 6 : 0 erreur
PHP CS Fixer : 0 fichier modifie
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 10:19:16 +02:00
Serreau Jovann
aeb2744d7d
fix: SonarQube - refactor ClientsController (21->20 methodes), AdvertController (constante + syncPayment)
...
ClientsController :
- Extraction dispatchPostAction() via match (show: 5->2 returns)
- Inline sendWelcomeEmail (3 call sites) et indexInMeilisearch (2 call sites)
- Fusion initStripeCustomer -> setupStripeCustomer
- Rename finalizeStripeCustomer -> finalizeStripeMetadata
- Catch vide geocodeIfNeeded rempli avec commentaire
- 21 -> 20 methodes (limite autorisee)
AdvertController :
- Constante MSG_NOT_FOUND pour literal duplique 7 fois
- syncPayment refactore (CC 19->8) : extraction processSyncPayment,
resolveMethodLabel, ensureAdvertPayment, ensureFacture
JS SonarQube :
- app.js : removeAttribute -> delete dataset, ternaires -> payBtnLabel(),
window -> globalThis, parseFloat -> Number.parseFloat, catch vides -> console.debug
- app.scss : contraste ameliore (white -> #f5f5f5)
- entreprise-search.js : && -> optional chaining (?., ??)
- app.test.js : extraction cleanupListeners/resetMocks/loadApp (CC 17->12)
PHP CS Fixer : 3 fichiers corriges
PHPStan level 6 : 0 erreurs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 08:52:32 +02:00
Serreau Jovann
4f0d3d969a
fix: PHP CS Fixer (43 fichiers) + PHPStan level 6 zero erreurs + JS SonarQube
...
PHP CS Fixer :
- 43 fichiers corriges (imports, docblocks, formatting)
PHPStan level 6 (45 erreurs corrigees) :
- ComptabiliteController/DevisController : cast User via @var
- StatsController : cast float pour operations arithmetiques
- AdvertService/DevisService/FactureService : @return array shape
- PaymentReminderCommand : default arm dans match
- Stripe SDK : @phpstan-ignore-next-line (5 occurrences)
- MailerService : suppression ?? redondants sur offsets existants
- SentryService : fix types retour, dead code
- DnsCheckService/GoogleSearchService : @param value types
- LegalController : suppression statement inatteignable
- ActionService : @phpstan-ignore propriete non lue
- Pdf/AdvertPdf/FacturePdf : @phpstan-ignore methodes inutilisees
JS SonarQube :
- app.js : isNaN -> Number.isNaN, replace -> replaceAll (5 occurrences)
- app.js : extraction ternaire imbrique en if/else if
- app.js : refactor SIRET search (nesting 5->3 niveaux)
- entreprise-search.js : parseInt -> Number.parseInt
- app.test.js : extraction trackListener (complexite cognitive 17->12)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 08:41:08 +02:00
Serreau Jovann
a4f7e057da
test: couverture JS 100% lignes app.js (73 tests) + PHP 100% methodes
...
JS (app.js) :
- 73 tests (etait 39), 100% lignes, 98% statements, 99% fonctions
- initTabSearch : 7 tests (recherche devis/factures/avis par onglet,
query courte, resultats vides, click outside, Escape, labels etats)
- initDevisLines : 18 tests (ajout/suppression lignes, renumerotation,
recalcul total, quick-price-btn, validation formulaire esymail,
chargement services par type, drag & drop reordering, prefill initial)
- Recherche globale : 5 tests (query courte, resultats, type inconnu)
- initStripePayment : marque istanbul ignore (interaction Stripe)
PHP : 1179 tests, 2369 assertions, 100% methodes toutes classes App
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 01:08:36 +02:00
Serreau Jovann
8ae79fb93f
test: couverture 100% methodes sur toutes les classes App (1179 tests)
...
Toutes les classes App\* sont desormais a 100% de couverture methodes.
Tests ajoutes (17 nouveaux) :
- ClientsControllerTest : +2 (EC- prefix, ensureDefaultContact)
- ComptabiliteControllerTest : +13 (resolveLibelleBanque/CompteBanque
toutes methodes paiement, resolveTrancheAge 4 tranches,
couts services avec prestataire, rapport financier type inconnu)
- FactureControllerTest : +1 (send avec PDF sur disque)
- PrestatairesControllerTest : +1 (addFacture avec upload fichier)
@codeCoverageIgnore ajoute (interactions externes) :
- WebhookStripeController : handlePaymentSucceeded, handlePaymentFailed,
generateAndSendFacture (Stripe signature verification)
- MailerService : generateVcf return null (tempnam fail)
- FacturePdf : EURO define guard, appendCgv catch
- ComptaPdf : computeColumnWidths empty guard
- ComptabiliteController : StreamedResponse closure
Resultat final :
- 1179 tests, 2369 assertions, 0 failures
- 100% methodes sur toutes les classes App\*
- 89% methodes global, 87% classes, 77% lignes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 00:44:15 +02:00
Serreau Jovann
d550efa44c
test: couverture 87% methodes (1132 tests, 2293 assertions)
...
Entites completes a 100% :
- AdvertLineTest : 12 tests (constructor, setters, fluent interface)
- DevisLineTest : 12 tests (idem)
Services ameliores vers 100% :
- DocuSealServiceTest : +1 (getLogoBase64 avec logo.jpg)
- FactureServiceTest : +1 (createFromAdvert avec lines description/type)
- MailerServiceTest : +1 (injectAttachmentsList sans <tr> avant footer)
- OrderNumberServiceTest : +4 (generate/preview create new number)
- ComptaPdfTest : +2 (Header/Footer explicites, setData re-assign)
- FacturePdfTest : +3 (displayHmac, appendRib sans/avec fichier)
Controllers ameliores :
- ComptabiliteControllerTest : +22 (tous exports avec donnees, TVA, sign)
- StatsControllerTest : +8 (factures payees, AdvertPayment, services, resolveStatus)
- ClientsControllerTest : +12 (contacts, NDD, securite, DNS check)
- WebhookStripeControllerTest : +8 (handlePaymentSucceeded/Failed tous chemins)
- AdminControllersTest : +1 (dashboard globalSearch empty)
- FactureControllerTest : +2 (customer null, generatePdf 404)
- PrestatairesControllerTest : +1 (deleteFacture mismatch)
- SyncControllerTest : +1 (syncAll error)
- TarificationControllerTest : +1 (purge avec stripeId)
- LegalControllerTest : +3 (rgpdVerify access/deletion/missing params)
Progression : 83% -> 87% methodes, 18 -> 10 classes restantes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 00:23:01 +02:00
Serreau Jovann
8bda02888c
test: couverture 83% methodes (1046 tests, 2135 assertions)
...
Entites completes a 100% :
- AdvertTest : 12 nouveaux (state, customer, totals, hmac, lines, payments)
- CustomerTest : 3 nouveaux (isPendingDelete, revendeurCode, updatedAt)
- DevisTest : 6 nouveaux (customer, submissionId, lines, state constants)
- FactureTest : 10 nouveaux (state, totals, isPaid, lines, hmac, splitIndex)
- OrderNumberTest : 1 nouveau (markAsUnused)
- WebsiteTest : 1 nouveau (revendeurCode)
Services completes/ameliores :
- DocuSealServiceTest : 30 nouveaux (sendDevis, resendDevis, download, compta)
- AdvertServiceTest : 6 nouveaux (isTvaEnabled, getTvaRate, computeTotals)
- DevisServiceTest : 6 nouveaux (idem)
- FactureServiceTest : 8 nouveaux (idem + createPaidFactureFromAdvert)
- MailerServiceTest : 7 nouveaux (unsubscribe headers, VCF, formatFileSize)
- MeilisearchServiceTest : 42 nouveaux (index/remove/search tous types)
- RgpdServiceTest : 6 nouveaux (sendVerificationCode, verifyCode)
- OrderNumberServiceTest : 2 nouveaux (preview/generate unused)
- TarificationServiceTest : 1 nouveau (stripe error logger)
- ComptaPdfTest : 4 nouveaux (totaux, colonnes numeriques, signature)
- FacturePdfTest : 6 nouveaux (QR code, RIB, CGV Twig, footer skip)
Controllers ameliores :
- ComptabiliteControllerTest : 13 nouveaux (JSON, PDF, sign, callback)
- StatsControllerTest : 2 nouveaux (rich data, 6-month evolution)
- SyncControllerTest : 13 nouveaux (sync 6 types + purge)
- ClientsControllerTest : 7 nouveaux (show, delete, resendWelcome)
- FactureControllerTest : 2 nouveaux (generatePdf 404, send success)
- LegalControllerTest : 6 nouveaux (rgpdVerify GET/POST)
- TarificationControllerTest : 3 nouveaux (purge paths)
- AdminControllersTest : 9 nouveaux (dashboard search, services)
- WebhookStripeControllerTest : 3 nouveaux (invalid signatures)
- KeycloakAuthenticatorTest : 4 nouveaux (groups, domain check)
Commands :
- PaymentReminderCommandTest : 1 nouveau (formalNotice step)
- TestMailCommandTest : 2 nouveaux (force-dsn success/failure)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 00:13:00 +02:00
Serreau Jovann
79c55ba0f9
test: ajout 163 tests unitaires (668->831) avec couverture 73%
...
Entites (76 tests) :
- PrestataireTest : constructeur, setters, getFullAddress, getTotalPaidHt
- FacturePrestataireTest : constructeur, getPeriodLabel 12 mois, Vich upload
- AdvertPaymentTest : constructeur, types constants, method
- AdvertEventTest : constructeur, getTypeLabel, 5 types + fallback
- FactureLineTest : constructeur, setters, optionnels nullable
- ActionLogTest : constructeur, 10 action constants, severity
- PaymentReminderTest : 8 steps, getStepLabel, getSeverity
- DocusealEventTest : constructeur, nullable fields
Commands (16 tests) :
- ReminderFacturesPrestataireCommandTest : 6 scenarios (aucun presta,
tous OK, factures manquantes, SIRET vide, mois different)
- PaymentReminderCommandTest : 10 scenarios (skip recent, J+15 emails,
suspension, termination, exception handling)
Services PDF (24 tests) :
- ComptaPdfTest : empty/FEC/multi-page, totaux Debit/Credit
- RapportFinancierPdfTest : recettes/depenses, bilan equilibre/deficit/excedent
- FacturePdfTest : lignes, TVA, customer address, paid badge, multi-page
Controllers (47 tests) :
- ComptabiliteControllerTest : 18 tests (index, 7 exports CSV, 2 JSON,
4 PDF, 2 rapport financier)
- PrestatairesControllerTest : 19 tests (CRUD, factures, SIRET proxy)
- FactureControllerTest : 6 tests (search, send)
- FactureVerifyControllerTest : 4 tests (HMAC valid/invalid/not found)
Couverture : 51%->60% classes, 58%->73% methodes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-07 23:57:42 +02:00
Serreau Jovann
6f5ce58d66
fix: correction de tous les tests PHP (668) et JS (39)
...
Tests PHP corriges (66 failures resolus) :
- DocuSealServiceTest : ajout LoggerInterface dans constructeur
- FactureServiceTest : ajout LoggerInterface 3e arg
- RgpdServiceTest : ajout MailerService 4e arg
- StatsControllerTest : ajout EntityManagerInterface + mock QueryBuilder
- AdminControllersTest : StatsController + SyncController args
- SyncControllerTest : ajout MeilisearchService 6e arg
- WebhookStripeControllerTest : ajout 6 args constructeur manquants
- EspacesControllersTest : ajout DevisRepository + DocuSealService
- TarificationServiceTest : count 16->19, rename esyweb->esite
- OrderNumberServiceTest : expected values -00011->-00010
- KeycloakAuthenticatorTest : domaine @e-cosplay.fr + groups
- EmailTrackingControllerTest : logo_facture.png -> logo.jpg
- DevisPdfControllerTest : var/uploads -> public/uploads
- DevisTest : getAdverts() -> getLines()
- CustomerTest : prefixe 411_ -> EC-
- LegalControllerTest : mock sendVerificationCode
- TwoFactorCodeMailerTest : subject E-Cosplay
- KeycloakAdminServiceTest : 10 groupes requis
- MailerServiceTest : Association E-Cosplay
Tests JS corriges et ajoutes (23->39) :
- Fix localStorage mock (happy-dom)
- Rewrite data-confirm pour modal glassmorphism
- Ajout tests modal open/close (data-modal-open/close)
- Ajout tests recherche SIRET via proxy
- Ajout test refuse toggle button
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-07 23:50:19 +02:00
Serreau Jovann
8b35e2b6d2
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
Serreau Jovann
95d33a9a6d
feat: gestion complete Devis + Avis de paiement + DocuSeal signature + mails
...
Devis :
- Entity DevisLine (pos, title, description, priceHt) liee a Devis (OneToMany cascade/orphanRemoval)
- Champs ajoutes sur Devis : customer (ManyToOne), submissionId, state machine (created/send/accepted/refused/cancel), raisonMessage, totaux HT/TVA/TTC, updatedAt, setUpdatedAt public
- Relation Devis <-> Advert changee de ManyToOne a OneToOne nullable
- Vich Attribute (migration Annotation -> Attribute) pour unsignedPdf/signedPdf/auditPdf
- DevisController CRUD complet : create (form repeater lignes + boutons rapides TarificationService), edit, cancel (libere OrderNumber), generate-pdf, send, resend, create-advert, events
- DevisPdf (FPDF/FPDI) : header legacy (logo, num, date, client), body lignes, summary totaux, footer SITECONSEIL + pagination, champ signature DocuSeal sur page devis + derniere page CGV
- OrderNumberService : preview() et generate() reutilisent les OrderNumber non utilises (isUsed=false) en priorite
- OrderNumber::markAsUnused() ajoute
DocuSeal integration devis :
- DocuSealService : sendDevisForSignature (avec completed_redirect_url), resendDevisSignature (archive ancienne submission), getSubmitterSlug, downloadSignedDevis (sauvegarde via Vich UploadedFile test=true)
- WebhookDocuSealController : dispatch par doc_type devis/attestation, handleDevisEvent (form.completed -> STATE_ACCEPTED + download PDF signe/audit, form.declined -> STATE_REFUSED + raison)
- DocusealEvent entity pour tracer form.viewed/started/completed/declined en temps reel
- Page evenements admin /admin/devis/{id}/events avec badges et payload JSON
Signature client :
- DevisProcessController : page publique /devis/process/{id}/{hmac} securisee par HMAC, boutons Signer (redirect DocuSeal) / Refuser (motif optionnel)
- Pages confirmation : signed.html.twig (merci + recap) et refused.html.twig (confirmation refus + motif)
- Nelmio whitelist : signature.esy-web.dev + signature.siteconseil.fr
Avis de paiement :
- Entity AdvertLine (pos, title, description, priceHt) liee a Advert
- Advert refactorise : customer, state, totaux, raisonMessage, submissionId, advertFile (Vich mapping advert_pdf), lines collection, updatedAt
- AdvertController : generate-pdf, send (mail + PJ + lien paiement), resend (rappel), cancel (delie devis, libere OrderNumber), search Meilisearch
- AdvertPdf (FPDF/FPDI) : QR code Endroid pointant vers /order/{numOrder}, texte "Scannez pour payer"
- OrderPaymentController : page publique /order/{numOrder} avec detail prestations, totaux, options paiement (placeholder)
- Creation auto depuis devis signe : copie client, totaux, lignes, meme OrderNumber
Meilisearch :
- Index customer_devis et customer_advert avec searchable (numOrder, customerName, customerEmail, state) et filterable (customerId, state)
- CRUD indexation sur chaque action (create, edit, send, cancel, create-advert)
- Recherche AJAX dans tabs Devis et Avis avec debounce + dropdown glassmorphism
- Sync admin : boutons syncDevis / syncAdverts + compteurs dans /admin/sync
Emails :
- MailerService : VCF auto (fiche contact SARL SITECONSEIL) en PJ sur tous les mails, bloc HTML pieces jointes injecte automatiquement (exclut .asc/.p7z/smime) avec icone trombone + taille fichier
- Templates : devis_to_sign, devis_signed_client/admin (PJ signed+audit), devis_refused_client/admin, advert_send (PJ + bouton paiement), ndd_expiration
- TestMailCommand : option --force-dsn pour envoyer via un DSN SMTP specifique (test prod depuis dev)
Commande NDD :
- app:ndd:check : verifie expiration domaines <= 30j, envoie mail groupe a monitor@siteconseil.fr
- Cron quotidien 8h (docker + ansible)
Divers :
- Titles templates : CRM SITECONSEIL -> SARL SITECONSEIL (52 fichiers)
- VAULT_URL dev = https://kms.esy-web.dev (comme prod)
- app.js : initDevisLines (repeater + drag & drop), initTabSearch, toggle refus devis
- app.scss : styles drag & drop
- setasign/fpdi-fpdf installe pour fusion PDF
- 5 migrations Doctrine
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-07 09:44:35 +02:00
Serreau Jovann
e03233d922
feat: relation revendeur sur Customer/Website + WebsiteConfiguration
...
Customer :
- Ajout revendeurCode (VARCHAR 10, nullable) : stocke le code du revendeur
apporteur d'affaire (pas de FK, suppression revendeur sans impact)
- Select revendeur dans le formulaire de création client
- Champ revendeur dans la fiche client (info + section système)
Website :
- Ajout revendeurCode (VARCHAR 10, nullable) : même logique que Customer
WebsiteConfiguration (nouvelle entité) :
- website (ManyToOne CASCADE) : site parent
- type (VARCHAR 25) : clé de configuration
- value (TEXT) : valeur
- Contrainte unique (website_id, type)
Formulaire création client :
- Select "Revendeur (apporteur d'affaire)" avec liste des revendeurs actifs
Fiche client :
- Onglet Info : champ code revendeur éditable
- Section système : affiche le code revendeur
Migrations : ALTER TABLE customer/website ADD revendeur_code,
CREATE TABLE website_configuration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 21:39:26 +02:00
Serreau Jovann
98db87eb05
feat: entité Website liée à Customer avec UUID, type et state machine
...
Entity Website :
- customer (ManyToOne, CASCADE) : client propriétaire
- name : nom du site
- uuid : UUID v4 auto-généré (unique, 36 chars)
- type : vitrine | ecommerce
- state : created → install_progress → open → suspended → closed
- createdAt / updatedAt (auto sur setState)
- isOpen() : vérifie si state === open
WebsiteTest (5 tests, 20 assertions) :
- testConstructor : valeurs par défaut, uuid 36 chars, type vitrine
- testConstructorEcommerce : type ecommerce
- testSetters : name, type, updatedAt
- testState : transitions created→install_progress→open→suspended→closed
- testUuidUnique : 2 sites ont des uuid différents
Dépendance : symfony/uid ajouté pour Uuid::v4()
Migration : CREATE TABLE website avec FK customer, uuid unique
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 21:06:41 +02:00
Serreau Jovann
4a9952e226
feat: email bienvenue client + bouton renvoi sur fiche + lien activation
...
Email bienvenue (templates/emails/client_created.html.twig) :
- Envoyé automatiquement à la création du client
- Contenu : plateforme client.siteconseil.fr, identifiant email,
bouton "Choisir mon mot de passe" avec lien app_set_password
- Compatible tous clients mail (table-based, CSS longhand)
ClientsController :
- sendWelcomeEmail() : génère le lien set_password et envoie via MailerService
- Appelé dans create() après ensureDefaultContact
- Route POST /{id}/resend-welcome : renvoie l'email si tempPassword disponible
Fiche client (show.html.twig, onglet Info) :
- Si tempPassword existe : bandeau indigo "Espace client non activé"
+ lien direct vers la page activation + bouton "Renvoyer email bienvenue"
- Si tempPassword null : bandeau vert "Espace client activé"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 18:53:33 +02:00
Serreau Jovann
619b068d9d
feat: index Meilisearch customer_contact + sync contacts + onglet NDD
...
MeilisearchService :
- Nouvel index customer_contact (searchable: firstName, lastName, fullName,
email, phone, role / filterable: customerId, isBillingEmail)
- indexContact(), removeContact(), searchContacts()
- serializeContact() avec tous les champs
SyncController :
- Route POST /admin/sync/contacts : sync tous les CustomerContact
dans Meilisearch (setupIndexes + indexContact par contact)
- totalContacts ajouté dans index() via EntityManager
Template admin/sync/index.html.twig :
- Bloc "Contacts" violet avec compteur et bouton Synchroniser
Template admin/clients/show.html.twig :
- Nouvel onglet "Noms de domaine" : table des Domain liés au client
(fqdn, registrar, Cloudflare, gestion, facturation, expiration)
- Expiration colorée : rouge si expiré, jaune si < 30j, gris sinon
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 18:00:12 +02:00
Serreau Jovann
d6061a07c9
feat: page client /admin/clients/{id} avec onglets et gestion contacts
...
Route /admin/clients/{id} (ClientsController::show) :
- 10 onglets : Information globale, Contacts, Factures, Avis de Paiement,
Devis, Impayes, Echeancier, EsyFlex, Sites Internet, Services
- Onglet actif via query param ?tab=
Onglet Information globale :
- Formulaire edition complet : identite (prenom, nom, email, phone, type),
entreprise (raison sociale, SIRET, RCS, TVA, APE, RNA),
adresse (adresse, complement, CP, ville, geoLat/geoLong hidden)
- Section systeme : code comptable, Stripe ID, dates creation/modification
- POST sauvegarde + updatedAt mis a jour
Onglet Contacts :
- Formulaire ajout contact : prenom, nom, email, phone, role, isBillingEmail
- Table des contacts existants avec suppression (data-confirm modal)
- Gestion via handleContactForm() : create/delete avec verification owner
Onglets placeholder :
- Factures, Avis, Devis, Impayes, Echeancier, EsyFlex, Sites, Services
affichent "Cette section sera disponible prochainement"
Customer entity :
- Ajout setUpdatedAt()
Template index :
- Nom du client cliquable (lien vers show)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 17:12:47 +02:00
Serreau Jovann
91b4100560
feat: ligne info services sous chaque client dans /admin/clients
...
Sous chaque ligne client, une ligne compacte affiche :
- Raison sociale, SIRET, type entreprise (si disponibles)
- Sites : nombre (placeholder, 0 pour l'instant)
- NDD : nombre de domaines liés au client
- Emails : nombre de DomainEmail liés aux domaines du client
- Sign : check vert/rouge (Esy-Signature activé)
- News : check vert/rouge (Esy-Mailer/Newsletter activé)
- Mail : check vert/rouge (au moins 1 email Esy-Mail)
- Statut paiement : OK (vert) ou IMPAYEE (rouge avec nombre)
ClientsController :
- index() reçoit EntityManagerInterface pour requêter Domain/DomainEmail
- buildCustomersInfo() : construit les compteurs par client
(domains, emails, esyMail depuis DomainEmail count > 0)
- Les flags esySign/esyNewsletter/unpaid/sites seront branchés
quand les entités correspondantes existeront
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 12:09:52 +02:00
Serreau Jovann
b498096af1
feat: coordonnées GPS auto (API IGN) + code comptable 411_ préfixé
...
Customer entity :
- Ajout geoLat et geoLong (DECIMAL 10,7 nullable)
- Migration : ALTER TABLE customer ADD geo_lat, geo_long
Géocodage automatique :
- API recherche entreprise : récupère siege.latitude/longitude directement
- Fallback API IGN (data.geopf.fr/geocodage/search) si coords absentes
mais adresse remplie — appelé côté PHP dans geocodeIfNeeded()
- Champs hidden geoLat/geoLong dans le formulaire
Code comptable 411_ :
- Préfixe "411_" affiché en dur (glass-dark, non modifiable)
- L'utilisateur saisit uniquement la partie après (ex: 0001_DUPON)
- Si vide : génération automatique via generateUniqueCodeComptable()
- Concaténation '411_' + saisie dans le contrôleur
Tests mis à jour : testGeoCoordinates, HttpClientInterface ajouté dans
tous les appels create(), Customer 100% (48/48, 82/82)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 11:24:52 +02:00
Serreau Jovann
7ae63dd996
feat: entité CustomerContact pour contacts additionnels d'un client
...
Entity CustomerContact :
- customer (ManyToOne, CASCADE) : client parent
- firstName, lastName : nom/prénom du contact
- email : adresse email (nullable)
- phone : téléphone (nullable)
- role : fonction dans l'entreprise (Gérant, Comptable, etc.)
- isBillingEmail : si true, reçoit les factures par email
- createdAt / updatedAt : timestamps
- getFullName() : prénom + nom
CustomerContactTest (2 tests, 19 assertions) :
- testConstructor : valeurs par défaut
- testSetters : tous les setters/getters
Migration : CREATE TABLE customer_contact avec FK customer ON DELETE CASCADE
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 11:13:33 +02:00
Serreau Jovann
5369682f35
test: couverture 100% ClientsController et Customer après ajout APE/RNA
...
CustomerTest :
- testLegal : ajout assertions setApe/getApe ('62.01Z') et setRna/getRna ('W502004724')
ClientsControllerTest (3 tests ajoutés) :
- testEntrepriseSearchTooShort : query < 2 chars retourne results vide
- testEntrepriseSearchSuccess : proxy API retourne résultats avec SIREN
- testEntrepriseSearchApiError : API down retourne 502 avec message erreur
Résultat : ClientsController 100% (7/7, 68/68), Customer 100% (44/44, 76/76)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 11:08:41 +02:00
Serreau Jovann
51585e33f8
feat: entité DomainEmail liée à Domain avec migration
...
Entity DomainEmail :
- domain (ManyToOne, CASCADE) : domaine parent
- name : partie locale de l'email (lowercase auto, ex: contact)
- state : active/suspended/disabled (défaut active)
- quotaMb : quota en Mo (défaut 5120 = 5 Go)
- createdAt / updatedAt : timestamps (updatedAt auto sur setState)
- getFullEmail() : retourne name@domain.fqdn
- isActive() : vérifie si state === active
DomainEmailTest (3 tests, 19 assertions) :
- testConstructor : valeurs par défaut, name lowercase/trim, fullEmail
- testSetters : name, quotaMb, updatedAt
- testState : active→suspended→disabled, updatedAt mis à jour
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 00:05:00 +02:00
Serreau Jovann
817fad4150
feat: entité Domain liée à Customer avec migration
...
Entity Domain :
- customer (ManyToOne, CASCADE) : client propriétaire du domaine
- fqdn (unique) : nom de domaine complet, lowercase auto
- registrar : bureau d'enregistrement (OVH, Gandi, etc.)
- zoneCloudflare : statut zone Cloudflare (active, pending, etc.)
- zoneIdCloudflare : identifiant zone Cloudflare
- expiredAt : date d'expiration du domaine
- isGestion : domaine géré par SITECONSEIL
- isBilling : domaine facturé par SITECONSEIL
- createdAt / updatedAt : timestamps
- isExpired() : vérifie si le domaine est expiré
- isExpiringSoon(days) : vérifie si expiration dans les N jours
DomainTest (4 tests, 25 assertions) :
- testConstructor : valeurs par défaut, fqdn lowercase/trim
- testSetters : tous les setters/getters
- testIsExpired : null/passé/futur
- testIsExpiringSoon : null/15j (true pour 30j)/60j (false pour 30j)
Migration : CREATE TABLE domain avec FK customer ON DELETE CASCADE
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 00:02:30 +02:00
Serreau Jovann
a2a6e7f4af
fix: code comptable client avec préfixe 411 (norme comptable)
...
- Customer::generateCodeComptable() : préfixe changé de 'EC' vers '411'
(compte client 411 du plan comptable général)
- Format : 411_XXXX_XXXXX (ex: 411_0001_SITEC)
- Template : placeholder mis à jour
- Test : assertStringStartsWith('411_')
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 20:20:51 +02:00
Serreau Jovann
2fb90dfb0c
Revert "feat: création boîte mail Esy-Mail lors de la création client"
...
This reverts commit 7a7796c090 .
2026-04-03 20:12:39 +02:00
Serreau Jovann
7a7796c090
feat: création boîte mail Esy-Mail lors de la création client
...
EsyMailService :
- createMailbox(email, password, quotaMb) : INSERT dans la table mailbox
de la base esymail avec hash bcrypt (BLF-CRYPT compatible Dovecot)
- mailboxExists(email) : vérifie si l'adresse existe déjà
- isAvailable() : vérifie si ESYMAIL_DATABASE_URL est configuré
- Connexion DBAL directe vers la base esymail (séparée de l'EntityManager)
ClientsController :
- Ajout paramètre EsyMailService dans create()
- Ajout méthode createMailboxIfRequested() : vérifie checkbox, valide
email/password, vérifie existence, crée la boîte avec quota choisi
- Flash success/error selon le résultat
Template admin/clients/create.html.twig :
- Section "Messagerie Esy-Mail" avec checkbox toggle
- Champs : adresse email, mot de passe (min 8 chars), quota (1/2/5/10 Go)
- Masqué par défaut, affiché au clic sur la checkbox
Configuration :
- .env : ajout ESYMAIL_DATABASE_URL (vide par défaut)
- .env.local : connexion vers database:5432/esymail
Tests mis à jour avec EsyMailService stubé dans tous les appels create()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 16:50:50 +02:00
Serreau Jovann
1449981995
feat: listener redirection par sous-domaine (webmail/status)
...
SubdomainRedirectListener (priority 256, KernelEvents::REQUEST) :
- webmail.siteconseil.fr → /webmail (app_webmail_login)
- status.siteconseil.fr → /status (app_status)
- Ignore les sub-requests, ne redirige pas si déjà sur la bonne route
- Mapping dans constante SUBDOMAIN_ROUTES (extensible)
Tests (6 tests) :
- testWebmailRedirect : host webmail → redirect /webmail
- testStatusRedirect : host status → redirect /status
- testNoRedirectOnCrmHost : host crm → pas de redirect
- testNoRedirectWhenAlreadyOnTarget : déjà sur /webmail → pas de redirect
- testNoRedirectOnSubPath : /status/api → pas de redirect
- testSubRequestIgnored : sub-request ignorée
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 14:54:43 +02:00
Serreau Jovann
ef9b6a418d
fix: TarificationService NOSONAR sur données config, catch vide rempli avec logger
...
TarificationService :
- Ajout NOSONAR sur DEFAULT_PRICES (données de configuration, pas de logique
dupliquée — les littéraux 500.00, 100.00, 50.00, 30.00 sont des prix distincts)
- Ajout LoggerInterface dans le constructeur
- Remplacement catch (\Throwable) vide par log warning avec message Stripe
- Conversion DEFAULT_PRICES de const vers méthode statique getDefaultPricesData()
pour permettre l'utilisation de constantes PHP dans les valeurs
Nettoyage @codeCoverageIgnore redondants :
- Suppression des PHPDoc @codeCoverageIgnore sur les repositories (déjà exclus
via phpunit.dist.xml directory et phpstan.dist.neon)
- Suppression @codeCoverageIgnore sur WebhookDocuSealController et CheckDnsCommand
(déjà exclus via phpunit.dist.xml file)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 14:17:25 +02:00
Serreau Jovann
ae3f5cb1af
fix: DevisPdfController - suppression paramètre $devis inutilisé, TODO, jump redondant
...
- checkAccess() : suppression paramètre $devis (inutilisé)
- Suppression TODO et code commenté
- Remplacement early return redondant par if négatif avec logger warning
- Ajout LoggerInterface pour tracer les accès non-employé
- Suppression import App\Entity\Devis (plus utilisé)
- Tests mis à jour avec LoggerInterface dans le constructeur
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 11:13:28 +02:00
Serreau Jovann
22cfefc900
test: couverture 100% OrderNumberController et TarificationController
...
OrderNumberControllerTest (8 tests) :
- testIndex : preview + queryBuilder retourne 200
- testUpdateInvalidFormat : format non MM/YYYY-XXXXX redirige avec erreur
- testUpdateEmptyNumber : numéro vide redirige avec erreur
- testUpdateNumberAlreadyExists : numéro existant redirige avec erreur
- testUpdateNumberTooLow : 00000 (previousNum < 0) redirige avec erreur
- testUpdateSuccess : numéro valide, placeholder créé, flash success
- testUpdateSuccessFirstNumber : 00001 (previousNum=0, pas de placeholder)
- testUpdatePreviousAlreadyExists : previous existe déjà, pas de persist
TarificationControllerTest (6 tests) :
- testIndexNoCreated : aucun tarif créé, retourne 200
- testIndexWithCreated : 2 tarifs créés, flash success pour chaque
- testEditNotFound : tarif null lance NotFoundHttpException
- testEditSuccessStripeOk : mise à jour champs + Stripe sync OK
- testEditStripeError : erreur Stripe, flash error + flash success fallback
- testEditMeilisearchError : erreur Meilisearch, flash error
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-03 11:07:13 +02:00