Se parsean talles desde nombres de productos. Talles en varias filas se matchean por nombre y precio

This commit is contained in:
Alejandro Tasistro 2023-03-26 11:13:45 -03:00
parent e712d3265f
commit 72fd85ab25
1 changed files with 68 additions and 12 deletions

View File

@ -21,47 +21,84 @@ class ImportarProductoSeeder extends Seeder
$iHeader = $this->obtenerIndiceDeHeader($csv); $iHeader = $this->obtenerIndiceDeHeader($csv);
$csv->setHeaderOffset($iHeader); $csv->setHeaderOffset($iHeader);
$registros = $csv->getRecords(); $registros = $csv->getRecords();
$registrosArray = iterator_to_array($registros);
$toInsert = []; $toInsert = [];
$categoria = ''; $categoria = '';
$tallesVariasFilas = '';
foreach($registros as $i => $registro){ foreach($registros as $i => $registro){
$nombre = $this->generarNombre($registro);
$tipo = $registro[$this::FILA_HEADER];
$desc = null;
$precio = $registro['Precio'];
//filas que están arriba del header //filas que están arriba del header
if ($i <= $iHeader){ if ($i <= $iHeader){
continue; continue;
} }
//finalizar //finalizar
if ($registro[$this::FILA_HEADER] == $this::ULTIMA_FILA){ if ($tipo == $this::ULTIMA_FILA){
break; break;
} }
//filas que no tienen tipo //filas que no tienen tipo
if (!Arr::has($registro,$this::FILA_HEADER)|| trim($registro[$this::FILA_HEADER]) == ''){ if (!Arr::has($registro,$this::FILA_HEADER)|| trim($tipo) == ''){
var_dump("no hay tipo en la fila " . $i); var_dump("no hay tipo en la fila " . $i);
continue; continue;
} }
//saltear bono de transporte //saltear bono de transporte
if ($registro[$this::FILA_HEADER] == "T"){ if ($tipo == "T"){
continue; continue;
} }
//obtener categoria //obtener categoria
if ($registro['Producto'] == '') { if ($nombre == '') {
//es la pregunta de la copa? //es la pregunta de la copa?
if (Str::contains($registro[$this::FILA_HEADER],"¿")) { continue; } if (Str::contains($tipo,"¿")) { continue; }
$categoria = $registro[$this::FILA_HEADER]; $categoria = $tipo;
continue; continue;
} }
//obtener talles
if ($tipo == "PTC") {
$nombreLower = strtolower(str_replace('-','', $nombre));
// talles en una sola fila,
// asume que están como '$n a $m' con $n, $m numeros y $n < $m.
if (str_contains($nombreLower, 'talles')) {
[$nombre, $talles] = explode('talles', $nombreLower);
$nombre = trim($nombre);
$talles = trim($talles);
[$inf, $sup] = explode(' a ', $talles);
for ($i=$inf; $i < $sup; $i++) $desc = $desc.$i.'-';
$desc = $desc.$sup;
}
// talles en varias filas,
// asume que mismos productos con distinto talle están en filas consecutivas
if (str_contains($nombreLower, 'talle')) {
[$nombre, $talle] = explode('talle', $nombreLower);
$nombre = trim($nombre);
$talle = trim(str_replace('.', '', $talle));
$esUltimo = $this->esUltimoTalle($nombre, $precio, $i, $registrosArray);
if ($esUltimo) {
$desc = $tallesVariasFilas . $talle;
$tallesVariasFilas = '';
} else {
$tallesVariasFilas = $tallesVariasFilas . $talle . '-';
continue;
}
}
}
//completar producto //completar producto
$toInsert[] = [ $toInsert[] = [
'fila' => $i, 'fila' => $i,
'categoria' => $categoria, 'categoria' => $categoria,
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])), 'nombre' => $nombre,
'precio' => $registro['Precio'], 'precio' => $precio,
'proveedor_id' => $this->obtenerProveedor($registro['Producto']), 'proveedor_id' => $this->obtenerProveedor($registro['Producto']),
'bono' => ($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO') 'bono' => ($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO'),
'descripcion' => $desc
]; ];
} }
@ -83,6 +120,25 @@ class ImportarProductoSeeder extends Seeder
return $iheader; return $iheader;
} }
private function generarNombre($registro)
{
return trim(str_replace('*', ' ',$registro['Producto']));
}
private function esUltimoTalle($nombre, $precio, $indice, $registros) {
$i = $indice+1;
$registro = $registros[$i];
$tipo = $registro[$this::FILA_HEADER];
if ($tipo == 'PTC') {
$sigNombre = $this->generarNombre($registro);
$sigNombre = strtolower(str_replace('-','', $sigNombre));
$sigNombre = trim(explode('talle', $sigNombre)[0]);
$sigPrecio = $registro['Precio'];
return $nombre != $sigNombre || $sigPrecio != $precio;
}
return true;
}
private function obtenerProveedor($nombre) { private function obtenerProveedor($nombre) {
$result = null; $result = null;
if (Str::contains($nombre,"*")){ if (Str::contains($nombre,"*")){