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 })}
- />
-
-
-
-
-
-