Allow managers to place personal orders
This commit is contained in:
@@ -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) {
|
function formatOrderStatusMessage(order, status, note) {
|
||||||
const suffix = note ? `\nКомментарий: ${note}` : '';
|
const suffix = note ? `\nКомментарий: ${note}` : '';
|
||||||
return `Заказ ${order.code} изменил статус: ${status}.${suffix}`;
|
return `Заказ ${order.code} изменил статус: ${status}.${suffix}`;
|
||||||
@@ -367,7 +390,7 @@ export const resolvers = {
|
|||||||
myOrders: (_, __, context) => {
|
myOrders: (_, __, context) => {
|
||||||
const user = requireUser(context);
|
const user = requireUser(context);
|
||||||
return context.prisma.order.findMany({
|
return context.prisma.order.findMany({
|
||||||
where: user.role === 'MANAGER' ? { managerId: user.id } : { customerId: user.id },
|
where: { customerId: user.id },
|
||||||
include: {
|
include: {
|
||||||
items: true,
|
items: true,
|
||||||
history: { orderBy: { createdAt: 'desc' } },
|
history: { orderBy: { createdAt: 'desc' } },
|
||||||
@@ -380,7 +403,7 @@ export const resolvers = {
|
|||||||
const user = requireUser(context);
|
const user = requireUser(context);
|
||||||
return context.prisma.order.findMany({
|
return context.prisma.order.findMany({
|
||||||
where: {
|
where: {
|
||||||
...(user.role === 'MANAGER' ? { managerId: user.id } : { customerId: user.id }),
|
customerId: user.id,
|
||||||
status: { in: ACTIVE_ORDER_STATUSES },
|
status: { in: ACTIVE_ORDER_STATUSES },
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
@@ -839,12 +862,11 @@ export const resolvers = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
submitReadyOrder: async (_, { input }, context) => {
|
submitReadyOrder: async (_, { input }, context) => {
|
||||||
const customer = requireRole(context, 'CLIENT');
|
const customer = requireUser(context);
|
||||||
await requireCompletedCounterpartyProfile(context, customer.id);
|
|
||||||
if (!input.items.length) {
|
if (!input.items.length) {
|
||||||
throw new Error('Order must contain at least one item.');
|
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 productIds = input.items.map((item) => item.productId);
|
||||||
const products = await context.prisma.product.findMany({
|
const products = await context.prisma.product.findMany({
|
||||||
@@ -862,8 +884,8 @@ export const resolvers = {
|
|||||||
code: orderCode(),
|
code: orderCode(),
|
||||||
kind: 'READY',
|
kind: 'READY',
|
||||||
customerId: customer.id,
|
customerId: customer.id,
|
||||||
deliveryAddressId: selectedAddress.id,
|
deliveryAddressId: selectedAddress?.id ?? null,
|
||||||
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
deliveryAddress: selectedAddress ? presentDeliveryAddress(selectedAddress) : null,
|
||||||
status: 'NEW',
|
status: 'NEW',
|
||||||
items: {
|
items: {
|
||||||
create: input.items.map((item) => {
|
create: input.items.map((item) => {
|
||||||
@@ -892,16 +914,15 @@ export const resolvers = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
submitCalculationOrder: async (_, { input }, context) => {
|
submitCalculationOrder: async (_, { input }, context) => {
|
||||||
const customer = requireRole(context, 'CLIENT');
|
const customer = requireUser(context);
|
||||||
await requireCompletedCounterpartyProfile(context, customer.id);
|
const selectedAddress = await resolveOrderRequirements(context, customer, input.deliveryAddressId);
|
||||||
const selectedAddress = await resolveSelectedDeliveryAddress(context, customer.id, input.deliveryAddressId);
|
|
||||||
const order = await context.prisma.order.create({
|
const order = await context.prisma.order.create({
|
||||||
data: {
|
data: {
|
||||||
code: orderCode(),
|
code: orderCode(),
|
||||||
kind: 'CALCULATION',
|
kind: 'CALCULATION',
|
||||||
customerId: customer.id,
|
customerId: customer.id,
|
||||||
deliveryAddressId: selectedAddress.id,
|
deliveryAddressId: selectedAddress?.id ?? null,
|
||||||
deliveryAddress: presentDeliveryAddress(selectedAddress),
|
deliveryAddress: selectedAddress ? presentDeliveryAddress(selectedAddress) : null,
|
||||||
status: 'NEW',
|
status: 'NEW',
|
||||||
calculationPayload: input.parameters,
|
calculationPayload: input.parameters,
|
||||||
items: {
|
items: {
|
||||||
|
|||||||
Reference in New Issue
Block a user