/** * Recherche entreprise via API data.gouv.fr * Auto-remplissage du formulaire de création client */ const API_URL = '/admin/clients/entreprise-search' const computeTva = (siren) => { if (!siren) return '' const key = (12 + 3 * (parseInt(siren, 10) % 97)) % 97 return 'FR' + String(key).padStart(2, '0') + siren } const capitalize = (s) => s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : '' const fillField = (id, value) => { const el = document.getElementById(id) if (el) el.value = value } const fillFieldIfEmpty = (id, value) => { const el = document.getElementById(id) if (el && !el.value && value) el.value = value } const buildRcs = (siren, city) => { if (!siren || !city) return '' return 'RCS ' + capitalize(city) + ' ' + siren } const resolveTypeCompany = (natureJuridique) => { if (!natureJuridique) return '' const code = String(natureJuridique) if (code.startsWith('92') || code.startsWith('91') || code.startsWith('93')) return 'association' if (code.startsWith('10')) return 'auto-entrepreneur' if (code.startsWith('54') || code.startsWith('55')) return 'sarl' if (code.startsWith('57')) return 'sas' if (code.startsWith('52')) return 'eurl' if (code.startsWith('55') && code === '5599') return 'sa' if (code.startsWith('65')) return 'sci' return '' } const renderResult = (e, onSelect) => { const s = e.siege || {} const d = (e.dirigeants && e.dirigeants[0]) || {} const actif = e.etat_administratif === 'A' const addr = [s.numero_voie, s.type_voie, s.libelle_voie].filter(Boolean).join(' ') const ape = e.activite_principale || '' const rna = (e.complements && e.complements.identifiant_association) || '' const isAsso = resolveTypeCompany(e.nature_juridique) === 'association' const div = document.createElement('div') div.className = 'glass p-4 cursor-pointer hover:bg-white/80 transition-all' div.innerHTML = `
${e.nom_complet || e.nom_raison_sociale || 'N/A'}
SIREN ${e.siren || '?'} ${s.siret ? ' — SIRET ' + s.siret + '' : ''} ${ape ? ' — APE ' + ape + '' : ''} ${rna ? ' — RNA ' + rna + '' : ''}
${s.geo_adresse || s.adresse || ''}
${d.nom ? '
Dirigeant : ' + (d.prenoms || '') + ' ' + d.nom + '
' : ''} ${isAsso ? '
Association
' : ''}
${actif ? 'Actif' : 'Ferme'}
` div.addEventListener('click', () => { fillField('raisonSociale', e.nom_raison_sociale || e.nom_complet || '') fillField('siret', s.siret || '') fillField('rcs', buildRcs(e.siren, s.libelle_commune)) fillField('numTva', computeTva(e.siren)) fillField('ape', ape) fillField('address', addr) fillField('zipCode', s.code_postal || '') fillField('city', s.libelle_commune || '') fillField('geoLat', s.latitude || '') fillField('geoLong', s.longitude || '') const typeCompany = resolveTypeCompany(e.nature_juridique) if (typeCompany) fillField('typeCompany', typeCompany) const rna = (e.complements && e.complements.identifiant_association) || '' if (rna) fillField('rna', rna) const prenom = (d.prenoms || '').split(' ')[0] fillFieldIfEmpty('firstName', capitalize(prenom)) fillFieldIfEmpty('lastName', capitalize(d.nom)) onSelect() }) return div } export function initEntrepriseSearch() { const modal = document.getElementById('modal-entreprise') const overlay = document.getElementById('modal-overlay') const closeBtn = document.getElementById('modal-close') const openBtn = document.getElementById('btn-search-entreprise') const input = document.getElementById('search-entreprise-input') const searchBtn = document.getElementById('search-entreprise-btn') const resultsEl = document.getElementById('search-entreprise-results') const statusEl = document.getElementById('search-entreprise-status') if (!modal || !openBtn) return const openModal = () => { modal.classList.remove('hidden'); input.focus() } const closeModal = () => modal.classList.add('hidden') openBtn.addEventListener('click', openModal) closeBtn.addEventListener('click', closeModal) overlay.addEventListener('click', closeModal) document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeModal() }) const doSearch = async () => { const q = input.value.trim() if (q.length < 2) return resultsEl.innerHTML = '' statusEl.textContent = 'Recherche en cours...' statusEl.classList.remove('hidden') try { const resp = await fetch(API_URL + '?q=' + encodeURIComponent(q) + '&page=1&per_page=10') const data = await resp.json() if (!data.results || data.results.length === 0) { statusEl.textContent = 'Aucun resultat trouve.' return } statusEl.textContent = data.total_results + ' resultat(s) - cliquez pour selectionner' data.results.forEach(e => resultsEl.appendChild(renderResult(e, closeModal))) } catch (err) { statusEl.textContent = 'Erreur : ' + err.message } } searchBtn.addEventListener('click', doSearch) input.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); doSearch() } }) }