setDelimiter('|'); $csv->setHeaderOffset(0); $records = $csv->getRecords(); $productosToInsert = []; $caracteristicasToInsert = []; $currentCategoria; foreach ($records as $i => $record) { $tipo = trim($record[$tipoColumn]); if (!in_array($tipo, $tipos)) { if (!Str::contains($tipo,'¿') && ($tipo != 'T')) { $currentCategoria = Categoria::firstOrCreate(['nombre' => $tipo]); } } else { [$solidario, $nombre, $caracteristicas] = $this->parseAndFormatName($record[$productoColumn]); $productosToInsert[] = [ 'nombre' => $nombre, 'precio' => $record[$precioColumn], 'solidario' => $solidario, 'bono' => $tipo == 'B', 'categoria_id' => $currentCategoria->id, 'created_at' => Date::now(), 'updated_at' => Date::now(), ]; $caracteristicasToInsert[] = [ 'nombre' => $nombre, 'caracteristicas' => $caracteristicas ]; } } foreach (array_chunk($productosToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk) DB::table('productos')->insert($chunk); $this->insertCaracteristicas($caracteristicasToInsert); } /** * Returns an array with data parsed from productoColumn. * * @return array{solidario: bool, nombre: string, caracteristicas: array(Caracteristica)} */ private function parseAndFormatName($productoColumn): array { $solidario = Str::contains($productoColumn, '*'); $nombre = Str::replace('*','',$productoColumn); $caracteristicas = []; if (Str::contains($nombre, 'S-G')) $caracteristicas[] = Caracteristica::where('codigo','S-G')->first()->id; if (Str::contains($nombre, 'S-A')) $caracteristicas[] = Caracteristica::where('codigo','S-A')->first()->id; if (Str::contains($nombre, 'S-S')) $caracteristicas[] = Caracteristica::where('codigo','S-S')->first()->id; if (Str::contains($nombre, 'S-P-A')) $caracteristicas[] = Caracteristica::where('codigo','S-P-A')->first()->id; if ($caracteristicas) { $nombre = Str::replaceMatches('/\(S\-.*\)/', '', $nombre); } return [$solidario, trim($nombre), $caracteristicas]; } private function insertCaracteristicas($caracteristicasToInsert) : void { foreach ($caracteristicasToInsert as $codigo => $item) { $nombre = $item['nombre']; $match = Producto::where('nombre',$nombre)->first(); if ($match) { foreach ($item['caracteristicas'] as $codigo => $caracteristica) { DB::table('producto_caracteristica')->insert([ 'producto_id' => $match->id, 'caracteristica_id' => $caracteristica, ]); } } } } }