Modèles de Données
Documentation des modèles de données de Company Manager.
Modèles de Données
Documentation complète des modèles de données de Company Manager.
Schéma Prisma
Tenant
model Tenant {
id String @id @default(dbgenerated("uuid_generate_v7()"))
name String
domain String @unique
status String @default("active")
settings Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
users User[]
orders Order[]
customers Customer[]
}User
model User {
id String @id @default(dbgenerated("uuid_generate_v7()"))
email String @unique
name String?
role Role @default(USER)
status String @default("active")
tenantId String
tenant Tenant @relation(fields: [tenantId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
orders Order[]
accessLogs AccessLog[]
}
enum Role {
ADMIN
MANAGER
USER
}Customer
model Customer {
id String @id @default(dbgenerated("uuid_generate_v7()"))
name String
email String?
type String @default("individual")
status String @default("active")
tenantId String
tenant Tenant @relation(fields: [tenantId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
contacts Contact[]
orders Order[]
addresses Address[]
}
model Contact {
id String @id @default(dbgenerated("uuid_generate_v7()"))
firstName String
lastName String
email String?
phone String?
role String?
isPrimary Boolean @default(false)
customerId String
customer Customer @relation(fields: [customerId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Address {
id String @id @default(dbgenerated("uuid_generate_v7()"))
type String @default("billing")
street String
city String
state String?
postalCode String
country String
customerId String
customer Customer @relation(fields: [customerId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Order
model Order {
id String @id @default(dbgenerated("uuid_generate_v7()"))
reference String @unique
status String @default("draft")
customerId String
customer Customer @relation(fields: [customerId], references: [id])
userId String
user User @relation(fields: [userId], references: [id])
tenantId String
tenant Tenant @relation(fields: [tenantId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
items OrderItem[]
payments Payment[]
shipping ShippingInfo?
billing BillingInfo?
events OrderEvent[]
}
model OrderItem {
id String @id @default(dbgenerated("uuid_generate_v7()"))
productId String
quantity Int
price Decimal
orderId String
order Order @relation(fields: [orderId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model ShippingInfo {
id String @id @default(dbgenerated("uuid_generate_v7()"))
address String
method String
cost Decimal?
orderId String @unique
order Order @relation(fields: [orderId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model BillingInfo {
id String @id @default(dbgenerated("uuid_generate_v7()"))
address String
method String
orderId String @unique
order Order @relation(fields: [orderId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model OrderEvent {
id String @id @default(dbgenerated("uuid_generate_v7()"))
type String
data Json?
orderId String
order Order @relation(fields: [orderId], references: [id])
createdAt DateTime @default(now())
}Payment
model Payment {
id String @id @default(dbgenerated("uuid_generate_v7()"))
amount Decimal
currency String
status String
provider String
providerRef String?
orderId String
order Order @relation(fields: [orderId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Audit
model AccessLog {
id String @id @default(dbgenerated("uuid_generate_v7()"))
userId String
user User @relation(fields: [userId], references: [id])
action String
resource String
success Boolean
metadata Json?
timestamp DateTime @default(now())
}
model SyncError {
id String @id @default(dbgenerated("uuid_generate_v7()"))
entityId String
entityType String
error String
retryCount Int @default(0)
timestamp DateTime @default(now())
}Types TypeScript
Interfaces Communes
// types/common.ts
interface BaseEntity {
id: string;
createdAt: Date;
updatedAt: Date;
}
interface TenantEntity extends BaseEntity {
tenantId: string;
}
interface AuditableEntity extends TenantEntity {
createdBy: string;
updatedBy: string;
}Types Métier
// types/business.ts
interface CustomerData extends TenantEntity {
name: string;
email?: string;
type: "individual" | "company";
status: "active" | "inactive";
contacts: Contact[];
addresses: Address[];
}
interface OrderData extends TenantEntity {
reference: string;
status: OrderStatus;
customer: Customer;
items: OrderItem[];
shipping?: ShippingInfo;
billing?: BillingInfo;
payments: Payment[];
total: number;
tax: number;
}
type OrderStatus =
| "draft"
| "pending_payment"
| "paid"
| "processing"
| "shipped"
| "delivered"
| "cancelled";Validation
Schémas Zod
// schemas/validation.ts
import { z } from "zod/v4";
export const customerSchema = z.object({
name: z.string().min(2),
email: z.string().email().optional(),
type: z.enum(["individual", "company"]),
status: z.enum(["active", "inactive"]),
});
export const orderSchema = z.object({
customerId: z.string(),
items: z.array(
z.object({
productId: z.string(),
quantity: z.number().positive(),
price: z.number().positive(),
})
),
shipping: z.object({
address: z.string(),
method: z.string(),
}),
billing: z.object({
address: z.string(),
method: z.string(),
}),
});Migrations
Exemple de Migration
-- Migration: Add customer type
CREATE TYPE customer_type AS ENUM ('individual', 'company');
ALTER TABLE customers
ADD COLUMN type customer_type NOT NULL DEFAULT 'individual';
-- Migration: Add order status
CREATE TYPE order_status AS ENUM (
'draft',
'pending_payment',
'paid',
'processing',
'shipped',
'delivered',
'cancelled'
);
ALTER TABLE orders
ADD COLUMN status order_status NOT NULL DEFAULT 'draft';Bonnes Pratiques
Base de Données
- Utilisation d'index appropriés
- Contraintes d'intégrité
- Transactions pour les opérations complexes
- Soft delete plutôt que delete
Validation
- Validation côté serveur systématique
- Schémas de validation stricts
- Sanitization des entrées
- Gestion des erreurs explicite
Performance
- Optimisation des requêtes
- Pagination des résultats
- Eager loading approprié
- Caching des données fréquentes