<?php
namespace App\Controller\Api\Production;
use DateTime;
use App\Entity\User;
use App\Service\HierarchyService;
use App\Repository\UserRepository;
use App\Repository\ClusterRepository;
use App\Repository\ProductionRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\PointOfSaleRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class ProductionsByDayController extends AbstractController
{
private $clusterRepository;
private $productionRepository;
private $pointOfSaleRepository;
private $userRepository;
public function __construct(
ClusterRepository $clusterRepository,
ProductionRepository $productionRepository,
PointOfSaleRepository $pointOfSaleRepository,
UserRepository $userRepository
) {
$this->clusterRepository = $clusterRepository;
$this->productionRepository = $productionRepository;
$this->pointOfSaleRepository = $pointOfSaleRepository;
$this->userRepository = $userRepository;
}
public function __invoke(
$pointOfSaleId,
Request $request,
EntityManagerInterface $entityManager,
HierarchyService $hierarchyService
) {
$pointOfSale = $this->pointOfSaleRepository->findOneBy(["id" => $pointOfSaleId]);
if ($pointOfSale == null) {
return new JsonResponse('Le point de vente avec cet ID n\'existe pas.', 404);
}
$codeCluster = $request->query->get('codeCluster', null);
$mois = $request->query->get('mois', null);
$annee = $request->query->get('annee', null);
$category = $request->query->get('categoryId', null);
$user = null;
$cluster = null;
if ($codeCluster) {
$cluster = $this->clusterRepository->findOneBy(['codeCluster' => $codeCluster]);
if ($cluster == null) {
return new JsonResponse(['error' => 'Aucun cluster avec ce code'], 404);
}
}
$optionSelect = $request->query->get('optionSelect', 'B');
$codeInsee = $request->query->get('codeInsee', null);
$roleUser = $request->query->get('roleUser', "ROLE_COMPANY");
$childs = [];
$user = null;
if ($request->query->get('idUser') != null) {
$user = $entityManager->getRepository(User::class)->find((int)$request->query->get('idUser'));
if (!$user) {
throw new BadRequestHttpException('L\'utilisateur avec cet ID n\'existe pas.');
}
// Récupérer l'hierarchie descendante
if (in_array('ROLE_MANAGER', $user->getRoles()) || in_array('ROLE_DIRECTOR', $user->getRoles())) {
$childs = array_map(fn($p) => (int) $p['id'], $hierarchyService->getHierarchyDescendante($user->getId()));
}
}
// Récupérer les ventes par jour
$moisPrecedent = null;
if ($mois) {
$moisPrecedent = $mois - 1;
}
$salesByDayMonth = $this->productionRepository->getSalesByDay($pointOfSale, $cluster, $mois, $annee, $codeInsee, $optionSelect, $roleUser, $category, $childs);
if ((int)$mois == 1) {
$yearPrecedent = $annee - 1;
$moisPrecedent = 12;
$salesByDayForPreviousMonth = $this->productionRepository->getSalesByDay($pointOfSale, $cluster, $moisPrecedent, $yearPrecedent, $codeInsee, $optionSelect, $roleUser, $category, $childs);
} else {
$salesByDayForPreviousMonth = $this->productionRepository->getSalesByDay($pointOfSale, $cluster, $moisPrecedent, $annee, $codeInsee, $optionSelect, $roleUser, $category, $childs);
}
return new JsonResponse([
'ventes_par_jour' => $salesByDayMonth,
'ventes_par_jour_mois-1' => $salesByDayForPreviousMonth,
]);
}
/**
* @Route("api/productions-for-one-day/{pointOfSaleId}", name="api_get_productions_by_hour_for_one_day", methods={"GET"})
*/
public function productionsTotalByHourForOneDay($pointOfSaleId, Request $request)
{
$pointOfSale = $this->pointOfSaleRepository->findOneBy(["id" => $pointOfSaleId]);
$date = $request->query->get('date', date('Y-m-d'));
$date = str_replace('/', '-', $date);
$roleUser = $request->query->get('roleUser', "ROLE_COMPANY");
if ($pointOfSale == null) {
return new JsonResponse('Le point de vente avec cet ID n\'existe pas.', 404);
}
try {
$date = new DateTime($date);
} catch (\Throwable $th) {
return new JsonResponse('la date ne respecte pas le format attendu');
}
$codeCluster = $request->query->get('codeCluster', null);
$user = null;
$cluster = null;
if ($codeCluster) {
$cluster = $this->clusterRepository->findOneBy(['codeCluster' => $codeCluster]);
if ($cluster == null) {
return new JsonResponse(['error' => 'Aucun cluster avec ce code'], 404);
}
}
$optionSelect = $request->query->get('optionSelect', 'B');
$codeInsee = $request->query->get('codeInsee', null);
$organisationId = $request->query->get('organisationId', null);
$userId = $request->query->get('userId', null);
if ($userId) {
$user = $this->userRepository->findOneBy(['id' => $userId]);
if (!$user) {
return new JsonResponse(['error' => 'Aucun utilisateur avec cet ID'], 404);
}
}
// Récupérer les ventes par jour
$details = $this->productionRepository->getProductionsDetailsForOneDay($pointOfSale, $date, $cluster, $codeInsee, $user, $optionSelect, null, null, $roleUser, $organisationId);
$salesByHour = $this->productionRepository->getSalesForOneDayByHour($pointOfSale, $date, $cluster, $codeInsee, $user, $optionSelect, $roleUser);
return new JsonResponse([
'ventes_de_jour' => (int)count($details),
'ventes_par_heure' => $salesByHour,
'details' => $details
]);
}
/**
* @Route("api/productions-details-for-one-day/{pointOfSaleId}", name="api_get_productions_details_fro_one_day", methods={"GET"})
*/
public function productionsDetailsForOneDay(
$pointOfSaleId,
Request $request,
EntityManagerInterface $entityManager,
HierarchyService $hierarchyService
) {
$pointOfSale = $this->pointOfSaleRepository->findOneBy(["id" => $pointOfSaleId]);
$date = $request->query->get('date', date('Y-m-d'));
$roleUser = $request->query->get('roleUser', "ROLE_COMPANY");
$anneeMois = $request->query->get('yearMonth', null);
$etatId = $request->query->get('etatId', null);
$date = str_replace('/', '-', $date);
if ($pointOfSale == null) {
return new JsonResponse('Le point de vente avec cet ID n\'existe pas.', 404);
}
try {
$date = new DateTime($date);
} catch (\Throwable $th) {
return new JsonResponse('la date ne respecte pas le format attendu');
}
$codeCluster = $request->query->get('codeCluster', null);
$cluster = null;
if ($codeCluster) {
$cluster = $this->clusterRepository->findOneBy(['codeCluster' => $codeCluster]);
if ($cluster == null) {
return new JsonResponse(['error' => 'Aucun cluster avec ce code'], 404);
}
}
$optionSelect = $request->query->get('optionSelect', 'B');
$codeInsee = $request->query->get('codeInsee', null);
$organisationId = $request->query->get('organisationId', null);
$childs = [];
$user = null;
if ($request->query->get('idUser') != null) {
$user = $entityManager->getRepository(User::class)->find((int)$request->query->get('idUser'));
if (!$user) {
throw new BadRequestHttpException('L\'utilisateur avec cet ID n\'existe pas.');
}
if (! in_array('ROLE_COMPANY', $user->getRoles())) {
$childs = [$user->getId()];
// Récupérer l'hierarchie descendante
if (in_array('ROLE_MANAGER', $user->getRoles()) || in_array('ROLE_DIRECTOR', $user->getRoles())) {
$childs = array_map(fn($p) => (int) $p['id'], $hierarchyService->getHierarchyDescendante($user->getId()));
}
}
}
$details = $this->productionRepository->getProductionsDetailsForOneDay($pointOfSale, $date, $cluster, $codeInsee, $optionSelect, $anneeMois, $etatId, $roleUser, $childs, $organisationId);
return new JsonResponse($details, 200);
}
}