*/ use HasFactory; use \Spatie\Activitylog\Traits\LogsActivity; protected $fillable = [ 'warehouse_id', 'product_id', 'quantity', 'safety_stock', 'location', ]; /** * Transient property to store the reason for the activity log (e.g., "Replenishment #123"). * This is not stored in the database column but used for logging context. * @var string|null */ public $activityLogReason; public function getActivitylogOptions(): \Spatie\Activitylog\LogOptions { return \Spatie\Activitylog\LogOptions::defaults() ->logAll() ->logOnlyDirty() ->dontSubmitEmptyLogs(); } public function tapActivity(\Spatie\Activitylog\Contracts\Activity $activity, string $eventName) { $properties = $activity->properties; $attributes = $properties['attributes'] ?? []; // Always snapshot names for context, even if IDs didn't change // $this refers to the Inventory model instance $attributes['warehouse_name'] = $this->warehouse ? $this->warehouse->name : ($attributes['warehouse_name'] ?? null); $attributes['product_name'] = $this->product ? $this->product->name : ($attributes['product_name'] ?? null); // Capture the reason if set if ($this->activityLogReason) { $attributes['_reason'] = $this->activityLogReason; } $properties['attributes'] = $attributes; $activity->properties = $properties; } public function warehouse(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Warehouse::class); } public function product(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Product::class); } public function transactions(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(InventoryTransaction::class); } public function lastOutgoingTransaction() { return $this->hasOne(InventoryTransaction::class)->ofMany([ 'actual_time' => 'max', 'id' => 'max', ], function ($query) { $query->where('quantity', '<', 0); }); } public function lastIncomingTransaction() { return $this->hasOne(InventoryTransaction::class)->ofMany([ 'actual_time' => 'max', 'id' => 'max', ], function ($query) { $query->where('quantity', '>', 0); }); } }