Files
boc/services/frilans-payout/markets.mjs
T
Bernt 1a12fb870b dev-api: add developer portal, OpenAPI spec, and Flatenbadet case study
- New /developers/ page with API docs, SDKs, pricing, use cases
- OpenAPI 3.0 spec for Orders, Missions, Photos, Analytics
- Case study: Glasskiosken i Flatenbadet — complete ROI analysis
- Updated /order/ with recurring missions and frequency dropdown
2026-07-14 15:27:33 +00:00

152 lines
3.6 KiB
JavaScript

/**
* quiXzoom Frilans Payout — Market Configurations
* Multi-market support with tax rates and payout methods
*/
export const MARKETS = {
SE: {
country: 'SE',
currency: 'SEK',
language: 'sv',
tax_rate: 0.30,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 100,
payout_schedule: 'weekly',
requires_company: false,
frilans_available: true,
stripe_connect_available: true,
bank_transfer_available: true,
},
NO: {
country: 'NO',
currency: 'NOK',
language: 'no',
tax_rate: 0.25,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 100,
payout_schedule: 'weekly',
requires_company: false,
frilans_available: true,
stripe_connect_available: true,
bank_transfer_available: true,
},
DK: {
country: 'DK',
currency: 'DKK',
language: 'da',
tax_rate: 0.27,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 100,
payout_schedule: 'weekly',
requires_company: false,
frilans_available: true,
stripe_connect_available: true,
bank_transfer_available: true,
},
FI: {
country: 'FI',
currency: 'EUR',
language: 'fi',
tax_rate: 0.25,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 10,
payout_schedule: 'monthly',
requires_company: true,
frilans_available: false,
stripe_connect_available: true,
bank_transfer_available: true,
},
DE: {
country: 'DE',
currency: 'EUR',
language: 'de',
tax_rate: 0.20,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 10,
payout_schedule: 'monthly',
requires_company: true,
frilans_available: false,
stripe_connect_available: true,
bank_transfer_available: true,
},
NL: {
country: 'NL',
currency: 'EUR',
language: 'nl',
tax_rate: 0.25,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 10,
payout_schedule: 'monthly',
requires_company: true,
frilans_available: false,
stripe_connect_available: true,
bank_transfer_available: true,
},
US: {
country: 'US',
currency: 'USD',
language: 'en',
tax_rate: 0.15,
platform_fee_pct: 0.15,
processing_fee_pct: 0.029,
min_payout: 10,
payout_schedule: 'weekly',
requires_company: false,
frilans_available: false,
stripe_connect_available: true,
bank_transfer_available: true,
},
GB: {
country: 'GB',
currency: 'GBP',
language: 'en',
tax_rate: 0.20,
platform_fee_pct: 0.15,
processing_fee_pct: 0.06,
min_payout: 10,
payout_schedule: 'weekly',
requires_company: false,
frilans_available: true,
stripe_connect_available: true,
bank_transfer_available: true,
},
};
export function getMarket(countryCode) {
return MARKETS[countryCode.toUpperCase()] || null;
}
export function listMarkets() {
return Object.values(MARKETS);
}
export function calculatePayout(amount, market, taxHandling) {
const platformFee = Math.round(amount * market.platform_fee_pct);
const processingFee = Math.round(amount * market.processing_fee_pct);
let taxAmount = 0;
if (taxHandling === 'platform') {
taxAmount = Math.round((amount - platformFee) * market.tax_rate);
}
const netAmount = amount - platformFee - processingFee - taxAmount;
return {
gross_amount: amount,
platform_fee: platformFee,
platform_fee_pct: market.platform_fee_pct,
processing_fee: processingFee,
processing_fee_pct: market.processing_fee_pct,
tax_amount: taxAmount,
tax_rate: taxHandling === 'platform' ? market.tax_rate : 0,
net_amount: netAmount,
currency: market.currency,
};
}