*/ protected $fillable = [ 'nombre', 'pagado', 'terminado' ]; /** * El barrio al que pertenece el pedido. */ public function barrio(): BelongsTo { return $this->belongsTo(Barrio::class); } function togglePagado() : bool { $this->pagado = !$this->pagado; $this->save(); return $this->pagado; } function toggleTerminado() : bool { $this->terminado = !$this->terminado; $this->save(); return $this->terminado; } /** * Los productos que pertenecen al pedido. */ public function productos(): BelongsToMany { return $this->belongsToMany(Producto::class)->withPivot(['cantidad']); } function agregarProducto(Producto $producto, int $cantidad) { $productoEnChismosa = $this->productos()->where('id', $producto->id)->first(); if ($productoEnChismosa) { $productoEnChismosa->pivot->cantidad += $cantidad; $productoEnChismosa->save(); return $productoEnChismosa; } else { $this->productos()->attach($producto, ['cantidad' => $cantidad]); return $this->productos()->where('id', $producto->id)->first(); } } function quitarProducto(Producto $producto) { $this->productos()->detach($producto); } /** * El total de los productos del pedido * sumado al total de los bonos de transporte */ function totalChismosa() : float { return $this->totalProductos() + $this->totalTransporte(); } /** * 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 totalProductos($productos = null) : float { if (!$productos) $productos = $this->productos(); return $productos->sum(fn($p) => $p->price * $p->pivot->cantidad); } /** * El total de bonos de transporte del pedido */ function totalBonosDeTransporte() : int { return TransporteUtils::calcularTotal($this->productosConTransporte()); } function totalATransferir() : float { $productos = $this->productos()->where(['bono' => false, 'barrial' => false])->get(); return $this->totalProductos($productos); } }