125 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App;
 | |
| 
 | |
| use League\Csv\Reader;
 | |
| use Illuminate\Database\Eloquent\Model;
 | |
| use Illuminate\Support\Facades\DB;
 | |
| use Log;
 | |
| use App\Filtros\FiltroDeSubpedido;
 | |
| 
 | |
| class Subpedido extends Model
 | |
| {
 | |
|   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);
 | |
|   }
 | |
| 
 | |
|   //Subtotal de dinero de productos del pedido, sin bonos ni transporte
 | |
|   public function totalSinBonos()
 | |
|   {
 | |
|     return $this->productosSinBonos()->sum('total');
 | |
|   }
 | |
| 
 | |
|   public function totalParaTransporte() {
 | |
|       $total = 0;
 | |
|       foreach ($this->productos()->get() as $producto) {
 | |
|           if ($producto->pagaTransporte()) {
 | |
|               $total += $producto->precio * $producto->pivot->cantidad;
 | |
|           }
 | |
|       }
 | |
|       return ceil($total);
 | |
|   }
 | |
| 
 | |
|   //Cantidad de bonos de transporte
 | |
|   public function cantidadBDT()
 | |
|   {
 | |
|     return ceil($this->totalParaTransporte() / 500);
 | |
|   }
 | |
| 
 | |
|   //Subtotal de dinero de bonos de transporte
 | |
|   public function getSubtotalBDT()
 | |
|   {
 | |
|     return $this->cantidadBDT() * 15;
 | |
|   }
 | |
| 
 | |
|   //Subtotal de dinero de bonos (MPS, Sororo, etc)
 | |
|   public function getSubtotalBonos()
 | |
|   {
 | |
|     return $this->bonos()->sum('total');
 | |
|   }
 | |
| 
 | |
|   public function getTotal()
 | |
|   {
 | |
|     return $this->totalSinBonos() + $this->getSubtotalBDT() + $this->getSubtotalBonos();
 | |
|   }
 | |
| 
 | |
|   public function getTotalMenosDevoluciones() {
 | |
|     return $this->getTotal() - $this->getDevoluciones();
 | |
|   }
 | |
| 
 | |
|   //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 getDevoluciones() {
 | |
|     return $this->devoluciones_total;
 | |
|   }
 | |
| 
 | |
|   public function getNotasDevoluciones() {
 | |
|     return $this->devoluciones_notas;
 | |
|   }
 | |
|   public function syncDevoluciones(float $total, string $notas) {
 | |
|     $this->devoluciones_total = $total;
 | |
|     $this->devoluciones_notas = $notas;
 | |
|     $this->save();
 | |
|   }
 | |
| }
 | 
