diff --git a/src/resolvers.js b/src/resolvers.js index df558a7..3f17b14 100644 --- a/src/resolvers.js +++ b/src/resolvers.js @@ -204,6 +204,29 @@ async function requireCompletedCounterpartyProfile(context, userId) { } } +async function resolveOrderRequirements(context, user, deliveryAddressId) { + if (user.role !== 'MANAGER') { + await requireCompletedCounterpartyProfile(context, user.id); + return resolveSelectedDeliveryAddress(context, user.id, deliveryAddressId); + } + + const normalizedAddressId = normalizeOptionalText(deliveryAddressId); + if (normalizedAddressId) { + return resolveSelectedDeliveryAddress(context, user.id, normalizedAddressId); + } + + const manager = await context.prisma.user.findUnique({ + where: { id: user.id }, + select: { defaultDeliveryAddressId: true }, + }); + + if (!manager?.defaultDeliveryAddressId) { + return null; + } + + return resolveSelectedDeliveryAddress(context, user.id, manager.defaultDeliveryAddressId); +} + function formatOrderStatusMessage(order, status, note) { const suffix = note ? `\nКомментарий: ${note}` : ''; return `Заказ ${order.code} изменил статус: ${status}.${suffix}`; @@ -367,7 +390,7 @@ export const resolvers = { myOrders: (_, __, context) => { const user = requireUser(context); return context.prisma.order.findMany({ - where: user.role === 'MANAGER' ? { managerId: user.id } : { customerId: user.id }, + where: { customerId: user.id }, include: { items: true, history: { orderBy: { createdAt: 'desc' } }, @@ -380,7 +403,7 @@ export const resolvers = { const user = requireUser(context); return context.prisma.order.findMany({ where: { - ...(user.role === 'MANAGER' ? { managerId: user.id } : { customerId: user.id }), + customerId: user.id, status: { in: ACTIVE_ORDER_STATUSES }, }, include: { @@ -839,12 +862,11 @@ export const resolvers = { }, submitReadyOrder: async (_, { input }, context) => { - const customer = requireRole(context, 'CLIENT'); - await requireCompletedCounterpartyProfile(context, customer.id); + const customer = requireUser(context); if (!input.items.length) { throw new Error('Order must contain at least one item.'); } - const selectedAddress = await resolveSelectedDeliveryAddress(context, customer.id, input.deliveryAddressId); + const selectedAddress = await resolveOrderRequirements(context, customer, input.deliveryAddressId); const productIds = input.items.map((item) => item.productId); const products = await context.prisma.product.findMany({ @@ -862,8 +884,8 @@ export const resolvers = { code: orderCode(), kind: 'READY', customerId: customer.id, - deliveryAddressId: selectedAddress.id, - deliveryAddress: presentDeliveryAddress(selectedAddress), + deliveryAddressId: selectedAddress?.id ?? null, + deliveryAddress: selectedAddress ? presentDeliveryAddress(selectedAddress) : null, status: 'NEW', items: { create: input.items.map((item) => { @@ -892,16 +914,15 @@ export const resolvers = { }, submitCalculationOrder: async (_, { input }, context) => { - const customer = requireRole(context, 'CLIENT'); - await requireCompletedCounterpartyProfile(context, customer.id); - const selectedAddress = await resolveSelectedDeliveryAddress(context, customer.id, input.deliveryAddressId); + const customer = requireUser(context); + const selectedAddress = await resolveOrderRequirements(context, customer, input.deliveryAddressId); const order = await context.prisma.order.create({ data: { code: orderCode(), kind: 'CALCULATION', customerId: customer.id, - deliveryAddressId: selectedAddress.id, - deliveryAddress: presentDeliveryAddress(selectedAddress), + deliveryAddressId: selectedAddress?.id ?? null, + deliveryAddress: selectedAddress ? presentDeliveryAddress(selectedAddress) : null, status: 'NEW', calculationPayload: input.parameters, items: {