/**
* 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() } })
}