<?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\Approvisionnement;
use App\Entity\Entite;
use Doctrine\ORM\QueryBuilder;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
//use Doctrine\Common\Persistence\ManagerRegistry; v4
use Doctrine\Persistence\ManagerRegistry; //v5
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 AgenceApproDataProvider
*
* @package App\AgenceApproDataProvider
*/
class ApprovisionnementDataProvider 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 = $container->get('templating');
$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 (Approvisionnement::class === $resourceClass && ($operationName == 'get' || $operationName == 'pdf_export' || $operationName == 'csv_export' || $operationName == 'approvisionnement_banque'));
return (Approvisionnement::class === $resourceClass);
}
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();
$codeEntite = $this->apiData[Constantes::CODE_CLIENT];
$codeAgence = $this->apiData[Constantes::CODE_POINT_DE_VENTE];
$codeDistributeur = $this->apiData[Constantes::CODE_DISTRIBUTEUR];
$codeSociete = $this->apiData["codeSociete"];
if (empty($this->apiData[Constantes::CODE_CLIENT]) || !empty($this->apiData[Constantes::CODE_CAISSE])) {
throw new CustomException("Accès non autorisé");
}
// if ($operationName == 'approvisionnement_banque') {
if (str_contains($operationName, 'banque')) {
$context["filters"]["entite.fournisseur"] = "1";
} elseif ($codeEntite != "BGDIGIT") {
$context["filters"]["entite.fournisseur"] = "0";
}
if (str_contains($operationName, 'operateur')) {
$queryBuilder->andwhere('p.operateur IS NOT NULL');
}
$nomAgence = "";
$distributeur = '';
$nomAgence = "";
$entite = "";
$bureau = "";
$codeEntite = !empty($codeSociete) ? $codeSociete : $codeEntite;
if ($codeEntite != Constantes::BG_ENTITE || !empty($codeSociete)) {
$context["filters"]["entite.codeEntite"] = $codeEntite;
}
$dateFin = ''; $dateDebut = "";
if(isset($context["filters"]["dateCreation"])){
$dateCreation = $context["filters"]["dateCreation"];
$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"] : "";
}
$forExport = str_contains($operationName, 'pdf') || str_contains($operationName, 'csv');
if ($forExport) {
$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 ;
}
$queryBuilder->orderBy('p.id', 'DESC');
$result = $queryBuilder->getQuery()->getResult();
// Dans le cas ou on cherche à exporter en PDF
if (str_contains($operationName, 'pdf')) {
$nombre = count($result);
$montant = 0;
foreach ( $result as $app) {
$montant += intval($app->getMontant());
}
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($this->templating->render(
'print/appros.html.twig',
["appros" => $result, 'nombre' => $nombre, 'datetxt' => $datetxt, 'montant' => $montant ]
), array(
'orientation'=>'Landscape',
'encoding' => 'utf-8',
'footer-right'=>'Page [page]/[toPage]', 'header-line'=>false,'footer-line' =>true,)),
'approvisionnement-pdf-export.pdf'
);
}elseif (str_contains($operationName, 'csv')) {
$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 ' .$datetxt,'','','','','','','','',
]);
}
fputcsv($fp, [
'Date de création',
'Entités',
'Montant XOF',
'Statut',
'Date de validation',
]);
/** @var Transaction $transaction */
foreach ($result as $appro) {
fputcsv($fp, [
$appro->getDateCreation()->format('d-m-Y H:i:s'),
$appro->getEntite()->getRaisonSociale(),
$appro->getMontant(),
$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-pos.csv"');
return $response;
}
}
if ( $operationName == "stat_approvisionnement" || $operationName == "stat_approvisionnement_entite" || $operationName == "stat_approvisionnement_banque" ) {
if ($operationName == "stat_approvisionnement" ){
$queryBuilder->andwhere('p.operateur IS NOT NULL');
} elseif ($operationName == "stat_approvisionnement_banque" ){
$context["filters"]["entite.fournisseur"] = "1";
}
$sqlAgregate = "count(DISTINCT p.id) as nombre, COALESCE(sum(p.montant), 0 ) as total";
$queryBuilder->select($sqlAgregate);
}
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);
}
}
return $queryBuilder->getQuery()->getResult();
//return $result;
}
}