import { useState, useEffect } from "react"; import { Phone, Building2, Mail, ExternalLink, Search, Copy, Check, Loader2, AlertCircle, CheckCircle, MapPin, ChevronDown, ChevronUp, Tag } from "lucide-react"; // ═══════════════════════════════════════════════════════════════ // TYPES & INTERFACES // ═══════════════════════════════════════════════════════════════ interface OdooPartner { id: number; name: string; phone: string | false; mobile: string | false; email: string | false; parent_id: [number, string] | false; city: string | false; street: string | false; zip: string | false; type: string; company_name?: string | false; commercial_company_name?: string | false; } interface PrestaCustomer { id: string; firstname: string; lastname: string; email: string; company?: string; phone?: string; phones?: string[]; group_name?: string; } interface CustomerProfile { firstname: string; lastname: string; company: string; phone: string; email: string; prestaId?: string | number; odooId?: string | number; street?: string; zip?: string; city?: string; groupName?: string; addresses?: { street: string; zip: string; city: string; isLatest?: boolean }[]; companies?: string[]; } // ═══════════════════════════════════════════════════════════════ // FORMATAGE DES PRÉNOMS & NOMS // ═══════════════════════════════════════════════════════════════ function formatFirstname(name: string): string { if (!name) return ""; const trimmed = name.trim(); const capitalizeWord = (w: string) => { if (!w) return ""; return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); }; return trimmed .split("-") .map(part => { return part .split(" ") .map(capitalizeWord) .join(" "); }) .join("-"); } function formatLastname(name: string): string { if (!name) return ""; return name.trim().toUpperCase(); } // ═══════════════════════════════════════════════════════════════ // FALLBACK / SÉCURITÉ : JIMMY COCQUEREL & MODE DÉMO // ═══════════════════════════════════════════════════════════════ const FALLBACK_JIMMY: CustomerProfile = { firstname: "Jimmy", lastname: "COCQUEREL", company: "TousErgo", phone: "07 80 98 19 98", email: "jcocquerel@tousergo.com", prestaId: "2201", odooId: "42", street: "1C QUAI MARION", zip: "59158", city: "Mortagne-du-Nord", groupName: "Personnels, 20%", addresses: [ { street: "1C QUAI MARION", zip: "59158", city: "Mortagne-du-Nord", isLatest: true }, { street: "12 Rue de la République", zip: "69003", city: "Lyon" }, { street: "59 Boulevard de la Liberté", zip: "59000", city: "Lille" }, { street: "22 Avenue des Champs-Élysées", zip: "75008", city: "Paris" }, { street: "8 Rue de l'Énergie", zip: "59650", city: "Villeneuve-d'Ascq" } ], companies: [ "TousErgo", "ErgoSourcing SAS", "Mobilité & Autonomie", "Haut-de-France Santé", "Cocquerel Holding" ] }; const FALLBACK_DEFAULT: CustomerProfile = { firstname: "Sophie", lastname: "LEFEBVRE", company: "Ergomed SAS", phone: "06 12 34 56 78", email: "sophie.lefebvre@example.fr", prestaId: "8834", odooId: "125", street: "45 Avenue Jean Jaurès", zip: "69007", city: "Lyon", groupName: "Pro à échéance - 0%", addresses: [ { street: "45 Avenue Jean Jaurès", zip: "69007", city: "Lyon", isLatest: true }, { street: "18 Rue Saint-Maur", zip: "75011", city: "Paris" } ], companies: [ "Ergomed SAS", "Santé Services", "Medical Pro" ] }; function formatPhoneFrench(phone: string, contextPhone?: string) { if (!phone) return ""; const cleaned = phone.trim(); const digits = cleaned.replace(/[^\d]/g, ""); const hasPlus = cleaned.startsWith("+"); let cc = ""; let isBelgian = false; let isFrench = false; let isSwiss = false; let isLux = false; if (hasPlus) { if (cleaned.startsWith("+33")) { cc = "33"; isFrench = true; } else if (cleaned.startsWith("+32")) { cc = "32"; isBelgian = true; } else if (cleaned.startsWith("+41")) { cc = "41"; isSwiss = true; } else if (cleaned.startsWith("+352")) { cc = "352"; isLux = true; } } else if (cleaned.startsWith("00")) { if (cleaned.startsWith("0033")) { cc = "33"; isFrench = true; } else if (cleaned.startsWith("0032")) { cc = "32"; isBelgian = true; } else if (cleaned.startsWith("0041")) { cc = "41"; isSwiss = true; } else if (cleaned.startsWith("00352")) { cc = "352"; isLux = true; } } if (!cc && contextPhone) { const ctxClean = contextPhone.trim(); if (ctxClean.startsWith("+33") || ctxClean.startsWith("0033")) { cc = "33"; isFrench = true; } else if (ctxClean.startsWith("+32") || ctxClean.startsWith("0032")) { cc = "32"; isBelgian = true; } else if (ctxClean.startsWith("+41") || ctxClean.startsWith("0041")) { cc = "41"; isSwiss = true; } else if (ctxClean.startsWith("+352") || ctxClean.startsWith("00352")) { cc = "352"; isLux = true; } } if (!cc) { if (digits.length === 10) { if (digits.startsWith("045") || digits.startsWith("046") || digits.startsWith("047") || digits.startsWith("048") || digits.startsWith("049")) { cc = "32"; isBelgian = true; } else { cc = "33"; isFrench = true; } } else if (digits.length === 9 && digits.startsWith("0")) { cc = "32"; isBelgian = true; } else { cc = "33"; isFrench = true; } } let national = digits; if (hasPlus) { national = digits.slice(cc.length); } else if (cleaned.startsWith("00")) { national = digits.slice(2 + cc.length); } else if (digits.startsWith(cc) && digits.length > cc.length + 4) { national = digits.slice(cc.length); } if (national.startsWith("0")) { national = national.slice(1); } if (isFrench) { const padded = national.padEnd(9, " "); const p1 = padded.slice(0, 1); const p2 = padded.slice(1, 3); const p3 = padded.slice(3, 5); const p4 = padded.slice(5, 7); const p5 = padded.slice(7, 9); return `+33 ${p1} ${p2} ${p3} ${p4} ${p5}`.trim(); } if (isBelgian) { if (national.length === 9 || national.startsWith("45") || national.startsWith("46") || national.startsWith("47") || national.startsWith("48") || national.startsWith("49")) { const padded = national.padEnd(9, " "); const p1 = padded.slice(0, 3); const p2 = padded.slice(3, 5); const p3 = padded.slice(5, 7); const p4 = padded.slice(7, 9); return `+32 ${p1} ${p2} ${p3} ${p4}`.trim(); } else { const startsWithTwo = national.startsWith("2") || national.startsWith("3") || national.startsWith("4") || national.startsWith("9"); if (startsWithTwo && national.length === 8) { const padded = national.padEnd(8, " "); const p1 = padded.slice(0, 1); const p2 = padded.slice(1, 4); const p3 = padded.slice(4, 6); const p4 = padded.slice(6, 8); return `+32 ${p1} ${p2} ${p3} ${p4}`.trim(); } else { const padded = national.padEnd(8, " "); const p1 = padded.slice(0, 2); const p2 = padded.slice(2, 4); const p3 = padded.slice(4, 6); const p4 = padded.slice(6, 8); return `+32 ${p1} ${p2} ${p3} ${p4}`.trim(); } } } if (isSwiss) { const padded = national.padEnd(9, " "); const p1 = padded.slice(0, 2); const p2 = padded.slice(2, 5); const p3 = padded.slice(5, 7); const p4 = padded.slice(7, 9); return `+41 ${p1} ${p2} ${p3} ${p4}`.trim(); } if (isLux) { if (national.length >= 6) { const padded = national.padEnd(9, " "); const p1 = padded.slice(0, 3); const p2 = padded.slice(3, 6); const p3 = padded.slice(6, 9).trim(); const space3 = p3 ? " " + p3 : ""; return `+352 ${p1} ${p2}${space3}`.trim(); } } return phone; } export default function App() { const [searchQuery, setSearchQuery] = useState(""); const [loading, setLoading] = useState(false); const [activeProfile, setActiveProfile] = useState(null); const [showOtherAddresses, setShowOtherAddresses] = useState(false); const [showOtherCompanies, setShowOtherCompanies] = useState(false); const [odooResults, setOdooResults] = useState([]); const [prestaResult, setPrestaResult] = useState(null); const [prestaResults, setPrestaResults] = useState([]); const [error, setError] = useState(null); const [isDemoData, setIsDemoData] = useState(false); const [copiedField, setCopiedField] = useState(null); // Exécuter la recherche globale const handleSearch = async (phoneToSearch: string) => { if (!phoneToSearch) return; const cleanPhone = phoneToSearch.trim().replace(/[\s\-\.()\/]/g, ""); if (!cleanPhone) return; setLoading(true); setError(null); setIsDemoData(false); setShowOtherAddresses(false); setShowOtherCompanies(false); try { const res = await fetch(`/api/search?phone=${encodeURIComponent(cleanPhone)}`); if (!res.ok) { throw new Error(`Erreur serveur (${res.status})`); } const data = await res.json(); const odooList: OdooPartner[] = data.odoo || []; const psMatch: PrestaCustomer | null = data.ps || null; const psList: PrestaCustomer[] = data.psList || (psMatch ? [psMatch] : []); setOdooResults(odooList); setPrestaResult(psMatch); setPrestaResults(psList); if (odooList.length > 0 || psMatch || psList.length > 0) { const activePs = psMatch || psList[0] || null; if (activePs && !prestaResult) { setPrestaResult(activePs); } const activeEmail = activePs?.email || odooList[0]?.email || ""; const matchingOdoo = odooList.find(partner => { const pEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; const actEmail = activeEmail.trim().toLowerCase(); return pEmail && actEmail && pEmail === actEmail; }) || odooList[0]; const firstname = formatFirstname(activePs?.firstname || matchingOdoo?.name?.split(" ")[0] || ""); const lastname = formatLastname(activePs?.lastname || matchingOdoo?.name?.split(" ").slice(1).join(" ") || "Client Odoo"); const addressesList: { street: string; zip: string; city: string; isLatest?: boolean }[] = []; const seenAddr = new Set(); if (data.latestOdooOrderAddress) { const lat = data.latestOdooOrderAddress; const s = lat.street ? String(lat.street).trim() : ""; const z = lat.zip ? String(lat.zip).trim() : ""; const c = lat.city ? String(lat.city).trim() : ""; if (s || c) { const key = `${s.toLowerCase()}|${z.toLowerCase()}|${c.toLowerCase()}`; seenAddr.add(key); addressesList.push({ street: s, zip: z, city: c, isLatest: true }); } } odooList.forEach((partner) => { const partnerEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; const actEmail = activeEmail.trim().toLowerCase(); if (partnerEmail && actEmail && partnerEmail !== actEmail) return; const s = partner.street ? String(partner.street).trim() : ""; const z = partner.zip ? String(partner.zip).trim() : ""; const c = partner.city ? String(partner.city).trim() : ""; if (s || c) { const key = `${s.toLowerCase()}|${z.toLowerCase()}|${c.toLowerCase()}`; if (!seenAddr.has(key)) { seenAddr.add(key); addressesList.push({ street: s, zip: z, city: c, isLatest: addressesList.length === 0 }); } } }); const companiesList: string[] = []; const seenComp = new Set(); if (data.latestOdooOrderAddress?.company) { const cName = data.latestOdooOrderAddress.company.trim(); if (cName && !seenComp.has(cName.toLowerCase())) { seenComp.add(cName.toLowerCase()); companiesList.push(cName); } } if (activePs?.company && activePs.email?.trim().toLowerCase() === activeEmail.trim().toLowerCase()) { const cName = activePs.company.trim(); if (cName && !seenComp.has(cName.toLowerCase())) { seenComp.add(cName.toLowerCase()); companiesList.push(cName); } } odooList.forEach((partner) => { const partnerEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; const actEmail = activeEmail.trim().toLowerCase(); if (partnerEmail && actEmail && partnerEmail !== actEmail) return; if (partner.parent_id && partner.parent_id[1]) { const cName = partner.parent_id[1].trim(); if (cName && !seenComp.has(cName.toLowerCase())) { seenComp.add(cName.toLowerCase()); companiesList.push(cName); } } }); const mainStreet = matchingOdoo?.street ? String(matchingOdoo.street) : ""; const mainZip = matchingOdoo?.zip ? String(matchingOdoo.zip) : ""; const mainCity = matchingOdoo?.city ? String(matchingOdoo.city) : ""; if (addressesList.length === 0 && (mainStreet || mainCity)) { addressesList.push({ street: mainStreet, zip: mainZip, city: mainCity, isLatest: true }); } const phone = formatPhoneFrench(activePs?.phone || matchingOdoo?.mobile || matchingOdoo?.phone || phoneToSearch, phoneToSearch); const email = activeEmail; const groupName = activePs?.group_name || "Client Standard"; setActiveProfile({ firstname, lastname, company: companiesList[0] || "Particulier", phone, email, prestaId: activePs?.id, odooId: matchingOdoo?.id, street: addressesList[0]?.street || mainStreet || "", zip: addressesList[0]?.zip || mainZip || "", city: addressesList[0]?.city || mainCity || "", groupName, addresses: addressesList, companies: companiesList }); } else { if (cleanPhone.includes("0780981998") || cleanPhone.includes("780981998")) { setActiveProfile(FALLBACK_JIMMY); setIsDemoData(true); setPrestaResults([ { id: "2201", firstname: "Jimmy", lastname: "COCQUEREL", email: "jcocquerel@tousergo.com", company: "TousErgo", phones: ["+33780981998"] }, { id: "3045", firstname: "Jimmy (Pro)", lastname: "COCQUEREL", email: "jimmy.pro@tousergo.com", company: "ErgoSourcing SAS", phones: ["+32466887672"] } ]); setPrestaResult({ id: "2201", firstname: "Jimmy", lastname: "COCQUEREL", email: "jcocquerel@tousergo.com", company: "TousErgo", phones: ["+33780981998"] }); } else { setActiveProfile(null); setPrestaResults([]); setPrestaResult(null); } } } catch (err: any) { console.error("Erreur de recherche:", err); setError("Impossible de contacter le serveur de recherche en temps réel."); if (cleanPhone.includes("0780981998") || cleanPhone.includes("780981998")) { setActiveProfile(FALLBACK_JIMMY); setIsDemoData(true); setPrestaResults([ { id: "2201", firstname: "Jimmy", lastname: "COCQUEREL", email: "jcocquerel@tousergo.com", company: "TousErgo", phones: ["+33780981998"] }, { id: "3045", firstname: "Jimmy (Pro)", lastname: "COCQUEREL", email: "jimmy.pro@tousergo.com", company: "ErgoSourcing SAS", phones: ["+32466887672"] } ]); setPrestaResult({ id: "2201", firstname: "Jimmy", lastname: "COCQUEREL", email: "jcocquerel@tousergo.com", company: "TousErgo", phones: ["+33780981998"] }); } else if (cleanPhone.includes("0612345678") || cleanPhone === "0612345678") { setActiveProfile(FALLBACK_DEFAULT); setIsDemoData(true); setPrestaResults([ { id: "8834", firstname: "Sophie", lastname: "LEFEBVRE", email: "sophie.lefebvre@example.fr", company: "Ergomed SAS", phones: ["0612345678"] } ]); setPrestaResult({ id: "8834", firstname: "Sophie", lastname: "LEFEBVRE", email: "sophie.lefebvre@example.fr", company: "Ergomed SAS", phones: ["0612345678"] }); } else { setActiveProfile({ firstname: formatFirstname("Client"), lastname: formatLastname("Inconnu"), company: "Non renseigné", phone: formatPhoneFrench(phoneToSearch, phoneToSearch), email: "Aucun e-mail trouvé", }); setIsDemoData(true); setPrestaResults([]); setPrestaResult(null); } } finally { setLoading(false); } }; useEffect(() => { const params = new URLSearchParams(window.location.search); const phoneParam = params.get("phone"); if (phoneParam) { const clean = phoneParam.trim(); setSearchQuery(clean); handleSearch(clean); } // Pas de paramètre "phone" dans l'URL -> aucune recherche automatique, // l'agent doit saisir un numéro manuellement. }, []); const onSubmitSearch = (e: React.FormEvent) => { e.preventDefault(); if (searchQuery.trim()) { const newUrl = `${window.location.pathname}?phone=${encodeURIComponent(searchQuery.trim())}`; window.history.replaceState({}, "", newUrl); handleSearch(searchQuery.trim()); } }; const fetchLatestOrderDetails = async (odooId?: string | number, email?: string) => { try { let queryParam = ""; if (odooId) { queryParam = `odooId=${encodeURIComponent(odooId)}`; } else if (email) { queryParam = `email=${encodeURIComponent(email)}`; } else { return; } const res = await fetch(`/api/search?${queryParam}`); if (res.ok) { const data = await res.json(); if (data.latestOdooOrderAddress) { const lat = data.latestOdooOrderAddress; const s = lat.street ? String(lat.street).trim() : ""; const z = lat.zip ? String(lat.zip).trim() : ""; const c = lat.city ? String(lat.city).trim() : ""; setActiveProfile(prev => { if (!prev) return null; const updatedAddresses = prev.addresses ? [...prev.addresses] : []; const keyToFind = `${s.toLowerCase()}|${z.toLowerCase()}|${c.toLowerCase()}`; const filtered = updatedAddresses.filter(addr => { const k = `${(addr.street || "").toLowerCase()}|${(addr.zip || "").toLowerCase()}|${(addr.city || "").toLowerCase()}`; return k !== keyToFind; }); if (s || c) { filtered.unshift({ street: s, zip: z, city: c, isLatest: true }); } const updatedCompanies = prev.companies ? [...prev.companies] : []; if (lat.company) { const cName = lat.company.trim(); const filteredComp = updatedCompanies.filter(comp => comp.toLowerCase() !== cName.toLowerCase()); filteredComp.unshift(cName); return { ...prev, addresses: filtered, companies: filteredComp }; } return { ...prev, addresses: filtered }; }); } } } catch (err) { console.error("Error fetching latest order details:", err); } }; const handleSelectPrestaCustomer = (ps: PrestaCustomer) => { setPrestaResult(ps); const activeEmail = ps.email || ""; const formattedFirst = formatFirstname(ps.firstname); const formattedLast = formatLastname(ps.lastname); const phone = formatPhoneFrench(ps.phone || (ps.phones && ps.phones[0]) || searchQuery, searchQuery); const matchingOdoo = odooResults.find(partner => { const pEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; const actEmail = activeEmail.trim().toLowerCase(); return pEmail && actEmail && pEmail === actEmail; }) || odooResults[0]; const addressesList: { street: string; zip: string; city: string; isLatest?: boolean }[] = []; const seenAddr = new Set(); odooResults.forEach((partner) => { const partnerEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; if (partnerEmail && activeEmail && partnerEmail !== activeEmail.trim().toLowerCase()) return; const s = partner.street ? String(partner.street).trim() : ""; const z = partner.zip ? String(partner.zip).trim() : ""; const c = partner.city ? String(partner.city).trim() : ""; if (s || c) { const key = `${s.toLowerCase()}|${z.toLowerCase()}|${c.toLowerCase()}`; if (!seenAddr.has(key)) { seenAddr.add(key); addressesList.push({ street: s, zip: z, city: c, isLatest: addressesList.length === 0 }); } } }); const companiesList: string[] = []; const seenComp = new Set(); if (ps.company) { const cName = ps.company.trim(); if (cName && !seenComp.has(cName.toLowerCase())) { seenComp.add(cName.toLowerCase()); companiesList.push(cName); } } odooResults.forEach((partner) => { const partnerEmail = partner.email ? String(partner.email).trim().toLowerCase() : ""; if (partnerEmail && activeEmail && partnerEmail !== activeEmail.trim().toLowerCase()) return; if (partner.parent_id && partner.parent_id[1]) { const cName = partner.parent_id[1].trim(); if (cName && !seenComp.has(cName.toLowerCase())) { seenComp.add(cName.toLowerCase()); companiesList.push(cName); } } }); const mainStreet = matchingOdoo?.street ? String(matchingOdoo.street) : ""; const mainZip = matchingOdoo?.zip ? String(matchingOdoo.zip) : ""; const mainCity = matchingOdoo?.city ? String(matchingOdoo.city) : ""; if (addressesList.length === 0 && (mainStreet || mainCity)) { addressesList.push({ street: mainStreet, zip: mainZip, city: mainCity, isLatest: true }); } setActiveProfile({ firstname: formattedFirst, lastname: formattedLast, company: companiesList[0] || "Particulier", phone, email: activeEmail, prestaId: ps.id, odooId: matchingOdoo?.id, street: addressesList[0]?.street || mainStreet || "", zip: addressesList[0]?.zip || mainZip || "", city: addressesList[0]?.city || mainCity || "", groupName: ps.group_name || "Client Standard", addresses: addressesList, companies: companiesList }); if (ps.email) { fetchLatestOrderDetails(matchingOdoo?.id || undefined, ps.email); } }; const handleCopy = (text: string, fieldName: string) => { if (!text) return; navigator.clipboard.writeText(text); setCopiedField(fieldName); setTimeout(() => setCopiedField(null), 1500); }; const getPrestashopUrl = (id?: string | number) => { const custId = id || "2201"; return `https://www.tousergo.com/admin_ps_t_fr/index.php?controller=AdminCustomers&id_customer=${custId}&viewcustomer`; }; const getOdooUrl = (id?: string | number) => { const partnerId = id || "42"; return `https://tousergo.eggs-solutions.fr/web#cids=1&id=${partnerId}&model=res.partner&view_type=form&menu_id=`; }; const companies = activeProfile?.companies || []; const companiesToDisplay = companies.slice(0, 2); const otherCompanies = companies.slice(2); const addresses = activeProfile?.addresses || []; const latestAddress = addresses[0] || (activeProfile ? { street: activeProfile.street || "", zip: activeProfile.zip || "", city: activeProfile.city || "" } : null); const otherAddresses = addresses.slice(1); return (
{/* ══════════ EN-TÊTE / BANDEAU BLEU PROFESSIONNEL ══════════ */}
TOUS ERGO

TOUS ERGO DASHBOARD

V.1 BÊTA TEST - by JCB

{/* Moteur de recherche dédié intégré au bandeau */}
setSearchQuery(e.target.value)} placeholder="Rechercher par numéro de téléphone (ex: 0320819389)..." className="w-full bg-slate-800 hover:bg-slate-750 focus:bg-white focus:text-slate-950 placeholder-slate-400 text-xs pl-10 pr-24 py-2 rounded-xl border border-slate-700 focus:border-tousergo-rust transition-all outline-none font-medium text-slate-200" />
{/* Lien de test 3CX */}
3CX Link: ?phone={searchQuery || "0780981998"}
{/* ══════════ ZONE PRINCIPALE DE CONTEXTE ══════════ */}
{/* Indicateur de chargement */} {loading && (

Recherche dans les bases de données...

Interrogation en temps réel de PrestaShop et Odoo

)} {/* Contenu de la fiche client */} {!loading && (
{/* COLONNE GAUCHE : LA FICHE CLIENT PRINCIPALE (3/5) */}
{/* SÉLECTEUR DE COMPTE PRESTASHOP MULTIPLE */} {prestaResults.length > 1 && (

Plusieurs comptes PrestaShop associés à ce numéro

Veuillez sélectionner la fiche client PrestaShop active pour cet appel :

{prestaResults.map((ps) => { const isSelected = prestaResult?.id === ps.id; return ( ); })}
)} {activeProfile ? (
{/* Header de la carte client */}
{((activeProfile.firstname?.[0] || "") + (activeProfile.lastname?.[0] || "")).toUpperCase()}
Fiche Client Active

{activeProfile.firstname} {activeProfile.lastname}

{isDemoData && ( Mode Secours )}
{/* Corps avec les informations principales */}
{/* ID Client Presta */}
ID Client PrestaShop
{activeProfile.prestaId ? `#${activeProfile.prestaId}` : "Non synchronisé"} {activeProfile.prestaId && ( )}
{/* Société */}
Sociétés / Entités
{companiesToDisplay.length > 0 ? ( companiesToDisplay.map((comp, idx) => (
{comp} {idx === 0 && ( Dernière active )} {idx === 1 && ( Secondaire )}
)) ) : (
Particulier
)}
{/* Accordéon Autres Sociétés */} {otherCompanies.length > 0 && (
{showOtherCompanies && (
{otherCompanies.map((comp, idx) => (
{comp}
))}
)}
)}
{/* Téléphone */}
Téléphone
{activeProfile.phone}
{/* E-mail */}
E-mail
{activeProfile.email || "Non spécifié"} {activeProfile.email && ( )}
{/* Adresse postale */}
Adresse Postale
{latestAddress && (latestAddress.street || latestAddress.city) ? (
{latestAddress.street &&
{latestAddress.street}
} {(latestAddress.zip || latestAddress.city) && (
{latestAddress.zip} {latestAddress.city}
)} Dernière utilisée
) : ( Adresse non renseignée )}
{/* Accordéon Autres Adresses */} {otherAddresses.length > 0 && (
{showOtherAddresses && (
{otherAddresses.map((addr, idx) => (
{addr.street &&
{addr.street}
} {(addr.zip || addr.city) &&
{addr.zip} {addr.city}
}
))}
)}
)}
{/* Actions Rapides d'ouverture de fiches directes */}
) : (

Aucune fiche sélectionnée

Saisissez un numéro de téléphone dans la barre de recherche ci-dessus pour afficher la fiche client.

)}
{/* COLONNE DROITE : SYNCHRONISATION ET RECHERCHES ASSOCIEES (2/5) */}
{/* Résultat PrestaShop */}

Fiches PrestaShop ({prestaResults.length})

Status API
{prestaResults.length > 0 ? (
{prestaResults.map((ps) => { const isActive = prestaResult?.id === ps.id; return (
{formatFirstname(ps.firstname)} {formatLastname(ps.lastname)} ID: #{ps.id}
{ps.email}
{ps.company && (
{ps.company}
)}
{isActive ? ( Fiche active ) : ( Autre compte PrestaShop )} Ouvrir PrestaShop
); })}
) : (
Aucun résultat PrestaShop trouvé pour ce numéro.
)}
{/* Résultat Odoo */}

Fiches Odoo ({odooResults.length})

Status API
{odooResults.length > 0 ? (
{odooResults.map((partner) => { const isActiveOdoo = partner.id === activeProfile?.odooId; return (
{partner.name} ID: #{partner.id}
{partner.email &&
{partner.email}
} {partner.parent_id && (
{partner.parent_id[1]}
)}
{isActiveOdoo ? ( Fiche active ) : ( Autre fiche Odoo )} Ouvrir Odoo
); })}
) : (
Aucun partenaire Odoo trouvé pour ce numéro.
)}
)}
); }