This commit is contained in:
Bastien COIGNOUX
2026-05-04 06:02:10 +02:00
parent 7b3e50ff29
commit 7f94f83940
128 changed files with 415 additions and 39155 deletions

View File

@ -1,97 +1,63 @@
# Contexte projet — Application Marchand de Biens
# Application Marchand de Biens — Contexte Cursor
## Qui utilise cette app
Marchand de biens professionnel en France. L'app est utilisée au quotidien sur mobile (iOS/Android) et navigateur web. Elle remplace un ensemble d'outils épars (notes, tableurs, contacts téléphoniques, etc.).
## Infrastructure
- Backend : PocketBase dans Docker (docker/docker-compose.dev.yml)
- Binaire PocketBase : /usr/local/bin/pocketbase
- Données : /pb_data (flag --dir=/pb_data dans docker-compose)
- OS dev : Windows Git Bash → toujours utiliser MSYS_NO_PATHCONV=1 pour docker exec
- PocketBase version : v0.23+
- URL locale : http://localhost:8090
- URL prod : https://SOUS_DOMAINE.duckdns.org (NAS Synology)
## Stack technique
- **Frontend** : React Native avec Expo (SDK 51+)
- **Navigation** : Expo Router (file-based routing)
- **Base de données** : Supabase (PostgreSQL)
- **Auth** : Supabase Auth (email/password)
- **Stockage fichiers** : Supabase Storage (photos, PDFs)
- **IA** : API Anthropic Claude (claude-sonnet-4-20250514)
- **UI** : NativeWind (Tailwind pour React Native) + React Native Paper pour les composants complexes
- **State** : Zustand pour le state global, React Query (TanStack) pour le cache serveur
- **Déploiement mobile** : Expo EAS
- **Déploiement web** : Vercel
- Frontend : React Native avec Expo SDK 51 + Expo Router
- SDK PocketBase : npm package "pocketbase"
- UI : NativeWind (Tailwind pour React Native)
- State : Zustand + React Query (TanStack)
- IA : API Anthropic Claude via PocketBase Hook (jamais côté client)
- Déploiement mobile : Expo EAS
## Conventions de code
- TypeScript strict partout, jamais de `any`
- Noms de fichiers : kebab-case pour les fichiers, PascalCase pour les composants
- Toujours utiliser des hooks personnalisés pour la logique métier (ex: `useBiens`, `useContacts`)
- Les appels Supabase se font UNIQUEMENT dans les hooks, jamais dans les composants
- Les types TypeScript sont définis dans `/types/database.ts` (généré depuis Supabase)
- Les constantes métier sont dans `/constants/metier.ts`
- Toujours gérer les états de chargement et d'erreur
- Commentaires en français pour la logique métier, anglais pour le code technique
## Client PocketBase — pattern obligatoire
// /services/pocketbase.ts — singleton, importer partout
import PocketBase from 'pocketbase';
export const pb = new PocketBase(process.env.EXPO_PUBLIC_PB_URL);
## Vocabulaire métier (utiliser ces termes précis)
- **Bien** : propriété immobilière prospectée ou acquise
- **Piste** : bien en cours d'analyse, pas encore d'offre
- **Dossier** : bien avec offre en cours ou acte signé
- **Fiche bien** : écran de détail d'un bien
- **Compromis** : avant-contrat de vente (SPC)
- **Acte** : acte authentique de vente chez notaire
- **Portage** : période entre achat et revente (coût = intérêts + taxes)
- **Marge brute** : prix revente - prix achat - travaux - frais notaire achat
- **Marge nette** : marge brute - frais de portage - frais d'agence vente - impôts
- **DPE** : Diagnostic de Performance Énergétique
- **Surface habitable** : surface loi Carrez pour appartements
- **Marchand de biens** = le user, l'utilisateur de cette app
## Collections PocketBase (toutes créées via migration)
etapes_pipeline, contacts, biens, analyses_financieres,
visites, taches, notes_biens, documents_biens, devis_travaux
## Modules de l'application
1. **Prospection** : pipeline Kanban des biens (piste → analyse → offre → compromis → acte → revente)
2. **Annuaire** : contacts métier (notaires, artisans, banquiers, agents immo)
3. **Fiches biens** : dossier complet par bien (photos, docs, historique)
4. **Calculateur** : analyse de rentabilité financière
5. **Visites** : compte-rendus de visites avec check-list
6. **Travaux** : suivi de chantier et devis
7. **Administratif** : documents, délais légaux, alertes
8. **Agenda** : tâches et rappels liés aux biens
9. **Dashboard** : vue globale et KPIs
## Règles de code
- TypeScript strict, jamais de any
- Appels PocketBase UNIQUEMENT dans les hooks (/hooks/)
- Jamais de nouvelle instance PocketBase, toujours importer pb
- Commentaires métier en français, code en anglais
- Gérer loading + erreur partout
## Structure des dossiers
```
/app → écrans (Expo Router)
/(tabs) → navigation principale
/prospection
/annuaire
/agenda
/dashboard
/bien/[id] → fiche bien
/visite/[id] → rapport de visite
/contact/[id] → fiche contact
/components → composants réutilisables
/ui → composants génériques (Button, Card, Input...)
/biens → composants spécifiques aux biens
/visites → composants spécifiques aux visites
/hooks → hooks personnalisés
/services → appels API (Supabase, Anthropic)
/supabase.ts → client Supabase
/ai.ts → appels Claude API
/types → types TypeScript
/constants → constantes et configuration
/utils → fonctions utilitaires
```
## Vocabulaire métier
- Bien : propriété immobilière prospectée ou acquise
- Piste : bien en phase d'analyse
- Portage : période entre achat et revente
- Marge brute : prix revente - prix achat - travaux - frais notaire
- Marge nette : marge brute - portage - frais agence - impôts
## Variables d'environnement nécessaires
```
EXPO_PUBLIC_SUPABASE_URL=
EXPO_PUBLIC_SUPABASE_ANON_KEY=
ANTHROPIC_API_KEY= ← côté serveur uniquement, jamais exposé côté client
```
## Formules financières
frais_notaire = prix_achat * 0.075 (ancien) ou * 0.02 (neuf)
frais_portage_total = (prix_achat * taux_credit/100/12 + taxe_fonciere/12 + charges) * duree_mois
travaux_total = budget_travaux * (1 + reserve_pct/100)
prix_revient = prix_achat + frais_notaire + frais_agence_achat + travaux_total + frais_portage_total
marge_brute = prix_revente - prix_revient
marge_nette = marge_brute - (prix_revente * frais_agence_vente_pct/100) - (marge_brute * taux_impot/100)
## Règles de sécurité importantes
- La clé API Anthropic ne doit JAMAIS être dans le code client
- Créer une Supabase Edge Function pour les appels IA
- Row Level Security (RLS) activé sur toutes les tables Supabase
- Les photos et docs sont dans des buckets Supabase privés
## Calculs financiers — formules exactes
```
frais_notaire_achat = prix_achat * 0.075 (ancien) ou * 0.02 (neuf)
prix_revient = prix_achat + frais_notaire_achat + travaux + frais_portage
marge_brute = prix_revente_cible - prix_revient
frais_portage_mensuel = (prix_achat * taux_credit / 12) + taxe_fonciere_mensuelle
taux_marge_brute = marge_brute / prix_revente_cible * 100
```
## Structure dossiers
/docker → docker-compose dev + prod
/pocketbase
/pb_data → données (dans .gitignore)
/pb_hooks → hooks JS côté serveur (IA)
/pb_migrations → migrations auto au démarrage
/app → code Expo React Native
/app → écrans Expo Router
/components → composants UI
/hooks → hooks métier
/services → pocketbase.ts
/types → types TypeScript
/constants → constantes métier