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
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
/**
|
||||
* 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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user