mirror of
https://github.com/snipe/snipe-it.git
synced 2026-08-18 11:15:42 +00:00
Accessories can now be flagged as requestable and requested by users from the requestable items page, the same way assets and asset models already can. No migration is needed since the accessories table already carries a requestable column. I kept the semantics deliberately simple: a request just records intent (and the requested quantity) and notifies the admins. It does not touch or reserve stock. The admin still performs the normal checkout, which is what actually decrements quantity. That way requests behave the same for unique assets and for quantity-based accessories, instead of inventing a separate "reserved" state. The admin "Requested" queue already lists every checkout request polymorphically (it showed asset models too), so accessory requests appear there as well; I extended that view to render the accessory name, image and a checkout action so an admin can actually see and fulfil the request. While wiring this up I also fixed a pre-existing bug in the request flow: the Requestable trait saved a 'qty' key, but the column is 'quantity' and wasn't fillable, so requested quantities were being silently dropped (this affected asset models too). Quantity is now persisted and read back correctly. Components and licenses can follow the same pattern; they each just need a small migration to add the requestable column.
57 lines
1.2 KiB
PHP
57 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
|
|
class CheckoutRequest extends Model
|
|
{
|
|
use HasFactory;
|
|
use SoftDeletes;
|
|
|
|
protected $fillable = ['user_id', 'quantity'];
|
|
|
|
protected $table = 'checkout_requests';
|
|
|
|
public function user()
|
|
{
|
|
return $this->belongsTo(User::class, 'user_id', 'id');
|
|
}
|
|
|
|
public function requestingUser()
|
|
{
|
|
return $this->user()->withTrashed()->first();
|
|
}
|
|
|
|
public function requestedItem()
|
|
{
|
|
return $this->morphTo('requestable');
|
|
}
|
|
|
|
public function itemRequested() // Workaround for laravel polymorphic issue that's not being solved :(
|
|
{
|
|
return $this->requestedItem()->first();
|
|
}
|
|
|
|
public function itemType()
|
|
{
|
|
return snake_case(class_basename($this->requestable_type));
|
|
}
|
|
|
|
public function location()
|
|
{
|
|
return $this->itemRequested()->location;
|
|
}
|
|
|
|
public function name()
|
|
{
|
|
if ($this->itemType() == 'asset') {
|
|
return $this->itemRequested()->display_name;
|
|
}
|
|
|
|
return $this->itemRequested()->name;
|
|
}
|
|
}
|