From 10b1dd738e177e5bae38381c03594066ee954178 Mon Sep 17 00:00:00 2001 From: ale Date: Tue, 9 Jul 2024 23:21:49 -0300 Subject: [PATCH] Exportar a csv funcionando --- app/Models/Barrio.php | 62 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/app/Models/Barrio.php b/app/Models/Barrio.php index 27726a7..9a58936 100644 --- a/app/Models/Barrio.php +++ b/app/Models/Barrio.php @@ -50,8 +50,7 @@ public function productosPedidos() { ->select('productos.*', DB::raw('SUM(pedido_producto.cantidad) as cantidad'), DB::raw('SUM(pedido_producto.cantidad * productos.precio) as total')) - ->groupBy('productos.id') - ->get(); + ->groupBy('productos.id'); } public function totalARecaudar() : float { @@ -65,18 +64,16 @@ public function totalATransferir() : float { } public function totalNoBarriales() { - return $this->totalProductosIf(fn($p) => !$p->barrial); + return $this->totalProductosIf(['barrial' => false]); } public function totalBarriales() { - return $this->totalProductosIf(fn($p) => $p->barrial); + return $this->totalProductosIf(['barrial' => true]); } - private function totalProductosIf(callable $predicado) : float { - return $this->productosPedidos()->sum( - function ($producto) use ($predicado) { - return $predicado($producto) ? $producto->total : 0; - } + private function totalProductosIf($predicado) : float { + return $this->productosPedidos()->where($predicado)->get()->sum( + fn($producto) => $producto->total ); } @@ -92,51 +89,52 @@ public function productos(): HasMany return $this->hasMany(Producto::class); } - function exportarPedidoACsv() { - if ($this->pedidosPagados()->exists()) { - $columnaProductos = $this->armarColumnasPedido(); + public function exportarPedidoACsv() { + if ($this->productosPedidos()->get()->isNotEmpty()) { + $columnaProductos = $this->armarColumnaTotales(); try { $writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'.csv'), 'w'); + $writer->setDelimiter("|"); + $writer->setEnclosure("'"); $writer->insertAll($columnaProductos); + return true; } catch (CannotInsertRecord $e) { var_export($e->getRecords()); + return false; } } } - private function armarColumnasPedido() : array { + private function armarColumnaTotales() : array { $columnaProductos = []; $filasVaciasAgregadas = false; + $productos = $this->productosPedidos()->where(['barrial' => false])->get(); foreach (Categoria::orderBy('id')->get() as $keyC => $categoria) { - $columnaProductos[] = ['name' => $categoria->name, 'cantidad' => null]; + if ($categoria->productos()->where(['barrial' => false])->count() == 0) + continue; - if ($categoria->name == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO') - $columnaProductos[] = ['name' => 'Bono de Transporte', 'cantidad' => TransporteUtils::cantidad($this->totalParaTransporte)]; - else if ($categoria->name == 'PRODUCTOS DE GESTIÓN MENSTRUAL') - $columnaProductos[] = ['name' => '¿Cuántas copas quieren y pueden comprar en el grupo?', 'cantidad' => null]; + $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' => '¿Cuántas copas quieren y pueden comprar en el grupo?', 'cantidad' => null]; foreach ($categoria->productos()->orderBy('id')->get() as $keyP => $producto) { - if ($producto->price == 0 && !$filasVaciasAgregadas) { - $columnaProductos[] = ['name' => '¿Cuántas copas quieren adquirir a través del financiamiento sororo?', 'cantidad' => null]; + if ($producto->precio == 0 && !$filasVaciasAgregadas) { + $columnaProductos[] = ['nombre' => '¿Cuántas copas quieren adquirir a través del financiamiento sororo?', 'cantidad' => null]; $filasVaciasAgregadas = true; } - $columnaProductos[] = ['name' => $producto->name, 'cantidad' => $this->cantidadPedida($producto->id)]; + $columnaProductos[] = ['nombre' => $producto->nombre, 'cantidad' => $this->cantidadPedida($producto->id, $productos)]; } } + + return $columnaProductos; } - private function cantidadPedida($productoId) { - $pedidos = $this->pedidos() - ->whereHas('productos', - function ($query) use ($productoId) { - $query->where('producto_id', $productoId);}) - ->get(); - - return $pedidos->sum(function ($pedido) use ($productoId) { - return $pedido->productos - ->find($productoId) - ->pivot->cantidad ?? 0;}); + private function cantidadPedida($productoId, $productos) { + return $productos->first(fn($p) => $p->id == $productoId)->cantidad ?? 0; } }