diff --git a/app/Enums/IsActive.php b/app/Enums/IsActive.php new file mode 100644 index 0000000..1021804 --- /dev/null +++ b/app/Enums/IsActive.php @@ -0,0 +1,28 @@ + 'Aktif', + self::Inactive => 'Tidak Aktif', + }; + } + + public function getColor(): string|array|null + { + return match ($this) { + self::Active => 'success', + self::Inactive => 'danger', + }; + } +} diff --git a/app/Enums/Sex.php b/app/Enums/Sex.php new file mode 100644 index 0000000..022c6d0 --- /dev/null +++ b/app/Enums/Sex.php @@ -0,0 +1,28 @@ + 'Laki-laki', + self::Female => 'Perempuan', + }; + } + + public function getColor(): string|array|null + { + return match ($this) { + self::Male => 'info', + self::Female => 'danger', + }; + } +} diff --git a/app/Models/Student.php b/app/Models/Student.php new file mode 100644 index 0000000..da1f04d --- /dev/null +++ b/app/Models/Student.php @@ -0,0 +1,43 @@ + 'date', + 'sex' => Sex::class, + ]; + } + + #[Scope] + protected function male(Builder $query): void + { + $query->where('sex', Sex::Male); + } + + #[Scope] + protected function female(Builder $query): void + { + $query->where('sex', Sex::Female); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 5a94f99..4fe23a5 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,50 +2,64 @@ namespace App\Models; -// use Illuminate\Contracts\Auth\MustVerifyEmail; +use App\Enums\IsActive; +use Filament\Models\Contracts\FilamentUser; +use Filament\Panel; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Saade\FilamentFacehash\Concerns\HasFacehashAvatar; -class User extends Authenticatable +class User extends Authenticatable implements FilamentUser { - use HasFacehashAvatar; - /** @use HasFactory<\Database\Factories\UserFactory> */ - use HasFactory, Notifiable; + use HasFacehashAvatar, HasFactory, Notifiable, SoftDeletes; - /** - * The attributes that are mass assignable. - * - * @var list - */ - protected $fillable = [ - 'name', - 'email', - 'password', - ]; + protected $guarded = ['id']; - /** - * The attributes that should be hidden for serialization. - * - * @var list - */ protected $hidden = [ 'password', - 'remember_token', ]; - /** - * Get the attributes that should be cast. - * - * @return array - */ protected function casts(): array { return [ - 'email_verified_at' => 'datetime', + 'is_active' => IsActive::class, 'password' => 'hashed', ]; } + + #[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 canAccessPanel(Panel $panel): bool + { + return true; + } + + protected function name(): Attribute + { + return Attribute::make( + get: fn () => $this->student?->full_name + ); + } + + public function student(): HasOne + { + return $this->hasOne(Student::class); + } } diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 05fb5d9..cffa450 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -1,5 +1,6 @@ id(); - $table->string('name'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); - $table->rememberToken(); - $table->timestamps(); + $table->string('email', 254)->unique(); + $table->string('username', 20)->unique(); + $table->string('password', 60); + $table->enum('is_active', IsActive::cases())->default(IsActive::Active); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); + $table->softDeletes(); }); Schema::create('password_reset_tokens', function (Blueprint $table) { diff --git a/database/migrations/2026_02_25_024501_create_students_table.php b/database/migrations/2026_02_25_024501_create_students_table.php new file mode 100644 index 0000000..36eaada --- /dev/null +++ b/database/migrations/2026_02_25_024501_create_students_table.php @@ -0,0 +1,38 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('full_name', 100); + $table->string('student_number', 10)->unique(); + $table->string('phone_number', 20); + $table->enum('sex', Sex::cases()); + $table->text('address'); + $table->date('date_of_birth'); + $table->string('place_of_birth', 50); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('students'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6b901f8..b9c7377 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,7 +2,6 @@ namespace Database\Seeders; -use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -15,11 +14,8 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // User::factory(10)->create(); - - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + $this->call([ + UserSeeder::class, ]); } } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..1820f23 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,35 @@ + 'info.pangestuyoga@gmail.com', + 'username' => 'pangestu', + 'password' => Hash::make('Minimal8@'), + ]); + + Student::create([ + 'user_id' => $user->id, + 'full_name' => 'Yoga Pangestu', + 'student_number' => '2457201008', + 'phone_number' => '082121495806', + 'sex' => Sex::Male, + 'address' => 'Kp. Bakan Sampeu', + 'date_of_birth' => '2003-03-13', + 'place_of_birth' => 'Subang', + ]); + } +}