From 72fd85ab256d8809cfe76081e7b3dc8555e7762d Mon Sep 17 00:00:00 2001 From: Ale Date: Sun, 26 Mar 2023 11:13:45 -0300 Subject: [PATCH] Se parsean talles desde nombres de productos. Talles en varias filas se matchean por nombre y precio --- database/seeds/ImportarProductoSeeder.php | 80 +++++++++++++++++++---- 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/database/seeds/ImportarProductoSeeder.php b/database/seeds/ImportarProductoSeeder.php index 43c9e84..54eaa63 100644 --- a/database/seeds/ImportarProductoSeeder.php +++ b/database/seeds/ImportarProductoSeeder.php @@ -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; + 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,"*")){