265 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
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\Reader;
 | 
						|
 | 
						|
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'];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param $gdcs
 | 
						|
     * @param array $planilla
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public static function getPlanilla($gdcs, array $planilla): array
 | 
						|
    {
 | 
						|
        $barrios = [""];
 | 
						|
        foreach ($gdcs as $i => $gdc) {
 | 
						|
            $barrios[] = $gdc->nombre;
 | 
						|
            $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) {
 | 
						|
                $total = 0;
 | 
						|
                // Poner cantidad de cada producto para cada núcleo
 | 
						|
                foreach ($pedidos as $pedido) {
 | 
						|
                    list($_, $_, $cantidad) = $gdc->agregarCantidad($pedido, $id, [], 0, 0);
 | 
						|
                    $total = $total + $cantidad;
 | 
						|
                }
 | 
						|
                $fila = Producto::productosIdFila()[$id];
 | 
						|
                $planilla[$fila][$i+1] = $total;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        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";
 | 
						|
    }
 | 
						|
    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);
 | 
						|
    }
 | 
						|
 | 
						|
  public static function exportarTodosLosPedidosEnCSV(){
 | 
						|
    $gdcs = GrupoDeCompra::all();
 | 
						|
    $planilla = GrupoDeCompra::obtenerTemplateDeFilasVacias($gdcs->count());
 | 
						|
    $planilla = self::getPlanilla($gdcs, $planilla);
 | 
						|
 | 
						|
    // Guardar en un archivo .csv
 | 
						|
    try {
 | 
						|
      $writer = Writer::createFromPath(resource_path('csv/exports/total-pedidos.csv'), 'w');
 | 
						|
      $writer->insertAll($planilla);
 | 
						|
    } catch (CannotInsertRecord $e) {
 | 
						|
      var_export($e->getRecords());
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  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());
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |