@company-manager/docs

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

  1. Utilisation d'index appropriés
  2. Contraintes d'intégrité
  3. Transactions pour les opérations complexes
  4. Soft delete plutôt que delete

Validation

  1. Validation côté serveur systématique
  2. Schémas de validation stricts
  3. Sanitization des entrées
  4. Gestion des erreurs explicite

Performance

  1. Optimisation des requêtes
  2. Pagination des résultats
  3. Eager loading approprié
  4. Caching des données fréquentes