table salaries, import depuis un csv

This commit is contained in:
Olivier Legat 2021-07-20 16:34:27 +02:00
parent 460d8e2cff
commit b49c5b25cb
9 changed files with 273 additions and 0 deletions

View file

@ -0,0 +1,50 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Jobs\CsvSalariesReader as JobCsvSalarieReader;
class ImportSalaries extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'import:salaries';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import Salaries, pour provision des clients';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$this->info('Running the Job, this could take some time.');
$job = new JobCsvSalarieReader();
$job->console = $this;
$job->handle();
$this->info('Job completed');
}
}

View file

@ -0,0 +1,10 @@
<?php
namespace App\Exceptions;
use Exception;
class AbortCsvImportException extends Exception
{
//
}

35
app/Jobs/CsvJobs.php Normal file
View file

@ -0,0 +1,35 @@
<?php
namespace App\Jobs;
abstract class CsvJobs extends XArcadiaFlux
{
/**
* parse csv file
*/
protected function parseCsv($csvFile) {
$file_handle = fopen($csvFile, 'r');
while (!feof($file_handle)) {
$line_of_text[] = fgetcsv($file_handle, 0, ";");
if(!end($line_of_text)) {
//supprime les lignes vides du csv
array_pop($line_of_text);
}
}
fclose($file_handle);
return $line_of_text;
}
/**
* Is the file to be ignored
*
* @param string $filename
* @return boolean
*/
protected function fileHasToBeIgnored(string $filename): bool
{
return in_array($filename, $this->ignoreFiles) or !$this->checkExtension($filename, 'csv');
}
}

View file

@ -0,0 +1,111 @@
<?php
namespace App\Jobs;
use App\Enums\LogType;
use App\Models\Salarie;
use ErrorException;
use TypeError;
use Illuminate\Database\QueryException;
use App\Exceptions\AbortCsvImportException;
use Illuminate\Contracts\Filesystem\Filesystem;
class CsvSalariesReader extends CsvJobs
{
/**
* This is for Laravel Console usage
*/
public $console = null;
protected $disk = 'salaries';
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
/** @var Filesystem */
$disk = $this->getDisk();
$this->log('Démarrage du traitement');
$files = $disk->files();
$progress = 1;
$total = count(array_filter($files, function ($filename) {
if ($this->fileHasToBeIgnored($filename)) {
return false;
}
return true;
}));
foreach ($files as $filename) {
if ($this->fileHasToBeIgnored($filename)) {
continue;
}
$this->log(sprintf(' traitement %d sur %s ', $progress++, $total));
/** @var string $data */
$filepath = $disk->path($filename);
try {
$data = $this->parseCsv($filepath);
//first line is header (mandatory)
$header = array_flip(array_shift($data));
foreach ($data as $line) {
$matricule = $line[$header['matricule']];
$prenom = $line[$header['prenom']];
$nom = $line[$header['nom']];
$salarie = Salarie::firstOrNew(['matricule' => $matricule ]);
$salarie->matricule = $matricule;
$salarie->nom = $nom;
$salarie->prenom = $prenom;
$salarie->save();
}
} catch (ErrorException | TypeError | QueryException $e) {
$message = $e->getMessage();
if (get_class($e) === QueryException::class) {
$message = implode(' ', $e->errorInfo);
}
$this->log(
sprintf(
'File %s could not be parsed => %s on line %d',
$filename,
$message,
$e->getLine()
),
LogType::critical()
);
continue; // ignore the file
} catch (AbortCsvImportException $e) {
$this->log(
sprintf(
'File %s could not be parsed => %s on line %d',
$filename,
$e->getMessage(),
$e->getLine()
),
LogType::error()
);
continue; // ignore the file
}
$this->moveToArchives($filename);
}
// Clear old archives
$this->clearOldArchives();
}
}

23
app/Models/Salarie.php Normal file
View file

@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Salarie extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'matricule',
'nom',
'prenom',
'code'
];
}

View file

@ -69,6 +69,11 @@ return [
'driver' => 'local',
'root' => storage_path('inco'),
],
'salaries' => [
'driver' => 'local',
'root' => storage_path('salaries'),
],
],
/*

View file

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSalariesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('salaries', function (Blueprint $table) {
$table->id();
//liaison à la table customers
$table->foreignId('customers_id')->nullable()->constrained('customers');
$table->string('matricule');
$table->string('nom')->nullable();
$table->string('prenom')->nullable();
$table->string('code')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('salaries');
}
}

1
storage/.gitignore vendored
View file

@ -1 +1,2 @@
inco/*
salaries/*

View file