src/Controller/SearchCaisseController.php line 78
<?phpnamespace App\Controller;use App\Entity\Caisse;use App\Form\CaisseSearchFormType;use App\Repository\CaisseRepository;use App\Repository\ProductStatsRepository;use App\Repository\ProductToSellStatsRepository;use App\Repository\SiteRepository;use App\Repository\EncaissementReelRepository;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Omines\DataTablesBundle\Adapter\ArrayAdapter;use Omines\DataTablesBundle\Column\TextColumn;use Omines\DataTablesBundle\DataTableFactory;use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\JsonResponse;use App\Services\ExportExcel;use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Style\Alignment;use PhpOffice\PhpSpreadsheet\Style\Fill;use PhpOffice\PhpSpreadsheet\Style\Border;class SearchCaisseController extends AbstractController{private $factory;public function __construct(DataTableFactory $factory,private CaisseRepository $caisseRepository,private ProductStatsRepository $productStatsRepository,private ProductToSellStatsRepository $productToSellStatsRepository,private SiteRepository $siteRepository,private EncaissementReelRepository $encaissementReelRepository,private ExportExcel $ExportExcel) {$this->factory = $factory;$this->caisseRepository = $caisseRepository;$this->productStatsRepository = $productStatsRepository;$this->productToSellStatsRepository = $productToSellStatsRepository;$this->siteRepository = $siteRepository;$this->encaissementReelRepository = $encaissementReelRepository;}/*** Creates and returns a basic DataTable instance.** @param array $options Options to be passed* @return DataTable*/protected function createDataTable(array $options = []){return $this->factory->create($options);}/*** Creates and returns a DataTable based upon a registered DataTableType or an FQCN.** @param string $type FQCN or service name* @param array $typeOptions Type-specific options to be considered* @param array $options Options to be passed* @return DataTable*/protected function createDataTableFromType($type, array $typeOptions = [], array $options = []){return $this->factory->createFromType($type, $typeOptions, $options);}#[Route('/', name: 'app_index_home')]public function showAction(Request $request, DataTableFactory $dataTableFactory): Response{$caisseRecords = [];$productStats = [];$productToSellStats = [];$startDate = '';$endDate = '';$arraySiteIds = [];$caisse['euroVisiteurAvg'] = null;$caisse['visiteurs'] = null;$caisse['panierMoyenAvg'] = null;// Créer le formulaire$form = $this->createForm(CaisseSearchFormType::class);// Traiter la requête$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {// Récupérer les données$data = $form->getData();// Supposons que $data['date1'] est un objet DateTime$date1 = $data['date1'];// Convertir en string au format jour-mois-année$startDate = $date1->format('Y-m-d');$date2 = $data['date2'];// Convertir en string au format jour-mois-année$endDate = $date2->format('Y-m-d');// Traiter les données ici...$siteIds = $data['site'];foreach($siteIds as $key => $siteId) {$arraySiteIds[$key] = $siteId->getId();}$caisseRecords = $this->caisseRepository->findByDateRangeAndSiteId($startDate, $endDate, $arraySiteIds);$productStats = $this->productStatsRepository->findStatsByDateRangeAndSiteId($startDate, $endDate, $siteIds);$productToSellStats = $this->productToSellStatsRepository->findStatsByDateRangeSiteIdAndProductType($startDate, $endDate, $siteIds);}// Afficher le formulairereturn $this->render('admin/caisse.html.twig', ['form' => $form->createView(),'caisseRecords' => $caisseRecords,'productStats' => $productStats,'productToSellStats' => $productToSellStats,'date1' => $startDate,'date2' => $endDate,'siteIds' => json_encode($arraySiteIds)]);}// Assurez-vous d'inclure les autres dépendances nécessaires/*** @Route("/ajax-caisse-export-stats", name="export_caisse_stats", methods={"POST"})*/public function exportCaisseStats(Request $request){if ($request->isXMLHttpRequest()) {$startDate = $_POST['date1'];$endDate = $_POST['date2'];$siteIds = json_decode($_POST['sites']);$caisseRecords = $this->caisseRepository->findByDateRangeAndSiteId($startDate, $endDate, $siteIds);$productStats = $this->productStatsRepository->findStatsByDateRangeAndSiteId($startDate, $endDate, $siteIds);$productToSellStats = $this->productToSellStatsRepository->findStatsByDateRangeSiteIdAndProductType($startDate, $endDate, $siteIds);$filePath = $this->exportFeuilleCaisse($startDate, $endDate, $siteIds, $caisseRecords, $productStats, $productToSellStats);//unlink($filePath);return new JsonResponse($filePath);}// Ici, insérez la logique de traitement de vos données// Supposons que $exportData est le résultat de votre traitement// Vous devrez générer un fichier Excel et le renvoyer comme réponse// Retourne une réponse (exemple fictif)}public function exportFeuilleCaisse($startDate, $endDate, $siteIds, $caisseRecords, $productStats, $productToSellStats){$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();$siteString = '';$siteName = '';foreach($siteIds as $key => $siteId) {if ($key !== 0) {$siteString .=', ';$siteName .='_';}$siteString .= strtoupper($this->siteRepository->findOneById($siteId)->getName());$siteName .= strtoupper($this->siteRepository->findOneById($siteId)->getName());}foreach(range('A', 'Z') as $columnID) { // Ajustez la plage selon vos besoins$sheet->getColumnDimension($columnID)->setAutoSize(true);}$centerCell = ['alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER,'vertical' => Alignment::VERTICAL_CENTER,],];$yellowLight = ['fill' => ['fillType' => Fill::FILL_SOLID,'startColor' => ['argb' => 'F5EEC8', // Utilisez le code couleur ARGB souhaité],],'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN,'color' => ['argb' => 'FF000000'], // Code couleur ARGB pour la bordure],],// Ajoutez ici d'autres styles si nécessaire];$grey = ['fill' => ['fillType' => Fill::FILL_SOLID,'startColor' => ['argb' => 'D0D4CA', // Utilisez le code couleur ARGB souhaité],],'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN,'color' => ['argb' => 'FF000000'], // Code couleur ARGB pour la bordure],],// Ajoutez ici d'autres styles si nécessaire];$bold = ['font' => ['bold' => true,],// Ajoutez ici d'autres styles si nécessaire];$sheet->setCellValue('A' . 1, 'Date :');$sheet->getStyle('A1')->applyFromArray($grey);$sheet->setCellValue('B' . 1, date('d-m-Y'));$sheet->getStyle('B1')->applyFromArray($yellowLight);$sheet->setCellValue('A' . 3, 'Lieu :');$sheet->getStyle('A3')->applyFromArray($grey);$sheet->setCellValue('B' . 3, $siteString);$sheet->getStyle('B3')->applyFromArray($yellowLight);$sheet->setCellValue('A' . 5, 'Période du :');$sheet->getStyle('A5')->applyFromArray($grey);$sheet->setCellValue('B' . 5, date('d-m-Y', strtotime($startDate)));$sheet->getStyle('B5')->applyFromArray($yellowLight);$sheet->setCellValue('C' . 5, 'au');$sheet->getStyle('C5')->applyFromArray($grey);$sheet->setCellValue('D' . 5, date('d-m-Y', strtotime($endDate)));$sheet->getStyle('D5')->applyFromArray($yellowLight);$sheet->getStyle('A1:E5')->applyFromArray($centerCell); // Applique le style à la plage de cellules de A1 à C10$letter = 'B';foreach ($productStats as $productStat) {$sheet->setCellValue($letter . 7, ucfirst($productStat['productTypeName']));$sheet->getStyle($letter . 7)->applyFromArray($centerCell); // Appliquer le style à la cellule A1$sheet->getStyle($letter . 7)->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->setCellValue($letter . 8, $productStat['productionSum']);$sheet->setCellValue($letter . 9, $productStat['invendusSum']);$sheet->setCellValue($letter . 10, $productStat['totalVentesSansOffertsSum']);$sheet->setCellValue($letter . 11, round($productStat['pourcentageVentesAvg']));$sheet->getStyle($letter .'8'.':'.$letter.'11')->applyFromArray($yellowLight); // Appliquer le style à la cellule A1++$letter;}$sheet->getStyle('A7:A11')->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->getStyle('A8:A11')->applyFromArray($centerCell); // Applique le style à la plage de cellules de A1 à C10$sheet->setCellValue('A8', 'Production');$sheet->setCellValue('A9', 'Invendus');$sheet->setCellValue('A10', 'Total des ventes');$sheet->setCellValue('A11', '% des ventes');$letter = 'B';foreach ($productToSellStats as $productToSell) {if ($productToSell['printToExport'] == 1) {$sheet->setCellValue($letter . 13, ucfirst($productToSell['productToSellTypeName']));$sheet->getStyle($letter . 13)->applyFromArray($centerCell);$sheet->getStyle($letter . 13)->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->setCellValue($letter . 14, $productToSell['totalSum']);$sheet->setCellValue($letter . 15, round($productToSell['ratioAvg'], 2));$sheet->getStyle($letter .'14'.':'.$letter.'15')->applyFromArray($yellowLight); // Appliquer le style à la cellule A1++$letter;}}$sheet->getStyle('A14:A15')->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->getStyle('A14:A15')->applyFromArray($centerCell); // Applique le style à la plage de cellules de A1 à C10$sheet->setCellValue('A14', 'Nombre');$sheet->setCellValue('A15', '%');$nombreTicket = $this->productToSellStatsRepository->findNombreTickets($startDate, $endDate, $siteIds);$sheet->setCellValue('A17', 'Total ticket');$sheet->setCellValue('B17', $nombreTicket[0]['totalSum']);$sheet->setCellValue('A18', 'Total article vendu');$sheet->setCellValue('B18', $caisseRecords['totalVentesSum']);$sheet->getStyle('A17:A18')->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->getStyle('A17:A18')->applyFromArray($centerCell); // Applique le style à la plage de cellules de A1 à C10$sheet->getStyle('B17:B18')->applyFromArray($yellowLight); // Appliquer le style à la cellule A1$caTotal = $this->encaissementReelRepository->findSumTotalByDateRangeAndSiteIds($startDate, $endDate, $siteIds);$sheet->setCellValue('A20', 'Visiteurs');$sheet->setCellValue('B20', $caisseRecords['visiteurs']);$sheet->setCellValue('A21', '%');$sheet->setCellValue('B21', $caisseRecords['pourcentageShootAvg']);$sheet->setCellValue('A22', '€');$sheet->setCellValue('B22', $caisseRecords['euroVisiteurAvg']);$sheet->setCellValue('A23', 'Panier moyen');$sheet->setCellValue('B23', $caisseRecords['panierMoyenAvg']);$sheet->setCellValue('A24', "Chiffre d'affaire");$sheet->setCellValue('B24', $caTotal);$sheet->getStyle('A20:A24')->applyFromArray($grey); // Appliquer le style à la cellule A1$sheet->getStyle('A20:A24')->applyFromArray($centerCell); // Applique le style à la plage de cellules de A1 à C10$sheet->getStyle('B20:B24')->applyFromArray($yellowLight); // Appliquer le style à la cellule A1$fileName = 'stats_caisse_'.$siteName.'_'.$startDate.'_'.$endDate;$filePath = $fileName.'.xlsx';$writer = new Xlsx($spreadsheet);$writer->save($filePath);return $filePath;}/*** @Route("/ajax-remove-file", name="ajax-remove-file", methods={"POST"})*/public function removeFile(Request $request) {if ($request->isXMLHttpRequest()) {$filePath = $_POST['filePath'];unlink($filePath);return new JsonResponse('success');}}#[Route('/caisse', name: 'app_import_manuel')]public function caisseAction(Request $request, DataTableFactory $dataTableFactory){$table = $this->createDataTable()->add('name', TextColumn::class, ['label' => 'Feuille de caisse', 'className' => 'bold', 'data' => 'non renseigné'])->add('caisseDate', TextColumn::class, ['label' => 'Date', 'className' => 'bold', 'data' => 'non renseigné'])->add('site', TextColumn::class, ['field' => 'site.name', 'label' => 'Site', 'className' => 'bold', 'data' => 'non renseigné', "globalSearchable" => true])->add('panier_moyen', TextColumn::class, ['label' => 'Panier moyen', 'className' => 'bold', 'data' => 'non renseigné'])->add('pourcentage_shoot', TextColumn::class, ['label' => 'Pourcentage shoot', 'className' => 'bold', 'data' => 'non renseigné'])->add('euro_visiteur', TextColumn::class, ['label' => 'Euro visiteur', 'className' => 'bold', 'data' => 'non renseigné'])->add('totalVente', TextColumn::class, ['label' => 'Vente totale', 'className' => 'bold', 'data' => 'non renseigné'])->createAdapter(ORMAdapter::class, ['entity' => Caisse::class,])->handleRequest($request);if ($table->isCallback()) {return $table->getResponse();}return $this->render('admin/list.html.twig', ['datatable' => $table]);}}