From cd7f3cb4e77d4fd967fa4296a4b6bbf2155bf60c Mon Sep 17 00:00:00 2001 From: louis Date: Fri, 26 Jun 2026 11:48:20 +0400 Subject: [PATCH] fix(indirect): make preferredSupplierId required + editable after creation Co-Authored-By: Claude Opus 4.6 --- frontend/src/api/indirectPurchases.ts | 2 +- frontend/src/pages/purchases/IndirectPurchasesTab.tsx | 11 +++++++++++ src/modules/purchases/indirect-purchases.schemas.ts | 2 +- src/modules/purchases/purchases.schemas.ts | 1 + src/modules/purchases/purchases.service.ts | 7 +++++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/frontend/src/api/indirectPurchases.ts b/frontend/src/api/indirectPurchases.ts index 3a456b5..a073e60 100644 --- a/frontend/src/api/indirectPurchases.ts +++ b/frontend/src/api/indirectPurchases.ts @@ -84,7 +84,7 @@ export interface CreateIndirectPRInput { estimatedPrice?: number | null; expenseCodeId: number; budgetPeriod: string; // YYYY-MM - preferredSupplierId?: number | null; + preferredSupplierId: number; priority?: 'LOW' | 'NORMAL' | 'HIGH' | 'URGENT'; requiredByDate?: string | null; notes?: string | null; diff --git a/frontend/src/pages/purchases/IndirectPurchasesTab.tsx b/frontend/src/pages/purchases/IndirectPurchasesTab.tsx index 156c869..73956bc 100644 --- a/frontend/src/pages/purchases/IndirectPurchasesTab.tsx +++ b/frontend/src/pages/purchases/IndirectPurchasesTab.tsx @@ -612,6 +612,7 @@ export function IndirectPurchasesTab() { ({ value: s.id, label: s.companyName }))} + /> + @@ -862,6 +872,7 @@ export function IndirectPurchasesTab() { estimatedPrice: selectedPR.estimatedPrice ? Number(selectedPR.estimatedPrice) : null, deliveryCost: (selectedPR as any).deliveryCost ? Number((selectedPR as any).deliveryCost) : null, notes: selectedPR.notes ?? '', + preferredSupplierId: (selectedPR as any).preferredSupplierId ?? undefined, }); setEditingPR(true); }}> diff --git a/src/modules/purchases/indirect-purchases.schemas.ts b/src/modules/purchases/indirect-purchases.schemas.ts index 0766cea..fd77bfc 100644 --- a/src/modules/purchases/indirect-purchases.schemas.ts +++ b/src/modules/purchases/indirect-purchases.schemas.ts @@ -12,7 +12,7 @@ export const createIndirectPRSchema = z.object({ estimatedPrice: z.number().min(0).optional().nullable(), expenseCodeId: z.number().int().positive('Статья расходов обязательна'), budgetPeriod: z.string().regex(/^\d{4}-\d{2}$/, 'Период должен быть в формате YYYY-MM'), - preferredSupplierId: z.number().int().positive().optional().nullable(), + preferredSupplierId: z.number().int().positive({ message: 'Выберите поставщика' }), priority: z.enum(PURCHASE_PRIORITIES).default('NORMAL'), requiredByDate: z.coerce.date().optional().nullable(), notes: z.string().optional().nullable(), diff --git a/src/modules/purchases/purchases.schemas.ts b/src/modules/purchases/purchases.schemas.ts index 7850958..4c4e2e7 100644 --- a/src/modules/purchases/purchases.schemas.ts +++ b/src/modules/purchases/purchases.schemas.ts @@ -33,6 +33,7 @@ export const updatePurchaseRequirementSchema = z.object({ requiredByDate: z.coerce.date().optional().nullable(), notes: z.string().optional().nullable(), supplierHintId: z.number().int().positive().optional().nullable(), + preferredSupplierId: z.number().int().positive().optional().nullable(), inStock: z.boolean().optional(), }); diff --git a/src/modules/purchases/purchases.service.ts b/src/modules/purchases/purchases.service.ts index 168ca7c..7077db7 100644 --- a/src/modules/purchases/purchases.service.ts +++ b/src/modules/purchases/purchases.service.ts @@ -233,6 +233,13 @@ export class PurchaseService { if ((input as any).deliveryCost !== undefined) { data.deliveryCost = (input as any).deliveryCost != null ? Number((input as any).deliveryCost) : null; } + if (input.preferredSupplierId !== undefined) { + if (input.preferredSupplierId != null) { + const supplier = await this.prisma.supplier.findUnique({ where: { id: input.preferredSupplierId } }); + if (!supplier) httpError(404, 'Поставщик не найден'); + } + data.preferredSupplierId = input.preferredSupplierId; + } if ((input as any).isTemplate !== undefined) data.isTemplate = (input as any).isTemplate; if ((input as any).templateName !== undefined) data.templateName = (input as any).templateName;