diff --git a/app/Enums/Channel.php b/app/Enums/Channel.php index f40b771..3221ffe 100644 --- a/app/Enums/Channel.php +++ b/app/Enums/Channel.php @@ -3,11 +3,11 @@ namespace App\Enums; use App\Traits\Enum\WithComment; -use App\Traits\Enum\WithValue; +use Filament\Support\Contracts\HasLabel; -enum Channel: string +enum Channel: string implements HasLabel { - use WithComment, WithValue; + use WithComment; case WEBSITE = 'Website'; case TIKTOK = 'Tiktok'; @@ -16,11 +16,22 @@ enum Channel: string case INSTAGRAM = 'Instagram'; case OTHER = 'Other'; + public function getLabel(): ?string + { + return match ($this) { + self::WEBSITE => 'Website', + self::TIKTOK => 'Tiktok', + self::YOUTUBE => 'Youtube', + self::FACEBOOK => 'Facebook', + self::INSTAGRAM => 'Instagram', + self::OTHER => 'Other', + }; + } + public static function options(): array { - return array_combine( - array_map(fn ($status) => $status->value, self::cases()), - array_map(fn ($status) => $status->value, self::cases()) - ); + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); } } diff --git a/app/Enums/ContentType.php b/app/Enums/ContentType.php index 7ca952a..98ca33e 100644 --- a/app/Enums/ContentType.php +++ b/app/Enums/ContentType.php @@ -2,22 +2,33 @@ namespace App\Enums; +use App\Traits\Enum\WithComment; use App\Traits\Enum\WithValue; +use Filament\Support\Contracts\HasLabel; -enum ContentType: string +enum ContentType: string implements HasLabel { - use WithValue; + use WithComment, WithValue; case FOTO = 'Foto'; case TEXT = 'Teks'; case GRAPHIC = 'Grafis'; case VIDEO = 'Video'; + public function getLabel(): ?string + { + return match ($this) { + self::FOTO => 'Foto', + self::TEXT => 'Teks', + self::GRAPHIC => 'Grafis', + self::VIDEO => 'Video', + }; + } + public static function options(): array { - return array_combine( - array_map(fn ($status) => $status->value, self::cases()), - array_map(fn ($status) => $status->value, self::cases()) - ); + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); } } diff --git a/app/Enums/IsActive.php b/app/Enums/IsActive.php index 7babbbb..a2a6ba4 100644 --- a/app/Enums/IsActive.php +++ b/app/Enums/IsActive.php @@ -4,15 +4,17 @@ use App\Traits\Enum\WithComment; use App\Traits\Enum\WithValue; +use Filament\Support\Contracts\HasColor; +use Filament\Support\Contracts\HasLabel; -enum IsActive: int +enum IsActive: int implements HasColor, HasLabel { use WithComment, WithValue; case ACTIVE = 1; case INACTIVE = 2; - public function label() + public function getLabel(): ?string { return match ($this) { self::ACTIVE => 'Aktif', @@ -20,11 +22,18 @@ public function label() }; } - public function color() + public function getColor(): string|array|null { return match ($this) { self::ACTIVE => 'success', self::INACTIVE => 'danger', }; } + + public static function options(): array + { + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); + } } diff --git a/app/Enums/IssueSentiment.php b/app/Enums/IssueSentiment.php new file mode 100644 index 0000000..030b8ff --- /dev/null +++ b/app/Enums/IssueSentiment.php @@ -0,0 +1,46 @@ + 'Positif', + self::NEGATIVE => 'Negatif', + self::NEUTRAL => 'Netral', + self::CRISIS => 'Krisis', + }; + } + + public function getColor(): string|array|null + { + return match ($this) { + self::POSITIVE => Color::Green, + self::NEGATIVE => Color::Red, + self::NEUTRAL => Color::Gray, + self::CRISIS => Color::Orange, + }; + } + + public static function options(): array + { + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); + } +} diff --git a/app/Enums/MediaClassification.php b/app/Enums/MediaClassification.php index f069a6a..6555a27 100644 --- a/app/Enums/MediaClassification.php +++ b/app/Enums/MediaClassification.php @@ -4,8 +4,9 @@ use App\Traits\Enum\WithComment; use App\Traits\Enum\WithValue; +use Filament\Support\Contracts\HasLabel; -enum MediaClassification: int +enum MediaClassification: int implements HasLabel { use WithComment, WithValue; @@ -13,7 +14,7 @@ enum MediaClassification: int case REGIONAL = 2; case NATIONAL = 3; - public function label() + public function getLabel(): ?string { return match ($this) { self::LOCAL => 'Lokal', @@ -24,9 +25,8 @@ public function label() public static function options(): array { - return array_combine( - array_map(fn ($status) => $status->value, self::cases()), - array_map(fn ($status) => $status->label(), self::cases()) - ); + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); } } diff --git a/app/Enums/MediaType.php b/app/Enums/MediaType.php index 03faf0f..8bf625b 100644 --- a/app/Enums/MediaType.php +++ b/app/Enums/MediaType.php @@ -4,8 +4,9 @@ use App\Traits\Enum\WithComment; use App\Traits\Enum\WithValue; +use Filament\Support\Contracts\HasLabel; -enum MediaType: int +enum MediaType: int implements HasLabel { use WithComment, WithValue; @@ -14,7 +15,7 @@ enum MediaType: int case RADIO = 3; case TELEVISION = 4; - public function label() + public function getLabel(): ?string { return match ($this) { self::ONLINE => 'Online', @@ -26,9 +27,8 @@ public function label() public static function options(): array { - return array_combine( - array_map(fn ($status) => $status->value, self::cases()), - array_map(fn ($status) => $status->label(), self::cases()) - ); + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); } } diff --git a/app/Enums/SocialMedia.php b/app/Enums/SocialMedia.php index 2b81ff9..b11c3dd 100644 --- a/app/Enums/SocialMedia.php +++ b/app/Enums/SocialMedia.php @@ -2,21 +2,30 @@ namespace App\Enums; -use App\Traits\Enum\WithValue; +use App\Traits\Enum\WithComment; +use Filament\Support\Contracts\HasLabel; -enum SocialMedia: string +enum SocialMedia: string implements HasLabel { - use WithValue; + use WithComment; case PPID_DISKOMINFO_PURWAKARTA = 'PPID Diskominfo Purwakarta'; case DISKOMINFO_PURWAKARTA = 'Diskominfo Purwakarta'; case PURWAKARTA_SABER_HOAKS = 'Purwakarta Saber Hoaks'; + public function getLabel(): ?string + { + return match ($this) { + self::PPID_DISKOMINFO_PURWAKARTA => 'PPID Diskominfo Purwakarta', + self::DISKOMINFO_PURWAKARTA => 'Diskominfo Purwakarta', + self::PURWAKARTA_SABER_HOAKS => 'Purwakarta Saber Hoaks', + }; + } + public static function options(): array { - return array_combine( - array_map(fn ($status) => $status->value, self::cases()), - array_map(fn ($status) => $status->value, self::cases()) - ); + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); } } diff --git a/app/Filament/Resources/Master/Classifications/ClassificationResource.php b/app/Filament/Resources/Master/Classifications/ClassificationResource.php index 93386de..60f938e 100644 --- a/app/Filament/Resources/Master/Classifications/ClassificationResource.php +++ b/app/Filament/Resources/Master/Classifications/ClassificationResource.php @@ -13,7 +13,6 @@ use Filament\Actions\EditAction; use Filament\Actions\ForceDeleteAction; use Filament\Actions\RestoreAction; -use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; use Filament\Schemas\Schema; @@ -53,11 +52,6 @@ public static function form(Schema $schema): Schema ->autofocus() ->required() ->maxLength(50), - - RichEditor::make('description') - ->label('Keterangan') - ->placeholder('Silakan isi keterangan klasifikasi di atas') - ->nullable(), ]) ->columns(1); } diff --git a/app/Filament/Resources/Master/Locations/LocationResource.php b/app/Filament/Resources/Master/Locations/LocationResource.php index b579bfa..f2b4119 100644 --- a/app/Filament/Resources/Master/Locations/LocationResource.php +++ b/app/Filament/Resources/Master/Locations/LocationResource.php @@ -13,7 +13,6 @@ use Filament\Actions\EditAction; use Filament\Actions\ForceDeleteAction; use Filament\Actions\RestoreAction; -use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; use Filament\Schemas\Schema; @@ -53,11 +52,6 @@ public static function form(Schema $schema): Schema ->autofocus() ->required() ->maxLength(50), - - RichEditor::make('description') - ->label('Keterangan') - ->placeholder('Silakan isi keterangan lokasi di atas') - ->nullable(), ]) ->columns(1); } diff --git a/app/Filament/Resources/Master/SubClassifications/SubClassificationResource.php b/app/Filament/Resources/Master/SubClassifications/SubClassificationResource.php index 55731b9..ee4f1f2 100644 --- a/app/Filament/Resources/Master/SubClassifications/SubClassificationResource.php +++ b/app/Filament/Resources/Master/SubClassifications/SubClassificationResource.php @@ -14,7 +14,6 @@ use Filament\Actions\EditAction; use Filament\Actions\ForceDeleteAction; use Filament\Actions\RestoreAction; -use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; @@ -42,7 +41,7 @@ class SubClassificationResource extends Resource protected static ?string $recordTitleAttribute = 'name'; - protected static ?int $navigationSort = 1; + protected static ?int $navigationSort = 2; public static function form(Schema $schema): Schema { @@ -50,7 +49,7 @@ public static function form(Schema $schema): Schema ->components([ Select::make('classification_id') ->label('Klasifikasi') - ->options(Classification::query()->pluck('name', 'id')) + ->options(Classification::query()->active()->pluck('name', 'id')) ->searchable() ->native(false) ->required() @@ -58,16 +57,11 @@ public static function form(Schema $schema): Schema TextInput::make('name') ->label('Nama') - ->placeholder('Nagrikaler') + ->placeholder('Korupsi') ->autocomplete(false) ->autofocus() ->required() ->maxLength(50), - - RichEditor::make('description') - ->label('Keterangan') - ->placeholder('Silakan isi keterangan sub klasifikasi di atas') - ->nullable(), ]) ->columns(1); } diff --git a/app/Filament/Resources/Master/SubLocations/SubLocationResource.php b/app/Filament/Resources/Master/SubLocations/SubLocationResource.php index e36b87a..2d8ffa0 100644 --- a/app/Filament/Resources/Master/SubLocations/SubLocationResource.php +++ b/app/Filament/Resources/Master/SubLocations/SubLocationResource.php @@ -14,7 +14,6 @@ use Filament\Actions\EditAction; use Filament\Actions\ForceDeleteAction; use Filament\Actions\RestoreAction; -use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; @@ -58,16 +57,11 @@ public static function form(Schema $schema): Schema TextInput::make('name') ->label('Nama') - ->placeholder('Pengaduan') + ->placeholder('Nagri Kaler') ->autocomplete(false) ->autofocus() ->required() ->maxLength(50), - - RichEditor::make('description') - ->label('Keterangan') - ->placeholder('Silakan isi keterangan sub lokasi di atas') - ->nullable(), ]) ->columns(1); } diff --git a/app/Filament/Resources/Monitoring/ContentRecaps/Schemas/ContentRecapForm.php b/app/Filament/Resources/Monitoring/ContentRecaps/Schemas/ContentRecapForm.php index 6f87923..5640933 100644 --- a/app/Filament/Resources/Monitoring/ContentRecaps/Schemas/ContentRecapForm.php +++ b/app/Filament/Resources/Monitoring/ContentRecaps/Schemas/ContentRecapForm.php @@ -71,7 +71,7 @@ public static function configure(Schema $schema): Schema Section::make([ Select::make('classification_id') ->label('Klasifikasi') - ->relationship('classification', 'name') + ->relationship('classification', 'name', fn ($query) => $query->active()) ->native(false) ->preload() ->required(), diff --git a/app/Filament/Resources/Monitoring/IssueManagements/IssueManagementResource.php b/app/Filament/Resources/Monitoring/IssueManagements/IssueManagementResource.php new file mode 100644 index 0000000..83fe79d --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/IssueManagementResource.php @@ -0,0 +1,62 @@ + ListIssueManagements::route('/'), + 'create' => CreateIssueManagement::route('/create'), + 'edit' => EditIssueManagement::route('/{record}/edit'), + ]; + } + + public static function getRecordRouteBindingEloquentQuery(): Builder + { + return parent::getRecordRouteBindingEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/Monitoring/IssueManagements/Pages/CreateIssueManagement.php b/app/Filament/Resources/Monitoring/IssueManagements/Pages/CreateIssueManagement.php new file mode 100644 index 0000000..0aa2b6a --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/Pages/CreateIssueManagement.php @@ -0,0 +1,30 @@ +getResource()::getUrl('index'); + } + + protected function getHeaderActions(): array + { + return [ + Action::make('back') + ->label('Kembali') + ->url(fn (): string => route('filament.dashboard.resources.monitoring.issue-managements.index')) + ->outlined() + ->color('secondary'), + ]; + } +} diff --git a/app/Filament/Resources/Monitoring/IssueManagements/Pages/EditIssueManagement.php b/app/Filament/Resources/Monitoring/IssueManagements/Pages/EditIssueManagement.php new file mode 100644 index 0000000..f722238 --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/Pages/EditIssueManagement.php @@ -0,0 +1,28 @@ +label('Kembali') + ->url(fn (): string => route('filament.dashboard.resources.monitoring.issue-managements.index')) + ->outlined() + ->color('secondary'), + ]; + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('index'); + } +} diff --git a/app/Filament/Resources/Monitoring/IssueManagements/Pages/ListIssueManagements.php b/app/Filament/Resources/Monitoring/IssueManagements/Pages/ListIssueManagements.php new file mode 100644 index 0000000..4c3a196 --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/Pages/ListIssueManagements.php @@ -0,0 +1,22 @@ +label('Tambah'), + ]; + } +} diff --git a/app/Filament/Resources/Monitoring/IssueManagements/Schemas/IssueManagementForm.php b/app/Filament/Resources/Monitoring/IssueManagements/Schemas/IssueManagementForm.php new file mode 100644 index 0000000..d58dd60 --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/Schemas/IssueManagementForm.php @@ -0,0 +1,88 @@ +components([ + Section::make([ + Select::make('media_monitoring_id') + ->label('Monitoring Media') + ->relationship('mediaMonitoring', 'title') + ->searchable() + ->preload() + ->required(), + + Grid::make(2) + ->schema([ + Select::make('location_id') + ->label('Lokasi') + ->relationship('location', 'name') + ->searchable() + ->preload() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('sub_location_id', null)) + ->required(), + + Select::make('sub_location_id') + ->label('Sub Lokasi') + ->relationship('subLocation', 'name', fn (Builder $query, Get $get) => $query->where('location_id', $get('location_id'))) + ->searchable() + ->preload() + ->required(), + ]), + + RichEditor::make('description') + ->label('Keterangan') + ->required() + ->columnSpanFull(), + ])->columnSpan(2), + + Section::make([ + Select::make('issue') + ->label('Isu') + ->options(IssueSentiment::options()) + ->required() + ->native(false) + ->in(implode(',', array_column(IssueSentiment::cases(), 'value'))), + + Select::make('response') + ->label('Respon') + ->options(IssueSentiment::options()) + ->required() + ->native(false) + ->in(implode(',', array_column(IssueSentiment::cases(), 'value'))), + + Select::make('classification_id') + ->label('Klasifikasi') + ->relationship('classification', 'name', fn ($query) => $query->active()) + ->searchable() + ->preload() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('sub_classification_id', null)) + ->required(), + + Select::make('sub_classification_id') + ->label('Sub Klasifikasi') + ->relationship('subClassification', 'name', fn (Builder $query, Get $get) => $query->where('classification_id', $get('classification_id'))->active()) + ->searchable() + ->preload() + ->required(), + ])->columnSpan(1), + ]) + ->columns(3); + } +} diff --git a/app/Filament/Resources/Monitoring/IssueManagements/Tables/IssueManagementTable.php b/app/Filament/Resources/Monitoring/IssueManagements/Tables/IssueManagementTable.php new file mode 100644 index 0000000..1a8d540 --- /dev/null +++ b/app/Filament/Resources/Monitoring/IssueManagements/Tables/IssueManagementTable.php @@ -0,0 +1,80 @@ +columns([ + TextColumn::make('mediaMonitoring.title') + ->label('Judul Berita') + ->limit(30) + ->searchable() + ->sortable(), + + TextColumn::make('issue') + ->label('Isu') + ->badge() + ->searchable() + ->sortable(), + + TextColumn::make('response') + ->label('Respon') + ->badge() + ->searchable() + ->sortable(), + + TextColumn::make('location.name') + ->label('Lokasi') + ->searchable() + ->sortable(), + + TextColumn::make('classification.name') + ->label('Klasifikasi') + ->searchable() + ->sortable(), + + ...TimestampColumns::make(), + ]) + ->filters([ + TrashedFilter::make()->native(false), + SelectFilter::make('issue') + ->label('Filter Isu') + ->options(\App\Enums\IssueSentiment::class) + ->native(false), + SelectFilter::make('response') + ->label('Filter Respon') + ->options(\App\Enums\IssueSentiment::class) + ->native(false), + ]) + ->recordActions([ + EditAction::make(), + DeleteAction::make(), + RestoreAction::make(), + ForceDeleteAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + ...DefaultBulkActions::make('Manajemen Isu'), + ]), + ]) + ->emptyStateIcon('heroicon-o-bookmark') + ->emptyStateDescription('Setelah Anda membubat data pertama, maka akan muncul disini.') + ->defaultSort('created_at', 'desc') + ->deferFilters(false); + } +} diff --git a/app/Filament/Resources/Monitoring/MediaMonitorings/Schemas/MediaMonitoringForm.php b/app/Filament/Resources/Monitoring/MediaMonitorings/Schemas/MediaMonitoringForm.php index 219b086..c8b3c33 100644 --- a/app/Filament/Resources/Monitoring/MediaMonitorings/Schemas/MediaMonitoringForm.php +++ b/app/Filament/Resources/Monitoring/MediaMonitorings/Schemas/MediaMonitoringForm.php @@ -80,7 +80,7 @@ public static function configure(Schema $schema): Schema Select::make('themes') ->label('Tema') - ->relationship('themes', 'name') + ->relationship('themes', 'name', fn ($query) => $query->active()) ->native(false) ->multiple() ->preload() diff --git a/app/Filament/Resources/Monitoring/MediaMonitorings/Tables/MediaMonitoringsTable.php b/app/Filament/Resources/Monitoring/MediaMonitorings/Tables/MediaMonitoringsTable.php index ccb2660..b6a279f 100644 --- a/app/Filament/Resources/Monitoring/MediaMonitorings/Tables/MediaMonitoringsTable.php +++ b/app/Filament/Resources/Monitoring/MediaMonitorings/Tables/MediaMonitoringsTable.php @@ -31,9 +31,9 @@ public static function configure(Table $table): Table TextColumn::make('title') ->label('Judul') + ->limit(30) ->searchable() - ->sortable() - ->wrap(), + ->sortable(), TextColumn::make('channel') ->label('Kanal') diff --git a/app/Models/Classification.php b/app/Models/Classification.php index b773bdb..edbff35 100644 --- a/app/Models/Classification.php +++ b/app/Models/Classification.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\IsActive; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; @@ -21,6 +23,18 @@ protected function casts(): array ]; } + #[Scope] + protected function active(Builder $query): void + { + $query->where('is_active', IsActive::ACTIVE); + } + + #[Scope] + protected function inactive(Builder $query): void + { + $query->where('is_active', IsActive::INACTIVE); + } + public function subClassifications(): HasMany { return $this->hasMany(SubClassification::class); diff --git a/app/Models/IssueManagement.php b/app/Models/IssueManagement.php new file mode 100644 index 0000000..2006ce8 --- /dev/null +++ b/app/Models/IssueManagement.php @@ -0,0 +1,49 @@ + IssueSentiment::class, + 'response' => IssueSentiment::class, + ]; + } + + public function location(): BelongsTo + { + return $this->belongsTo(Location::class); + } + + public function subLocation(): BelongsTo + { + return $this->belongsTo(SubLocation::class); + } + + public function classification(): BelongsTo + { + return $this->belongsTo(Classification::class); + } + + public function subClassification(): BelongsTo + { + return $this->belongsTo(SubClassification::class); + } + + public function mediaMonitoring(): BelongsTo + { + return $this->belongsTo(MediaMonitoring::class); + } +} diff --git a/app/Models/MediaMonitoring.php b/app/Models/MediaMonitoring.php index a45d51e..020c8f8 100644 --- a/app/Models/MediaMonitoring.php +++ b/app/Models/MediaMonitoring.php @@ -4,6 +4,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; @@ -18,4 +19,9 @@ public function themes(): BelongsToMany { return $this->belongsToMany(Theme::class); } + + public function issueManagement(): HasOne + { + return $this->hasOne(IssueManagement::class); + } } diff --git a/app/Models/SubClassification.php b/app/Models/SubClassification.php index 719409e..c246eba 100644 --- a/app/Models/SubClassification.php +++ b/app/Models/SubClassification.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\IsActive; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; @@ -21,6 +23,18 @@ protected function casts(): array ]; } + #[Scope] + protected function active(Builder $query): void + { + $query->where('is_active', IsActive::ACTIVE); + } + + #[Scope] + protected function inactive(Builder $query): void + { + $query->where('is_active', IsActive::INACTIVE); + } + public function classification(): BelongsTo { return $this->belongsTo(Classification::class); diff --git a/app/Models/Theme.php b/app/Models/Theme.php index 22cde9a..62185bf 100644 --- a/app/Models/Theme.php +++ b/app/Models/Theme.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\IsActive; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\SoftDeletes; @@ -21,6 +23,18 @@ protected function casts(): array ]; } + #[Scope] + protected function active(Builder $query): void + { + $query->where('is_active', IsActive::ACTIVE); + } + + #[Scope] + protected function inactive(Builder $query): void + { + $query->where('is_active', IsActive::INACTIVE); + } + public function mediaMonitorings(): BelongsToMany { return $this->belongsToMany(MediaMonitoring::class); diff --git a/app/Traits/Enum/WithComment.php b/app/Traits/Enum/WithComment.php index d4bf58a..9affe15 100644 --- a/app/Traits/Enum/WithComment.php +++ b/app/Traits/Enum/WithComment.php @@ -6,6 +6,6 @@ trait WithComment { public static function comment(): string { - return implode(', ', array_map(fn ($case) => "{$case->value}: {$case->label()}", self::cases())); + return implode(', ', array_map(fn ($case) => "{$case->value}: {$case->getLabel()}", self::cases())); } } diff --git a/database/migrations/2025_12_10_144144_create_issue_management_table.php b/database/migrations/2025_12_10_144144_create_issue_management_table.php new file mode 100644 index 0000000..ba13b7f --- /dev/null +++ b/database/migrations/2025_12_10_144144_create_issue_management_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignIdFor(Location::class)->constrained()->cascadeOnDelete(); + $table->foreignIdFor(SubLocation::class)->nullable()->constrained()->nullOnDelete(); + $table->foreignIdFor(Classification::class)->constrained()->cascadeOnDelete(); + $table->foreignIdFor(SubClassification::class)->nullable()->constrained()->nullOnDelete(); + $table->foreignIdFor(MediaMonitoring::class)->constrained()->cascadeOnDelete(); + $table->enum('issue', [IssueSentiment::values()])->comment(IssueSentiment::comment()); + $table->enum('response', [IssueSentiment::values()])->comment(IssueSentiment::comment()); + $table->text('description'); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('issue_management'); + } +};