diff --git a/app/Models/Barrio.php b/app/Models/Barrio.php index 9a58936..41d7e9c 100644 --- a/app/Models/Barrio.php +++ b/app/Models/Barrio.php @@ -42,6 +42,12 @@ public function crearPedido(string $nombre) : Pedido { return $this->pedidos()->create(['nombre' => $nombre]); } + /** + * Devuelve una query, para obtener el resultado agregarle ->get(). + * La query devuelve objetos con todos los atributos de un producto, seguidos + * de la cantidad de ese producto pedida entre todos los pedidos del barrio y + * el costo total de dicha cantidad. + */ public function productosPedidos() { return DB::table('productos') ->join('pedido_producto', 'productos.id', '=', 'pedido_producto.producto_id') @@ -63,6 +69,10 @@ public function totalATransferir() : float { return $this->totalNoBarriales() + $this->totalBonosDeTransporte(); } + public function totalBonosDeTransporte() : int { + return TransporteUtils::calcularTotal($this->totalNoBarriales()); + } + public function totalNoBarriales() { return $this->totalProductosIf(['barrial' => false]); } @@ -77,10 +87,6 @@ private function totalProductosIf($predicado) : float { ); } - public function totalBonosDeTransporte() : int { - return TransporteUtils::calcularTotal($this->totalNoBarriales()); - } - /** * Los productos que pertenecen al barrio. */ diff --git a/database/migrations/2024_07_03_225114_tablas_categorias_caracteristicas_productos.php b/database/migrations/2024_07_03_225114_tablas_categorias_caracteristicas_productos.php index 441f5d8..c20a8fc 100644 --- a/database/migrations/2024_07_03_225114_tablas_categorias_caracteristicas_productos.php +++ b/database/migrations/2024_07_03_225114_tablas_categorias_caracteristicas_productos.php @@ -38,7 +38,7 @@ public function up(): void $table->foreign('barrio_id')->references('id')->on('barrios'); }); - Schema::create('producto_caracteristica', function (Blueprint $table) { + Schema::create('caracteristica_producto', function (Blueprint $table) { $table->unsignedBigInteger('producto_id'); $table->unsignedBigInteger('caracteristica_id'); $table->primary(['producto_id','caracteristica_id']); @@ -52,7 +52,7 @@ public function up(): void */ public function down(): void { - Schema::dropIfExists('producto_caracteristica'); + Schema::dropIfExists('caracteristica_producto'); Schema::dropIfExists('productos'); Schema::dropIfExists('caracteristicas'); Schema::dropIfExists('categorias'); diff --git a/database/seeders/CanastaSeeder.php b/database/seeders/CanastaSeeder.php index 0bb11a9..969aa9c 100644 --- a/database/seeders/CanastaSeeder.php +++ b/database/seeders/CanastaSeeder.php @@ -20,9 +20,9 @@ class CanastaSeeder extends Seeder */ public function run(): void { - $tipoColumn = 'Tipo'; - $productoColumn = 'Producto'; - $precioColumn = 'Precio'; + $columnaTipo = 'Tipo'; + $columnaProducto = 'Producto'; + $columnaPrecio = 'Precio'; $tipos = ['P','PTC','B']; $csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r'); @@ -30,50 +30,50 @@ public function run(): void $csv->setHeaderOffset(0); $records = $csv->getRecords(); - $productosToInsert = []; - $caracteristicasToInsert = []; - $currentCategoria; + $productos = []; + $caracteristicasAInsertar = []; + $categoriaActual; foreach ($records as $i => $record) { - $tipo = trim($record[$tipoColumn]); + $tipo = trim($record[$columnaTipo]); if (!in_array($tipo, $tipos)) { if (!Str::contains($tipo,'¿') && ($tipo != 'T')) { - $currentCategoria = Categoria::firstOrCreate(['nombre' => $tipo]); + $categoriaActual = Categoria::firstOrCreate(['nombre' => $tipo]); } } else { - [$solidario, $nombre, $caracteristicas] = $this->parseAndFormatName($record[$productoColumn]); + [$solidario, $nombre, $caracteristicas] = $this->parsearNombre($record[$columnaProducto]); - $productosToInsert[] = [ + $productos[] = [ 'nombre' => $nombre, - 'precio' => $record[$precioColumn], + 'precio' => $record[$columnaPrecio], 'solidario' => $solidario, 'bono' => $tipo == 'B', - 'categoria_id' => $currentCategoria->id, + 'categoria_id' => $categoriaActual->id, 'created_at' => Date::now(), 'updated_at' => Date::now(), ]; - $caracteristicasToInsert[] = [ + $caracteristicasAInsertar[] = [ 'nombre' => $nombre, 'caracteristicas' => $caracteristicas ]; } } - foreach (array_chunk($productosToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk) + foreach (array_chunk($productos,DatabaseSeeder::CHUNK_SIZE) as $chunk) DB::table('productos')->insert($chunk); - $this->insertCaracteristicas($caracteristicasToInsert); + $this->insertarCaracteristicas($caracteristicasAInsertar); } /** - * Returns an array with data parsed from productoColumn. + * Devuelve un array con datos parseados de $columnaProducto * * @return array{solidario: bool, nombre: string, caracteristicas: array(Caracteristica)} */ - private function parseAndFormatName($productoColumn): array { - $solidario = Str::contains($productoColumn, '*'); - $nombre = Str::replace('*','',$productoColumn); + private function parsearNombre($columnaProducto): array { + $solidario = Str::contains($columnaProducto, '*'); + $nombre = Str::replace('*','',$columnaProducto); $caracteristicas = []; if (Str::contains($nombre, 'S-G')) @@ -92,16 +92,13 @@ private function parseAndFormatName($productoColumn): array { return [$solidario, trim($nombre), $caracteristicas]; } - private function insertCaracteristicas($caracteristicasToInsert) : void { - foreach ($caracteristicasToInsert as $codigo => $item) { + private function insertarCaracteristicas($caracteristicasAInsertar) : void { + foreach ($caracteristicasAInsertar 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, - ]); + $match->caracteristicas()->attach($caracteristica); } } }