From 7d721cab315919bdaf573407bbb73e9191fadf3e Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sat, 13 Jun 2026 01:20:12 +0700 Subject: [PATCH] Refactor marketplace settings to use structured fee rules. Update MarketplaceRequest, MarketplaceService, and MarketplaceSettings to handle fees as arrays with scope and value type. Enhance frontend components to accommodate new fee structure and validation logic for improved user experience. --- app/Enums/MarketplaceFeeScope.php | 21 ++ app/Enums/MarketplaceFeeValueType.php | 21 ++ .../System/Setting/MarketplaceRequest.php | 65 ++++-- .../System/Setting/MarketplaceService.php | 129 +++++++---- app/Settings/MarketplaceSettings.php | 30 ++- .../Marketplace/MarketplaceFeeRule.php | 48 ++++ .../2026_06_11_085959_create_app_settings.php | 29 ++- .../admin/setting/MarketplaceFeeField.vue | 123 ++++++++++ .../admin/setting/MarketplaceSection.vue | 213 ++++++++---------- resources/js/types/setting.ts | 38 ++-- 10 files changed, 495 insertions(+), 222 deletions(-) create mode 100644 app/Enums/MarketplaceFeeScope.php create mode 100644 app/Enums/MarketplaceFeeValueType.php create mode 100644 app/Support/Marketplace/MarketplaceFeeRule.php create mode 100644 resources/js/components/admin/setting/MarketplaceFeeField.vue diff --git a/app/Enums/MarketplaceFeeScope.php b/app/Enums/MarketplaceFeeScope.php new file mode 100644 index 0000000..e8c3843 --- /dev/null +++ b/app/Enums/MarketplaceFeeScope.php @@ -0,0 +1,21 @@ + 'Per Produk', + self::TRANSACTION => 'Per Transaksi', + }; + } +} diff --git a/app/Enums/MarketplaceFeeValueType.php b/app/Enums/MarketplaceFeeValueType.php new file mode 100644 index 0000000..cb85369 --- /dev/null +++ b/app/Enums/MarketplaceFeeValueType.php @@ -0,0 +1,21 @@ + 'Flat (Rp)', + self::PERCENT => 'Persentase (%)', + }; + } +} diff --git a/app/Http/Requests/Admin/System/Setting/MarketplaceRequest.php b/app/Http/Requests/Admin/System/Setting/MarketplaceRequest.php index 0e543b9..c2188d9 100644 --- a/app/Http/Requests/Admin/System/Setting/MarketplaceRequest.php +++ b/app/Http/Requests/Admin/System/Setting/MarketplaceRequest.php @@ -2,8 +2,12 @@ namespace App\Http\Requests\Admin\System\Setting; +use App\Enums\MarketplaceFeeScope; +use App\Enums\MarketplaceFeeValueType; use App\Enums\Permission; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; +use Illuminate\Validation\Validator; class MarketplaceRequest extends FormRequest { @@ -17,40 +21,63 @@ public function authorize(): bool */ public function rules(): array { - return [ - 'tiktok_shop_enabled' => ['required', 'boolean'], - 'tiktok_shop_admin_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'tiktok_shop_transaction_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'tiktok_shop_payment_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'tiktok_shop_affiliate_commission' => ['required', 'numeric', 'min:0', 'max:100'], - 'tiktok_shop_shipping_subsidy' => ['required', 'numeric', 'min:0', 'max:100'], - 'tiktok_shop_vat_rate' => ['required', 'numeric', 'min:0', 'max:100'], + $rules = []; - 'shopee_enabled' => ['required', 'boolean'], - 'shopee_commission_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_transaction_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_service_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_payment_fee' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_affiliate_commission' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_shipping_subsidy' => ['required', 'numeric', 'min:0', 'max:100'], - 'shopee_voucher_fee' => ['required', 'numeric', 'min:0', 'max:100'], - ]; + foreach ($this->feeFieldKeys() as $key => $label) { + $rules["{$key}.scope"] = ['required', Rule::enum(MarketplaceFeeScope::class)]; + $rules["{$key}.value_type"] = ['required', Rule::enum(MarketplaceFeeValueType::class)]; + $rules["{$key}.value"] = ['required', 'numeric', 'min:0']; + } + + return $rules; + } + + public function withValidator(Validator $validator): void + { + $validator->after(function (Validator $validator): void { + foreach ($this->feeFieldKeys() as $key => $label) { + $valueType = $this->input("{$key}.value_type"); + $value = $this->input("{$key}.value"); + + if ($valueType === MarketplaceFeeValueType::PERCENT->value && is_numeric($value) && (float) $value > 100) { + $validator->errors()->add("{$key}.value", "{$label} tidak boleh lebih dari 100%."); + } + + if ($valueType === MarketplaceFeeValueType::FLAT->value && is_numeric($value) && (float) $value != (int) $value) { + $validator->errors()->add("{$key}.value", "{$label} harus berupa nominal rupiah tanpa desimal."); + } + } + }); } /** * @return array */ public function attributes(): array + { + $attributes = []; + + foreach ($this->feeFieldKeys() as $key => $label) { + $attributes["{$key}.scope"] = "dasar {$label}"; + $attributes["{$key}.value_type"] = "tipe {$label}"; + $attributes["{$key}.value"] = $label; + } + + return $attributes; + } + + /** + * @return array + */ + private function feeFieldKeys(): array { return [ - 'tiktok_shop_enabled' => 'aktif', 'tiktok_shop_admin_fee' => 'biaya admin TikTok Shop', 'tiktok_shop_transaction_fee' => 'biaya transaksi TikTok Shop', 'tiktok_shop_payment_fee' => 'biaya pembayaran TikTok Shop', 'tiktok_shop_affiliate_commission' => 'komisi afiliasi TikTok Shop', 'tiktok_shop_shipping_subsidy' => 'subsidi ongkir TikTok Shop', 'tiktok_shop_vat_rate' => 'PPN / pajak TikTok Shop', - 'shopee_enabled' => 'aktif', 'shopee_commission_fee' => 'komisi Shopee', 'shopee_transaction_fee' => 'biaya transaksi Shopee', 'shopee_service_fee' => 'biaya layanan Shopee', diff --git a/app/Services/System/Setting/MarketplaceService.php b/app/Services/System/Setting/MarketplaceService.php index 6c7c96e..87f9c23 100644 --- a/app/Services/System/Setting/MarketplaceService.php +++ b/app/Services/System/Setting/MarketplaceService.php @@ -4,29 +4,59 @@ use App\Enums\OrderChannel; use App\Settings\MarketplaceSettings; +use App\Support\Marketplace\MarketplaceFeeRule; class MarketplaceService { + /** + * @return list + */ + private function tiktokFeeKeys(): array + { + return [ + 'tiktok_shop_admin_fee', + 'tiktok_shop_transaction_fee', + 'tiktok_shop_payment_fee', + 'tiktok_shop_affiliate_commission', + 'tiktok_shop_shipping_subsidy', + 'tiktok_shop_vat_rate', + ]; + } + + /** + * @return list + */ + private function shopeeFeeKeys(): array + { + return [ + 'shopee_commission_fee', + 'shopee_transaction_fee', + 'shopee_service_fee', + 'shopee_payment_fee', + 'shopee_affiliate_commission', + 'shopee_shipping_subsidy', + 'shopee_voucher_fee', + ]; + } + public function marketplaceData(): array { $settings = app(MarketplaceSettings::class); return [ - 'tiktok_shop_enabled' => $settings->tiktok_shop_enabled, - 'tiktok_shop_admin_fee' => $settings->tiktok_shop_admin_fee, - 'tiktok_shop_transaction_fee' => $settings->tiktok_shop_transaction_fee, - 'tiktok_shop_payment_fee' => $settings->tiktok_shop_payment_fee, - 'tiktok_shop_affiliate_commission' => $settings->tiktok_shop_affiliate_commission, - 'tiktok_shop_shipping_subsidy' => $settings->tiktok_shop_shipping_subsidy, - 'tiktok_shop_vat_rate' => $settings->tiktok_shop_vat_rate, - 'shopee_enabled' => $settings->shopee_enabled, - 'shopee_commission_fee' => $settings->shopee_commission_fee, - 'shopee_transaction_fee' => $settings->shopee_transaction_fee, - 'shopee_service_fee' => $settings->shopee_service_fee, - 'shopee_payment_fee' => $settings->shopee_payment_fee, - 'shopee_affiliate_commission' => $settings->shopee_affiliate_commission, - 'shopee_shipping_subsidy' => $settings->shopee_shipping_subsidy, - 'shopee_voucher_fee' => $settings->shopee_voucher_fee, + 'tiktok_shop_admin_fee' => $this->presentFeeRule($settings->tiktok_shop_admin_fee), + 'tiktok_shop_transaction_fee' => $this->presentFeeRule($settings->tiktok_shop_transaction_fee), + 'tiktok_shop_payment_fee' => $this->presentFeeRule($settings->tiktok_shop_payment_fee), + 'tiktok_shop_affiliate_commission' => $this->presentFeeRule($settings->tiktok_shop_affiliate_commission), + 'tiktok_shop_shipping_subsidy' => $this->presentFeeRule($settings->tiktok_shop_shipping_subsidy), + 'tiktok_shop_vat_rate' => $this->presentFeeRule($settings->tiktok_shop_vat_rate), + 'shopee_commission_fee' => $this->presentFeeRule($settings->shopee_commission_fee), + 'shopee_transaction_fee' => $this->presentFeeRule($settings->shopee_transaction_fee), + 'shopee_service_fee' => $this->presentFeeRule($settings->shopee_service_fee), + 'shopee_payment_fee' => $this->presentFeeRule($settings->shopee_payment_fee), + 'shopee_affiliate_commission' => $this->presentFeeRule($settings->shopee_affiliate_commission), + 'shopee_shipping_subsidy' => $this->presentFeeRule($settings->shopee_shipping_subsidy), + 'shopee_voucher_fee' => $this->presentFeeRule($settings->shopee_voucher_fee), ]; } @@ -34,22 +64,13 @@ public function updateMarketplace(array $validated): void { $settings = app(MarketplaceSettings::class); - $settings->tiktok_shop_enabled = $validated['tiktok_shop_enabled']; - $settings->tiktok_shop_admin_fee = $validated['tiktok_shop_admin_fee']; - $settings->tiktok_shop_transaction_fee = $validated['tiktok_shop_transaction_fee']; - $settings->tiktok_shop_payment_fee = $validated['tiktok_shop_payment_fee']; - $settings->tiktok_shop_affiliate_commission = $validated['tiktok_shop_affiliate_commission']; - $settings->tiktok_shop_shipping_subsidy = $validated['tiktok_shop_shipping_subsidy']; - $settings->tiktok_shop_vat_rate = $validated['tiktok_shop_vat_rate']; + foreach ($this->tiktokFeeKeys() as $key) { + $settings->{$key} = $this->normalizeFeeRule($validated[$key]); + } - $settings->shopee_enabled = $validated['shopee_enabled']; - $settings->shopee_commission_fee = $validated['shopee_commission_fee']; - $settings->shopee_transaction_fee = $validated['shopee_transaction_fee']; - $settings->shopee_service_fee = $validated['shopee_service_fee']; - $settings->shopee_payment_fee = $validated['shopee_payment_fee']; - $settings->shopee_affiliate_commission = $validated['shopee_affiliate_commission']; - $settings->shopee_shipping_subsidy = $validated['shopee_shipping_subsidy']; - $settings->shopee_voucher_fee = $validated['shopee_voucher_fee']; + foreach ($this->shopeeFeeKeys() as $key) { + $settings->{$key} = $this->normalizeFeeRule($validated[$key]); + } $settings->save(); } @@ -64,24 +85,46 @@ public function snapshotForChannel(OrderChannel $channel): ?array return match ($channel) { OrderChannel::SHOPEE => [ 'platform' => 'shopee', - 'commission_fee' => $settings->shopee_commission_fee, - 'transaction_fee' => $settings->shopee_transaction_fee, - 'service_fee' => $settings->shopee_service_fee, - 'payment_fee' => $settings->shopee_payment_fee, - 'affiliate_commission' => $settings->shopee_affiliate_commission, - 'shipping_subsidy' => $settings->shopee_shipping_subsidy, - 'voucher_fee' => $settings->shopee_voucher_fee, + 'fees' => [ + 'commission_fee' => $this->presentFeeRule($settings->shopee_commission_fee), + 'transaction_fee' => $this->presentFeeRule($settings->shopee_transaction_fee), + 'service_fee' => $this->presentFeeRule($settings->shopee_service_fee), + 'payment_fee' => $this->presentFeeRule($settings->shopee_payment_fee), + 'affiliate_commission' => $this->presentFeeRule($settings->shopee_affiliate_commission), + 'shipping_subsidy' => $this->presentFeeRule($settings->shopee_shipping_subsidy), + 'voucher_fee' => $this->presentFeeRule($settings->shopee_voucher_fee), + ], ], OrderChannel::TIKTOK => [ 'platform' => 'tiktok', - 'admin_fee' => $settings->tiktok_shop_admin_fee, - 'transaction_fee' => $settings->tiktok_shop_transaction_fee, - 'payment_fee' => $settings->tiktok_shop_payment_fee, - 'affiliate_commission' => $settings->tiktok_shop_affiliate_commission, - 'shipping_subsidy' => $settings->tiktok_shop_shipping_subsidy, - 'vat_rate' => $settings->tiktok_shop_vat_rate, + 'fees' => [ + 'admin_fee' => $this->presentFeeRule($settings->tiktok_shop_admin_fee), + 'transaction_fee' => $this->presentFeeRule($settings->tiktok_shop_transaction_fee), + 'payment_fee' => $this->presentFeeRule($settings->tiktok_shop_payment_fee), + 'affiliate_commission' => $this->presentFeeRule($settings->tiktok_shop_affiliate_commission), + 'shipping_subsidy' => $this->presentFeeRule($settings->tiktok_shop_shipping_subsidy), + 'vat_rate' => $this->presentFeeRule($settings->tiktok_shop_vat_rate), + ], ], OrderChannel::STORE => null, }; } + + /** + * @param array{scope: string, value_type: string, value: float|int|string} $data + * @return array{scope: string, value_type: string, value: float} + */ + private function presentFeeRule(array $data): array + { + return MarketplaceFeeRule::fromArray($data)->toArray(); + } + + /** + * @param array{scope: string, value_type: string, value: float|int|string} $data + * @return array{scope: string, value_type: string, value: float} + */ + private function normalizeFeeRule(array $data): array + { + return MarketplaceFeeRule::fromArray($data)->toArray(); + } } diff --git a/app/Settings/MarketplaceSettings.php b/app/Settings/MarketplaceSettings.php index 9251b66..855b51d 100644 --- a/app/Settings/MarketplaceSettings.php +++ b/app/Settings/MarketplaceSettings.php @@ -6,35 +6,31 @@ class MarketplaceSettings extends Settings { - public bool $tiktok_shop_enabled; + public array $tiktok_shop_admin_fee; - public float $tiktok_shop_admin_fee; + public array $tiktok_shop_transaction_fee; - public float $tiktok_shop_transaction_fee; + public array $tiktok_shop_payment_fee; - public float $tiktok_shop_payment_fee; + public array $tiktok_shop_affiliate_commission; - public float $tiktok_shop_affiliate_commission; + public array $tiktok_shop_shipping_subsidy; - public float $tiktok_shop_shipping_subsidy; + public array $tiktok_shop_vat_rate; - public float $tiktok_shop_vat_rate; + public array $shopee_commission_fee; - public bool $shopee_enabled; + public array $shopee_transaction_fee; - public float $shopee_commission_fee; + public array $shopee_service_fee; - public float $shopee_transaction_fee; + public array $shopee_payment_fee; - public float $shopee_service_fee; + public array $shopee_affiliate_commission; - public float $shopee_payment_fee; + public array $shopee_shipping_subsidy; - public float $shopee_affiliate_commission; - - public float $shopee_shipping_subsidy; - - public float $shopee_voucher_fee; + public array $shopee_voucher_fee; public static function group(): string { diff --git a/app/Support/Marketplace/MarketplaceFeeRule.php b/app/Support/Marketplace/MarketplaceFeeRule.php new file mode 100644 index 0000000..96a7019 --- /dev/null +++ b/app/Support/Marketplace/MarketplaceFeeRule.php @@ -0,0 +1,48 @@ + $this->scope->value, + 'value_type' => $this->valueType->value, + 'value' => $this->value, + ]; + } +} diff --git a/database/settings/2026_06_11_085959_create_app_settings.php b/database/settings/2026_06_11_085959_create_app_settings.php index 0880f67..6067825 100644 --- a/database/settings/2026_06_11_085959_create_app_settings.php +++ b/database/settings/2026_06_11_085959_create_app_settings.php @@ -1,5 +1,6 @@ migrator->inGroup('marketplace', function (SettingsBlueprint $blueprint): void { - $blueprint->add('tiktok_shop_enabled', true); - $blueprint->add('tiktok_shop_admin_fee', 5.0); - $blueprint->add('tiktok_shop_transaction_fee', 1.0); - $blueprint->add('tiktok_shop_payment_fee', 0.7); - $blueprint->add('tiktok_shop_affiliate_commission', 0.0); - $blueprint->add('tiktok_shop_shipping_subsidy', 0.0); - $blueprint->add('tiktok_shop_vat_rate', 11.0); + $blueprint->add('tiktok_shop_admin_fee', MarketplaceFeeRule::defaultPercent(5.0)->toArray()); + $blueprint->add('tiktok_shop_transaction_fee', MarketplaceFeeRule::defaultPercent(1.0)->toArray()); + $blueprint->add('tiktok_shop_payment_fee', MarketplaceFeeRule::defaultPercent(0.7)->toArray()); + $blueprint->add('tiktok_shop_affiliate_commission', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('tiktok_shop_shipping_subsidy', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('tiktok_shop_vat_rate', MarketplaceFeeRule::defaultPercent(11.0)->toArray()); - $blueprint->add('shopee_enabled', true); - $blueprint->add('shopee_commission_fee', 6.0); - $blueprint->add('shopee_transaction_fee', 2.0); - $blueprint->add('shopee_service_fee', 0.0); - $blueprint->add('shopee_payment_fee', 0.0); - $blueprint->add('shopee_affiliate_commission', 0.0); - $blueprint->add('shopee_shipping_subsidy', 0.0); - $blueprint->add('shopee_voucher_fee', 0.0); + $blueprint->add('shopee_commission_fee', MarketplaceFeeRule::defaultPercent(6.0)->toArray()); + $blueprint->add('shopee_transaction_fee', MarketplaceFeeRule::defaultPercent(2.0)->toArray()); + $blueprint->add('shopee_service_fee', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('shopee_payment_fee', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('shopee_affiliate_commission', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('shopee_shipping_subsidy', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); + $blueprint->add('shopee_voucher_fee', MarketplaceFeeRule::defaultPercent(0.0)->toArray()); }); } }; diff --git a/resources/js/components/admin/setting/MarketplaceFeeField.vue b/resources/js/components/admin/setting/MarketplaceFeeField.vue new file mode 100644 index 0000000..3b51a83 --- /dev/null +++ b/resources/js/components/admin/setting/MarketplaceFeeField.vue @@ -0,0 +1,123 @@ + + + diff --git a/resources/js/components/admin/setting/MarketplaceSection.vue b/resources/js/components/admin/setting/MarketplaceSection.vue index df27520..a0d2524 100644 --- a/resources/js/components/admin/setting/MarketplaceSection.vue +++ b/resources/js/components/admin/setting/MarketplaceSection.vue @@ -3,19 +3,16 @@ import { useForm } from '@inertiajs/vue3'; import { Save, ShoppingBag, Store } from '@lucide/vue'; import { ref } from 'vue'; import { toast } from 'vue-sonner'; +import MarketplaceFeeField from '@/components/admin/setting/MarketplaceFeeField.vue'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { - Field, FieldError, FieldGroup, - FieldLabel, FieldSet } from '@/components/ui/field'; -import { Input } from '@/components/ui/input'; -import { Switch } from '@/components/ui/switch'; import { formErrors } from '@/lib/form'; import { cn } from '@/lib/utils'; import type { @@ -39,24 +36,30 @@ const platformItems: Array<{ ]; const form = useForm({ - tiktok_shop_enabled: props.data.tiktok_shop_enabled, - tiktok_shop_admin_fee: props.data.tiktok_shop_admin_fee, - tiktok_shop_transaction_fee: props.data.tiktok_shop_transaction_fee, - tiktok_shop_payment_fee: props.data.tiktok_shop_payment_fee, - tiktok_shop_affiliate_commission: props.data.tiktok_shop_affiliate_commission, - tiktok_shop_shipping_subsidy: props.data.tiktok_shop_shipping_subsidy, - tiktok_shop_vat_rate: props.data.tiktok_shop_vat_rate, + tiktok_shop_admin_fee: { ...props.data.tiktok_shop_admin_fee }, + tiktok_shop_transaction_fee: { ...props.data.tiktok_shop_transaction_fee }, + tiktok_shop_payment_fee: { ...props.data.tiktok_shop_payment_fee }, + tiktok_shop_affiliate_commission: { ...props.data.tiktok_shop_affiliate_commission }, + tiktok_shop_shipping_subsidy: { ...props.data.tiktok_shop_shipping_subsidy }, + tiktok_shop_vat_rate: { ...props.data.tiktok_shop_vat_rate }, - shopee_enabled: props.data.shopee_enabled, - shopee_commission_fee: props.data.shopee_commission_fee, - shopee_transaction_fee: props.data.shopee_transaction_fee, - shopee_service_fee: props.data.shopee_service_fee, - shopee_payment_fee: props.data.shopee_payment_fee, - shopee_affiliate_commission: props.data.shopee_affiliate_commission, - shopee_shipping_subsidy: props.data.shopee_shipping_subsidy, - shopee_voucher_fee: props.data.shopee_voucher_fee, + shopee_commission_fee: { ...props.data.shopee_commission_fee }, + shopee_transaction_fee: { ...props.data.shopee_transaction_fee }, + shopee_service_fee: { ...props.data.shopee_service_fee }, + shopee_payment_fee: { ...props.data.shopee_payment_fee }, + shopee_affiliate_commission: { ...props.data.shopee_affiliate_commission }, + shopee_shipping_subsidy: { ...props.data.shopee_shipping_subsidy }, + shopee_voucher_fee: { ...props.data.shopee_voucher_fee }, }); +function feeErrors(key: string): string[] { + return [ + ...formErrors(form, `${key}.scope`), + ...formErrors(form, `${key}.value_type`), + ...formErrors(form, `${key}.value`), + ]; +} + function submit() { form.put('/admin/system/setting/marketplace', { preserveScroll: true, @@ -87,55 +90,47 @@ function submit() {
- - Biaya Admin (%) - - - + - - Biaya Transaksi (%) - - - + - - Biaya Pembayaran (%) - - - + - - Komisi Afiliasi (%) - - - + - - Subsidi Ongkir (%) - - - + - - PPN / Pajak (%) - - - - -
- - - Aktif - -
+
@@ -145,62 +140,54 @@ function submit() {
- - Komisi Shopee (%) - - - + - - Biaya Transaksi (%) - - - + - - Biaya Layanan (%) - - - + - - Biaya Pembayaran (%) - - - + - - Komisi Afiliasi Shopee (%) - - - - + - - Subsidi Ongkir (%) - - - + - - Biaya Voucher / Diskon (%) - - - - -
- - - Aktif - -
+
diff --git a/resources/js/types/setting.ts b/resources/js/types/setting.ts index f1e8979..290cb29 100644 --- a/resources/js/types/setting.ts +++ b/resources/js/types/setting.ts @@ -2,6 +2,16 @@ export type SettingSection = 'system' | 'social' | 'marketplace'; export type MarketplacePlatform = 'tiktok_shop' | 'shopee'; +export type MarketplaceFeeScope = 'product' | 'transaction'; + +export type MarketplaceFeeValueType = 'flat' | 'percent'; + +export type MarketplaceFeeRule = { + scope: MarketplaceFeeScope; + value_type: MarketplaceFeeValueType; + value: number; +}; + export type SystemSettingsData = { app_name: string; about_app: string; @@ -19,19 +29,17 @@ export type SocialMediaSettingsData = { }; export type MarketplaceSettingsData = { - tiktok_shop_enabled: boolean; - tiktok_shop_admin_fee: number; - tiktok_shop_transaction_fee: number; - tiktok_shop_payment_fee: number; - tiktok_shop_affiliate_commission: number; - tiktok_shop_shipping_subsidy: number; - tiktok_shop_vat_rate: number; - shopee_enabled: boolean; - shopee_commission_fee: number; - shopee_transaction_fee: number; - shopee_service_fee: number; - shopee_payment_fee: number; - shopee_affiliate_commission: number; - shopee_shipping_subsidy: number; - shopee_voucher_fee: number; + tiktok_shop_admin_fee: MarketplaceFeeRule; + tiktok_shop_transaction_fee: MarketplaceFeeRule; + tiktok_shop_payment_fee: MarketplaceFeeRule; + tiktok_shop_affiliate_commission: MarketplaceFeeRule; + tiktok_shop_shipping_subsidy: MarketplaceFeeRule; + tiktok_shop_vat_rate: MarketplaceFeeRule; + shopee_commission_fee: MarketplaceFeeRule; + shopee_transaction_fee: MarketplaceFeeRule; + shopee_service_fee: MarketplaceFeeRule; + shopee_payment_fee: MarketplaceFeeRule; + shopee_affiliate_commission: MarketplaceFeeRule; + shopee_shipping_subsidy: MarketplaceFeeRule; + shopee_voucher_fee: MarketplaceFeeRule; };