feat(address): collecteur BAN + intégration enrich/address + PDF

- Géocodage via api-adresse.data.gouv.fr (BAN)
- Endpoint enrich/address: collecte réelle + génération PDF
- Intégration UI existante (Collecter/Voir PDF/JSON)
This commit is contained in:
4NK IA 2025-09-18 16:09:28 +00:00
parent 8e3daad446
commit 0c9d01404f
2 changed files with 88 additions and 18 deletions

View File

@ -0,0 +1,61 @@
/**
* Collecteur Adresses
* Géocodage via BAN (api-adresse.data.gouv.fr) et scaffold pour risques
*/
const fetch = require('node-fetch')
const USER_AGENT = '4NK-IA-Front/1.0 (Document Analysis Tool)'
const REQUEST_TIMEOUT_MS = 12000
async function geocodeBAN(address) {
const q = [address.street, address.postalCode, address.city, address.country]
.filter(Boolean)
.join(' ')
const url = `https://api-adresse.data.gouv.fr/search/?q=${encodeURIComponent(q)}&limit=1`
const start = Date.now()
try {
const res = await fetch(url, {
headers: { 'User-Agent': USER_AGENT, 'Accept': 'application/json' },
timeout: REQUEST_TIMEOUT_MS,
})
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const json = await res.json()
const f = json.features && json.features[0]
if (!f) {
return { success: true, duration: Date.now() - start, score: 0, lat: null, lon: null, label: null }
}
return {
success: true,
duration: Date.now() - start,
score: f.properties && typeof f.properties.score === 'number' ? f.properties.score : null,
lat: f.geometry?.coordinates ? f.geometry.coordinates[1] : null,
lon: f.geometry?.coordinates ? f.geometry.coordinates[0] : null,
label: f.properties?.label || null,
}
} catch (e) {
return { success: false, duration: Date.now() - start, error: e.message }
}
}
async function collectAddressData(address) {
// Étape 1: Géocodage BAN
const geocode = await geocodeBAN(address)
// Étape 2: Risques (placeholder, à compléter avec GéoRisque/GéoFoncier)
const risks = []
return {
success: geocode.success,
geocode,
risks,
timestamp: new Date().toISOString(),
sources: ['ban']
}
}
module.exports = {
collectAddressData,
}

View File

@ -20,6 +20,7 @@ const pdf = require('pdf-parse')
const { searchBodaccGelAvoirs, generateBodaccSummary } = require('./collectors/bodaccCollector') const { searchBodaccGelAvoirs, generateBodaccSummary } = require('./collectors/bodaccCollector')
const { searchCompanyInfo, generateCompanySummary } = require('./collectors/inforgreffeCollector') const { searchCompanyInfo, generateCompanySummary } = require('./collectors/inforgreffeCollector')
const { generatePersonPdf, generateCompanyPdf, generateAddressPdf } = require('./collectors/pdfGenerator') const { generatePersonPdf, generateCompanyPdf, generateAddressPdf } = require('./collectors/pdfGenerator')
const { collectAddressData } = require('./collectors/addressCollector')
const app = express() const app = express()
const PORT = process.env.PORT || 3001 const PORT = process.env.PORT || 3001
@ -2665,17 +2666,25 @@ app.post('/api/folders/:folderHash/files/:fileHash/enrich/:kind', async (req, re
} }
} }
} else if (kind === 'address') { } else if (kind === 'address') {
// Placeholder pour les adresses (géocodage à implémenter) // Géocodage réel via BAN
result = { const cacheFile = path.join(cachePath, `${fileHash}.json`)
success: true, let addressData = { street: '', city: '', postalCode: '', country: 'France' }
duration: 1000, if (fs.existsSync(cacheFile)) {
message: 'Enrichissement adresse en cours de développement', const cacheData = JSON.parse(fs.readFileSync(cacheFile, 'utf8'))
data: { placeholder: true } const addresses = cacheData.entities?.addresses || []
if (addresses.length > 0) {
addressData = {
street: addresses[0].street || '',
city: addresses[0].city || '',
postalCode: addresses[0].postalCode || '',
country: addresses[0].country || 'France',
} }
}
}
result = await collectAddressData(addressData)
// Génération du PDF placeholder // Génération du PDF avec données géocodées
try { try {
const addressData = { street: 'Adresse', city: 'Ville' }
await generateAddressPdf(addressData, result, pdfPath) await generateAddressPdf(addressData, result, pdfPath)
pdfGenerated = true pdfGenerated = true
} catch (pdfError) { } catch (pdfError) {