<?php
namespace App\EventSubscriber;
use App\Entity\FactureMyral;
use App\Entity\LigneFactureMyral;
use App\Event\Factures\FactureMyralCreatedEvent;
use App\Event\Factures\FactureMyralUpdatedEvent;
use App\Repository\CoefClientMyralRepository;
use App\Repository\FactureMyralRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class FacturesSubscriber implements EventSubscriberInterface
{
/**
* @var FactureMyralRepository
*/
private $factureMyralRepository;
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var CoefClientMyralRepository
*/
private $coefClientMyralRepository;
public function __construct(FactureMyralRepository $factureMyralRepository, EntityManagerInterface $em, CoefClientMyralRepository $coefClientMyralRepository)
{
$this->factureMyralRepository = $factureMyralRepository;
$this->em = $em;
$this->coefClientMyralRepository = $coefClientMyralRepository;
}
public static function getSubscribedEvents(): array
{
return [
FactureMyralCreatedEvent::class => ['onFactureMyralCreated', 100],
FactureMyralUpdatedEvent::class => ['onFactureMyralUpdated', 100],
];
}
public function onFactureMyralCreated(FactureMyralCreatedEvent $event)
{
$facture = $event->getFactureMyral();
// Calcul du numéro de facture suivant
// Format : YYYY-XX
$number = $this->factureMyralRepository->findNextNumber();
$facture->setNumero($number);
// Référence : YYYY-XXX
$y = Date('Y', $facture->getDateFacture()->getTimestamp());
$reference = $y . "-".str_pad($number, 4, '0', STR_PAD_LEFT);
$facture->setReference($reference);
$this->setCommonData($facture);
$this->em->flush();
}
public function onFactureMyralUpdated(FactureMyralUpdatedEvent $event)
{
$facture = $event->getFactureMyral();
$this->setCommonData($facture);
$this->em->flush();
}
private function setCommonData (FactureMyral $facture) {
// On calcule le HT et TTC global
$totalHt = $totalTtc = 0;
foreach ($facture->getLignes() as $ligne) {
$totalTtc += $ligne->getTotalTtc();
$totalHt += $ligne->getTotalHt();
}
// On ajoute les frais de ports
$totalHt += $facture->getTransportHt();
$totalTtc += $facture->getTransportHt() * 1.20;
$facture->setTotalHt($totalHt)
->setTotalTtc($totalTtc);
// Nom du client
$facture->setLibelle($facture->getClient()->getNom());
// Adresse de la structure
$facture->setAdresseStructure($facture->getStructure()->getAddress())
->setCpStructure($facture->getStructure()->getPostcode())
->setVilleStructure($facture->getStructure()->getCity())
->setNomStructure($facture->getStructure()->getNom());
// Coef et formule
$coefs = $this->coefClientMyralRepository->findBy(['client' => $facture->getClient()->getId()]);
$coefs_a = [];
foreach ($coefs as $c) {
$coefs_a[$c->getCategorie()->getId()] = $c->getCoef();
}
/**
* @var LigneFactureMyral $ligne
*/
foreach ($facture->getLignes() as $ligne) {
$coef = isset($coefs_a[$ligne->getProduit()->getCategorie()->getId()]) ? $coefs_a[$ligne->getProduit()->getCategorie()->getId()] : 1;
$ligne->setCoef($coef);
$formule = $ligne->getProduit()->getCategorie()->getFormule();
$ligne->setFormule($formule);
}
}
}