From 94760279e7fd076b53350e5298896649165de4f8 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 14:06:18 -0300 Subject: [PATCH 01/22] Arreglada planilla de barrio --- app/GrupoDeCompra.php | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 07b8634..5b74e84 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -91,7 +91,11 @@ class GrupoDeCompra extends Model return TransporteHelper::totalTransporte($this->totalCentralesQuePaganTransporte()); } - public function cantidadTransporte() + /** + * @return int + * Calcula la cantidad de bonos de transporte del barrio + */ + public function cantidadTransporte(): int { return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte()); } @@ -161,15 +165,6 @@ class GrupoDeCompra extends Model return $total; } - public function calcularCantidadBDT() - { - $total = 0; - foreach ($this->pedidosAprobados() as $pedido) { - $total += $pedido->totalParaTransporte(); - } - return ceil($total / 500); - } - public function totalBonosBarriales() { $total = 0; @@ -199,7 +194,10 @@ class GrupoDeCompra extends Model public function generarColumnaCantidades() { - $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id', $this->id)->get()->keyBy('producto_id'); + $productos_en_pedido = DB::table('pedidos_aprobados') + ->where('grupo_de_compra_id', $this->id) + ->get() + ->keyBy('producto_id'); //si no hay pedidos aprobados, salir if ($productos_en_pedido->count() == 0) { @@ -214,7 +212,7 @@ class GrupoDeCompra extends Model $records[$fila][1] = $producto_pedido->cantidad_pedida; } - $records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT(); + $records[$this->obtenerFilaDeBonoTransporte()][1] = $this->cantidadTransporte(); return $records; } From 7c7149c5a1e63c397892cb5e4c751c6e4b352692 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:45:46 -0300 Subject: [PATCH 02/22] Agregado CsvHelper --- app/Helpers/CsvHelper.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/Helpers/CsvHelper.php diff --git a/app/Helpers/CsvHelper.php b/app/Helpers/CsvHelper.php new file mode 100644 index 0000000..ba7d246 --- /dev/null +++ b/app/Helpers/CsvHelper.php @@ -0,0 +1,26 @@ +setDelimiter("|"); + $csv->setEnclosure("'"); + $csv->setHeaderOffset(0); + return $csv->getRecords(); + } catch (InvalidArgument|Exception $e) { + Log::error($e->getMessage()); + return null; + } + } + +} From eb05a7de6afd3420f1ac8439677f7ad69e31965c Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:47:28 -0300 Subject: [PATCH 03/22] Refactor: usando CsvHelper, cambio de nombre en constantes, eliminado metodo innecesario, extraido predicado 'noTieneTipo' y cosas de formato --- app/Helpers/CanastaHelper.php | 78 ++++++++++++++++------------------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php index ce37cf7..53815aa 100644 --- a/app/Helpers/CanastaHelper.php +++ b/app/Helpers/CanastaHelper.php @@ -9,12 +9,12 @@ use DatabaseSeeder; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; -use League\Csv\Reader; + class CanastaHelper { - const FILA_HEADER = "Tipo"; - const ULTIMA_FILA = "TOTAL"; + const TIPO = "Tipo"; + const TOTAL = "TOTAL"; const ARCHIVO_SUBIDO = 'Archivo subido'; const CANASTA_CARGADA = 'Canasta cargada'; @@ -31,53 +31,43 @@ class CanastaHelper public static function cargarCanasta($archivo) { self::limpiarTablas(); - $csv = Reader::createFromPath(resource_path($archivo), 'r'); - $csv->setDelimiter("|"); - $iHeader = self::obtenerIndiceDeHeader($csv); - $csv->setHeaderOffset($iHeader); - $registros = $csv->getRecords(); - + $registros = CsvHelper::getRecords($archivo); $toInsert = []; $categoria = ''; - foreach($registros as $i => $registro){ - //filas que están arriba del header - if ($i <= $iHeader){ - continue; - } - //finalizar - if ($registro[self::FILA_HEADER] == self::ULTIMA_FILA) { + foreach($registros as $i => $registro) { + // finalizar + if ($registro[self::TIPO] == self::TOTAL) break; - } - //filas que no tienen tipo - if (!Arr::has($registro,self::FILA_HEADER)|| trim($registro[self::FILA_HEADER]) == ''){ + // saltear filas que no tienen tipo + if (self::noTieneTipo($registro)) { var_dump("no hay tipo en la fila " . $i); continue; } - //saltear bono de transporte - if ($registro[self::FILA_HEADER] == "T"){ + // saltear bono de transporte + if ($registro[self::TIPO] == "T"){ continue; } - //obtener categoria + // obtener categoria si no hay producto if ($registro['Producto'] == '') { - //es la pregunta de la copa? - if (Str::contains($registro[self::FILA_HEADER],"¿")) { continue; } - $categoria = $registro[self::FILA_HEADER]; + // no es la pregunta de la copa? + if (!Str::contains($registro[self::TIPO],"¿")) + $categoria = $registro[self::TIPO]; continue; } - //completar producto + // completar producto $toInsert[] = [ 'fila' => $i, 'categoria' => $categoria, - 'nombre' => trim(str_replace('*', ' ',$registro['Producto'])), + 'nombre' => trim(str_replace('*', '',$registro['Producto'])), 'precio' => $registro['Precio'], 'proveedor_id' => self::obtenerProveedor($registro['Producto']), - 'bono' => $registro[self::FILA_HEADER] == "B", - 'requiere_notas'=> $registro[self::FILA_HEADER] =="PTC", + 'bono' => $registro[self::TIPO] == "B", + 'requiere_notas'=> $registro[self::TIPO] =="PTC", ]; } @@ -90,18 +80,6 @@ class CanastaHelper self::log($archivo, self::CANASTA_CARGADA); } - private static function obtenerIndiceDeHeader($csv){ - $registros = $csv->getRecords(); - $iheader = 0; - foreach ($registros as $i => $registro){ - if (strtolower($registro[0]) == strtolower(self::FILA_HEADER)) { - $iheader = $i; - break; - } - } - return $iheader; - } - private static function obtenerProveedor($nombre) { $result = null; if (Str::contains($nombre,"*")){ @@ -137,7 +115,14 @@ class CanastaHelper private static function agregarBonoBarrial() { - $categoria = Producto::all()->pluck('categoria')->unique()->flatten()->first(function ($c) { return Str::contains($c, 'BONO'); }); + $categoria = Producto::all() + ->pluck('categoria') + ->unique() + ->flatten() + ->first(function ($c) { + return Str::contains($c, 'BONO'); + }); + DB::table('productos')->insert([ 'fila' => 420, 'nombre' => "Bono barrial", @@ -148,4 +133,13 @@ class CanastaHelper 'requiere_notas'=> false, ]); } + + /** + * @param $registro + * @return bool + */ + public static function noTieneTipo($registro): bool + { + return !Arr::has($registro, self::TIPO) || trim($registro[self::TIPO]) == ''; + } } From e3f2e634357e2735f0fa06f461816b922bd7262d Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:47:59 -0300 Subject: [PATCH 04/22] Usando CsvHelper --- database/seeds/GrupoDeCompraSeeder.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/database/seeds/GrupoDeCompraSeeder.php b/database/seeds/GrupoDeCompraSeeder.php index a1203e9..9e163ef 100644 --- a/database/seeds/GrupoDeCompraSeeder.php +++ b/database/seeds/GrupoDeCompraSeeder.php @@ -1,9 +1,9 @@ setDelimiter("|"); - $csv->setEnclosure("'"); - $csv->setHeaderOffset(0); - $registros = $csv->getRecords(); + $registros = CsvHelperAlias::getRecords('csv/barrios.csv'); $gdcToInsert = []; $usersToInsert = []; From f909a78e744da04c020238379c954bdb374c6e64 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:48:26 -0300 Subject: [PATCH 05/22] Eliminada dependencia --- app/Producto.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Producto.php b/app/Producto.php index 1d002a6..c9a63e7 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -8,7 +8,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use League\Csv\CannotInsertRecord; -use League\Csv\Reader; use League\Csv\Writer; class Producto extends Model From ead7483e194bebc518e3d3bc49e61212ec26e289 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:48:54 -0300 Subject: [PATCH 06/22] Formato --- app/Subpedido.php | 100 ++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/app/Subpedido.php b/app/Subpedido.php index f99dfdd..c24a774 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -12,34 +12,34 @@ class Subpedido extends Model { const COSTO_TRANSPORTE = 15; public $timestamps = false; - protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas']; + protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas']; - public function productos() - { - return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total", "notas"]); - } + public function productos() + { + return $this->belongsToMany('App\Producto')->withPivot(["cantidad", "total", "notas"]); + } - //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte - private function bonos() - { - return $this->productos()->where('bono',1); - } + //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte + private function bonos() + { + return $this->productos()->where('bono', 1); + } - public function productosSinBonos() - { - return $this->productos()->where('bono',false); - } + public function productosSinBonos() + { + return $this->productos()->where('bono', false); + } - public function grupoDeCompra() - { - return $this->belongsTo('App\GrupoDeCompra'); - } + public function grupoDeCompra() + { + return $this->belongsTo('App\GrupoDeCompra'); + } - //Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) - public function scopeFiltrar($query, FiltroDeSubpedido $filtros) - { - return $filtros->aplicar($query); - } + // Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) + public function scopeFiltrar($query, FiltroDeSubpedido $filtros) + { + return $filtros->aplicar($query); + } public function total() { @@ -102,36 +102,40 @@ class Subpedido extends Model return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte()); } - //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto. - public function syncProducto(Producto $producto, Int $cantidad, string $notas) { - if ($cantidad){ - //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad - $this->productos()->syncWithoutDetaching([ - $producto->id => [ - 'cantidad' => $cantidad, - 'total' => $cantidad * $producto->precio, - 'notas' => $notas, - ] - ]); + //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto. + public function syncProducto(Producto $producto, int $cantidad, string $notas) + { + if ($cantidad) { + //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad + $this->productos()->syncWithoutDetaching([ + $producto->id => [ + 'cantidad' => $cantidad, + 'total' => $cantidad * $producto->precio, + 'notas' => $notas, + ] + ]); } else { //si la cantidad es 0, se elimina el producto del subpedido $this->productos()->detach($producto->id); } - } + } - public function toggleAprobacion(bool $aprobacion) { - $this->aprobado = $aprobacion; - $this->save(); - } + public function toggleAprobacion(bool $aprobacion) + { + $this->aprobado = $aprobacion; + $this->save(); + } - public function generarHTML() { - $view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]); - return $view->render(); - } + public function generarHTML() + { + $view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]); + return $view->render(); + } - public function syncDevoluciones(float $total, string $notas) { - $this->devoluciones_total = $total; - $this->devoluciones_notas = $notas; - $this->save(); - } + public function syncDevoluciones(float $total, string $notas) + { + $this->devoluciones_total = $total; + $this->devoluciones_notas = $notas; + $this->save(); + } } From b1b424897ce445a86f6349e0880f6d917226f124 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 15:49:25 -0300 Subject: [PATCH 07/22] Usando CsvHelper en vez de Reader + metodo para fila de transporte movideo a TransporteHelper --- app/GrupoDeCompra.php | 48 ++++---------------------------- app/Helpers/TransporteHelper.php | 20 +++++++++++++ 2 files changed, 25 insertions(+), 43 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 5b74e84..c8308aa 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -4,9 +4,9 @@ namespace App; use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Facades\DB; use League\Csv\CannotInsertRecord; -use League\Csv\Reader; use League\Csv\Writer; use Mpdf\Mpdf; @@ -17,9 +17,9 @@ class GrupoDeCompra extends Model protected $table = 'grupos_de_compra'; protected $hidden = ['password']; - public function subpedidos() + public function subpedidos(): HasMany { - return $this->hasMany('App\Subpedido'); + return $this->hasMany(Subpedido::class); } public function toggleDevoluciones() @@ -139,48 +139,10 @@ class GrupoDeCompra extends Model $template[$fila] = GrupoDeCompra::filaVacia($productosIDNombre[$id], $columns); $num_fila = $fila + 1; } - $template[GrupoDeCompra::obtenerFilaDeBonoTransporte()] = GrupoDeCompra::filaVacia("Bonos de transporte", $columns); + $template[TransporteHelper::filaTransporte()] = GrupoDeCompra::filaVacia("Bonos de transporte", $columns); return $template; } - private static function obtenerFilaDeBonoTransporte() - { - $csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r'); - $csv->setDelimiter("|"); - $csv->setEnclosure("'"); - $registros = $csv->getRecords(); - - foreach ($registros as $key => $registro) - if ($registro[0] == 'T') return $key; - - throw new Exception('No hay bono de transporte'); - } - - private function totalPedidosSinBonos() - { - $total = 0; - foreach ($this->pedidosAprobados() as $pedido) { - $total += ceil($pedido->totalSinBonos()); - } - return $total; - } - - public function totalBonosBarriales() - { - $total = 0; - $bonoBarrial = Producto::where('nombre', 'LIKE', '%barrial%')->first(); - if ($bonoBarrial) { - $pedidos = $this->pedidosAprobados(); - foreach ($pedidos as $pedido) { - $bonoPedido = $pedido->productos()->find($bonoBarrial["id"]); - if ($bonoPedido) { - $total += $bonoPedido["pivot"]["total"]; - } - } - } - return $total; - } - public function exportarPedidoEnCSV() { $records = $this->generarColumnaCantidades(); @@ -212,7 +174,7 @@ class GrupoDeCompra extends Model $records[$fila][1] = $producto_pedido->cantidad_pedida; } - $records[$this->obtenerFilaDeBonoTransporte()][1] = $this->cantidadTransporte(); + $records[TransporteHelper::filaTransporte()][1] = $this->cantidadTransporte(); return $records; } diff --git a/app/Helpers/TransporteHelper.php b/app/Helpers/TransporteHelper.php index 8bfc3de..52c6c6b 100644 --- a/app/Helpers/TransporteHelper.php +++ b/app/Helpers/TransporteHelper.php @@ -2,6 +2,10 @@ namespace App\Helpers; +use App\CanastaLog; +use Exception; +use Illuminate\Support\Facades\Log; + class TransporteHelper { const COSTO_TRANSPORTE = 15; @@ -16,4 +20,20 @@ class TransporteHelper { return self::cantidadTransporte($monto) * self::COSTO_TRANSPORTE; } + + public static function filaTransporte() + { + $ultimaCanasta = CanastaLog::where('descripcion', CanastaHelper::CANASTA_CARGADA) + ->orderBy('created_at', 'desc') + ->pluck('path') + ->first(); + + $registros = CsvHelper::getRecords($ultimaCanasta); + + foreach ($registros as $key => $registro) + if ($registro[CanastaHelper::TIPO] == 'T') return $key; + + Log::error('No hay fila de tipo T en la planilla: ' . $ultimaCanasta); + return null; + } } From 9fcdc5a52a82373a0f0e37325461903840002503 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 16:57:46 -0300 Subject: [PATCH 08/22] Agregada cantidad de bonos de transporte a planilla de totales --- app/GrupoDeCompra.php | 22 ++++++++++++++++++++++ app/Producto.php | 26 ++++++++++++++++++-------- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index c8308aa..dca5ba3 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -229,6 +229,28 @@ class GrupoDeCompra extends Model return array($records, $i, $cantidad); } + /** + * @return \Illuminate\Database\Eloquent\Builder + */ + public static function barriosMenosPrueba(): \Illuminate\Database\Eloquent\Builder + { + return self::where('nombre', '<>', 'PRUEBA') + ->orderBy('region') + ->orderBy('nombre'); + } + + public static function transportePorBarrio() + { + $result = []; + $barrios = GrupoDeCompra::barriosMenosPrueba()->get(); + + foreach ($barrios as $barrio) { + $result[] = $barrio->cantidadTransporte(); + } + + return $result; + } + static public function totalesParaTransportePorBarrio() { return DB::table('grupos_de_compra') ->leftJoin('subpedidos', 'grupos_de_compra.id', '=', 'subpedidos.grupo_de_compra_id') diff --git a/app/Producto.php b/app/Producto.php index c9a63e7..f467037 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -3,9 +3,11 @@ namespace App; use App\Filtros\FiltroDeProducto; +use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; use League\Csv\CannotInsertRecord; use League\Csv\Writer; @@ -59,8 +61,7 @@ class Producto extends Model static public function cantidadesPorBarrio() { - $barrios = DB::table('grupos_de_compra') - ->where('nombre', '<>', 'PRUEBA') + $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('id', 'nombre'); $columnasBarrios = $barrios->map(function ($id, $nombre) { @@ -81,22 +82,28 @@ class Producto extends Model ->get(); } - static public function planillaTotales() { + static public function planillaTotales() + { $headers = ['Producto']; - $barrios = DB::table('grupos_de_compra') - ->where('nombre', '<>', 'PRUEBA') + $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('nombre')->toArray(); $headers = array_merge($headers, $barrios); $cantidadesPorBarrio = self::cantidadesPorBarrio(); + $transportePorBarrio = GrupoDeCompra::transportePorBarrio(); $planilla = []; $ultimaFila = 1; + $filaTransporte = TransporteHelper::filaTransporte(); foreach ($cantidadesPorBarrio as $productoCantidades) { $fila = $productoCantidades->fila; while ($fila - $ultimaFila > 1) { $ultimaFila++; - $planilla[$ultimaFila] = ['---']; + if ($ultimaFila == $filaTransporte) { + $planilla[$ultimaFila] = ['Bono de transporte']; + } else { + $planilla[$ultimaFila] = ['---']; + } } $planilla[$fila] = [$productoCantidades->producto]; foreach ($barrios as $barrio) { @@ -105,6 +112,10 @@ class Producto extends Model $ultimaFila = $fila; } + foreach ($transportePorBarrio as $key => $cantidad) { + $planilla[$filaTransporte][] = $cantidad; + } + try { $writer = Writer::createFromPath(resource_path('csv/exports/pedidos-por-barrio.csv'), 'w'); $writer->insertOne($headers); @@ -132,8 +143,7 @@ class Producto extends Model static public function planillaNotas() { $headers = ['Producto']; - $barrios = DB::table('grupos_de_compra') - ->where('nombre', '<>', 'PRUEBA') + $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('nombre')->toArray(); $headers = array_merge($headers, $barrios); From d02505a70b65a132b60efe0654950483b8cbb60d Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 16:59:30 -0300 Subject: [PATCH 09/22] Quitado todo lo referente a planilla de cantidades de transporte --- app/GrupoDeCompra.php | 49 ------------------- app/Http/Controllers/ComprasController.php | 6 --- .../components/compras/DropdownDescargar.vue | 3 -- routes/web.php | 1 - 4 files changed, 59 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index dca5ba3..97ae5b6 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -250,53 +250,4 @@ class GrupoDeCompra extends Model return $result; } - - static public function totalesParaTransportePorBarrio() { - return DB::table('grupos_de_compra') - ->leftJoin('subpedidos', 'grupos_de_compra.id', '=', 'subpedidos.grupo_de_compra_id') - ->leftJoin('producto_subpedido', 'subpedidos.id', '=', 'producto_subpedido.subpedido_id') - ->leftJoin('productos', 'producto_subpedido.producto_id', '=', 'productos.id') - ->where(function ($query) { - $query->whereNull('productos.categoria') - ->orWhere('productos.categoria', 'not like', '%SUBSIDIADO%'); - }) - ->where(function ($query) { - $query->whereNull('productos.bono') - ->orWhere('productos.bono', 0); - }) - ->where(function ($query) { - $query->whereNull('subpedidos.aprobado') - ->orWhere('subpedidos.aprobado', 1); - }) - ->select( - 'grupos_de_compra.id as id', - 'grupos_de_compra.nombre as barrio', - DB::raw('COALESCE(SUM(producto_subpedido.cantidad * productos.precio), 0) as total') - ) - ->groupBy('grupos_de_compra.id') - ->get(); - } - - - static public function planillaTransporte() { - $totalesPorBarrio = self::totalesParaTransportePorBarrio(); - $barrios = []; - $bonosDeTransporte = []; - - foreach ($totalesPorBarrio as $totalBarrio) { - $barrios[] = $totalBarrio->barrio; - $bonosDeTransporte[] = ceil($totalBarrio->total / 500); - } - - $planilla = []; - $planilla[] = array_merge(['Barrio'], $barrios); - $planilla[] = array_merge(['Cant. bonos de transporte'], $bonosDeTransporte); - - try { - $writer = Writer::createFromPath(resource_path('csv/exports/transporte-por-barrio.csv'), 'w'); - $writer->insertAll($planilla); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } - } } diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php index 92be64e..9827160 100644 --- a/app/Http/Controllers/ComprasController.php +++ b/app/Http/Controllers/ComprasController.php @@ -27,12 +27,6 @@ class ComprasController return response()->download($file); } - public function descargarTransporte() { - GrupoDeCompra::planillaTransporte(); - $file = resource_path('csv/exports/transporte-por-barrio.csv'); - return response()->download($file); - } - public function show() { return view('auth/compras_login'); diff --git a/resources/js/components/compras/DropdownDescargar.vue b/resources/js/components/compras/DropdownDescargar.vue index 5929613..ee00c39 100644 --- a/resources/js/components/compras/DropdownDescargar.vue +++ b/resources/js/components/compras/DropdownDescargar.vue @@ -20,9 +20,6 @@ Notas por barrio - - Transporte por barrio - diff --git a/routes/web.php b/routes/web.php index b6d0392..75411db 100644 --- a/routes/web.php +++ b/routes/web.php @@ -82,7 +82,6 @@ Route::middleware(['compras'])->group( function() { Route::get('/compras/pedidos', 'ComprasController@indexPedidos')->name('compras.pedidos'); Route::get('/compras/pedidos/descargar', 'ComprasController@descargarPedidos')->name('compras.pedidos.descargar'); Route::get('/compras/pedidos/notas', 'ComprasController@descargarNotas')->name('compras.pedidos.descargar'); - Route::get('/compras/pedidos/transporte', 'ComprasController@descargarTransporte')->name('compras.pedidos.descargar'); Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta'); Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo'); }); From 9c3b328de0e8368093cf9db77769fae213ef72e5 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 17:08:04 -0300 Subject: [PATCH 10/22] Usando CsvHelper en vez de League\Csv\Writer --- app/GrupoDeCompra.php | 19 ++++--------------- app/Helpers/CsvHelper.php | 14 ++++++++++++++ app/Producto.php | 23 +++++------------------ 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 97ae5b6..76ea9fa 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -2,12 +2,11 @@ namespace App; +use App\Helpers\CsvHelper; use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Facades\DB; -use League\Csv\CannotInsertRecord; -use League\Csv\Writer; use Mpdf\Mpdf; class GrupoDeCompra extends Model @@ -146,12 +145,8 @@ class GrupoDeCompra extends Model public function exportarPedidoEnCSV() { $records = $this->generarColumnaCantidades(); - try { - $writer = Writer::createFromPath(resource_path('csv/exports/' . $this->nombre . '.csv'), 'w'); - $writer->insertAll($records); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } + + CsvHelper::generarCsv('csv/exports/' . $this->nombre . '.csv', $records); } public function generarColumnaCantidades() @@ -211,13 +206,7 @@ class GrupoDeCompra extends Model } array_splice($records, 0, 0, array($nucleos)); - // Guardar en un archivo .csv - try { - $writer = Writer::createFromPath(resource_path('csv/exports/' . $this->nombre . '-completo.csv'), 'w'); - $writer->insertAll($records); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } + CsvHelper::generarCsv('csv/exports/' . $this->nombre . '-completo.csv', $records); } public function agregarCantidad($pedido, $id, array $records, $fila, int $i): array diff --git a/app/Helpers/CsvHelper.php b/app/Helpers/CsvHelper.php index ba7d246..96bce8f 100644 --- a/app/Helpers/CsvHelper.php +++ b/app/Helpers/CsvHelper.php @@ -4,9 +4,11 @@ namespace App\Helpers; use Illuminate\Support\Facades\Log; use Iterator; +use League\Csv\CannotInsertRecord; use League\Csv\Exception; use League\Csv\InvalidArgument; use League\Csv\Reader; +use League\Csv\Writer; class CsvHelper { @@ -23,4 +25,16 @@ class CsvHelper } } + public static function generarCsv($filePath, $contenido, $headers = null): void + { + try { + $writer = Writer::createFromPath(resource_path($filePath), 'w'); + if ($headers) { + $writer->insertOne($headers); + } + $writer->insertAll($contenido); + } catch (CannotInsertRecord $e) { + var_export($e->getRecords()); + } + } } diff --git a/app/Producto.php b/app/Producto.php index f467037..96065c2 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -3,14 +3,13 @@ namespace App; use App\Filtros\FiltroDeProducto; +use App\Helpers\CsvHelper; use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; -use League\Csv\CannotInsertRecord; -use League\Csv\Writer; class Producto extends Model { @@ -116,16 +115,10 @@ class Producto extends Model $planilla[$filaTransporte][] = $cantidad; } - try { - $writer = Writer::createFromPath(resource_path('csv/exports/pedidos-por-barrio.csv'), 'w'); - $writer->insertOne($headers); - $writer->insertAll($planilla); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } + CsvHelper::generarCsv('csv/exports/pedidos-por-barrio.csv', $planilla, $headers); } - public static function notasPorBarrio(): \Illuminate\Support\Collection + public static function notasPorBarrio(): Collection { return DB::table('productos') ->join('producto_subpedido', 'productos.id', '=', 'producto_subpedido.producto_id') @@ -159,12 +152,6 @@ class Producto extends Model $planilla[] = $fila; } - try { - $writer = Writer::createFromPath(resource_path('csv/exports/notas-por-barrio.csv'), 'w'); - $writer->insertOne($headers); - $writer->insertAll($planilla); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } + CsvHelper::generarCsv('csv/exports/notas-por-barrio.csv', $planilla, $headers); } } From ff0a17c776d07c6679432ebcc7d5bd8297bbd75a Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 17:13:53 -0300 Subject: [PATCH 11/22] =?UTF-8?q?M=C3=A9todo=20renombrado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/GrupoDeCompra.php | 2 +- app/Http/Controllers/AdminController.php | 4 ++-- routes/web.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 76ea9fa..995a38f 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -99,7 +99,7 @@ class GrupoDeCompra extends Model return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte()); } - public function exportarPlanillasAPdf() + public function exportarPedidosAPdf() { $subpedidos = $this->pedidosAprobados(); //generar pdf diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 2b87532..764f7a7 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -17,8 +17,8 @@ class AdminController extends Controller return view('auth/admin_subpedidos'); } - public function exportarPlanillasAPdf(GrupoDeCompra $gdc) { - return $gdc->exportarPlanillasAPdf(); + public function exportarPedidosAPdf(GrupoDeCompra $gdc) { + return $gdc->exportarPedidosAPdf(); } public function exportarPedidoACSV(GrupoDeCompra $gdc) { diff --git a/routes/web.php b/routes/web.php index 75411db..718b2a5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -35,7 +35,7 @@ Route::get('/admin/obtener_sesion', function() { Route::middleware(['auth', 'admin'])->group( function () { Route::get('/admin/pedidos', 'AdminController@index')->name('admin_login.index'); - Route::get('/admin/exportar-planillas-a-pdf/{gdc}', 'AdminController@exportarPlanillasAPdf'); + Route::get('/admin/exportar-planillas-a-pdf/{gdc}', 'AdminController@exportarPedidosAPdf'); Route::get('/admin/exportar-pedido-a-csv/{gdc}', 'AdminController@exportarPedidoACSV'); From b1caed8b158e37a24c728d808787f76e473d1df4 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 17:14:21 -0300 Subject: [PATCH 12/22] =?UTF-8?q?Cambio=20de=20nombre=20de=20archivo=20y?= =?UTF-8?q?=20de=20par=C3=A1metro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Subpedido.php | 2 +- .../{subpedido_tabla.blade.php => pedido_tabla.blade.php} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename resources/views/pdfgen/{subpedido_tabla.blade.php => pedido_tabla.blade.php} (89%) diff --git a/app/Subpedido.php b/app/Subpedido.php index c24a774..0915b3f 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -128,7 +128,7 @@ class Subpedido extends Model public function generarHTML() { - $view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]); + $view = view("pdfgen.pedido_tabla", ["pedido" => $this]); return $view->render(); } diff --git a/resources/views/pdfgen/subpedido_tabla.blade.php b/resources/views/pdfgen/pedido_tabla.blade.php similarity index 89% rename from resources/views/pdfgen/subpedido_tabla.blade.php rename to resources/views/pdfgen/pedido_tabla.blade.php index 981d0ba..7ed9cbb 100644 --- a/resources/views/pdfgen/subpedido_tabla.blade.php +++ b/resources/views/pdfgen/pedido_tabla.blade.php @@ -4,7 +4,7 @@ background: #CCC } -

{{$subpedido->nombre}}

+

{{$pedido->nombre}}

@@ -25,9 +25,9 @@ - @foreach($subpedido->productos as $producto) + @foreach($pedido->productos as $producto) @if(!$producto->bono) - +
{{ $producto->nombre }} From b04e7e8f45a40f147f88977957d7dcec419640f1 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 18:07:54 -0300 Subject: [PATCH 13/22] Sintaxis de array --- resources/views/pdfgen/pedido_tabla.blade.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/views/pdfgen/pedido_tabla.blade.php b/resources/views/pdfgen/pedido_tabla.blade.php index 7ed9cbb..17fdbe9 100644 --- a/resources/views/pdfgen/pedido_tabla.blade.php +++ b/resources/views/pdfgen/pedido_tabla.blade.php @@ -4,7 +4,7 @@ background: #CCC } -

{{$pedido->nombre}}

+

{{$pedido['nombre']}}

@@ -25,18 +25,18 @@ - @foreach($pedido->productos as $producto) - @if(!$producto->bono) + @foreach($pedido['productos'] as $producto) + @if(!$producto['bono']) @endif From 8887a1970cc6ce0db5a8e8bee70c41713d254093 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 18:08:14 -0300 Subject: [PATCH 14/22] =?UTF-8?q?Agregado=20m=C3=A9todo=20y=20ruta=20para?= =?UTF-8?q?=20bajar=20pedidos=20barriales=20en=20pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/GrupoDeCompra.php | 80 +++++++++++++++++++--- app/Http/Controllers/ComprasController.php | 4 ++ routes/web.php | 1 + 3 files changed, 74 insertions(+), 11 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 995a38f..482e2a3 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -4,9 +4,11 @@ namespace App; use App\Helpers\CsvHelper; use App\Helpers\TransporteHelper; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Mpdf\Mpdf; class GrupoDeCompra extends Model @@ -115,6 +117,52 @@ class GrupoDeCompra extends Model $mpdf->Output($filename, "D"); } + function pedidoParaPdf() + { + $productos = $this->productosPedidos(true); + $pedido = []; + $pedido['productos'] = []; + + $pedido['nombre'] = $this->nombre; + foreach ($productos as $producto) { + $productoParaPdf = []; + $productoParaPdf['pivot'] = []; + $productoParaPdf['nombre'] = $producto->producto_nombre; + $productoParaPdf['pivot']['cantidad'] = $producto->cantidad_pedida; + $productoParaPdf['pivot']['notas'] = false; + $productoParaPdf['bono'] = false; // para que no lo saltee + + $pedido['productos'][] = $productoParaPdf; + } + + Log::debug($pedido); + + return $pedido; + } + + public function generarHTML() + { + $view = view("pdfgen.pedido_tabla", ["pedido" => $this->pedidoParaPdf()]); + return $view->render(); + } + + public static function exportarPedidosBarrialesAPdf() + { + $barrios = GrupoDeCompra::barriosMenosPrueba() + ->get(); + $mpdf = new Mpdf(); + + foreach ($barrios as $barrio) { + $tabla = $barrio->generarHTML(); + $mpdf->WriteHTML($tabla); + $mpdf->AddPage(); + } + + $filename = 'pedidos_por_barrio.pdf'; + // imprimir el pdf + $mpdf->Output($filename, "D"); + } + static function filaVacia(string $product, int $columns): array { $fila = [$product]; @@ -151,14 +199,11 @@ class GrupoDeCompra extends Model public function generarColumnaCantidades() { - $productos_en_pedido = DB::table('pedidos_aprobados') - ->where('grupo_de_compra_id', $this->id) - ->get() - ->keyBy('producto_id'); + $productos_en_pedido = $this->productosPedidos(); //si no hay pedidos aprobados, salir if ($productos_en_pedido->count() == 0) { - \Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); + Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); return []; } @@ -176,11 +221,11 @@ class GrupoDeCompra extends Model public function exportarPedidoConNucleosEnCSV() { - $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id', $this->id)->get()->keyBy('producto_id'); + $productos_en_pedido = $this->productosPedidos(); // si no hay pedidos aprobados, salir if ($productos_en_pedido->count() == 0) { - \Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); + Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); return; } @@ -218,10 +263,7 @@ class GrupoDeCompra extends Model return array($records, $i, $cantidad); } - /** - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function barriosMenosPrueba(): \Illuminate\Database\Eloquent\Builder + public static function barriosMenosPrueba(): Builder { return self::where('nombre', '<>', 'PRUEBA') ->orderBy('region') @@ -239,4 +281,20 @@ class GrupoDeCompra extends Model return $result; } + + /** + * @return \Illuminate\Support\Collection + */ + public function productosPedidos($excluirBarriales = false): \Illuminate\Support\Collection + { + $query = DB::table('pedidos_aprobados') + ->where('grupo_de_compra_id', $this->id); + + if ($excluirBarriales) + $query = $query->where('producto_nombre','NOT LIKE','%barrial%'); + + return $query + ->get() + ->keyBy('producto_id'); + } } diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php index 9827160..e23ad43 100644 --- a/app/Http/Controllers/ComprasController.php +++ b/app/Http/Controllers/ComprasController.php @@ -27,6 +27,10 @@ class ComprasController return response()->download($file); } + public function pdf() { + GrupoDeCompra::exportarPedidosBarrialesAPdf(); + } + public function show() { return view('auth/compras_login'); diff --git a/routes/web.php b/routes/web.php index 718b2a5..78ec7c2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -82,6 +82,7 @@ Route::middleware(['compras'])->group( function() { Route::get('/compras/pedidos', 'ComprasController@indexPedidos')->name('compras.pedidos'); Route::get('/compras/pedidos/descargar', 'ComprasController@descargarPedidos')->name('compras.pedidos.descargar'); Route::get('/compras/pedidos/notas', 'ComprasController@descargarNotas')->name('compras.pedidos.descargar'); + Route::get('/compras/pedidos/pdf', 'ComprasController@pdf')->name('compras.pedidos.pdf'); Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta'); Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo'); }); From 916f963e7b8aedcdc4cfd9f895e50a1c9defda07 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 May 2025 18:10:05 -0300 Subject: [PATCH 15/22] =?UTF-8?q?Agregado=20bot=C3=B3n=20para=20descargar?= =?UTF-8?q?=20pedidos=20barriales=20en=20pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/js/components/compras/DropdownDescargar.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/js/components/compras/DropdownDescargar.vue b/resources/js/components/compras/DropdownDescargar.vue index ee00c39..92f91f8 100644 --- a/resources/js/components/compras/DropdownDescargar.vue +++ b/resources/js/components/compras/DropdownDescargar.vue @@ -20,6 +20,9 @@ Notas por barrio + + Pedidos por barrio en pdf + From d526b944bdc7ba48df1921d63a78d27d1fd2b031 Mon Sep 17 00:00:00 2001 From: ale Date: Sun, 11 May 2025 16:06:51 -0300 Subject: [PATCH 16/22] Agregados tipos e imports faltantes, quitados imports innecesarios, quitados valores default, quitados metodos y campos no usados, quitados phpdocs redundantes, returns simplificados --- .../CrearPedidosAprobadosViewCommand.php | 2 +- app/Filtros/Filtro.php | 19 ++++++++------ app/Filtros/FiltroDeProducto.php | 3 +-- app/Filtros/FiltroDeSubpedido.php | 2 +- app/GrupoDeCompra.php | 21 +++++++-------- app/Helpers/CsvHelper.php | 4 +-- app/Helpers/TransporteHelper.php | 1 - app/Http/Controllers/AdminController.php | 11 ++++---- .../Controllers/Api/ProductoController.php | 13 ---------- .../Controllers/Api/SubpedidoController.php | 22 ++-------------- app/Http/Controllers/ComprasController.php | 15 +++++++---- app/Http/Controllers/ProductoController.php | 7 ----- app/Http/Middleware/Admin.php | 12 +++------ app/Http/Middleware/Subpedido.php | 7 ++--- app/Http/Resources/GrupoDeCompraResource.php | 9 ++++--- app/Http/Resources/ProductoResource.php | 5 ++-- app/Http/Resources/SubpedidoResource.php | 9 ++++--- app/Producto.php | 26 +++++++++---------- app/Proveedor.php | 5 ++-- app/Subpedido.php | 22 +++++----------- app/User.php | 4 +-- database/factories/UserFactory.php | 3 ++- routes/api.php | 3 --- routes/web.php | 19 +++++++------- 24 files changed, 99 insertions(+), 145 deletions(-) diff --git a/app/Console/Commands/CrearPedidosAprobadosViewCommand.php b/app/Console/Commands/CrearPedidosAprobadosViewCommand.php index d4b08ac..378756b 100644 --- a/app/Console/Commands/CrearPedidosAprobadosViewCommand.php +++ b/app/Console/Commands/CrearPedidosAprobadosViewCommand.php @@ -36,7 +36,7 @@ class CrearPedidosAprobadosViewCommand extends Command * * @return int */ - public function handle() + public function handle(): int { DB::statement(" CREATE OR REPLACE VIEW pedidos_aprobados diff --git a/app/Filtros/Filtro.php b/app/Filtros/Filtro.php index ea55739..737f27b 100644 --- a/app/Filtros/Filtro.php +++ b/app/Filtros/Filtro.php @@ -5,12 +5,15 @@ namespace App\Filtros; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Database\Eloquent\Builder; +use Symfony\Component\HttpKernel\Exception\HttpException; +use Throwable; +use TypeError; class Filtro extends Model { - protected $request; + protected Request $request; protected $builder; - protected $MENSAJES_ERROR = [ + protected array $MENSAJES_ERROR = [ 'ARGUMENTO' => 'Argumento inválido para el parámetro %s. Revise la documentación.' ]; @@ -22,10 +25,10 @@ class Filtro extends Model /** * Apply all existing filters, if available. * - * @param \Illuminate\Database\Eloquent\Builder $builder - * @return \Illuminate\Database\Eloquent\Builder + * @param Builder $builder + * @return Builder */ - public function aplicar(Builder $builder) + public function aplicar(Builder $builder): Builder { $this->builder = $builder; @@ -47,11 +50,11 @@ class Filtro extends Model //Llamar métodos sin argumentos if ($valor === null|| (is_a($valor,'String') && trim($valor)=='')){ $this->$metodo(); continue; } - + //Llamar métodos con argumentos try { $this->$metodo($valor); - } catch (\Throwable $th) { + } catch (Throwable $th) { if (is_a($th,'TypeError') ) { throw new HttpException(400, sprintf($this->MENSAJES_ERROR['ARGUMENTO'],$filtro)); } throw $th; } @@ -63,7 +66,7 @@ class Filtro extends Model //Buscar un término en el nombre public function nombre(String $valor) { - $this->builder->where('nombre', "LIKE", "%" . $valor . "%")->orderByRaw("IF(nombre = '{$valor}',2,IF(nombre LIKE '{$valor}%',1,0)) DESC"); + $this->builder->where('nombre', "LIKE", "%" . $valor . "%")->orderByRaw("IF(nombre = '$valor',2,IF(nombre LIKE '$valor%',1,0)) DESC"); } public function alfabetico(String $order = 'asc') diff --git a/app/Filtros/FiltroDeProducto.php b/app/Filtros/FiltroDeProducto.php index 93672c2..d7e7dc3 100644 --- a/app/Filtros/FiltroDeProducto.php +++ b/app/Filtros/FiltroDeProducto.php @@ -1,7 +1,6 @@ builder->where('categoria', $valor); } -} \ No newline at end of file +} diff --git a/app/Filtros/FiltroDeSubpedido.php b/app/Filtros/FiltroDeSubpedido.php index 6fa8198..c889860 100644 --- a/app/Filtros/FiltroDeSubpedido.php +++ b/app/Filtros/FiltroDeSubpedido.php @@ -2,7 +2,7 @@ namespace App\Filtros; -use Illuminate\Database\Eloquent\Model; +use TypeError; class FiltroDeSubpedido extends Filtro { diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 482e2a3..655af8a 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -7,6 +7,7 @@ use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Mpdf\Mpdf; @@ -23,7 +24,7 @@ class GrupoDeCompra extends Model return $this->hasMany(Subpedido::class); } - public function toggleDevoluciones() + public function toggleDevoluciones(): bool { $this->devoluciones_habilitadas = !$this->devoluciones_habilitadas; $this->save(); @@ -117,7 +118,7 @@ class GrupoDeCompra extends Model $mpdf->Output($filename, "D"); } - function pedidoParaPdf() + function pedidoParaPdf(): array { $productos = $this->productosPedidos(true); $pedido = []; @@ -135,8 +136,6 @@ class GrupoDeCompra extends Model $pedido['productos'][] = $productoParaPdf; } - Log::debug($pedido); - return $pedido; } @@ -173,7 +172,7 @@ class GrupoDeCompra extends Model } //Asume que los productos están gruadados en orden de fila - public static function obtenerTemplateDeFilasVacias(int $columns) + public static function obtenerTemplateDeFilasVacias(int $columns): array { $productosFilaID = Producto::productosFilaID(); $productosIDNombre = Producto::productosIDNombre(); @@ -197,7 +196,7 @@ class GrupoDeCompra extends Model CsvHelper::generarCsv('csv/exports/' . $this->nombre . '.csv', $records); } - public function generarColumnaCantidades() + public function generarColumnaCantidades(): array { $productos_en_pedido = $this->productosPedidos(); @@ -208,7 +207,7 @@ class GrupoDeCompra extends Model } $records = $this->obtenerTemplateDeFilasVacias(1); - $productos_id_fila = Producto::productosIdFila(); + $productos_id_fila = Producto::productosIDFila(); foreach ($productos_en_pedido as $id => $producto_pedido) { $fila = $productos_id_fila[$id]; $records[$fila][1] = $producto_pedido->cantidad_pedida; @@ -232,7 +231,7 @@ class GrupoDeCompra extends Model $pedidos = $this->pedidosAprobados(); // Generar tabla vacía con una columna por núcleo $records = $this->obtenerTemplateDeFilasVacias($pedidos->count()); - $productos_id_fila = Producto::productosIdFila(); + $productos_id_fila = Producto::productosIDFila(); foreach ($productos_en_pedido as $id => $producto_pedido) { $fila = $productos_id_fila[$id]; @@ -270,7 +269,7 @@ class GrupoDeCompra extends Model ->orderBy('nombre'); } - public static function transportePorBarrio() + public static function transportePorBarrio(): array { $result = []; $barrios = GrupoDeCompra::barriosMenosPrueba()->get(); @@ -283,9 +282,9 @@ class GrupoDeCompra extends Model } /** - * @return \Illuminate\Support\Collection + * @return Collection */ - public function productosPedidos($excluirBarriales = false): \Illuminate\Support\Collection + public function productosPedidos($excluirBarriales = false): Collection { $query = DB::table('pedidos_aprobados') ->where('grupo_de_compra_id', $this->id); diff --git a/app/Helpers/CsvHelper.php b/app/Helpers/CsvHelper.php index 96bce8f..95f2cfd 100644 --- a/app/Helpers/CsvHelper.php +++ b/app/Helpers/CsvHelper.php @@ -13,7 +13,7 @@ use League\Csv\Writer; class CsvHelper { public static function getRecords($filePath): Iterator { - $csv = Reader::createFromPath(resource_path($filePath), 'r'); + $csv = Reader::createFromPath(resource_path($filePath)); try { $csv->setDelimiter("|"); $csv->setEnclosure("'"); @@ -34,7 +34,7 @@ class CsvHelper } $writer->insertAll($contenido); } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); + Log::error($e->getMessage(), $e->getTrace()); } } } diff --git a/app/Helpers/TransporteHelper.php b/app/Helpers/TransporteHelper.php index 52c6c6b..49ec37f 100644 --- a/app/Helpers/TransporteHelper.php +++ b/app/Helpers/TransporteHelper.php @@ -3,7 +3,6 @@ namespace App\Helpers; use App\CanastaLog; -use Exception; use Illuminate\Support\Facades\Log; class TransporteHelper diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 764f7a7..44165ac 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -3,8 +3,7 @@ namespace App\Http\Controllers; use App\GrupoDeCompra; -use Illuminate\Http\Request; -use Response; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class AdminController extends Controller { @@ -18,16 +17,18 @@ class AdminController extends Controller } public function exportarPedidosAPdf(GrupoDeCompra $gdc) { - return $gdc->exportarPedidosAPdf(); + $gdc->exportarPedidosAPdf(); } - public function exportarPedidoACSV(GrupoDeCompra $gdc) { + public function exportarPedidoACSV(GrupoDeCompra $gdc): BinaryFileResponse + { $gdc->exportarPedidoEnCSV(); $file = resource_path('csv/exports/'.$gdc->nombre.'.csv'); return response()->download($file); } - public function exportarPedidoConNucleosACSV(GrupoDeCompra $gdc) { + public function exportarPedidoConNucleosACSV(GrupoDeCompra $gdc): BinaryFileResponse + { $gdc->exportarPedidoConNucleosEnCSV(); $file = resource_path('csv/exports/'.$gdc->nombre.'-completo.csv'); return response()->download($file); diff --git a/app/Http/Controllers/Api/ProductoController.php b/app/Http/Controllers/Api/ProductoController.php index 57f27fd..ed66c1f 100644 --- a/app/Http/Controllers/Api/ProductoController.php +++ b/app/Http/Controllers/Api/ProductoController.php @@ -10,24 +10,11 @@ use App\Producto; class ProductoController extends Controller { - /** - * Mostrar una lista de productos. - * - * @param App\Filtros\FiltroDeProducto $filtros - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ public function index(FiltroDeProducto $filtros, Request $request) { return ProductoResource::collection(Producto::filtrar($filtros)->paginate(Producto::getPaginar($request))); } - /** - * Display the specified resource. - * - * @param \App\Producto $producto - * @return \Illuminate\Http\Response - */ public function show(Producto $producto) { return new ProductoResource($producto); diff --git a/app/Http/Controllers/Api/SubpedidoController.php b/app/Http/Controllers/Api/SubpedidoController.php index 4bd090a..d17d571 100644 --- a/app/Http/Controllers/Api/SubpedidoController.php +++ b/app/Http/Controllers/Api/SubpedidoController.php @@ -15,13 +15,6 @@ use Symfony\Component\HttpKernel\Exception\HttpException; class SubpedidoController extends Controller { - /** - * Mostrar una lista de productos. - * - * @param App\Filtros\FiltroDeSubpedido $filtros - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ public function index(FiltroDeSubpedido $filtros, Request $request) { return Subpedido::filtrar($filtros)->get(); @@ -32,12 +25,6 @@ class SubpedidoController extends Controller return SubpedidoResource::collection(Subpedido::filtrar($filtros)->get()); } - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ public function store(Request $request) { $validado = $this->validateSubpedido(); @@ -51,7 +38,8 @@ class SubpedidoController extends Controller return $s; } - protected function validateSubpedido(){ + protected function validateSubpedido(): array + { return request()->validate([ 'nombre' => 'required|max:255', 'grupo_de_compra_id' => [ @@ -61,12 +49,6 @@ class SubpedidoController extends Controller ]); } - /** - * Display the specified resource. - * - * @param \App\Subpedido $subpedido - * @return \Illuminate\Http\Response - */ public function show(Subpedido $subpedido) { return new SubpedidoResource($subpedido); diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php index e23ad43..2aef574 100644 --- a/app/Http/Controllers/ComprasController.php +++ b/app/Http/Controllers/ComprasController.php @@ -5,7 +5,9 @@ namespace App\Http\Controllers; use App\GrupoDeCompra; use App\Helpers\CanastaHelper; use App\Producto; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class ComprasController { @@ -15,13 +17,15 @@ class ComprasController return view('compras_pedidos'); } - public function descargarPedidos() { + public function descargarPedidos(): BinaryFileResponse + { Producto::planillaTotales(); $file = resource_path('csv/exports/pedidos-por-barrio.csv'); return response()->download($file); } - public function descargarNotas() { + public function descargarNotas(): BinaryFileResponse + { Producto::planillaNotas(); $file = resource_path('csv/exports/notas-por-barrio.csv'); return response()->download($file); @@ -36,7 +40,7 @@ class ComprasController return view('auth/compras_login'); } - public function cargarCanasta(Request $request) + public function cargarCanasta(Request $request): JsonResponse { $request->validate([ 'data' => 'required|file|mimes:csv,txt|max:2048', @@ -47,10 +51,11 @@ class ComprasController return response()->json([ 'message' => 'Canasta cargada exitosamente', - ], 200); + ]); } - public function descargarCanastaEjemplo() { + public function descargarCanastaEjemplo(): BinaryFileResponse + { $file = resource_path('csv/productos.csv'); return response()->download($file); } diff --git a/app/Http/Controllers/ProductoController.php b/app/Http/Controllers/ProductoController.php index c7577d6..99391d8 100644 --- a/app/Http/Controllers/ProductoController.php +++ b/app/Http/Controllers/ProductoController.php @@ -2,8 +2,6 @@ namespace App\Http\Controllers; -use Illuminate\Http\Request; - class ProductoController extends Controller { /** @@ -16,11 +14,6 @@ class ProductoController extends Controller $this->middleware(['auth','subpedido']); } - /** - * Show the application dashboard. - * - * @return \Illuminate\Contracts\Support\Renderable - */ public function index() { return view('productos'); diff --git a/app/Http/Middleware/Admin.php b/app/Http/Middleware/Admin.php index 6eed291..df3fdb1 100644 --- a/app/Http/Middleware/Admin.php +++ b/app/Http/Middleware/Admin.php @@ -3,18 +3,12 @@ namespace App\Http\Middleware; use Closure; -use Auth; +use Illuminate\Support\Facades\Auth; +use Illuminate\Http\Request; class Admin { - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { $user = Auth::user(); if ($user->is_admin) { diff --git a/app/Http/Middleware/Subpedido.php b/app/Http/Middleware/Subpedido.php index 66e8051..3319847 100644 --- a/app/Http/Middleware/Subpedido.php +++ b/app/Http/Middleware/Subpedido.php @@ -3,17 +3,18 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Request; class Subpedido { /** * Handle an incoming request. * - * @param \Illuminate\Http\Request $request - * @param \Closure $next + * @param Request $request + * @param Closure $next * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { if (!session('subpedido_nombre') || !session('subpedido_id')) { return redirect()->route('subpedidos.create'); diff --git a/app/Http/Resources/GrupoDeCompraResource.php b/app/Http/Resources/GrupoDeCompraResource.php index 3ff9cce..58a025b 100644 --- a/app/Http/Resources/GrupoDeCompraResource.php +++ b/app/Http/Resources/GrupoDeCompraResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class GrupoDeCompraResource extends JsonResource @@ -9,10 +10,10 @@ class GrupoDeCompraResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @return array */ - public function toArray($request) + public function toArray($request): array { return [ 'id' => $this->id, @@ -23,8 +24,8 @@ class GrupoDeCompraResource extends JsonResource 'total_barrial' => number_format($this->totalBarrial(),2), 'total_devoluciones' => number_format($this->totalDevoluciones(),2), 'total_a_transferir' => number_format($this->totalATransferir(),2), - 'total_transporte' => number_format($this->totalTransporte(),0), - 'cantidad_transporte' => number_format($this->cantidadTransporte(),0), + 'total_transporte' => number_format($this->totalTransporte()), + 'cantidad_transporte' => number_format($this->cantidadTransporte()), ]; } } diff --git a/app/Http/Resources/ProductoResource.php b/app/Http/Resources/ProductoResource.php index 4040989..677af54 100644 --- a/app/Http/Resources/ProductoResource.php +++ b/app/Http/Resources/ProductoResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class ProductoResource extends JsonResource @@ -9,10 +10,10 @@ class ProductoResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @return array */ - public function toArray($request) + public function toArray($request): array { return [ 'id' => $this->id, diff --git a/app/Http/Resources/SubpedidoResource.php b/app/Http/Resources/SubpedidoResource.php index d0da61f..98fd733 100644 --- a/app/Http/Resources/SubpedidoResource.php +++ b/app/Http/Resources/SubpedidoResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class SubpedidoResource extends JsonResource @@ -9,10 +10,10 @@ class SubpedidoResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @return array */ - public function toArray($request) + public function toArray($request): array { return [ 'id' => $this->id, @@ -21,8 +22,8 @@ class SubpedidoResource extends JsonResource 'productos' => $this->productos, 'aprobado' => (bool) $this->aprobado, 'total' => number_format($this->total(),2), - 'total_transporte' => number_format($this->totalTransporte(),0), - 'cantidad_transporte' => number_format($this->cantidadTransporte(),0), + 'total_transporte' => number_format($this->totalTransporte()), + 'cantidad_transporte' => number_format($this->cantidadTransporte()), 'total_sin_devoluciones' => number_format($this->totalSinDevoluciones(),2), 'devoluciones_total' => number_format($this->devoluciones_total,2), 'devoluciones_notas' => $this->devoluciones_notas diff --git a/app/Producto.php b/app/Producto.php index 96065c2..d7d727b 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -5,7 +5,10 @@ namespace App; use App\Filtros\FiltroDeProducto; use App\Helpers\CsvHelper; use App\Helpers\TransporteHelper; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; @@ -15,50 +18,45 @@ class Producto extends Model { public $timestamps = false; protected $fillable = ["nombre", "precio", "presentacion", "stock", "categoria"]; - static $paginarPorDefecto = 10; + static int $paginarPorDefecto = 10; - public function subpedidos() + public function subpedidos(): BelongsToMany { return $this->belongsToMany('App\Subpedido', 'productos_subpedidos')->withPivot(["cantidad", "notas"]); } - public function proveedor() + public function proveedor(): BelongsTo { return $this->belongsTo('App\Proveedor'); } - public function pagaTransporte() - { - return !($this->bono || Str::contains($this->categoria, 'SUBSIDIADO')); - } - //Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) - public function scopeFiltrar($query, FiltroDeProducto $filtros) + public function scopeFiltrar($query, FiltroDeProducto $filtros): Builder { return $filtros->aplicar($query); } - public static function getPaginar(Request $request) + public static function getPaginar(Request $request): int { return $request->has('paginar') && intval($request->input('paginar')) ? intval($request->input('paginar')) : self::$paginarPorDefecto; } public static function productosFilaID() { - return Producto::pluck('id', 'fila',)->all(); + return Producto::pluck('id', 'fila')->all(); } public static function productosIDFila() { - return Producto::pluck('fila', 'id',)->all(); + return Producto::pluck('fila', 'id')->all(); } public static function productosIDNombre() { - return Producto::pluck('nombre', 'id',)->all(); + return Producto::pluck('nombre', 'id')->all(); } - static public function cantidadesPorBarrio() + static public function cantidadesPorBarrio(): Collection { $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('id', 'nombre'); diff --git a/app/Proveedor.php b/app/Proveedor.php index 20af175..07dbc40 100644 --- a/app/Proveedor.php +++ b/app/Proveedor.php @@ -3,14 +3,15 @@ namespace App; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; class Proveedor extends Model { public $timestamps = false; protected $fillable = [ "nombre","direccion","telefono","correo","comentario" ]; protected $table = 'proveedores'; - - public function productos() + + public function productos(): HasMany { return $this->hasMany('App\Producto'); } diff --git a/app/Subpedido.php b/app/Subpedido.php index 0915b3f..0370020 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -3,40 +3,30 @@ namespace App; use App\Helpers\TransporteHelper; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Support\Facades\DB; -use Log; use App\Filtros\FiltroDeSubpedido; class Subpedido extends Model { - const COSTO_TRANSPORTE = 15; public $timestamps = false; protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas']; - public function productos() + public function productos(): BelongsToMany { return $this->belongsToMany('App\Producto')->withPivot(["cantidad", "total", "notas"]); } - //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte - private function bonos() - { - return $this->productos()->where('bono', 1); - } - - public function productosSinBonos() - { - return $this->productos()->where('bono', false); - } - - public function grupoDeCompra() + public function grupoDeCompra(): BelongsTo { return $this->belongsTo('App\GrupoDeCompra'); } // Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) - public function scopeFiltrar($query, FiltroDeSubpedido $filtros) + public function scopeFiltrar($query, FiltroDeSubpedido $filtros): Builder { return $filtros->aplicar($query); } diff --git a/app/User.php b/app/User.php index 9d9c786..5f45a74 100644 --- a/app/User.php +++ b/app/User.php @@ -2,7 +2,7 @@ namespace App; -use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -38,7 +38,7 @@ class User extends Authenticatable ]; - public function grupoDeCompra() + public function grupoDeCompra(): BelongsTo { return $this->belongsTo('App\GrupoDeCompra'); } diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 741edea..2955bd8 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -1,9 +1,10 @@ name('productos.index'); Route::get('/admin', 'AdminController@show')->name('admin_login.show'); Route::get('/admin/obtener_sesion', function() { - $sesion = [ + return [ 'gdc' => session("admin_gdc") ]; - return $sesion; })->name('admin_obtener_sesion'); Route::middleware(['auth', 'admin'])->group( function () { @@ -64,14 +66,13 @@ Route::middleware('auth')->group( function() { })->name('guardarSesion'); Route::get('obtener_sesion', function() { - $sesion = [ - 'subpedido' => [ - 'nombre' => session("subpedido_nombre"), - 'id' => session("subpedido_id") - ], + return [ + 'subpedido' => [ + 'nombre' => session("subpedido_nombre"), + 'id' => session("subpedido_id") + ], 'gdc' => session("gdc") - ]; - return $sesion; + ]; })->name('obtenerSesion'); }); }); From 2df7f6fc4bd5988a6464093126abcdf1be34d3da Mon Sep 17 00:00:00 2001 From: ale Date: Mon, 12 May 2025 18:48:23 -0300 Subject: [PATCH 17/22] Agregado producto_es_bono a PedidosAprobados --- .../AgregarEsBonoAPedidosAprobados.php | 72 +++++++++++++++++++ ...ll_agregar_es_bono_a_pedidos_aprobados.php | 27 +++++++ 2 files changed, 99 insertions(+) create mode 100644 app/Console/Commands/AgregarEsBonoAPedidosAprobados.php create mode 100644 database/migrations/2025_05_12_214437_call_agregar_es_bono_a_pedidos_aprobados.php diff --git a/app/Console/Commands/AgregarEsBonoAPedidosAprobados.php b/app/Console/Commands/AgregarEsBonoAPedidosAprobados.php new file mode 100644 index 0000000..251b94c --- /dev/null +++ b/app/Console/Commands/AgregarEsBonoAPedidosAprobados.php @@ -0,0 +1,72 @@ + Date: Mon, 12 May 2025 18:55:59 -0300 Subject: [PATCH 18/22] =?UTF-8?q?Bonos=20exclu=C3=ADdos=20de=20pdf=20de=20?= =?UTF-8?q?pedidos=20barriales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/GrupoDeCompra.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 655af8a..92914ea 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -120,7 +120,7 @@ class GrupoDeCompra extends Model function pedidoParaPdf(): array { - $productos = $this->productosPedidos(true); + $productos = $this->productosPedidos(true, true); $pedido = []; $pedido['productos'] = []; @@ -131,7 +131,7 @@ class GrupoDeCompra extends Model $productoParaPdf['nombre'] = $producto->producto_nombre; $productoParaPdf['pivot']['cantidad'] = $producto->cantidad_pedida; $productoParaPdf['pivot']['notas'] = false; - $productoParaPdf['bono'] = false; // para que no lo saltee + $productoParaPdf['bono'] = $producto->producto_es_bono; $pedido['productos'][] = $productoParaPdf; } @@ -284,13 +284,15 @@ class GrupoDeCompra extends Model /** * @return Collection */ - public function productosPedidos($excluirBarriales = false): Collection + public function productosPedidos($excluirBarriales = false, $excluirBonos = false): Collection { $query = DB::table('pedidos_aprobados') ->where('grupo_de_compra_id', $this->id); if ($excluirBarriales) $query = $query->where('producto_nombre','NOT LIKE','%barrial%'); + if ($excluirBonos) + $query = $query->where('producto_es_bono',false); return $query ->get() From b8d1520c540d6b5bb87e222eb74c343e9d4dc04c Mon Sep 17 00:00:00 2001 From: ale Date: Mon, 12 May 2025 18:59:05 -0300 Subject: [PATCH 19/22] Seteando producto como bono para tipos 'F' y 'BE' --- app/Helpers/CanastaHelper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php index 53815aa..9d3edcf 100644 --- a/app/Helpers/CanastaHelper.php +++ b/app/Helpers/CanastaHelper.php @@ -17,6 +17,7 @@ class CanastaHelper const TOTAL = "TOTAL"; const ARCHIVO_SUBIDO = 'Archivo subido'; const CANASTA_CARGADA = 'Canasta cargada'; + const TIPOS_BONO = ["B", "F", "BE"]; public static function guardarCanasta($data, $path): string { $nombre = $data->getClientOriginalName(); @@ -66,7 +67,7 @@ class CanastaHelper 'nombre' => trim(str_replace('*', '',$registro['Producto'])), 'precio' => $registro['Precio'], 'proveedor_id' => self::obtenerProveedor($registro['Producto']), - 'bono' => $registro[self::TIPO] == "B", + 'bono' => in_array($registro[self::TIPO], self::TIPOS_BONO), 'requiere_notas'=> $registro[self::TIPO] =="PTC", ]; } From 250bfd8a335b3e560a52fb14f208ef5be13cf206 Mon Sep 17 00:00:00 2001 From: ale Date: Mon, 12 May 2025 19:10:16 -0300 Subject: [PATCH 20/22] =?UTF-8?q?Agregado=20PdfHelper=20para=20centralizar?= =?UTF-8?q?=20l=C3=B3gica=20de=20generaci=C3=B3n=20de=20pdfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/GrupoDeCompra.php | 28 ++++------------------------ app/Helpers/PdfHelper.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 app/Helpers/PdfHelper.php diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 92914ea..369fc8c 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -3,6 +3,7 @@ namespace App; use App\Helpers\CsvHelper; +use App\Helpers\PdfHelper; use App\Helpers\TransporteHelper; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; @@ -105,17 +106,7 @@ class GrupoDeCompra extends Model public function exportarPedidosAPdf() { $subpedidos = $this->pedidosAprobados(); - //generar pdf - $mpdf = new Mpdf(); - foreach ($subpedidos as $subpedido) { - $tabla = $subpedido->generarHTML(); - // agregar la tabla al pdf en una nueva página - $mpdf->WriteHTML($tabla); - $mpdf->AddPage(); - } - $filename = $this->nombre . '.pdf'; - // imprimir el pdf - $mpdf->Output($filename, "D"); + PdfHelper::exportarPedidos($this->nombre . '.pdf', $subpedidos); } function pedidoParaPdf(): array @@ -147,19 +138,8 @@ class GrupoDeCompra extends Model public static function exportarPedidosBarrialesAPdf() { - $barrios = GrupoDeCompra::barriosMenosPrueba() - ->get(); - $mpdf = new Mpdf(); - - foreach ($barrios as $barrio) { - $tabla = $barrio->generarHTML(); - $mpdf->WriteHTML($tabla); - $mpdf->AddPage(); - } - - $filename = 'pedidos_por_barrio.pdf'; - // imprimir el pdf - $mpdf->Output($filename, "D"); + $barrios = GrupoDeCompra::barriosMenosPrueba()->get(); + PdfHelper::exportarPedidos('pedidos_por_barrio.pdf', $barrios); } static function filaVacia(string $product, int $columns): array diff --git a/app/Helpers/PdfHelper.php b/app/Helpers/PdfHelper.php new file mode 100644 index 0000000..b13ae35 --- /dev/null +++ b/app/Helpers/PdfHelper.php @@ -0,0 +1,29 @@ +generarHTML(); + $mpdf->WriteHTML($html); + $mpdf->AddPage(); + } + + $mpdf->Output($filepath, 'D'); + } +} From 58211913f4b2111b8ece53a9a5b317b59fa43c14 Mon Sep 17 00:00:00 2001 From: ale Date: Mon, 12 May 2025 19:13:44 -0300 Subject: [PATCH 21/22] Quitados imports no usados --- app/GrupoDeCompra.php | 1 - app/Producto.php | 1 - .../2023_07_06_015926_call_crear_pedidos_aprobados.php | 2 -- 3 files changed, 4 deletions(-) diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 369fc8c..6d56966 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -11,7 +11,6 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; -use Mpdf\Mpdf; class GrupoDeCompra extends Model { diff --git a/app/Producto.php b/app/Producto.php index d7d727b..9b412c3 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -12,7 +12,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; class Producto extends Model { diff --git a/database/migrations/2023_07_06_015926_call_crear_pedidos_aprobados.php b/database/migrations/2023_07_06_015926_call_crear_pedidos_aprobados.php index b8855f4..84eacf7 100644 --- a/database/migrations/2023_07_06_015926_call_crear_pedidos_aprobados.php +++ b/database/migrations/2023_07_06_015926_call_crear_pedidos_aprobados.php @@ -1,8 +1,6 @@ Date: Mon, 12 May 2025 19:17:02 -0300 Subject: [PATCH 22/22] Cambio en aviso --- resources/js/components/compras/Body.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue index 8bcf794..8225e77 100644 --- a/resources/js/components/compras/Body.vue +++ b/resources/js/components/compras/Body.vue @@ -20,10 +20,9 @@ La planilla de la canasta tiene que tener el siguiente formato para que la aplicación la lea correctamente:
  • Los precios deben usar punto y no coma decimal
  • -
  • El nombre de la columna de precios debe ser "Precio"
  • +
  • El nombre de las columnas deben ser "Tipo", "Producto", y "Precio" respectivamente
  • Las celdas deben separarse con '|'
  • No puede haber "enters" en ninguna celda
  • -
  • Todos los bonos deben tener tipo 'B' para evitar que paguen transporte
  • El bono de transporte debe tener tipo 'T'
Planilla de ejemplo.
- {{ $producto->nombre }} - @if($producto->pivot->notas) -
Talle/Color: {{ $producto->pivot->notas }} + {{ $producto['nombre'] }} + @if($producto['pivot']['notas']) +
Talle/Color: {{ $producto['pivot']['notas'] }} @endif
- {{ $producto->pivot->cantidad }} + {{ $producto['pivot']['cantidad'] }}