53 lines
1.8 KiB
JavaScript
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
|
|
};
|