<?php
namespace App\DataProvider;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use App\Entity\PointDeVente;
use App\Entity\MouvementAgence;
use App\Entity\Entite;
//use Doctrine\Common\Persistence\ManagerRegistry; v4
use Doctrine\Persistence\ManagerRegistry; //v5
use Doctrine\ORM\QueryBuilder;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Utils\Constantes;
use App\Utils\JWTEncoder;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Twig\Environment;
use App\Exception\CustomException;
/**
* Class MouvementCaisseDataProvider
*
* @package App\MouvementCaisseDataProvider
*/
class MouvementAgenceDataProvider implements CollectionDataProviderInterface, RestrictedDataProviderInterface
{
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var ManagerRegistry
*/
private $doctrine;
private $knpSnappy;
private $templating;
/**
* @var QueryCollectionExtensionInterface[]|iterable
*/
private $collectionExtensions;
private $codeEntite;
private $jwtFactory;
private $request;
private $apiData;
/**
* AgenceApproDataProvider constructor.
*
* @param RequestStack $requestStack
* @param ManagerRegistry $doctrine
* @param iterable $collectionExtensions
*/
public function __construct(ManagerRegistry $doctrine, iterable $collectionExtensions, Pdf $knpSnappy, ContainerInterface $container, Environment $twig)
{
$this->request = Request::createFromGlobals();
$this->doctrine = $doctrine;
$this->knpSnappy = $knpSnappy;
$this->templating = $twig;
$this->collectionExtensions = $collectionExtensions;
$this->jwtFactory = JWTEncoder::getInstance();
$apiKey = $this->request->headers->get(Constantes::AUTH_TOKEN);
$this->apiData = $this->jwtFactory->decode($apiKey);
}
/**
* @param string $resourceClass
* @param string|null $operationName
* @param array $context
*
* @return bool
*/
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return (MouvementAgence::class === $resourceClass && ($operationName == 'get' || $operationName == 'pdf_export' || $operationName == 'csv_export'));
}
public function getCollection(string $resourceClass, string $operationName = null, array $context = [])
{
$manager = $this->doctrine->getManagerForClass($resourceClass);
$repository = $manager->getRepository($resourceClass);
$entiteManager = $this->doctrine->getManagerForClass(Entite::class);
$entiteRepository = $entiteManager->getRepository(Entite::class);
/** @var QueryBuilder $queryBuilder */
$queryBuilder = $repository->createQueryBuilder('p');
$queryNameGenerator = new QueryNameGenerator();
if (!isset($this->apiData[Constantes::CODE_CLIENT])) {
throw new CustomException("Accès non autorisé");
}
$codeEntite = $this->apiData[Constantes::CODE_CLIENT];
$codeAgence = $this->apiData[Constantes::CODE_POINT_DE_VENTE];
$codeDistributeur = $this->apiData[Constantes::CODE_DISTRIBUTEUR];
$codeCaisse = $this->apiData[Constantes::CODE_CAISSE];
$nomAgence = "";
$distributeur = '';
$nomAgence = "";
$entite = "";
$bureau = "";
if ($codeEntite != Constantes::BG_ENTITE) {
$context["filters"]["debiteur.codeEntite"] = $codeEntite;
$entite = $entiteRepository->findOneBy(["code" => $codeEntite]);
}
// $queryBuilder->andwhere('p.status !=:status')
// ->setParameter('status', 2);
if (!empty($codeCaisse)) {
//$context["filters"]["debiteur.code"] = $codeCaisse;
}elseif(!empty($codeAgence) && ($codeAgence != $codeDistributeur)) {
//$context["filters"]["debiteur.code"] = $codeAgence;
$queryBuilder->join('p.debiteur', 'db');
$queryBuilder->leftjoin('p.crediteur', 'cr');
$queryBuilder->andWhere('cr.code = :codeAgence');
$queryBuilder->setParameter('codeAgence', $codeAgence);
$queryBuilder->orWhere('db.code = :codeAgenceDeb');
$queryBuilder->setParameter('codeAgenceDeb', $codeAgence);
//$context["filters"]["crediteur.code"] = $codeAgence;
$nomAgence = $this->apiData["bureau"];
} elseif(!empty($codeAgence) && ($codeAgence == $codeDistributeur)) {
$context["filters"]["debiteur.codeDistributeur"] = $codeDistributeur;
}
if(!empty($codeDistributeur)) {
$distributeur = $repository->findOneBy(["codeDistributeur" => $codeDistributeur, "isDistributeur" => 1]);
}
// $queryBuilder->andWhere('p.codeDistributeur IS NULL');
foreach ($this->collectionExtensions as $extension) {
$extension->applyToCollection($queryBuilder, $queryNameGenerator, $resourceClass, $operationName, $context);
if ($extension instanceof QueryResultCollectionExtensionInterface && $extension->supportsResult($resourceClass, $operationName, $context)) {
return $extension->getResult($queryBuilder, $resourceClass, $operationName, $context);
}
}
$dateFin = ''; $dateDebut = "";
if(isset($context["filters"]["dateCreation"])){
$dateCreation = $context["filters"]["dateCreation"];
// var_dump($dateCreation);die;
$dateFin = isset($dateCreation["before"]) ? $dateCreation["before"] : "";
$dateFin = isset($dateCreation["strictly_before"]) ? $dateCreation["strictly_before"] : "";
$dateDebut = isset($dateCreation["after"]) ? $dateCreation["after"] : "";
$dateDebut = isset($dateCreation["strictly_after"]) ? $dateCreation["strictly_after"] : "";
}
$datetxt = "au ". date('d-m-Y');
if(!empty($dateDebut) && !empty($dateFin)){
$datetxt = 'Du ' . $dateDebut . ' au ' . $dateFin;
} elseif(!empty($dateDebut) ){
$datetxt = 'Du ' . $dateDebut . ' au ' . date('d-m-Y');
} elseif(!empty($dateFin)) {
$datetxt = "Jusqu 'au " . $dateFin ;
}
if ($operationName !== 'get'){
$queryBuilder->orderBy('p.id', 'DESC');
$result = $queryBuilder->getQuery()->getResult();
// Dans le cas ou on cherche à exporter en PDF
if ($operationName == 'pdf_export') {
$nombre = count($result);
$montant = 0;
foreach ( $result as $app) {
$montant += intval($app->getMontant());
}
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($this->templating->render(
'print/approcaisses.html.twig',
["appros" => $result, 'nombre' => $nombre, 'datetxt' => $datetxt, 'montant' => $montant,
"entite" => $entite, "agence" => strtoupper($nomAgence), 'distributeur' => $distributeur ]
), array(
'orientation'=>'Landscape',
'encoding' => 'utf-8',
'footer-right'=>'Page [page]/[toPage]', 'header-line'=>false,'footer-line' =>true,)),
'approvisionnement-pos-pdf-export.pdf'
);
}
// Dans le cas ou on cherche à exporter en CSV
if ($operationName == 'csv_export') {
$response = new StreamedResponse();
$response->setCallback(function () use($result, $entite, $nomAgence, $datetxt, $distributeur) {
$fp = fopen('php://output', 'w');
if($entite) {
fputcsv($fp, [
$entite->getNom(),
'','','','','','','','','',
]);
}
if(!empty($nomAgence)) {
fputcsv($fp, [
$nomAgence,
'','','','','','','','','',
]);
}
if($distributeur) {
fputcsv($fp, [
$distributeur->getNom(),
'Approvisionements POS ' .$datetxt,'','','','','','','','',
]);
}
fputcsv($fp, [
'Date de création',
'Montant '. !empty($entite) ? $entite->getDevise() : '',
'Code caisse',
'Numero caisse',
'Statut',
'Date de validation',
]);
/** @var Transaction $transaction */
foreach ($result as $appro) {
fputcsv($fp, [
$appro->getDateCreation()->format('d-m-Y H:i:s'),
$appro->getMontant(),
$appro->getCaisse()->getCode(),
$appro->getCaisse()->getNumero(),
$appro->getStatus() == 0 ? "En attente de validation" : $appro->getStatus() == 1 ? "Approuvée" : "Rejetée",
!empty($appro->getDateValidation()) ? $appro->getDateValidation()->format('d-m-Y H:i:s') : "",
]);
}
fclose($fp);
});
// die;
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$response->headers->set('Content-Disposition', 'attachment; filename="export-approvisionnement-caisse.csv"');
return $response;
}
}
return $result;
}
}