diff --git a/app/Console/Commands/ExportCodesUniques.php b/app/Console/Commands/ExportCodesUniques.php index 2bb0bb2..e955935 100644 --- a/app/Console/Commands/ExportCodesUniques.php +++ b/app/Console/Commands/ExportCodesUniques.php @@ -2,8 +2,11 @@ namespace App\Console\Commands; +use App\Mail\ExportCodesUniques as MailExportCodesUniques; use App\Models\Codes; +use App\Models\Settings; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Mail; class ExportCodesUniques extends Command { @@ -38,51 +41,81 @@ class ExportCodesUniques extends Command */ public function handle() { - $nbCodeFic = 100; // Nombre de code par fichier - $nbCodeTot = 2000; // Nombre total de code à exporter - $nbCodeLigne = 4; // Nombre de code par ligne + $nbCodeTot = $this->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); - // TODO : Debug la création du ZIP - // compression des fichiers + $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 ($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') . $file_to_zip,"$file_to_zip"); + $zip->addFile(storage_path('export_codes_uniques/tmp/') . $file_to_zip,"$file_to_zip"); } closedir($handle); } $zip->close(); } - // TODO : Vider le dossier storage_path('export_codes_uniques/tmp') - // TODO : Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY') .".zip" + // 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); + } - return 0; + $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){ // TODO : Tester avec plus de 1000 dans le take - $codes = Codes::where('code_exported', 0)->take(1000)->get(); + $nbCodeToRetrieve = $nbCodeTot < 1000 ? $nbCodeTot : 1000; + $codes = Codes::where('code_exported', 0)->take($nbCodeToRetrieve)->get(); $countCodes = count($codes); 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); + 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); + file_put_contents(storage_path('export_codes_uniques/tmp/') . $currentFilename . ".csv", $code->code_unique . ";", FILE_APPEND); $totalExportedCodes++; $currentExportedCodes++; $currentLineCodes++; diff --git a/app/Http/Controllers/bo/CodesController.php b/app/Http/Controllers/bo/CodesController.php index de7ae1f..558458d 100644 --- a/app/Http/Controllers/bo/CodesController.php +++ b/app/Http/Controllers/bo/CodesController.php @@ -3,9 +3,11 @@ namespace App\Http\Controllers\bo; use App\Http\Controllers\Controller; +use App\Jobs\ProcessExportCodesUniques; use App\Jobs\ProcessUniqueCode; use App\Models\Codes; use App\Models\Settings; +use Exception; use Illuminate\Http\Request; class CodesController extends Controller @@ -13,7 +15,9 @@ class CodesController extends Controller public function index() { $nbCodeBase = Codes::count(); $nbCodeUsed = Codes::where('code_used', 1)->count(); - return view('bo.codes.index', compact('nbCodeBase', 'nbCodeUsed')); + $nbCodeExported = Codes::where('code_exported', 1)->count(); + $nbCodeRemainingToExport = Codes::where('code_exported', 0)->count(); + return view('bo.codes.index', compact('nbCodeBase', 'nbCodeUsed', 'nbCodeExported', 'nbCodeRemainingToExport')); } public function generate(Request $request) { @@ -26,5 +30,13 @@ class CodesController extends Controller return back()->with('success', "La génération à commencée, un mail de notification sera envoyé à l'adresse " . config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé."); } - // TODO : Export des codes pour imprimeur + public function export(Request $request) { + $nbCodeFic = intval($request->nb_code_fic); + $nbCodeTot = intval($request->nb_code_tot); + $nbCodeLigne = intval($request->nb_code_ligne); + + ProcessExportCodesUniques::dispatch($nbCodeFic, $nbCodeTot, $nbCodeLigne); + + return back()->with('success', "L'export des codes à commencé, un mail de notification sera envoyé à l'adresse " . config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé."); + } } diff --git a/app/Jobs/ProcessExportCodesUniques.php b/app/Jobs/ProcessExportCodesUniques.php new file mode 100644 index 0000000..45da106 --- /dev/null +++ b/app/Jobs/ProcessExportCodesUniques.php @@ -0,0 +1,114 @@ +nbCodeFic = $nbCodeFic; + $this->nbCodeTot = $nbCodeTot; + $this->nbCodeLigne = $nbCodeLigne; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $nbCodeFic = $this->nbCodeFic; // Nombre de code par fichier + $nbCodeTot = $this->nbCodeTot; // Nombre total de code à exporter + $nbCodeLigne = $this->nbCodeLigne; // Nombre de code par ligne + + $totalExportedCodes = 0; + $currentFilename = 1; + $currentExportedCodes = 0; + $currentLineCodes = ($nbCodeLigne === 1 ? 1 : 0); + + $this->process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes); + + // 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); + } + + // Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY') .".zip" + Mail::to(config('mail.MAIL_ADMIN'))->send(new ExportCodesUniques(Settings::find(1)->name, $nbCodeFic, $nbCodeTot, $nbCodeLigne)); + } + + private function process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes){ + // TODO : Tester avec plus de 1000 dans le take + $nbCodeToRetrieve = $nbCodeTot < 1000 ? $nbCodeTot : 1000; + $codes = Codes::where('code_exported', 0)->take($nbCodeToRetrieve)->get(); + $countCodes = count($codes); + + 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++; + } + $code->code_exported = 1; + $code->save(); + if ($currentExportedCodes === $nbCodeFic) { + $currentFilename++; + $currentExportedCodes = 0; + } + if ((($k + 1) === $countCodes) && $totalExportedCodes < $nbCodeTot){ + return $this->process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes); + } + } + } + } + + public function failed(Exception $exception) { + Mail::to(config('mail.MAIL_ADMIN'))->send(new JobFailed("ProcessExportCodeUnique", ['message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString()])); + } +} diff --git a/app/Jobs/ProcessUniqueCode.php b/app/Jobs/ProcessUniqueCode.php index 8d67814..c924264 100644 --- a/app/Jobs/ProcessUniqueCode.php +++ b/app/Jobs/ProcessUniqueCode.php @@ -51,7 +51,8 @@ class ProcessUniqueCode implements ShouldQueue } } catch (\PDOException $e) { if (!strpos($e->getMessage(), 'Duplicate entry')){ - die($e->getMessage()); + Mail::to(config('mail.MAIL_ADMIN'))->send(new JobFailed("ProcessUniqueCode", ['message' => $e->getMessage(), 'trace' => $e->getTraceAsString()])); + die(); } } } diff --git a/app/Mail/ExportCodesUniques.php b/app/Mail/ExportCodesUniques.php new file mode 100644 index 0000000..87627b2 --- /dev/null +++ b/app/Mail/ExportCodesUniques.php @@ -0,0 +1,42 @@ +name = $name; + $this->nbCodeFic = $nbCodeFic; + $this->nbCodeTot = $nbCodeTot; + $this->nbCodeLigne = $nbCodeLigne; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + $nbCodeFic = $this->nbCodeFic; + $nbCodeTot = $this->nbCodeTot; + $nbCodeLigne = $this->nbCodeLigne; + return $this->subject("Fin de l'export des codes uniques pour " . $this->name) + ->view('bo.mails.export-codes-unique-email', compact('nbCodeFic', 'nbCodeTot', 'nbCodeLigne')); + } +} diff --git a/resources/views/bo/codes/index.blade.php b/resources/views/bo/codes/index.blade.php index 4d3ed0f..8ca548f 100644 --- a/resources/views/bo/codes/index.blade.php +++ b/resources/views/bo/codes/index.blade.php @@ -4,6 +4,45 @@
Gestion des codes uniques + + + + +
@@ -23,14 +62,19 @@ {{ session('success') }}
@endif -

Nombre de code(s) en base : {{$nbCodeBase}}

-

Nombre de code(s) utilisé(s) : {{$nbCodeUsed}}

+

Nombre de code(s)

+
-
- - - - +
+ + + +