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) => {
|
managerOrders: (_, { status }, context) => {
|
||||||
const manager = requireRole(context, 'MANAGER');
|
const manager = requireRole(context, 'MANAGER');
|
||||||
return context.prisma.order.findMany({
|
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) => {
|
registrationRequests: (_, { status }, context) => {
|
||||||
requireRole(context, 'MANAGER');
|
requireRole(context, 'MANAGER');
|
||||||
return context.prisma.registrationRequest.findMany({
|
return context.prisma.registrationRequest.findMany({
|
||||||
@@ -1103,6 +1199,7 @@ export const resolvers = {
|
|||||||
code: orderCode(),
|
code: orderCode(),
|
||||||
kind: 'READY',
|
kind: 'READY',
|
||||||
customerId: customer.id,
|
customerId: customer.id,
|
||||||
|
managerId: customer.role === 'MANAGER' ? customer.id : null,
|
||||||
deliveryAddressId: selectedAddress.id,
|
deliveryAddressId: selectedAddress.id,
|
||||||
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
||||||
status: 'NEW',
|
status: 'NEW',
|
||||||
@@ -1140,6 +1237,7 @@ export const resolvers = {
|
|||||||
code: orderCode(),
|
code: orderCode(),
|
||||||
kind: 'CALCULATION',
|
kind: 'CALCULATION',
|
||||||
customerId: customer.id,
|
customerId: customer.id,
|
||||||
|
managerId: customer.role === 'MANAGER' ? customer.id : null,
|
||||||
deliveryAddressId: selectedAddress.id,
|
deliveryAddressId: selectedAddress.id,
|
||||||
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
||||||
status: 'NEW',
|
status: 'NEW',
|
||||||
|
|||||||
@@ -136,6 +136,18 @@ type RegistrationRequest {
|
|||||||
updatedAt: DateTime!
|
updatedAt: DateTime!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ManagerUser {
|
||||||
|
id: ID!
|
||||||
|
email: String!
|
||||||
|
fullName: String!
|
||||||
|
role: UserRole!
|
||||||
|
companyName: String
|
||||||
|
inn: String
|
||||||
|
createdAt: DateTime!
|
||||||
|
orderCount: Int!
|
||||||
|
lastOrderAt: DateTime
|
||||||
|
}
|
||||||
|
|
||||||
type MessengerConnection {
|
type MessengerConnection {
|
||||||
id: ID!
|
id: ID!
|
||||||
userId: ID!
|
userId: ID!
|
||||||
@@ -284,6 +296,16 @@ type ReferralStats {
|
|||||||
pendingWithdrawals: [RewardWithdrawalRequest!]!
|
pendingWithdrawals: [RewardWithdrawalRequest!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ManagerBonusBalance {
|
||||||
|
userId: ID!
|
||||||
|
email: String!
|
||||||
|
fullName: String!
|
||||||
|
companyName: String
|
||||||
|
balance: Float!
|
||||||
|
pendingWithdrawalAmount: Float!
|
||||||
|
transactionsCount: Int!
|
||||||
|
}
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
healthcheck: String!
|
healthcheck: String!
|
||||||
me: User
|
me: User
|
||||||
@@ -296,7 +318,9 @@ type Query {
|
|||||||
clientProducts: [Product!]!
|
clientProducts: [Product!]!
|
||||||
myOrders: [Order!]!
|
myOrders: [Order!]!
|
||||||
myCurrentOrders: [Order!]!
|
myCurrentOrders: [Order!]!
|
||||||
|
managerUsers: [ManagerUser!]!
|
||||||
managerOrders(status: OrderStatus): [Order!]!
|
managerOrders(status: OrderStatus): [Order!]!
|
||||||
|
managerBonusBalances: [ManagerBonusBalance!]!
|
||||||
registrationRequests(status: RegistrationStatus): [RegistrationRequest!]!
|
registrationRequests(status: RegistrationStatus): [RegistrationRequest!]!
|
||||||
referralStats: ReferralStats!
|
referralStats: ReferralStats!
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user