Add manager user and bonus queries
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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!
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user