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>
This commit is contained in:
Serreau Jovann
2026-04-08 08:41:08 +02:00
parent 0eeab97344
commit 4f0d3d969a
54 changed files with 219 additions and 171 deletions

View File

@@ -145,7 +145,9 @@ document.addEventListener('DOMContentLoaded', () => {
const renderHit = (h, linkPrefix) => {
const id = h.customerId || h.id;
const name = h.fqdn || h.name || h.fullName || h.raisonSociale || (h.firstName + ' ' + h.lastName);
const sub = h.customerName ? `<span class="text-gray-400 ml-2">${h.customerName}</span>` : (h.email ? `<span class="text-gray-400 ml-2">${h.email}</span>` : '');
let sub = '';
if (h.customerName) sub = `<span class="text-gray-400 ml-2">${h.customerName}</span>`;
else if (h.email) sub = `<span class="text-gray-400 ml-2">${h.email}</span>`;
return `<a href="${linkPrefix}${id}" class="block px-4 py-2 hover:bg-gray-50 border-b border-gray-100 text-xs">
<span class="font-bold">${name}</span>
${sub}
@@ -310,61 +312,66 @@ document.addEventListener('DOMContentLoaded', () => {
const siretSearchBtn = document.getElementById('siret-search-btn');
const siretInput = document.getElementById('siret-search-input');
const siretResults = document.getElementById('siret-search-results');
if (siretSearchBtn && siretInput && siretResults) {
siretSearchBtn.addEventListener('click', () => {
const q = siretInput.value.trim();
if (q.length < 3) { siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Saisissez au moins 3 caracteres.</p>'; siretResults.classList.remove('hidden'); return; }
siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Recherche...</p>';
siretResults.classList.remove('hidden');
const renderSiretResult = (r) => {
const siege = r.siege || {};
const siret = siege.siret || '';
const nom = r.nom_complet || r.nom_raison_sociale || '';
const adresse = siege.adresse || '';
const cp = siege.code_postal || '';
const ville = siege.libelle_commune || '';
return '<button type="button" class="siret-result-item block w-full text-left px-3 py-2 hover:bg-white/70 border-b border-white/20 transition-all"'
+ ' data-nom="' + nom.replaceAll('"', '&quot;') + '"'
+ ' data-siret="' + siret + '"'
+ ' data-adresse="' + adresse.replaceAll('"', '&quot;') + '"'
+ ' data-cp="' + cp + '"'
+ ' data-ville="' + ville.replaceAll('"', '&quot;') + '">'
+ '<span class="font-bold text-xs">' + nom + '</span>'
+ '<span class="text-[10px] text-gray-400 ml-2">' + siret + '</span>'
+ '<br><span class="text-[10px] text-gray-400">' + adresse + ' ' + cp + ' ' + ville + '</span>'
+ '</button>';
};
fetch('/admin/prestataires/entreprise-search?q=' + encodeURIComponent(q))
.then(r => r.json())
.then(data => {
const results = data.results || [];
if (results.length === 0) {
siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Aucun resultat.</p>';
return;
}
siretResults.innerHTML = results.map(r => {
const siege = r.siege || {};
const siret = siege.siret || '';
const nom = r.nom_complet || r.nom_raison_sociale || '';
const adresse = siege.adresse || '';
const cp = siege.code_postal || '';
const ville = siege.libelle_commune || '';
return '<button type="button" class="siret-result-item block w-full text-left px-3 py-2 hover:bg-white/70 border-b border-white/20 transition-all"'
+ ' data-nom="' + nom.replace(/"/g, '&quot;') + '"'
+ ' data-siret="' + siret + '"'
+ ' data-adresse="' + adresse.replace(/"/g, '&quot;') + '"'
+ ' data-cp="' + cp + '"'
+ ' data-ville="' + ville.replace(/"/g, '&quot;') + '">'
+ '<span class="font-bold text-xs">' + nom + '</span>'
+ '<span class="text-[10px] text-gray-400 ml-2">' + siret + '</span>'
+ '<br><span class="text-[10px] text-gray-400">' + adresse + ' ' + cp + ' ' + ville + '</span>'
+ '</button>';
}).join('');
siretResults.querySelectorAll('.siret-result-item').forEach(item => {
item.addEventListener('click', () => {
const form = siretSearchBtn.closest('form');
if (!form) return;
const set = (name, val) => { const el = form.querySelector('[name="' + name + '"]'); if (el) el.value = val; };
set('raisonSociale', item.dataset.nom);
set('siret', item.dataset.siret);
set('address', item.dataset.adresse);
set('zipCode', item.dataset.cp);
set('city', item.dataset.ville);
siretResults.classList.add('hidden');
siretInput.value = '';
});
});
})
.catch(() => {
siretResults.innerHTML = '<p class="text-xs text-red-500 p-2">Erreur lors de la recherche.</p>';
});
const bindSiretResultClick = (item) => {
item.addEventListener('click', () => {
const form = siretSearchBtn.closest('form');
if (!form) return;
const set = (name, val) => { const el = form.querySelector('[name="' + name + '"]'); if (el) el.value = val; };
set('raisonSociale', item.dataset.nom);
set('siret', item.dataset.siret);
set('address', item.dataset.adresse);
set('zipCode', item.dataset.cp);
set('city', item.dataset.ville);
siretResults.classList.add('hidden');
siretInput.value = '';
});
};
const handleSiretSearch = () => {
const q = siretInput.value.trim();
if (q.length < 3) { siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Saisissez au moins 3 caracteres.</p>'; siretResults.classList.remove('hidden'); return; }
siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Recherche...</p>';
siretResults.classList.remove('hidden');
fetch('/admin/prestataires/entreprise-search?q=' + encodeURIComponent(q))
.then(r => r.json())
.then(data => {
const results = data.results || [];
if (results.length === 0) {
siretResults.innerHTML = '<p class="text-xs text-gray-400 p-2">Aucun resultat.</p>';
return;
}
siretResults.innerHTML = results.map(renderSiretResult).join('');
siretResults.querySelectorAll('.siret-result-item').forEach(bindSiretResultClick);
})
.catch(() => {
siretResults.innerHTML = '<p class="text-xs text-red-500 p-2">Erreur lors de la recherche.</p>';
});
};
if (siretSearchBtn && siretInput && siretResults) {
siretSearchBtn.addEventListener('click', handleSiretSearch);
siretInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); siretSearchBtn.click(); } });
document.addEventListener('click', (e) => { if (!siretResults.contains(e.target) && e.target !== siretInput && e.target !== siretSearchBtn) siretResults.classList.add('hidden'); });
}
@@ -585,7 +592,7 @@ function initDevisLines() {
let total = 0;
container.querySelectorAll('.line-price').forEach(input => {
const v = parseFloat(input.value);
if (!isNaN(v)) total += v;
if (!Number.isNaN(v)) total += v;
});
totalEl.textContent = total.toFixed(2) + ' EUR';
}
@@ -654,7 +661,7 @@ function initDevisLines() {
if (!type || type === 'hosting' || type === 'maintenance' || type === 'other') return;
const url = select.dataset.servicesUrl.replace('__TYPE__', type);
const url = select.dataset.servicesUrl.replaceAll('__TYPE__', type);
try {
const resp = await fetch(url);
const items = await resp.json();

View File

@@ -6,7 +6,7 @@ const API_URL = '/admin/clients/entreprise-search'
const computeTva = (siren) => {
if (!siren) return ''
const key = (12 + 3 * (parseInt(siren, 10) % 97)) % 97
const key = (12 + 3 * (Number.parseInt(siren, 10) % 97)) % 97
return 'FR' + String(key).padStart(2, '0') + siren
}