Enhance account synchronization with optional tariff syncing

- Updated `syncAccount` function to accept options for selective synchronization.
- Modified `syncFromBillmanager` to handle new options for skipping tariff syncs.
- Adjusted `TariffsPage` to utilize the new option for syncing only tariffs.
- Removed unused tariff tracking from `VpsPage` and updated sync message logic accordingly.
This commit is contained in:
Denozordec
2026-03-17 23:52:25 +07:00
parent 0dd2f0d7fa
commit 9717b0156c
4 changed files with 11 additions and 9 deletions
+3 -1
View File
@@ -64,6 +64,7 @@ router.post('/:accountId', async (req, res) => {
try {
const db = getDb()
const { accountId } = req.params
const { onlyTariffs = false } = req.body || {}
const row = db.prepare('SELECT * FROM provider_accounts WHERE id = ?').get(accountId)
if (!row) {
return res.status(404).json({ error: 'Account not found' })
@@ -81,7 +82,8 @@ router.post('/:accountId', async (req, res) => {
VALUES (?, ?, ?, ?)
`).run(logId, accountId, new Date().toISOString(), 'running')
const result = await syncFromBillmanager(row, db)
const opts = onlyTariffs ? { skipVpsPayments: true } : { skipTariffs: true }
const result = await syncFromBillmanager(row, db, opts)
db.prepare(`
UPDATE sync_log SET finishedAt=?, status=?, vpsCount=?, paymentsCount=?
+5 -2
View File
@@ -135,8 +135,11 @@ export async function bulkUpdateVps(ids, action, value) {
})
}
export async function syncAccount(accountId) {
return fetchApi(`/api/sync/${encodeURIComponent(accountId)}`, { method: 'POST' })
export async function syncAccount(accountId, opts = {}) {
return fetchApi(`/api/sync/${encodeURIComponent(accountId)}`, {
method: 'POST',
body: JSON.stringify(opts),
})
}
export async function fetchAccountBalance(accountId) {
+1 -1
View File
@@ -147,7 +147,7 @@ export function TariffsPage({ db, actions, settings, ratesData }) {
let lastError = null
for (const account of billmanagerAccounts) {
try {
const result = await syncAccount(account.id)
const result = await syncAccount(account.id, { onlyTariffs: true })
if (result.ok) {
totalTariffs += result.synced?.tariffsCount ?? 0
} else {
+2 -5
View File
@@ -328,7 +328,6 @@ export function VpsPage({ db, actions, settings, ratesData }) {
setSyncMessage(null)
let totalVps = 0
let totalPayments = 0
let totalTariffs = 0
let lastError = null
for (const account of billmanagerAccounts) {
try {
@@ -336,7 +335,6 @@ export function VpsPage({ db, actions, settings, ratesData }) {
if (result.ok) {
totalVps += result.synced?.vpsCount ?? 0
totalPayments += result.synced?.paymentsCount ?? 0
totalTariffs += result.synced?.tariffsCount ?? 0
} else {
lastError = result.error
}
@@ -344,16 +342,15 @@ export function VpsPage({ db, actions, settings, ratesData }) {
lastError = err.message
}
}
if (lastError && totalVps === 0 && totalPayments === 0 && totalTariffs === 0) {
if (lastError && totalVps === 0 && totalPayments === 0) {
setSyncMessage(lastError)
} else {
const parts = []
if (totalVps > 0) parts.push(`${totalVps} VPS`)
if (totalPayments > 0) parts.push(`${totalPayments} платежей`)
if (totalTariffs > 0) parts.push(`${totalTariffs} тарифов`)
setSyncMessage(`Синхронизировано: ${parts.join(', ')}${lastError ? `. Ошибки: ${lastError}` : ''}`)
}
if (totalVps > 0 || totalPayments > 0 || totalTariffs > 0) await actions.refreshData()
if (totalVps > 0 || totalPayments > 0) await actions.refreshData()
setSyncLoading(false)
}