From 1abc3f66c41a3d016b29364b287622322952b030 Mon Sep 17 00:00:00 2001 From: ale Date: Thu, 11 Jul 2024 21:36:43 -0300 Subject: [PATCH] =?UTF-8?q?Arreglos=20en=20la=20l=C3=B3gica=20y=20simplifi?= =?UTF-8?q?caciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/Barrio.php | 26 ++++++++++++-------------- app/Models/Pedido.php | 14 ++++++++------ app/Models/Producto.php | 5 +++++ app/Utils/TransporteUtils.php | 4 ++-- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/app/Models/Barrio.php b/app/Models/Barrio.php index 41d7e9c..b8c0800 100644 --- a/app/Models/Barrio.php +++ b/app/Models/Barrio.php @@ -53,7 +53,7 @@ public function productosPedidos() { ->join('pedido_producto', 'productos.id', '=', 'pedido_producto.producto_id') ->join('pedidos', 'pedidos.id', '=', 'pedido_producto.pedido_id') ->where(['pedidos.barrio_id' => $this->id, 'pedidos.pagado' => true]) - ->select('productos.*', + ->select('productos.*', DB::raw('SUM(pedido_producto.cantidad) as cantidad'), DB::raw('SUM(pedido_producto.cantidad * productos.precio) as total')) ->groupBy('productos.id'); @@ -66,19 +66,16 @@ public function totalARecaudar() : float { } public function totalATransferir() : float { - return $this->totalNoBarriales() + $this->totalBonosDeTransporte(); + return $this->totalProductosConTransporte() + $this->totalBonosDeTransporte(); } public function totalBonosDeTransporte() : int { - return TransporteUtils::calcularTotal($this->totalNoBarriales()); + return TransporteUtils::calcularTotal($this->totalProductosConTransporte()); } - public function totalNoBarriales() { - return $this->totalProductosIf(['barrial' => false]); - } - - public function totalBarriales() { - return $this->totalProductosIf(['barrial' => true]); + public function totalProductosConTransporte(): float + { + return $this->totalProductosIf(fn($p) => $p->pagaTransporte()); } private function totalProductosIf($predicado) : float { @@ -110,6 +107,7 @@ public function exportarPedidoACsv() { return false; } } + return false; } private function armarColumnaTotales() : array { @@ -117,18 +115,18 @@ private function armarColumnaTotales() : array { $filasVaciasAgregadas = false; $productos = $this->productosPedidos()->where(['barrial' => false])->get(); - foreach (Categoria::orderBy('id')->get() as $keyC => $categoria) { + foreach (Categoria::orderBy('id')->get() as $categoria) { if ($categoria->productos()->where(['barrial' => false])->count() == 0) continue; $columnaProductos[] = ['nombre' => $categoria->nombre, 'cantidad' => null]; if ($categoria->nombre == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO') - $columnaProductos[] = ['nombre' => 'Bono de Transporte', 'cantidad' => $this->totalBonosDeTransporte()]; - else if ($categoria->nombre == 'PRODUCTOS DE GESTIÓN MENSTRUAL') + $columnaProductos[] = ['nombre' => 'Bono de Transporte', 'cantidad' => TransporteUtils::cantidad($this->totalProductosConTransporte())]; + if ($categoria->nombre == 'PRODUCTOS DE GESTIÓN MENSTRUAL') $columnaProductos[] = ['nombre' => '¿Cuántas copas quieren y pueden comprar en el grupo?', 'cantidad' => null]; - foreach ($categoria->productos()->orderBy('id')->get() as $keyP => $producto) { + foreach ($categoria->productos()->orderBy('id')->get() as $producto) { if ($producto->precio == 0 && !$filasVaciasAgregadas) { $columnaProductos[] = ['nombre' => '¿Cuántas copas quieren adquirir a través del financiamiento sororo?', 'cantidad' => null]; $filasVaciasAgregadas = true; @@ -141,6 +139,6 @@ private function armarColumnaTotales() : array { } private function cantidadPedida($productoId, $productos) { - return $productos->first(fn($p) => $p->id == $productoId)->cantidad ?? 0; + return $productos->find($productoId)->cantidad ?? 0; } } diff --git a/app/Models/Pedido.php b/app/Models/Pedido.php index 488f0c9..ec0c288 100644 --- a/app/Models/Pedido.php +++ b/app/Models/Pedido.php @@ -4,6 +4,7 @@ use App\Utils\TransporteUtils; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Model; @@ -45,22 +46,23 @@ public function productos(): BelongsToMany { return $this->belongsToMany(Producto::class)->withPivot(['cantidad']); } - public function productosConTransporte() { - return $this->productos()->where(['bono' => false, 'barrial' => false])->get(); + public function productosConTransporte() : Collection + { + return $this->productos()->where(fn($p) => $p->pagaTransporte())->get(); } public function agregarProducto(Producto $producto, int $cantidad) : Producto { - $productoEnChismosa = $this->productos()->where('id', $producto->id)->first(); + $productoEnChismosa = $this->productos()->find($producto->id); if ($productoEnChismosa) { $productoEnChismosa->pivot->cantidad += $cantidad; if ($productoEnChismosa->pivot->cantidad != 0) $productoEnChismosa->save(); - else + else $this->quitarProducto($producto); return $productoEnChismosa; } else { $this->productos()->attach($producto, ['cantidad' => $cantidad]); - return $this->productos()->where('id', $producto->id)->first(); + return $this->productos()->find($producto->id); } } @@ -80,7 +82,7 @@ public function totalATransferir() : float { * Toma como parámetro una colección de productos * y devuelve la suma de los totales (precio * cantidad) * de cada uno. - * + * * Si la colección es null o no se pasa ningún parámetro * se toman todos los productos del pedido. */ diff --git a/app/Models/Producto.php b/app/Models/Producto.php index 5aaec75..ac88d9a 100644 --- a/app/Models/Producto.php +++ b/app/Models/Producto.php @@ -48,4 +48,9 @@ public function barrio(): BelongsTo { return $this->belongsTo(Barrio::class); } + + public function pagaTransporte() : bool + { + return !$this->bono && !$this->barrial; + } } diff --git a/app/Utils/TransporteUtils.php b/app/Utils/TransporteUtils.php index e487d4d..488d5fc 100644 --- a/app/Utils/TransporteUtils.php +++ b/app/Utils/TransporteUtils.php @@ -6,8 +6,8 @@ class TransporteUtils { public const COSTO_TRANSPORTE = 15; public const DIVISOR_TRANSPORTE = 500; - - private static function cantidad(float $total) : int { + + public static function cantidad(float $total) : int { if ($total) return 1 + floor($total / TransporteUtils::DIVISOR_TRANSPORTE); return 0;