5764d8f472
- Prestataire : entité/repo + ressource API Platform (RBAC directory.providers.*), ownership prestataire sur contacts/adresses/comptes-rendus (CHECK XOR à 3), DTO/service/drawer/fiche détail + onglet dédié dans le répertoire. - Prospect : société uniquement (suppression du champ name, company requis) ; migration de backfill, conversion prospect→client et MCP adaptés. - Champ site web sur client/prospect/prestataire (entités, DTO, onglet Information, MCP). - Validateurs front email / téléphone FR (0549200910) / URL sur Information et Contacts, enregistrement bloqué tant qu'un champ est invalide. - Autocomplete adresse branché sur la Base Adresse Nationale (api-adresse.data.gouv.fr) avec mode dégradé en saisie libre. - Administration : retrait de l'onglet Clients.
41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
// Validateurs partagés du répertoire (annuaire). Chaque validateur considère
|
|
// une valeur VIDE comme valide : les champs email/téléphone/site web sont
|
|
// facultatifs — la validation ne porte que sur le format quand c'est renseigné.
|
|
|
|
/** Email basique (présence d'un @ entouré de caractères, un point dans le domaine). */
|
|
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
|
|
/**
|
|
* Téléphone français : 10 chiffres commençant par 0 (ex. `0549200910`) — format
|
|
* saisi par l'utilisateur, sans séparateurs — ou notation internationale
|
|
* `+33XXXXXXXXX` (9 chiffres après l'indicatif). Les espaces, points et tirets
|
|
* sont tolérés à la frappe (retirés avant contrôle).
|
|
*/
|
|
const FR_PHONE_NATIONAL_RE = /^0\d{9}$/
|
|
const FR_PHONE_INTL_RE = /^\+33\d{9}$/
|
|
|
|
const URL_RE = /^https?:\/\/[^\s.]+\.[^\s]+$/
|
|
|
|
/** Retire les séparateurs usuels d'un numéro (espaces, points, tirets, parenthèses). */
|
|
export function stripPhoneSeparators(value: string): string {
|
|
return value.replace(/[\s.\-()]/g, '')
|
|
}
|
|
|
|
export function isValidEmail(value: string | null | undefined): boolean {
|
|
const v = (value ?? '').trim()
|
|
if (v === '') return true
|
|
return EMAIL_RE.test(v)
|
|
}
|
|
|
|
export function isValidFrPhone(value: string | null | undefined): boolean {
|
|
const v = stripPhoneSeparators((value ?? '').trim())
|
|
if (v === '') return true
|
|
return FR_PHONE_NATIONAL_RE.test(v) || FR_PHONE_INTL_RE.test(v)
|
|
}
|
|
|
|
export function isValidUrl(value: string | null | undefined): boolean {
|
|
const v = (value ?? '').trim()
|
|
if (v === '') return true
|
|
return URL_RE.test(v)
|
|
}
|