From bdd508220b7522b2340cc2642cf644ef7ef10c86 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 13 Mar 2026 08:31:43 +0700 Subject: [PATCH] feat: Add `dataChangeRequests` morph relation to `PartnerMedia`, `Company`, and `Journalist` models, refactor `CategoryNews` relationships, and pluralize `HasMany` method names. --- app/Models/Announcement.php | 2 +- app/Models/CategoryNews.php | 18 +++++++++++---- app/Models/Company.php | 46 +++++++++++++++++++++---------------- app/Models/Cooperation.php | 4 ++-- app/Models/Journalist.php | 23 +++++++++++++------ app/Models/News.php | 6 ++--- app/Models/PartnerMedia.php | 36 +++++++++++++++++------------ app/Models/User.php | 18 +++++++-------- 8 files changed, 91 insertions(+), 62 deletions(-) diff --git a/app/Models/Announcement.php b/app/Models/Announcement.php index e9ce28a..0bfb6d6 100644 --- a/app/Models/Announcement.php +++ b/app/Models/Announcement.php @@ -37,7 +37,7 @@ protected function company(Builder $query): void $query->where('type', AnnouncementType::COMPANY); } - public function announcementMedia(): HasMany + public function announcementMedias(): HasMany { return $this->hasMany(AnnouncementMedia::class); } diff --git a/app/Models/CategoryNews.php b/app/Models/CategoryNews.php index bfe4971..2202aa3 100644 --- a/app/Models/CategoryNews.php +++ b/app/Models/CategoryNews.php @@ -3,7 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Swindon\FilamentHashids\Traits\HasHashid; class CategoryNews extends Model @@ -12,13 +12,21 @@ class CategoryNews extends Model protected $guarded = ['id']; - public function category(): BelongsToMany + protected function casts(): array { - return $this->belongsToMany(Category::class); + return [ + 'category_id' => 'integer', + 'news_id' => 'integer', + ]; } - public function news(): BelongsToMany + public function category(): BelongsTo { - return $this->belongsToMany(News::class); + return $this->belongsTo(Category::class); + } + + public function news(): BelongsTo + { + return $this->belongsTo(News::class); } } diff --git a/app/Models/Company.php b/app/Models/Company.php index 789924a..3460fc5 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; @@ -25,26 +26,6 @@ protected function casts(): array ]; } - public function journalists(): HasManyThrough - { - return $this->hasManyThrough(Journalist::class, PartnerMedia::class); - } - - public function partnerMedia(): HasOne - { - return $this->hasOne(PartnerMedia::class); - } - - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - - public function verificationRequest(): HasOne - { - return $this->hasOne(VerificationRequest::class); - } - public static function dataChangeEntryLabels(): array { return [ @@ -70,4 +51,29 @@ public static function dataChangeEntryLabels(): array 'profile_docs' => 'Dokumen Profil Perusahaan', ]; } + + public function dataChangeRequests(): MorphMany + { + return $this->morphMany(DataChangeRequest::class, 'entity'); + } + + public function journalists(): HasManyThrough + { + return $this->hasManyThrough(Journalist::class, PartnerMedia::class); + } + + public function partnerMedia(): HasOne + { + return $this->hasOne(PartnerMedia::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function verificationRequest(): HasOne + { + return $this->hasOne(VerificationRequest::class); + } } diff --git a/app/Models/Cooperation.php b/app/Models/Cooperation.php index 8585c04..94f3a69 100644 --- a/app/Models/Cooperation.php +++ b/app/Models/Cooperation.php @@ -64,7 +64,7 @@ protected function completed(Builder $query): void $query->where('status', CooperationStatus::COMPLETED); } - public function cooperationMedia(): HasMany + public function cooperationMedias(): HasMany { return $this->hasMany(CooperationMedia::class); } @@ -87,7 +87,7 @@ public function payments(): HasManyThrough ); } - public function proposal(): HasMany + public function proposals(): HasMany { return $this->hasMany(CooperationProposal::class); } diff --git a/app/Models/Journalist.php b/app/Models/Journalist.php index a5e5b74..28102c0 100644 --- a/app/Models/Journalist.php +++ b/app/Models/Journalist.php @@ -3,9 +3,12 @@ namespace App\Models; use App\Enums\VerificationStatus; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; @@ -24,14 +27,10 @@ protected function casts(): array ]; } - public function partnerMedia(): BelongsTo + #[Scope] + public function pending(Builder $query): void { - return $this->belongsTo(PartnerMedia::class); - } - - public function scopePending($query) - { - return $query->where('status', VerificationStatus::PENDING); + $query->where('status', VerificationStatus::PENDING); } public static function dataChangeEntryLabels(): array @@ -46,4 +45,14 @@ public static function dataChangeEntryLabels(): array 'ukw_certificate_docs' => 'Dokumen Sertifikat UKW', ]; } + + public function dataChangeRequests(): MorphMany + { + return $this->morphMany(DataChangeRequest::class, 'entity'); + } + + public function partnerMedia(): BelongsTo + { + return $this->belongsTo(PartnerMedia::class); + } } diff --git a/app/Models/News.php b/app/Models/News.php index 123d7bf..423508d 100644 --- a/app/Models/News.php +++ b/app/Models/News.php @@ -26,10 +26,10 @@ class News extends Model implements HasMedia protected function casts(): array { return [ - 'views' => 'integer', - 'status' => NewsStatus::class, - 'published_at' => 'datetime', 'author_id' => 'integer', + 'published_at' => 'datetime', + 'status' => NewsStatus::class, + 'views' => 'integer', ]; } diff --git a/app/Models/PartnerMedia.php b/app/Models/PartnerMedia.php index d830db2..b6cfe3c 100644 --- a/app/Models/PartnerMedia.php +++ b/app/Models/PartnerMedia.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; @@ -58,6 +59,21 @@ protected function wherePivotPending(Builder $query): void $query->where('cooperation_media.status', ApprovalStatus::PENDING); } + public static function dataChangeEntryLabels(): array + { + return [ + 'name' => 'Nama', + 'link' => 'Tautan', + 'address' => 'Alamat', + 'type' => 'Jenis', + 'classification' => 'Klasifikasi', + 'journalism_organization' => 'No. Organisasi Kewartawanan', + 'journalism_organization_docs' => 'Dokumen Organisasi Kewartawanan', + 'press_council_certificate' => 'No. Sertifikat Dewan Pers', + 'press_council_certificate_docs' => 'Dokumen Sertifikat Dewan Pers', + ]; + } + public function announcementMedias(): HasMany { return $this->hasMany(AnnouncementMedia::class); @@ -91,6 +107,11 @@ public function cooperations(): BelongsToMany ->withTimestamps(); } + public function dataChangeRequests(): MorphMany + { + return $this->morphMany(DataChangeRequest::class, 'entity'); + } + public function journalists(): HasMany { return $this->hasMany(Journalist::class); @@ -108,19 +129,4 @@ public function taskAssignments(): BelongsToMany ->withPivot(['status']) ->withTimestamps(); } - - public static function dataChangeEntryLabels(): array - { - return [ - 'name' => 'Nama', - 'link' => 'Tautan', - 'address' => 'Alamat', - 'type' => 'Jenis', - 'classification' => 'Klasifikasi', - 'journalism_organization' => 'No. Organisasi Kewartawanan', - 'journalism_organization_docs' => 'Dokumen Organisasi Kewartawanan', - 'press_council_certificate' => 'No. Sertifikat Dewan Pers', - 'press_council_certificate_docs' => 'Dokumen Sertifikat Dewan Pers', - ]; - } } diff --git a/app/Models/User.php b/app/Models/User.php index 23f8067..0a44ca1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -36,15 +36,6 @@ protected function casts(): array ]; } - public function canAccessPanel(Panel $panel): bool - { - if ($this->company?->verificationRequest?->status === VerificationStatus::REJECTED) { - return false; - } - - return $this->is_active === IsActive::ACTIVE; - } - #[Scope] protected function withoutDeveloper(Builder $query): void { @@ -67,6 +58,15 @@ protected function superAdmin(Builder $query): void }); } + public function canAccessPanel(Panel $panel): bool + { + if ($this->company?->verificationRequest?->status === VerificationStatus::REJECTED) { + return false; + } + + return $this->is_active === IsActive::ACTIVE; + } + public function company(): HasOne { return $this->hasOne(Company::class);