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 ( |
Soft delete |
Oui ( |
Index principaux |
|
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 ( |
Soft delete |
Oui ( |
Index principaux |
|
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 ( |
Soft delete |
Non |
Index principaux |
|
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 ( |
Soft delete |
Non (immuable) |
Index principaux |
|
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 ( |
Soft delete |
Non |
Index principaux |
|
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 ( |
Soft delete |
Non |
Index principaux |
|
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é
-
company + article + depotest unique dansstocks— un seul enregistrement de niveau par triplet. -
Les
StockMovementsont immuables — ils constituent le ledger de traçabilité. -
qty_available = qty_physical - qty_reserved. -
La validation d’un inventaire génère automatiquement des
StockMovementet desStockInventoryAdjustment.