diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherCampaignEndDateLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherCampaignEndDateLogic.php new file mode 100644 index 00000000..60186628 --- /dev/null +++ b/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherCampaignEndDateLogic.php @@ -0,0 +1,45 @@ + 'Updated Voucher Campaign End Date', + 'message' => 'The selected voucher campaign end date has been updated.' + ]; + } + + public function logic(Request $request): JsonResponse + { + $object = new UpdateVoucherCampaignEndDateObject( + $request->input('campaign_id'), + $request->input('end_date') + ); + + $this->canUpdateVoucherCampaignEndDate->passes($object); + + $campaign = $this->updatesVoucherCampaignEndDate->execute($object); + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherEndDateLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherEndDateLogic.php new file mode 100644 index 00000000..e41a53fb --- /dev/null +++ b/app/Classes/Modules/Vouchers/ControllersLogic/UpdateVoucherEndDateLogic.php @@ -0,0 +1,52 @@ +updatesVoucherEndDate = $updatesVoucherEndDate; + $this->canUpdateVoucherEndDate = $canUpdateVoucherEndDate; + } + + protected function notification(): array + { + return [ + 'title' => 'Updated Voucher End Date', + 'message' => 'The selected voucher end date has been updated.' + ]; + } + + public function logic(Request $request): JsonResponse + { + $object = new UpdateVoucherEndDateObject( + $request->input('id'), + $request->input('end_date') + ); + $this->canUpdateVoucherEndDate->passes($object); + + $voucher = $this->updatesVoucherEndDate->execute($object); + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherCampaignEndDateObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherCampaignEndDateObject.php new file mode 100644 index 00000000..688ce6b6 --- /dev/null +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherCampaignEndDateObject.php @@ -0,0 +1,30 @@ +campaign_id = $campaign_id; + $this->end_date = $end_date; + } + + public function getCampaignId(): string + { + return $this->campaign_id; + } + + public function getEndDate(): ?string + { + return $this->end_date; + } +} diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherEndDateObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherEndDateObject.php new file mode 100644 index 00000000..035368a7 --- /dev/null +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherEndDateObject.php @@ -0,0 +1,30 @@ +voucher_id = $voucher_id; + $this->end_date = $end_date; + } + + public function getVoucherId(): int + { + return $this->voucher_id; + } + + public function getEndDate(): ?string + { + return $this->end_date; + } +} diff --git a/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaignEndDate.php b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaignEndDate.php new file mode 100644 index 00000000..4b42a3dc --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaignEndDate.php @@ -0,0 +1,27 @@ +getCampaignId())->firstOrFail(); + + $endDate = $object->getEndDate(); + + if ($endDate) { + $parsed = \Carbon\Carbon::createFromFormat('Y-m-d', $endDate)->endOfDay()->timezone('Asia/Kuala_Lumpur'); + } else { + $parsed = null; + } + + $campaign->vouchers()->update(['end_date' => $parsed]); + + return $this->handler($campaign->fresh()); + } +} diff --git a/app/Classes/Modules/Vouchers/Services/UpdatesVoucherEndDate.php b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherEndDate.php new file mode 100644 index 00000000..5e205ca5 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherEndDate.php @@ -0,0 +1,26 @@ +getVoucherId())->firstOrFail(); + + if ($object->getEndDate()) { + $parsed = \Carbon\Carbon::createFromFormat('Y-m-d', $object->getEndDate())->endOfDay()->timezone('Asia/Kuala_Lumpur'); + } else { + $parsed = null; + } + + $voucher->end_date = $parsed; + $voucher->save(); + + return $this->handler($voucher->fresh()); + } +} diff --git a/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherCampaignEndDate.php b/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherCampaignEndDate.php new file mode 100644 index 00000000..9aaf30b8 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherCampaignEndDate.php @@ -0,0 +1,47 @@ +type, RoleTypes::ADMIN_ROLES); + } + + /** + * @param UpdateVoucherCampaignEndDateObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + if (empty($object->getCampaignId()) || $object->getEndDate() === '') { + return true; + } + + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $object->getEndDate())) { + throw new \App\Classes\Exceptions\RequestValidationException('The end date format is invalid.'); + } + + return true; + } + + /** + * @param UpdateVoucherCampaignEndDateObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} diff --git a/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherEndDate.php b/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherEndDate.php new file mode 100644 index 00000000..6eb94416 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Standards/Rules/CanUpdateVoucherEndDate.php @@ -0,0 +1,47 @@ +type, RoleTypes::ADMIN_ROLES); + } + + /** + * @param UpdateVoucherEndDateObject $object + * @return bool + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + protected function validators($object): bool + { + if (empty($object->getVoucherId()) || $object->getEndDate() === '') { + return true; + } + + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $object->getEndDate())) { + throw new \App\Classes\Exceptions\RequestValidationException('The end date format is invalid.'); + } + + return true; + } + + /** + * @param UpdateVoucherEndDateObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} diff --git a/app/Http/Controllers/Vouchers/UpdateVoucherCampaignEndDateController.php b/app/Http/Controllers/Vouchers/UpdateVoucherCampaignEndDateController.php new file mode 100644 index 00000000..41e612fe --- /dev/null +++ b/app/Http/Controllers/Vouchers/UpdateVoucherCampaignEndDateController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Vouchers/UpdateVoucherEndDateController.php b/app/Http/Controllers/Vouchers/UpdateVoucherEndDateController.php new file mode 100644 index 00000000..76bc3cc2 --- /dev/null +++ b/app/Http/Controllers/Vouchers/UpdateVoucherEndDateController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Resources/VoucherCampaignResource.php b/app/Http/Resources/VoucherCampaignResource.php index 452465d8..8b13578a 100644 --- a/app/Http/Resources/VoucherCampaignResource.php +++ b/app/Http/Resources/VoucherCampaignResource.php @@ -27,6 +27,7 @@ class VoucherCampaignResource extends JsonResource 'slug' => $this->slug, 'description' => $this->description, 'limit_per_month' => $this->limit_per_month, + 'end_date' => optional($this->vouchers()->latest('end_date')->first())->end_date, 'metadata' => $metadata ]; } diff --git a/app/Http/Resources/VoucherResource.php b/app/Http/Resources/VoucherResource.php index f4315bd1..d8fbd456 100644 --- a/app/Http/Resources/VoucherResource.php +++ b/app/Http/Resources/VoucherResource.php @@ -38,6 +38,10 @@ class VoucherResource extends JsonResource 'end_date' => $this->end_date, 'is_redeemed' => $filteredRedemptions->count() > 0, 'email' => $this->email ? new KeyValueBasicResource($this->email->where('key', $this->code.'_EMAIL_COUNT')->first()) : null, + 'campaign' => $this->campaign ? [ + 'name' => $this->campaign->name, + // 'campaign_id' => $this->campaign->campaign_id, + ] : null, ]; } } diff --git a/docker-setup/docker-compose.yml b/docker-setup/docker-compose.yml index 7f5d8fa1..b3f1afa3 100644 --- a/docker-setup/docker-compose.yml +++ b/docker-setup/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3' - networks: exchange-development: diff --git a/resources/assets/vue/components/companies/elements/SingleUserRewardItemComponent.vue b/resources/assets/vue/components/companies/elements/SingleUserRewardItemComponent.vue index 02b5c96d..69f73c6f 100644 --- a/resources/assets/vue/components/companies/elements/SingleUserRewardItemComponent.vue +++ b/resources/assets/vue/components/companies/elements/SingleUserRewardItemComponent.vue @@ -14,8 +14,28 @@

{{ item.voucher.code }}

{{ item.voucher.code }}

+

+ Campaign: {{ item.voucher.campaign.name }} +

+
+
+
+
+ +
+
+ + + + + + + +
+
-
Terms @@ -49,7 +69,12 @@ diff --git a/resources/assets/vue/components/vouchers/sections/VoucherCampaignsSectionComponent.vue b/resources/assets/vue/components/vouchers/sections/VoucherCampaignsSectionComponent.vue index d2c21780..2dc40e92 100644 --- a/resources/assets/vue/components/vouchers/sections/VoucherCampaignsSectionComponent.vue +++ b/resources/assets/vue/components/vouchers/sections/VoucherCampaignsSectionComponent.vue @@ -6,7 +6,7 @@
Voucher Campaigns ALL CUSTOMERS
-
+
Name
@@ -23,18 +23,91 @@
+
+
+
Update Campaign End Date
+
+
+
+
+ +
+
+ +
+
+ + + + + + + +
+
diff --git a/routes/voucher.php b/routes/voucher.php index f6818910..5b7b8249 100644 --- a/routes/voucher.php +++ b/routes/voucher.php @@ -4,6 +4,8 @@ use App\Http\Controllers\Vouchers\ValidateVoucherController; use App\Http\Controllers\Vouchers\CreateVoucherController; use App\Http\Controllers\Vouchers\ListUserVouchersController; use App\Http\Controllers\Vouchers\ListVoucherCampaignsController; +use App\Http\Controllers\Vouchers\UpdateVoucherCampaignEndDateController; +use App\Http\Controllers\Vouchers\UpdateVoucherEndDateController; use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'voucher', 'as' => 'voucher.'], function () { @@ -12,4 +14,6 @@ Route::group(['prefix' => 'voucher', 'as' => 'voucher.'], function () { // Route::post('redeem', [RedeemVoucherController::class, 'redeem'])->name('redeem'); Route::get('/user/list', [ListUserVouchersController::class, 'list'])->name('user.list'); Route::get('/voucher/campaigns/list', [ListVoucherCampaignsController::class, 'list'])->name('campaigns.list'); + Route::post('/voucher/campaigns/end-date', [UpdateVoucherCampaignEndDateController::class, 'update'])->name('campaigns.update.end_date'); + Route::post('/{id}/end-date', [UpdateVoucherEndDateController::class, 'update'])->name('update.end_date'); });