// Schéma de base de données pour la Gestion de Magasin d'Optique generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } // ============================================ // ÉNUMÉRATIONS // ============================================ enum StatutVente { INITIEE PAYEE ANNULEE REMBOURSEE } enum StatutAchat { BROUILLON VALIDE } enum ModePaiement { ESPECES CARTE CHEQUE VIREMENT BON_CAISSE } enum TypeFichier { ORDONNANCE FACTURE_ACHAT FACTURE_VENTE IMAGE_PRODUIT } enum RoleEmploye { VENDEUR RESPONSABLE ADMIN } enum TypeMonture { COMPLET NATUREL CERCLAGE } enum TypeVerre { SIMPLE BIFOCAL PROGRESSIF } enum StatutAtelier { EN_ATTENTE EN_COURS TERMINE PRET RETIRE } // ============================================ // MODÈLES PRINCIPAUX // ============================================ // Employé du magasin model Employe { id String @id @default(cuid()) email String @unique nom String prenom String role RoleEmploye @default(VENDEUR) actif Boolean @default(true) motDePasse String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations ventes Vente[] facturesAchat FactureAchat[] retours Retour[] paiements Paiement[] patients Patient[] } // Client / Patient model Client { id String @id @default(cuid()) nom String prenom String email String? telephone String @unique adresse String? ville String? codePostal String? dateNaissance DateTime? notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations patients Patient[] ventes Vente[] } // Patient avec données de vision model Patient { id String @id @default(cuid()) clientId String dateCreation DateTime @default(now()) odSphere Float? // Œil droit - Sphère odCylindre Float? // Œil droit - Cylindre odAxe Int? // Œil droit - Axe ogSphere Float? // Œil gauche - Sphère ogCylindre Float? // Œil gauche - Cylindre ogAxe Int? // Œil gauche - Axe addition Float? // Addition pd Float? // Distance pupillaire hauteur Float? // Hauteur notes String? employeId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations client Client @relation(fields: [clientId], references: [id], onDelete: Cascade) employe Employe? @relation(fields: [employeId], references: [id]) ordonnances Ordonnance[] } // Ordonnance (prescription médicale) model Ordonnance { id String @id @default(cuid()) patientId String numero String @unique dateEmission DateTime medecin String? notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade) fichiers Fichier[] } // Fournisseur model Fournisseur { id String @id @default(cuid()) nom String contact String? email String? telephone String? adresse String? ville String? codePostal String? notes String? actif Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations facturesAchat FactureAchat[] produits Produit[] } // Produit (lunettes, lentilles, accessoires, verres) model Produit { id String @id @default(cuid()) reference String @unique designation String categorie String // MONTURE, VERRE, LENTILLE, ACCESSOIRE fournisseurId String? prixAchatHT Float prixVenteTTC Float tva Float @default(20.0) stock Int @default(0) stockMin Int @default(5) emplacement String? // Rayon, étagère marque String? typeMonture TypeMonture? typeVerre TypeVerre? indice Float? // Indice de réfraction (1.5, 1.6, etc.) materiau String? // Acétate, métal, titane, etc. couleur String? dimensions String? // Largeur, pont, branches (ex: 54-18-140) description String? codeBarre String? @unique actif Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations fournisseur Fournisseur? @relation(fields: [fournisseurId], references: [id]) ligneVente LigneVente[] ligneFacture LigneFacture[] fichiers Fichier[] } // Vente model Vente { id String @id @default(cuid()) clientId String? numero String @unique date DateTime @default(now()) statut StatutVente @default(INITIEE) statutAtelier StatutAtelier @default(EN_ATTENTE) montantHT Float montantTVA Float montantTTC Float remise Float @default(0) notes String? employeId String? dateAtelier DateTime? dateRetrait DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations client Client? @relation(fields: [clientId], references: [id]) employe Employe? @relation(fields: [employeId], references: [id]) lignes LigneVente[] paiements Paiement[] retours Retour[] fichiers Fichier[] } // Ligne de vente model LigneVente { id String @id @default(cuid()) venteId String produitId String quantite Int @default(1) prixUnitaireHT Float prixUnitaireTTC Float remise Float @default(0) montantHT Float montantTTC Float createdAt DateTime @default(now()) // Relations vente Vente @relation(fields: [venteId], references: [id], onDelete: Cascade) produit Produit @relation(fields: [produitId], references: [id]) } // Paiement model Paiement { id String @id @default(cuid()) venteId String mode ModePaiement montant Float date DateTime @default(now()) reference String? notes String? employeId String? createdAt DateTime @default(now()) // Relations vente Vente @relation(fields: [venteId], references: [id], onDelete: Cascade) employe Employe? @relation(fields: [employeId], references: [id]) } // Facture d'achat model FactureAchat { id String @id @default(cuid()) fournisseurId String numero String @unique date DateTime @default(now()) dateReception DateTime? statut StatutAchat @default(BROUILLON) montantHT Float montantTVA Float montantTTC Float notes String? employeId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations fournisseur Fournisseur @relation(fields: [fournisseurId], references: [id]) employe Employe? @relation(fields: [employeId], references: [id]) lignes LigneFacture[] fichiers Fichier[] } // Ligne de facture d'achat model LigneFacture { id String @id @default(cuid()) factureId String produitId String quantite Int @default(1) prixUnitaireHT Float tauxTVA Float @default(20.0) montantHT Float montantTVA Float montantTTC Float createdAt DateTime @default(now()) // Relations facture FactureAchat @relation(fields: [factureId], references: [id], onDelete: Cascade) produit Produit @relation(fields: [produitId], references: [id]) } // Retour / SAV model Retour { id String @id @default(cuid()) venteId String? numero String @unique date DateTime @default(now()) motif String montant Float notes String? employeId String? createdAt DateTime @default(now()) // Relations vente Vente? @relation(fields: [venteId], references: [id]) employe Employe? @relation(fields: [employeId], references: [id]) } // Fichier / Document model Fichier { id String @id @default(cuid()) nom String type TypeFichier url String taille Int mimeType String createdAt DateTime @default(now()) // Relations - Optionnelles selon le type ordonnanceId String? venteId String? factureAchatId String? produitId String? ordonnance Ordonnance? @relation(fields: [ordonnanceId], references: [id]) vente Vente? @relation(fields: [venteId], references: [id]) factureAchat FactureAchat? @relation(fields: [factureAchatId], references: [id]) produit Produit? @relation(fields: [produitId], references: [id]) }