devoluciones_habilitadas = !$this->devoluciones_habilitadas; $this->save(); return $this->devoluciones_habilitadas; } public function subpedidos() { return $this->hasMany('App\Subpedido'); } public function pedidosAprobados() { return $this->subpedidos->where('aprobado', 1); } public function exportarPlanillasAPdf() { $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"); } static function filaVacia(string $product, int $columns): array { $fila = [$product]; for ($i = 1; $i <= $columns; $i++) { $fila[$i] = "0"; } return $fila; } //Asume que los productos están gruadados en orden de fila public static function obtenerTemplateDeFilasVacias(int $columns) { $productosFilaID = Producto::productosFilaID(); $productosIDNombre = Producto::productosIDNombre(); $num_fila = 1; $template = []; foreach ($productosFilaID as $fila => $id) { for ($i = $num_fila; $i < $fila; $i++) { $template[$i] = GrupoDeCompra::filaVacia("", $columns); } $template[$fila] = GrupoDeCompra::filaVacia($productosIDNombre[$id], $columns); $num_fila = $fila + 1; } $template[GrupoDeCompra::obtenerFilaDeBonoTransporte()] = 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 calcularCantidadBDT() { $total = 0; foreach ($this->pedidosAprobados() as $pedido) { $total += $pedido->totalParaTransporte(); } return ceil($total / 500); } 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(); try { $writer = Writer::createFromPath(resource_path('csv/exports/' . $this->nombre . '.csv'), 'w'); $writer->insertAll($records); } catch (CannotInsertRecord $e) { var_export($e->getRecords()); } } public function generarColumnaCantidades() { $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) { \Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); return []; } $records = $this->obtenerTemplateDeFilasVacias(1); $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; } $records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT(); return $records; } public function exportarPedidoConNucleosEnCSV() { $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) { \Log::debug("El grupo de compra " . $this->nombre . " no tiene pedidos aprobados."); return; } $pedidos = $this->pedidosAprobados(); // Generar tabla vacía con una columna por núcleo $records = $this->obtenerTemplateDeFilasVacias($pedidos->count()); $productos_id_fila = Producto::productosIdFila(); foreach ($productos_en_pedido as $id => $producto_pedido) { $fila = $productos_id_fila[$id]; $i = 1; // Poner cantidad de cada producto para cada núcleo foreach ($pedidos as $pedido) { list($records, $i, $_) = $this->agregarCantidad($pedido, $id, $records, $fila, $i); } } // Insertar lista de núcleos en la primera fila $nucleos = [""]; $i = 1; foreach ($pedidos as $pedido) { $nucleos[$i] = $pedido->nombre; $i++; } 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()); } } public function agregarCantidad($pedido, $id, array $records, $fila, int $i): array { $producto = $pedido->productos()->find($id); $cantidad = $producto == NULL ? 0 : $producto->pivot->cantidad; $records[$fila][$i] = $cantidad; $i++; return array($records, $i, $cantidad); } 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()); } } }