<?php
namespace App\Controller;
use DateTime;
use App\Library\Excel;
use App\Entity\Tickets;
use App\Entity\Contrats;
use App\Service\Securizer;
use App\Entity\Intervention;
use App\Entity\LigneDeContrat;
use App\Repository\ClientsRepository;
use App\Repository\TicketsRepository;
use App\Repository\ContratsRepository;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Style\Border;
use App\Repository\LigneDeContratRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
class ContratController extends AbstractController
{
/**
* @IsGranted("ROLE_CLIENT")
*/
public function index(ContratsRepository $repoContrat, AccessDecisionManagerInterface $accessDecisionManager): Response
{
//voir la liste des contrats
$securizer = new Securizer($accessDecisionManager);
$contrats = $repoContrat->findContratId($this->getUser(), $securizer);
return $this->json($contrats, 200, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_CLIENT")
*/
public function contratsClient(int $idClient, ContratsRepository $repoContrat, AccessDecisionManagerInterface $accessDecisionManager): Response
{
//voir la liste des contrats par client
$securizer = new Securizer($accessDecisionManager);
$contrats = $repoContrat->findContratIdClient($idClient, $this->getUser(), $securizer);
return $this->json($contrats, 200, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_CLIENT")
*/
public function voir($id, ContratsRepository $repoContrat, AccessDecisionManagerInterface $accessDecisionManager): Response
{
//recuperer un contrat par id
$securizer = new Securizer($accessDecisionManager);
$contrats = $repoContrat->findContratId($this->getUser(), $securizer);
//verifi que le contrat que l'on cherche fait bien partie de la liste de ceux qu'il est possible d'afficher
if (in_array($repoContrat->find($id), $contrats)) {
$contrat = $repoContrat->find($id);
} else {
return $this->json([
'status' => 400,
'message' => "Vous ne pouvez pas consulter ce contrat"
], 400);
}
return $this->json($contrat, 200, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_COMMERCIAL")
*/
public function creer(Request $request, ValidatorInterface $validator, SerializerInterface $serializer, EntityManagerInterface $manager): Response
{
//creer un nouveau contrat, seul les roles commercial et admin peuvent accer a cette url
$jsonRecu = $request->getContent();
try {
//transforme le json reçu en entity
$contrat = $serializer->deserialize($jsonRecu, Contrats::class, 'json');
$errors = $validator->validate($contrat);
if (count($errors) > 0) {
return $this->json($errors, 400);
}
$manager->persist($contrat);
$manager->flush();
} catch (\throwable $e) {
return $this->json([
'status' => 400,
'message' => $e->getMessage()
], 400);
}
return $this->json($contrat, 201, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_COMMERCIAL")
*/
public function modif($id, Request $request, ContratsRepository $repoContrat, ValidatorInterface $validator, SerializerInterface $serializer, EntityManagerInterface $manager): Response
{
//modifi un contrat existant, seul les roles commercial et admin peuvent accer a cette url
$contrat = $repoContrat->find($id);
if ($contrat == null) {
return $this->json([
'status' => 400,
'message' => "le client à modifier n'existe pas"
], 400);
}
$jsonRecu = $request->getContent();
try {
//transforme le json reçu en entity
$serializer->deserialize($jsonRecu, Contrats::class, 'json', ['object_to_populate' => $contrat]);
//validation des données reçus
$errors = $validator->validate($contrat);
if (count($errors) > 0) {
return $this->json($errors, 400);
}
$manager->persist($contrat);
$manager->flush();
} catch (\throwable $e) {
return $this->json([
'status' => 400,
'message' => $e->getMessage()
], 400);
}
return $this->json($contrat, 201, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_TECH")
*/
public function voirStatistiques(ContratsRepository $repoContrat): Response
{
//recuperer les contrats actif
$contrats = $repoContrat->findContratsActif();
$data = [];
foreach ($contrats as $contrat) {
if (!isset($data[$contrat->getIdClient()->getNom()])) $data[$contrat->getIdClient()->getNom()] = [
'client' => $contrat->getIdClient(),
'services' => [],
];
foreach ($contrat->getLigneDeContrats() as $ligne) {
$data[$contrat->getIdClient()->getNom()]['services'][] = [
'title' => $ligne->getIdTypeIntervention()->gettype(),
'done' => $ligne->getQuantiteConsome(),
'total' => $ligne->getQuantitePrevus(),
'dateDebut' => $contrat->getDateDebut(),
'dateFin' => $contrat->getDateFin(),
];
}
}
return $this->json($data, 200, [], ['groups' => 'affichageClient']);
}
/**
* @IsGranted("ROLE_CLIENT")
*/
public function getLigneDeContrat(int $idClient, int $idType, LigneDeContratRepository $ligneRepo)
{
// recupere ligneDeContrat par id client et id type
try {
$ligne = $ligneRepo->findLigneDeContrat($idClient, $idType);
} catch (\throwable $e) {
return $this->json([
'status' => 400,
'message' => $e->getMessage()
], 400);
}
if (!isset($ligne[0]))
return $this->json([
'status' => 410,
'message' => "Il n'y a pas de contrat actif pour le client sélectionné."
], 410);
$ligne = $ligne[0];
if ($ligne->getQuantiteConsome() >= $ligne->getQuantitePrevus())
return $this->json([
'status' => 410,
'message' => "Le nombre maximum de ce type d'interventions dans le contrat a été atteint."
], 410);
return $this->json($ligne, 201, [], ['groups' => 'affichageContrat']);
}
/**
* @IsGranted("ROLE_COMMERCIAL")
*/
public function export(Request $request, ClientsRepository $repoClients, ContratsRepository $repoContrat, TicketsRepository $repoTickets)
{
try {
$data = json_decode($request->getContent(), true);
if (!isset($data["client"]) || !isset($data["dateDebut"]) || !isset($data["dateFin"])) return $this->json([
'status' => 400,
'message' => "les données reçues sont incorrectes"
], 400);
$client = $repoClients->find($data["client"]);
$dateDebut = new DateTime($data["dateDebut"]);
$dateFin = new DateTime($data["dateFin"]);
if ($client == null || $dateDebut == null || $dateFin == null) {
return $this->json([
'status' => 400,
'message' => "les données reçues sont incorrectes"
], 400);
}
/** @var Contrat[] $contrats */
$contrats = $repoContrat->getContratsByDate($client->getId(), $dateDebut, $dateFin);
/** @var LigneDeContrat[] $lignesPreventives */
$lignesPreventives = [];
/** @var LigneDeContrat[] $lignesCuratives */
$lignesCuratives = [];
/** @var LigneDeContrat[] $lignesRegie */
$lignesRegie = [];
/** @var LigneDeContrat[] $lignesTelemaintenace */
$lignesTelemaintenace = [];
$actionsCommerciales = [];
foreach ($contrats as $contrat) {
foreach ($contrat->getLigneDeContrats()->toArray() as $ligne) {
if ($ligne->getIdTypeIntervention()->getType() == "Preventive")
$lignesPreventives[] = $ligne;
if ($ligne->getIdTypeIntervention()->getType() == "Curative")
$lignesCuratives[] = $ligne;
if ($ligne->getIdTypeIntervention()->getType() == "Télémaintenance")
$lignesTelemaintenace[] = $ligne;
if ($ligne->getIdTypeIntervention()->getType() == "Régie")
$lignesRegie[] = $ligne;
$actionsCommerciales = array_merge($actionsCommerciales, $ligne->getActionCommercials()->toArray());
}
}
$hasActionsCommerciales = count($actionsCommerciales) > 0;
$hasInterventionsRegie = count($lignesRegie) > 0;
$path = $_SERVER["DOCUMENT_ROOT"] . ($_ENV['APP_ENV'] == "dev" ? '../documents/' : '/ExtranetV2/documents/');
$excel = new Excel($path, 'Export_Contrats.xlsx');
if ($hasActionsCommerciales && $hasInterventionsRegie) {
$excel->loadFile($path . 'templates/export_contrats_+_actions_commerciales_+_regie.xlsx');
} else if ($hasActionsCommerciales && !$hasInterventionsRegie) {
$excel->loadFile($path . 'templates/export_contrats_+_actions_commerciales.xlsx');
} else if (!$hasActionsCommerciales && $hasInterventionsRegie) {
$excel->loadFile($path . 'templates/export_contrats_+_regie.xlsx');
} else {
$excel->loadFile($path . 'templates/export_contrats.xlsx');
}
$excel->selectSheetbyIndex(0);
$excel->writeCell('A1', "Récapitulatif contrat " . $dateDebut->format('Y') . " / " . $dateFin->format('Y'), Excel::_FORMAT_TEXTE_);
$excel->writeCell('A2', "Export du " . $dateDebut->format('d/m/Y') . " au " . $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
// Télémaintenance -----
// Actions Commerciales
$actionsCommerciales_telemaintenance = array_filter($actionsCommerciales, function ($action) {
return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Télémaintenance";
});
$minutesCommerciales = array_reduce(
$actionsCommerciales_telemaintenance,
function ($carry, $item) {
return $carry + $item->getQuantite();
},
0
);
// Quantité de minutes de type télémaintenance prévus
$minutesPrevus = array_sum(array_map(function ($ligne) {
return $ligne->getQuantitePrevus();
}, $lignesTelemaintenace)) - $minutesCommerciales;
$excel->writeCell('B4', sprintf("%02dh%02d", floor($minutesPrevus / 60), ($minutesPrevus % 60)), Excel::_FORMAT_TEXTE_);
// Utilisation des minutes de type télémaintenance
$minutesConsomme = array_sum(array_map(function ($ligne) {
return $ligne->getQuantiteConsome();
}, $lignesTelemaintenace));
$excel->writeCell('D4', sprintf("%02dh%02d", floor($minutesConsomme / 60), ($minutesConsomme % 60)), Excel::_FORMAT_TEXTE_);
if ($hasActionsCommerciales)
$excel->writeCell('E4', sprintf("%02dh%02d", floor($minutesCommerciales / 60), abs($minutesCommerciales % 60)), Excel::_FORMAT_TEXTE_);
// Restantes
$minutesConsomme = $minutesConsomme + $client->getHotlineCompteur();
$minutesPrevus = $minutesPrevus + $minutesCommerciales;
$excel->writeCell(($hasActionsCommerciales ? 'G4' : 'E4'), sprintf("%02dh%02d", (($minutesPrevus) < $minutesConsomme ? "-" : "") . floor(abs($minutesPrevus - $minutesConsomme) / 60), (abs($minutesPrevus - $minutesConsomme) % 60)), Excel::_FORMAT_TEXTE_);
// Préventive -----
// Actions Commerciales
$actionsCommerciales_preventive = array_filter($actionsCommerciales, function ($action) {
return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Preventive";
});
$journeesComerciales = array_reduce(
$actionsCommerciales_preventive,
function ($carry, $item) {
return $carry + $item->getQuantite();
},
0
);
// Quantité de journées de type préventive prévus
$journeesPrevus = array_sum(array_map(function ($ligne) {
return $ligne->getQuantitePrevus();
}, $lignesPreventives)) - $journeesComerciales;
$excel->writeCell('B5', $journeesPrevus, Excel::_FORMAT_TEXTE_);
// Utilisation des journées de type préventive
$journeesConsomme = array_sum(array_map(function ($ligne) {
return $ligne->getQuantiteConsome();
}, $lignesPreventives));
$excel->writeCell('D5', $journeesConsomme, Excel::_FORMAT_TEXTE_);
if ($hasActionsCommerciales)
$excel->writeCell('E5', $journeesComerciales, Excel::_FORMAT_TEXTE_);
// Restantes
$journeesPrevus = $journeesPrevus + $journeesComerciales;
$excel->writeCell(($hasActionsCommerciales ? 'G5' : 'E5'), $journeesPrevus - $journeesConsomme, Excel::_FORMAT_TEXTE_);
// Curative -----
// Actions Commerciales
$actionsCommerciales_curative = array_filter($actionsCommerciales, function ($action) {
return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Curative";
});
$journeesComerciales = array_reduce(
$actionsCommerciales_curative,
function ($carry, $item) {
return $carry + $item->getQuantite();
},
0
);
// Quantité d'interventions de type curative prévus
$journeesPrevus = array_sum(array_map(function ($ligne) {
return $ligne->getQuantitePrevus();
}, $lignesCuratives)) - $journeesComerciales;
$excel->writeCell('B6', $journeesPrevus, Excel::_FORMAT_TEXTE_);
// Utilisation des interventions de type curative
$interventionsConsomme = array_sum(array_map(function ($ligne) {
return $ligne->getQuantiteConsome();
}, $lignesCuratives));
$excel->writeCell('D6', $interventionsConsomme, Excel::_FORMAT_TEXTE_);
if ($hasActionsCommerciales)
$excel->writeCell('E6', $journeesComerciales, Excel::_FORMAT_TEXTE_);
// Restantes
$journeesPrevus = $journeesPrevus + $journeesComerciales;
$excel->writeCell(($hasActionsCommerciales ? 'G6' : 'E6'), $journeesPrevus - $interventionsConsomme, Excel::_FORMAT_TEXTE_);
if ($hasInterventionsRegie) {
// Régie -----
// Actions Commerciales
$actionsCommerciales_regie = array_filter($actionsCommerciales, function ($action) {
return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Régie";
});
$journeesComerciales = array_reduce(
$actionsCommerciales_regie,
function ($carry, $item) {
return $carry + $item->getQuantite();
},
0
);
// Quantité d'interventions de type regie prévus
$journeesPrevus = array_sum(array_map(function ($ligne) {
return $ligne->getQuantitePrevus();
}, $lignesRegie)) - $journeesComerciales;
$excel->writeCell('B7', $journeesPrevus, Excel::_FORMAT_TEXTE_);
// Utilisation des interventions de type regie
$interventionsConsomme = array_sum(array_map(function ($ligne) {
return $ligne->getQuantiteConsome();
}, $lignesRegie));
$excel->writeCell('D7', $interventionsConsomme, Excel::_FORMAT_TEXTE_);
if ($hasActionsCommerciales)
$excel->writeCell('E7', $journeesComerciales, Excel::_FORMAT_TEXTE_);
// Restantes
$journeesPrevus = $journeesPrevus + $journeesComerciales;
$excel->writeCell(($hasActionsCommerciales ? 'G7' : 'E7'), $journeesPrevus - $interventionsConsomme, Excel::_FORMAT_TEXTE_);
}
// On initialise à 10 pour commencer à écrire à cette ligne
$row = 10;
for ($i = 0; $i < count($lignesPreventives); $i++) {
/** @var Intervention $intervention */
foreach ($lignesPreventives[$i]->getInterventions() as $intervention) {
$excel->writeCell('A' . $row, $intervention->getTitre(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('B' . $row, "par " . $intervention->getTechPrevus()->getNom() . " " . $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('C' . $row, $intervention->getDateIntervention()->format('d/m/Y') . " ( " . $intervention->getIdStatus()->getStatus() . " )", Excel::_FORMAT_TEXTE_);
$excel->applyBackgroundColorAndColor('A' . $row . ':C' . $row, ($row % 2 == 1 ? 'f5f5f5' : 'ffffff'), '424242');
$row++;
}
}
$row = 10;
for ($i = 0; $i < count($lignesCuratives); $i++) {
/** @var Intervention $intervention */
foreach ($lignesCuratives[$i]->getInterventions() as $intervention) {
$excel->writeCell('D' . $row, $intervention->getTitre(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('E' . $row, "par " . $intervention->getTechPrevus()->getNom() . " " . $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('F' . $row, $intervention->getDateIntervention()->format('d/m/Y') . " ( " . $intervention->getIdStatus()->getStatus() . " )", Excel::_FORMAT_TEXTE_);
$excel->applyBackgroundColorAndColor('D' . $row . ':F' . $row, ($row % 2 == 1 ? 'f5f5f5' : 'ffffff'), '424242');
$row++;
}
}
if ($hasInterventionsRegie) {
$row = 10;
for ($i = 0; $i < count($lignesRegie); $i++) {
/** @var Intervention $intervention */
foreach ($lignesRegie[$i]->getInterventions() as $intervention) {
$excel->writeCell('G' . $row, $intervention->getTitre(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('H' . $row, "par " . $intervention->getTechPrevus()->getNom() . " " . $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
$excel->writeCell('I' . $row, $intervention->getDateIntervention()->format('d/m/Y') . " ( " . $intervention->getIdStatus()->getStatus() . " )", Excel::_FORMAT_TEXTE_);
$excel->applyBackgroundColorAndColor('G' . $row . ':I' . $row, ($row % 2 == 1 ? 'f5f5f5' : 'ffffff'), '424242');
$row++;
}
}
}
$excel->selectSheetbyIndex(1);
$topTickets = $repoTickets->getClientTopTickets($client->getId(), $dateDebut, $dateFin, 10);
$row = 3;
/** @var Tickets $ticket */
foreach ($topTickets as $ticket) {
$excel->writeCell('A' . $row, $ticket['id'], Excel::_FORMAT_NUMBER_);
$excel->writeCell('B' . $row, $ticket['titre'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('C' . $row, $ticket['status'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('D' . $row, ($ticket['dateCreation'])->format('d/m/Y'), Excel::_FORMAT_DDMMYYYY_);
$excel->writeCell('E' . $row, $ticket['nom'] . " " . $ticket['prenom'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('F' . $row, $ticket['duree'], Excel::_FORMAT_NUMBER_);
$row++;
}
$topDemandes = $repoTickets->getClientTopDemandes($client->getId(), $dateDebut, $dateFin, 10);
$row = 16;
/** @var Tickets $ticket */
foreach ($topDemandes as $ticket) {
$excel->writeCell('A' . $row, $ticket['nom'] . " " . $ticket['prenom'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('B' . $row, $ticket['duree'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('C' . $row, $ticket['nbTickets'], Excel::_FORMAT_TEXTE_);
$row++;
}
$topConsommateurs = $repoTickets->getClientTopConsommateurs($client->getId(), $dateDebut, $dateFin, 10);
$row = 29;
/** @var Tickets $ticket */
foreach ($topConsommateurs as $ticket) {
$excel->writeCell('A' . $row, $ticket['nom'] . " " . $ticket['prenom'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('B' . $row, $ticket['duree'], Excel::_FORMAT_TEXTE_);
$excel->writeCell('C' . $row, $ticket['nbTickets'], Excel::_FORMAT_TEXTE_);
$row++;
}
$tickets = $repoTickets->getTicketsByClientAndDate($client->getId(), $dateDebut, $dateFin);
$dureeTotale = array_sum(array_map(function ($ticket) {
return $ticket['duree'];
}, $tickets));
$excel->writeCell('F15', count($tickets), Excel::_FORMAT_NUMBER_);
$excel->writeCell('F16', $dureeTotale, Excel::_FORMAT_NUMBER_);
$excel->writeCell('F17', round($dureeTotale / count($tickets), 2), Excel::_FORMAT_NUMBER_);
$excel->writeCell('F18', count(array_filter($tickets, function ($ticket) {
return $ticket['duree'] < 5;
})), Excel::_FORMAT_NUMBER_);
$excel->writeCell('F19', count(array_filter($tickets, function ($ticket) {
return $ticket['duree'] > 60;
})), Excel::_FORMAT_NUMBER_);
// ONGLET TICKETS
$excel->selectSheetbyIndex(2);
$excel->writeCell('A2', "Export du " . $dateDebut->format('d/m/Y') . " au " . $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
$row = 4;
/** @var Tickets $ticket */
for ($i = 0; $i < count($tickets); $i++) {
$ticket = $repoTickets->find($tickets[$i]['id']);
$excel->writeCell("A" . $row, $ticket->getId(), Excel::_FORMAT_NUMBER_);
$excel->writeCell("B" . $row, $ticket->getTitre(), Excel::_FORMAT_TEXTE_);
$excel->writeCell("C" . $row, $ticket->getIdStatus()->getStatus(), Excel::_FORMAT_TEXTE_);
$excel->writeCell("D" . $row, date('d/m/Y', $ticket->getDateCreation()), Excel::_FORMAT_DDMMYYYY_);
$excel->writeCell("E" . $row, $ticket->getBeneficiaire()->getNom() . " " . $ticket->getBeneficiaire()->getPrenom(), Excel::_FORMAT_TEXTE_);
$excel->writeCell("F" . $row, $ticket->getDureeTotale(), Excel::_FORMAT_NUMBER_);
$excel->applyBackgroundColorAndColor('A' . $row . ':F' . $row, ($row % 2 == 1 ? 'f5f5f5' : 'ffffff'), '424242');
$excel->fontBold('F' . $row . ':F' . $row);
$row++;
}
$excel->selectSheetbyIndex(3);
$excel->writeCell('A2', "Export du " . $dateDebut->format('d/m/Y') . " au " . $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
$row = 4;
foreach ($contrats as $contrat) {
foreach ($contrat->getLigneDeContrats()->toArray() as $ligne) {
$excel->writeCell('A' . $row, date('d/m/Y', $contrat->getDateDebut()), Excel::_FORMAT_DDMMYYYY_);
$excel->writeCell('B' . $row, date('d/m/Y', $contrat->getDateFin()), Excel::_FORMAT_DDMMYYYY_);
$excel->writeCell('C' . $row, $ligne->getIdTypeIntervention()->gettype(), Excel::_FORMAT_TEXTE_);
if ($ligne->getIdTypeIntervention()->getIdUnite()->getUnite() === "minute") {
$excel->writeCell('D' . $row, sprintf('%02dh%02d', floor($ligne->getQuantiteConsome() / 60), $ligne->getQuantiteConsome() % 60), Excel::_FORMAT_TEXTE_);
$excel->writeCell('E' . $row, sprintf('%02dh%02d', floor($ligne->getQuantitePrevus() / 60), $ligne->getQuantitePrevus() % 60), Excel::_FORMAT_TEXTE_);
} else {
$excel->writeCell('D' . $row, $ligne->getQuantiteConsome(), Excel::_FORMAT_NUMBER_);
$excel->writeCell('E' . $row, $ligne->getQuantitePrevus(), Excel::_FORMAT_NUMBER_);
}
$excel->applyBackgroundColorAndColor('A' . $row . ':E' . $row, ($row % 2 == 1 ? 'f5f5f5' : 'ffffff'), '424242');
$row++;
}
}
if ($hasActionsCommerciales) {
$excel->selectSheetbyIndex(4);
$excel->writeCell('A2', "Export du " . $dateDebut->format('d/m/Y') . " au " . $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
$row = 4;
foreach ($actionsCommerciales as $action) {
$excel->writeCell('A' . $row, ($row - 3), Excel::_FORMAT_TEXTE_);
$excel->writeCell('B' . $row, strip_tags($action->getMessage()), Excel::_FORMAT_TEXTE_);
$excel->writeCell('C' . $row, date('d/m/Y', $action->getDateTimestamp()), Excel::_FORMAT_DDMMYYYY_);
if ($action->getLigneDeContrat()->getIdTypeIntervention()->getIdUnite()->getUnite() === "minute") {
$excel->writeCell('D' . $row, sprintf('%02dh%02d', floor($action->getQuantite() / 60), abs($action->getQuantite() % 60)) . " heure", Excel::_FORMAT_TEXTE_);
} else {
$excel->writeCell('D' . $row, $action->getQuantite() . " " . $action->getLigneDeContrat()->getIdTypeIntervention()->getIdUnite()->getUnite(), Excel::_FORMAT_NUMBER_);
}
$row++;
}
}
$excel->selectSheetbyIndex(0);
} catch (\Throwable $th) {
return $this->json([
'status' => 400,
'message' => $th->getMessage(),
'trace' => $th->getTraceAsString(),
'line' => $th->getLine(),
], 400);
}
$excel->saveXlsx();
return $this->json(true, 200, []);
}
public function downloadExport()
{
$path = $_SERVER["DOCUMENT_ROOT"] . ($_ENV['APP_ENV'] == "dev" ? '../documents/' : '/ExtranetV2/documents/');
$path .= 'Export_Contrats.xlsx';
// header('Access-Control-Allow-Origin: ' . "http://localhost:8001");
header('Access-Control-Allow-Origin: ' . ($_ENV['APP_ENV'] == "dev" ? "http://localhost:8001" : "https://ekxtranet.cco-info.fr/"));
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // Type MIME pour les fichiers Excel
header('Content-Disposition: attachment; filename="Export_Contrats.xlsx"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
return readfile($path);
}
}