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',

View File

@@ -136,6 +136,18 @@ type RegistrationRequest {
updatedAt: DateTime!
}
type ManagerUser {
id: ID!
email: String!
fullName: String!
role: UserRole!
companyName: String
inn: String
createdAt: DateTime!
orderCount: Int!
lastOrderAt: DateTime
}
type MessengerConnection {
id: ID!
userId: ID!
@@ -284,6 +296,16 @@ type ReferralStats {
pendingWithdrawals: [RewardWithdrawalRequest!]!
}
type ManagerBonusBalance {
userId: ID!
email: String!
fullName: String!
companyName: String
balance: Float!
pendingWithdrawalAmount: Float!
transactionsCount: Int!
}
type Query {
healthcheck: String!
me: User
@@ -296,7 +318,9 @@ type Query {
clientProducts: [Product!]!
myOrders: [Order!]!
myCurrentOrders: [Order!]!
managerUsers: [ManagerUser!]!
managerOrders(status: OrderStatus): [Order!]!
managerBonusBalances: [ManagerBonusBalance!]!
registrationRequests(status: RegistrationStatus): [RegistrationRequest!]!
referralStats: ReferralStats!
}