# 🔍 ДИАГНОСТИКА: ПРОБЛЕМА С ВХОДЯЩИМИ ЗАЯВКАМИ НА ПАРТНЕРСТВО > **Дата:** 2025-09-19 > **Время:** 22:40 > **Проблема:** Пользователь отправил заявку на партнерство, но во входящих ничего нет --- ## 🚨 **ОПИСАНИЕ ПРОБЛЕМЫ** **Пользователь сообщает:** > "я отправил заявку на партнерство - но во входящих ничего нет" **Ожидаемое поведение:** 1. Пользователь A отправляет заявку на партнерство пользователю B 2. У пользователя B в разделе "Входящие заявки" должна появиться заявка 3. Пользователь B может принять или отклонить заявку --- ## 🔧 **ТЕХНИЧЕСКАЯ ДИАГНОСТИКА** ### ✅ **ПРОВЕРЕННЫЕ КОМПОНЕНТЫ:** #### **1. GraphQL Резолвер для входящих заявок:** 📄 **Файл:** `src/graphql/resolvers/domains/counterparty-management.ts:44` ```typescript incomingRequests: async (_: unknown, __: unknown, context: Context) => { const currentUser = await getCurrentUser(context) const incomingRequests = await prisma.counterpartyRequest.findMany({ where: { receiverId: currentUser.organization.id, status: 'PENDING', }, include: { sender: { include: { users: true, apiKeys: true } }, receiver: { include: { users: true, apiKeys: true } }, }, orderBy: { createdAt: 'desc' }, take: 50, }) console.warn('📥 INCOMING_REQUESTS:', { userId: currentUser.id, organizationId: currentUser.organization.id, requestsCount: incomingRequests.length, }) return incomingRequests } ``` **✅ Статус:** Резолвер корректный #### **2. GraphQL Резолвер для отправки заявок:** 📄 **Файл:** `src/graphql/resolvers/domains/counterparty-management.ts:152` ```typescript sendCounterpartyRequest: async (_, args, context) => { // Проверки: // - Получатель существует // - Не отправляем себе // - Нет активной заявки // - Нет существующего партнерства const request = await prisma.counterpartyRequest.create({ data: { senderId: currentUser.organization.id, receiverId: args.input.receiverId, message: args.input.message, status: 'PENDING', }, }) } ``` **✅ Статус:** Резолвер корректный #### **3. Подключение резолверов:** 📄 **Файл:** `src/graphql/resolvers/index.ts:107` ```typescript counterpartyManagementResolvers, // ✅ ПОДКЛЮЧЕН ``` **✅ Статус:** Резолвер подключен к системе #### **4. GraphQL Запросы:** 📄 **Файл:** `src/graphql/queries.ts:404` ```typescript export const GET_INCOMING_REQUESTS = gql` query GetIncomingRequests { incomingRequests { id status message createdAt sender { id inn name fullName type } receiver { id inn name fullName type } } } ` ``` **✅ Статус:** Запрос корректный #### **5. Prisma Модель:** 📄 **Файл:** `prisma/schema.prisma` ```prisma model CounterpartyRequest { id String @id @default(cuid()) status CounterpartyRequestStatus @default(PENDING) senderId String receiverId String message String? sender Organization @relation("SentRequests") receiver Organization @relation("ReceivedRequests") @@unique([senderId, receiverId]) } ``` **✅ Статус:** Модель корректная #### **6. UI Компонент:** 📄 **Файл:** `src/components/market/market-counterparties/index.tsx` ```typescript const { incomingRequests, incomingLoading, } = useCounterpartyData() // Подсчет уведомлений const pendingIncomingCount = incomingRequests.filter(req => req.status === 'PENDING').length // Таб входящих заявок с индикацией 0 ? 'animate-pulse ring-2 ring-green-400/50' : ''} `}> ``` **✅ Статус:** UI компонент корректный --- ## 🔍 **ВОЗМОЖНЫЕ ПРИЧИНЫ ПРОБЛЕМЫ** ### **1. 🎭 ПРОБЛЕМА С РОЛЯМИ** **Симптом:** Заявка отправляется не от той организации или не тому получателю **Диагностика:** - Проверить, что отправитель и получатель имеют корректные `organizationId` - Убедиться, что текущий пользователь авторизован правильно ### **2. 🗃️ ПРОБЛЕМА С БАЗОЙ ДАННЫХ** **Симптом:** Заявка создается, но не возвращается в запросе **Диагностика:** - Проверить, что заявка действительно создалась в БД - Убедиться, что статус заявки `PENDING` - Проверить правильность `receiverId` ### **3. 🔄 ПРОБЛЕМА С КЕШИРОВАНИЕМ** **Симптом:** Данные не обновляются в реальном времени **Диагностика:** - Проверить политику кеширования Apollo Client - Убедиться, что `refetchAll()` вызывается после отправки ### **4. 🚫 ПРОБЛЕМА С БЕЗОПАСНОСТЬЮ/КОНТЕКСТОМ** **Симптом:** Неправильный `currentUser` в контексте **Диагностика:** - Проверить, что JWT токен корректный - Убедиться, что контекст GraphQL правильно извлекает пользователя --- ## 🛠️ **ПЛАН ДИАГНОСТИКИ** ### **ЭТАП 1: ПРОВЕРКА ЛОГОВ** **✅ УЛУЧШЕННОЕ ЛОГИРОВАНИЕ ДОБАВЛЕНО:** #### **Бэкенд (GraphQL резолверы):** ```typescript // При отправке заявки: console.warn('📩 SEND_COUNTERPARTY_REQUEST - ВЫЗВАН:', { receiverId: args.input.receiverId, requestType: args.input.requestType, hasMessage: !!args.input.message, timestamp: new Date().toISOString(), }) // При успешной отправке: console.warn('✅ ЗАЯВКА НА ПАРТНЕРСТВО ОТПРАВЛЕНА:', { requestId: request.id, senderId: currentUser.organization.id, senderType: currentUser.organization.type, receiverId: args.input.receiverId, receiverType: receiverOrganization.type, }) // При загрузке входящих заявок: console.warn('📥 INCOMING_REQUESTS ДИАГНОСТИКА:', { userId: currentUser.id, organizationId: currentUser.organization.id, organizationType: currentUser.organization.type, requestsCount: incomingRequests.length, timestamp: new Date().toISOString(), requests: incomingRequests.map((r) => ({ id: r.id, senderId: r.senderId, senderType: r.sender.type, status: r.status, createdAt: r.createdAt, })), }) ``` #### **Фронтенд (React hooks):** ```typescript // При успешной загрузке входящих заявок: console.warn('🎯 INCOMING_REQUESTS ФРОНТЕНД:', { requestsCount: data?.incomingRequests?.length || 0, requests: data?.incomingRequests?.map((r) => ({ id: r.id, senderId: r.sender?.id, senderName: r.sender?.name || r.sender?.fullName, status: r.status, })) || [], timestamp: new Date().toISOString(), }) ``` ### **ЭТАП 2: ПРОВЕРКА БАЗЫ ДАННЫХ** ```sql -- Проверить существующие заявки SELECT * FROM counterparty_requests WHERE status = 'PENDING' ORDER BY createdAt DESC LIMIT 10; -- Проверить конкретного пользователя SELECT cr.*, sender.name as sender_name, receiver.name as receiver_name FROM counterparty_requests cr JOIN organizations sender ON cr.senderId = sender.id JOIN organizations receiver ON cr.receiverId = receiver.id WHERE cr.receiverId = 'USER_ORG_ID'; ``` ### **ЭТАП 3: ПРОВЕРКА СЕТИ/ЗАПРОСОВ** 1. Открыть DevTools → Network 2. Выполнить действие отправки заявки 3. Проверить GraphQL запрос `sendCounterpartyRequest` 4. Проверить ответ сервера 5. Перейти во входящие заявки 6. Проверить GraphQL запрос `GetIncomingRequests` 7. Проверить данные в ответе --- ## 🎯 **РЕКОМЕНДАЦИИ ДЛЯ ПОЛЬЗОВАТЕЛЯ** ### **НЕМЕДЛЕННЫЕ ДЕЙСТВИЯ:** 1. **Проверить браузерную консоль:** - Открыть DevTools (F12) - Перейти в Console - Искать сообщения с `📩 SEND_COUNTERPARTY_REQUEST` и `📥 INCOMING_REQUESTS` 2. **Проверить Network tab:** - Открыть DevTools → Network - Отправить заявку снова - Найти GraphQL запрос `sendCounterpartyRequest` - Проверить статус ответа (должен быть 200) - Проверить содержимое ответа 3. **Обновить страницу:** - Полностью перезагрузить страницу (Ctrl+F5) - Проверить входящие заявки снова 4. **Попробовать от другого пользователя:** - Войти как получатель заявки - Проверить раздел "Входящие заявки" ### **ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ НУЖНА:** - **От кого и кому** отправлялась заявка (типы организаций) - **Есть ли ошибки** в браузерной консоли - **Статус ответа** GraphQL запроса - **Время отправки** заявки для поиска в логах --- ## 📋 **СЛЕДУЮЩИЕ ШАГИ** 1. **Получить логи от пользователя** (console + network) 2. **Проверить базу данных** на наличие заявки 3. **Воспроизвести проблему** в тестовой среде 4. **Исправить найденную проблему** 5. **Обновить документацию** с решением --- **Диагностика начата:** 22:40, 2025-09-19 **Статус:** 🔍 Ожидание дополнительной информации от пользователя