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; };