Files
SS/src/services/admin.service.js
T

53 lines
1.8 KiB
JavaScript

const { getDb } = require('../config/db');
const { formatMoney, parseMoney } = require('../utils/money');
function calculateProviderCost(providerPrice, quantity) {
return (parseMoney(String(providerPrice)) * BigInt(quantity) + 500n) / 1000n;
}
async function listAdminUsers() {
return getDb()('users')
.select('id', 'username', 'email', 'role', 'status', 'balance', 'created_at', 'updated_at')
.orderBy('created_at', 'desc')
.orderBy('id', 'desc');
}
async function getAdminStats() {
const db = getDb();
const [[usersTotal], [activeUsers], [pendingDeposits], [pendingOrders], orders] = await Promise.all([
db('users').count({ count: '*' }),
db('users').where({ status: 'active' }).count({ count: '*' }),
db('deposits').where({ status: 'pending' }).count({ count: '*' }),
db('orders').whereIn('status', ['pending', 'processing', 'in_progress']).count({ count: '*' }),
db('orders')
.join('services', 'services.id', 'orders.service_id')
.select('orders.charge', 'orders.quantity', 'services.provider_price', 'orders.status')
]);
let grossSales = 0n;
let providerCost = 0n;
for (const order of orders) {
if (!['processing', 'in_progress', 'completed', 'partial'].includes(order.status)) {
continue;
}
grossSales += parseMoney(order.charge);
providerCost += calculateProviderCost(order.provider_price, order.quantity);
}
return {
users_total: Number(usersTotal.count),
users_active: Number(activeUsers.count),
deposits_pending: Number(pendingDeposits.count),
orders_pending: Number(pendingOrders.count),
gross_sales: formatMoney(grossSales),
provider_cost: formatMoney(providerCost),
profit: formatMoney(grossSales - providerCost)
};
}
module.exports = {
getAdminStats,
listAdminUsers
};