Ajout export des codes unique + Mail en cas d'erreur pendant la génération des codes uniques
This commit is contained in:
parent
2f1771d32e
commit
7ae1fc39e6
8 changed files with 280 additions and 23 deletions
|
|
@ -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++;
|
||||
|
|
|
|||
|
|
@ -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é.");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
114
app/Jobs/ProcessExportCodesUniques.php
Normal file
114
app/Jobs/ProcessExportCodesUniques.php
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Mail\ExportCodesUniques;
|
||||
use App\Mail\JobFailed;
|
||||
use App\Models\Codes;
|
||||
use App\Models\Settings;
|
||||
use Exception;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class ProcessExportCodesUniques implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
private $nbCodeFic, $nbCodeTot, $nbCodeLigne;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($nbCodeFic, $nbCodeTot, $nbCodeLigne)
|
||||
{
|
||||
$this->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()]));
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
42
app/Mail/ExportCodesUniques.php
Normal file
42
app/Mail/ExportCodesUniques.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class ExportCodesUniques extends Mailable implements ShouldQueue
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
private $name, $nbCodeFic, $nbCodeTot, $nbCodeLigne;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($name, $nbCodeFic, $nbCodeTot, $nbCodeLigne)
|
||||
{
|
||||
$this->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'));
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,45 @@
|
|||
<div class="card">
|
||||
<div class="card-header">
|
||||
Gestion des codes uniques
|
||||
<!-- Button modal -->
|
||||
<button type="button" class="btn btn-sm btn-success float-right" data-toggle="modal" data-target="#exportModal">
|
||||
<i class="fas fa-file-export"></i> Export
|
||||
</button>
|
||||
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="exportModal" tabindex="-1" aria-labelledby="exportModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="exportModalLabel">Export des codes uniques</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<form method="POST" action="{{ route('bo.export-codes') }}">
|
||||
@csrf
|
||||
<div class="modal-body">
|
||||
<div class="form-group form-row">
|
||||
<label class="col-form-label col" for="nb_code_tot">Nombre total de codes à exporter</label>
|
||||
<input type="number" name="nb_code_tot" id="nb_code_tot" class="form-control col" required>
|
||||
</div>
|
||||
<div class="form-group form-row">
|
||||
<label class="col-form-label col" for="nb_code_fic">Nombre de codes par fichier</label>
|
||||
<input type="number" name="nb_code_fic" id="nb_code_fic" class="form-control col" required>
|
||||
</div>
|
||||
<div class="form-group form-row">
|
||||
<label class="col-form-label col" for="nb_code_ligne">Nombre de codes par ligne</label>
|
||||
<input type="number" name="nb_code_ligne" id="nb_code_ligne" class="form-control col" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">Fermer</button>
|
||||
<button type="submit" class="btn btn-sm btn-success">Lancer l'export</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form action="{{route('bo.codes')}}" method="POST" enctype="multipart/form-data">
|
||||
|
|
@ -23,14 +62,19 @@
|
|||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
<p>Nombre de code(s) en base : {{$nbCodeBase}}</p>
|
||||
<p>Nombre de code(s) utilisé(s) : {{$nbCodeUsed}}</p>
|
||||
<p>Nombre de code(s)</p>
|
||||
<ul>
|
||||
<li>en base : {{$nbCodeBase}}</li>
|
||||
<li>utilisé(s) : {{$nbCodeUsed}}</li>
|
||||
<li>déjà exporté(s) : {{ $nbCodeExported }}</li>
|
||||
<li>restant à exporté(s) : {{$nbCodeRemainingToExport}}</li>
|
||||
</ul>
|
||||
<hr/>
|
||||
<div class="form-group row">
|
||||
<label class="col-form-label col-md-3">Nombre de codes à générer <span class="required-asterisk">*</span></label>
|
||||
<input class="form-control col-md-3" type="number" name="quantity" min="0">
|
||||
<label class="col-form-label col-md-3">Longueur des codes <span class="required-asterisk">*</span></label>
|
||||
<input class="form-control col-md-3" type="number" name="code_length" min="0">
|
||||
<div class="form-group form-row">
|
||||
<label class="col-form-label text-center col">Nombre de codes à générer <span class="required-asterisk">*</span></label>
|
||||
<input class="form-control col" type="number" name="quantity" min="0">
|
||||
<label class="col-form-label text-center col">Longueur des codes <span class="required-asterisk">*</span></label>
|
||||
<input class="form-control col" type="number" name="code_length" min="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer text-center">
|
||||
|
|
|
|||
10
resources/views/bo/mails/export-codes-unique-email.blade.php
Normal file
10
resources/views/bo/mails/export-codes-unique-email.blade.php
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<p>Bonjour,</p>
|
||||
<p>L'export des codes uniques est terminé, nom de l'archive : CodesUniques_{{ date('dmY') }}.zip</p>
|
||||
<p>
|
||||
Paramètres utilisés pour la génération :
|
||||
<ul>
|
||||
<li>Nombre de code par fichier : {{ $nbCodeFic }}</li>
|
||||
<li>Nombre total de code à exporter : {{ $nbCodeTot }}</li>
|
||||
<li>Nombre de code par ligne : {{ $nbCodeLigne }}</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
|
@ -87,6 +87,7 @@ Route::namespace('bo')
|
|||
// Codes uniques
|
||||
Route::get('/codes', 'CodesController@index')->name('codes');
|
||||
Route::post('/codes', 'CodesController@generate')->name('generate-codes');
|
||||
Route::post('/codes/export', 'CodesController@export')->name('export-codes');
|
||||
// Liste des gagnants
|
||||
Route::get('/winners-list', 'WinnersListController@index')->name('winners-list');
|
||||
Route::get('/winners-list/arcadia/{id}', 'WinnersListController@courrierArcadia')->name('winners-arcadia');
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue