/** * Fee calculation utilities for money transactions */ export const PROCESSING_FEE_RATE = 0.0125; // 1.25% /** * Calculate the processing fee for a given amount * @param amount - The transaction amount in cents * @returns The processing fee in cents */ export const calculateProcessingFee = (amount: number): number => { return Math.ceil(amount * PROCESSING_FEE_RATE); }; /** * Calculate the total amount required (including processing fee) for sending money * @param amount - The amount to send in cents * @returns The total amount required in cents (amount + processing fee) */ export const calculateTotalAmountForSending = (amount: number): number => { const fee = calculateProcessingFee(amount); return amount + fee; }; /** * Calculate the total amount required (including processing fee) for accepting a money request * @param amount - The amount to send in cents * @returns The total amount required in cents (amount + processing fee) */ export const calculateTotalAmountForRequesting = (amount: number): number => { const fee = calculateProcessingFee(amount); return amount + fee; }; /** * Format fee information for display * @param amount - The base amount in cents * @returns Object with formatted fee information */ export const getFeeInformation = (amount: number) => { const fee = calculateProcessingFee(amount); const total = amount + fee; return { baseAmount: amount, fee, total, feePercentage: PROCESSING_FEE_RATE * 100, formatted: { baseAmount: (amount / 100).toFixed(2), fee: (fee / 100).toFixed(2), total: (total / 100).toFixed(2), } }; }; /** * Validate if user has sufficient balance for a transaction including processing fee * @param userBalance - User's current balance in cents * @param transactionAmount - The transaction amount in cents * @returns Object with validation result and fee information */ export const validateBalanceWithFee = (userBalance: number, transactionAmount: number) => { const totalRequired = calculateTotalAmountForSending(transactionAmount); const feeInfo = getFeeInformation(transactionAmount); return { hasSufficientBalance: userBalance >= totalRequired, requiredBalance: totalRequired, currentBalance: userBalance, shortfall: Math.max(0, totalRequired - userBalance), feeInfo }; };