<?php
namespace App\Controller;
use App\Entity\Litige;
use App\Entity\LitigeStatusHistory;
use App\Entity\Signature;
use App\Event\AddTaskCommentEvent;
use App\Helpers\JwtHelper;
use App\Repository\CarriersRepository;
use App\Repository\CompanysRepository;
use App\Repository\DriversRepository;
use App\Repository\EntrepriseAdresseHistoryRepository;
use App\Repository\GoodsRepository;
use App\Repository\LitigeRepository;
use App\Repository\RefCountryRepository;
use App\Repository\RefStatusRepository;
use App\Repository\SignatureRepository;
use App\Repository\TaskCommentRepository;
use App\Repository\TaskDriverRepository;
use App\Repository\TaskRepository;
use App\Repository\TasksStatusHistoryRepository;
use App\Repository\TaskTrackingRepository;
use App\Repository\TaskVehiculeRepository;
use App\Repository\TourneeRepository;
use App\Repository\TourneeTaskRepository;
use App\Repository\UserRepository;
use App\Repository\VehiculesRepository;
use App\Services\CompanyService;
use App\Services\LitigeService;
use App\Services\MailingAttempsFailedService;
use App\Services\SendMailService;
use App\Services\SignatureService;
use App\Services\TasksService;
use App\Services\UploadService;
use DateTime;
use Doctrine\Persistence\ManagerRegistry;
use Dompdf\Dompdf;
use Dompdf\Options;
use FPDISigep;
use Nelmio\ApiDocBundle\Annotation\Security;
use OpenApi\Annotations as OA;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use App\Services\PdfGeneratorService;
use Doctrine\ORM\EntityManagerInterface;
class TasksController extends AbstractController
{
private $mailer;
private $_tasksService;
private $_uploadService;
private $_companyService;
private $_taskRepository;
private $_refStatusRepository;
private $_userRepository;
private $_signatureRepository;
private $_taskDriverRepository;
private $_driversRepository;
private $_taskVehiculeRepository;
private $_carriersRepository;
private $_companysRepository;
private $_refCountryRepository;
private $_vehiculeRepository;
private $_tokenGenerator;
private $_signatureService;
private $_sendMailService;
private $_taskStatusHistoryRepository;
private $_goodsRepository;
private $_entrepriseAdresseHistoryRepository;
private $_taskCommentRepository;
private $_doctrine;
private $_dispatcher;
private $_taskTrakingRepository;
private $_litigeRepository;
private $_litigeService;
private $logger;
private $_mailingAttempsFailedService;
private $_tourneeRepository;
private $_tourneeTaskRepository;
private $jwtHelper;
private $_params;
private $_pdfGeneratorService;
public function __construct(
TasksService $tasksService,
CompanyService $companyService,
UploadService $uploadService,
TaskRepository $taskRepository,
RefStatusRepository $refStatusRepository,
UserRepository $userRepository,
SignatureRepository $signatureRepository,
TaskDriverRepository $taskDriverRepository,
DriversRepository $driversRepository,
TaskVehiculeRepository $taskVehiculeRepository,
CarriersRepository $carriersRepository,
CompanysRepository $companysRepository,
RefCountryRepository $refCountryRepository,
TokenGeneratorInterface $tokenGenerator,
SignatureService $signatureService,
SendMailService $sendMailService,
VehiculesRepository $vehiculesRepository,
TasksStatusHistoryRepository $tasksStatusHistoryRepository,
GoodsRepository $goodsRepository,
EntrepriseAdresseHistoryRepository $entrepriseAdresseHistoryRepository,
TaskCommentRepository $taskCommentRepository,
MailerInterface $mailer,
ManagerRegistry $doctrine,
EventDispatcherInterface $dispatcher,
TaskTrackingRepository $trakingRepository,
LitigeRepository $litigeRepository,
LitigeService $litigeService,
LoggerInterface $logger,
MailingAttempsFailedService $mailingAttempsFailedService,
TourneeRepository $tourneeRepository,
TourneeTaskRepository $tourneeTaskRepository,
JwtHelper $jwtHelper,
ParameterBagInterface $params,
PdfGeneratorService $pdfGeneratorService
)
{
$this->_tasksService = $tasksService;
$this->_companyService = $companyService;
$this->_uploadService = $uploadService;
$this->_taskRepository = $taskRepository;
$this->_refStatusRepository = $refStatusRepository;
$this->_userRepository = $userRepository;
$this->_signatureRepository = $signatureRepository;
$this->_taskDriverRepository = $taskDriverRepository;
$this->_driversRepository = $driversRepository;
$this->_taskVehiculeRepository = $taskVehiculeRepository;
$this->_carriersRepository = $carriersRepository;
$this->_companysRepository = $companysRepository;
$this->_refCountryRepository = $refCountryRepository;
$this->_signatureService = $signatureService;
$this->_sendMailService = $sendMailService;
$this->_tokenGenerator = $tokenGenerator;
$this->_vehiculeRepository = $vehiculesRepository;
$this->_taskStatusHistoryRepository = $tasksStatusHistoryRepository;
$this->_goodsRepository = $goodsRepository;
$this->_entrepriseAdresseHistoryRepository = $entrepriseAdresseHistoryRepository;
$this->_taskCommentRepository = $taskCommentRepository;
$this->_doctrine = $doctrine;
$this->_dispatcher = $dispatcher;
$this->mailer = $mailer;
$this->_taskTrakingRepository = $trakingRepository;
$this->_litigeRepository = $litigeRepository;
$this->_litigeService = $litigeService;
$this->logger = $logger;
$this->_mailingAttempsFailedService = $mailingAttempsFailedService;
$this->_tourneeRepository = $tourneeRepository;
$this->_tourneeTaskRepository = $tourneeTaskRepository;
$this->jwtHelper = $jwtHelper;
$this->_params = $params;
$this->_pdfGeneratorService = $pdfGeneratorService;
}
private function canFinalizeSignature($task, Signature $signatureObj, string $typeSignature): bool
{
$prefix = ($typeSignature === 'expediteur') ? 'Signature du remettant' : 'Signature du destinataire';
$existingComment = $this->_taskCommentRepository->findSignatureCommentByTaskAndPrefix($task->getId(), $prefix);
// Si la signature a déjà été finalisée avec son événement d'historique, on verrouille toute modification
if ($existingComment !== null) {
return false;
}
$lastStatus = $this->_taskStatusHistoryRepository->findStatusByTaskId($task->getId());
if (empty($lastStatus)) {
return false;
}
$slug = $lastStatus[0]['slug'];
if ($slug === 'started') {
return true;
}
if ($slug === 'finished' && isset($lastStatus[0]['date']) && $lastStatus[0]['date'] instanceof \DateTimeInterface) {
// Si la signature avait déjà été modifiée avant (signed_at != signed_driver_at) mais sans événement, ou si elle vient d'être initiée,
// on autorise dans un délai maximal de 15 minutes (900 secondes) après la clôture de la mission.
$now = new DateTime();
$diffInSeconds = $now->getTimestamp() - $lastStatus[0]['date']->getTimestamp();
if ($diffInSeconds <= 900) {
return true;
}
}
return false;
}
private function dispatchSignatureCommentIfNotExists($task, Signature $signatureObj, string $typeSignature): void
{
$prefix = ($typeSignature === 'expediteur') ? 'Signature du remettant' : 'Signature du destinataire';
$existingComment = $this->_taskCommentRepository->findSignatureCommentByTaskAndPrefix($task->getId(), $prefix);
if ($existingComment === null) {
$nom_contact = $signatureObj->getNom();
$datetime = $signatureObj->getSignedAt() ?: new DateTime();
$date_time = $datetime->format('d/m/Y à H:i');
$message = "$prefix le $date_time par $nom_contact.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, null, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
}
}
#[Route('/api/delete/planned-at/{id}/{userId}', name: 'app_delete_planned_at', methods: ['GET', "POST"])]
public function delete_planned_at(Request $request, $id, $userId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$task = $this->_taskRepository->find($id);
$status_ = $this->_refStatusRepository->findStatusBy("mission", "prog_in_progress");
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$this->_tasksService->updatePlannedAt($task, null);
$this->_tasksService->addStatusTaskHistory($task, $status);
// événement
$user = $this->_userRepository->find($userId);
$message = "La date de planification est supprimée.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Date de planification supprimée avec succès.", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/signatures/{mission_id}', name: 'app_signatures_mission', methods: ['GET', "POST"])]
public function signatures_mission(Request $request, $mission_id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$signatures = $this->_signatureRepository->findSigByTask($mission_id);
$arrToReturn = [];
switch (count($signatures)) {
case 1 :
{
$arrToReturn[$signatures[0]['type_signature']] = $signatures;
}
break;
case 2 :
{
foreach ($signatures as $signature) {
$arrToReturn[$signature['type_signature']][] = $signature;
}
}
break;
}
return new JsonResponse(['signatures' => $arrToReturn, 'length' => count($arrToReturn), 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/change/driver/mission/{id}', name: 'app_change_driver_mission', methods: ['POST'])]
public function change_driver_mission(Request $request, $id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
$task = $this->_taskRepository->find($id);
// service de modification global des chauffeurs.
$this->_tasksService->changeDriversOfMission($data, $task);
$user = $this->_userRepository->find($data['user_id']);
// événement
$message = "Chauffeurs modifiés.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Changement fait avec succès!", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/change/vehicule/mission/{id}', name: 'app_change_vehicule_mission', methods: ['POST'])]
public function change_vehicule_mission(Request $request, $id, \Psr\Log\LoggerInterface $logger)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
$logger->error('PAYLOAD RECEIVED FOR CHANGE VEHICLE: ' . json_encode($data));
$task = $this->_taskRepository->find($id);
// service de modification global des véhicules.
$this->_tasksService->changeVehiculesOfMission($data, $task);
$user = $this->_userRepository->find($data['user_id']);
// événement
$message = "Véhicules modifiés.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Changement fait avec succès!", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/change/company/mission/{id}/{type_company}', name: 'app_change_company_mission', methods: ['POST'])]
public function change_company_mission(Request $request, $id, $type_company)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
// get carrier of connected user
$user = $this->_userRepository->find($data['user_id']);
$data['carrier'] = $this->_carriersRepository->find($user->getCarriers());;
// get mission by id
$task = $this->_taskRepository->find($id);
// get company by expediteur_id
if (
(isset($data['expediteur_ou_destinataire_id'])) && ($data['expediteur_ou_destinataire_id'] == "undefined") ||
(isset($data['expediteur_ou_destinataire_id'])) && ($data['expediteur_ou_destinataire_id'] == 0)
) {
$data['type'] = "2";
$data['country'] = $this->_refCountryRepository->find($data['ref_country_id_exp']);
$lat_long = $this->_companyService->getLatLongFromAddress($data['formattedAddress']);
$map = explode(',', $lat_long);
$mapLat = $map[0];
$mapLong = $map[1];
$data['lat'] = $mapLat;
$data['long'] = $mapLong;
} else {
$expediteur_ou_destinataire = $this->_companysRepository->find($data['expediteur_ou_destinataire_id']);
$data['expediteur_ou_destinataire'] = $expediteur_ou_destinataire;
}
// service d'ajout.
$this->_tasksService->changeComapnyOfMission($data, $task, $type_company);
switch ($type_company) {
case "expediteur":
$message = "L'expéditeur est changé.";
break;
case "destinataire":
$message = "Le destinataire est changé.";
break;
}
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Changement lieu expéditeur fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/change/contractor/mission/{id}', name: 'app_change_contractor_mission', methods: ['POST'])]
public function change_contractor_mission(Request $request, $id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
// get carrier of connected user
$user = $this->_userRepository->find($data['user_id']);
$data['carrier'] = $this->_carriersRepository->find($user->getCarriers());;
// get mission by id
$task = $this->_taskRepository->find($id);
// get company by donneur_id
if (
(isset($data['donneur_id'])) && ($data['donneur_id'] == "undefined") ||
(isset($data['donneur_id'])) && ($data['donneur_id'] == 0)
) {
$data['type'] = "1";
$data['country'] = $this->_refCountryRepository->find($data['ref_country_id']);
$lat_long = $this->_companyService->getLatLongFromAddress($data['formattedAddress']);
$map = explode(',', $lat_long);
$mapLat = $map[0];
$mapLong = $map[1];
$data['lat'] = $mapLat;
$data['long'] = $mapLong;
} else {
$donneur = $this->_companysRepository->find($data['donneur_id']);
$data['donneur'] = $donneur;
}
$this->_tasksService->changeDonneurOfMission($data, $task);
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, "Le donneur d'ordre est changé.", $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Changement du donneur fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/upload/image/{id}/{carrierId}', name: 'app_upload_image_ionic')]
public function upload_image_ionic($id, $carrierId)
{
$uploadDir = "uploads/";
$uploadedFile = $uploadDir . basename($_FILES['image_0']['name']);
$uploaded = move_uploaded_file($_FILES['image_0']['tmp_name'], $uploadedFile);
$uploadedFileObj = new UploadedFile(
$uploadDir . $_FILES['image_0']['name'],
$_FILES['image_0']['name'],
$_FILES['image_0']['type'],
$_FILES['image_0']['error'],
true
);
try {
$uploadedFileObj->move($uploadDir, $_FILES['image_0']['name']);
$data['litige'] = $this->_litigeRepository->findOneBy(['id' => $id]);
$data['carrier'] = $this->_carriersRepository->findOneBy(['id' => $carrierId]);
$this->_uploadService->uploadFile($uploadedFileObj, $data);
} catch (\Exception $e) {
die('Error moving file: ' . $e->getMessage());
}
return new JsonResponse(['message' => "Upload fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/upload/image/{goodId}', name: 'app_upload_image_good_ionic')]
public function upload_image_good_ionic($goodId)
{
$good = $this->_goodsRepository->findOneBy(['id' => $goodId]);
$data['good'] = $good;
$uploadDir = "uploads/";
$uploadedFile = $uploadDir . basename($_FILES['march_file']['name']);
$uploaded = move_uploaded_file($_FILES['march_file']['tmp_name'], $uploadedFile);
$uploadedFileObj = new UploadedFile(
$uploadDir . $_FILES['march_file']['name'],
$_FILES['march_file']['name'],
$_FILES['march_file']['type'],
$_FILES['march_file']['error'],
true
);
try {
$uploadedFileObj->move($uploadDir, $_FILES['march_file']['name']);
$this->_uploadService->uploadFile($uploadedFileObj, $data);
} catch (\Exception $e) {
die('Error moving file: ' . $e->getMessage());
}
return new JsonResponse(['message' => "Upload fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/upload/{missionId}/annexes', name: 'upload_image_doc_ionic')]
public function upload_image_doc_ionic($missionId)
{
$this->logger->info("mission id : " . $missionId);
$this->logger->info("files : " . $_FILES);
$task = $this->_taskRepository->findOneBy(['id' => $missionId]);
$data['task'] = $task;
$uploadDir = "uploads/";
$uploadedFile = $uploadDir . basename($_FILES['docs_annex']['name']);
$uploaded = move_uploaded_file($_FILES['docs_annex']['tmp_name'], $uploadedFile);
$uploadedFileObj = new UploadedFile(
$uploadDir . $_FILES['docs_annex']['name'],
$_FILES['docs_annex']['name'],
$_FILES['docs_annex']['type'],
$_FILES['docs_annex']['error'],
true
);
try {
$uploadedFileObj->move($uploadDir, $_FILES['docs_annex']['name']);
$this->_uploadService->uploadFile($uploadedFileObj, $data);
} catch (\Exception $e) {
die('Error moving file: ' . $e->getMessage());
}
return new JsonResponse(['message' => "Upload fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/upload/{missionId}/formalities', name: 'upload_image_form_douan_ionic')]
public function upload_image_form_douan_ionic($missionId)
{
$task = $this->_taskRepository->findOneBy(['id' => $missionId]);
$data['task'] = $task;
$uploadDir = "uploads/";
$uploadedFile = $uploadDir . basename($_FILES['form_douan']['name']);
$uploaded = move_uploaded_file($_FILES['form_douan']['tmp_name'], $uploadedFile);
$uploadedFileObj = new UploadedFile(
$uploadDir . $_FILES['form_douan']['name'],
$_FILES['form_douan']['name'],
$_FILES['form_douan']['type'],
$_FILES['form_douan']['error'],
true
);
try {
$uploadedFileObj->move($uploadDir, $_FILES['form_douan']['name']);
$this->_uploadService->uploadFile($uploadedFileObj, $data);
} catch (\Exception $e) {
die('Error moving file: ' . $e->getMessage());
}
return new JsonResponse(['message' => "Upload fait avec succès !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/add/good/{taskId}', name: 'app_add_goods_ionic')]
public function add_good_ionic(Request $request, $taskId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
// Récupération des données de la requête
$data = json_decode($request->getContent(), true);
// $data = $request->request->all();
$task = $this->_taskRepository->findOneBy(['id' => $taskId]);
$good = $this->_tasksService->addGood($task, $data);
return new JsonResponse(['good_id' => $good->getId(), 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/add/signature-exp', name: 'app_add_signature', methods: ['POST'])]
public function add_signature(Request $request): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
// Récupération des données
$user = $this->_userRepository->findOneBy(['id' => $request->request->get('user_id')]);
// Initialisation du tableau de données pour le service
$data = [];
$data['task'] = $this->_taskRepository->findOneBy(['id' => $request->request->get('task_id')]);
$data['expediteur'] = $this->_companysRepository->findOneBy(["id" => $request->request->get('id_exp')]);
// Mapping des champs du formulaire
$data['arrivee_a_exp'] = $request->request->get('arrivee_a_exp');
$data['depart_a_exp'] = $request->request->get('depart_a_exp');
$data['prestations_annexes_exp'] = $request->request->get('prestations_annexes_exp');
$data['reserves_eventuelles_exp'] = $request->request->get('reserves_eventuelles_exp');
$data['emailExp'] = $request->request->get('emailExp');
$data['nom_contactExp'] = $request->request->get('nom_contactExp');
$data['driver'] = $user->getDriver();
$data['carrier'] = $user->getCarriers();
$data["typeLitige"] = "chauffeur_expediteur";
$data["typeSignature"] = "expediteur"; // Important pour le filtre
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($last_status_task[0]['slug'] == "started") {
// 1. Recherche de l'existant
$existingSignature = $this->_signatureRepository->findOneBy([
'task' => $data['task'],
'type_signature' => 'expediteur'
]);
if ($existingSignature) {
// Si la signature du contact est déjà actée (différente de l'init chauffeur), on ne touche à rien.
$signedAt = $existingSignature->getSignedAt();
$signedDriverAt = $existingSignature->getSignedDriverAt();
if ($signedAt !== null && $signedDriverAt !== null && $signedAt != $signedDriverAt) {
// La signature est finalisée par le client. On renvoie l'ID existant sans update.
return new JsonResponse([
'task_id' => $data['task']->getId(),
'signature_id' => $existingSignature->getId(),
'status' => 200,
'message' => 'Signature already finalized'
], Response::HTTP_OK);
}
$signature = $existingSignature;
} else {
// CAS 2 : Elle n'existe pas, on en crée une nouvelle
$signature = new Signature();
}
// 2. On appelle le service qui va hydrater l'objet (nouveau ou existant) et flush
$this->_signatureService->addSignature($signature, $data);
// -------------------------------------------------------
// Gestion du Litige
$litigeId = null;
if(isset($data['reserves_eventuelles_exp']) && $data['reserves_eventuelles_exp']) {
// On pourrait appliquer la même logique "Find or Create" pour le litige ici si nécessaire
// Pour l'instant on garde ta logique de création
$litigeInstance = new Litige();
$this->_litigeService->addLitige($litigeInstance, $data);
$litigeId = $litigeInstance->getId();
$litigeStatusHistory = new LitigeStatusHistory();
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
if (!empty($status)) {
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litigeInstance, $statusObj);
}
}
// Construction de la réponse
$responseArray = [
'task_id' => $data['task']->getId(),
'signature_id' => $signature->getId(), // On renvoie l'ID de la signature (utile pour le front)
'status' => 200
];
if ($litigeId) {
$responseArray['litige_id'] = $litigeId;
}
return new JsonResponse($responseArray, Response::HTTP_OK);
}
return new JsonResponse(['message' => 'Task not started', 'status' => 400], Response::HTTP_BAD_REQUEST);
}
#[Route('/api/add/signature-dest', name: 'app_add_signature_dest', methods: ['POST'])]
public function add_signature_dest(Request $request): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
// Récupération user et entités liées
$user = $this->_userRepository->findOneBy(['id' => $request->request->get('user_id')]);
$data = [];
$data['driver'] = $user->getDriver();
$data['carrier'] = $user->getCarriers();
$data['task'] = $this->_taskRepository->find(['id' => $request->request->get('task_id')]);
$data['destinataire'] = $this->_companysRepository->findOneBy(["id" => $request->request->get('id_dest')]);
// Configuration type
$data["typeSignature"] = "destinataire";
$data["typeLitige"] = "chauffeur_destinataire";
// Mapping des champs
$data['arrivee_a_dest'] = $request->request->get('arrivee_a_dest');
$data['depart_a_dest'] = $request->request->get('depart_a_dest');
$data['prestations_annexes_dest'] = $request->request->get('prestations_annexes_dest');
$data['reserves_eventuelles_dest'] = $request->request->get('reserves_eventuelles_dest');
$data['emailDest'] = $request->request->get('emailDest');
$data['nom_contactDest'] = $request->request->get('nom_contactDest');
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($last_status_task[0]['slug'] == "started") {
// --- CORRECTION : LOGIQUE UPSERT (Find Or Create) ---
// 1. Recherche d'une signature existante pour ce destinataire sur cette tâche
$existingSignature = $this->_signatureRepository->findOneBy([
'task' => $data['task'],
'type_signature' => 'destinataire'
]);
if ($existingSignature) {
$signedAt = $existingSignature->getSignedAt();
$signedDriverAt = $existingSignature->getSignedDriverAt();
if ($signedAt !== null && $signedDriverAt !== null && $signedAt != $signedDriverAt) {
return new JsonResponse([
'task_id' => $data['task']->getId(),
'signature_id' => $existingSignature->getId(),
'status' => 200,
'message' => 'Signature already finalized'
], Response::HTTP_OK);
}
$signature = $existingSignature;
} else {
// INSERT : On crée un nouvel objet
$signature = new Signature();
}
// 2. Hydratation via le service (persist/flush inclus dans le service)
$this->_signatureService->addSignature($signature, $data);
// ----------------------------------------------------
// Gestion du litige ( inchangée )
$litigeId = null;
if(isset($data['reserves_eventuelles_dest']) && $data['reserves_eventuelles_dest']) {
$litigeInstance = new Litige();
$this->_litigeService->addLitige($litigeInstance, $data);
$litigeId = $litigeInstance->getId();
$litigeStatusHistory = new LitigeStatusHistory();
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
if (!empty($status)) {
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litigeInstance, $statusObj);
}
}
// Construction de la réponse
$responseArray = [
'task_id' => $data['task']->getId(),
'signature_id' => $signature->getId(), // ID stable retourné
'status' => 200
];
if ($litigeId) {
$responseArray['litige_id'] = $litigeId;
}
return new JsonResponse($responseArray, Response::HTTP_OK);
}
return new JsonResponse(['message' => 'Task not started', 'status' => 400], Response::HTTP_BAD_REQUEST);
}
#[Route('/api/litiges/{id}/status', name: 'change_litige_status', methods: ['POST'])]
public function changeLitigeStatus(int $id, Request $request): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
// Lire et décoder le contenu de la requête
$content = json_decode($request->getContent(), true);
// Récupérer le litige par son ID
$litige = $this->_litigeRepository->findOneBy(['id' => $id]);
if (!$litige) {
return new JsonResponse(['message' => 'Litige not found'], 404);
}
$statusSlug = $content['statusSlug'] ?? null;
// Valider le statut slug
if (!$statusSlug) {
return new JsonResponse(['message' => 'Status slug is required'], 400);
}
// Récupérer le RefStatus par son slug
$refStatus = $this->_refStatusRepository->findOneBy(['slug' => $statusSlug]);
if (!$refStatus) {
return new JsonResponse(['message' => 'Invalid status slug'], 400);
}
$litigeStatusHistory = new LitigeStatusHistory();
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litige, $refStatus);
// Retourner une réponse de succès
return new JsonResponse(['message' => 'Statut changé avec succès !']);
}
#[Route('/api/litiges/{carrierId}', name: 'api_litiges_details', methods: ['GET', "POST"])]
public function litiges(Request $request, int $carrierId): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$litiges = $this->_litigeRepository->findLitigesByCarrier($carrierId);
foreach ($litiges as &$litige) {
$litigeObj = $this->_litigeRepository->findOneBy(['id' => $litige['id']]);
$litige['path_image'] = ($litigeObj->getUploads() != null && !$litigeObj->getUploads()->isEmpty() ? $_SERVER['SERVER_NAME'] . $litigeObj->getUploads()->last()->getPath() : "");
}
unset($litige);
return $this->json($litiges);
}
// litiges dans le tableau de bord
#[Route('/api/litiges/resolus/{carrierId}', name: 'api_list_litiges_resolus', methods: ['GET', "POST"])]
public function litiges_resolus(Request $request, int $carrierId): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$litiges = $this->_litigeRepository->findResolvedLitigesByCarrier($carrierId, "ouvert");
foreach ($litiges as &$litige) {
$litigeObj = $this->_litigeRepository->findOneBy(['id' => $litige['id']]);
$litige['path_image'] = ($litigeObj->getUploads() != null && !$litigeObj->getUploads()->isEmpty() ? $_SERVER['SERVER_NAME'] . $litigeObj->getUploads()->last()->getPath() : "");
}
unset($litige);
return $this->json($litiges);
}
#[Route('/api/litiges/{carrierId}/{userId}', name: 'api_litiges_carrier_user', methods: ['GET', "POST"])]
public function litiges_mobile(Request $request, $carrierId, $userId): JsonResponse
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$user = $this->_userRepository->findOneBy(['id' => $userId]);
$all_litiges = $this->_litigeRepository->findLitigesByCarrierAndDriver($carrierId, $user->getDriver()->getId());
$length = count($all_litiges);
$litigesGroupedByTask = [];
for ($i = 0; $i < $length; $i++) {
$litigeObj = $this->_litigeRepository->findOneBy(['id' => $all_litiges[$i]['id']]);
$currentTaskId = $all_litiges[$i]['taskId'];
$all_litiges[$i]['path_image'] = ($litigeObj->getUploads() != null && !$litigeObj->getUploads()->isEmpty() ? $_SERVER['SERVER_NAME'] . $litigeObj->getUploads()->last()->getPath() : "");
$litigesGroupedByTask[$currentTaskId][] = $all_litiges[$i];
}
return $this->json($litigesGroupedByTask);
}
#[Route('/api/add/result/signature-exp', name: 'app_add_signature_exp_result', methods: ['POST'])]
public function add_signature_exp_result(Request $request)
{
try {
$taskId = $request->request->get('task_id');
// Récupération sécurisée de la signature
$signature = $this->_signatureRepository->findSigByTaskAndType($taskId, "expediteur");
if (!$signature) {
return new JsonResponse(['message' => "Signature introuvable", 'status' => 404], 404);
}
$signatureObj = $this->_signatureRepository->find(['id' => $signature[0]['id']]);
$task = $this->_taskRepository->find(['id' => $taskId]);
// 1. Nettoyage et typage des données GPS (Fix "null" string)
$data = $request->request->all();
$lat = $request->request->get('latitude');
$long = $request->request->get('longitude');
$data['latitude'] = ($lat && $lat !== 'null') ? (float)$lat : null;
$data['longitude'] = ($long && $long !== 'null') ? (float)$long : null;
file_put_contents(__DIR__ . '/../../var/log/mobile_payload.log', json_encode($data) . PHP_EOL, FILE_APPEND);
$this->logger->critical("DATA FROM MOBILE SIGNATURE EXP: " . json_encode($data));
$data['reserves_eventuelles_result_exp'] = $request->request->get('reserves_eventuelles_result_exp');
$data['carrier'] = $task->getCarrier();
$data['task'] = $task;
$data['typeLitige'] = "expediteur";
$data['expediteur'] = $this->_companysRepository->findOneBy(["id" => $task->getSender()->getId()]);
$data['driver'] = $this->_driversRepository->findOneBy(['id' => $signatureObj->getDriver()->getId()]);
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($this->canFinalizeSignature($task, $signatureObj, "expediteur")) {
// 2. Mise à jour GPS et Signature
$this->_signatureService->updateSignatureLongLat($signatureObj, $data);
$this->_signatureService->updateSignature($signatureObj, $data, "expediteur");
// 3. Événement d'historique (immédiat et sans doublon)
$this->dispatchSignatureCommentIfNotExists($task, $signatureObj, "expediteur");
// 4. Régénération du PDF avec les données de signature à jour
$pdfResult = null;
try {
$pdfResult = $this->_pdfGeneratorService->generateForMission($task, $task->getCarrier() ? $task->getCarrier()->getId() : null);
} catch (\Exception $e) {
$this->logger->error("Erreur génération PDF lors de signature EXP : " . $e->getMessage());
}
// --- FIX CRITIQUE USER PRINCIPAL ---
$usersFound = $this->_userRepository->findUserByCarrierAndRole($task->getCarrier()->getId(), "ROLE_PRINCIPAL_USER");
$principalUserArray = null;
$principalUserObj = null;
if (!empty($usersFound) && isset($usersFound[0])) {
$principalUserArray = $usersFound[0];
$principalUserObj = $this->_userRepository->findOneBy(['id' => $principalUserArray['id']]);
} else {
$this->logger->warning("Signature Exp: Aucun ROLE_PRINCIPAL_USER trouvé pour le carrier " . $task->getCarrier()->getId());
}
// 5. Gestion des réserves (Litige)
if(!empty($data['reserves_eventuelles_result_exp'])){
$litige = new Litige();
$this->_litigeService->addLitige($litige, $data);
$litigeStatusHistory = new LitigeStatusHistory();
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litige, $statusObj);
$litigeObject = $this->_litigeRepository->findOneBy(['id' => $litige->getId()]);
$data['litige'] = $litigeObject;
}
// 6. Gestion de l'Upload (SORTI du bloc réserves)
$nbrFiles = (int)$request->request->get('nbr_files');
if ($nbrFiles > 0) {
for ($i = 0; $i < $nbrFiles; $i++) {
$uploadedFile = $request->files->get('image_' . $i);
if ($uploadedFile) {
$useCarrierFolder = ($principalUserObj && $principalUserObj->getCarriers() != null);
if ($useCarrierFolder) {
$this->_uploadService->uploadFileBlob($uploadedFile, $data['carrier'], $data);
} else {
$this->_uploadService->uploadFileBlob($uploadedFile, null, $data);
}
}
}
}
// 7. Envoi Email (Protégé par try/catch)
try {
switch ($task->getCmr()) {
case "cmr":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $signatureObj->getTask()->getId() . ".pdf";
break;
case "internationale":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $signatureObj->getTask()->getId() . ".pdf";
break;
}
$attach = null;
if (isset($pathLV) && file_exists($pathLV)) {
$attach = ["allow" => "yes", "file" => $pathLV];
}
$admin_emails = $this->_userRepository->findUserByCarrierAndRole(null, "ROLE_ADMIN_USER");
$admins = [];
foreach($admin_emails as $admin_email){ $admins[] = $admin_email['email']; }
$support_mail_address = $this->_params->get('support_mail_address');
$from_mail_address = $this->_params->get('from_mail_address');
$context = [
"url" => $request->request->get('url_infos_exp_dest'),
"back_url" => $_ENV['BACK_URL'],
"urlDocutransFr" => $_ENV['Docutrans_FR_URL'],
"support_mail_address" => $support_mail_address
];
// Construction de la liste des destinataires
$recipients = [];
if ($principalUserArray) {
$recipients[] = $principalUserArray['email'];
}
if ($signatureObj->getEmail()) $recipients[] = $signatureObj->getEmail();
if ($signatureObj->getDriver() && $signatureObj->getDriver()->getUser() && $signatureObj->getDriver()->getUser()->getEmail()) {
$recipients[] = $signatureObj->getDriver()->getUser()->getEmail();
}
if ($signatureObj->getSender() && $signatureObj->getSender()->getEmail()) {
$recipients[] = $signatureObj->getSender()->getEmail();
}
$recipients = array_unique($recipients);
// Condition Mailjet sécurisée
$isMailjet = ($principalUserArray && $principalUserArray['contact_mailjet'] && $signatureObj->getDriver() && $signatureObj->getDriver()->getUser() && $signatureObj->getDriver()->getUser()->isContactMailjet());
if ($isMailjet) {
$this->_sendMailService->sendTemplatedMail(
new Address($from_mail_address, ""),
$recipients,
new Address($support_mail_address, ""),
$admin_emails,
$attach,
"[DOCUTRANS] Lettre de voiture " . $signatureObj->getTask()->getId() . " - confirmation de signature de l'expéditeur",
"add_signature_exp_result",
$context
);
} else {
$data_email['from'] = $from_mail_address;
$data_email['toArray'] = $recipients;
$data_email['replyTo'] = $support_mail_address;
$data_email['cci'] = $admins;
$data_email['template'] = 'add_signature_exp_result';
$data_email['context'] = $context;
$data_email['carrier'] = $data['carrier'];
$data_email['etat'] = 0;
$data_email['attach'] = $attach;
$data_email['subject'] = "[DOCUTRANS] Lettre de voiture " . $signatureObj->getTask()->getId() . " - confirmation de signature de l'expéditeur";
$data_email['sent_date'] = new \DateTime();
$this->_mailingAttempsFailedService->add_row($data_email);
}
} catch (\Exception $e) {
$this->logger->error("Erreur envoi mail signature EXP (non-bloquant) : " . $e->getMessage());
}
// Réponse OK
$responseData = ['message' => "Mis à jour effectué avec succès.", 'status' => 200];
if ($pdfResult) {
$responseData['url'] = $pdfResult['url'];
$responseData['fileName'] = $pdfResult['fileName'];
}
if(isset($litige)) {
$responseData['litige_id'] = $litige->getId();
}
return new JsonResponse($responseData, Response::HTTP_OK);
}
return new JsonResponse(['message' => "Statut incorrect ou signature déjà validée", 'status' => 400], 400);
} catch (\Exception $e) {
$this->logger->critical("CRASH SIGNATURE EXP : " . $e->getMessage());
return new JsonResponse(['error' => $e->getMessage()], 500);
}
}
#[Route('/api/add/result/signature-dest', name: 'app_add_signature_dest_result', methods: ['POST'])]
public function add_signature_dest_result(Request $request)
{
try {
$taskId = $request->request->get('task_id');
// Récupération des signatures (Exp et Dest)
$signatureExp = $this->_signatureRepository->findSigByTaskAndType($taskId, "expediteur");
$signatureDest = $this->_signatureRepository->findSigByTaskAndType($taskId, "destinataire");
if (!$signatureDest) {
return new JsonResponse(['message' => "Signature destinataire introuvable"], 404);
}
// Objets signatures
// On gère le cas où la signature expéditeur n'existe pas encore (rare mais possible)
$signatureObjExp = ($signatureExp) ? $this->_signatureRepository->find(['id' => $signatureExp[0]['id']]) : null;
$signatureObjDest = $this->_signatureRepository->find(['id' => $signatureDest[0]['id']]);
$task = $this->_taskRepository->find(['id' => $taskId]);
// 1. Nettoyage et typage GPS
$data = $request->request->all();
$lat = $request->request->get('latitude');
$long = $request->request->get('longitude');
$data['latitude'] = ($lat && $lat !== 'null') ? (float)$lat : null;
$data['longitude'] = ($long && $long !== 'null') ? (float)$long : null;
$data['reserves_eventuelles_result_dest'] = $request->request->get('reserves_eventuelles_result_dest');
$data['carrier'] = $task->getCarrier();
$data['task'] = $task;
$data['typeLitige'] = "destinataire";
$data['destinataire'] = $this->_companysRepository->findOneBy(["id" => $task->getConsignee()->getId()]);
$data['driver'] = $this->_driversRepository->findOneBy(['id' => $signatureObjDest->getDriver()->getId()]);
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($this->canFinalizeSignature($task, $signatureObjDest, "destinataire")) {
// 2. Mise à jour GPS et Signature
$this->_signatureService->updateSignatureLongLat($signatureObjDest, $data);
$this->_signatureService->updateSignature($signatureObjDest, $data, "destinataire");
// 3. Événement d'historique (immédiat et sans doublon)
$this->dispatchSignatureCommentIfNotExists($task, $signatureObjDest, "destinataire");
// 4. Régénération du PDF avec les données de signature à jour
$pdfResult = null;
try {
$pdfResult = $this->_pdfGeneratorService->generateForMission($task, $task->getCarrier() ? $task->getCarrier()->getId() : null);
} catch (\Exception $e) {
$this->logger->error("Erreur génération PDF lors de signature DEST : " . $e->getMessage());
}
// --- FIX CRITIQUE USER PRINCIPAL (Défensif) ---
$usersFound = $this->_userRepository->findUserByCarrierAndRole($task->getCarrier()->getId(), "ROLE_PRINCIPAL_USER");
$principalUserArray = null;
$principalUserObj = null;
if (!empty($usersFound) && isset($usersFound[0])) {
$principalUserArray = $usersFound[0];
$principalUserObj = $this->_userRepository->findOneBy(['id' => $principalUserArray['id']]);
} else {
$this->logger->warning("Signature Dest: Aucun ROLE_PRINCIPAL_USER trouvé pour le carrier " . $task->getCarrier()->getId());
}
// 5. Gestion Réserves / Litige
if(!empty($data['reserves_eventuelles_result_dest'])){
$litige = new Litige();
$this->_litigeService->addLitige($litige, $data);
$litigeStatusHistory = new LitigeStatusHistory();
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litige, $statusObj);
$litigeObject = $this->_litigeRepository->findOneBy(['id' => $litige->getId()]);
$data['litige'] = $litigeObject;
}
// 6. Gestion Upload (SORTI du bloc réserves)
$nbrFiles = (int)$request->request->get('nbr_files');
if ($nbrFiles > 0) {
for ($i = 0; $i < $nbrFiles; $i++) {
$uploadedFile = $request->files->get('image_' . $i);
if ($uploadedFile) {
$useCarrierFolder = ($principalUserObj && $principalUserObj->getCarriers() != null);
if ($useCarrierFolder) {
$this->_uploadService->uploadFileBlob($uploadedFile, $data['carrier'], $data);
} else {
$this->_uploadService->uploadFileBlob($uploadedFile, null, $data);
}
}
}
}
// 7. Envoi Email (Protégé par try/catch)
try {
switch ($task->getCmr()) {
case "cmr":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $signatureObjDest->getTask()->getId() . ".pdf";
break;
case "internationale":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $signatureObjDest->getTask()->getId() . ".pdf";
break;
}
$attach = null;
if (isset($pathLV) && file_exists($pathLV)) {
$attach = ["allow" => "yes", "file" => $pathLV];
}
$admin_emails = $this->_userRepository->findUserByCarrierAndRole(null, "ROLE_ADMIN_USER");
$admins = [];
foreach($admin_emails as $admin_email){ $admins[] = $admin_email['email']; }
$support_mail_address = $this->_params->get('support_mail_address');
$from_mail_address = $this->_params->get('from_mail_address');
$context = [
"url" => $request->request->get('url_infos_exp_dest'),
"back_url" => $_ENV['BACK_URL'],
"urlDocutransFr" => $_ENV['Docutrans_FR_URL'],
"support_mail_address" => $support_mail_address
];
// Construction de la liste des destinataires
$recipients = [];
if ($principalUserArray) $recipients[] = $principalUserArray['email'];
if ($signatureObjDest->getEmail()) $recipients[] = $signatureObjDest->getEmail();
if ($signatureObjDest->getDriver() && $signatureObjDest->getDriver()->getUser() && $signatureObjDest->getDriver()->getUser()->getEmail()) {
$recipients[] = $signatureObjDest->getDriver()->getUser()->getEmail();
}
// Ajout des emails de l'expéditeur (entreprise et contact ayant signé)
if ($signatureObjExp) {
if ($signatureObjExp->getEmail()) {
$recipients[] = $signatureObjExp->getEmail();
}
if ($signatureObjExp->getSender() && $signatureObjExp->getSender()->getEmail()) {
$recipients[] = $signatureObjExp->getSender()->getEmail();
}
}
// Ajout du destinataire final si différent du signataire
if ($signatureObjDest->getConsignee() && $signatureObjDest->getConsignee()->getEmail()) {
$recipients[] = $signatureObjDest->getConsignee()->getEmail();
}
// Dédoublonnage des emails
$recipients = array_unique($recipients);
// Condition Mailjet
$isMailjet = ($principalUserArray && $principalUserArray['contact_mailjet'] && $signatureObjDest->getDriver() && $signatureObjDest->getDriver()->getUser() && $signatureObjDest->getDriver()->getUser()->isContactMailjet());
if ($isMailjet) {
$this->_sendMailService->sendTemplatedMail(
new Address($from_mail_address, ""),
$recipients,
new Address($support_mail_address, ""),
$admin_emails,
$attach,
'[DOCUTRANS] Lettre de voiture ' . $signatureObjDest->getTask()->getId() . ' - confirmation de signature du destinataire',
"add_signature_dest_result",
$context
);
} else {
$data_email['from'] = $from_mail_address;
$data_email['toArray'] = $recipients;
$data_email['replyTo'] = $support_mail_address;
$data_email['cci'] = $admins;
$data_email['template'] = 'add_signature_dest_result';
$data_email['context'] = $context;
$data_email['carrier'] = $data['carrier'];
$data_email['etat'] = 0;
$data_email['attach'] = $attach;
$data_email['subject'] = '[DOCUTRANS] Lettre de voiture ' . $signatureObjDest->getTask()->getId() . ' - confirmation de signature du destinataire';
$data_email['sent_date'] = new \DateTime();
$this->_mailingAttempsFailedService->add_row($data_email);
}
} catch (\Exception $e) {
$this->logger->error("Erreur envoi mail signature DEST (non-bloquant) : " . $e->getMessage());
}
// Réponse OK
$responseData = ['message' => "Mis à jour effectué avec succès.", 'status' => 200];
if ($pdfResult) {
$responseData['url'] = $pdfResult['url'];
$responseData['fileName'] = $pdfResult['fileName'];
}
if(isset($litige)) {
$responseData['litige_id'] = $litige->getId();
}
return new JsonResponse($responseData, Response::HTTP_OK);
}
return new JsonResponse(['message' => "Statut incorrect ou signature déjà validée", 'status' => 400], 400);
} catch (\Exception $e) {
$this->logger->critical("CRASH SIGNATURE DEST : " . $e->getMessage());
return new JsonResponse(['error' => $e->getMessage()], 500);
}
}
#[Route('/api/add/result/signature-expediteur', name: 'app_add_signature_expediteur_result', methods: ['POST'])]
public function add_signature_expediteur_result(Request $request)
{
//recuperation du data from request.
// $data = json_decode($request->getContent(), true);
// $data = $request->request->all();
$signature = $this->_signatureRepository->findSigByTaskAndType($request->request->get('task_id'), "expediteur");
$signatureObj = $this->_signatureRepository->find(['id' => $signature[0]['id']]);
$task = $this->_taskRepository->find(['id' => $request->request->get('task_id')]);
// data
$data['latitude'] = $request->request->get('latitude');
$data['longitude'] = $request->request->get('longitude');
$data['reserves_eventuelles_result_exp'] = $request->request->get('reserves_eventuelles_result_exp');
$data['carrier'] = $task->getCarrier();
$data['task'] = $task;
$data['typeLitige'] = "expediteur";
$data['expediteur'] = $this->_companysRepository->findOneBy(["id" => $task->getSender()->getId()]);
$data['driver'] = $this->_driversRepository->findOneBy(['id' => $signatureObj->getDriver()->getId()]);
// data
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($last_status_task[0]['slug'] == "started") {
// update
$this->_signatureService->updateSignatureLongLat($signatureObj, $data);
// get user principal of carrier of task
$user = $this->_userRepository->findUserByCarrierAndRole($task->getCarrier()->getId(), "ROLE_PRINCIPAL_USER");
$userObj = $this->_userRepository->findOneBy(['id' => $user[0]['id']]);
if(isset($data['reserves_eventuelles_result_exp']) && $data['reserves_eventuelles_result_exp']){
$litige = new Litige();
// Appliquer les modifications au litige via le service dédié
$this->_litigeService->addLitige($litige, $data);
$litigeStatusHistory = new LitigeStatusHistory();
// Trouver le statut "ouvert" pour les litiges
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
// Trouver un statut spécifique en utilisant l'ID de ce statut
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
// Ajouter l'historique de statut de litige en utilisant le service des signatures
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litige, $statusObj);
}
// envoie mail à l'expéditeur
switch ($task->getCmr()) {
case "cmr":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $signatureObj->getTask()->getId() . ".pdf";
break;
case "internationale":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $signatureObj->getTask()->getId() . ".pdf";
break;
}
$attach = array(
"allow" => "yes",
"file" => $pathLV
);
$admin_emails = $this->_userRepository->findUserByCarrierAndRole(null, "ROLE_ADMIN_USER");
$admins= [];
foreach($admin_emails as $admin_email){
$admins[] = $admin_email['email'];
}
$support_mail_address = $this->_params->get('support_mail_address');
$from_mail_address = $this->_params->get('from_mail_address');
$context = [
"url" => $request->request->get('url_infos_exp_dest')
];
if ($userObj->isContactMailjet() && $signatureObj->getDriver()->getUser()->isContactMailjet()) {
$this->_sendMailService->sendTemplatedMail(
new Address($from_mail_address, ""),
array($user[0]['email'], $signatureObj->getEmail(), $signatureObj->getDriver()->getUser()->getEmail(), $signatureObj->getSender()->getEmail()),
new Address($support_mail_address, ""),
$admin_emails,
$attach,
"[DOCUTRANS] Lettre de voiture " . $signatureObj->getTask()->getId() . " - confirmation de signature de l'expéditeur",
"add_signature_exp_result",
$context
);
} else {
$data_email['from'] = $from_mail_address;
$data_email['toArray'] = array($user[0]['email'], $signatureObj->getEmail(), $signatureObj->getDriver()->getUser()->getEmail(), $signatureObj->getSender()->getEmail());
$data_email['replyTo'] = $support_mail_address;
$data_email['cci'] = $admins;
$data_email['template'] = 'add_signature_exp_result';
$data_email['context'] = $context;
$data_email['carrier'] = $data['carrier'];
$data_email['etat'] = 0;
$data_email['attach'] = $attach;
$data_email['subject'] = "[DOCUTRANS] Lettre de voiture " . $signatureObj->getTask()->getId() . " - confirmation de signature de l'expéditeur";
$data_email['sent_date'] = new \DateTime();
$this->_mailingAttempsFailedService->add_row($data_email);
}
// événement
$nom_contact = $signatureObj->getNom();
$datetime = new DateTime();
$date_time = $datetime->format('d/m/Y à H:i');
$message = "Signature du remettant le $date_time par $nom_contact.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, null, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
if(isset($data['reserves_eventuelles_result_exp']) && $data['reserves_eventuelles_result_exp']){
return new JsonResponse(['message' => "Mis à jour effectué avec succès.", 'litige_id' => $litige->getId(), 'status' => 200], Response::HTTP_OK);
}else{
return new JsonResponse(['message' => "Mis à jour effectué avec succès.", 'status' => 200], Response::HTTP_OK);
}
}
}
#[Route('/api/add/result/signature-destinataire', name: 'app_add_signature_destinataire_result', methods: ['POST'])]
public function add_signature_destinataire_result(Request $request)
{
//recuperation du data from request.
// $data = json_decode($request->getContent(), true);
//$data = $request->request->all();
$signatureExp = $this->_signatureRepository->findSigByTaskAndType($request->request->get('task_id'), "expediteur");
$signatureDest = $this->_signatureRepository->findSigByTaskAndType($request->request->get('task_id'), "destinataire");
// $signature = $this->_signatureRepository->findSigByTaskAndType($request->request->get('task_id'), "destinataire");
// $signatureObj = $this->_signatureRepository->find(['id' => $signature[0]['id']]);
$signatureObjExp = $this->_signatureRepository->find(['id' => $signatureExp[0]['id']]);
$signatureObjDest = $this->_signatureRepository->find(['id' => $signatureDest[0]['id']]);
$task = $this->_taskRepository->find(['id' => $request->request->get('task_id')]);
// data
$data['latitude'] = $request->request->get('latitude');
$data['longitude'] = $request->request->get('longitude');
$data['reserves_eventuelles_result_dest'] = $request->request->get('reserves_eventuelles_result_dest');
$data['carrier'] = $task->getCarrier();
$data['task'] = $task;
$data['typeLitige'] = "destinataire";
$data['destinataire'] = $this->_companysRepository->findOneBy(["id" => $task->getConsignee()->getId()]);
$data['driver'] = $this->_driversRepository->findOneBy(['id' => $signatureObjDest->getDriver()->getId()]);
// data
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($data['task']->getId());
if ($last_status_task[0]['slug'] == "started") {
// update
$this->_signatureService->updateSignatureLongLat($signatureObjDest, $data);
// get user principal of carrier of task
$user = $this->_userRepository->findUserByCarrierAndRole($task->getCarrier()->getId(), "ROLE_PRINCIPAL_USER");
$userObj = $this->_userRepository->findOneBy(['id' => $user[0]['id']]);
if(isset($data['reserves_eventuelles_result_dest']) && $data['reserves_eventuelles_result_dest']){
$litige = new Litige();
$this->_litigeService->addLitige($litige, $data);
$litigeStatusHistory = new LitigeStatusHistory();
// Trouver le statut "ouvert" pour les litiges
$status = $this->_refStatusRepository->findStatusBy("litige", "ouvert");
// Trouver un statut spécifique en utilisant l'ID de ce statut
$statusObj = $this->_refStatusRepository->findOneBy(['id' => $status[0]['id']]);
// Ajouter l'historique de statut de litige en utilisant le service des signatures
$this->_litigeService->addLitigeStatusHistory($litigeStatusHistory, $litige, $statusObj);
}
// envoie mail au destinataire
switch ($task->getCmr()) {
case "cmr":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $signatureObjDest->getTask()->getId() . ".pdf";
break;
case "internationale":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $signatureObjDest->getTask()->getId() . ".pdf";
break;
}
$emails = [];
if ($signatureObjDest->getConsignee() != null) {
$emails = array(
$user[0]['email'], $signatureObjDest->getEmail(),
$signatureObjDest->getDriver()->getUser()->getEmail(),
$signatureObjExp->getSender()->getEmail(),
$signatureObjDest->getConsignee()->getEmail(),
);
} else {
$emails = array(
$user[0]['email'], $signatureObjDest->getEmail(),
$signatureObjDest->getDriver()->getUser()->getEmail(),
$signatureObjExp->getSender()->getEmail()
);
}
$attach = array(
"allow" => "yes",
"file" => $pathLV
);
$admin_emails = $this->_userRepository->findUserByCarrierAndRole(null, "ROLE_ADMIN_USER");
$admins= [];
foreach($admin_emails as $admin_email){
$admins[] = $admin_email['email'];
}
$support_mail_address = $this->_params->get('support_mail_address');
$from_mail_address = $this->_params->get('from_mail_address');
$context = [
"url" => $request->request->get('url_infos_exp_dest')
];
if ($userObj->isContactMailjet() && $signatureObjDest->getDriver()->getUser()->isContactMailjet()) {
$this->_sendMailService->sendTemplatedMail(
new Address($from_mail_address, ""),
$emails,
new Address($support_mail_address, ""),
$admin_emails,
$attach,
'[DOCUTRANS] Lettre de voiture ' . $signatureObjDest->getTask()->getId() . ' - confirmation de signature du destinataire',
"add_signature_dest_result",
$context
);
} else {
$data_email['from'] = $from_mail_address;
$data_email['toArray'] = $emails;
$data_email['replyTo'] = $support_mail_address;
$data_email['cci'] = $admins;
$data_email['template'] = 'add_signature_dest_result';
$data_email['context'] = $context;
$data_email['carrier'] = $data['carrier'];
$data_email['etat'] = 0;
$data_email['attach'] = $attach;
$data_email['subject'] = '[DOCUTRANS] Lettre de voiture ' . $signatureObjDest->getTask()->getId() . ' - confirmation de signature du destinataire';
$data_email['sent_date'] = new \DateTime();
$this->_mailingAttempsFailedService->add_row($data_email);
}
// événement
$nom_contact = $signatureObjDest->getNom();
$datetime = new DateTime();
$date_time = $datetime->format('d/m/Y à H:i');
$message = "Signature du destinataire le $date_time par $nom_contact.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, null, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
if(isset($data['reserves_eventuelles_result_dest']) && $data['reserves_eventuelles_result_dest']){
return new JsonResponse(['message' => "Mis à jour effectué avec succès.", 'litige_id' => $litige->getId(), 'status' => 200], Response::HTTP_OK);
}else{
return new JsonResponse(['message' => "Mis à jour effectué avec succès.", 'status' => 200], Response::HTTP_OK);
}
}
}
#[Route('/api/add/mission', name: 'app_add_mission', methods: ['POST'])]
public function add_mission(Request $request)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
// $data = json_decode($request->getContent(), true);
$data_mission_form = $request->request->all();
//$data = $request->request->all();
// get carrier of connected user
// $data_files = $data['data_files'];
$data_mission_form['carrier'] = $this->_carriersRepository->find($data_mission_form['carrier_id']);
$data_mission_form['user'] = $this->_userRepository->find($data_mission_form['user_id']);
// get company by id
if (isset($data_mission_form['donneur_id']) && $data_mission_form['donneur_id'] != "undefined") {
$data_mission_form['donneur'] = $this->_companysRepository->find($data_mission_form['donneur_id']);
}
if ($data_mission_form['expediteur_id'] != "undefined") {
$data_mission_form['expediteur'] = $this->_companysRepository->find($data_mission_form['expediteur_id']);
}
if ($data_mission_form['destinataire_id'] != "undefined") {
$data_mission_form['destinataire'] = $this->_companysRepository->find($data_mission_form['destinataire_id']);
}
$chauffeurs = [];
if ($data_mission_form['chauffeur_id'] != null) {
foreach ($data_mission_form['chauffeur_id'] as $chauff_id) {
$chauffeurs[] = $this->_driversRepository->findOneBy(['id' => $chauff_id]);
}
}
$data_mission_form['chauffeurs'] = $chauffeurs;
$vehicules = [];
foreach ($data_mission_form['vehicule_id'] as $vehicule_id) {
$vehicules[] = $this->_vehiculeRepository->findOneBy(['id' => $vehicule_id]);
}
$data_mission_form['vehicules'] = $vehicules;
// service d'ajout.
$mission_id = $this->_tasksService->addMission($data_mission_form, $request);
$task = $this->_taskRepository->find($mission_id);
$data_mission_form['task'] = $task;
if ($data_mission_form['from_where'] == "web") {
// upload and saving files
$nbr_files = $request->request->get('nbr_files');
for ($i = 0; $i < $nbr_files; $i++) {
$uploadedFile = $request->files->get('file_' . $i);
if ($uploadedFile) {
$upload = $this->_uploadService->uploadFile($uploadedFile, $data_mission_form);
}
}
}
if ($data_mission_form['planned_at'] == null) {
$status_ = $this->_refStatusRepository->findStatusBy("mission", "prog_in_progress");
} else {
$status_ = $this->_refStatusRepository->findStatusBy("mission", "ready");
}
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$this->_tasksService->addStatusTaskHistory($task, $status);
$message = "Création de mission.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $this->_userRepository->findOneBy(['id' => $data_mission_form['user_id']]), $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Ajout mission faite avec succès!", 'id' => $task->getId(), 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/start/task/{id}/{userId}', name: 'app_start_task', methods: ['GET', "POST"])]
public function start_task(Request $request, $id, $userId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$status_ = $this->_refStatusRepository->findStatusBy("mission", "started");
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$task = $this->_taskRepository->findOneBy(['id' => $id]);
$user = $this->_userRepository->findOneBy(['id' => $userId]);
if ($task->getTaskDrivers()->isEmpty() && $user && $user->getDriver()) {
$taskDriver = new \App\Entity\TaskDriver();
$taskDriver->setTasks($task);
$taskDriver->setDrivers($user->getDriver());
$taskDriver->setDisplayOrder(1);
$this->_doctrine->getManager()->persist($taskDriver);
$this->_doctrine->getManager()->flush();
}
// événement
$this->_tasksService->addStatusTaskHistory($task, $status);
$message = "Mission démarrée.";
// événement
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Mission démarrée !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/stop/task/{id}/{userId}', name: 'app_stop_task', methods: ['POST'])]
public function stop_task(Request $request, $id, $userId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
$user = $this->_userRepository->findOneBy(['id' => $userId]);
switch ($data['status']) {
case 'finished':
{
$status_ = $this->_refStatusRepository->findStatusBy("mission", "finished");
$message = "Mission terminée.";
}
break;
case 'technical_problem':
{
$status_ = $this->_refStatusRepository->findStatusBy("mission", "technical_problem");
$message = "Mission arrêtée à cause d'un problème technique.";
}
break;
}
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$task = $this->_taskRepository->findOneBy(['id' => $id]);
$this->_tasksService->addStatusTaskHistory($task, $status);
// événement
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
if ($data['status'] == 'finished') {
switch ($task->getCmr()) {
case "cmr":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $task->getId() . ".pdf";
break;
case "internationale":
$pathLV = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $task->getId() . ".pdf";
break;
}
$attach = array(
"allow" => "yes",
"file" => $pathLV
);
$admin_emails = $this->_userRepository->findUserByCarrierAndRole(null, "ROLE_ADMIN_USER");
$admins= [];
foreach($admin_emails as $admin_email){
$admins[] = $admin_email['email'];
}
$support_mail_address = $this->_params->get('support_mail_address');
$from_mail_address = $this->_params->get('from_mail_address');
$context = [
"num_mission" => $task->getId(),
"carrier_name" => $task->getCarrier()->getRasionSociale(),
"back_url" => $_ENV['BACK_URL'],
"urlDocutransFr" => $_ENV['Docutrans_FR_URL']
];
/**
* On envoie le mail au Donneur d'Ordre si il existe.
*/
if($task->getContractor() != null){
if ($user->isContactMailjet() && $task->getContractor()->getEmail()) {
$this->_sendMailService->sendTemplatedMail(
new Address($from_mail_address, ""),
array($task->getContractor()->getEmail()),
new Address($support_mail_address, ""),
$admin_emails,
$attach,
"[DOCUTRANS] Lettre de voiture numéro " . $task->getId(),
"donneur_dordre",
$context
);
} else {
$data_email['from'] = $from_mail_address;
$data_email['toArray'] = array($task->getContractor()->getEmail());
$data_email['replyTo'] = $support_mail_address;
$data_email['cci'] = $admins;
$data_email['template'] = 'donneur_dordre';
$data_email['context'] = $context;
$data_email['carrier'] = $task->getCarrier();
$data_email['etat'] = 0;
$data_email['attach'] = $attach;
$data_email['subject'] = "[DOCUTRANS] Lettre de voiture numéro " . $task->getId();
$data_email['sent_date'] = new \DateTime();
$this->_mailingAttempsFailedService->add_row($data_email);
}
}
}
return new JsonResponse(['message' => "Mission terminée !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/cancel/task/{id}/{userId}', name: 'app_cancel_task', methods: ['GET', "POST"])]
public function cancel_task(Request $request, $id, $userId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
$status_ = $this->_refStatusRepository->findStatusBy("mission", "cancel");
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$task = $this->_taskRepository->findOneBy(['id' => $id]);
$this->_tasksService->addStatusTaskHistory($task, $status);
// événement
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $this->_userRepository->findOneBy(['id' => $userId]), "Mission annulée : ".$data['message'], $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "Mission annulée !", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/in-progress/tasks/{carrierId}', name: 'app_in_progress_tasks', methods: ['GET', "POST"])]
public function in_progress_tasks(Request $request, $carrierId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$missions = $this->_taskStatusHistoryRepository->findTasksBySlug($carrierId, "started");
$missions_arr = [];
foreach ($missions as &$mission) {
$chauffeurs = $this->_taskDriverRepository->getDriversOfTask($mission['id']);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($mission['id']);
$mission['chauffeurs'] = $chauffeurs;
$mission['vehicules'] = $vehicules;
$mission['task_status'] = $last_status_task;
if (($last_status_task[0]['slug'] == "started") && ($last_status_task[0]['type'] == "mission")) {
$missions_arr[] = $mission;
}
}
unset($mission);
return new JsonResponse(['missions' => $missions_arr, 'status' => 200]);
}
#[Route('/api/ready/tasks/{carrierId}', name: 'app_ready_tasks', methods: ['GET', "POST"])]
public function ready_tasks(Request $request, $carrierId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$missions = $this->_taskStatusHistoryRepository->findTasksBySlug($carrierId, "ready");
$missions_arr = [];
foreach ($missions as &$mission) {
$chauffeurs = $this->_taskDriverRepository->getDriversOfTask($mission['id']);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($mission['id']);
$mission['chauffeurs'] = $chauffeurs;
$mission['vehicules'] = $vehicules;
$mission['task_status'] = $last_status_task;
if (($last_status_task[0]['slug'] == "ready") && ($last_status_task[0]['type'] == "mission")) {
$missions_arr[] = $mission;
}
}
unset($mission);
return new JsonResponse(['missions' => $missions_arr, 'status' => 200]);
}
#[Route('/api/finished/tasks/{carrierId}', name: 'app_finished_tasks', methods: ['GET', "POST"])]
public function finished_tasks(Request $request, $carrierId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$missions = $this->_taskStatusHistoryRepository->findTasksBySlug($carrierId, 'finished');
$missions_arr = [];
foreach ($missions as &$mission) {
$chauffeurs = $this->_taskDriverRepository->getDriversOfTask($mission['id']);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($mission['id']);
$mission['chauffeurs'] = $chauffeurs;
$mission['vehicules'] = $vehicules;
$mission['task_status'] = $last_status_task;
if (($last_status_task[0]['slug'] == "finished") && ($last_status_task[0]['type'] == "mission")) {
$missions_arr[] = $mission;
}
}
unset($mission);
return new JsonResponse(['missions' => $missions_arr, 'status' => 200]);
}
#[Route('/api/all/tasks/{carrierId}', name: 'app_all_tasks', methods: ['GET', "POST"])]
public function index(Request $request, $carrierId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$missions = $this->_taskRepository->findAllTasks($carrierId);
$missions_arr = [];
foreach ($missions as &$mission) {
// get goods by task id
$goods = $this->_goodsRepository->findGoodsByTaskId($mission['id']);
$chauffeurs = $this->_taskDriverRepository->getDriversOfTask($mission['id']);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
// get status mission
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($mission['id']);
$mission['goods'] = $goods;
$mission['chauffeurs'] = $chauffeurs;
$mission['vehicules'] = $vehicules;
$mission['task_status'] = $last_status_task;
$missions_arr[] = $mission;
}
unset($mission);
return new JsonResponse(['missions' => $missions_arr, 'status' => 200]);
}
#[Route('/api/all/tasks/{carrierId}/{companyId}', name: 'app_all_tasks_by_company', methods: 'POST')]
public function task_company(Request $request, $carrierId, $companyId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
$user = $this->_userRepository->find($data['user_id']);
$oneCompanyObj = $this->_companysRepository->find($companyId);
if ($user->getCarriers() === $oneCompanyObj->getCarrier()) {
$missions = $this->_taskRepository->findAllTasksBy($companyId, $carrierId);
$missions_arr = [];
foreach ($missions as &$mission) {
$chauffeurs = $this->_taskDriverRepository->getDriversOfTask($mission['id']);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
$mission['chauffeurs'] = $chauffeurs;
$mission['vehicules'] = $vehicules;
$missions_arr[] = $mission;
}
unset($mission);
return new JsonResponse(['missions' => $missions_arr, 'status' => 200]);
} else {
throw $this->createNotFoundException();
}
}
#[Route('/api/all/tasks/driver/{carrierId}/{driverId}', name: 'app_all_tasks_by_driver', methods: 'POST')]
public function task_driver(Request $request, $carrierId, $driverId): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
$user = $this->_userRepository->find($data['user_id']);
$oneDriverObj = $this->_driversRepository->find($driverId);
if ($user->getCarriers() === $oneDriverObj->getCarrier()) {
$missions = $this->_taskDriverRepository->getTasksByDriver($driverId, $carrierId);
$missions_arr = [];
foreach ($missions as &$mission) {
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($mission['id']);
$mission['chauffeur'] = $mission['first_name'] . " " . $mission['last_name'];
$mission['vehicules'] = $vehicules;
$missions_arr[] = $mission;
}
unset($mission);
return new JsonResponse(["missions_driver" => $missions_arr, "status" => 200], Response::HTTP_OK);
} else {
throw $this->createNotFoundException();
}
}
#[Route('/api/tasks/vehicule/date', name: 'app_tasks_vehicule_date', methods: 'POST')]
public function tasks_vehicule(Request $request): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
// $data = $request->request->all();
if (isset($data['createdBy']) && $data['createdBy']) {
$missions = $this->_taskRepository->findCreatedTasks($data);
} else {
$missions = $this->_tasksService->getTasksByVehiculePlannedAt($data);
}
$missions_arr = [];
foreach ($missions as &$mission) {
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($mission['id']);
$task = $this->_taskRepository->findOneBy(['id' => $mission['id']]);
$mission['nbrLitiges'] = count($task->getLitiges());
$mission['driver_id'] = (isset($data['createdBy']) && $data['createdBy'] ? "" : $mission['driver_id']);
$mission['last_status_task'] = (count($last_status_task) != 0 ? $last_status_task[0]['label'] : "");
$mission['last_status_task_slug'] = (count($last_status_task) != 0 ? $last_status_task[0]['slug'] : "");
// if(($last_status_task[0]['slug'] != "finished") && ($last_status_task[0]['slug'] != "technical_problem")){
if ($mission['planned_at'] != null) {
if (isset($data['createdBy']) && $data['createdBy']) {
$plannedAtFormatted = ($mission['planned_at'])->format('Y-m-d');
} else {
$plannedAtFormatted = (new \DateTime($mission['planned_at']))->format('Y-m-d');
}
$missions_arr[$plannedAtFormatted][] = $mission;
// }
}
}
unset($mission);
return new JsonResponse(["missions_vehicule" => $missions_arr, "status" => 200], Response::HTTP_OK);
}
#[Route('/api/reorder/tasks/', name: 'app_reorder_tasks', methods: 'POST')]
public function reorder(Request $request): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
//$data = $request->request->all();
$i = 1;
foreach ($data as $task) {
$task_id = $task['id'];
$tournee_id = $task['tournee_id'];
// get driver
$tournee = $this->_tourneeRepository->findOneBy(['id' => $tournee_id]);
// get task
$task = $this->_taskRepository->findOneBy(['id' => $task_id]);
// get TaskDriver Object
$tournee_task = $this->_tourneeTaskRepository->findOneBy(['tournee' => $tournee, 'task' => $task]);
$this->_tasksService->updateDisplayOrder($tournee_task, $i);
$i++;
}
return new JsonResponse(['message' => "Ordres changées !", 'status' => 200]);
}
#[Route('/api/task/{id}/{carrierId}', name: 'app_one_task', methods: 'POST')]
public function task(Request $request, $id): Response
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
// $data = $request->request->all();
$mission = $this->_taskRepository->findOneBy(['id' => $id]);
$user = $this->_userRepository->find($data['user_id']);
if ($user->getCarriers() === $mission->getCarrier()) {
$last_status_task = $this->_taskStatusHistoryRepository->findStatusByTaskId($id);
// get goods by task id
$goods = $this->_goodsRepository->findGoodsByTaskId($id);
foreach ($goods as $key => $good) {
$goodObj = $this->_goodsRepository->findOneBy(['id' => $good['id']]);
$document = $goodObj->getUploads()->toArray();
$goods[$key]['document'] = $this->_uploadService->getFiles($document);
}
$tasks_comments = $this->_taskCommentRepository->findTaskComByTaskId($id);
$chauffeurs = $this->_taskDriverRepository->findDriversByTaskId($id);
$vehicules = $this->_taskVehiculeRepository->findVehiculesByTaskId($id);
$files = $this->_uploadService->getFiles($mission->getUploads()->toArray());
$signatures = $this->_signatureRepository->findSigByTask($mission->getId());
$litigesArray = [];
foreach ($mission->getLitiges() as $litige) {
$type = "";
switch ($litige->getType()) {
case "chauffeur_expediteur" :
$type = "Chauffeur à l'expédition";
break;
case "chauffeur_destinataire" :
$type = "Chauffeur à la livraison";
break;
case "expediteur" :
$type = "Expédition";
break;
case "destinataire" :
$type = "Livraison";
break;
}
// Créez un tableau associatif pour chaque litige
$litigeData = [
'id' => ($litige->getId()),
'taskid' => ($litige->getTask() != null ? $litige->getTask()->getId() : ""),
'destinataire' => ($litige->getConsignee() != null ? $litige->getConsignee()->getCompanyName() : ""),
'expediteur' => ($litige->getSender() != null ? $litige->getSender()->getCompanyName() : ""),
'possiblereservations' => $litige->getPossibleReservations(),
'statuslitige' => ($litige->getLitigeStatusHistories() != null ? $litige->getLitigeStatusHistories()->last()->getStatus()->getLabel() : ""),
'litigeStatusSlug' => ($litige->getLitigeStatusHistories() != null ? $litige->getLitigeStatusHistories()->last()->getStatus()->getSlug() : ""),
'litigetype' => $litige->getType(),
'chauffeur' => ($litige->getDriver() != null ? $litige->getDriver()->getFirstName() . " " . $litige->getDriver()->getLastName() : ""),
'typeLitige' => $type,
'pathimage' => ($litige->getUploads() != null && !$litige->getUploads()->isEmpty() ? $_SERVER['SERVER_NAME'] . $litige->getUploads()->last()->getPath() : ""),
'imagename' => ($litige->getUploads() != null && !$litige->getUploads()->isEmpty() ? $litige->getUploads()->last()->getOriginaleName() : ""),
'viewable_name' => ($litige->getUploads() != null && !$litige->getUploads()->isEmpty() ? $litige->getUploads()->last()->getViewableName() : "")
];
// Ajoutez les données du litige au tableau des litiges
$litigesArray[] = $litigeData;
}
$signatures = $this->_signatureRepository->findSigByTask($mission->getId());
$arrToReturn = [];
switch (count($signatures)) {
case 1 :
{
$arrToReturn[$signatures[0]['type_signature']] = $signatures;
}
break;
case 2 :
{
foreach ($signatures as $signature) {
$arrToReturn[$signature['type_signature']][] = $signature;
}
}
break;
}
$array_element = array(
"label_status" => $last_status_task[0]['label'],
"id" => $mission->getId(),
"id_exp" => ($mission->getSender() != null ? $mission->getSender()->getId() : null),
"id_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getId() : null),
"donneur_ordre" => ($mission->getContractor() != null ? $mission->getContractor()->getCompanyName() : null),
"destinataire" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCompanyName() : null),
"adresse_dest1" => ($mission->getConsignee() != null ? $mission->getConsignee()->getAdr1() : null),
"adresse_dest2" => ($mission->getConsignee() != null ? $mission->getConsignee()->getAdr2() : null),
"tel_phonecode_dest1" => ($mission->getConsignee() != null ? '(+' . $mission->getConsignee()->getRefCountry()->getPhonecode() . ')' . $mission->getConsignee()->getTel1() : null),
"tel_phonecode_dest2" => ($mission->getConsignee() != null ? '(+' . $mission->getConsignee()->getRefCountry()->getPhonecode() . ')' . $mission->getConsignee()->getTel2() : null),
"tel_dest1" => ($mission->getConsignee() != null ? $mission->getConsignee()->getTel1() : null),
"tel_dest2" => ($mission->getConsignee() != null ? $mission->getConsignee()->getTel2() : null),
"email_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getEmail() : null),
"lat_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getLat() : null),
"lng_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getLng() : null),
"cp_zip_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCpZip() : null),
"city_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCity() : null),
"cedex_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCedex() : null),
"infos_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getInformations() : null),
"typeDest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getType() : null),
"expediteur" => ($mission->getSender() != null ? $mission->getSender()->getCompanyName() : null),
"adresse_exp1" => ($mission->getSender() != null ? $mission->getSender()->getAdr1() : null),
"adresse_exp2" => ($mission->getSender() != null ? $mission->getSender()->getAdr2() : null),
"nicename_exp" => ($mission->getSender() != null ? $mission->getSender()->getRefCountry()->getNicename() : null),
"nicename_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getRefCountry()->getNicename() : null),
"tel_phonecode_exp1" => ($mission->getSender() != null ? '(+' . $mission->getSender()->getRefCountry()->getPhonecode() . ')' . $mission->getSender()->getTel1() : null),
"tel_phonecode_exp2" => ($mission->getSender() != null ? '(+' . $mission->getSender()->getRefCountry()->getPhonecode() . ')' . $mission->getSender()->getTel2() : null),
"tel_exp1" => ($mission->getSender() != null ? $mission->getSender()->getTel1() : null),
"tel_exp2" => ($mission->getSender() != null ? $mission->getSender()->getTel2() : null),
"email_exp" => ($mission->getSender() != null ? $mission->getSender()->getEmail() : null),
"lat_exp" => ($mission->getSender() != null ? $mission->getSender()->getLat() : null),
"lng_exp" => ($mission->getSender() != null ? $mission->getSender()->getLng() : null),
"cp_zip_exp" => ($mission->getSender() != null ? $mission->getSender()->getCpZip() : null),
"city_exp" => ($mission->getSender() != null ? $mission->getSender()->getCity() : null),
"cedex_exp" => ($mission->getSender() != null ? $mission->getSender()->getCedex() : null),
"infos_exp" => ($mission->getSender() != null ? $mission->getSender()->getInformations() : null),
"typeExp" => ($mission->getSender() != null ? $mission->getSender()->getType() : null),
"code_client_exp" => ($mission->getSender() != null ? $mission->getSender()->getCompanysCodeClient() : null),
"code_client_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCompanysCodeClient() : null),
"planned_at" => $mission->getPlannedAt(),
"custom_formalities" => $mission->getCustomFormalities(),
"instructions" => $mission->getInstructions(),
"seal_number" => $mission->getSealNumber(),
// "un_number" => $mission->getUnNumber(),
"cmr" => $mission->getCmr(),
"mission" => $mission->getMission(),
"presta_ann_sender_planned" => $mission->getPrestaAnnSenderPlanned(),
"presta_ann_consignee_planned" => $mission->getPrestaAnnConsigneePlanned(),
"attached_docs" => $mission->getAttachedDocs(),
"goods" => $goods,
"chauffeurs" => $chauffeurs,
"vehicules" => $vehicules,
"files" => $files,
"task_status" => $last_status_task,
"tasks_comments" => $tasks_comments,
"pallet_europe" => $mission->getPalletEurope(),
"pallet_other" => $mission->getPalletOther(),
"pallet_80_120" => $mission->getPallet80120(),
"pallet_100_120" => $mission->getPallet100120(),
"ref_country_id_exp" => ($mission->getSender() != null ? $mission->getSender()->getRefCountry()->getId() : null),
"ref_country_id_dest" => ($mission->getConsignee() != null ? $mission->getConsignee()->getRefCountry()->getId() : null),
"created_by_id" => ($mission->getCreatedBy() != null ? $mission->getCreatedBy()->getId() : null),
"can_download_LV" => (count($signatures) > 0 ? "can" : "can_not"),
"litiges" => $litigesArray,
"signatures" => $arrToReturn,
"id_donneur_dordre" => ($mission->getContractor() != null ? $mission->getContractor()->getId() : null),
);
return new JsonResponse(['mission' => $array_element, 'status' => 200]);
} else {
throw $this->createNotFoundException();
}
}
#[Route('/api/pdf/task/{id}/{carrierId}', name: 'app_pdf_task', methods: ['GET', "POST"])]
public function generate_pdf(Request $request, $id, $carrierId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$mission = $this->_taskRepository->findOneBy(['id' => $id]);
// get goods by task id
$goods = $this->_goodsRepository->findGoodsByTaskId($mission->getId());
$cmr = ($mission->getCmr() == "cmr" ? "Nationale" : "Internationale");
switch ($mission->getMission()) {
case 'enlev_livr':
$type_mission = "Enlévement + Livraison";
break;
case 'enlev':
$type_mission = "Enlévement";
break;
case 'livr':
$type_mission = "Livraison";
break;
}
$array_element = array(
"id" => $mission->getId(),
"destinataire" => ($mission->getConsignee() != null ? $mission->getConsignee()->getCompanyName() : null),
"expediteur" => ($mission->getSender() != null ? $mission->getSender()->getCompanyName() : null),
"custom_formalities" => ($mission->getCustomFormalities() == "" ? "----" : $mission->getCustomFormalities()),
"instructions" => ($mission->getInstructions() == "" ? "----" : $mission->getInstructions()),
"label_number" => ($mission->getLabelNumber() == "" ? "----" : $mission->getLabelNumber()),
"seal_number" => ($mission->getSealNumber() == "" ? "----" : $mission->getSealNumber()),
// "un_number" => ($mission->getUnNumber() == "" ? "----" : $mission->getUnNumber()),
"dangerous_goods" => ($mission->getDangerousGoods() == "" ? "----" : $mission->getDangerousGoods()),
"obligatory_enclosure_declaration" => ($mission->getObligatoryEnclosureDeclaration() == "" ? "----" : $mission->getObligatoryEnclosureDeclaration()),
"packing_group" => ($mission->getPackingGroup() == "" ? "----" : $mission->getPackingGroup()),
"cmr" => $cmr,
"mission" => $type_mission,
"presta_ann_sender_planned" => $mission->getPrestaAnnSenderPlanned(),
"presta_ann_consignee_planned" => $mission->getPrestaAnnConsigneePlanned(),
"attached_docs" => ($mission->getAttachedDocs() == "" ? "----" : $mission->getAttachedDocs()),
"temperature_dirigee" => ($mission->getTemperatureDirigee() == "" ? "----" : $mission->getTemperatureDirigee()),
"goods" => $goods
);
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$dompdf = new Dompdf($pdfOptions);
$html = $this->renderView('mission/pdf_details_task.html.twig', [
'data_task' => $array_element
]);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("mypdf.pdf", [
"Attachment" => false
]);
exit;
}
#[Route('/api/write/pdf/task/{id}/{carrierId}', name: 'app_write_pdf_task', methods: 'POST')]
public function write_pdf(
Request $request,
$id,
$carrierId,
PdfGeneratorService $pdfGeneratorService, // Injection du nouveau service
SignatureService $signatureService, // Injection pour l'écriture
EntityManagerInterface $entityManager // Injection pour le flush
) {
$data = json_decode($request->getContent(), true);
$mission = $this->_taskRepository->find($id);
if (!$mission) {
return new JsonResponse(['error' => 'Mission non trouvée'], 404);
}
// --- ETAPE 1 : LOGIQUE D'ÉCRITURE (Conditionnelle) ---
// C'est ici qu'on gère la demande de l'app mobile "Legacy"
if (isset($data['update_contact_sign']) && $data['update_contact_sign'] === true) {
try {
// On délègue l'écriture au service dédié
$updatedSignature = $signatureService->handleMobileSignature($mission, $data);
// On s'assure que tout est bien enregistré avant de générer le PDF
$entityManager->flush();
if ($updatedSignature !== null && $updatedSignature->getTypeSignature()) {
$this->dispatchSignatureCommentIfNotExists($mission, $updatedSignature, $updatedSignature->getTypeSignature());
}
// On rafraichit la mission pour être sûr d'avoir les données à jour (liens signatures, etc.)
$entityManager->refresh($mission);
} catch (\Exception $e) {
// En prod, log l'erreur ici
return new JsonResponse(['error' => "Erreur lors de la sauvegarde de la signature : " . $e->getMessage()], 500);
}
}
// --- ETAPE 2 : GÉNÉRATION DU PDF (Read-Only) ---
// Le service PDF ne touche pas à la base, il ne fait que lire.
try {
$result = $pdfGeneratorService->generateForMission($mission, $carrierId);
return new JsonResponse([
'url' => $result['url'],
'fileName' => $result['fileName']
], Response::HTTP_OK);
} catch (\Exception $e) {
return new JsonResponse(['error' => "Erreur lors de la génération du PDF : " . $e->getMessage()], 500);
}
}
function splitIntoThreeWordSentences($paragraph)
{
$words = preg_split('/\s+/', trim($paragraph));
$sentences = [];
for ($i = 0; $i < count($words); $i += 3) {
$chunk = array_slice($words, $i, 3);
$sentences[] = implode(' ', $chunk);
}
return $sentences;
}
// #[Route('/api/write/pdf/task/dest/{id}/{carrierId}', name: 'app_write_pdf_task_dest', methods: 'POST')]
// public function write_dest_pdf(Request $request, $id, $carrierId)
// {
// $data = json_decode($request->getContent(), true);
// //$data = $request->request->all();
//// $mission = $this->_taskRepository->findOneBy(['id' => $id]);
//// $signature = $this->_signatureRepository->findSigByTaskAndType($id, $data['type_signature']);
//// $signatureObj = $this->_signatureRepository->find(['id' => $signature[0]['id']]);
//// $this->_signatureService->updateFirstSignature($signatureObj, $data);
////
//// // arrivé à et départ à
//// // arrivé à
//// $arrive_at_obj = $signatureObj->getArriveAt();
//// $arriv_at = explode(' ', $arrive_at_obj->format('d-m-Y H:i:s'));
//// $heure_arriv = explode(':', $arriv_at[1]);
//// // départ à
//// $departure_at_obj = $signatureObj->getDepartureAt();
//// $dep_at = explode(' ', $departure_at_obj->format('d-m-Y H:i:s'));
//// $heure_dep = explode(':', $dep_at[1]);
//// $presta_ann = $signatureObj->getPrestaAnn();
//// $nom_contact = $signatureObj->getNom();
//// $possible_reservations = $signatureObj->getPossibleReservations();
//// $possible_reservations_contact = $signatureObj->getPossibleReservationsContact();
//// // destinataire
//// $signedAt = $signatureObj->getSignedAt();
//// $signedDriverAt = $signatureObj->getSignedDriverAt();
//// $rendues = $signatureObj->getRendues();
//// $livrees = $signatureObj->getLivrees();
//// $non_rendues = $signatureObj->getNonRendues();
//// $nomChauffeur = ucfirst($signature[0]['first_name']) . " " . ucfirst($signature[0]['last_name']);
//
// require_once $_SERVER['DOCUMENT_ROOT'] . '/pdf_classes/fpdi.php';
// require_once $_SERVER['DOCUMENT_ROOT'] . '/pdf_classes/html2pdf.php';
// if ($mission->getCmr() == "cmr") {
// $pdf = new FPDISigep();
// $pdf->SetAutoPageBreak(true, 0);
// $filename = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_nationnale_HD_" . $id . ".pdf";
// // get the page count
// $pageCount = $pdf->setSourceFile($filename);
// // iterate through all pages
// //for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
// // import a page
// $templateId = $pdf->importPage(1);
// // get the size of the imported page
// $size = $pdf->getTemplateSize($templateId);
// // create a page (landscape or portrait depending on the imported page size)
// if ($size['w'] > $size['h']) {
// $pdf->AddPage('L', array($size['w'], $size['h']));
// } else {
// $pdf->AddPage('P', array($size['w'], $size['h']));
// }
// // use the imported page
// $pdf->useTemplate($templateId);
// $pdf->SetTextColor(195, 40, 40);
// $pdf->SetFont('Helvetica', '', 8);
//
// $text_height = 36;
// $start_x = $pdf->GetX();
//
//
//
// $newFileName = "/uploads/missions/lettre_voiture_nationnale_HD_" . $id . ".pdf";
// $newFileNamePath = $_SERVER['DOCUMENT_ROOT'] . $newFileName;
// $pdf->Output($newFileNamePath, "F");
// $url = "https://" . $_SERVER['SERVER_NAME'] . $newFileName;
// $fileName = "lettre_voiture_nationnale_HD_" . $id . ".pdf";
//
// return new JsonResponse(['url' => $url, 'fileName' => $fileName], Response::HTTP_OK);
//// header('Access-Control-Allow-Origin: *');
//
// //return base64_encode($pdf->Output($newFileNamePath, "F"));
// }
// if ($mission->getCmr() == 'internationale') {
// $pdf = new FPDISigep();
// $pdf->SetAutoPageBreak(true, 0);
// $filename = $_SERVER['DOCUMENT_ROOT'] . "/uploads/missions/lettre_voiture_europeenne_HD_" . $id . ".pdf";
// // get the page count
// $pageCount = $pdf->setSourceFile($filename);
// // import a page
// $templateId = $pdf->importPage(1);
// // get the size of the imported page
// $size = $pdf->getTemplateSize($templateId);
// // create a page (landscape or portrait depending on the imported page size)
// if ($size['w'] > $size['h']) {
// $pdf->AddPage('L', array($size['w'], $size['h']));
// } else {
// $pdf->AddPage('P', array($size['w'], $size['h']));
// }
// // use the imported page
// $pdf->useTemplate($templateId);
// $pdf->SetTextColor(195, 40, 40);
// $pdf->SetFont('Helvetica', '', 10);
//
// $text_height = 36;
// $start_x = $pdf->GetX();
//
//
// $newFileName = "/uploads/missions/lettre_voiture_europeenne_HD_" . $id . ".pdf";
// $newFileNamePath = $_SERVER['DOCUMENT_ROOT'] . $newFileName;
// $pdf->Output($newFileNamePath, "F");
// $url = "https://" . $_SERVER['SERVER_NAME'] . $newFileName;
// $fileName = "lettre_voiture_europeenne_HD_" . $id . ".pdf";
//
// return new JsonResponse(['url' => $url, 'fileName' => $fileName], Response::HTTP_OK);
//// header('Access-Control-Allow-Origin: *');
//
// //return base64_encode($pdf->Output($newFileNamePath, "F"));
// }
// }
#[Route('/api/update/planned-at-date/{userId}', name: 'app_update_planned_at_date', methods: ['POST'])]
public function update_planned_at($userId, Request $request)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
$task = $this->_taskRepository->findOneBy(["id" => $data['mission_id']]);
$this->_tasksService->updatePlannedAt($task, new DateTime($data['planned_at']));
$status_ = $this->_refStatusRepository->findStatusBy("mission", "ready");
$status = $this->_refStatusRepository->findOneBy(['id' => $status_[0]['id']]);
$this->_tasksService->addStatusTaskHistory($task, $status);
// événement
$user = $this->_userRepository->findOneBy(["id" => $userId]);
$message = "La date de planification est modifiée.";
$addTaskCommentEvent = new AddTaskCommentEvent($this->_doctrine, $user, $message, $task);
$this->_dispatcher->dispatch($addTaskCommentEvent, AddTaskCommentEvent::ADD_TASK_COMMENT_EVENT);
return new JsonResponse(['message' => "success", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/task/add/comment/{userId}', name: 'app_task_add_comment', methods: ['POST'])]
public function task_add_comment($userId, Request $request)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$data = json_decode($request->getContent(), true);
$task = $this->_taskRepository->findOneBy(["id" => $data['mission_id']]);
$user = $this->_userRepository->findOneBy(["id" => $userId]);
$data['user'] = $user;
$data['task'] = $task;
$this->_tasksService->setTaskComment($data);
return new JsonResponse(['message' => "success", "status" => 200], Response::HTTP_OK);
}
#[Route('/api/upload/details/task', name: 'app_upload_details_task', methods: ['POST'])]
public function upload_files_task(Request $request)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
//recuperation du data from request.
$user_id = $request->request->get('user_id');
$task_id = $request->request->get('task_id');
$nbr_files = $request->request->get('nbr_files');
// get connected user
$user = $this->_userRepository->find($user_id);
// get carrier
$carrier = $user->getCarriers();
$data['task'] = $this->_taskRepository->find($task_id);
$data['user'] = $user;
$data['carrier'] = $carrier;
for ($i = 0; $i < $nbr_files; $i++) {
$uploadedFile = $request->files->get('file_' . $i);
if ($uploadedFile) {
$upload = $this->_uploadService->uploadFile($uploadedFile, $data);
}
}
return new JsonResponse(['message' => "success", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/task/tracking', name: 'app_task_tracking', methods: ['POST'])]
public function task_tracking(Request $request)
{
$data = json_decode($request->getContent(), true);
$data['task'] = $this->_taskRepository->findOneBy(['id' => $data['task_id']]);
$this->_tasksService->addTaskTracking($data);
return new JsonResponse(['message' => "success", 'status' => 200], Response::HTTP_OK);
}
#[Route('/api/driver/tracking', name: 'app_driver_tracking', methods: ['POST'])]
public function driver_tracking(Request $request)
{
$data = json_decode($request->getContent(), true);
if (!isset($data['user_id'])) {
return new JsonResponse(['message' => "User id is missing", 'status' => 400], Response::HTTP_BAD_REQUEST);
}
$user = $this->_userRepository->find($data['user_id']);
if (!$user) {
return new JsonResponse(['message' => "User not found", 'status' => 404], Response::HTTP_NOT_FOUND);
}
$driver = $this->_driversRepository->findOneBy(['user' => $user]);
if ($driver) {
$taskDrivers = $this->_taskDriverRepository->findBy(['driver' => $driver]);
foreach($taskDrivers as $td) {
$task = $td->getTasks();
if ($task) {
$lastStatus = $this->_taskStatusHistoryRepository->findStatusByTaskId($task->getId());
if (isset($lastStatus[0]) && $lastStatus[0]['slug'] === 'started') {
$data['task'] = $task;
$this->_tasksService->addTaskTracking($data);
}
}
}
}
return new JsonResponse(['message' => "success", 'status' => 200], Response::HTTP_OK);
}
/**
* Récupération de tous les chauffeurs affectés à une mission.
* @OA\Tag(name="Missions")
* @Security(name="Vyront")
* @OA\Response(
* response=200,
* description="Retourne la liste des chauffeurs affectés à une mission."
* )
*/
#[Route('/api/chauffeurs/task/{id}', name: 'app_task_chauffeurs', methods: ['GET', "POST"])]
public function task_chauffeurs(Request $request, $id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
return new JsonResponse(['chauffeurs' => $this->_taskDriverRepository->findDriversByTaskId($id), "status" => 200], Response::HTTP_OK);
}
/**
* Récupération de toutes les véhicules affectées à une mission.
* @OA\Tag(name="Missions")
* @Security(name="Vyront")
* @OA\Response(
* response=200,
* description="Retourne la liste des véhicules affectées à une mission."
* )
*/
#[Route('/api/vehicules/task/{id}', name: 'app_task_vehicules', methods: ['GET', "POST"])]
public function task_vehicules(Request $request, $id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
return new JsonResponse(['vehicules' => $this->_taskVehiculeRepository->findVehiculesByTaskId($id), "status" => 200], Response::HTTP_OK);
}
/**
* Détachement d'un chauffeur d'une mission.
* @OA\Tag(name="Missions")
* @Security(name="Vyront")
* @OA\Response(
* response=200,
* description="Retourne un message de succès."
* )
*/
#[Route('/api/task/{id}/driver/{driver_id}/remove', name: 'app_detach_chauff_task', methods: ['POST'])]
public function detach_chauff_task(Request $request, $id, $driver_id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$taskDriver = $this->_taskDriverRepository->findOneBy(['task' => $id, 'driver' => $driver_id]);
$this->_taskDriverRepository->remove($taskDriver, true);
return new JsonResponse(['message' => "Le chauffeur a été détaché avec succès !", "status" => 200], Response::HTTP_OK);
}
/**
* Détachement d'une véhicule d'une mission.
* @OA\Tag(name="Missions")
* @Security(name="Vyront")
* @OA\Response(
* response=200,
* description="Retourne un message de succès."
* )
*/
#[Route('/api/task/{id}/vehicule/{vehicule_id}/remove', name: 'app_detach_vehicule_task', methods: ['POST'])]
public function detach_vehicule_task(Request $request, $id, $vehicule_id)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$taskVehicule = $this->_taskVehiculeRepository->findOneBy(['task' => $id, 'vehicule' => $vehicule_id]);
$this->_taskVehiculeRepository->remove($taskVehicule, true);
return new JsonResponse(['message' => "La véhicule a été détachée avec succès !", "status" => 200], Response::HTTP_OK);
}
#[Route('/api/driver-position/{taskId}', name: 'app_driver_position', methods: ['GET', "POST"])]
public function driver_position(Request $request, $taskId)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$position = $this->_taskTrakingRepository->getLastPosition($taskId);
return new JsonResponse(['position' => $position, "status" => 200], Response::HTTP_OK);
}
#[Route('/api/google-map-directions', name: 'app_get_google_map_directions', methods: ['POST'])]
public function get_google_map_directions(Request $request)
{
$auth = $this->jwtHelper->verifyJwt($request, []);
if (is_string($auth)) {
return new JsonResponse(['message' => $auth, 'status' => 401], JsonResponse::HTTP_UNAUTHORIZED);
}
$data = json_decode($request->getContent(), true);
$googleMapDirections = $this->_tasksService->getGoogleMapDirections($data);
return new JsonResponse(["googleMapDirectionData" => $googleMapDirections, "status" => 200], Response::HTTP_OK);
}
}