src/Entity/Depense.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use Doctrine\Common\Collections\ArrayCollection;
  4. use Doctrine\Common\Collections\Collection;
  5. use Doctrine\ORM\Mapping as ORM;
  6. /**
  7.  * @ORM\Entity(repositoryClass="App\Repository\DepenseRepository")
  8.  */
  9. class Depense
  10. {
  11.     /**
  12.      * @ORM\Id()
  13.      * @ORM\GeneratedValue()
  14.      * @ORM\Column(type="integer")
  15.      */
  16.     private $id;
  17.     /**
  18.      * @ORM\Column(type="string", length=200, nullable=true)
  19.      */
  20.     private $beneficiaire;
  21.     /**
  22.      * @ORM\Column(type="integer")
  23.      */
  24.     private $montantdepense 0;
  25.     /**
  26.      * @ORM\Column(type="text")
  27.      */
  28.     private $descriptiondepense;
  29.     /**
  30.      * @ORM\Column(type="text")
  31.      */
  32.     private $journaldepense;
  33.     /**
  34.      * @ORM\Column(type="datetime", nullable=true)
  35.      */
  36.     private $datecreationdepense;
  37.     /**
  38.      * @ORM\Column(type="datetime", nullable=true)
  39.      */
  40.     private $datemodificationdepense;
  41.     /**
  42.      * @ORM\Column(type="datetime", nullable=true)
  43.      */
  44.     private $datedepense;
  45.     /**
  46.      * @ORM\Column(type="datetime", nullable=true)
  47.      */
  48.     private $datesuppressiondepense;
  49.     /**
  50.      * @ORM\ManyToOne(targetEntity="Magasin")
  51.      * @ORM\JoinColumn(name="magasinid", referencedColumnName="id", nullable=true)
  52.      */
  53.     private $magasinid;
  54.     /**
  55.      * @ORM\ManyToOne(targetEntity="User")
  56.      * @ORM\JoinColumn(name="ajoutepar", referencedColumnName="id", nullable=true)
  57.      */
  58.     private $ajoutepar;
  59.     /**
  60.      * @ORM\ManyToOne(targetEntity="User")
  61.      * @ORM\JoinColumn(name="supprimepar", referencedColumnName="id", nullable=true)
  62.      */
  63.     private $supprimepar;
  64.     /**
  65.      * @ORM\ManyToOne(targetEntity="User")
  66.      * @ORM\JoinColumn(name="modifiepar", referencedColumnName="id", nullable=true)
  67.      */
  68.     private $modifiepar;
  69.     /**
  70.      * @ORM\ManyToOne(targetEntity="Produit")
  71.      * @ORM\JoinColumn(name="produitid", referencedColumnName="id", nullable=true)
  72.      */
  73.     private $produitid;
  74.     /**
  75.      * @ORM\ManyToOne(targetEntity="DepenseCategorie", inversedBy="depenses")
  76.      * @ORM\JoinColumn(name="categorieid", referencedColumnName="id", nullable=true)
  77.      */
  78.     private $categorieid;
  79.     /**
  80.      * @ORM\ManyToOne(targetEntity="CashSession")
  81.      * @ORM\JoinColumn(name="cash_session_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
  82.      */
  83.     private $cashSession;
  84.     /**
  85.      * Relation vers la table de jointure DepenseVehicule.
  86.      * C'est DepenseVehicule.php qui déclare et possède la table depense_vehicule. 
  87.      *
  88.      * @ORM\OneToMany(
  89.      *     targetEntity="DepenseVehicule",
  90.      *     mappedBy="depense",
  91.      *     cascade={"persist", "remove"},
  92.      *     orphanRemoval=true
  93.      * )
  94.      */
  95.     private $depenseVehicules;
  96.     /**
  97.      * @ORM\OneToMany(targetEntity="DepenseFichier", mappedBy="depenseid", cascade={"persist","remove"})
  98.      */
  99.     private $fichiers;
  100.     /**
  101.      * @ORM\OneToMany(targetEntity="DepenseCommentaire", mappedBy="depenseid", cascade={"persist","remove"})
  102.      */
  103.     private $commentaires;
  104.     public function __construct()
  105.     {
  106.         $this->depenseVehicules = new ArrayCollection();
  107.         $this->fichiers         = new ArrayCollection();
  108.         $this->commentaires     = new ArrayCollection();
  109.     }
  110.     // ── Getters / Setters standards ───────────────────────────────────────────
  111.     public function getId(): ?int
  112.     {
  113.         return $this->id;
  114.     }
  115.     public function getBeneficiaire(): ?string
  116.     {
  117.         return $this->beneficiaire;
  118.     }
  119.     public function setBeneficiaire(?string $v): static
  120.     {
  121.         $this->beneficiaire $v;
  122.         return $this;
  123.     }
  124.     public function getMontantdepense(): ?int
  125.     {
  126.         return $this->montantdepense;
  127.     }
  128.     public function setMontantdepense(int $v): static
  129.     {
  130.         $this->montantdepense $v;
  131.         return $this;
  132.     }
  133.     public function getDescriptiondepense(): ?string
  134.     {
  135.         return $this->descriptiondepense;
  136.     }
  137.     public function setDescriptiondepense(string $v): static
  138.     {
  139.         $this->descriptiondepense $v;
  140.         return $this;
  141.     }
  142.     public function getJournaldepense(): ?string
  143.     {
  144.         return $this->journaldepense;
  145.     }
  146.     public function setJournaldepense(string $v): static
  147.     {
  148.         $this->journaldepense $v;
  149.         return $this;
  150.     }
  151.     public function getDatecreationdepense(): ?\DateTimeInterface
  152.     {
  153.         return $this->datecreationdepense;
  154.     }
  155.     public function setDatecreationdepense(?\DateTimeInterface $v): static
  156.     {
  157.         $this->datecreationdepense $v;
  158.         return $this;
  159.     }
  160.     public function getDatedepense(): ?\DateTimeInterface
  161.     {
  162.         return $this->datedepense;
  163.     }
  164.     public function setDatedepense(?\DateTimeInterface $v): static
  165.     {
  166.         $this->datedepense $v;
  167.         return $this;
  168.     }
  169.     public function getDatesuppressiondepense(): ?\DateTimeInterface
  170.     {
  171.         return $this->datesuppressiondepense;
  172.     }
  173.     public function setDatesuppressiondepense(?\DateTimeInterface $v): static
  174.     {
  175.         $this->datesuppressiondepense $v;
  176.         return $this;
  177.     }
  178.     public function getDatemodificationdepense(): ?\DateTimeInterface
  179.     {
  180.         return $this->datemodificationdepense;
  181.     }
  182.     public function setDatemodificationdepense(?\DateTimeInterface $v): static
  183.     {
  184.         $this->datemodificationdepense $v;
  185.         return $this;
  186.     }
  187.     public function getMagasinid(): ?Magasin
  188.     {
  189.         return $this->magasinid;
  190.     }
  191.     public function setMagasinid(?Magasin $v): static
  192.     {
  193.         $this->magasinid $v;
  194.         return $this;
  195.     }
  196.     public function getAjoutepar(): ?User
  197.     {
  198.         return $this->ajoutepar;
  199.     }
  200.     public function setAjoutepar(?User $v): static
  201.     {
  202.         $this->ajoutepar $v;
  203.         return $this;
  204.     }
  205.     public function getSupprimepar(): ?User
  206.     {
  207.         return $this->supprimepar;
  208.     }
  209.     public function setSupprimepar(?User $v): static
  210.     {
  211.         $this->supprimepar $v;
  212.         return $this;
  213.     }
  214.     public function getModifiepar(): ?User
  215.     {
  216.         return $this->modifiepar;
  217.     }
  218.     public function setModifiepar(?User $v): static
  219.     {
  220.         $this->modifiepar $v;
  221.         return $this;
  222.     }
  223.     public function getProduitid(): ?Produit
  224.     {
  225.         return $this->produitid;
  226.     }
  227.     public function setProduitid(?Produit $v): static
  228.     {
  229.         $this->produitid $v;
  230.         return $this;
  231.     }
  232.     public function getCategorieid(): ?DepenseCategorie
  233.     {
  234.         return $this->categorieid;
  235.     }
  236.     public function setCategorieid(?DepenseCategorie $v): static
  237.     {
  238.         $this->categorieid $v;
  239.         return $this;
  240.     }
  241.     public function getCashSession(): ?CashSession
  242.     {
  243.         return $this->cashSession;
  244.     }
  245.     public function setCashSession(?CashSession $v): static
  246.     {
  247.         $this->cashSession $v;
  248.         return $this;
  249.     }
  250.     // ── MULTI-VÉHICULES ───────────────────────────────────────────────────────
  251.     public function getDepenseVehicules(): Collection
  252.     {
  253.         return $this->depenseVehicules;
  254.     }
  255.     public function addDepenseVehicule(DepenseVehicule $dv): static
  256.     {
  257.         if (!$this->depenseVehicules->contains($dv)) {
  258.             $this->depenseVehicules->add($dv);
  259.             $dv->setDepense($this);
  260.         }
  261.         return $this;
  262.     }
  263.     public function removeDepenseVehicule(DepenseVehicule $dv): static
  264.     {
  265.         $this->depenseVehicules->removeElement($dv);
  266.         return $this;
  267.     }
  268.     /**
  269.      * Raccourci pour Twig : retourne les Vehicule directement.
  270.      * Usage : DEPENSE.vehicules
  271.      *
  272.      * @return Vehicule[]
  273.      */
  274.     public function getVehicules(): array
  275.     {
  276.         return array_values(array_filter(
  277.             $this->depenseVehicules
  278.                 ->map(fn(DepenseVehicule $dv) => $dv->getVehicule())
  279.                 ->toArray()
  280.         ));
  281.     }
  282.     /**
  283.      * Synchronise la liste des véhicules depuis le formulaire.
  284.      *
  285.      * @param Vehicule[] $nouveauxVehicules
  286.      * @param User|null  $user
  287.      */
  288.     public function syncVehicules(array $nouveauxVehicules, ?User $user null): static
  289.     {
  290.         $idsActuels  $this->depenseVehicules
  291.             ->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getId())
  292.             ->toArray();
  293.         $idsNouveaux array_map(fn(Vehicule $v) => $v->getId(), $nouveauxVehicules);
  294.         // Supprimer les liens absents de la nouvelle liste
  295.         foreach ($this->depenseVehicules->toArray() as $dv) {
  296.             if (!in_array($dv->getVehicule()?->getId(), $idsNouveauxtrue)) {
  297.                 $this->depenseVehicules->removeElement($dv);
  298.             }
  299.         }
  300.         // Ajouter les nouveaux liens
  301.         foreach ($nouveauxVehicules as $vehicule) {
  302.             if (!in_array($vehicule->getId(), $idsActuelstrue)) {
  303.                 $dv = new DepenseVehicule();
  304.                 $dv->setDepense($this);
  305.                 $dv->setVehicule($vehicule);
  306.                 $dv->setDatecreation(new \DateTime());
  307.                 $dv->setAjoutepar($user);
  308.                 $this->depenseVehicules->add($dv);
  309.             }
  310.         }
  311.         return $this;
  312.     }
  313.     public function hasVehicules(): bool
  314.     {
  315.         return !$this->depenseVehicules->isEmpty();
  316.     }
  317.     /**
  318.      * IDs des véhicules liés — pour pré-cocher les checkboxes.
  319.      *
  320.      * @return int[]
  321.      */
  322.     public function getVehiculesIds(): array
  323.     {
  324.         return array_values(array_filter(
  325.             $this->depenseVehicules
  326.                 ->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getId())
  327.                 ->toArray()
  328.         ));
  329.     }
  330.     /**
  331.      * Résumé lisible : "AA-001 · BB-002"
  332.      */
  333.     public function getVehiculesLabel(): string
  334.     {
  335.         $labels array_filter(
  336.             $this->depenseVehicules
  337.                 ->map(fn(DepenseVehicule $dv) => $dv->getVehicule()?->getImmatriculation())
  338.                 ->toArray()
  339.         );
  340.         return implode(' · '$labels);
  341.     }
  342.     // ── Fichiers ──────────────────────────────────────────────────────────────
  343.     public function getFichiers(): Collection
  344.     {
  345.         return $this->fichiers;
  346.     }
  347.     public function getFichiersActifs(): Collection
  348.     {
  349.         return $this->fichiers->filter(
  350.             fn(DepenseFichier $f) => $f->getDatesuppression() === null
  351.         );
  352.     }
  353.     public function addFichier(DepenseFichier $f): static
  354.     {
  355.         if (!$this->fichiers->contains($f)) {
  356.             $this->fichiers->add($f);
  357.             $f->setDepenseid($this);
  358.         }
  359.         return $this;
  360.     }
  361.     public function removeFichier(DepenseFichier $f): static
  362.     {
  363.         $this->fichiers->removeElement($f);
  364.         return $this;
  365.     }
  366.     // ── Commentaires ──────────────────────────────────────────────────────────
  367.     public function getCommentaires(): Collection
  368.     {
  369.         return $this->commentaires;
  370.     }
  371.     public function getCommentairesActifs(): Collection
  372.     {
  373.         return $this->commentaires->filter(
  374.             fn(DepenseCommentaire $c) => $c->getDatesuppression() === null
  375.         );
  376.     }
  377.     public function addCommentaire(DepenseCommentaire $c): static
  378.     {
  379.         if (!$this->commentaires->contains($c)) {
  380.             $this->commentaires->add($c);
  381.             $c->setDepenseid($this);
  382.         }
  383.         return $this;
  384.     }
  385.     public function removeCommentaire(DepenseCommentaire $c): static
  386.     {
  387.         $this->commentaires->removeElement($c);
  388.         return $this;
  389.     }
  390.     /**
  391.      * Snapshot scalaire pour le journal d'actions.
  392.      */
  393.     public function toArray(): array
  394.     {
  395.         $fichiers     = [];
  396.         foreach ($this->getFichiersActifs() as $f) { $fichiers[] = $f->getId(); }
  397.         $commentaires = [];
  398.         foreach ($this->getCommentairesActifs() as $c) { $commentaires[] = $c->getId(); }
  399.         return [
  400.             'id'                       => $this->id,
  401.             'beneficiaire'             => $this->beneficiaire,
  402.             'montantdepense'           => $this->montantdepense,
  403.             'descriptiondepense'       => $this->descriptiondepense,
  404.             'magasinid'                => $this->magasinid    $this->magasinid->getId()    : null,
  405.             'categorieid'              => $this->categorieid  $this->categorieid->getId()  : null,
  406.             'ajoutepar'                => $this->ajoutepar    $this->ajoutepar->getId()    : null,
  407.             'modifiepar'               => $this->modifiepar   $this->modifiepar->getId()   : null,
  408.             'supprimepar'              => $this->supprimepar  $this->supprimepar->getId()  : null,
  409.             'datedepense'              => $this->datedepense              $this->datedepense->format(\DateTimeInterface::ATOM)              : null,
  410.             'datecreationdepense'      => $this->datecreationdepense      $this->datecreationdepense->format(\DateTimeInterface::ATOM)      : null,
  411.             'datemodificationdepense'  => $this->datemodificationdepense  $this->datemodificationdepense->format(\DateTimeInterface::ATOM)  : null,
  412.             'datesuppressiondepense'   => $this->datesuppressiondepense   $this->datesuppressiondepense->format(\DateTimeInterface::ATOM)   : null,
  413.             'fichiers'                 => $fichiers,
  414.             'commentaires'             => $commentaires,
  415.             'vehicules_ids'            => $this->getVehiculesIds(),
  416.             'produitid'                => $this->produitid $this->produitid->getId() : null,
  417.             'cash_session_id'          => $this->cashSession $this->cashSession->getId() : null,
  418.         ];
  419.     }
  420. }