257 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App;
 | |
| 
 | |
| use Illuminate\Database\Eloquent\Model;
 | |
| use Illuminate\Support\Facades\DB;
 | |
| use League\Csv\CannotInsertRecord;
 | |
| use League\Csv\Reader;
 | |
| use League\Csv\Writer;
 | |
| use Mpdf\Mpdf;
 | |
| 
 | |
| class GrupoDeCompra extends Model
 | |
| {
 | |
|     public $timestamps = false;
 | |
|     protected $fillable = ["nombre", "region", "telefono", "correo", "referente_finanzas", "cantidad_de_nucleos", "fila", "devoluciones_habilitadas"];
 | |
|     protected $table = 'grupos_de_compra';
 | |
|     protected $hidden = ['password'];
 | |
| 
 | |
|     public function toggleDevoluciones()
 | |
|     {
 | |
|         $this->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());
 | |
|         }
 | |
|     }
 | |
| }
 |