2021-12-30 13:12:14 -03:00
< ? php
namespace App ;
use League\Csv\Reader ;
use Illuminate\Database\Eloquent\Model ;
use Illuminate\Support\Facades\DB ;
use Log ;
2022-01-07 18:02:48 -03:00
use App\Filtros\FiltroDeSubpedido ;
2021-12-30 13:12:14 -03:00
class Subpedido extends Model
{
public $timestamps = false ;
protected $fillable = [ 'grupo_de_compra_id' , 'aprobado' , 'nombre' ];
public function productos ()
{
2022-03-16 23:56:51 -03:00
return $this -> belongsToMany ( 'App\Producto' ) -> withPivot ([ " cantidad " , " total " ]);
2021-12-30 13:12:14 -03:00
}
2022-02-23 19:52:52 -03:00
//Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte
private function bonos ()
{
return $this -> productos () -> where ( 'bono' , 1 );
}
private function productosSinBonos ()
{
return $this -> productos () -> where ( 'bono' , false );
}
2021-12-30 13:12:14 -03:00
public function grupoDeCompra ()
{
return $this -> belongsTo ( 'App\GrupoDeCompra' );
}
2022-02-23 19:52:52 -03:00
//Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
2022-01-07 18:02:48 -03:00
public function scopeFiltrar ( $query , FiltroDeSubpedido $filtros )
{
return $filtros -> aplicar ( $query );
}
2022-02-23 19:52:52 -03:00
//Subtotal de dinero de productos del pedido, sin bonos ni transporte
public function getSubtotalProductos ()
{
return $this -> productosSinBonos () -> sum ( 'total' );
}
//Cantidad de bonos de transporte
public function cantidadBDT ()
{
return ceil ( $this -> getSubtotalProductos () / 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 -> getSubtotalProductos () + $this -> getSubtotalBDT () + $this -> getSubtotalBonos ();
}
//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 ) {
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
]
]);
} else {
//si la cantidad es 0, se elimina el producto del subpedido
$this -> productos () -> detach ( $producto -> id );
}
}
2021-12-30 13:12:14 -03:00
}