*/ use HasFactory; use SoftDeletes; protected $fillable = [ 'due_date', 'amount', 'note', 'action_id', 'user_id', 'decision_id', 'contract_id', 'client_case_id', ]; protected $hidden = [ 'action_id', 'decision_id', 'client_case_id', 'user_id', 'contract_id', ]; protected static function booted() { static::creating(function (Activity $activity) { if (! isset($activity->user_id)) { $activity->user_id = auth()->id(); } // If an activity with a due date is added for a contract, update the related account's promise_date if (! empty($activity->contract_id) && ! empty($activity->due_date)) { \App\Models\Account::query() ->where('contract_id', $activity->contract_id) ->update( ['promise_date' => $activity->due_date, 'updated_at' => now()], ); } }); static::created(function (Activity $activity) { if (! empty($activity->decision_id)) { event(new \App\Events\ActivityDecisionApplied($activity)); } }); } /** * Scope activities to those linked to contracts within a specific segment. */ #[Scope] public function scopeForSegment(Builder $query, int $segmentId, array $contractIds): Builder { return $query->where(function ($q) use ($contractIds) { $q->whereNull('contract_id'); if (! empty($contractIds)) { $q->orWhereIn('contract_id', $contractIds); } }); } /** * Scope activities with decoded base64 filters. */ #[Scope] public function scopeWithFilters(Builder $query, ?string $encodedFilters, \App\Models\ClientCase $clientCase): Builder { if (empty($encodedFilters)) { return $query; } try { $decompressed = base64_decode($encodedFilters); $filters = json_decode($decompressed, true); if (! is_array($filters)) { return $query; } if (! empty($filters['action_id'])) { $query->where('action_id', $filters['action_id']); } if (! empty($filters['contract_uuid'])) { $contract = $clientCase->contracts()->where('uuid', $filters['contract_uuid'])->first(['id']); if ($contract) { $query->where('contract_id', $contract->id); } } if (! empty($filters['user_id'])) { $query->where('user_id', $filters['user_id']); } if (! empty($filters['date_from'])) { $query->whereDate('created_at', '>=', $filters['date_from']); } if (! empty($filters['date_to'])) { $query->whereDate('created_at', '<=', $filters['date_to']); } } catch (\Throwable $e) { \Log::error('Invalid activity filter format', [ 'error' => $e->getMessage(), ]); } return $query; } public function action(): BelongsTo { return $this->belongsTo(\App\Models\Action::class); } public function decision(): BelongsTo { return $this->belongsTo(\App\Models\Decision::class); } public function clientCase(): BelongsTo { return $this->belongsTo(\App\Models\ClientCase::class); } public function contract(): ?BelongsTo { return $this->belongsTo(\App\Models\Contract::class); } public function user(): BelongsTo { return $this->belongsTo(\App\Models\User::class); } }