From 32a3015e890ae89427e8311a7fb34a959c5b881e Mon Sep 17 00:00:00 2001 From: ale Date: Tue, 9 Jul 2024 22:15:09 -0300 Subject: [PATCH] Cambios en la logica + interfaz ampliada --- app/Models/Barrio.php | 51 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/app/Models/Barrio.php b/app/Models/Barrio.php index 760a979..27726a7 100644 --- a/app/Models/Barrio.php +++ b/app/Models/Barrio.php @@ -2,9 +2,12 @@ namespace App\Models; +use App\Utils\TransporteUtils; + use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\DB; use League\Csv\CannotInsertRecord; use League\Csv\Writer; @@ -35,22 +38,50 @@ public function pedidos(): HasMany return $this->hasMany(Pedido::class); } - function crearPedido(string $nombre) : Pedido { - return $this->pedidos()->create(['nombre' => $name]); + public function crearPedido(string $nombre) : Pedido { + return $this->pedidos()->create(['nombre' => $nombre]); } - function totalARecaudar() : float { - return $this->calcularTotalPagados(); + public function productosPedidos() { + return DB::table('productos') + ->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.*', + DB::raw('SUM(pedido_producto.cantidad) as cantidad'), + DB::raw('SUM(pedido_producto.cantidad * productos.precio) as total')) + ->groupBy('productos.id') + ->get(); } - private function calcularTotalPagados(Closure $closure = null) : float { - if (!$closure) - $closure = fn($p) => $p->totalChismosa(); - return $this->pedidosPagados()->sum($closure); + public function totalARecaudar() : float { + return $this->pedidos()->where(['pagado' => true])->get()->sum( + fn($p) => $p->totalATransferir() + ); } - function totalATransferir() : float { - return $this->calcularTotalPagados($p->totalATransferir()); + public function totalATransferir() : float { + return $this->totalNoBarriales() + $this->totalBonosDeTransporte(); + } + + public function totalNoBarriales() { + return $this->totalProductosIf(fn($p) => !$p->barrial); + } + + public function totalBarriales() { + return $this->totalProductosIf(fn($p) => $p->barrial); + } + + private function totalProductosIf(callable $predicado) : float { + return $this->productosPedidos()->sum( + function ($producto) use ($predicado) { + return $predicado($producto) ? $producto->total : 0; + } + ); + } + + public function totalBonosDeTransporte() : int { + return TransporteUtils::calcularTotal($this->totalNoBarriales()); } /**