<?php
namespace App\Controller\APIIctus;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Repository\ParcoursRepository;
use App\Repository\LivraisonRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\IctusCommandeRepository;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\SocieteLivraisonRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\IctusMobileAppareilRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Services\NotificationSocieteLivraisonService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/api_ictus/livraison", name="api_ictus_livraison_")
*/
class ApiLivraisonController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/{id}", name="livraison_par_livraire", methods={"GET"})
*/
public function livraisonParLivraire(User $user, LivraisonRepository $livraisonRepository): JsonResponse
{
// Vérification explicite que l'utilisateur existe
if (!$user || !$user->getId()) {
return new JsonResponse([
'error' => true,
'message' => 'Utilisateur non trouvé'
], 404);
}
$livraisons = $livraisonRepository->findBy(
['livreur' => $user],
['createdAt' => 'DESC'] // Optionnel : trier par date
);
$data = [];
foreach ($livraisons as $livraison) {
$data[] = [
'id' => $livraison->getId(),
'tarif' => $livraison->getTarif(),
'code' => $livraison->getCode(),
'codeSecret' => $livraison->getCodeSecret(),
// Tu peux ajouter d'autres champs utiles :
// 'statut' => $livraison->getStatut(),
'date' => $livraison->getCreatedAt()?->format('d-M-Y H:i'),
];
}
return new JsonResponse([
'error' => false,
'message' => 'Livraisons récupérées avec succès',
'dataLivraison' => $data,
'count' => count($data) // Utile pour le frontend
]);
}
/**
* @Route("/parcours/{id}", name="parcours", methods={"GET"})
*/
public function parcours($id, ParcoursRepository $parcoursRepo): JsonResponse
{
if (!$id) {
return new JsonResponse([
'error' => true,
'message' => 'ID de livraison manquant'
], 400);
}
$allParcours = $parcoursRepo->allParcoursByLivraison($id);
if (empty($allParcours)) {
return new JsonResponse([
'error' => false,
'message' => 'Aucun parcours trouvé',
'clients' => [],
'count' => 0
]);
}
$clientsData = [];
$tarifTotalGlobal = 0;
foreach ($allParcours as $parcour) {
$commande = $parcour->getIctusCommande();
$pharmacie = $commande->getPharmacie();
$client = $commande->getUser();
$adressePatient = $parcour->getAdresse();
if (!$client) continue;
$clientId = $client->getId();
// Initialisation du client s'il n'existe pas encore
if (!isset($clientsData[$clientId])) {
$clientsData[$clientId] = [
'client_id' => $clientId,
'client_nom' => $client->getNomComplet(),
'client_adresse' => $adressePatient->getLot().", ".$adressePatient->getQuartier()->getName().", ".$adressePatient->getQuartier()->getVille()->getName(),//$client->getFullAdresse(),
'client_contact' => $client->getPhone(),
'tarifTotal' => 0,
'parcours' => [] // Liste des parcours du client
];
}
$tarif = $parcour->getLivraison()->getTarif() ?? 0;
$clientsData[$clientId]['tarifTotal'] += $tarif;
$tarifTotalGlobal += $tarif;
// Ajout du parcours pour ce client
$clientsData[$clientId]['parcours'][] = [
'pharmacie_id' => $pharmacie->getId(),
'designation' => $pharmacie->getDesignation(),
'adresse' => $pharmacie->getFullAdresse(),
'nun_commande' => $commande->getConcatRefCmd(),
'code_recuperation_pcie' => $commande->getCode() . $commande->getCodeSecret(),
'tarif_recuperation' => $tarif,
'code_recuperation_livreur' => $parcour->getLivraison()->getCode(),
'etat' => $parcour->getEtat(),
'commande_etat' => $commande->isIsLivrer(),
'parcours_id' => $parcour->getId()
];
}
// Conversion en tableau indexé (pour le frontend)
$clientsArray = array_values($clientsData);
return new JsonResponse([
'error' => false,
'message' => 'Parcours récupérés avec succès',
'clients' => $clientsArray, // Données groupées par client
'tarifTotalGlobal' => $tarifTotalGlobal, // Total général (optionnel)
'count' => count($allParcours)
]);
}
/**
* @Route("/parcours/verifcode/{id}", name="verification_code", methods={"POST"})
*/
public function verifCodeParcour(Request $request, ParcoursRepository $parcourRepo, $id): Response
{
$content = $request->getContent();
$message = "Erreur du traitement";
if (!empty($content)) {
$decoded = json_decode($content, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
$data = $decoded;
}
}
if (empty($data)) {
$data = $request->query->all();
}
$code_secret = $data['code_secret'] ?? $data['code_secret'] ?? null;
if (empty($code_secret) || !is_numeric($code_secret)) {
return new JsonResponse(
['error' => 'Paramètre code secret manquant ou invalide'],
Response::HTTP_BAD_REQUEST
);
}
$parcour = $parcourRepo->find($id);
if (!$parcour) {
return new JsonResponse(
['error' => 'Parcours non trouvé'],
Response::HTTP_NOT_FOUND
);
}
if ($parcour->getLivraison()->getCodeSecret() == $code_secret) {
$parcour->setEtat(1);
$commande = $parcour->getIctusCommande();
$commande->setIsLivrer(1)->setIsRecuperer(1);
$this->em->persist($commande);
$this->em->persist($parcour);
$this->em->flush();
$message ="Colis marqué comme livré";
} else {
$message ="Code sécret erroné!";
return new JsonResponse([
'error' => true,
'message' => $message
]);
}
return new JsonResponse([
'error' => false,
'message' => $message
]);
}
/**
* @Route("/livreur-position/{id}", name="get_postion_livreur", methods={"POST"})
*/
public function getPositionLivreur(User $user, Request $request)
{
$data = [];
$content = $request->getContent();
if (!empty($content)) {
$decoded = json_decode($content, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
$data = $decoded;
}
}
if (empty($data)) {
$data = $request->query->all();
}
$longitude = $data['longitude'] ?? null;
$latitude = $data['latitude'] ?? null;
if (!is_numeric($longitude) || !is_numeric($latitude)) {
return new JsonResponse(
['error' => 'Paramètre latitude ou longitude manquant ou invalide'],
Response::HTTP_BAD_REQUEST
);
}
$user->setLogitude((float) $longitude)->setLatitude((float) $latitude);
$this->em->flush();
return new JsonResponse([
'error' => false,
'message' => 'Position mise à jour avec succès',
]);
}
/**
* @Route("/livreur-proposition-refuser/{id}", name="proposition_refuser", methods={"POST"})
*/
public function refuserPropositionLivraison($id,ParcoursRepository $parcourRepo,UserRepository $userRepo, IctusCommandeRepository $ictusCommandeRepo, IctusMobileAppareilRepository $mobileAppareilRepo, NotificationSocieteLivraisonService $notificationSLService)
{
if (is_null($id)) {
return new JsonResponse(
['error' => 'Paramètre id commande manquant ou invalide'],
Response::HTTP_BAD_REQUEST
);
}
$parcour = $parcourRepo->find($id);
$ictusCommande = $parcour->getIctusCommande();//$ictusCommandeRepo->findById($id);
$ancienlivreur = $parcour->getLivraison()->getLivreur();
$ancienlivreur->setIsDisponible(null);
$this->em->flush();
$sl = null;
$parcours = $ictusCommande->getParcours();
if ($parcours != null) {
$sl = $parcours->getLivraison()->getSocieteLivraison();
}
//dd($sl2->getUsers()[0]);
//$sl = $ictusCommande->getSocieteLivraison();
//$pt = $ictusCommande->getUser();
$parmacie = $ictusCommande->getPharmacie();
if ($sl) {
$data = [
'type' => 'delivery_request',
'status' => 'validated_by_pharmacy',
'click_action' => 'FLUTTER_NOTIFICATION_CLICK', // utile si tu as une app Flutter
];
$user_sl = $sl->getUsers()[0];
$mobileAppareils = $mobileAppareilRepo->findAllToArray($user_sl);
$array_cfm_token = array_unique((array_column($mobileAppareils, "cfm_tokem")));
if ($sl->isIsAutomatique()) {
//ici
//Attribution automatique du livreur
$livreur = $userRepo->findNearestLivreur($parmacie->getLatitude(), $parmacie->getLogitude(), $sl, $ancienlivreur->getId());
$livraison = $parcours->getLivraison();
$livraison->setLivreur($livreur);
$this->em->persist($livraison);
if ($livreur) {
//livreur set non disponible
$livreur->setIsDisponible(null);
$this->em->flush();
//envoie notification au livreur attribué
foreach ($livreur->getIctusMobileAppareils() as $appareil) {
$notificationSLService->sendNotification(
$appareil->getCfmTokem(),
'Nouvelle mission de livraison',
'Demande validée par la pharmacie, vous avez été attribué pour cette livraison.',
$data
);
}
//Envoie notification au responsable de la société de livraison
foreach ($array_cfm_token as $token) {
$notificationSLService->sendNotification(
$token,
'Nouvelle demande de livraison',
'Demande validée par la pharmacie, livreur attribué automatiquement à un livreur proche de la pharmacie',
$data
);
}
} else {
if (!empty($array_cfm_token)) {
foreach ($array_cfm_token as $token) {
$notificationSLService->sendNotification(
$token,
'Nouvelle demande de livraison',
'Demande validée par la pharmacie, veuillez attribuer un livreur.',
$data
);
}
}
}
//fin
} else {
if (!empty($array_cfm_token)) {
foreach ($array_cfm_token as $token) {
$notificationSLService->sendNotification(
$token,
'Nouvelle demande de livraison',
'Demande validée par la pharmacie, veuillez attribuer un livreur.',
$data
);
}
}
}
}
return new JsonResponse([
'error' => false,
'message' => 'Refus livraison avec succès',
]);
}
}