feat(directory) : type prestataire, validateurs front, autocomplete adresse BAN
- 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.
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
// 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)
|
||||
}
|
||||
Reference in New Issue
Block a user