Logica de trabajo con CSV y carga movida a CanastaHelper.php
This commit is contained in:
parent
131bf33a73
commit
ac4d5895be
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
|
||||
namespace App\Helpers;
|
||||
|
||||
use App\Proveedor;
|
||||
use DatabaseSeeder;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use League\Csv\Reader;
|
||||
|
||||
class CanastaHelper
|
||||
{
|
||||
const FILA_HEADER = "Tipo";
|
||||
const ULTIMA_FILA = "TOTAL";
|
||||
|
||||
public static function cargarCanasta($archivo) {
|
||||
$csv = Reader::createFromPath(resource_path($archivo), 'r');
|
||||
$csv->setDelimiter("|");
|
||||
$iHeader = self::obtenerIndiceDeHeader($csv);
|
||||
$csv->setHeaderOffset($iHeader);
|
||||
$registros = $csv->getRecords();
|
||||
|
||||
$toInsert = [];
|
||||
$categoria = '';
|
||||
foreach($registros as $i => $registro){
|
||||
//filas que están arriba del header
|
||||
if ($i <= $iHeader){
|
||||
continue;
|
||||
}
|
||||
|
||||
//finalizar
|
||||
if ($registro[self::FILA_HEADER] == self::ULTIMA_FILA) {
|
||||
break;
|
||||
}
|
||||
|
||||
//filas que no tienen tipo
|
||||
if (!Arr::has($registro,self::FILA_HEADER)|| trim($registro[self::FILA_HEADER]) == ''){
|
||||
var_dump("no hay tipo en la fila " . $i);
|
||||
continue;
|
||||
}
|
||||
|
||||
//saltear bono de transporte
|
||||
if ($registro[self::FILA_HEADER] == "T"){
|
||||
continue;
|
||||
}
|
||||
|
||||
//obtener categoria
|
||||
if ($registro['Producto'] == '') {
|
||||
//es la pregunta de la copa?
|
||||
if (Str::contains($registro[self::FILA_HEADER],"¿")) { continue; }
|
||||
$categoria = $registro[self::FILA_HEADER];
|
||||
continue;
|
||||
}
|
||||
|
||||
//completar producto
|
||||
$toInsert[] = [
|
||||
'fila' => $i,
|
||||
'categoria' => $categoria,
|
||||
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])),
|
||||
'precio' => $registro['Precio'],
|
||||
'proveedor_id' => self::obtenerProveedor($registro['Producto']),
|
||||
'bono' => $registro[self::FILA_HEADER] == "B",
|
||||
'requiere_notas'=> $registro[self::FILA_HEADER] =="PTC",
|
||||
];
|
||||
}
|
||||
|
||||
foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
|
||||
{
|
||||
DB::table('productos')->insert($chunk);
|
||||
}
|
||||
}
|
||||
|
||||
private static function obtenerIndiceDeHeader($csv){
|
||||
$registros = $csv->getRecords();
|
||||
$iheader = 0;
|
||||
foreach ($registros as $i => $registro){
|
||||
if (strtolower($registro[0]) == strtolower(self::FILA_HEADER)) {
|
||||
$iheader = $i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $iheader;
|
||||
}
|
||||
|
||||
private static function obtenerProveedor($nombre) {
|
||||
$result = null;
|
||||
if (Str::contains($nombre,"*")){
|
||||
$result = Proveedor::firstOrCreate([
|
||||
'nombre' => 'Proveedor de economía solidaria',
|
||||
'economia_solidaria' => 1,
|
||||
'nacional' => 1
|
||||
])->id;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
<?php
|
||||
|
||||
use App\Helpers\CanastaHelper;
|
||||
use Illuminate\Database\Seeder;
|
||||
use League\Csv\Reader;
|
||||
use App\Proveedor;
|
||||
|
||||
class CanastaSeeder extends Seeder
|
||||
{
|
||||
const FILA_HEADER = "Tipo";
|
||||
const ULTIMA_FILA = "TOTAL";
|
||||
const ARCHIVO_DEFAULT = 'csv/productos.csv';
|
||||
|
||||
/**
|
||||
* Run the database seeds.
|
||||
|
@ -16,83 +16,6 @@ class CanastaSeeder extends Seeder
|
|||
*/
|
||||
public function run()
|
||||
{
|
||||
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
|
||||
$csv->setDelimiter("|");
|
||||
$iHeader = $this->obtenerIndiceDeHeader($csv);
|
||||
$csv->setHeaderOffset($iHeader);
|
||||
$registros = $csv->getRecords();
|
||||
|
||||
$toInsert = [];
|
||||
$categoria = '';
|
||||
foreach($registros as $i => $registro){
|
||||
//filas que están arriba del header
|
||||
if ($i <= $iHeader){
|
||||
continue;
|
||||
}
|
||||
|
||||
//finalizar
|
||||
if ($registro[$this::FILA_HEADER] == $this::ULTIMA_FILA){
|
||||
break;
|
||||
}
|
||||
|
||||
//filas que no tienen tipo
|
||||
if (!Arr::has($registro,$this::FILA_HEADER)|| trim($registro[$this::FILA_HEADER]) == ''){
|
||||
var_dump("no hay tipo en la fila " . $i);
|
||||
continue;
|
||||
}
|
||||
|
||||
//saltear bono de transporte
|
||||
if ($registro[$this::FILA_HEADER] == "T"){
|
||||
continue;
|
||||
}
|
||||
|
||||
//obtener categoria
|
||||
if ($registro['Producto'] == '') {
|
||||
//es la pregunta de la copa?
|
||||
if (Str::contains($registro[$this::FILA_HEADER],"¿")) { continue; }
|
||||
$categoria = $registro[$this::FILA_HEADER];
|
||||
continue;
|
||||
}
|
||||
|
||||
//completar producto
|
||||
$toInsert[] = [
|
||||
'fila' => $i,
|
||||
'categoria' => $categoria,
|
||||
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])),
|
||||
'precio' => $registro['Precio'],
|
||||
'proveedor_id' => $this->obtenerProveedor($registro['Producto']),
|
||||
'bono' => $registro[$this::FILA_HEADER] == "B",
|
||||
'requiere_notas'=> $registro[$this::FILA_HEADER] =="PTC",
|
||||
];
|
||||
}
|
||||
|
||||
foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
|
||||
{
|
||||
DB::table('productos')->insert($chunk);
|
||||
}
|
||||
}
|
||||
|
||||
private function obtenerIndiceDeHeader($csv){
|
||||
$registros = $csv->getRecords();
|
||||
$iheader = 0;
|
||||
foreach ($registros as $i => $registro){
|
||||
if (strtolower($registro[0]) == strtolower($this::FILA_HEADER)) {
|
||||
$iheader = $i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $iheader;
|
||||
}
|
||||
|
||||
private function obtenerProveedor($nombre) {
|
||||
$result = null;
|
||||
if (Str::contains($nombre,"*")){
|
||||
$result = Proveedor::firstOrCreate([
|
||||
'nombre' => 'Proveedor de economía solidaria',
|
||||
'economia_solidaria' => 1,
|
||||
'nacional' => 1
|
||||
])->id;
|
||||
}
|
||||
return $result;
|
||||
CanastaHelper::cargarCanasta(self::ARCHIVO_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue