diff --git a/app/Livewire/Forms/Studio/Loyalty/Tier/RewardForm.php b/app/Livewire/Forms/Studio/Loyalty/Tier/RewardForm.php new file mode 100644 index 0000000..6717360 --- /dev/null +++ b/app/Livewire/Forms/Studio/Loyalty/Tier/RewardForm.php @@ -0,0 +1,76 @@ + ['required', Rule::exists('tiers', 'id')], + 'name' => ['required', 'string', 'max:100'], + 'value' => ['required', new UnsignedInteger], + 'how_to_get' => 'nullable', + ]; + } + + public function validationAttributes(): array + { + return [ + 'name' => 'nama', + 'value' => 'nilia', + 'how_to_get' => 'cara mendapatkan', + ]; + } + + public function setRewards(TierReward $tierReward) + { + $this->tierReward = $tierReward; + + $this->tier_id = $tierReward->tier_id; + $this->name = $tierReward->name; + $this->value = currency($tierReward->value); + $this->how_to_get = $tierReward->how_to_get; + } + + public function store() + { + $this->validate(); + + return TierReward::create($this->prepareSavedData()); + } + + public function update() + { + $this->validate(); + + $this->tierReward->update($this->prepareSavedData()); + + return $this->tierReward; + } + + private function prepareSavedData() + { + return [ + 'tier_id' => $this->tier_id, + 'name' => $this->name, + 'value' => replaceCurrency($this->value), + 'how_to_get' => $this->how_to_get, + ]; + } +} diff --git a/app/Livewire/Studio/Loyalty/Tier/Reward.php b/app/Livewire/Studio/Loyalty/Tier/Reward.php new file mode 100644 index 0000000..a8ced41 --- /dev/null +++ b/app/Livewire/Studio/Loyalty/Tier/Reward.php @@ -0,0 +1,95 @@ +resetValidation(); + $this->resetErrorBag(); + + $this->method = $method; + $this->modalTitle = $modalTitle; + + $this->form->tier_id = $tier_id; + + $this->rewards = TierReward::where('tier_id', $tier_id) + ->get() + ->map(fn (TierReward $reward) => [ + 'hash' => $reward->hash, + 'tier_id' => $reward->tier_id, + 'name' => $reward->name, + 'value' => currency($reward->value, 'Rp'), + ]) + ->toArray(); + + if ($id) { + $this->form->setRewards(TierReward::byHashOrFail($id)); + } + } + + public function create() + { + $this->canOrAbort('create tier reward'); + + $this->form->store(); + + $this->toast('Hadiah berhasil ditambahkan.'); + + Flux::modals()->close(); + } + + public function update() + { + $this->canOrAbort('update tier reward'); + + $this->form->update(); + + $this->toast('Hadiah berhasil diperbarui.'); + + Flux::modals()->close(); + } + + public function delete(TierReward $reward) + { + $reward->delete(); + + $this->toast('Hadiah berhasil dihapus.'); + + Flux::modal('delete')->close(); + + $this->rewards = array_values(array_filter($this->rewards, fn ($item) => $item['hash'] !== $reward->hash)); + } + + public function render() + { + return view('livewire.studio.loyalty.tier.reward', [ + 'pageTitle' => 'Hadiah', + ]); + } +} diff --git a/app/Models/Tier.php b/app/Models/Tier.php index 7fa79b2..8e1782b 100644 --- a/app/Models/Tier.php +++ b/app/Models/Tier.php @@ -29,4 +29,9 @@ public function memberships(): HasMany { return $this->hasMany(Membership::class); } + + public function rewards(): HasMany + { + return $this->hasMany(TierReward::class); + } } diff --git a/app/Models/TierReward.php b/app/Models/TierReward.php new file mode 100644 index 0000000..6010924 --- /dev/null +++ b/app/Models/TierReward.php @@ -0,0 +1,20 @@ +belongsTo(Tier::class); + } +} diff --git a/database/migrations/2025_11_01_190446_create_tier_rewards_table.php b/database/migrations/2025_11_01_190446_create_tier_rewards_table.php new file mode 100644 index 0000000..e6e2a5a --- /dev/null +++ b/database/migrations/2025_11_01_190446_create_tier_rewards_table.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('tier_id')->constrained()->cascadeOnDelete(); + $table->string('name', 100); + $table->unsignedInteger('value'); + $table->text('how_to_get')->nullable(); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tier_rewards'); + } +}; diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php index 16b964b..a145574 100644 --- a/database/seeders/RolePermissionSeeder.php +++ b/database/seeders/RolePermissionSeeder.php @@ -49,6 +49,11 @@ public function run(): void 'update tier', 'delete tier', + 'view tier reward', + 'create tier reward', + 'update tier reward', + 'delete tier reward', + 'view voucher', 'create voucher', 'update voucher', diff --git a/resources/views/livewire/studio/loyalty/tier/reward.blade.php b/resources/views/livewire/studio/loyalty/tier/reward.blade.php new file mode 100644 index 0000000..dbd5fbe --- /dev/null +++ b/resources/views/livewire/studio/loyalty/tier/reward.blade.php @@ -0,0 +1,87 @@ +