Apparence
Contact
Personne (ou entité mono-nom) dans le carnet d'adresses du vidéaste : client, collaborateur, prestataire, prescripteur. Peut être rattachée à 0, 1 ou plusieurs Company (relation N-N).
- Path Firestore :
users/{userId}/contacts/{contactId} - Source TS :
klapy-crm/src/types/index.ts
Interface
ts
interface Contact {
id: string;
first_name?: string;
last_name: string;
email?: string;
phone?: string;
job_title?: string;
source?: string;
instagram?: string;
linkedin?: string;
roles?: ContactRole[];
trades?: Profession[];
trade_other?: string;
provider_types?: ProviderType[];
provider_other?: string;
day_rate?: number;
company_ids?: string[];
primary_company_id?: string;
tags?: string[];
notes?: string;
created_at: Timestamp;
updated_at: Timestamp;
}Champs
| Champ | Notes |
|---|---|
last_name | Obligatoire |
first_name | Peut être vide pour une fiche mono-nom (studio, marque dont la fiche ne représente pas une personne) |
email / phone / instagram | Au moins un des trois est requis (validation form). instagram stocké sans le préfixe @ |
linkedin | URL ou identifiant, libre |
job_title | Fonction du contact dans son entreprise (ex. "Brand manager", "Mariée"). À ne pas confondre avec roles[] |
source | Canal d'acquisition (ex. "Instagram", "Bouche-à-oreille", "Reco Julien") |
roles | Multi-valué. Au moins une valeur à la création (form par défaut : ['client']) |
trades | Métiers techniques (énum unifiée Profession, partagée avec UserProfile.professions). Pertinent uniquement si roles inclut collaborator. Le nom du champ Firestore reste trades pour back-compat |
trade_other | Texte libre quand trades inclut other |
provider_types | Type de structure presta. Pertinent uniquement si roles inclut provider |
provider_other | Texte libre quand provider_types inclut other |
day_rate | TJM (€/jour), pertinent surtout pour les collaborator |
company_ids | Liste de doc IDs de Company. Une personne peut être liée à plusieurs entreprises |
primary_company_id | Affiliation par défaut parmi company_ids. Shortcut UX (pré-sélection sur les deals). Effacé automatiquement si la company cible quitte company_ids |
tags | Étiquettes libres dédupliquées case-insensitive (ex. "VIP", "mariage 2026", "à relancer"). Indexées pour la recherche |
notes | Texte libre |
Roles vs trades vs provider_types
roles décrit comment le contact se relie au vidéaste (client / collaborateur / prestataire / prescripteur, multi-valué). trades est le métier technique (cadreur, monteur, ingé son…) et n'a de sens que pour un collaborateur. provider_types est le type de structure (loueur, studio, post-house) et n'a de sens que pour un prestataire. Si le rôle gating est décoché, les champs conditionnels associés sont effacés automatiquement par le form.
Pas de pro/particulier sur le contact
La nature pro/particulier d'un engagement vit sur l'Opportunity, pas sur le contact. Un même contact peut donc avoir des opportunités pro (avec company_id) et des opportunités particulières (sans company_id). Un company_ids vide ne signifie pas "particulier", juste "aucune affiliation pro connue à ce jour".
Constantes liées
CONTACT_ROLE
Quatre valeurs : client, collaborator, provider, prescriber.
| Clé | Label UI | Description |
|---|---|---|
client | Client | Quelqu'un qui te paie ou pourrait te payer |
collaborator | Collaborateur | Quelqu'un avec qui tu bosses sur des projets (cadreur, monteur, photographe…) |
provider | Prestataire | Loueur de matériel, studio, labo, post-prod (la fiche = la personne de référence chez le presta) |
prescriber | Prescripteur | Apporteur d'affaires, agent, école : te recommande sans bosser directement avec toi |
PROFESSION (ex-CONTACT_TRADE)
49 valeurs au total, regroupées par famille (écriture, réalisation, image, post-prod, son, plateau, design, marketing, musique, tech). Énumération unifiée avec UserProfile.professions — le détail des familles et des valeurs est documenté côté UserProfile.
Les valeurs other qui reviennent souvent en trade_other sont des candidates à la promotion en first-class profession dans une migration future.
Renommage TypeScript, pas Firestore
Le constant TS s'appelle désormais PROFESSION (et le type Profession), mais le champ Firestore sur le contact reste trades. Aucune migration de données contact n'a été faite — seul le côté profil utilisateur a un fallback de lecture (readProfileProfessions()).
PROVIDER_TYPE
Quatre types : equipment_rental (loueur de matériel), studio_rental (loueur de studio), post_house (boîte de post-prod), other.
Voir aussi
Company: référencée viacompany_ids[]+primary_company_idOpportunity: peut référencer uncontact_id(le contact porteur du deal)Activity: log d'interactions (call/email/note/meeting) liées au contactQuote,Invoice: peuvent référencer uncontact_id