feat: expand permission management for settings by introducing new permissions for system, social media, marketplace, HR, and homepage updates; refactor related controllers, requests, and services to utilize these permissions; enhance frontend components to support new permission checks and improve user experience
This commit is contained in:
parent
f1c3658166
commit
2b7208a0c4
@ -135,8 +135,16 @@ enum Permission: string
|
||||
case PAYROLL_VIEW = 'payroll.view';
|
||||
case PAYROLL_ADJUST = 'payroll.adjust';
|
||||
|
||||
case SETTINGS_VIEW = 'settings.view';
|
||||
case SETTINGS_UPDATE = 'settings.update';
|
||||
case SETTINGS_VIEW_SYSTEM = 'settings.view_system';
|
||||
case SETTINGS_UPDATE_SYSTEM = 'settings.update_system';
|
||||
case SETTINGS_VIEW_SOCIAL_MEDIA = 'settings.view_social_media';
|
||||
case SETTINGS_UPDATE_SOCIAL_MEDIA = 'settings.update_social_media';
|
||||
case SETTINGS_VIEW_MARKETPLACE = 'settings.view_marketplace';
|
||||
case SETTINGS_UPDATE_MARKETPLACE = 'settings.update_marketplace';
|
||||
case SETTINGS_VIEW_HR = 'settings.view_hr';
|
||||
case SETTINGS_UPDATE_HR = 'settings.update_hr';
|
||||
case SETTINGS_VIEW_HOMEPAGE = 'settings.view_homepage';
|
||||
case SETTINGS_UPDATE_HOMEPAGE = 'settings.update_homepage';
|
||||
|
||||
case ACTIVITY_LOGS_VIEW = 'activity_logs.view';
|
||||
|
||||
@ -275,8 +283,16 @@ public function label(): string
|
||||
self::PAYROLL_VIEW => 'Lihat Gaji',
|
||||
self::PAYROLL_ADJUST => 'Sesuaikan Gaji',
|
||||
|
||||
self::SETTINGS_VIEW => 'Lihat Pengaturan Aplikasi',
|
||||
self::SETTINGS_UPDATE => 'Ubah Pengaturan Aplikasi',
|
||||
self::SETTINGS_VIEW_SYSTEM => 'Lihat Pengaturan Sistem',
|
||||
self::SETTINGS_UPDATE_SYSTEM => 'Ubah Pengaturan Sistem',
|
||||
self::SETTINGS_VIEW_SOCIAL_MEDIA => 'Lihat Pengaturan Media Sosial',
|
||||
self::SETTINGS_UPDATE_SOCIAL_MEDIA => 'Ubah Pengaturan Media Sosial',
|
||||
self::SETTINGS_VIEW_MARKETPLACE => 'Lihat Pengaturan Marketplace',
|
||||
self::SETTINGS_UPDATE_MARKETPLACE => 'Ubah Pengaturan Marketplace',
|
||||
self::SETTINGS_VIEW_HR => 'Lihat Pengaturan HR',
|
||||
self::SETTINGS_UPDATE_HR => 'Ubah Pengaturan HR',
|
||||
self::SETTINGS_VIEW_HOMEPAGE => 'Lihat Pengaturan Homepage',
|
||||
self::SETTINGS_UPDATE_HOMEPAGE => 'Ubah Pengaturan Homepage',
|
||||
|
||||
self::ACTIVITY_LOGS_VIEW => 'Lihat Log Aktivitas',
|
||||
|
||||
@ -335,7 +351,11 @@ public function group(): string
|
||||
self::EMPLOYEE_ADVANCES_DELETE, self::EMPLOYEE_ADVANCES_VERIFY,
|
||||
self::EMPLOYEE_ADVANCES_PAY => 'Kasbon',
|
||||
self::PAYROLL_VIEW, self::PAYROLL_ADJUST => 'Gaji',
|
||||
self::SETTINGS_VIEW, self::SETTINGS_UPDATE => 'Pengaturan Aplikasi',
|
||||
self::SETTINGS_VIEW_SYSTEM, self::SETTINGS_UPDATE_SYSTEM,
|
||||
self::SETTINGS_VIEW_SOCIAL_MEDIA, self::SETTINGS_UPDATE_SOCIAL_MEDIA,
|
||||
self::SETTINGS_VIEW_MARKETPLACE, self::SETTINGS_UPDATE_MARKETPLACE,
|
||||
self::SETTINGS_VIEW_HR, self::SETTINGS_UPDATE_HR,
|
||||
self::SETTINGS_VIEW_HOMEPAGE, self::SETTINGS_UPDATE_HOMEPAGE => 'Pengaturan Aplikasi',
|
||||
self::ACTIVITY_LOGS_VIEW => 'Log Aktivitas',
|
||||
self::ROLES_VIEW, self::ROLES_CREATE, self::ROLES_UPDATE,
|
||||
self::ROLES_DELETE => 'Role & Permission',
|
||||
|
||||
@ -193,8 +193,16 @@ public function permissions(): array
|
||||
Permission::PAYROLL_VIEW,
|
||||
Permission::PAYROLL_ADJUST,
|
||||
|
||||
Permission::SETTINGS_VIEW,
|
||||
Permission::SETTINGS_UPDATE,
|
||||
Permission::SETTINGS_VIEW_SYSTEM,
|
||||
Permission::SETTINGS_UPDATE_SYSTEM,
|
||||
Permission::SETTINGS_VIEW_SOCIAL_MEDIA,
|
||||
Permission::SETTINGS_UPDATE_SOCIAL_MEDIA,
|
||||
Permission::SETTINGS_VIEW_MARKETPLACE,
|
||||
Permission::SETTINGS_UPDATE_MARKETPLACE,
|
||||
Permission::SETTINGS_VIEW_HR,
|
||||
Permission::SETTINGS_UPDATE_HR,
|
||||
Permission::SETTINGS_VIEW_HOMEPAGE,
|
||||
Permission::SETTINGS_UPDATE_HOMEPAGE,
|
||||
],
|
||||
|
||||
self::CASHIER => [
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
use App\Services\System\Setting\SocialMediaService;
|
||||
use App\Services\System\Setting\SystemService;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
@ -33,8 +34,10 @@ public function __construct(
|
||||
private readonly OwnerVerificationService $ownerVerificationService,
|
||||
) {}
|
||||
|
||||
public function index(): Response
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
$user = $request->user();
|
||||
|
||||
return Inertia::render('admin/system/setting/Index', [
|
||||
'system' => $this->systemService->systemData(),
|
||||
'socialMedia' => $this->socialMediaService->socialMediaData(),
|
||||
@ -42,15 +45,16 @@ public function index(): Response
|
||||
'hr' => $this->hrSettingService->hrData(),
|
||||
'homepage' => $this->homepageSettingService->homepageData(),
|
||||
'hasPendingMarketplaceVerification' => $this->ownerVerificationService->hasPendingMarketplaceVerification(),
|
||||
'canUpdateSystem' => $user->can(Permission::SETTINGS_UPDATE_SYSTEM->value),
|
||||
'canUpdateSocialMedia' => $user->can(Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value),
|
||||
'canUpdateMarketplace' => $user->can(Permission::SETTINGS_UPDATE_MARKETPLACE->value),
|
||||
'canUpdateHr' => $user->can(Permission::SETTINGS_UPDATE_HR->value),
|
||||
'canUpdateHomepage' => $user->can(Permission::SETTINGS_UPDATE_HOMEPAGE->value),
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateSystem(SystemRequest $request): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
abort(403, 'Aksi ini tidak diizinkan.');
|
||||
}
|
||||
|
||||
$this->systemService->updateSystem($request->validated());
|
||||
|
||||
$this->flashSuccess('Pengaturan sistem berhasil disimpan.');
|
||||
@ -60,10 +64,6 @@ public function updateSystem(SystemRequest $request): RedirectResponse
|
||||
|
||||
public function updateSocialMedia(SocialMediaRequest $request): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
abort(403, 'Aksi ini tidak diizinkan.');
|
||||
}
|
||||
|
||||
$this->socialMediaService->updateSocialMedia($request->validated());
|
||||
|
||||
$this->flashSuccess('Pengaturan media sosial berhasil disimpan.');
|
||||
@ -86,10 +86,6 @@ public function updateMarketplace(MarketplaceRequest $request): RedirectResponse
|
||||
|
||||
public function updateHr(HrSettingRequest $request): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
abort(403, 'Aksi ini tidak diizinkan.');
|
||||
}
|
||||
|
||||
$this->hrSettingService->updateHr($request->validated());
|
||||
|
||||
$this->flashSuccess('Pengaturan HR berhasil disimpan.');
|
||||
@ -99,10 +95,6 @@ public function updateHr(HrSettingRequest $request): RedirectResponse
|
||||
|
||||
public function updateHomepage(HomepageSettingRequest $request): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
abort(403, 'Aksi ini tidak diizinkan.');
|
||||
}
|
||||
|
||||
$this->homepageSettingService->updateHomepage($request->validated());
|
||||
|
||||
$this->flashSuccess('Pengaturan homepage berhasil disimpan.');
|
||||
|
||||
@ -9,7 +9,7 @@ class HomepageSettingRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE_HOMEPAGE->value) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -24,6 +24,8 @@ public function rules(): array
|
||||
'about_image_s3_key' => ['nullable', 'string'],
|
||||
'gallery_s3_keys' => ['nullable', 'array', 'max:10'],
|
||||
'gallery_s3_keys.*' => ['required', 'string'],
|
||||
'gallery_images' => ['nullable', 'array', 'max:10'],
|
||||
'gallery_images.*' => ['required', 'image', 'max:5120'],
|
||||
'gallery_images_remove' => ['nullable', 'array'],
|
||||
'gallery_images_remove.*' => ['integer'],
|
||||
];
|
||||
|
||||
@ -9,7 +9,7 @@ class HrSettingRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE_HR->value) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -13,7 +13,7 @@ class MarketplaceRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE_MARKETPLACE->value) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -9,7 +9,7 @@ class SocialMediaRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -10,7 +10,7 @@ class SystemRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
|
||||
return $this->user()?->can(Permission::SETTINGS_UPDATE_SYSTEM->value) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -3,12 +3,16 @@
|
||||
namespace App\Services\System\Setting;
|
||||
|
||||
use App\Models\HomepageConfiguration;
|
||||
use App\Services\Concerns\RunsInTransaction;
|
||||
use App\Services\Concerns\SyncsPhotos;
|
||||
use App\Services\Media\MediaService;
|
||||
use App\Support\Media\MediaPresenter;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
|
||||
class HomepageSettingService
|
||||
{
|
||||
use RunsInTransaction, SyncsPhotos;
|
||||
|
||||
public function __construct(
|
||||
private readonly MediaService $mediaService,
|
||||
) {}
|
||||
@ -31,30 +35,45 @@ public function homepageData(): array
|
||||
|
||||
public function updateHomepage(array $validated): void
|
||||
{
|
||||
$configuration = HomepageConfiguration::instance();
|
||||
$this->runInTransaction(
|
||||
function () use ($validated): void {
|
||||
$configuration = HomepageConfiguration::instance();
|
||||
|
||||
if (isset($validated['hero_image_s3_key'])) {
|
||||
$this->mediaService->replaceSingleS3Key($configuration, $validated['hero_image_s3_key'], 'hero_image', 'hero-image');
|
||||
} elseif (isset($validated['hero_image']) && $validated['hero_image'] instanceof UploadedFile) {
|
||||
$this->mediaService->replaceSingleFile($configuration, $validated['hero_image'], 'hero_image', 'hero-image');
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => isset($validated['hero_image']) ? [$validated['hero_image']] : null,
|
||||
's3_keys' => isset($validated['hero_image_s3_key']) ? [$validated['hero_image_s3_key']] : null,
|
||||
],
|
||||
maxPhotos: 1,
|
||||
required: false,
|
||||
collection: 'hero_image',
|
||||
);
|
||||
|
||||
if (isset($validated['about_image_s3_key'])) {
|
||||
$this->mediaService->replaceSingleS3Key($configuration, $validated['about_image_s3_key'], 'about_image', 'about-image');
|
||||
} elseif (isset($validated['about_image']) && $validated['about_image'] instanceof UploadedFile) {
|
||||
$this->mediaService->replaceSingleFile($configuration, $validated['about_image'], 'about_image', 'about-image');
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => isset($validated['about_image']) ? [$validated['about_image']] : null,
|
||||
's3_keys' => isset($validated['about_image_s3_key']) ? [$validated['about_image_s3_key']] : null,
|
||||
],
|
||||
maxPhotos: 1,
|
||||
required: false,
|
||||
collection: 'about_image',
|
||||
);
|
||||
|
||||
if (isset($validated['gallery_s3_keys']) || isset($validated['gallery_images_remove'])) {
|
||||
$this->mediaService->syncCollection(
|
||||
$configuration,
|
||||
'gallery',
|
||||
null,
|
||||
$validated['gallery_images_remove'] ?? null,
|
||||
10,
|
||||
'gallery',
|
||||
s3Keys: $validated['gallery_s3_keys'] ?? null,
|
||||
);
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => $validated['gallery_images'] ?? null,
|
||||
'remove_media_ids' => $validated['gallery_images_remove'] ?? null,
|
||||
's3_keys' => $validated['gallery_s3_keys'] ?? null,
|
||||
],
|
||||
maxPhotos: 10,
|
||||
required: false,
|
||||
collection: 'gallery',
|
||||
);
|
||||
},
|
||||
'Gagal memperbarui pengaturan homepage',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
use App\Enums\Permission;
|
||||
use App\Models\OwnerVerificationRequest;
|
||||
use App\Models\User;
|
||||
use App\Services\Concerns\RunsInTransaction;
|
||||
use App\Services\System\PushNotificationService;
|
||||
use App\Settings\MarketplaceSettings;
|
||||
use App\Support\Marketplace\MarketplaceFeeCalculator;
|
||||
@ -16,6 +17,8 @@
|
||||
|
||||
class MarketplaceService
|
||||
{
|
||||
use RunsInTransaction;
|
||||
|
||||
public function __construct(
|
||||
private readonly PushNotificationService $pushNotificationService,
|
||||
) {}
|
||||
@ -72,61 +75,66 @@ public function marketplaceData(): array
|
||||
|
||||
public function updateMarketplace(array $validated, User $user): void
|
||||
{
|
||||
if ($user->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
$this->saveSettings($validated);
|
||||
$this->runInTransaction(
|
||||
function () use ($validated, $user): void {
|
||||
if ($user->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
|
||||
$this->saveSettings($validated);
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$hasPending = OwnerVerificationRequest::query()
|
||||
->where('subject_type', MarketplaceSettings::class)
|
||||
->pending()
|
||||
->exists();
|
||||
$hasPending = OwnerVerificationRequest::query()
|
||||
->where('subject_type', MarketplaceSettings::class)
|
||||
->pending()
|
||||
->exists();
|
||||
|
||||
if ($hasPending) {
|
||||
throw ValidationException::withMessages([
|
||||
'system' => 'Perubahan pengaturan marketplace sedang menunggu verifikasi owner.',
|
||||
]);
|
||||
}
|
||||
if ($hasPending) {
|
||||
throw ValidationException::withMessages([
|
||||
'system' => 'Perubahan pengaturan marketplace sedang menunggu verifikasi owner.',
|
||||
]);
|
||||
}
|
||||
|
||||
$settings = app(MarketplaceSettings::class);
|
||||
$oldPayload = [];
|
||||
$newPayload = [];
|
||||
$settings = app(MarketplaceSettings::class);
|
||||
$oldPayload = [];
|
||||
$newPayload = [];
|
||||
|
||||
foreach ($this->tiktokFeeKeys() as $key) {
|
||||
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
|
||||
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
|
||||
}
|
||||
foreach ($this->tiktokFeeKeys() as $key) {
|
||||
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
|
||||
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
|
||||
}
|
||||
|
||||
foreach ($this->shopeeFeeKeys() as $key) {
|
||||
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
|
||||
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
|
||||
}
|
||||
foreach ($this->shopeeFeeKeys() as $key) {
|
||||
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
|
||||
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
|
||||
}
|
||||
|
||||
OwnerVerificationRequest::create([
|
||||
'action' => OwnerVerificationAction::UPDATE,
|
||||
'status' => OwnerVerificationStatus::PENDING,
|
||||
'subject_type' => MarketplaceSettings::class,
|
||||
'subject_id' => null,
|
||||
'submitted_by_id' => $user->id,
|
||||
'payload' => [
|
||||
'old' => $oldPayload,
|
||||
'new' => $newPayload,
|
||||
],
|
||||
]);
|
||||
OwnerVerificationRequest::create([
|
||||
'action' => OwnerVerificationAction::UPDATE,
|
||||
'status' => OwnerVerificationStatus::PENDING,
|
||||
'subject_type' => MarketplaceSettings::class,
|
||||
'subject_id' => null,
|
||||
'submitted_by_id' => $user->id,
|
||||
'payload' => [
|
||||
'old' => $oldPayload,
|
||||
'new' => $newPayload,
|
||||
],
|
||||
]);
|
||||
|
||||
$this->pushNotificationService->sendToRoles(
|
||||
'⚙️ Pengaturan Marketplace Menunggu Persetujuan Owner',
|
||||
"Pengajuan ubah pengaturan marketplace oleh '{$user->username}' menunggu verifikasi owner.",
|
||||
['owner', 'developer', 'direktur'],
|
||||
route('admin.system.settings.index'),
|
||||
);
|
||||
$this->pushNotificationService->sendToRoles(
|
||||
'⚙️ Pengaturan Marketplace Menunggu Persetujuan Owner',
|
||||
"Pengajuan ubah pengaturan marketplace oleh '{$user->username}' menunggu verifikasi owner.",
|
||||
['owner', 'developer', 'direktur'],
|
||||
route('admin.system.settings.index'),
|
||||
);
|
||||
|
||||
$this->pushNotificationService->sendToUser(
|
||||
'📤 Pengajuan Terkirim',
|
||||
'Pengajuan ubah pengaturan marketplace menunggu verifikasi owner.',
|
||||
$user->id,
|
||||
route('admin.system.settings.index'),
|
||||
$this->pushNotificationService->sendToUser(
|
||||
'📤 Pengajuan Terkirim',
|
||||
'Pengajuan ubah pengaturan marketplace menunggu verifikasi owner.',
|
||||
$user->id,
|
||||
route('admin.system.settings.index'),
|
||||
);
|
||||
},
|
||||
'Gagal memperbarui pengaturan marketplace',
|
||||
);
|
||||
}
|
||||
|
||||
@ -147,8 +155,13 @@ public function saveSettings(array $validated): void
|
||||
|
||||
public function applyVerificationRequest(OwnerVerificationRequest $request): void
|
||||
{
|
||||
$newPayload = $request->payload['new'] ?? [];
|
||||
$this->saveSettings($newPayload);
|
||||
$this->runInTransaction(
|
||||
function () use ($request): void {
|
||||
$newPayload = $request->payload['new'] ?? [];
|
||||
$this->saveSettings($newPayload);
|
||||
},
|
||||
'Gagal menerapkan pengajuan verifikasi owner',
|
||||
);
|
||||
}
|
||||
|
||||
public function buildOrderSnapshot(OrderChannel $channel, int $totalAmount, array $lineItems, bool $isAffiliate = false): ?array
|
||||
|
||||
@ -3,6 +3,8 @@
|
||||
namespace App\Services\System\Setting;
|
||||
|
||||
use App\Models\SystemConfiguration;
|
||||
use App\Services\Concerns\RunsInTransaction;
|
||||
use App\Services\Concerns\SyncsPhotos;
|
||||
use App\Services\Media\MediaService;
|
||||
use App\Settings\SystemSettings;
|
||||
use App\Support\Media\MediaPresenter;
|
||||
@ -11,6 +13,8 @@
|
||||
|
||||
class SystemService
|
||||
{
|
||||
use RunsInTransaction, SyncsPhotos;
|
||||
|
||||
public function __construct(
|
||||
private readonly MediaService $mediaService,
|
||||
) {}
|
||||
@ -39,50 +43,70 @@ public function systemData(): array
|
||||
|
||||
public function updateSystem(array $validated): void
|
||||
{
|
||||
$settings = app(SystemSettings::class);
|
||||
$configuration = SystemConfiguration::instance();
|
||||
$this->runInTransaction(
|
||||
function () use ($validated): void {
|
||||
$settings = app(SystemSettings::class);
|
||||
$configuration = SystemConfiguration::instance();
|
||||
|
||||
$settings->app_name = $validated['app_name'];
|
||||
$settings->about_app = $validated['about_app'] ?? null;
|
||||
$settings->email = $validated['email'] ?? null;
|
||||
$settings->phone = $validated['phone'] ?? null;
|
||||
$settings->address = $validated['address'] ?? null;
|
||||
$settings->save();
|
||||
$settings->app_name = $validated['app_name'];
|
||||
$settings->about_app = $validated['about_app'] ?? null;
|
||||
$settings->email = $validated['email'] ?? null;
|
||||
$settings->phone = $validated['phone'] ?? null;
|
||||
$settings->address = $validated['address'] ?? null;
|
||||
$settings->save();
|
||||
|
||||
if (isset($validated['logo_s3_key'])) {
|
||||
$this->mediaService->replaceSingleS3Key($configuration, $validated['logo_s3_key'], 'logo', 'logo');
|
||||
} elseif (isset($validated['logo']) && $validated['logo'] instanceof UploadedFile) {
|
||||
$this->mediaService->replaceSingleFile($configuration, $validated['logo'], 'logo', 'logo');
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => isset($validated['logo']) ? [$validated['logo']] : null,
|
||||
's3_keys' => isset($validated['logo_s3_key']) ? [$validated['logo_s3_key']] : null,
|
||||
],
|
||||
maxPhotos: 1,
|
||||
required: false,
|
||||
collection: 'logo',
|
||||
);
|
||||
|
||||
if (isset($validated['favicon_s3_key'])) {
|
||||
$this->mediaService->replaceSingleS3Key($configuration, $validated['favicon_s3_key'], 'favicon', 'favicon');
|
||||
} elseif (isset($validated['favicon']) && $validated['favicon'] instanceof UploadedFile) {
|
||||
$this->mediaService->replaceSingleFile($configuration, $validated['favicon'], 'favicon', 'favicon');
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => isset($validated['favicon']) ? [$validated['favicon']] : null,
|
||||
's3_keys' => isset($validated['favicon_s3_key']) ? [$validated['favicon_s3_key']] : null,
|
||||
],
|
||||
maxPhotos: 1,
|
||||
required: false,
|
||||
collection: 'favicon',
|
||||
);
|
||||
|
||||
if (isset($validated['login_cover_s3_key'])) {
|
||||
$this->mediaService->replaceSingleS3Key($configuration, $validated['login_cover_s3_key'], 'login_cover', 'login-cover');
|
||||
} elseif (isset($validated['login_cover']) && $validated['login_cover'] instanceof UploadedFile) {
|
||||
$this->mediaService->replaceSingleFile($configuration, $validated['login_cover'], 'login_cover', 'login-cover');
|
||||
}
|
||||
$this->syncPhotos(
|
||||
$configuration,
|
||||
[
|
||||
'photos' => isset($validated['login_cover']) ? [$validated['login_cover']] : null,
|
||||
's3_keys' => isset($validated['login_cover_s3_key']) ? [$validated['login_cover_s3_key']] : null,
|
||||
],
|
||||
maxPhotos: 1,
|
||||
required: false,
|
||||
collection: 'login_cover',
|
||||
);
|
||||
|
||||
$errors = [];
|
||||
$errors = [];
|
||||
|
||||
if (! $configuration->hasMedia('logo')) {
|
||||
$errors['logo'] = 'Logo wajib diisi.';
|
||||
}
|
||||
if (! $configuration->hasMedia('logo')) {
|
||||
$errors['logo'] = 'Logo wajib diisi.';
|
||||
}
|
||||
|
||||
if (! $configuration->hasMedia('favicon')) {
|
||||
$errors['favicon'] = 'Favicon wajib diisi.';
|
||||
}
|
||||
if (! $configuration->hasMedia('favicon')) {
|
||||
$errors['favicon'] = 'Favicon wajib diisi.';
|
||||
}
|
||||
|
||||
if (! $configuration->hasMedia('login_cover')) {
|
||||
$errors['login_cover'] = 'Cover login wajib diisi.';
|
||||
}
|
||||
if (! $configuration->hasMedia('login_cover')) {
|
||||
$errors['login_cover'] = 'Cover login wajib diisi.';
|
||||
}
|
||||
|
||||
if ($errors !== []) {
|
||||
throw ValidationException::withMessages($errors);
|
||||
}
|
||||
if ($errors !== []) {
|
||||
throw ValidationException::withMessages($errors);
|
||||
}
|
||||
},
|
||||
'Gagal memperbarui pengaturan sistem',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ interface MenuItem {
|
||||
title: string;
|
||||
href: string;
|
||||
icon: any;
|
||||
permission?: string;
|
||||
permission?: string | string[];
|
||||
badgeKey?: 'pendingLeaveRequests' | 'pendingEmployeeAdvances' | 'pendingCuttings';
|
||||
}
|
||||
|
||||
@ -82,7 +82,18 @@ const menuGroups: MenuGroup[] = [
|
||||
label: 'Sistem',
|
||||
items: [
|
||||
{ title: 'Role & Permission', href: admin.system.roles.index.url(), icon: Shield, permission: 'roles.view' },
|
||||
{ title: 'Pengaturan', href: admin.system.settings.index.url(), icon: Settings2, permission: 'settings.view' },
|
||||
{
|
||||
title: 'Pengaturan',
|
||||
href: admin.system.settings.index.url(),
|
||||
icon: Settings2,
|
||||
permission: [
|
||||
'settings.view_system',
|
||||
'settings.view_social_media',
|
||||
'settings.view_marketplace',
|
||||
'settings.view_hr',
|
||||
'settings.view_homepage',
|
||||
],
|
||||
},
|
||||
{ title: 'Log Aktivitas', href: admin.system.activity_logs.index.url(), icon: History, permission: 'activity_logs.view' },
|
||||
],
|
||||
},
|
||||
|
||||
@ -7,7 +7,10 @@ export function useCan() {
|
||||
const permissions = computed(() => page.props.auth.user?.permissions ?? []);
|
||||
const roles = computed(() => page.props.auth.user?.roles ?? []);
|
||||
|
||||
function can(permission: string): boolean {
|
||||
function can(permission: string | string[]): boolean {
|
||||
if (Array.isArray(permission)) {
|
||||
return permission.some((p) => permissions.value.includes(p));
|
||||
}
|
||||
return permissions.value.includes(permission);
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,11 @@ defineProps<{
|
||||
hr: HrSettingsData;
|
||||
homepage: HomepageSettingsData;
|
||||
hasPendingMarketplaceVerification: boolean;
|
||||
canUpdateSystem: boolean;
|
||||
canUpdateSocialMedia: boolean;
|
||||
canUpdateMarketplace: boolean;
|
||||
canUpdateHr: boolean;
|
||||
canUpdateHomepage: boolean;
|
||||
}>();
|
||||
|
||||
const { hasRole } = useCan();
|
||||
@ -39,10 +44,10 @@ const activeSection = ref<SettingSection>(
|
||||
<Head title="Pengaturan" />
|
||||
|
||||
<SettingLayout v-model:section="activeSection">
|
||||
<SystemSection v-if="activeSection === SettingSectionConst.SYSTEM" :data="system" />
|
||||
<HomepageSection v-else-if="activeSection === SettingSectionConst.HOMEPAGE" :data="homepage" />
|
||||
<SocialMediaSection v-else-if="activeSection === SettingSectionConst.SOCIAL" :data="socialMedia" />
|
||||
<MarketplaceSection v-else-if="activeSection === SettingSectionConst.MARKETPLACE" :data="marketplace" :has-pending-verification="hasPendingMarketplaceVerification" />
|
||||
<HrSection v-else-if="activeSection === SettingSectionConst.HR" :data="hr" />
|
||||
<SystemSection v-if="activeSection === SettingSectionConst.SYSTEM" :data="system" :can-update="canUpdateSystem" />
|
||||
<HomepageSection v-else-if="activeSection === SettingSectionConst.HOMEPAGE" :data="homepage" :can-update="canUpdateHomepage" />
|
||||
<SocialMediaSection v-else-if="activeSection === SettingSectionConst.SOCIAL" :data="socialMedia" :can-update="canUpdateSocialMedia" />
|
||||
<MarketplaceSection v-else-if="activeSection === SettingSectionConst.MARKETPLACE" :data="marketplace" :has-pending-verification="hasPendingMarketplaceVerification" :can-update="canUpdateMarketplace" />
|
||||
<HrSection v-else-if="activeSection === SettingSectionConst.HR" :data="hr" :can-update="canUpdateHr" />
|
||||
</SettingLayout>
|
||||
</template>
|
||||
|
||||
@ -13,6 +13,7 @@ import type { HomepageSettingsData } from '@/types/setting';
|
||||
|
||||
const props = defineProps<{
|
||||
data: HomepageSettingsData;
|
||||
canUpdate: boolean;
|
||||
}>();
|
||||
|
||||
const heroImage = ref<MediaUploadState>(
|
||||
@ -107,7 +108,7 @@ function submit() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<div v-if="canUpdate" class="flex justify-end">
|
||||
<Button type="submit" :disabled="isSubmitting || isUploading">
|
||||
<Save class="size-4" />
|
||||
{{ isUploading ? 'Mengunggah...' : isSubmitting ? 'Menyimpan...' : 'Simpan' }}
|
||||
|
||||
@ -13,6 +13,7 @@ import type { HrSettingsData } from '@/types/setting';
|
||||
|
||||
const props = defineProps<{
|
||||
data: HrSettingsData;
|
||||
canUpdate: boolean;
|
||||
}>();
|
||||
|
||||
const form = useForm({
|
||||
@ -82,7 +83,7 @@ function submit() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
<div v-if="canUpdate" class="mt-6 flex justify-end">
|
||||
<Button type="submit" :disabled="form.processing">
|
||||
<Save class="size-4" />
|
||||
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}
|
||||
|
||||
@ -25,6 +25,7 @@ import MarketplaceFeeField from './MarketplaceFeeField.vue';
|
||||
const props = defineProps<{
|
||||
data: MarketplaceSettingsData;
|
||||
hasPendingVerification: boolean;
|
||||
canUpdate: boolean;
|
||||
}>();
|
||||
|
||||
const activePlatform = ref<MarketplacePlatform>(MarketplacePlatformConst.TIKTOK_SHOP);
|
||||
@ -188,7 +189,7 @@ function submit() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<div v-if="canUpdate" class="flex justify-end">
|
||||
<Button type="submit" :disabled="form.processing || props.hasPendingVerification">
|
||||
<Save class="size-4" />
|
||||
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}
|
||||
|
||||
@ -12,6 +12,7 @@ import type { SocialMediaSettingsData } from '@/types/setting';
|
||||
|
||||
const props = defineProps<{
|
||||
data: SocialMediaSettingsData;
|
||||
canUpdate: boolean;
|
||||
}>();
|
||||
|
||||
const form = useForm({
|
||||
@ -69,7 +70,7 @@ function submit() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
<div v-if="canUpdate" class="mt-6 flex justify-end">
|
||||
<Button type="submit" :disabled="form.processing">
|
||||
<Save class="size-4" />
|
||||
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}
|
||||
|
||||
@ -18,6 +18,7 @@ import type { SystemSettingsData } from '@/types/setting';
|
||||
|
||||
const props = defineProps<{
|
||||
data: SystemSettingsData;
|
||||
canUpdate: boolean;
|
||||
}>();
|
||||
|
||||
const form = useForm({
|
||||
@ -143,7 +144,7 @@ function submit() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<div v-if="canUpdate" class="flex justify-end">
|
||||
<Button type="submit" :disabled="form.processing || isUploading">
|
||||
<Save class="size-4" />
|
||||
{{ isUploading ? 'Mengunggah...' : form.processing ? 'Menyimpan...' : 'Simpan' }}
|
||||
|
||||
@ -477,28 +477,28 @@
|
||||
});
|
||||
|
||||
Route::prefix('settings')->name('settings.')
|
||||
->middleware('permission:'.Permission::SETTINGS_VIEW->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_VIEW_SYSTEM->value.'|'.Permission::SETTINGS_VIEW_SOCIAL_MEDIA->value.'|'.Permission::SETTINGS_VIEW_MARKETPLACE->value.'|'.Permission::SETTINGS_VIEW_HR->value.'|'.Permission::SETTINGS_VIEW_HOMEPAGE->value)
|
||||
->group(function () {
|
||||
Route::get('/', [SettingController::class, 'index'])->name('index');
|
||||
|
||||
Route::put('system', [SettingController::class, 'updateSystem'])
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE_SYSTEM->value)
|
||||
->name('system.update');
|
||||
|
||||
Route::put('social-media', [SettingController::class, 'updateSocialMedia'])
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value)
|
||||
->name('social_media.update');
|
||||
|
||||
Route::put('marketplace', [SettingController::class, 'updateMarketplace'])
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE_MARKETPLACE->value)
|
||||
->name('marketplace.update');
|
||||
|
||||
Route::put('hr', [SettingController::class, 'updateHr'])
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE_HR->value)
|
||||
->name('hr.update');
|
||||
|
||||
Route::put('homepage', [SettingController::class, 'updateHomepage'])
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
|
||||
->middleware('permission:'.Permission::SETTINGS_UPDATE_HOMEPAGE->value)
|
||||
->name('homepage.update');
|
||||
});
|
||||
});
|
||||
|
||||
@ -79,7 +79,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Index', function () {
|
||||
test('authenticated user with permission can view settings page', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM);
|
||||
|
||||
$this->actingAs($user)
|
||||
->get(route('admin.system.settings.index'))
|
||||
@ -104,7 +104,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Update System', function () {
|
||||
test('authenticated user with permission can update system settings', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['logo'] = UploadedFile::fake()->image('logo.jpg', 100, 100);
|
||||
@ -127,7 +127,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('user without update permission is forbidden', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.system.update'), validSystemPayload())
|
||||
@ -135,7 +135,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('app_name is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['app_name'] = '';
|
||||
@ -146,7 +146,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('app_name must not exceed 100 characters', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['app_name'] = str_repeat('a', 101);
|
||||
@ -157,7 +157,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('email must be valid', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['email'] = 'not-an-email';
|
||||
@ -168,7 +168,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('email is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['email'] = '';
|
||||
@ -179,7 +179,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('phone must be valid phone number', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['phone'] = '123invalid';
|
||||
@ -190,7 +190,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('phone is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['phone'] = '';
|
||||
@ -201,7 +201,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('about_app is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['about_app'] = '';
|
||||
@ -212,7 +212,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('address is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['address'] = '';
|
||||
@ -223,7 +223,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('logo must be an image when provided', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['logo'] = UploadedFile::fake()->create('document.pdf', 100);
|
||||
@ -234,7 +234,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('favicon must be an image when provided', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
|
||||
|
||||
$payload = validSystemPayload();
|
||||
$payload['favicon'] = UploadedFile::fake()->create('document.pdf', 100);
|
||||
@ -249,7 +249,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Update Social Media', function () {
|
||||
test('authenticated user can update social media settings', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -272,7 +272,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('user without update permission is forbidden', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -282,7 +282,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('social media urls can be null', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -299,7 +299,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('instagram_url must be a valid url', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -309,7 +309,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('facebook_url must be a valid url', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -319,7 +319,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('tiktok_url must be a valid url', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.social_media.update'), [
|
||||
@ -333,7 +333,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Update Marketplace', function () {
|
||||
test('authenticated user can update marketplace settings', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
|
||||
@ -353,7 +353,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('user without update permission is forbidden', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.marketplace.update'), allMarketplaceFeeFields())
|
||||
@ -361,7 +361,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('marketplace fee scope must be valid enum', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
$payload['tiktok_shop_platform_commission']['scope'] = 'invalid';
|
||||
@ -372,7 +372,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('marketplace fee value_type must be valid enum', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
$payload['tiktok_shop_platform_commission']['value_type'] = 'invalid';
|
||||
@ -383,7 +383,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('marketplace fee value must be numeric', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
$payload['tiktok_shop_platform_commission']['value'] = 'not-a-number';
|
||||
@ -394,7 +394,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('marketplace fee percent value must not exceed 100', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
$payload['tiktok_shop_platform_commission']['value_type'] = 'percent';
|
||||
@ -406,7 +406,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('marketplace flat fee must not have decimals', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
|
||||
|
||||
$payload = allMarketplaceFeeFields();
|
||||
$payload['shopee_admin_fee']['value_type'] = 'flat';
|
||||
@ -422,7 +422,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Update HR', function () {
|
||||
test('authenticated user can update HR settings', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -454,7 +454,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('user without update permission is forbidden', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -467,7 +467,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('scheduled_check_in_time is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -480,7 +480,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('scheduled_check_in_time must match HH:MM format', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -493,7 +493,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('scheduled_check_out_time is required', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -506,7 +506,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('late_penalty_amount must be integer', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -519,7 +519,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('late_penalty_amount must not be negative', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -532,7 +532,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('absent_penalty_amount must be integer', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.hr.update'), [
|
||||
@ -549,7 +549,7 @@ function allMarketplaceFeeFields(): array
|
||||
|
||||
describe('Setting Update Homepage', function () {
|
||||
test('authenticated user can update homepage settings', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.homepage.update'), [])
|
||||
@ -562,7 +562,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('user without update permission is forbidden', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.homepage.update'), [])
|
||||
@ -570,7 +570,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('hero_image must be an image when provided', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.homepage.update'), [
|
||||
@ -580,7 +580,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('about_image must be an image when provided', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.homepage.update'), [
|
||||
@ -590,7 +590,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('gallery_images must be an array of images', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
|
||||
|
||||
$this->actingAs($user)
|
||||
->put(route('admin.system.settings.homepage.update'), [
|
||||
@ -600,7 +600,7 @@ function allMarketplaceFeeFields(): array
|
||||
});
|
||||
|
||||
test('gallery_images must not exceed 10 items', function () {
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
|
||||
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
|
||||
|
||||
$images = [];
|
||||
for ($i = 0; $i < 11; $i++) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user