194 lines
6.7 KiB
Markdown
194 lines
6.7 KiB
Markdown
# GUIDE COMPLET — Prompts Cursor
|
|
# App Marchand de Biens — Expo + PocketBase
|
|
|
|
---
|
|
|
|
## PROMPT 1 — Fondation (Setup + Auth + Navigation)
|
|
|
|
Lis .cursorrules et AGENTS.md.
|
|
|
|
Je crée une app React Native Expo pour marchand de biens immobiliers.
|
|
Backend : PocketBase sur http://localhost:8090 (déjà lancé, collections déjà créées).
|
|
|
|
Collections existantes dans PocketBase :
|
|
users, etapes_pipeline, contacts, biens, analyses_financieres,
|
|
visites, taches, notes_biens, documents_biens, devis_travaux
|
|
|
|
PARTIE A — Initialisation :
|
|
Dans le dossier actuel, initialise l'app Expo :
|
|
npx create-expo-app@latest app --template tabs
|
|
cd app
|
|
|
|
Installe ces dépendances dans app/ :
|
|
pocketbase
|
|
@tanstack/react-query
|
|
zustand
|
|
nativewind
|
|
tailwindcss
|
|
@react-native-async-storage/async-storage
|
|
expo-image-picker
|
|
expo-document-picker
|
|
expo-haptics
|
|
|
|
PARTIE B — Fichier .env.local à la racine de app/ :
|
|
EXPO_PUBLIC_PB_URL=http://localhost:8090
|
|
|
|
PARTIE C — Service PocketBase app/services/pocketbase.ts :
|
|
- Client singleton PocketBase
|
|
- Persistance session avec AsyncStorage
|
|
- Export : pb, getCurrentUserId(), isAuthenticated()
|
|
|
|
PARTIE D — Types TypeScript app/types/collections.ts :
|
|
Interfaces pour toutes les collections (étendent RecordModel de pocketbase) :
|
|
UserRecord, BienRecord, ContactRecord, VisiteRecord, TacheRecord,
|
|
EtapePipelineRecord, AnalyseFinanciereRecord, NoteRecord, DocumentRecord, DevisRecord
|
|
+ types BienCreate, BienUpdate (Omit + Partial)
|
|
|
|
PARTIE E — Constantes app/constants/metier.ts :
|
|
ETAPES_DEFAUT (9 étapes avec couleurs)
|
|
CATEGORIES_CONTACTS avec labels français
|
|
TYPES_BIENS avec labels français
|
|
AVIS_VISITE avec labels et couleurs
|
|
|
|
PARTIE F — Auth :
|
|
app/context/AuthContext.tsx : login, logout, user courant, redirect auto
|
|
app/app/auth/login.tsx : email + password, couleur primaire #1D4ED8
|
|
app/app/auth/register.tsx : email, password, nom, prénom
|
|
|
|
PARTIE G — Navigation :
|
|
5 onglets dans app/app/(tabs)/ :
|
|
- index.tsx → Dashboard (icône grid)
|
|
- biens.tsx → Biens (icône home)
|
|
- visites.tsx → Visites (icône clipboard)
|
|
- contacts.tsx → Contacts (icône people)
|
|
- agenda.tsx → Agenda (icône calendar)
|
|
|
|
Écrans de détail :
|
|
- app/bien/[id].tsx
|
|
- app/bien/nouveau.tsx
|
|
- app/contact/[id].tsx
|
|
- app/visite/[id].tsx
|
|
- app/calculateur/[bienId].tsx
|
|
|
|
Chaque écran de détail = placeholder avec titre pour l'instant.
|
|
FAB "+" sur les onglets Biens et Contacts.
|
|
|
|
L'app doit se lancer avec : cd app && npx expo start
|
|
L'auth doit fonctionner avec un compte créé sur PocketBase.
|
|
Mets à jour AGENTS.md quand c'est terminé.
|
|
|
|
---
|
|
|
|
## PROMPT 2 — Pipeline + Fiche Bien + Calculateur
|
|
## Lancer SEULEMENT après que le Prompt 1 tourne
|
|
|
|
Lis .cursorrules et AGENTS.md.
|
|
L'auth et la navigation fonctionnent. Je construis le cœur de l'app.
|
|
|
|
HOOK app/hooks/useEtapes.ts :
|
|
- fetchEtapes() : étapes du user triées par ordre
|
|
- initEtapesDefaut() : crée les 9 étapes si l'user n'en a pas encore
|
|
|
|
HOOK app/hooks/useBiens.ts :
|
|
- fetchBiens(filters?) : avec expand etape
|
|
- fetchBienDetail(id) : avec expand etape, visites, notes
|
|
- createBien(data), updateBien(id, data), deleteBien(id)
|
|
- moveBienToEtape(bienId, etapeId)
|
|
|
|
ONGLET BIENS app/app/(tabs)/biens.tsx :
|
|
Switch Kanban / Liste :
|
|
MODE KANBAN : ScrollView horizontal, une colonne par étape
|
|
Header colonne : nom + couleur + nombre de biens
|
|
Card bien : titre, ville, surface, prix achat formaté, badge priorité
|
|
Long press → bottom sheet : changer étape | supprimer
|
|
MODE LISTE : FlatList triable, barre de recherche
|
|
FAB "+" → /bien/nouveau
|
|
|
|
FORMULAIRE app/app/bien/nouveau.tsx :
|
|
3 étapes avec barre de progression :
|
|
1. type_bien, adresse, ville, code_postal
|
|
2. surface_habitable, nb_pieces, prix estimé, source, is_off_market
|
|
3. Résumé + Créer → PocketBase → redirect /bien/[id]
|
|
|
|
FICHE BIEN app/app/bien/[id].tsx :
|
|
Sections : Header | Infos | Finances | Visites | Notes | Documents
|
|
Auto-save notes debounce 500ms.
|
|
|
|
HOOK app/hooks/useAnalyse.ts :
|
|
- fetchAnalyse(bienId), saveAnalyse(bienId, data)
|
|
- calculateResults(data) : toutes les formules de .cursorrules
|
|
|
|
CALCULATEUR app/app/calculateur/[bienId].tsx :
|
|
Recalcul temps réel. Sections : Acquisition | Travaux | Portage | Revente
|
|
Résultats colorés : vert >15% | orange 8-15% | rouge <8%
|
|
Scénarios -10%/réaliste/+10%. Bouton Enregistrer.
|
|
|
|
Mets à jour AGENTS.md.
|
|
|
|
---
|
|
|
|
## PROMPT 3 — Contacts + Visites IA + Agenda + Dashboard
|
|
## Lancer SEULEMENT après que le Prompt 2 tourne
|
|
|
|
Lis .cursorrules et AGENTS.md.
|
|
Pipeline, fiche bien et calculateur fonctionnent.
|
|
|
|
CONTACTS app/app/(tabs)/contacts.tsx :
|
|
SectionList par catégorie, recherche live, appel direct Linking.openURL tel:
|
|
Fiche contact : coordonnées, biens associés, notes
|
|
|
|
VISITES app/app/(tabs)/visites.tsx :
|
|
Écran visite app/app/visite/[id].tsx avec 3 tabs :
|
|
Tab 1 Check-liste : 4 états par item (OK/Attention/Problème/Non vérifié)
|
|
Tab 2 Notes : zone texte + bouton photo
|
|
Tab 3 Estimation : sliders travaux, avis global, score 1-10
|
|
Bouton "Générer rapport IA" → pb.send('/api/generate-rapport') → affiche markdown
|
|
|
|
Hook serveur pocketbase/pb_hooks/generate_rapport.pb.js :
|
|
routerAdd("POST", "/api/generate-rapport", (c) => {
|
|
const info = $apis.requestInfo(c);
|
|
if (!info.authRecord) return c.json(401, {error: "Non autorisé"});
|
|
const { notes_brutes, checklist_reponses, bien_info } = info.data;
|
|
const response = $http.send({
|
|
url: "https://api.anthropic.com/v1/messages",
|
|
method: "POST",
|
|
headers: {
|
|
"x-api-key": $os.getenv("ANTHROPIC_API_KEY"),
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json"
|
|
},
|
|
body: JSON.stringify({
|
|
model: "claude-sonnet-4-20250514",
|
|
max_tokens: 1500,
|
|
messages: [{ role: "user", content: "Génère un compte-rendu de visite professionnel en français. Bien: " + JSON.stringify(bien_info) + " Notes: " + notes_brutes + " Checklist: " + JSON.stringify(checklist_reponses) }]
|
|
}),
|
|
timeout: 30
|
|
});
|
|
const result = JSON.parse(response.raw);
|
|
return c.json(200, { rapport: result.content[0].text });
|
|
}, $apis.requireRecordAuth());
|
|
|
|
AGENDA app/app/(tabs)/agenda.tsx :
|
|
Vue Aujourd'hui : En retard (rouge) + Aujourd'hui + Cette semaine
|
|
Card tâche : checkbox, titre, badge bien, swipe snooze/supprimer
|
|
Création : bottom sheet
|
|
|
|
DASHBOARD app/app/(tabs)/index.tsx :
|
|
Alertes urgentes | KPIs | Mini pipeline | Derniers biens | Tâches du jour
|
|
|
|
Mets à jour AGENTS.md : tous modules terminés.
|
|
|
|
---
|
|
|
|
## PROMPT DEBUG
|
|
Lis .cursorrules.
|
|
Erreur dans [MODULE] :
|
|
ERREUR : [message exact]
|
|
FICHIER : [nom]
|
|
Stack : Expo + PocketBase v0.23+. Diagnostique et corrige.
|
|
|
|
## PROMPT UI
|
|
Lis .cursorrules.
|
|
L'écran [NOM] fonctionne. Améliore l'UI pour usage pro en extérieur.
|
|
Couleurs : #1D4ED8 | #16A34A | #D97706 | #DC2626
|