diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index fd5de50..6928d5f 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -3,19 +3,18 @@ namespace App; use Illuminate\Database\Eloquent\Model; -use Mpdf\Mpdf; -use League\Csv\CannotInsertRecord; -use League\Csv\Writer; -use App\Producto; 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 $timestamps = false; + protected $fillable = ["nombre", "region", "telefono", "correo", "referente_finanzas", "cantidad_de_nucleos", "fila", "devoluciones_habilitadas"]; + protected $table = 'grupos_de_compra'; + protected $hidden = ['password']; /** * @param $gdcs @@ -37,183 +36,194 @@ class GrupoDeCompra extends Model $total = $total + $cantidad; } $fila = Producto::productosIdFila()[$id]; - $planilla[$fila][$i-1] = $total; + $planilla[$fila][$i - 1] = $total; } - $planilla[GrupoDeCompra::obtenerFilaDeBonoTransporte()][$i-1] = $gdc->calcularCantidadBDT(); + $planilla[GrupoDeCompra::obtenerFilaDeBonoTransporte()][$i - 1] = $gdc->calcularCantidadBDT(); } array_splice($planilla, 0, 0, array($barrios)); return $planilla; } 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"; + { + $this->devoluciones_habilitadas = !$this->devoluciones_habilitadas; + $this->save(); + return $this->devoluciones_habilitadas; } - 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; + public function subpedidos() + { + return $this->hasMany('App\Subpedido'); } - $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()); + public function pedidosAprobados() + { + return $this->subpedidos->where('aprobado', 1); } - 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"]; + 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(); } - } - } - 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; + $filename = $this->nombre . '.pdf'; + // imprimir el pdf + $mpdf->Output($filename, "D"); } - $pedidos = $this->pedidosAprobados(); - // Generar tabla vacía con una columna por núcleo - $records = $this->obtenerTemplateDeFilasVacias($pedidos->count()); - $productos_id_fila = Producto::productosIdFila(); + static function filaVacia(string $product, int $columns): array + { + $fila = [$product]; + for ($i = 1; $i <= $columns; $i++) { + $fila[$i] = "0"; + } + return $fila; + } - 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); - } + //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; } - // 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()); + 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 { @@ -224,29 +234,31 @@ class GrupoDeCompra extends Model return array($records, $i, $cantidad); } - public static function exportarProductosConNotasEnCSV() { - $gdcs = GrupoDeCompra::all(); - foreach ($gdcs as $i => $gdc) { - $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id', $gdc->id)->get()->keyBy('producto_id'); - $pedidos = $gdc->pedidosAprobados(); - foreach ($productos_en_pedido as $id => $producto_pedido) { - foreach ($pedidos as $pedido) { - $producto = $pedido->productos()->find($id); - if ($producto != null && $producto->requiere_notas) { - $planilla[$i+1][0] = $gdc->nombre; - $planilla[$i+1][1] = $producto->nombre; - $planilla[$i+1][2] = $producto->pivot->cantidad; - $planilla[$i+1][3] = $producto->pivot->notas; - } + public static function exportarProductosConNotasEnCSV() + { + $gdcs = GrupoDeCompra::all(); + foreach ($gdcs as $i => $gdc) { + $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id', $gdc->id)->get()->keyBy('producto_id'); + $pedidos = $gdc->pedidosAprobados(); + foreach ($productos_en_pedido as $id => $producto_pedido) { + foreach ($pedidos as $pedido) { + $producto = $pedido->productos()->find($id); + if ($producto != null && $producto->requiere_notas) { + $planilla[$i + 1][0] = $gdc->nombre; + $planilla[$i + 1][1] = $producto->nombre; + $planilla[$i + 1][2] = $producto->pivot->cantidad; + $planilla[$i + 1][3] = $producto->pivot->notas; + } + } + } + } + // Guardar en un archivo .csv + try { + $writer = Writer::createFromPath(resource_path('csv/exports/pedidos-notas.csv'), 'w'); + $writer->insertAll($planilla); + } catch (CannotInsertRecord $e) { + var_export($e->getRecords()); } - } } - // Guardar en un archivo .csv - try { - $writer = Writer::createFromPath(resource_path('csv/exports/pedidos-notas.csv'), 'w'); - $writer->insertAll($planilla); - } catch (CannotInsertRecord $e) { - var_export($e->getRecords()); - } - } + }