'Draft', 'requested' => 'Requested', 'received' => 'Received', 'approved' => 'Approved', 'postpone' => 'Postpone', 'paid' => 'Paid', 'declined' => 'Declined' ]; protected static function boot() { parent::boot(); static::creating(function ($model) { try { $model->code = (string) Str::orderedUuid(); // generate uuid } catch (\Exception $e) { abort(500, $e->getMessage()); } }); static::created(function ($model) { try { if (!empty($model->status)) { $model->statusHistories()->create([ 'status' => $model->status ]); } } catch (\Exception $e) { abort(500, $e->getMessage()); } }); static::updated(function ($model) { if ($model->hasChanges(['status'])) { $model->statusHistories()->create([ 'status' => $model->status ]); if ($model->status == 'requested') { ClaimRequested::dispatch($model); } if ($model->status == 'received') { ClaimReceived::dispatch($model); } if ($model->status == 'approved') { ClaimApproved::dispatch($model); } if ($model->status == 'postpone') { ClaimPostpone::dispatch($model); } if ($model->status == 'paid') { ClaimPaid::dispatch($model); } if ($model->status == 'declined') { ClaimDeclined::dispatch($model); } } }); } public function files() { return $this->morphMany(File::class, 'fileable'); } public function member() { return $this->belongsTo(Member::class, 'member_id'); } public function diagnoses() { return $this->hasMany(ClaimDiagnosis::class, 'claim_id'); } // TODO Remove this !, Sementara public function diagnosis() { return $this->hasOne(ClaimDiagnosis::class, 'claim_id')->ofMany([ 'id' => 'min', ], function ($query) { $query->where('type', 'primary'); }); } public function plan() { return $this->belongsTo(Plan::class, 'plan_id'); } public function benefit() { return $this->belongsTo(Benefit::class, 'benefit_id'); } public function statusHistories() { return $this->morphMany(StatusHistory::class, 'statusable'); } public function scopeUsed($query, $startDate, $endDate) { return $query ->whereIn('status', ['approved', 'paid']); // ->whereBetween('requested_at', [$startDate, $endDate]); } }