ask("Combien de code doivent être exporté ?"); // Nombre total de code à exporter while (empty(intval($nbCodeTot)) || !is_int(intval($nbCodeTot))) { $this->info("Valeur incorrect, veuillez entrer un nombre entier."); $nbCodeTot = $this->ask("Veuillez entrer une nouvelle valeur"); } $nbCodeTot = intval($nbCodeTot); $nbCodeFic = $this->ask("Combien de code par fichier ?"); // Nombre de code par fichier while (empty(intval($nbCodeFic)) || !is_int(intval($nbCodeFic))) { $this->info("Valeur incorrect, veuillez entrer un nombre entier."); $nbCodeFic = $this->ask("Veuillez entrer une nouvelle valeur"); } $nbCodeFic = intval($nbCodeFic); $nbCodeLigne = $this->ask("Combien de code par ligne dans un fichier ?"); // Nombre de code par ligne while (empty(intval($nbCodeLigne)) || !is_int(intval($nbCodeLigne))) { $this->info("Valeur incorrect, veuillez entrer un nombre entier."); $nbCodeLigne = $this->ask("Veuillez entrer une nouvelle valeur"); } $nbCodeLigne = intval($nbCodeLigne); $totalExportedCodes = 0; $currentFilename = 1; $currentExportedCodes = 0; $currentLineCodes = ($nbCodeLigne === 1 ? 1 : 0); $this->info("Traitement en cours, veuillez patienter..."); $this->process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes); $this->info("Fin du traitement, creation de l'archive..."); // Compression des fichiers $zip = new \ZipArchive(); if ($zip->open(storage_path('export_codes_uniques/') . "CodesUniques_". date('dmY') .".zip",\ZipArchive::CREATE)===TRUE) { if ($handle = opendir(storage_path('export_codes_uniques/tmp'))) { while (false !== ($file_to_zip = readdir($handle))) { if (pathinfo($file_to_zip,PATHINFO_EXTENSION)!='csv') continue; $zip->addFile(storage_path('export_codes_uniques/tmp/') . $file_to_zip,"$file_to_zip"); } closedir($handle); } $zip->close(); } // On vide le dossier temporaire des fichiers csv if ($handle = opendir(storage_path('export_codes_uniques/tmp'))) { while (false !== ($file_to_zip = readdir($handle))) { if (pathinfo($file_to_zip,PATHINFO_EXTENSION)!='csv') continue; unlink(storage_path('export_codes_uniques/tmp/') . $file_to_zip); } closedir($handle); } $this->info("L'archive CodesUniques_". date('dmY') .".zip a ete creer."); // Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY') .".zip" Mail::to(config('mail.MAIL_ADMIN'))->send(new MailExportCodesUniques(Settings::find(1)->name, $nbCodeFic, $nbCodeTot, $nbCodeLigne)); } private function process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes, $lastExportedCodeId = null){ $paginate = config('codes.paginate'); if ($nbCodeTot < $paginate){ $nbCodeToRetrieve = $nbCodeTot; }else{ if ($totalExportedCodes + $paginate > $nbCodeTot){ $nbCodeToRetrieve = $nbCodeTot - $totalExportedCodes; }else{ $nbCodeToRetrieve = $paginate; } } if ($lastExportedCodeId === null) { $codes = Codes::where('code_exported', 0)->take($nbCodeToRetrieve)->get(); }else{ $codes = Codes::where([ ['code_exported', '=', 0], ['id', '>', $lastExportedCodeId] ])->take($nbCodeToRetrieve)->get(); } $countCodes = count($codes); $exportedCodesId = []; foreach ($codes as $k => $code){ if ($currentExportedCodes < $nbCodeTot){ if ($currentLineCodes === ($nbCodeLigne === 1 ? 1 : $nbCodeLigne - 1)){ file_put_contents(storage_path('export_codes_uniques/tmp/') . $currentFilename . ".csv", $code->code_unique . PHP_EOL, FILE_APPEND); $totalExportedCodes++; $currentExportedCodes++; $currentLineCodes = ($nbCodeLigne === 1 ? 1 : 0); }else{ file_put_contents(storage_path('export_codes_uniques/tmp/') . $currentFilename . ".csv", $code->code_unique . ";", FILE_APPEND); $totalExportedCodes++; $currentExportedCodes++; $currentLineCodes++; } array_push($exportedCodesId, $code->id); $lastExportedCodeId = $code->id; if ($currentExportedCodes === $nbCodeFic) { $currentFilename++; $currentExportedCodes = 0; } if ((($k + 1) === $countCodes) && $totalExportedCodes < $nbCodeTot){ Codes::whereIn('id', $exportedCodesId)->update(['code_exported' => 1]); return $this->process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes, $lastExportedCodeId); } if (($k + 1) === $countCodes){ Codes::whereIn('id', $exportedCodesId)->update(['code_exported' => 1]); } } } } }