Add manager user and bonus queries

This commit is contained in:
Ruslan Bakiev
2026-04-04 09:28:52 +07:00
parent b01b2421b5
commit da7cad207c
2 changed files with 122 additions and 0 deletions

View File

@@ -468,6 +468,46 @@ export const resolvers = {
});
},
managerUsers: async (_, __, context) => {
requireRole(context, 'MANAGER');
const users = await context.prisma.user.findMany({
where: { role: 'CLIENT' },
include: {
counterpartyProfile: {
select: {
companyName: true,
inn: true,
},
},
clientOrders: {
select: {
createdAt: true,
},
orderBy: { createdAt: 'desc' },
take: 1,
},
_count: {
select: {
clientOrders: true,
},
},
},
orderBy: { createdAt: 'desc' },
});
return users.map((user) => ({
id: user.id,
email: user.email,
fullName: user.fullName,
role: user.role,
companyName: user.counterpartyProfile?.companyName ?? null,
inn: user.counterpartyProfile?.inn ?? null,
createdAt: user.createdAt,
orderCount: user._count.clientOrders,
lastOrderAt: user.clientOrders[0]?.createdAt ?? null,
}));
},
managerOrders: (_, { status }, context) => {
const manager = requireRole(context, 'MANAGER');
return context.prisma.order.findMany({
@@ -483,6 +523,62 @@ export const resolvers = {
});
},
managerBonusBalances: async (_, __, context) => {
requireRole(context, 'MANAGER');
const [users, transactionsAgg, pendingWithdrawalsAgg] = await Promise.all([
context.prisma.user.findMany({
where: { role: 'CLIENT' },
include: {
counterpartyProfile: {
select: {
companyName: true,
},
},
},
orderBy: { createdAt: 'desc' },
}),
context.prisma.bonusTransaction.groupBy({
by: ['userId'],
_sum: { amount: true },
_count: { _all: true },
}),
context.prisma.rewardWithdrawalRequest.groupBy({
by: ['requesterId'],
where: { status: 'PENDING' },
_sum: { amount: true },
}),
]);
const txMap = new Map(transactionsAgg.map((item) => [
item.userId,
{
balance: Number(item._sum.amount ?? 0),
transactionsCount: item._count._all,
},
]));
const pendingMap = new Map(pendingWithdrawalsAgg.map((item) => [
item.requesterId,
Number(item._sum.amount ?? 0),
]));
return users.map((user) => {
const tx = txMap.get(user.id);
const pendingWithdrawalAmount = pendingMap.get(user.id) ?? 0;
return {
userId: user.id,
email: user.email,
fullName: user.fullName,
companyName: user.counterpartyProfile?.companyName ?? null,
balance: (tx?.balance ?? 0) - pendingWithdrawalAmount,
pendingWithdrawalAmount,
transactionsCount: tx?.transactionsCount ?? 0,
};
});
},
registrationRequests: (_, { status }, context) => {
requireRole(context, 'MANAGER');
return context.prisma.registrationRequest.findMany({
@@ -1103,6 +1199,7 @@ export const resolvers = {
code: orderCode(),
kind: 'READY',
customerId: customer.id,
managerId: customer.role === 'MANAGER' ? customer.id : null,
deliveryAddressId: selectedAddress.id,
deliveryAddress: presentDeliveryAddress(selectedAddress),
status: 'NEW',
@@ -1140,6 +1237,7 @@ export const resolvers = {
code: orderCode(),
kind: 'CALCULATION',
customerId: customer.id,
managerId: customer.role === 'MANAGER' ? customer.id : null,
deliveryAddressId: selectedAddress.id,
deliveryAddress: presentDeliveryAddress(selectedAddress),
status: 'NEW',