<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Historique des mouvements de stock.
* Chaque enregistrement représente une modification (entrée, sortie, ajustement...).
*
* @ORM\Entity(repositoryClass="App\Repository\StockMovementRepository")
* @ORM\Table(name="stock_movement")
*/
class StockMovement
{
/**
* Identifiant unique du mouvement.
* Auto-incrémenté par la base.
*
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private int $id;
/**
* Identifiant du produit concerné.
* Permet de regrouper les mouvements par produit.
*
* @ORM\Column(type="integer", nullable=true)
*/
private ?int $produit_id = null;
/**
* Identifiant de la déclinaison du produit.
* Null si le mouvement concerne un produit sans déclinaison.
*
* @ORM\Column(type="integer", nullable=true)
*/
private ?int $declination_produit_id = null;
/**
* Nom ou code de l'entrepôt concerné.
* Exemple : "Principal", "Nabeul", "Sous-sol".
*
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $storehouse = null;
/**
* Date et heure du mouvement.
*
* @ORM\Column(type="datetime")
*/
private \DateTimeInterface $created_at;
/**
* Type de source à l’origine du mouvement :
* - "manual" → modale manuelle
* - "commande" → commande client
* - "reception" → entrée fournisseur
* - "retour" → retour client
* - "inventaire" → ajustement inventaire
* - "correction" → correction administrative
*
* @ORM\Column(type="string", length=50, nullable=true)
*/
private ?string $source_type = null;
/**
* Identifiant de la source du mouvement (facultatif).
* Ex : id du document (commande, réception, retour...).
*
* @ORM\Column(type="integer", nullable=true)
*/
private ?int $source_id = null;
/**
* Variation du stock disponible (qté entrée/sortie).
* Exemples : +5 pour une entrée, -3 pour une sortie.
*
* @ORM\Column(type="decimal", precision=18, scale=3)
*/
private string $delta_available;
/**
* Variation du stock réservé (commandes en attente).
* Exemples : +2 quand une commande réserve du stock, -2 quand elle est annulée.
*
* @ORM\Column(type="decimal", precision=18, scale=3, options={"default":"0.000"})
*/
private string $delta_reserved = '0.000';
/**
* Stock disponible avant le mouvement.
*
* @ORM\Column(type="decimal", precision=18, scale=3)
*/
private string $qty_before_available;
/**
* Stock disponible après le mouvement.
*
* @ORM\Column(type="decimal", precision=18, scale=3)
*/
private string $qty_after_available;
/**
* Stock réservé avant le mouvement.
*
* @ORM\Column(type="decimal", precision=18, scale=3)
*/
private string $qty_before_reserved;
/**
* Stock réservé après le mouvement.
*
* @ORM\Column(type="decimal", precision=18, scale=3)
*/
private string $qty_after_reserved;
/**
* Motif du mouvement (sélectionné depuis la modale).
* Exemples : "ajustement", "perte", "retour_client", "transfert".
*
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $reason = null;
/**
* Identifiant de l’utilisateur qui a effectué le mouvement.
*
* @ORM\Column(type="integer", nullable=true)
*/
private ?int $actor_id = null;
/**
* Informations complémentaires stockées en JSON.
* Peut contenir :
* - note ou commentaire
* - référence produit / déclinaison
* - IP ou origine UI
*
* @ORM\Column(type="text", nullable=true)
*/
private ?string $note = null;
/* ========================== GETTERS / SETTERS ========================== */
public function getId(): ?int { return $this->id; }
public function getProduitId(): ?int { return $this->produit_id; }
public function setProduitId(?int $produit_id): self { $this->produit_id = $produit_id; return $this; }
public function getDeclinationProduitId(): ?int { return $this->declination_produit_id; }
public function setDeclinationProduitId(?int $declination_produit_id): self { $this->declination_produit_id = $declination_produit_id; return $this; }
public function getStorehouse(): ?string { return $this->storehouse; }
public function setStorehouse(?string $storehouse): self { $this->storehouse = $storehouse; return $this; }
public function getCreatedAt(): \DateTimeInterface { return $this->created_at; }
public function setCreatedAt(\DateTimeInterface $created_at): self { $this->created_at = $created_at; return $this; }
public function getSourceType(): ?string { return $this->source_type; }
public function setSourceType(?string $source_type): self { $this->source_type = $source_type; return $this; }
public function getSourceId(): ?int { return $this->source_id; }
public function setSourceId(?int $source_id): self { $this->source_id = $source_id; return $this; }
public function getDeltaAvailable(): string { return $this->delta_available; }
public function setDeltaAvailable(string $delta_available): self { $this->delta_available = $delta_available; return $this; }
public function getDeltaReserved(): string { return $this->delta_reserved; }
public function setDeltaReserved(string $delta_reserved): self { $this->delta_reserved = $delta_reserved; return $this; }
public function getQtyBeforeAvailable(): string { return $this->qty_before_available; }
public function setQtyBeforeAvailable(string $qty_before_available): self { $this->qty_before_available = $qty_before_available; return $this; }
public function getQtyAfterAvailable(): string { return $this->qty_after_available; }
public function setQtyAfterAvailable(string $qty_after_available): self { $this->qty_after_available = $qty_after_available; return $this; }
public function getQtyBeforeReserved(): string { return $this->qty_before_reserved; }
public function setQtyBeforeReserved(string $qty_before_reserved): self { $this->qty_before_reserved = $qty_before_reserved; return $this; }
public function getQtyAfterReserved(): string { return $this->qty_after_reserved; }
public function setQtyAfterReserved(string $qty_after_reserved): self { $this->qty_after_reserved = $qty_after_reserved; return $this; }
public function getReason(): ?string { return $this->reason; }
public function setReason(?string $reason): self { $this->reason = $reason; return $this; }
public function getActorId(): ?int { return $this->actor_id; }
public function setActorId(?int $actor_id): self { $this->actor_id = $actor_id; return $this; }
public function getNote(): ?string { return $this->note; }
public function setNote(?string $note): self { $this->note = $note; return $this; }
}