2024-03-11 19:41:52 -03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Models;
|
|
|
|
|
2024-03-19 22:13:49 -03:00
|
|
|
use App\Constants;
|
|
|
|
|
2024-03-19 15:40:27 -03:00
|
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
2024-03-11 19:41:52 -03:00
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
|
|
|
|
class Pedido extends Model
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* The attributes that are mass assignable.
|
|
|
|
*
|
|
|
|
* @var array<int, string>
|
|
|
|
*/
|
|
|
|
protected $fillable = [
|
2024-03-19 22:13:49 -03:00
|
|
|
'name', 'confirmed'
|
2024-03-11 19:41:52 -03:00
|
|
|
];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* El barrio al que pertenece el pedido.
|
|
|
|
*/
|
2024-03-19 22:13:49 -03:00
|
|
|
public function barrio(): BelongsTo {
|
2024-03-11 19:41:52 -03:00
|
|
|
return $this->belongsTo(Barrio::class);
|
|
|
|
}
|
|
|
|
|
2024-03-11 19:55:35 -03:00
|
|
|
/**
|
|
|
|
* Los productos que pertenecen al pedido.
|
|
|
|
*/
|
2024-03-19 22:13:49 -03:00
|
|
|
public function productos(): BelongsToMany {
|
2024-03-19 15:40:27 -03:00
|
|
|
return $this->belongsToMany(Producto::class)->withPivot(['cantidad']);
|
|
|
|
}
|
|
|
|
|
2024-03-19 22:13:49 -03:00
|
|
|
/**
|
|
|
|
* Los productos del pedido que no aportan para el
|
|
|
|
* bono de transporte
|
|
|
|
*/
|
|
|
|
function productosSinTransporte() {
|
|
|
|
return $this->productos()->orWhere(['bono' => true, 'barrial' => true]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Los productos del pedido que aportan para el
|
|
|
|
* bono de transporte.
|
|
|
|
*/
|
|
|
|
function productosConTransporte() {
|
|
|
|
return $this->productos()->where(['bono' => false, 'barrial' => false]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Los productos no barriales del pedido.
|
|
|
|
*/
|
|
|
|
function productosNoBarriales() {
|
|
|
|
return $this->productos()->where('barrial',false);
|
2024-03-19 15:40:27 -03:00
|
|
|
}
|
|
|
|
|
2024-03-19 22:13:49 -03:00
|
|
|
/**
|
|
|
|
* Los bonos del pedido.
|
|
|
|
*/
|
2024-03-19 15:40:27 -03:00
|
|
|
function bonos() {
|
2024-03-19 22:13:49 -03:00
|
|
|
return $this->productos()->where('bono',true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Toma como parámetro una colección de productos
|
|
|
|
* y devuelve la suma de los totales (precio * cantidad)
|
|
|
|
* de cada uno.
|
|
|
|
*
|
|
|
|
* Si la colección es null o no se pasa ningún parámetro
|
|
|
|
* se toman todos los productos del pedido.
|
|
|
|
*/
|
|
|
|
function total($productos = null) : float {
|
|
|
|
if (!$productos)
|
|
|
|
$productos = $this->productos();
|
|
|
|
|
|
|
|
return $productos->sum(fn($p) => $p->price * $p->pivot->cantidad);
|
2024-03-19 15:40:27 -03:00
|
|
|
}
|
|
|
|
|
2024-03-19 22:13:49 -03:00
|
|
|
/**
|
|
|
|
* El total de bonos de transporte del pedido
|
|
|
|
*/
|
|
|
|
function totalTransporte() : int {
|
|
|
|
if ($this->productos()->every(fn($prod) => !$prod->pagaTransporte()))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
$cantidad = 1 + floor($this->total($this->productosConTransporte()) / Constants::DIVISOR_TRANSPORTE);
|
|
|
|
return $cantidad * Constants::COSTO_TRANSPORTE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* El total de los productos del pedido
|
|
|
|
* sumado al total de los bonos de transporte
|
|
|
|
*/
|
|
|
|
function totalChismosa() : float {
|
|
|
|
return $this->total() + $this->totalTransporte();
|
2024-03-11 19:55:35 -03:00
|
|
|
}
|
2024-03-19 22:34:40 -03:00
|
|
|
|
|
|
|
function toggleConfirm() : bool {
|
|
|
|
$this->confirmed = !$this->confirmed;
|
|
|
|
$this->save();
|
|
|
|
return $this->confirmed;
|
|
|
|
}
|
|
|
|
|
|
|
|
function agregarProducto(Producto $producto, int $cantidad) {
|
|
|
|
$productoEnChismosa = $this->productos()->where('id', $producto->id)->first();
|
|
|
|
if ($productoEnChismosa) {
|
|
|
|
$productoEnChismosa->pivot->cantidad += $cantidad;
|
|
|
|
$productoEnChismosa->save();
|
|
|
|
} else {
|
|
|
|
$this->productos()->attach($producto, ['cantidad' => $cantidad]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function quitarProducto(Producto $producto) {
|
|
|
|
$this->productos()->detach($producto);
|
|
|
|
}
|
2024-03-11 19:41:52 -03:00
|
|
|
}
|