diff --git a/src/pages/Currency.jsx b/src/pages/Currency.jsx index 48e086b..69f4ee4 100644 --- a/src/pages/Currency.jsx +++ b/src/pages/Currency.jsx @@ -49,10 +49,13 @@ const Currency = () => { voucherLimits: { min: null, max: null }, }); const [feesForm, setFeesForm] = useState({ - depositLimits: { min: null, max: null }, - cashOutLimits: { min: null, max: null }, - transferLimits: { min: null, max: null }, - voucherLimits: { min: null, max: null }, + depositFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + cashOutFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + transferFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + exchangeFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + generateVoucherByAgentFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + generateVoucherByUserFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, + expireVoucherSystemFee: { percent: 0, fixed: 0, minAmount: null, maxAmount: null }, }); // دریافت ارزها @@ -180,16 +183,51 @@ const Currency = () => { const onUpdateFees = async (currencyCode, fees) => { try { // API PUT expects: depositFee, cashOutFee, transferFee, exchangeFee, generateVoucherByAgentFee, generateVoucherByUserFee, expireVoucherSystemFee - // But GET returns: depositLimits, cashOutLimits, transferLimits, voucherLimits - // Map our structure to API expected structure + // Each with: { percent, fixed, minAmount, maxAmount } + // Ensure all fields are properly formatted const payload = { - depositFee: fees.depositLimits || { min: null, max: null }, - cashOutFee: fees.cashOutLimits || { min: null, max: null }, - transferFee: fees.transferLimits || { min: null, max: null }, - exchangeFee: { min: null, max: null }, // Required by API - generateVoucherByAgentFee: fees.voucherLimits || { min: null, max: null }, // Map voucherLimits to generateVoucherByAgentFee - generateVoucherByUserFee: { min: null, max: null }, // Required by API - expireVoucherSystemFee: { min: null, max: null }, // Required by API + depositFee: { + percent: Number(fees.depositFee?.percent) || 0, + fixed: Number(fees.depositFee?.fixed) || 0, + minAmount: fees.depositFee?.minAmount != null ? Number(fees.depositFee.minAmount) : null, + maxAmount: fees.depositFee?.maxAmount != null ? Number(fees.depositFee.maxAmount) : null, + }, + cashOutFee: { + percent: Number(fees.cashOutFee?.percent) || 0, + fixed: Number(fees.cashOutFee?.fixed) || 0, + minAmount: fees.cashOutFee?.minAmount != null ? Number(fees.cashOutFee.minAmount) : null, + maxAmount: fees.cashOutFee?.maxAmount != null ? Number(fees.cashOutFee.maxAmount) : null, + }, + transferFee: { + percent: Number(fees.transferFee?.percent) || 0, + fixed: Number(fees.transferFee?.fixed) || 0, + minAmount: fees.transferFee?.minAmount != null ? Number(fees.transferFee.minAmount) : null, + maxAmount: fees.transferFee?.maxAmount != null ? Number(fees.transferFee.maxAmount) : null, + }, + exchangeFee: { + percent: Number(fees.exchangeFee?.percent) || 0, + fixed: Number(fees.exchangeFee?.fixed) || 0, + minAmount: fees.exchangeFee?.minAmount != null ? Number(fees.exchangeFee.minAmount) : null, + maxAmount: fees.exchangeFee?.maxAmount != null ? Number(fees.exchangeFee.maxAmount) : null, + }, + generateVoucherByAgentFee: { + percent: Number(fees.generateVoucherByAgentFee?.percent) || 0, + fixed: Number(fees.generateVoucherByAgentFee?.fixed) || 0, + minAmount: fees.generateVoucherByAgentFee?.minAmount != null ? Number(fees.generateVoucherByAgentFee.minAmount) : null, + maxAmount: fees.generateVoucherByAgentFee?.maxAmount != null ? Number(fees.generateVoucherByAgentFee.maxAmount) : null, + }, + generateVoucherByUserFee: { + percent: Number(fees.generateVoucherByUserFee?.percent) || 0, + fixed: Number(fees.generateVoucherByUserFee?.fixed) || 0, + minAmount: fees.generateVoucherByUserFee?.minAmount != null ? Number(fees.generateVoucherByUserFee.minAmount) : null, + maxAmount: fees.generateVoucherByUserFee?.maxAmount != null ? Number(fees.generateVoucherByUserFee.maxAmount) : null, + }, + expireVoucherSystemFee: { + percent: Number(fees.expireVoucherSystemFee?.percent) || 0, + fixed: Number(fees.expireVoucherSystemFee?.fixed) || 0, + minAmount: fees.expireVoucherSystemFee?.minAmount != null ? Number(fees.expireVoucherSystemFee.minAmount) : null, + maxAmount: fees.expireVoucherSystemFee?.maxAmount != null ? Number(fees.expireVoucherSystemFee.maxAmount) : null, + }, }; console.log('🔵 Currency - onUpdateFees payload:', payload); const result = await currencyAPI.updateFees(currencyCode, payload); @@ -313,17 +351,32 @@ const Currency = () => { try { // Fetch fees data from API const feesData = await currencyAPI.getFees(row.currencyCode); - // API returns: depositLimits, cashOutLimits, transferLimits, voucherLimits - const allowedFields = ['depositLimits', 'cashOutLimits', 'transferLimits', 'voucherLimits']; - const filteredFees = allowedFields.reduce((acc, key) => { + // API returns: depositFee, cashOutFee, transferFee, exchangeFee, generateVoucherByAgentFee, generateVoucherByUserFee, expireVoucherSystemFee + // Each with: { percent, fixed, minAmount, maxAmount } + const defaultFee = { percent: 0, fixed: 0, minAmount: null, maxAmount: null }; + const feeFields = [ + 'depositFee', + 'cashOutFee', + 'transferFee', + 'exchangeFee', + 'generateVoucherByAgentFee', + 'generateVoucherByUserFee', + 'expireVoucherSystemFee' + ]; + const formattedFees = feeFields.reduce((acc, key) => { if (feesData && feesData[key]) { - acc[key] = feesData[key]; + acc[key] = { + percent: feesData[key].percent ?? 0, + fixed: feesData[key].fixed ?? 0, + minAmount: feesData[key].minAmount ?? null, + maxAmount: feesData[key].maxAmount ?? null, + }; } else { - acc[key] = { min: null, max: null }; + acc[key] = { ...defaultFee }; } return acc; }, {}); - setFeesForm(filteredFees); + setFeesForm(formattedFees); } catch (err) { console.error('Error fetching fees:', err); // Fallback to default structure @@ -558,45 +611,76 @@ const Currency = () => { ...feesForm, [category]: { ...feesForm[category], - [type]: value === '' ? null : parseFloat(value) || null, + [type]: value === '' ? (type === 'percent' || type === 'fixed' ? 0 : null) : parseFloat(value) || (type === 'percent' || type === 'fixed' ? 0 : null), }, }); }; + const formatCategoryName = (category) => { + return category + .replace(/([A-Z])/g, ' $1') + .replace(/^./, str => str.toUpperCase()) + .trim(); + }; + return ( <>