forked from nathalie/pedi2
		
	
		
			
				
	
	
		
			137 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App;
 | 
						|
 | 
						|
use App\Helpers\TransporteHelper;
 | 
						|
use Illuminate\Database\Eloquent\Model;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use Log;
 | 
						|
use App\Filtros\FiltroDeSubpedido;
 | 
						|
 | 
						|
class Subpedido extends Model
 | 
						|
{
 | 
						|
    const COSTO_TRANSPORTE = 15;
 | 
						|
    public $timestamps = false;
 | 
						|
  protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas'];
 | 
						|
 | 
						|
  public function productos()
 | 
						|
  {
 | 
						|
    return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total", "notas"]);
 | 
						|
  }
 | 
						|
 | 
						|
  //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte
 | 
						|
  private function bonos()
 | 
						|
  {
 | 
						|
    return $this->productos()->where('bono',1);
 | 
						|
  }
 | 
						|
 | 
						|
  public function productosSinBonos()
 | 
						|
  {
 | 
						|
    return $this->productos()->where('bono',false);
 | 
						|
  }
 | 
						|
 | 
						|
  public function grupoDeCompra()
 | 
						|
  {
 | 
						|
    return $this->belongsTo('App\GrupoDeCompra');
 | 
						|
  }
 | 
						|
 | 
						|
  //Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
 | 
						|
  public function scopeFiltrar($query, FiltroDeSubpedido $filtros)
 | 
						|
  {
 | 
						|
      return $filtros->aplicar($query);
 | 
						|
  }
 | 
						|
 | 
						|
    public function total()
 | 
						|
    {
 | 
						|
        return $this->totalSinDevoluciones() - $this->devoluciones_total;
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalSinDevoluciones()
 | 
						|
    {
 | 
						|
        return $this->totalBarrial() + $this->totalCentral();
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalBarrial()
 | 
						|
    {
 | 
						|
        return DB::table('producto_subpedido')
 | 
						|
            ->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
 | 
						|
            ->where('producto_subpedido.subpedido_id', $this->id)
 | 
						|
            ->where('productos.nombre', 'like', '%barrial%')
 | 
						|
            ->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
 | 
						|
            ->value('total');
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalCentral()
 | 
						|
    {
 | 
						|
        return $this->totalCentralesQueNoPaganTransporte() + $this->totalCentralesQuePaganTransporte() + $this->totalTransporte();
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalCentralesQueNoPaganTransporte()
 | 
						|
    {
 | 
						|
        return DB::table('producto_subpedido')
 | 
						|
            ->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
 | 
						|
            ->where('producto_subpedido.subpedido_id', $this->id)
 | 
						|
            ->where('productos.nombre', 'not like', '%barrial%')
 | 
						|
            ->where(function ($query) {
 | 
						|
                $query->where('productos.categoria', 'like', '%SUBSIDIADO%')
 | 
						|
                    ->orWhere('productos.bono', true);
 | 
						|
            })
 | 
						|
            ->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
 | 
						|
            ->value('total');
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalCentralesQuePaganTransporte()
 | 
						|
    {
 | 
						|
        return DB::table('producto_subpedido')
 | 
						|
            ->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
 | 
						|
            ->where('producto_subpedido.subpedido_id', $this->id)
 | 
						|
            ->where('productos.nombre', 'not like', '%barrial%')
 | 
						|
            ->where('productos.bono', false)
 | 
						|
            ->where('productos.categoria', 'not like', '%SUBSIDIADO%')
 | 
						|
            ->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
 | 
						|
            ->value('total');
 | 
						|
    }
 | 
						|
 | 
						|
    public function totalTransporte()
 | 
						|
    {
 | 
						|
        return TransporteHelper::totalTransporte($this->totalCentralesQuePaganTransporte());
 | 
						|
    }
 | 
						|
 | 
						|
    public function cantidadTransporte()
 | 
						|
    {
 | 
						|
        return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte());
 | 
						|
    }
 | 
						|
 | 
						|
  //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto.
 | 
						|
  public function syncProducto(Producto $producto, Int $cantidad, string $notas) {
 | 
						|
        if ($cantidad){
 | 
						|
          //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad
 | 
						|
          $this->productos()->syncWithoutDetaching([
 | 
						|
            $producto->id => [
 | 
						|
              'cantidad' => $cantidad,
 | 
						|
              'total' => $cantidad * $producto->precio,
 | 
						|
              'notas' => $notas,
 | 
						|
            ]
 | 
						|
          ]);
 | 
						|
        } else {
 | 
						|
            //si la cantidad es 0, se elimina el producto del subpedido
 | 
						|
            $this->productos()->detach($producto->id);
 | 
						|
        }
 | 
						|
  }
 | 
						|
 | 
						|
  public function toggleAprobacion(bool $aprobacion) {
 | 
						|
      $this->aprobado = $aprobacion;
 | 
						|
      $this->save();
 | 
						|
  }
 | 
						|
 | 
						|
  public function generarHTML() {
 | 
						|
      $view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]);
 | 
						|
      return $view->render();
 | 
						|
  }
 | 
						|
 | 
						|
  public function syncDevoluciones(float $total, string $notas) {
 | 
						|
    $this->devoluciones_total = $total;
 | 
						|
    $this->devoluciones_notas = $notas;
 | 
						|
    $this->save();
 | 
						|
  }
 | 
						|
}
 |