Skip to content

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

ChampNotes
last_nameObligatoire
first_namePeut être vide pour une fiche mono-nom (studio, marque dont la fiche ne représente pas une personne)
email / phone / instagramAu moins un des trois est requis (validation form). instagram stocké sans le préfixe @
linkedinURL ou identifiant, libre
job_titleFonction du contact dans son entreprise (ex. "Brand manager", "Mariée"). À ne pas confondre avec roles[]
sourceCanal d'acquisition (ex. "Instagram", "Bouche-à-oreille", "Reco Julien")
rolesMulti-valué. Au moins une valeur à la création (form par défaut : ['client'])
tradesMé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_otherTexte libre quand trades inclut other
provider_typesType de structure presta. Pertinent uniquement si roles inclut provider
provider_otherTexte libre quand provider_types inclut other
day_rateTJM (€/jour), pertinent surtout pour les collaborator
company_idsListe de doc IDs de Company. Une personne peut être liée à plusieurs entreprises
primary_company_idAffiliation 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
notesTexte 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 UIDescription
clientClientQuelqu'un qui te paie ou pourrait te payer
collaboratorCollaborateurQuelqu'un avec qui tu bosses sur des projets (cadreur, monteur, photographe…)
providerPrestataireLoueur de matériel, studio, labo, post-prod (la fiche = la personne de référence chez le presta)
prescriberPrescripteurApporteur 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 via company_ids[] + primary_company_id
  • Opportunity : peut référencer un contact_id (le contact porteur du deal)
  • Activity : log d'interactions (call/email/note/meeting) liées au contact
  • Quote, Invoice : peuvent référencer un contact_id