Collections stocks

Les sous-collections de stocks couvrent l’ensemble de la gestion physique : dépôts, adresses, niveaux par article, lots, mouvements (ledger), réservations, commandes en attente, transferts inter-dépôts et inventaires.

Collection stock_depots

Dépôts de stockage d’un tenant.

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Oui (is_active)

Index principaux

company + code (unique), company + is_active, company + is_default

Schéma

interface StockDepot {
  _id: ObjectId;
  company: ObjectId;
  code: string;
  name: string;
  type: "depot" | "vitrine" | "consignation" | "transit";
  address?: {
    street: string;
    city: string;
    zip: string;
    country: string;
  };
  timezone?: string;
  manager?: ObjectId;           // ref: User
  is_default: boolean;          // défaut : false
  is_active: boolean;           // défaut : true
  is_virtual: boolean;          // défaut : false
  allows_negative_stock: boolean;
  managed_by: "warehouse" | "garage" | "distributor";
  capacity?: {
    max_references: number;
    surface_m2: number;
  };
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_addresses

Adresses de rangement au sein d’un dépôt (zone, allée, rayon, rangée, case).

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Oui (is_active)

Index principaux

depot + code (unique), depot + type + is_active, company

Schéma

interface StockAddress {
  _id: ObjectId;
  company: ObjectId;
  depot: ObjectId;
  code: string;
  zone: string;
  aisle: string;
  rack: string;
  row: string;
  cell: string;
  type: "picking" | "reserve" | "reception" | "expedition" | "quarantine";
  is_active: boolean;
  is_blocked: boolean;
  block_reason?: string;
  constraints?: {
    max_weight_kg: number;
    max_height_cm: number;
    max_volume_cm3: number;
  };
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stocks

Niveaux de stock par article et dépôt.

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Non

Index principaux

company + article + depot (unique), article + depot, company + depot

Schéma

interface Stock {
  _id: ObjectId;
  company: ObjectId;
  article: ObjectId;
  depot: ObjectId;
  address?: ObjectId;
  qty_physical: number;         // stock physique réel
  qty_available: number;        // stock disponible (physique - réservé)
  qty_reserved: number;         // quantité réservée (commandes confirmées)
  qty_ordered: number;          // quantité commandée en attente de réception
  unit: "pcs" | "kg" | "g" | "l" | "ml" | "m" | "box";
  lot?: string;
  serial?: string;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_batches

Lots de réception (traçabilité DLC / date de réception / coût).

Schéma

interface StockBatch {
  _id: ObjectId;
  company: ObjectId;
  stock: ObjectId;
  article: ObjectId;
  batch_number: string;
  qty: number;
  expiry_date?: Date;
  reception_date?: Date;
  supplier?: ObjectId;
  cost_price?: number;
  is_active: boolean;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Index : stock, article + batch_number, expiry_date

Collection stock_movements

Ledger immuable de tous les mouvements de stock.

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Non (immuable)

Index principaux

stock + created_at desc, article + depot, ref_doc_type + ref_doc_id

Schéma

interface StockMovement {
  _id: ObjectId;
  company: ObjectId;
  stock: ObjectId;
  article: ObjectId;
  depot: ObjectId;
  address?: ObjectId;
  type: "in" | "out" | "transfer" | "adjustment" | "reservation" | "return";
  reason: "purchase" | "sale" | "return" | "adjustment" | "transfer" | "inventory";
  qty: number;
  qty_before: number;           // stock avant mouvement
  qty_after: number;            // stock après mouvement
  unit_cost?: number;
  ref_doc_type?: "order" | "transfer" | "inventory" | "adjustment";
  ref_doc_id?: ObjectId;
  batch?: ObjectId;
  note?: string;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_reservations

Réservations de stock liées à des commandes ou devis.

Schéma

interface StockReservation {
  _id: ObjectId;
  company: ObjectId;
  stock: ObjectId;
  article: ObjectId;
  depot: ObjectId;
  ref_doc_type: "order" | "quote";
  ref_doc_id: ObjectId;
  qty_reserved: number;
  status: "active" | "released" | "consumed";
  expires_at?: Date;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Index : stock + status, ref_doc_type + ref_doc_id, expires_at

Collection stock_backorders

Articles en rupture attendant un réapprovisionnement.

Schéma

interface StockBackorder {
  _id: ObjectId;
  company: ObjectId;
  article: ObjectId;
  depot: ObjectId;
  ref_doc_type: "order";
  ref_doc_id: ObjectId;
  qty_requested: number;
  qty_pending: number;
  status: "pending" | "partial" | "fulfilled" | "cancelled";
  expected_date?: Date;
  supplier_order_id?: ObjectId;
  note?: string;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_transfers

Transferts de stock entre dépôts.

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Non

Index principaux

company + number (unique), company + status, depot_from, depot_to

Schéma

interface StockTransfer {
  _id: ObjectId;
  company: ObjectId;
  number: string;
  depot_from: ObjectId;
  depot_to: ObjectId;
  status: "draft" | "validated" | "in_transit" | "received" | "cancelled";
  expected_date?: Date;
  shipped_at?: Date;
  received_at?: Date;
  note?: string;
  validated_by?: ObjectId;
  validated_at?: Date;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_transfer_lines

Lignes d’un transfert inter-dépôts.

Schéma

interface StockTransferLine {
  _id: ObjectId;
  company: ObjectId;
  transfer: ObjectId;
  article: ObjectId;
  batch?: ObjectId;
  address_from?: ObjectId;
  address_to?: ObjectId;
  qty_requested: number;
  qty_shipped: number;
  qty_received: number;
  unit: string;
  note?: string;
  created_at: Date;
  updated_at: Date;
}

Collection stock_inventories

Sessions d’inventaire (complet ou partiel).

Métadonnées

Tenant scope

Oui (company requis)

Soft delete

Non

Index principaux

company + number (unique), company + depot + status

Schéma

interface StockInventory {
  _id: ObjectId;
  company: ObjectId;
  number: string;
  depot: ObjectId;
  type: "full" | "partial";
  status: "draft" | "in_progress" | "completed" | "cancelled";
  scope_zones?: string[];
  scope_articles?: ObjectId[];
  started_at?: Date;
  completed_at?: Date;
  note?: string;
  created_by?: ObjectId;
  updated_by?: ObjectId;
  created_at: Date;
  updated_at: Date;
}

Collection stock_inventory_lines

Lignes de comptage d’un inventaire.

Schéma

interface StockInventoryLine {
  _id: ObjectId;
  company: ObjectId;
  inventory: ObjectId;
  article: ObjectId;
  address?: ObjectId;
  batch?: ObjectId;
  qty_theoretical: number;      // quantité attendue d'après le système
  qty_counted: number;          // quantité réellement comptée
  qty_gap: number;              // écart (counted - theoretical)
  status: "pending" | "counted" | "validated";
  counted_by?: ObjectId;
  counted_at?: Date;
  note?: string;
  created_at: Date;
  updated_at: Date;
}

Collection stock_inventory_adjustments

Ajustements générés lors de la validation d’un inventaire.

Schéma

interface StockInventoryAdjustment {
  _id: ObjectId;
  company: ObjectId;
  inventory: ObjectId;
  inventory_line: ObjectId;
  article: ObjectId;
  depot: ObjectId;
  address?: ObjectId;
  batch?: ObjectId;
  qty_before: number;
  qty_after: number;
  qty_gap: number;
  unit_cost?: number;
  total_value_impact?: number;
  movement?: ObjectId;          // ref: StockMovement généré
  validated_by?: ObjectId;
  validated_at?: Date;
  note?: string;
  created_at: Date;
  updated_at: Date;
}

Règles d’intégrité

  1. company + article + depot est unique dans stocks — un seul enregistrement de niveau par triplet.

  2. Les StockMovement sont immuables — ils constituent le ledger de traçabilité.

  3. qty_available = qty_physical - qty_reserved.

  4. La validation d’un inventaire génère automatiquement des StockMovement et des StockInventoryAdjustment.

Features qui consomment ces collections

  • Gestion des stocks (STK)

  • Recherche articles avec stock (CAT, via agrégation par dépôt)

  • Commandes (SAL, réservations automatiques)

  • Réapprovisionnement (SUP, backorders)