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);
$csv->setHeaderOffset($iHeader);
$registros = $csv->getRecords();
$registrosArray = iterator_to_array($registros);
$toInsert = [];
$categoria = '';
$tallesVariasFilas = '';
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
if ($i <= $iHeader){
continue;
}
//finalizar
if ($registro[$this::FILA_HEADER] == $this::ULTIMA_FILA){
if ($tipo == $this::ULTIMA_FILA){
break;
}
//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);
continue;
}
//saltear bono de transporte
if ($registro[$this::FILA_HEADER] == "T"){
if ($tipo == "T"){
continue;
}
//obtener categoria
if ($registro['Producto'] == '') {
if ($nombre == '') {
//es la pregunta de la copa?
if (Str::contains($registro[$this::FILA_HEADER],"¿")) { continue; }
$categoria = $registro[$this::FILA_HEADER];
if (Str::contains($tipo,"¿")) { continue; }
$categoria = $tipo;
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
$toInsert[] = [
'fila' => $i,
'categoria' => $categoria,
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])),
'precio' => $registro['Precio'],
'nombre' => $nombre,
'precio' => $precio,
'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;
}
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) {
$result = null;
if (Str::contains($nombre,"*")){