src/EventSubscriber/FacturesSubscriber.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\FactureMyral;
  4. use App\Entity\LigneFactureMyral;
  5. use App\Event\Factures\FactureMyralCreatedEvent;
  6. use App\Event\Factures\FactureMyralUpdatedEvent;
  7. use App\Repository\CoefClientMyralRepository;
  8. use App\Repository\FactureMyralRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class FacturesSubscriber implements EventSubscriberInterface
  12. {
  13.     /**
  14.      * @var FactureMyralRepository
  15.      */
  16.     private $factureMyralRepository;
  17.     /**
  18.      * @var EntityManagerInterface
  19.      */
  20.     private $em;
  21.     /**
  22.      * @var CoefClientMyralRepository
  23.      */
  24.     private $coefClientMyralRepository;
  25.     public function __construct(FactureMyralRepository $factureMyralRepositoryEntityManagerInterface $emCoefClientMyralRepository $coefClientMyralRepository)
  26.     {
  27.         $this->factureMyralRepository $factureMyralRepository;
  28.         $this->em $em;
  29.         $this->coefClientMyralRepository $coefClientMyralRepository;
  30.     }
  31.     public static function getSubscribedEvents(): array
  32.     {
  33.         return [
  34.             FactureMyralCreatedEvent::class => ['onFactureMyralCreated'100],
  35.             FactureMyralUpdatedEvent::class => ['onFactureMyralUpdated'100],
  36.         ];
  37.     }
  38.     public function onFactureMyralCreated(FactureMyralCreatedEvent $event)
  39.     {
  40.         $facture $event->getFactureMyral();
  41.         // Calcul du numéro de facture suivant
  42.         // Format : YYYY-XX
  43.         $number $this->factureMyralRepository->findNextNumber();
  44.         $facture->setNumero($number);
  45.         // Référence : YYYY-XXX
  46.         $y Date('Y'$facture->getDateFacture()->getTimestamp());
  47.         $reference =  $y "-".str_pad($number4'0'STR_PAD_LEFT);
  48.         $facture->setReference($reference);
  49.         $this->setCommonData($facture);
  50.         $this->em->flush();
  51.     }
  52.     public function onFactureMyralUpdated(FactureMyralUpdatedEvent $event)
  53.     {
  54.         $facture $event->getFactureMyral();
  55.         $this->setCommonData($facture);
  56.         $this->em->flush();
  57.     }
  58.     private function setCommonData (FactureMyral $facture) {
  59.         // On calcule le HT et TTC global
  60.         $totalHt $totalTtc 0;
  61.         foreach ($facture->getLignes() as $ligne) {
  62.             $totalTtc += $ligne->getTotalTtc();
  63.             $totalHt += $ligne->getTotalHt();
  64.         }
  65.         // On ajoute les frais de ports
  66.         $totalHt += $facture->getTransportHt();
  67.         $totalTtc += $facture->getTransportHt() * 1.20;
  68.         $facture->setTotalHt($totalHt)
  69.             ->setTotalTtc($totalTtc);
  70.         // Nom du client
  71.         $facture->setLibelle($facture->getClient()->getNom());
  72.         // Adresse de la structure
  73.         $facture->setAdresseStructure($facture->getStructure()->getAddress())
  74.             ->setCpStructure($facture->getStructure()->getPostcode())
  75.             ->setVilleStructure($facture->getStructure()->getCity())
  76.             ->setNomStructure($facture->getStructure()->getNom());
  77.         // Coef et formule
  78.         $coefs $this->coefClientMyralRepository->findBy(['client' => $facture->getClient()->getId()]);
  79.         $coefs_a = [];
  80.         foreach ($coefs as $c) {
  81.             $coefs_a[$c->getCategorie()->getId()] = $c->getCoef();
  82.         }
  83.         /**
  84.          * @var LigneFactureMyral $ligne
  85.          */
  86.         foreach ($facture->getLignes() as $ligne) {
  87.             $coef = isset($coefs_a[$ligne->getProduit()->getCategorie()->getId()]) ? $coefs_a[$ligne->getProduit()->getCategorie()->getId()] : 1;
  88.             $ligne->setCoef($coef);
  89.             $formule $ligne->getProduit()->getCategorie()->getFormule();
  90.             $ligne->setFormule($formule);
  91.         }
  92.     }
  93. }