Files
Starseed/frontend/modules/field-sales/utils/startPoint.ts
T
Matthieu d16c7e5541 feat(field_sales) : onglet Carte fiches Client/Fournisseur + point de départ par site ou adresse
Onglet « Carte » sur les fiches Client et Fournisseur (visible sous
field_sales.tours.view et module actif) : tous les points géolocalisés du
Tiers sur une carte Leaflet, pin ajustable (PATCH lat/lng + geoManual),
adresses non géolocalisées listées à part. Composant réutilisable
TierAddressMap.

Écran de planification : point de départ choisi parmi les sites de
l'utilisateur (MalioSelect) ou en adresse libre (autocomplete BAN), marqueur
« maison » sur la carte et trace partant du départ. Le mode n'est dérivé du
back qu'au premier chargement (les sauvegardes ne réécrasent plus le choix).

Suppression de l'ajout d'étape « point libre » (bouton + modale) ; l'affichage
des étapes custom existantes est conservé.
2026-06-12 08:56:37 +02:00

38 lines
1.5 KiB
TypeScript

/**
* Helpers purs du « Point de départ » d'une tournée (M6.5+).
*
* Le point de départ peut être choisi parmi les sites de l'utilisateur ou saisi
* en adresse libre (autocomplete BAN). Ces helpers ne touchent ni à l'API ni à
* l'état réactif : ils formatent des libellés à partir d'un site, donc testables
* unitairement (cf. startPoint.spec.ts). La composition du libellé stocké
* (`startLabel`) reste dans le composant car elle dépend d'i18n (préfixe
* « Site de … »).
*/
/** Sous-ensemble d'un site nécessaire au formatage du point de départ. */
export interface StartSite {
name: string
street: string
postalCode: string
city: string
/** Adresse complète reconstituée côté backend (peut être absente). */
fullAddress?: string
}
/**
* Adresse postale complète d'un site (« rue, CP ville »), à géocoder via la BAN.
* Utilise `fullAddress` du backend si présent, sinon recompose depuis les champs.
*/
export function siteFullAddress(site: StartSite): string {
if (site.fullAddress && site.fullAddress.trim() !== '') {
return site.fullAddress.trim()
}
const cityLine = [site.postalCode, site.city].filter(Boolean).join(' ')
return [site.street, cityLine].filter(Boolean).join(', ')
}
/** Libellé d'une option du select de sites : « {nom} — {code postal} ». */
export function siteOptionLabel(site: Pick<StartSite, 'name' | 'postalCode'>): string {
return `${site.name}${site.postalCode}`
}