<?php
namespace App\EventSubscriber;
use App\Entity\BankTransfert;
use App\Event\EventData;
use App\Entity\User;
use App\Entity\Orders;
use App\Entity\OrderInvoice;
use App\Entity\OrderInvoiceLine;
use App\Entity\PaiedProduct;
use App\Entity\OrderingProduct;
use App\Entity\OrderingProductLine;
use App\Manager\OrderManager ;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\DependencyInjection\ContainerInterface ;
class PaymentSubscriber implements EventSubscriberInterface
{
private $orderManager ;
protected $entityManager;
protected $mangoPayService;
protected $urlGenerator;
protected $container;
public function __construct(EntityManagerInterface $_entityManager, OrderManager $_orderManager,
ContainerInterface $_container) {
// Let the parent handle construction.
$this->entityManager = $_entityManager;
$this->orderManager = $_orderManager;
$this->container = $_container;
}
/**
* List of event
*
* @return array
*/
public static function getSubscribedEvents()
{
// un evennement invoice.payment_succeeded a été lancé
return array(
EventData::ON_EVENT_MANGOPAY_PAYMENT_CREATED => array(
array('onMangopayPaymentCreated', 1)
),
EventData::ON_EVENT_MANGOPAY_PAYIN_NORMAL_SUCCEEDED => array(
array('onMangopayPayInSucceded', 1)
),
EventData::ON_EVENT_MANGOPAY_PAYOUT_NORMAL_SUCCEEDED => array(
array('onMangopayPayOutSucceded', 1),
array('onMangopayPayOutSuccededBankTransfert', 1)
),
);
}
/**
* On mangopay payment created
* @param EventData $event
*/
public function onMangopayPaymentCreated(EventData $event)
{
$datas = $event->getData();
$user = $datas['user'] ;
$payIn = $datas['payIn'] ;
$payInId = $payIn->Id ;
$this->orderManager->createOrder($user, $payInId) ;
return true ;
}
/**
* On mangopay payIn succeded
* @param EventData $event
*/
public function onMangopayPayInSucceded(EventData $event)
{
$datas = $event->getData();
$transactionId = $datas['RessourceId'] ;
$orders = $this->entityManager->getRepository(Orders::class)->findOneBy(['transaction' => $transactionId]) ;
if(!empty($orders)){
$orders->setStatus(true) ;
$datePayed = new \DateTime() ;
$orders->setDatePayed($datePayed) ;
$this->save($orders);
//Generation de order invoice
$orderInvoice = new OrderInvoice() ;
$orderInvoice->setStudent($orders->getStudent()) ;
$orderInvoice->setOrders($orders) ;
$orderInvoice->setNumber($orders->getNum()) ;
$orderInvoice->setTotalPaidTaxExcl($orders->getPriceHt()) ;
$orderInvoice->setTotalPaidTaxIncl($orders->getPriceTtc()) ;
$orderInvoice->setStatus(true) ;
$this->save($orderInvoice);
//Generation de order invoice line
$orderLines = $this->orderManager->getOrderLine($orders) ;
foreach($orderLines as $orderLine){
$orderInvoiceLine = new OrderInvoiceLine() ;
$orderInvoiceLine->setOrderInvoice($orderInvoice) ;
$orderInvoiceLine->setOrderLine($orderLine) ;
$orderInvoiceLine->setPriceHt($orderLine->getPriceHt()) ;
$orderInvoiceLine->setStatus(true) ;
$this->save($orderInvoiceLine);
//Enregitrement de chaque produit dans product paid
$paiedProduct = new PaiedProduct() ;
$paiedProduct->setOrderProduct($orders) ;
$paiedProduct->setUser($orders->getStudent()) ;
$paiedProduct->setProduct($orderLine->getProduct()) ;
$this->save($paiedProduct) ;
//Enregistrement des produita acheter des etudiant par enseignant pour faciliter la recuperation des fees
//Verification orderingProduct
$product = $orderLine->getProduct() ;
$teacher = $product->getTeacher() ;
$orderingProduct = $this->entityManager->getRepository(OrderingProduct::class)->findOneBy(['dateCurrent' => $datePayed->format('Y-m'), 'teacher' => $teacher]) ;
if(empty($orderingProduct)){
$orderingProduct = new OrderingProduct();
$orderingProduct->setTeacher($teacher) ;
$billingNumber = $this->orderManager->getPayOutBillingNumber() ;
$orderingProduct->setNum($billingNumber) ;
$orderingProduct->setDateCurrent($datePayed->format('Y-m')) ;
$orderingProduct->setStatus(false) ;
$this->save($orderingProduct) ;
}
//Verification si l'etudiant a dejaà acheté le cours
$orderingProductLine = $this->entityManager->getRepository(OrderingProductLine::class)->findOneBy(['student' => $orders->getStudent(), 'product' => $product, 'teacher' => $product->getTeacher()]) ;
if(empty($orderingProductLine)){
$orderingProductLine = new OrderingProductLine();
$orderingProductLine->setTeacher($product->getTeacher()) ;
$orderingProductLine->setStudent($orders->getStudent()) ;
$orderingProductLine->setProduct($product) ;
$orderingProductLine->setDatePayed($datePayed) ;
$orderingProductLine->setPrice($orderLine->getPriceHt()) ;
$orderingProductLine->setNum($orders->getNum()) ;
$orderingProductLine->setOrders($orders) ;
$orderingProductLine->setOrderingProduct($orderingProduct) ;
$this->save($orderingProductLine) ;
}
}
//Generation de facture PDF
$this->orderManager->generateBilling($orders) ;
//Generation envoie mail à l'etudiant pour confirmation de son payement
$this->orderManager->sendMailOrderPayment($orders) ;
}
return true ;
}
/**
* On mangopay payOut succeded
* @param EventData $event
*/
public function onMangopayPayOutSucceded(EventData $event)
{
$datas = $event->getData();
$transactionId = $datas['RessourceId'] ;
$orderingProduct = $this->entityManager->getRepository(OrderingProduct::class)->findOneBy(['transaction' => $transactionId]) ;
if(!empty($orderingProduct)){
$orderingProduct->setStatus(true) ;
$datePayed = new \DateTime() ;
$orderingProduct->setDatePayed($datePayed) ;
$this->save($orderingProduct);
//Generation de PDF
$this->orderManager->generatePayoutBilling($orderingProduct) ;
//Envoie mail à l'enseignant
$this->orderManager->sendMailPayOut($orderingProduct) ;
}
return true ;
}
/**
* On mangopay payOut succeded for admin
* @param EventData $event
*/
public function onMangopayPayOutSuccededBankTransfert(EventData $event)
{
$datas = $event->getData();
$transactionId = $datas['RessourceId'] ;
$bankTransfert = $this->entityManager->getRepository(BankTransfert::class)->findOneBy(['transactionId' => $transactionId]) ;
if(!empty($bankTransfert)){
$bankTransfert->setStatus(true) ;
$this->save($bankTransfert);
}
return true ;
}
/**
* SAve object
* @param type $_object
* @return type
*/
public function save($_object){
$this->entityManager->persist($_object);
$this->entityManager->flush();
return $_object ;
}
}