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 ;
2023-10-04 22:47:42 -03:00
protected $fillable = [ 'grupo_de_compra_id' , 'aprobado' , 'nombre' , 'devoluciones_total' , 'devoluciones_notas' ];
2021-12-30 13:12:14 -03:00
public function productos ()
{
2024-09-17 21:27:58 -03:00
return $this -> belongsToMany ( 'App\Producto' ) -> withPivot ([ " cantidad " , " total " , " notas " ]);
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 );
}
2022-09-06 21:38:01 -03:00
public function productosSinBonos ()
2022-02-23 19:52:52 -03:00
{
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
2023-05-24 15:01:31 -03:00
public function totalSinBonos ()
2022-02-23 19:52:52 -03:00
{
return $this -> productosSinBonos () -> sum ( 'total' );
}
2024-09-05 13:34:33 -03:00
public function totalParaTransporte () {
$total = 0 ;
foreach ( $this -> productos () -> get () as $producto ) {
if ( $producto -> pagaTransporte ()) {
$total += $producto -> precio * $producto -> pivot -> cantidad ;
}
}
2024-09-05 17:11:53 -03:00
return ceil ( $total );
2024-09-05 13:34:33 -03:00
}
2022-02-23 19:52:52 -03:00
//Cantidad de bonos de transporte
public function cantidadBDT ()
{
2024-09-05 13:34:33 -03:00
return ceil ( $this -> totalParaTransporte () / 500 );
2022-02-23 19:52:52 -03:00
}
//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 ()
{
2023-10-05 12:58:03 -03:00
return $this -> totalSinBonos () + $this -> getSubtotalBDT () + $this -> getSubtotalBonos ();
}
public function getTotalMenosDevoluciones () {
return $this -> getTotal () - $this -> getDevoluciones ();
2022-02-23 19:52:52 -03:00
}
//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.
2024-09-17 21:27:58 -03:00
public function syncProducto ( Producto $producto , Int $cantidad , string $notas ) {
2022-02-23 19:52:52 -03:00
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 ,
2024-09-17 21:27:58 -03:00
'total' => $cantidad * $producto -> precio ,
'notas' => $notas ,
2022-02-23 19:52:52 -03:00
]
]);
} else {
//si la cantidad es 0, se elimina el producto del subpedido
$this -> productos () -> detach ( $producto -> id );
}
}
2022-06-08 22:19:44 -03:00
public function toggleAprobacion ( bool $aprobacion ) {
$this -> aprobado = $aprobacion ;
$this -> save ();
}
2022-09-06 21:38:01 -03:00
public function generarHTML () {
$view = view ( " pdfgen.subpedido_tabla " , [ " subpedido " => $this ]);
return $view -> render ();
}
2024-09-05 13:34:33 -03:00
2023-10-04 22:47:42 -03:00
public function getDevoluciones () {
return $this -> devoluciones_total ;
}
2024-09-05 13:34:33 -03:00
2023-10-04 22:47:42 -03:00
public function getNotasDevoluciones () {
return $this -> devoluciones_notas ;
}
public function syncDevoluciones ( float $total , string $notas ) {
$this -> devoluciones_total = $total ;
$this -> devoluciones_notas = $notas ;
$this -> save ();
}
2021-12-30 13:12:14 -03:00
}