Apparence
UserProfile
Données personnelles (PII) de l'utilisateur et ses paramètres de facturation. Isolé dans une sous-collection pour faciliter les exports/suppressions RGPD et appliquer des règles Firestore distinctes.
- Path Firestore :
users/{userId}/profile/main - Doc unique, ID fixe
main - Source TS :
klapy-crm/src/types/index.ts
Interface
ts
interface UserProfile {
first_name?: string;
last_name?: string;
commercial_name?: string;
phone?: string;
siret?: string;
address?: Address;
logo_url?: string;
videographer_type?: string;
tva_rate?: number;
tva_exempt?: boolean;
tva_mention?: string;
quote_prefix?: string;
invoice_prefix?: string;
payment_conditions?: string;
validity_days?: number;
footer_text?: string;
general_conditions?: string;
updated_at: Timestamp;
}Champs
| Champ | Notes |
|---|---|
commercial_name | Nom affiché sur les devis et factures, peut différer du nom légal |
siret | 14 chiffres, pas validé à l'écriture, à valider en UI |
address | Adresse postale, voir sous-objet ci-dessous |
logo_url | URL Firebase Storage du logo, affiché en haut des PDF |
videographer_type | Texte libre (mariage, corporate, clip, etc.) |
tva_rate | Taux par défaut appliqué aux nouvelles lignes (ex. 20) |
tva_exempt | Si true, mention « TVA non applicable, art. 293 B du CGI » |
tva_mention | Mention légale custom utilisée si tva_exempt |
quote_prefix | Préfixe des numéros de devis (ex. DEV-) |
invoice_prefix | Préfixe des numéros de facture (ex. FACT-) |
payment_conditions | Conditions de règlement par défaut, texte libre |
validity_days | Validité par défaut des nouveaux devis, en jours |
footer_text | Pied de page imprimé sur tous les documents |
general_conditions | CGV en texte libre, imprimées en bas de chaque devis |
Sous-objet Address
ts
interface Address {
street?: string;
city?: string;
postal_code?: string;
country?: string;
}Tous les champs sont optionnels. Stocké en inline, jamais en document Firestore séparé.
Pourquoi cette sous-collection ?
La séparation UserAccount ↔ UserProfile n'est pas cosmétique : elle permet à la Cloud Function exportUserData de zipper le profil en un seul read, à deleteUserAccount de supprimer toutes les PII en une opération, et à firestore.rules de définir des règles plus strictes sur le profil que sur le compte. Ne jamais déplacer un champ de l'un à l'autre sans réviser les rules et les Cloud Functions RGPD.
Voir aussi
UserAccount: compte parentCompany: utilise aussi le sous-objetAddress- Cloud Functions :
exportUserData,deleteUserAccount - RGPD (à rédiger)