diff --git a/frontend/src/BillingManager.jsx b/frontend/src/BillingManager.jsx index 1e2e1e4..5fdbe4f 100644 --- a/frontend/src/BillingManager.jsx +++ b/frontend/src/BillingManager.jsx @@ -54,6 +54,7 @@ function BillingManager() { currency: 'USD', note: '' }); + const [editingPayment, setEditingPayment] = useState(null); // { serverId, index } // Состояние для курсов валют const [exchangeRates, setExchangeRates] = useState({ @@ -866,11 +867,12 @@ function BillingManager() { Сумма Валюта Комментарий + Действия {(() => { - const rows = billingData.flatMap(server => (server.payments || []).map((p, idx) => ({ server, ...p, _key: `${server.id}-${idx}` }))).sort((a,b) => new Date(b.date) - new Date(a.date)); + const rows = billingData.flatMap(server => (server.payments || []).map((p, idx) => ({ server, ...p, _key: `${server.id}-${idx}`, _index: idx }))).sort((a,b) => new Date(b.date) - new Date(a.date)); if (rows.length === 0) { return null; } @@ -887,6 +889,27 @@ function BillingManager() { {r.currency || 'USD'} {r.note || ''} + +
+ +
+ )); })()} @@ -970,11 +993,46 @@ function BillingManager() { setTimeout(() => setError(''), 3000); return; } + // Режим редактирования платежа + if (editingPayment && editingPayment.serverId) { + setBillingData(prev => prev.map(s => { + if (s.id !== editingPayment.serverId) return s; + const payments = Array.isArray(s.payments) ? [...s.payments] : []; + if (editingPayment.index != null && payments[editingPayment.index]) { + payments[editingPayment.index] = { + date: paymentDraft.date, + amount: paymentDraft.amount, + currency: paymentDraft.currency || 'USD', + note: paymentDraft.note || '' + }; + } + // обновляем lastPayment* по последней дате + const last = payments + .slice() + .sort((a,b) => new Date(b.date) - new Date(a.date))[0]; + return { + ...s, + payments, + lastPaymentDate: last?.date || '', + lastPaymentAmount: last?.amount || 0, + lastPaymentCurrency: last?.currency || s.monthlyCostCurrency || 'USD' + }; + })); + setEditingPayment(null); + setShowPaymentModal(false); + setSuccess('Платеж обновлен'); + setTimeout(() => setSuccess(''), 3000); + return; + } + // Режим добавления платежа setBillingData(prev => prev.map(s => { if (s.id !== paymentDraft.serverId) return s; const payments = Array.isArray(s.payments) ? [...s.payments] : []; payments.push({ date: paymentDraft.date, amount: paymentDraft.amount, currency: paymentDraft.currency || 'USD', note: paymentDraft.note || '' }); - return { ...s, payments, lastPaymentDate: paymentDraft.date, lastPaymentAmount: paymentDraft.amount, lastPaymentCurrency: paymentDraft.currency || s.monthlyCostCurrency || 'USD' }; + const last = payments + .slice() + .sort((a,b) => new Date(b.date) - new Date(a.date))[0]; + return { ...s, payments, lastPaymentDate: last?.date || '', lastPaymentAmount: last?.amount || 0, lastPaymentCurrency: last?.currency || s.monthlyCostCurrency || 'USD' }; })); setShowPaymentModal(false); setSuccess('Платеж добавлен'); @@ -1111,42 +1169,8 @@ function AddBillingModal({ show, item, onItemChange, onSubmit, onClose }) { /> - {/* Исторические платежи */} -
-
Исторические платежи
-
-
- - onItemChange({ ...item, lastPaymentDate: e.target.value })} - /> -
-
- - onItemChange({ ...item, lastPaymentAmount: parseFloat(e.target.value) || 0 })} - /> -
-
- - -
-
+ {/* Дополнительно */} +