<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\DepenseRepository")
*/
class Depense
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=200, nullable=true)
*/
private $beneficiaire;
/**
* @ORM\Column(type="integer")
*/
private $montantdepense = 0;
/**
* @ORM\Column(type="text")
*/
private $descriptiondepense;
/**
* @ORM\Column(type="text")
*/
private $journaldepense;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $datecreationdepense;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $datemodificationdepense;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $datedepense;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $datesuppressiondepense;
/**
* @ORM\ManyToOne(targetEntity="Magasin")
* @ORM\JoinColumn(name="magasinid", referencedColumnName="id", nullable=true)
*/
private $magasinid;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="ajoutepar", referencedColumnName="id", nullable=true)
*/
private $ajoutepar;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="supprimepar", referencedColumnName="id", nullable=true)
*/
private $supprimepar;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="modifiepar", referencedColumnName="id", nullable=true)
*/
private $modifiepar;
/**
* @ORM\ManyToOne(targetEntity="Produit")
* @ORM\JoinColumn(name="produitid", referencedColumnName="id", nullable=true)
*/
private $produitid;
/**
* @ORM\ManyToOne(targetEntity="DepenseCategorie", inversedBy="depenses")
* @ORM\JoinColumn(name="categorieid", referencedColumnName="id", nullable=true)
*/
private $categorieid;
/**
* @ORM\ManyToOne(targetEntity="CashSession")
* @ORM\JoinColumn(name="cash_session_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $cashSession;
/**
* Relation vers la table de jointure DepenseVehicule.
* C'est DepenseVehicule.php qui déclare et possède la table depense_vehicule.
*
* @ORM\OneToMany(
* targetEntity="DepenseVehicule",
* mappedBy="depense",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
*/
private $depenseVehicules;
/**
* @ORM\OneToMany(targetEntity="DepenseFichier", mappedBy="depenseid", cascade={"persist","remove"})
*/
private $fichiers;
/**
* @ORM\OneToMany(targetEntity="DepenseCommentaire", mappedBy="depenseid", cascade={"persist","remove"})
*/
private $commentaires;
public function __construct()
{
$this->depenseVehicules = new ArrayCollection();
$this->fichiers = new ArrayCollection();
$this->commentaires = new ArrayCollection();
}
// ── Getters / Setters standards ───────────────────────────────────────────
public function getId(): ?int
{
return $this->id;
}
public function getBeneficiaire(): ?string
{
return $this->beneficiaire;
}
public function setBeneficiaire(?string $v): static
{
$this->beneficiaire = $v;
return $this;
}
public function getMontantdepense(): ?int
{
return $this->montantdepense;
}
public function setMontantdepense(int $v): static
{
$this->montantdepense = $v;
return $this;
}
public function getDescriptiondepense(): ?string
{
return $this->descriptiondepense;
}
public function setDescriptiondepense(string $v): static
{
$this->descriptiondepense = $v;
return $this;
}
public function getJournaldepense(): ?string
{
return $this->journaldepense;
}
public function setJournaldepense(string $v): static
{
$this->journaldepense = $v;
return $this;
}
public function getDatecreationdepense(): ?\DateTimeInterface
{
return $this->datecreationdepense;
}
public function setDatecreationdepense(?\DateTimeInterface $v): static
{
$this->datecreationdepense = $v;
return $this;
}
public function getDatedepense(): ?\DateTimeInterface
{
return $this->datedepense;
}
public function setDatedepense(?\DateTimeInterface $v): static
{
$this->datedepense = $v;
return $this;
}
public function getDatesuppressiondepense(): ?\DateTimeInterface
{
return $this->datesuppressiondepense;
}
public function setDatesuppressiondepense(?\DateTimeInterface $v): static
{
$this->datesuppressiondepense = $v;
return $this;
}
public function getDatemodificationdepense(): ?\DateTimeInterface
{
return $this->datemodificationdepense;
}
public function setDatemodificationdepense(?\DateTimeInterface $v): static
{
$this->datemodificationdepense = $v;
return $this;
}
public function getMagasinid(): ?Magasin
{
return $this->magasinid;
}
public function setMagasinid(?Magasin $v): static
{
$this->magasinid = $v;
return $this;
}
public function getAjoutepar(): ?User
{
return $this->ajoutepar;
}
public function setAjoutepar(?User $v): static
{
$this->ajoutepar = $v;
return $this;
}
public function getSupprimepar(): ?User
{
return $this->supprimepar;
}
public function setSupprimepar(?User $v): static
{
$this->supprimepar = $v;
return $this;
}
public function getModifiepar(): ?User
{
return $this->modifiepar;
}
public function setModifiepar(?User $v): static
{
$this->modifiepar = $v;
return $this;
}
public function getProduitid(): ?Produit
{
return $this->produitid;
}
public function setProduitid(?Produit $v): static
{
$this->produitid = $v;
return $this;
}
public function getCategorieid(): ?DepenseCategorie
{
return $this->categorieid;
}
public function setCategorieid(?DepenseCategorie $v): static
{
$this->categorieid = $v;
return $this;
}
public function getCashSession(): ?CashSession
{
return $this->cashSession;
}
public function setCashSession(?CashSession $v): static
{
$this->cashSession = $v;
return $this;
}
// ── MULTI-VÉHICULES ───────────────────────────────────────────────────────
public function getDepenseVehicules(): Collection
{
return $this->depenseVehicules;
}
public function addDepenseVehicule(DepenseVehicule $dv): static
{
if (!$this->depenseVehicules->contains($dv)) {
$this->depenseVehicules->add($dv);
$dv->setDepense($this);
}
return $this;
}
public function removeDepenseVehicule(DepenseVehicule $dv): static
{
$this->depenseVehicules->removeElement($dv);
return $this;
}
/**
* Raccourci pour Twig : retourne les Vehicule directement.
* Usage : DEPENSE.vehicules
*
* @return Vehicule[]
*/
public function getVehicules(): array
{
return array_values(array_filter(
$this->depenseVehicules
->map(fn(DepenseVehicule $dv) => $dv->getVehicule())
->toArray()
));
}
/**
* Synchronise la liste des véhicules depuis le formulaire.
*
* @param Vehicule[] $nouveauxVehicules
* @param User|null $user
*/
public function syncVehicules(array $nouveauxVehicules, ?User $user = null): static
{
$idsActuels = $this->depenseVehicules
->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getId())
->toArray();
$idsNouveaux = array_map(fn(Vehicule $v) => $v->getId(), $nouveauxVehicules);
// Supprimer les liens absents de la nouvelle liste
foreach ($this->depenseVehicules->toArray() as $dv) {
if (!in_array($dv->getVehicule()?->getId(), $idsNouveaux, true)) {
$this->depenseVehicules->removeElement($dv);
}
}
// Ajouter les nouveaux liens
foreach ($nouveauxVehicules as $vehicule) {
if (!in_array($vehicule->getId(), $idsActuels, true)) {
$dv = new DepenseVehicule();
$dv->setDepense($this);
$dv->setVehicule($vehicule);
$dv->setDatecreation(new \DateTime());
$dv->setAjoutepar($user);
$this->depenseVehicules->add($dv);
}
}
return $this;
}
public function hasVehicules(): bool
{
return !$this->depenseVehicules->isEmpty();
}
/**
* IDs des véhicules liés — pour pré-cocher les checkboxes.
*
* @return int[]
*/
public function getVehiculesIds(): array
{
return array_values(array_filter(
$this->depenseVehicules
->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getId())
->toArray()
));
}
/**
* Résumé lisible : "AA-001 · BB-002"
*/
public function getVehiculesLabel(): string
{
$labels = array_filter(
$this->depenseVehicules
->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getImmatriculation())
->toArray()
);
return implode(' · ', $labels);
}
// ── Fichiers ──────────────────────────────────────────────────────────────
public function getFichiers(): Collection
{
return $this->fichiers;
}
public function getFichiersActifs(): Collection
{
return $this->fichiers->filter(
fn(DepenseFichier $f) => $f->getDatesuppression() === null
);
}
public function addFichier(DepenseFichier $f): static
{
if (!$this->fichiers->contains($f)) {
$this->fichiers->add($f);
$f->setDepenseid($this);
}
return $this;
}
public function removeFichier(DepenseFichier $f): static
{
$this->fichiers->removeElement($f);
return $this;
}
// ── Commentaires ──────────────────────────────────────────────────────────
public function getCommentaires(): Collection
{
return $this->commentaires;
}
public function getCommentairesActifs(): Collection
{
return $this->commentaires->filter(
fn(DepenseCommentaire $c) => $c->getDatesuppression() === null
);
}
public function addCommentaire(DepenseCommentaire $c): static
{
if (!$this->commentaires->contains($c)) {
$this->commentaires->add($c);
$c->setDepenseid($this);
}
return $this;
}
public function removeCommentaire(DepenseCommentaire $c): static
{
$this->commentaires->removeElement($c);
return $this;
}
/**
* Snapshot scalaire pour le journal d'actions.
*/
public function toArray(): array
{
$fichiers = [];
foreach ($this->getFichiersActifs() as $f) { $fichiers[] = $f->getId(); }
$commentaires = [];
foreach ($this->getCommentairesActifs() as $c) { $commentaires[] = $c->getId(); }
return [
'id' => $this->id,
'beneficiaire' => $this->beneficiaire,
'montantdepense' => $this->montantdepense,
'descriptiondepense' => $this->descriptiondepense,
'magasinid' => $this->magasinid ? $this->magasinid->getId() : null,
'categorieid' => $this->categorieid ? $this->categorieid->getId() : null,
'ajoutepar' => $this->ajoutepar ? $this->ajoutepar->getId() : null,
'modifiepar' => $this->modifiepar ? $this->modifiepar->getId() : null,
'supprimepar' => $this->supprimepar ? $this->supprimepar->getId() : null,
'datedepense' => $this->datedepense ? $this->datedepense->format(\DateTimeInterface::ATOM) : null,
'datecreationdepense' => $this->datecreationdepense ? $this->datecreationdepense->format(\DateTimeInterface::ATOM) : null,
'datemodificationdepense' => $this->datemodificationdepense ? $this->datemodificationdepense->format(\DateTimeInterface::ATOM) : null,
'datesuppressiondepense' => $this->datesuppressiondepense ? $this->datesuppressiondepense->format(\DateTimeInterface::ATOM) : null,
'fichiers' => $fichiers,
'commentaires' => $commentaires,
'vehicules_ids' => $this->getVehiculesIds(),
'produitid' => $this->produitid ? $this->produitid->getId() : null,
'cash_session_id' => $this->cashSession ? $this->cashSession->getId() : null,
];
}
}