<?php
namespace App\Controller\Api\Panier;
use App\Entity\User;
use App\Repository\EtatProductionRepository;
use App\Repository\NmdAppPanierRepository;
use App\Repository\PointOfSaleRepository;
use App\Repository\ProductionRepository;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class PanierDetailsController extends AbstractController
{
public function __invoke(
Request $request,
PointOfSaleRepository $pointOfSaleRepository,
NmdAppPanierRepository $panierRepository
): JsonResponse {
$pointOfSaleId=$request->query->get('pointOfSaleId',null);
$page=$request->query->get('page',1);
$pointOfSale = $pointOfSaleRepository->findOneBy(['id' => $pointOfSaleId]);
// Retrieve and cast filters
$mois = (int) $request->query->get('mois', date('n')); // 'n' gives numeric month without leading zero
$annee = (int) $request->query->get('annee', date('Y')); // 'Y' gives full year (e.g. 2025)
// Get panier data with filters
$data = $panierRepository->getPanierDetailsByHour($pointOfSale, $mois, $annee,$page);
if (empty($data)) {
return new JsonResponse(['erreur' => 'Aucun résultat trouvé'], 404);
}
// Organisation des résultats
$formattedResult = [];
foreach ($data as $row) {
$heure = (int) $row['heure'];
$userId = $row['user_id'];
$nombreLignes = (int) $row['nombre_lignes'];
unset($row['heure'], $row['user_id'], $row['nombre_lignes']);
if (!isset($formattedResult[$heure])) {
$formattedResult[$heure] = [
'nombre_lignes' => 0,
'details' => [],
];
}
$formattedResult[$heure]['nombre_lignes'] += $nombreLignes;
$formattedResult[$heure]['details'][] = [
'user_id' => $userId,
'paniers' => $this->cleanPanierData($row),
];
}
// Keep totals independent unless you also want to filter them
$total_this_day = $panierRepository->getTotalThisElement($pointOfSale, 'day');
$total_this_hour = $panierRepository->getTotalThisElement($pointOfSale, 'hour');
$formattedResult['total_this_day'] = (int) $total_this_day;
$formattedResult['total_this_hour'] = (int) $total_this_hour;
return new JsonResponse($formattedResult, 200);
}
private function cleanPanierData(array $panier): array
{
unset($panier['nombre_lignes'], $panier['user_id'], $panier['heure']);
return $panier;
}
/**
* @Route("api/paniers-non-valides", name="api_get_paniers_not_validated", methods={"GET"})
*/
public function getPaniersNonValides(
Request $request,
PointOfSaleRepository $pointOfSaleRepository,
NmdAppPanierRepository $panierRepository
): JsonResponse {
$pointOfSaleId = $request->query->get('pointOfSaleId', null);
$pointOfSale = $pointOfSaleRepository->findOneBy(['id' => $pointOfSaleId]);
// Traitement de la date
$date = $request->query->get('date', date('Y-m-d'));
$date = str_replace('/', '-', $date);
try {
$date = new \DateTime($date);
} catch (\Throwable $th) {
return new JsonResponse(['erreur' => 'La date ne respecte pas le format attendu (YYYY-MM-DD)'], 400);
}
// Traitement du paramètre yearMonth (format attendu : YYYY-MM)
$yearMonth = $request->query->get('yearMonth', date('Y-m'));
$yearMonth = str_replace('/', '-', $yearMonth); // supporte aussi YYYY/MM
try {
$yearMonthDate = \DateTime::createFromFormat('Y-m', $yearMonth);
if (!$yearMonthDate) {
throw new \Exception();
}
$year = (int) $yearMonthDate->format('Y');
$month = (int) $yearMonthDate->format('m');
} catch (\Exception $e) {
return new JsonResponse(['erreur' => 'Le paramètre yearMonth doit être au format YYYY-MM'], 400);
}
// Récupération des paniers non validés avec les filtres
$data = $panierRepository->getPaniersNonValides($pointOfSale, $date, $year, $month);
if (empty($data)) {
return new JsonResponse(['erreur' => 'Aucun résultat trouvé'], 200);
}
return new JsonResponse(["total"=>count($data)??0,"details"=>$data], 200);
}
}