From d6a26f91dade77620c6207a205abd6de4289335e Mon Sep 17 00:00:00 2001 From: Veronika Smirnova Date: Thu, 7 Aug 2025 19:50:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D1=84=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=80=D0=B7=D0=B8=D0=BD=D1=8B=20=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убран текст "(с рецептурой)" из названий товаров в корзине - Добавлен раздел 9.2.6 в rules-complete.md с единым стандартом корзины - Определены обязательные размеры, структура и функциональность - Запрещено отображение технических суффиксов в UI корзины 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- dev.log | 1985 +---------------- prisma/schema.prisma | 5 + rules-complete.md | 123 + .../create-consumables-supply-page.tsx | 2 +- .../supplies/create-suppliers-supply-page.tsx | 1508 ++++++------- src/components/supplies/wb-product-cards.tsx | 2 +- src/graphql/mutations.ts | 28 + src/graphql/resolvers.ts | 16 +- src/graphql/typedefs.ts | 17 + 9 files changed, 831 insertions(+), 2855 deletions(-) diff --git a/dev.log b/dev.log index 1048337..5c762ce 100644 --- a/dev.log +++ b/dev.log @@ -2,1987 +2,16 @@ > sferav@0.1.0 dev > next dev --turbopack + ⚠ Port 3000 is in use by process 1405 +1913 +2223, using available port 3001 instead. ▲ Next.js 15.4.1 (Turbopack) - - Local: http://localhost:3000 - - Network: http://192.168.0.104:3000 + - Local: http://localhost:3001 + - Network: http://192.168.0.104:3001 - Environments: .env - Experiments (use with caution): · optimizePackageImports ✓ Starting... - ✓ Ready in 834ms - ○ Compiling /api/graphql ... - ✓ Compiled /api/graphql in 1205ms -🚀 Проверка инициализации базы данных... -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -✨ Инициализация базы данных завершена -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 3994ms - POST /api/graphql 200 in 1067ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 742ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 813ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 1032ms - POST /api/graphql 200 in 539ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1335ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 973ms - POST /api/graphql 200 in 696ms - ○ Compiling /fulfillment-supplies ... - ✓ Compiled /fulfillment-supplies in 1797ms - GET /fulfillment-supplies 200 in 1883ms - GET /fulfillment-supplies 200 in 79ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMe', - query: 'query GetMe {\n' + - ' me {\n' + - ' id\n' + - ' phone\n' + - ' avatar\n' + - ' managerName\n' + - ' createdAt\n' + - ' organization {\n' + - ' id\n' + - ' inn\n' + - ' kpp\n' + - ' name\n' + - ' fullName\n' + - ' address\n' + - ' addressFull\n' + - ' ogrn\n' + - ' ...' -} - ✓ Compiled /favicon.ico in 478ms - POST /api/graphql 200 in 656ms - GET /favicon.ico?favicon.45db1c09.ico 200 in 750ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMe', - query: 'query GetMe {\n' + - ' me {\n' + - ' id\n' + - ' phone\n' + - ' avatar\n' + - ' managerName\n' + - ' createdAt\n' + - ' organization {\n' + - ' id\n' + - ' inn\n' + - ' kpp\n' + - ' name\n' + - ' fullName\n' + - ' address\n' + - ' addressFull\n' + - ' ogrn\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 320ms - POST /api/graphql 200 in 556ms - ○ Compiling /fulfillment-warehouse ... - ✓ Compiled /fulfillment-warehouse in 807ms - GET /fulfillment-warehouse 200 in 869ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMe', - query: 'query GetMe {\n' + - ' me {\n' + - ' id\n' + - ' phone\n' + - ' avatar\n' + - ' managerName\n' + - ' createdAt\n' + - ' organization {\n' + - ' id\n' + - ' inn\n' + - ' kpp\n' + - ' name\n' + - ' fullName\n' + - ' address\n' + - ' addressFull\n' + - ' ogrn\n' + - ' ...' -} - GET /favicon.ico?favicon.45db1c09.ico 200 in 258ms - POST /api/graphql 200 in 1231ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMe', - query: 'query GetMe {\n' + - ' me {\n' + - ' id\n' + - ' phone\n' + - ' avatar\n' + - ' managerName\n' + - ' createdAt\n' + - ' organization {\n' + - ' id\n' + - ' inn\n' + - ' kpp\n' + - ' name\n' + - ' fullName\n' + - ' address\n' + - ' addressFull\n' + - ' ogrn\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetWarehouseProducts', - query: 'query GetWarehouseProducts {\n' + - ' warehouseProducts {\n' + - ' id\n' + - ' name\n' + - ' article\n' + - ' description\n' + - ' price\n' + - ' quantity\n' + - ' type\n' + - ' category {\n' + - ' id\n' + - ' name\n' + - ' __typename\n' + - ' }\n' + - ' brand\n' + - ' c...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMyCounterparties', - query: 'query GetMyCounterparties {\n' + - ' myCounterparties {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' managementName\n' + - ' type\n' + - ' address\n' + - ' market\n' + - ' phones\n' + - ' emails\n' + - ' createdAt\n' + - ' users {\n' + - ' id\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -❌ GraphQL Errors: [ - { - message: 'Cannot query field "price" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "quantity" on type "Supply". Did you mean "unit"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "category" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "status" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "date" on type "Supply". Did you mean "name"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "supplier" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "minStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "currentStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "usedStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - } -] - POST /api/graphql 400 in 90ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetSupplyOrders', - query: 'query GetSupplyOrders {\n' + - ' supplyOrders {\n' + - ' id\n' + - ' organizationId\n' + - ' partnerId\n' + - ' deliveryDate\n' + - ' status\n' + - ' totalAmount\n' + - ' totalItems\n' + - ' fulfillmentCenterId\n' + - ' createdAt\n' + - ' updatedAt\n' + - ' part...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -❌ GraphQL Errors: [ - { - message: 'Cannot query field "price" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "quantity" on type "Supply". Did you mean "unit"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "category" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "status" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "date" on type "Supply". Did you mean "name"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "supplier" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "minStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "currentStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "usedStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "type" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "shopLocation" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "sellerOwner" on type "Supply".', - locations: [ [Object] ], - path: undefined - } -] - POST /api/graphql 400 in 130ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetFulfillmentWarehouseStats', - query: 'query GetFulfillmentWarehouseStats {\n' + - ' fulfillmentWarehouseStats {\n' + - ' products {\n' + - ' current\n' + - ' change\n' + - ' percentChange\n' + - ' __typename\n' + - ' }\n' + - ' goods {\n' + - ' current\n' + - ' change\n' + - ' per...' -} -🔥 FULFILLMENT WAREHOUSE STATS RESOLVER CALLED -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 3124ms -🏢 Organization ID: cmdzn23nl0002y5i4tytjh0ni, Date 24h ago: 2025-08-05T20:02:43.822Z -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} -🔍 Резолвер warehouseProducts (доставленные заказы): { - currentUserId: 'cmdzn1sof0001y5i4h6fyp5jw', - organizationId: 'cmdzn23nl0002y5i4tytjh0ni', - organizationType: 'FULFILLMENT', - deliveredOrdersCount: 1, - orders: [ - { - id: 'cme0dt4i80009y52fe5r82wr9', - sellerName: 'ФУЛФИЛМЕНТ РУ', - supplierName: 'ПОСТАВЩИК-ЭК', - status: 'DELIVERED', - itemsCount: 1, - deliveryDate: 2025-08-07T00:00:00.000Z - } - ] -} -📦 Заказ от селлера ФУЛФИЛМЕНТ РУ у поставщика ПОСТАВЩИК-ЭК: [ - { - productId: 'cmdztzlbn0001y5gr4pg0j0df', - productName: 'Пакет', - article: 'SF-C-446739-386', - orderedQuantity: 100, - price: 10 - } -] -🚫 Исключен расходник из основного склада фулфилмента: { - name: 'Пакет', - type: 'CONSUMABLE', - orderId: 'cme0dt4i80009y52fe5r82wr9' -} -✅ Итого товаров на складе фулфилмента (из доставленных заказов): 0 - POST /api/graphql 200 in 5813ms - POST /api/graphql 200 in 6353ms -📦 ALL DELIVERED ORDERS: 1 - Order cme0dt4i80009y52fe5r82wr9: org=cmdzn23nl0002y5i4tytjh0ni (ФУЛФИЛМЕНТ РУ), fulfillment=cmdzn23nl0002y5i4tytjh0ni, items=1 -🛒 SELLER ORDERS TO FULFILLMENT: 0 - POST /api/graphql 200 in 3597ms - POST /api/graphql 200 in 7417ms - POST /api/graphql 200 in 2433ms - POST /api/graphql 200 in 6048ms -🏭 FULFILLMENT SUPPLY ORDERS: 1 -🔥 FULFILLMENT SUPPLIES DEBUG: organizationId=cmdzn23nl0002y5i4tytjh0ni, ordersCount=1, warehouseCount=2, totalStock=100 -📦 FULFILLMENT SUPPLIES BREAKDOWN: [ - { - name: 'скотч10', - currentStock: 0, - supplier: 'Внутренний поставщик' - }, - { name: 'Пакет', currentStock: 100, supplier: 'ПОСТАВЩИК-ЭК' } -] - POST /api/graphql 200 in 7609ms -📊 FULFILLMENT SUPPLIES RECEIVED TODAY (ПРИБЫЛО): 1 orders, 100 items -💼 SELLER SUPPLIES DEBUG: totalCount=0 (from Supply warehouse) -📊 SELLER SUPPLIES RECEIVED TODAY: 0 supplies, 0 items -🏁 FINAL WAREHOUSE STATS RESULT: { - "products": { - "current": 0, - "change": 0, - "percentChange": 0 - }, - "goods": { - "current": 0, - "change": 0, - "percentChange": 0 - }, - "defects": { - "current": 0, - "change": 0, - "percentChange": 0 - }, - "pvzReturns": { - "current": 0, - "change": 0, - "percentChange": 0 - }, - "fulfillmentSupplies": { - "current": 100, - "change": 100, - "percentChange": 100 - }, - "sellerSupplies": { - "current": 0, - "change": 0, - "percentChange": 0 - } -} - POST /api/graphql 200 in 8453ms - ○ Compiling /fulfillment-warehouse/supplies ... - ✓ Compiled /fulfillment-warehouse/supplies in 1604ms - GET /fulfillment-warehouse/supplies 200 in 1691ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -❌ GraphQL Errors: [ - { - message: 'Cannot query field "price" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "quantity" on type "Supply". Did you mean "unit"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "category" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "status" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "date" on type "Supply". Did you mean "name"?', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "supplier" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "minStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "currentStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - }, - { - message: 'Cannot query field "usedStock" on type "Supply".', - locations: [ [Object] ], - path: undefined - } -] - POST /api/graphql 400 in 117ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetMe', - query: 'query GetMe {\n' + - ' me {\n' + - ' id\n' + - ' phone\n' + - ' avatar\n' + - ' managerName\n' + - ' createdAt\n' + - ' organization {\n' + - ' id\n' + - ' inn\n' + - ' kpp\n' + - ' name\n' + - ' fullName\n' + - ' address\n' + - ' addressFull\n' + - ' ogrn\n' + - ' ...' -} - GET /favicon.ico?favicon.45db1c09.ico 200 in 356ms - POST /api/graphql 200 in 561ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1471ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1015ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 607ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 610ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 925ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 951ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 365ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 457ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1215ms - POST /api/graphql 200 in 610ms - POST /api/graphql 200 in 693ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 296ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1596ms - POST /api/graphql 200 in 625ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 974ms -🚀 Проверка инициализации базы данных... -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1304ms -✨ Инициализация базы данных завершена - POST /api/graphql 200 in 1651ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 691ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 982ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1055ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 283ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 596ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 1552ms - POST /api/graphql 200 in 313ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 597ms - POST /api/graphql 200 in 650ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1584ms - POST /api/graphql 200 in 701ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 702ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 729ms - POST /api/graphql 200 in 1124ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 603ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 948ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 801ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 306ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 409ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 307ms - POST /api/graphql 200 in 1266ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 833ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 658ms - POST /api/graphql 200 in 627ms - POST /api/graphql 200 in 1508ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1040ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 1117ms - POST /api/graphql 200 in 692ms - POST /api/graphql 200 in 698ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 790ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 831ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 385ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 375ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetIncomingRequests', - query: 'query GetIncomingRequests {\n' + - ' incomingRequests {\n' + - ' id\n' + - ' status\n' + - ' message\n' + - ' createdAt\n' + - ' sender {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' phones\n' + - ' email...' -} - POST /api/graphql 200 in 279ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1908ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjFzb2YwMDAxeTVpNGg2ZnlwNWp3IiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDQ4NzQ4MSwiZXhwIjoxNzU3MDc5NDgxfQ.9KeIWoNPtDJNEU_SCoCba1ducS2pEpyhplg3YswCED4 -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn1sof0001y5i4h6fyp5jw', phone: '79999999999' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjhkYjAwMDBoeTVpNHpveHp6ZmZnIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDQ2NTExOCwiZXhwIjoxNzU3MDU3MTE4fQ.VP8LZUaONciSW9qBAVAjHVsY1lCpyiBVkVTcGoDaOGI -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn8db0000hy5i4zoxzzffg', phone: '78888888888' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjVwYWUwMDA5eTVpNHB5YXNpYnJqIiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDUwOTc4MywiZXhwIjoxNzU3MTAxNzgzfQ.uC19oz6DE323E34mzAW7cZxw0vUjTbzRMktghrt5qgc -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn5pae0009y5i4pyasibrj', phone: '76666666666' } -🔍 GraphQL Operation: { - operationName: 'GetPendingSuppliesCount', - query: 'query GetPendingSuppliesCount {\n' + - ' pendingSuppliesCount {\n' + - ' supplyOrders\n' + - ' ourSupplyOrders\n' + - ' sellerSupplyOrders\n' + - ' incomingSupplierOrders\n' + - ' incomingRequests\n' + - ' total\n' + - ' __typename\n' + - ' }\n' + - '}...' -} - POST /api/graphql 200 in 634ms - POST /api/graphql 200 in 1902ms - POST /api/graphql 200 in 2531ms - POST /api/graphql 200 in 1789ms -GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR6bjJvOGowMDA0eTVpNDgxMHc4bzVjIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDQ2NDg1MiwiZXhwIjoxNzU3MDU2ODUyfQ.sa2a5qIIOzJsgWJkC5qezQ6m4-JvwtxOKyEmHIiJ9zU -GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... -GraphQL Context - Decoded user: { id: 'cmdzn2o8j0004y5i4810w8o5c', phone: '77777777777' } -🔍 GraphQL Operation: { - operationName: 'GetConversations', - query: 'query GetConversations {\n' + - ' conversations {\n' + - ' id\n' + - ' counterparty {\n' + - ' id\n' + - ' inn\n' + - ' name\n' + - ' fullName\n' + - ' type\n' + - ' address\n' + - ' users {\n' + - ' id\n' + - ' avatar\n' + - ' managerName\n' + - ' ...' -} - POST /api/graphql 200 in 1464ms -🚀 Проверка инициализации базы данных... - POST /api/graphql 200 in 1162ms - POST /api/graphql 200 in 1638ms -✨ Инициализация базы данных завершена - POST /api/graphql 200 in 1317ms - POST /api/graphql 200 in 1189ms - POST /api/graphql 200 in 961ms - POST /api/graphql 200 in 375ms - POST /api/graphql 200 in 387ms - POST /api/graphql 200 in 321ms - POST /api/graphql 200 in 1497ms - ○ Compiling /supplies/create-suppliers ... - ✓ Compiled /supplies/create-suppliers in 556ms - GET /supplies/create-suppliers 200 in 793ms - POST /api/graphql 200 in 439ms - POST /api/graphql 200 in 320ms - POST /api/graphql 200 in 300ms - POST /api/graphql 200 in 350ms - POST /api/graphql 200 in 929ms - POST /api/graphql 200 in 1212ms - POST /api/graphql 200 in 1735ms - POST /api/graphql 200 in 638ms - POST /api/graphql 200 in 1867ms - POST /api/graphql 200 in 1048ms - POST /api/graphql 200 in 1179ms - POST /api/graphql 200 in 833ms - POST /api/graphql 200 in 1510ms - POST /api/graphql 200 in 657ms - POST /api/graphql 200 in 1168ms - POST /api/graphql 200 in 1187ms - POST /api/graphql 200 in 353ms - POST /api/graphql 200 in 395ms - POST /api/graphql 200 in 1481ms - POST /api/graphql 200 in 1100ms - POST /api/graphql 200 in 767ms - GET /supplies/create-suppliers 200 in 82ms - GET /favicon.ico 200 in 55ms - POST /api/graphql 200 in 560ms - POST /api/graphql 200 in 1414ms - POST /api/graphql 200 in 368ms - POST /api/graphql 200 in 372ms - POST /api/graphql 200 in 231ms - POST /api/graphql 200 in 1193ms - POST /api/graphql 200 in 397ms - POST /api/graphql 200 in 912ms - POST /api/graphql 200 in 971ms - POST /api/graphql 200 in 826ms - POST /api/graphql 200 in 616ms - ○ Compiling /settings ... - ✓ Compiled /settings in 689ms - GET /settings 200 in 822ms - POST /api/graphql 200 in 515ms - POST /api/graphql 200 in 301ms - POST /api/graphql 200 in 960ms - POST /api/graphql 200 in 692ms - POST /api/graphql 200 in 617ms - POST /api/graphql 200 in 777ms - POST /api/graphql 200 in 671ms - POST /api/graphql 200 in 291ms + ✓ Ready in 923ms +[?25h diff --git a/prisma/schema.prisma b/prisma/schema.prisma index df1360a..b9b8909 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -515,6 +515,11 @@ model SupplyOrderItem { quantity Int price Decimal @db.Decimal(12, 2) totalPrice Decimal @db.Decimal(12, 2) + // Поля для рецептуры продукта + services String[] @default([]) // ID услуг + fulfillmentConsumables String[] @default([]) // ID расходников фулфилмента + sellerConsumables String[] @default([]) // ID расходников селлера + marketplaceCardId String? // ID карточки маркетплейса createdAt DateTime @default(now()) updatedAt DateTime @updatedAt supplyOrder SupplyOrder @relation(fields: [supplyOrderId], references: [id], onDelete: Cascade) diff --git a/rules-complete.md b/rules-complete.md index c582e41..b69c96d 100644 --- a/rules-complete.md +++ b/rules-complete.md @@ -1773,6 +1773,129 @@ transition-all duration-150 - **ПРИЧИНА**: Заменяется контекстными кнопками в табах - **СОХРАНИТЬ**: Стили и логику навигации, но адаптировать под новые роуты +#### **9.2.6 ПРАВИЛА КОРЗИНЫ - ЕДИНЫЙ СТАНДАРТ** + +**КРИТИЧЕСКИ ВАЖНО**: Все корзины в системе должны следовать единому стандарту дизайна и функциональности. + +##### **9.2.6.1 Размеры и позиционирование** + +```tsx +
+
+``` + +**ОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ**: +- **Ширина**: `w-72` (288px) - фиксированная ширина для всех корзин +- **Флекс**: `flex-shrink-0` - корзина не сжимается +- **Позиция**: `sticky top-0` - прилипает к верху при прокрутке +- **Стиль**: Glass morphism эффект с `backdrop-blur` и `bg-white/10` + +##### **9.2.6.2 Автодобавление товаров** + +**ПРАВИЛО AUTO-ADD**: При вводе количества товар автоматически добавляется в корзину. + +```tsx +// ОБЯЗАТЕЛЬНАЯ РЕАЛИЗАЦИЯ: +const handleQuantityChange = (e: React.ChangeEvent) => { + const inputValue = e.target.value + const newQuantity = inputValue === '' ? 0 : Math.max(0, parseInt(inputValue) || 0) + + if (newQuantity > 0) { + // Автоматически добавляем товар в корзину + updateProductQuantity(product.id, newQuantity) + } else { + // Удаляем товар из корзины при количестве 0 + removeFromCart(product.id) + } +} +``` + +**ДЕФОЛТНОЕ ЗНАЧЕНИЕ**: Пустой инпут (`value={''}`) вместо `value={0}` + +##### **9.2.6.3 Структура корзины** + +**ОБЯЗАТЕЛЬНЫЕ ЭЛЕМЕНТЫ**: +1. **Заголовок**: "Корзина (X шт)" с иконкой корзины +2. **Список товаров**: + - Название товара (БЕЗ суффикса "(с рецептурой)") + - Цена за единицу × количество + - Кнопка удаления (X справа) +3. **Мета-информация**: Дата поставки, фулфилмент-центр, логистика +4. **Итого**: Общая сумма с выделением зелёным цветом +5. **Кнопка действия**: "Создать поставку" с градиентом + +**ЗАПРЕЩЕНО**: Отображать текст "(с рецептурой)" в названиях товаров в корзине + +##### **9.2.6.4 Единая функция расчета стоимости** + +**КРИТИЧЕСКИ ВАЖНО**: Использовать единую функцию расчета для избежания расхождений: + +```tsx +const getProductTotalWithRecipe = (productId: string, quantity: number) => { + const product = products.find(p => p.id === productId) + if (!product) return 0 + + // Базовая цена товара + let total = (product.pricePerUnit || 0) * quantity + + // Добавляем услуги + if (product.services && product.services.length > 0) { + const servicesTotal = product.services.reduce((sum, service) => { + return sum + ((service.pricePerUnit || 0) * quantity) + }, 0) + total += servicesTotal + } + + // Добавляем FF расходники (используем .price, НЕ .pricePerUnit!) + if (product.ffConsumables && product.ffConsumables.length > 0) { + const ffConsumablesTotal = product.ffConsumables.reduce((sum, consumable) => { + return sum + ((consumable.price || 0) * quantity) // ВАЖНО: .price! + }, 0) + total += ffConsumablesTotal + } + + // Добавляем расходники продавца + if (product.sellerConsumables && product.sellerConsumables.length > 0) { + const sellerConsumablesTotal = product.sellerConsumables.reduce((sum, consumable) => { + return sum + ((consumable.pricePerUnit || 0) * quantity) + }, 0) + total += sellerConsumablesTotal + } + + return total +} +``` + +##### **9.2.6.5 Синхронизация данных между блоками** + +**ПРАВИЛО СИНХРОНИЗАЦИИ**: Данные в корзине должны отражать выборы из всех блоков формы: + +1. **Дата поставки**: Из Блока 3 (дата пикер) +2. **Фулфилмент-центр**: Название выбранного FF (реальные данные!) +3. **Логистическая компания**: Только партнеры типа `'LOGIST'` + +**ПОРЯДОК ОТОБРАЖЕНИЯ В КОРЗИНЕ**: +``` +Дата поставки: 08.08.2025 +Фулфилмент-центр: ФУЛФИЛМЕНТ РУ +Логистическая компания: [Выпадающий список] +``` + +##### **9.2.6.6 Критические требования** + +🚨 **БЕЗОПАСНОСТЬ ТИПОВ**: +- Всегда проверять на `null/undefined`: `selectedSupplier?.id || ''` +- Использовать optional chaining для всех вложенных объектов + +🚨 **ПРОИЗВОДИТЕЛЬНОСТЬ**: +- Мемоизация расчетов: `useMemo` для дорогих вычислений +- Debounce для инпутов количества + +🚨 **UX КОНСИСТЕНТНОСТЬ**: +- Единые стили для всех корзин в системе +- Одинаковое поведение auto-add во всех формах +- Синхронная валидация данных + ### 9.3 Структура страницы "Мои поставки" - Трёхблочная архитектура #### **9.3.1 Обязательная структура страницы** diff --git a/src/components/supplies/create-consumables-supply-page.tsx b/src/components/supplies/create-consumables-supply-page.tsx index 2b8ded9..6ee6d56 100644 --- a/src/components/supplies/create-consumables-supply-page.tsx +++ b/src/components/supplies/create-consumables-supply-page.tsx @@ -86,7 +86,7 @@ export function CreateConsumablesSupplyPage() { const { data: productsData, loading: productsLoading } = useQuery(GET_ORGANIZATION_PRODUCTS, { skip: !selectedSupplier, variables: { - organizationId: selectedSupplier.id, + organizationId: selectedSupplier?.id || '', search: productSearchQuery || null, category: null, type: 'CONSUMABLE', // Фильтруем только расходники согласно rules2.md diff --git a/src/components/supplies/create-suppliers-supply-page.tsx b/src/components/supplies/create-suppliers-supply-page.tsx index cdd5d2b..da2f4ce 100644 --- a/src/components/supplies/create-suppliers-supply-page.tsx +++ b/src/components/supplies/create-suppliers-supply-page.tsx @@ -16,6 +16,7 @@ import { AlertCircle, Settings, DollarSign, + X, } from 'lucide-react' import Image from 'next/image' import { useRouter } from 'next/navigation' @@ -25,18 +26,16 @@ import { toast } from 'sonner' import { OrganizationAvatar } from '@/components/market/organization-avatar' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' +import { DatePicker } from '@/components/ui/date-picker' import { Input } from '@/components/ui/input' -// ВРЕМЕННО ОТКЛЮЧЕНО: импорты для верхней панели - до исправления Apollo ошибки -// import { DatePicker } from '@/components/ui/date-picker' -// import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { CREATE_SUPPLY_ORDER } from '@/graphql/mutations' import { GET_MY_COUNTERPARTIES, GET_ORGANIZATION_PRODUCTS, - GET_MY_SERVICES, - GET_MY_SUPPLIES, - GET_SELLER_SUPPLIES_ON_WAREHOUSE, - GET_MY_WILDBERRIES_SUPPLIES, + GET_COUNTERPARTY_SERVICES, + GET_COUNTERPARTY_SUPPLIES, + GET_AVAILABLE_SUPPLIES_FOR_RECIPE, } from '@/graphql/queries' import { useAuth } from '@/hooks/useAuth' import { useSidebar } from '@/hooks/useSidebar' @@ -119,16 +118,16 @@ interface FulfillmentConsumable { id: string name: string price: number - stock: number + quantity: number unit?: string } interface SellerConsumable { id: string name: string - stock: number + pricePerUnit: number + warehouseStock: number unit?: string - supplierId: string } interface WBCard { @@ -149,7 +148,7 @@ interface ProductRecipe { export function CreateSuppliersSupplyPage() { const router = useRouter() - const { user } = useAuth() + const { user: _user } = useAuth() const { getSidebarMargin } = useSidebar() // Основные состояния @@ -182,7 +181,6 @@ export function CreateSuppliersSupplyPage() { (GoodsProduct & { selectedQuantity: number; supplierId: string; supplierName: string })[] >([]) - // Загружаем партнеров-поставщиков согласно rules2.md 13.3 const { data: counterpartiesData, @@ -248,34 +246,37 @@ export function CreateSuppliersSupplyPage() { const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER) // Запросы для компонентов рецептуры - const { data: fulfillmentServicesData } = useQuery(GET_MY_SERVICES, { + const { data: fulfillmentServicesData } = useQuery(GET_COUNTERPARTY_SERVICES, { + variables: { organizationId: selectedFulfillment || '' }, skip: !selectedFulfillment, errorPolicy: 'all', }) - const { data: fulfillmentConsumablesData } = useQuery(GET_MY_SUPPLIES, { + const { data: fulfillmentConsumablesData } = useQuery(GET_COUNTERPARTY_SUPPLIES, { + variables: { organizationId: selectedFulfillment || '' }, skip: !selectedFulfillment, errorPolicy: 'all', }) - const { data: sellerConsumablesData } = useQuery(GET_SELLER_SUPPLIES_ON_WAREHOUSE, { - skip: !user?.organization?.id, + const { data: sellerConsumablesData } = useQuery(GET_AVAILABLE_SUPPLIES_FOR_RECIPE, { + skip: !selectedFulfillment, errorPolicy: 'all', }) - const { data: wbCardsData } = useQuery(GET_MY_WILDBERRIES_SUPPLIES, { - skip: !user?.organization?.id, - errorPolicy: 'all', - }) + // TODO: Нужен запрос для получения карточек товаров селлера + // const { data: wbCardsData } = useQuery(GET_MY_WILDBERRIES_SUPPLIES, { + // skip: !user?.organization?.id, + // errorPolicy: 'all', + // }) // Фильтруем только партнеров-поставщиков согласно rules2.md 13.3 const allCounterparties = counterpartiesData?.myCounterparties || [] // Извлекаем данные для компонентов рецептуры - const fulfillmentServices: FulfillmentService[] = fulfillmentServicesData?.myServices || [] - const fulfillmentConsumables: FulfillmentConsumable[] = fulfillmentConsumablesData?.mySupplies || [] - const sellerConsumables: SellerConsumable[] = sellerConsumablesData?.sellerSuppliesOnWarehouse || [] - const wbCards: WBCard[] = (wbCardsData?.myWildberriesSupplies || []).flatMap((supply: any) => supply.cards || []) + const fulfillmentServices: FulfillmentService[] = fulfillmentServicesData?.counterpartyServices || [] + const fulfillmentConsumables: FulfillmentConsumable[] = fulfillmentConsumablesData?.counterpartySupplies || [] + const sellerConsumables: SellerConsumable[] = sellerConsumablesData?.getAvailableSuppliesForRecipe || [] + const _wbCards: WBCard[] = [] // Временно отключено // Показываем только партнеров с типом WHOLESALE согласно rules2.md 13.3 const wholesaleSuppliers = allCounterparties.filter((cp: any) => { @@ -343,7 +344,7 @@ export function CreateSuppliersSupplyPage() { // Функции для работы с рынками согласно rules-complete.md v10.0 const getMarketLabel = (market?: string) => { const marketLabels = { - 'sadovod': 'Садовод', + sadovod: 'Садовод', 'tyak-moscow': 'ТЯК Москва', 'opt-market': 'ОПТ Маркет', } @@ -352,18 +353,15 @@ export function CreateSuppliersSupplyPage() { const getMarketBadgeStyle = (market?: string) => { const styles = { - 'sadovod': 'bg-green-500/20 text-green-300 border-green-500/30', + sadovod: 'bg-green-500/20 text-green-300 border-green-500/30', 'tyak-moscow': 'bg-blue-500/20 text-blue-300 border-blue-500/30', 'opt-market': 'bg-purple-500/20 text-purple-300 border-purple-500/30', } return styles[market as keyof typeof styles] || 'bg-gray-500/20 text-gray-300 border-gray-500/30' } - const logisticsCompanies: LogisticsCompany[] = [ - { id: 'express', name: 'Экспресс доставка', estimatedCost: 2500, deliveryDays: 1, type: 'EXPRESS' }, - { id: 'standard', name: 'Стандартная доставка', estimatedCost: 1200, deliveryDays: 3, type: 'STANDARD' }, - { id: 'economy', name: 'Экономичная доставка', estimatedCost: 800, deliveryDays: 7, type: 'ECONOMY' }, - ] + // Получаем логистические компании из партнеров + const logisticsCompanies = allCounterparties?.filter((partner) => partner.type === 'LOGIST') || [] // Моковые фулфилмент-центры согласно rules2.md 9.7.2 const fulfillmentCenters = [ @@ -432,6 +430,8 @@ export function CreateSuppliersSupplyPage() { } else { // Добавляем новый товар setSelectedGoods((prev) => [...prev, newGoodsItem]) + // Инициализируем рецептуру для нового товара + initializeProductRecipe(product.id) toast.success(`Товар "${product.name}" добавлен в корзину`) } @@ -508,7 +508,7 @@ export function CreateSuppliersSupplyPage() { }) } - const setWBCard = (productId: string, cardId: string) => { + const _setWBCard = (productId: string, cardId: string) => { initializeProductRecipe(productId) setProductRecipes((prev) => ({ ...prev, @@ -606,24 +606,70 @@ export function CreateSuppliersSupplyPage() { // Удаление из корзины const removeFromCart = (productId: string) => { setSelectedGoods((prev) => prev.filter((item) => item.id !== productId)) + // Удаляем рецептуру товара + setProductRecipes((prev) => { + const updated = { ...prev } + delete updated[productId] + return updated + }) toast.success('Товар удален из корзины') } - // Расчеты согласно rules2.md 9.7.6 - const totalGoodsAmount = selectedGoods.reduce((sum, item) => sum + item.price * item.selectedQuantity, 0) + // Функция расчета полной стоимости товара с рецептурой + const getProductTotalWithRecipe = (productId: string, quantity: number) => { + const product = allSelectedProducts.find(p => p.id === productId) + if (!product) return 0 + + const baseTotal = product.price * quantity + const recipe = productRecipes[productId] + + if (!recipe) return baseTotal + + // Услуги ФФ + const servicesCost = (recipe.selectedServices || []).reduce((sum, serviceId) => { + const service = fulfillmentServices.find(s => s.id === serviceId) + return sum + (service ? service.price * quantity : 0) + }, 0) + + // Расходники ФФ + const ffConsumablesCost = (recipe.selectedFFConsumables || []).reduce((sum, consumableId) => { + const consumable = fulfillmentConsumables.find(c => c.id === consumableId) + // Используем такую же логику как в карточке - только price + return sum + (consumable ? consumable.price * quantity : 0) + }, 0) + + // Расходники селлера + const sellerConsumablesCost = (recipe.selectedSellerConsumables || []).reduce((sum, consumableId) => { + const consumable = sellerConsumables.find(c => c.id === consumableId) + return sum + (consumable ? (consumable.pricePerUnit || 0) * quantity : 0) + }, 0) + + return baseTotal + servicesCost + ffConsumablesCost + sellerConsumablesCost + } + + // Расчеты для корзины - используем функцию расчета + const totalGoodsAmount = selectedGoods.reduce((sum, item) => { + return sum + getProductTotalWithRecipe(item.id, item.selectedQuantity) + }, 0) + const totalQuantity = selectedGoods.reduce((sum, item) => sum + item.selectedQuantity, 0) - const fulfillmentFee = totalGoodsAmount * 0.08 // 8% комиссия фулфилмента - const selectedLogisticsCompany = logisticsCompanies.find((lc) => lc.id === selectedLogistics) - const logisticsCost = selectedLogistics === 'auto' ? 0 : selectedLogisticsCompany?.estimatedCost || 0 - const totalAmount = totalGoodsAmount + fulfillmentFee + logisticsCost + const totalAmount = totalGoodsAmount // Валидация формы согласно rules2.md 9.7.6 - const isFormValid = selectedSupplier && selectedGoods.length > 0 && deliveryDate && selectedFulfillment + // Проверяем обязательность услуг фулфилмента согласно rules-complete.md + const hasRequiredServices = selectedGoods.every((item) => productRecipes[item.id]?.selectedServices?.length > 0) + + const isFormValid = + selectedSupplier && selectedGoods.length > 0 && deliveryDate && selectedFulfillment && hasRequiredServices // Обязательно: каждый товар должен иметь услуги // Создание поставки const handleCreateSupply = async () => { if (!isFormValid) { - toast.error('Заполните все обязательные поля') + if (!hasRequiredServices) { + toast.error('Каждый товар должен иметь минимум 1 услугу фулфилмента') + } else { + toast.error('Заполните все обязательные поля') + } return } @@ -636,11 +682,14 @@ export function CreateSuppliersSupplyPage() { items: selectedGoods.map((item) => ({ productId: item.id, quantity: item.selectedQuantity, - price: item.price, - completeness: item.completeness, - recipe: item.recipe, - specialRequirements: item.specialRequirements, - parameters: item.parameters, + recipe: productRecipes[item.id] + ? { + services: productRecipes[item.id].selectedServices, + fulfillmentConsumables: productRecipes[item.id].selectedFFConsumables, + sellerConsumables: productRecipes[item.id].selectedSellerConsumables, + marketplaceCardId: productRecipes[item.id].selectedWBCard, + } + : undefined, })), deliveryDate, logisticsCompany: selectedLogistics === 'auto' ? null : selectedLogistics, @@ -675,10 +724,10 @@ export function CreateSuppliersSupplyPage() {
{/* ЛЕВЫЙ БЛОК: ПОСТАВЩИКИ, КАРТОЧКИ ТОВАРОВ И ДЕТАЛЬНЫЙ КАТАЛОГ */}
- {/* БЛОК 1: ПОСТАВЩИКИ - обязательный блок согласно rules1.md 19.2.1 */} + {/* БЛОК 1: ПОСТАВЩИКИ - обязательный блок согласно rules-complete.md 9.2.1 */}
4 ? '200px' : 'auto' }} + style={{ height: '180px' }} >
{/* Навигация и заголовок в одном блоке */} @@ -699,19 +748,19 @@ export function CreateSuppliersSupplyPage() {
- + setSearchQuery(e.target.value)} - className="bg-white/5 border-white/10 text-white placeholder:text-white/50 pl-10 h-9 text-sm transition-all duration-200 focus:border-white/20" + className="bg-white/10 border-white/20 text-white placeholder:text-white/60 pl-10 h-9 text-sm rounded-full transition-all duration-200 focus:border-white/30 backdrop-blur-sm" />
{/* Кнопка поиска в маркете */} - {allCounterparties.length === 0 && ( + {!isLoading && allCounterparties.length === 0 && (
-
-

Артикул: {product.article}

-

От: {product.supplierName}

- {product.category && ( - - {product.category.name} - - )} -
- - {product.price.toLocaleString('ru-RU')} ₽ - - {product.quantity !== undefined && ( -
-
0 ? 'bg-green-400' : 'bg-red-400' - }`} - >
- 0 ? 'text-green-400' : 'text-red-400' - }`} - > - {product.quantity > 0 ? `Доступно: ${product.quantity}` : 'Нет в наличии'} - + {allSelectedProducts.map((product) => { + // Расчет стоимостей для каждого блока рецептуры + const recipe = productRecipes[product.id] + const selectedServicesIds = recipe?.selectedServices || [] + const selectedFFConsumablesIds = recipe?.selectedFFConsumables || [] + const selectedSellerConsumablesIds = recipe?.selectedSellerConsumables || [] + + // Стоимость услуг ФФ + const servicesCost = selectedServicesIds.reduce((sum, serviceId) => { + const service = fulfillmentServices.find((s) => s.id === serviceId) + return sum + (service ? service.price * product.selectedQuantity : 0) + }, 0) + + // Стоимость расходников ФФ + const ffConsumablesCost = selectedFFConsumablesIds.reduce((sum, consumableId) => { + const consumable = fulfillmentConsumables.find((c) => c.id === consumableId) + return sum + (consumable ? consumable.price * product.selectedQuantity : 0) + }, 0) + + // Стоимость расходников селлера + const sellerConsumablesCost = selectedSellerConsumablesIds.reduce((sum, consumableId) => { + const consumable = sellerConsumables.find((c) => c.id === consumableId) + return sum + (consumable ? (consumable.pricePerUnit || 0) * product.selectedQuantity : 0) + }, 0) + + // Общая стоимость товара с рецептурой + const totalWithRecipe = + product.price * product.selectedQuantity + servicesCost + ffConsumablesCost + sellerConsumablesCost + + // Debug: сравниваем с функцией расчета корзины + const cartTotal = getProductTotalWithRecipe(product.id, product.selectedQuantity) + if (Math.abs(totalWithRecipe - cartTotal) > 0.01) { + console.log(`РАЗНИЦА для ${product.name}:`, { + карточка: totalWithRecipe, + корзина: cartTotal, + базовая_цена: product.price * product.selectedQuantity, + услуги: servicesCost, + расходники_ФФ: ffConsumablesCost, + расходники_селлера: sellerConsumablesCost, + }) + } + + return ( +
+ {/* Элегантный крестик удаления - согласно visual-design-rules.md */} + + + {/* 7 модулей согласно rules-complete.md 9.2.3.2 + visual-design-rules.md */} +
+ {/* 1. ИЗОБРАЖЕНИЕ (80px фиксированная ширина) */} +
+
+ {product.mainImage ? ( + {product.name} + ) : ( +
+
)}
-
- {/* ПРАВЫЙ БЛОК: Количество + общая сумма */} -
-
- + }) + ) : ( +
+ {selectedFulfillment ? 'Загрузка...' : 'Выберите ФФ'} +
+ )} +
+
- { - const newQuantity = parseInt(e.target.value) || 1 - setAllSelectedProducts((prev) => - prev.map((p) => - p.id === product.id ? { ...p, selectedQuantity: newQuantity } : p, - ), - ) - }} - className="h-8 w-20 text-center bg-white/5 border-white/20 text-white placeholder:text-white/40 focus:border-white/40" - placeholder="1" - /> - - + }) + ) : ( +
+ {selectedFulfillment ? 'Загрузка...' : 'Выберите ФФ'} +
+ )} +
-
- - {(product.price * product.selectedQuantity).toLocaleString('ru-RU')} ₽ - + + {/* 6. РАСХОДНИКИ СЕЛЛЕРА (flex-1) */} +
+
+ {sellerConsumablesCost > 0 && ( +
+ {sellerConsumablesCost.toLocaleString('ru-RU')} ₽ +
+ )} +
🏪 Расходники сел.
+
+
+ {sellerConsumables.length > 0 ? ( + sellerConsumables.map((consumable) => { + const isSelected = selectedSellerConsumablesIds.includes(consumable.id) + return ( + + ) + }) + ) : ( +
Загрузка...
+ )} +
+
+ + {/* 7. МП + ИТОГО (flex-1) */} +
+
+
+ Итого: {totalWithRecipe.toLocaleString('ru-RU')} ₽ +
+
+ +
+ +
- - {/* БЛОК РЕЦЕПТУРЫ: 4 колонки с чекбоксами */} -
- {/* КОЛОНКА 1: Услуги фулфилмента */} -
-
- - Услуги ФФ -
-
- {fulfillmentServices.length > 0 ? ( - fulfillmentServices.map((service) => { - const recipe = productRecipes[product.id] - const isSelected = recipe?.selectedServices.includes(service.id) || false - return ( - - ) - }) - ) : ( -
- {selectedFulfillment ? 'Услуги загружаются...' : 'Выберите фулфилмент-центр'} -
- )} -
-
- - {/* КОЛОНКА 2: Расходники фулфилмента */} -
-
- - Расходники ФФ -
-
- {fulfillmentConsumables.length > 0 ? ( - fulfillmentConsumables.map((consumable) => { - const recipe = productRecipes[product.id] - const isSelected = recipe?.selectedFFConsumables.includes(consumable.id) || false - return ( - - ) - }) - ) : ( -
- {selectedFulfillment ? 'Расходники загружаются...' : 'Выберите фулфилмент-центр'} -
- )} -
-
- - {/* КОЛОНКА 3: Расходники селлера */} -
-
- - Расходники селлера -
-
- {sellerConsumables.length > 0 ? ( - sellerConsumables.map((consumable) => { - const recipe = productRecipes[product.id] - const isSelected = - recipe?.selectedSellerConsumables.includes(consumable.id) || false - return ( - - ) - }) - ) : ( -
- Расходники селлера загружаются... -
- )} -
-
- - {/* КОЛОНКА 4: Карточки Wildberries */} -
-
- - Карточки WB -
-
- {wbCards.length > 0 ? ( - wbCards.map((card) => { - const recipe = productRecipes[product.id] - const isSelected = recipe?.selectedWBCard === card.id - return ( - - ) - }) - ) : ( -
- Карточки WB загружаются... -
- )} -
-
-
- - {/* НИЖНИЙ БЛОК: Итоговая стоимость рецептуры + кнопка добавления */} -
-
- {(() => { - const quantity = getProductQuantity(product.id) - const recipeCost = calculateRecipeCost(product.id) - const productTotal = product.price * quantity - - return ( - <> -
- Товар:{' '} - - {productTotal.toLocaleString('ru-RU')} ₽ - -
-
- Услуги:{' '} - - {recipeCost.services.toLocaleString('ru-RU')} ₽ - -
-
- Расходники:{' '} - - {recipeCost.consumables.toLocaleString('ru-RU')} ₽ - -
- - ) - })()} -
-
- {(() => { - const quantity = getProductQuantity(product.id) - const recipeCost = calculateRecipeCost(product.id) - const productTotal = product.price * quantity - const totalRecipePrice = productTotal + recipeCost.total - - return ( - <> -
- Итого: - - {totalRecipePrice.toLocaleString('ru-RU')} ₽ - -
- - - ) - })()} -
-
-
- ))} + ) + })}
)}
@@ -1283,401 +1326,118 @@ export function CreateSuppliersSupplyPage() {
{/* БЛОК 4: КОРЗИНА И НАСТРОЙКИ - правый блок согласно rules-complete.md 9.2 */} -
-
- {/* ЗАГОЛОВОК И СТАТИСТИКА */} -
-
-
- -
-
-

Корзина и настройки поставки

-

Управление заказом и параметрами доставки

+
+
+

+ + Корзина ({selectedGoods.length} шт) +

+ + {selectedGoods.length === 0 ? ( +
+
+
+

Корзина пуста

+

Добавьте товары из каталога для создания поставки

- - {/* СТАТИСТИКА ПОСТАВКИ */} -
-
-
-
-

Поставщиков

-

{selectedSupplier ? 1 : 0}

-
- -
-
-
-
-
-

Товаров

-

{selectedGoods.length}

-
- -
-
-
-
-
-

Количество

-

{totalQuantity} шт

-
- -
-
-
-
-
-

Сумма

-

{totalAmount.toLocaleString('ru-RU')} ₽

-
- -
-
-
-
- - {/* НАСТРОЙКИ ПОСТАВКИ */} -
-

- - Настройки поставки -

- -
- {/* Выбор фулфилмент-центра */} -
- - -
- - {/* Дата поставки */} -
- -
- - setDeliveryDate(e.target.value)} - min={minDateString} - max={maxDateString} - className="bg-white/5 border-white/10 text-white pl-9 h-8 text-sm hover:border-white/30 focus:border-blue-400/50 transition-all duration-200" - required - /> -
-
- - {/* Выбор логистики */} -
- - -
-
-
- - {/* ТОВАРЫ В КОРЗИНЕ */} -
- {selectedGoods.length === 0 ? ( -
-
-
- -
-
-

Корзина пуста

-

Добавьте товары из каталога поставщика

-
-
-
- ) : ( -
- {selectedGoods.map((item) => ( -
-
-
-
-

- {item.name} -

-

Артикул: {item.sku}

- {item.category && ( - - {item.category} - - )} -
- -
- -
-
- Количество: -
- - { - const newQuantity = parseInt(e.target.value) || 1 - addToCart( - { - id: item.id, - name: item.name, - sku: item.sku, - price: item.price, - category: { name: item.category || '' }, - images: [], - organization: { id: item.supplierId, name: item.supplierName }, - unit: item.unit, - } as GoodsProduct, - newQuantity, - ) - }} - className="glass-input text-white w-16 h-7 text-center text-xs font-medium" - /> - -
-
- -
- Цена за {item.unit || 'шт'}: - - {item.price.toLocaleString('ru-RU')} ₽ - -
- -
- Сумма: - - {(item.price * item.selectedQuantity).toLocaleString('ru-RU')} ₽ - -
- - {/* Дополнительная информация */} - {(item.completeness || item.recipe || item.specialRequirements || item.parameters) && ( -
- {item.completeness && ( -
- -
- Комплектность: - {item.completeness} -
-
- )} - {item.recipe && ( -
- -
- Рецептура: - {item.recipe} -
-
- )} - {item.specialRequirements && ( -
- -
- Требования: - {item.specialRequirements} -
-
- )} - {item.parameters && item.parameters.length > 0 && ( -
-
- - Параметры: -
-
- {item.parameters.map((param, idx) => ( - - {param.name}: {param.value} - - ))} -
-
- )} -
- )} -
+ ) : ( +
+ {selectedGoods.map((item) => { + // Используем единую функцию расчета + const itemTotalPrice = getProductTotalWithRecipe(item.id, item.selectedQuantity) + const basePrice = item.price + const priceWithRecipe = itemTotalPrice / item.selectedQuantity + + return ( +
+
+

{item.name}

+

+ {priceWithRecipe.toLocaleString('ru-RU')} ₽ × {item.selectedQuantity} +

+
+
+ + {itemTotalPrice.toLocaleString('ru-RU')} ₽ + +
- ))} -
- )} -
- - {/* ИТОГИ И КНОПКА СОЗДАНИЯ */} -
- {/* Детальные итоги */} -
-
- Товаров: - {totalQuantity} шт -
-
- Стоимость товаров: - - {totalGoodsAmount.toLocaleString('ru-RU')} ₽ - -
-
- Фулфилмент (8%): - - {fulfillmentFee.toLocaleString('ru-RU')} ₽ - -
-
- Логистика: - - {selectedLogistics === 'auto' ? '~' : ''} - {logisticsCost.toLocaleString('ru-RU')} ₽ - -
-
- Итого к оплате: - {totalAmount.toLocaleString('ru-RU')} ₽ -
+ ) + })}
+ )} - {/* Кнопка создания поставки */} - + {selectedGoods.length > 0 && ( + <> +
+ {deliveryDate && ( +
+

Дата поставки:

+

+ {new Date(deliveryDate).toLocaleDateString('ru-RU')} +

+
+ )} + + {selectedFulfillment && ( +
+

Фулфилмент-центр:

+

+ {allCounterparties?.find(c => c.id === selectedFulfillment)?.name || + allCounterparties?.find(c => c.id === selectedFulfillment)?.fullName || + 'Выбранный центр'} +

+
+ )} - {/* Сообщения об ошибках валидации */} - {!isFormValid && ( -
-
- -

- {!selectedSupplier - ? 'Выберите поставщика' - : selectedSupplier && selectedGoods.length === 0 - ? 'Добавьте товары в корзину' - : selectedSupplier && selectedGoods.length > 0 && !deliveryDate - ? 'Укажите дату поставки' - : selectedSupplier && - selectedGoods.length > 0 && - deliveryDate && - !selectedFulfillment - ? 'Выберите фулфилмент-центр' - : ''} -

+
+

Логистическая компания:

+
- )} -
+ +
+ Итого: + {totalAmount.toLocaleString('ru-RU')} ₽ +
+ + + + )}
diff --git a/src/components/supplies/wb-product-cards.tsx b/src/components/supplies/wb-product-cards.tsx index fdf5dd6..f97bb00 100644 --- a/src/components/supplies/wb-product-cards.tsx +++ b/src/components/supplies/wb-product-cards.tsx @@ -54,7 +54,7 @@ interface WBProductCardsProps { } export function WBProductCards({ - _onBack, // eslint-disable-line @typescript-eslint/no-unused-vars + _onBack, onComplete, showSummary: externalShowSummary, setShowSummary: externalSetShowSummary, diff --git a/src/graphql/mutations.ts b/src/graphql/mutations.ts index 4ac8aac..2612f57 100644 --- a/src/graphql/mutations.ts +++ b/src/graphql/mutations.ts @@ -678,6 +678,34 @@ export const CREATE_SUPPLY_ORDER = gql` quantity price totalPrice + recipe { + services { + id + name + description + price + } + fulfillmentConsumables { + id + name + description + pricePerUnit + unit + imageUrl + organization { + id + name + } + } + sellerConsumables { + id + name + description + price + unit + } + marketplaceCardId + } product { id name diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts index 20eaf22..598f73f 100644 --- a/src/graphql/resolvers.ts +++ b/src/graphql/resolvers.ts @@ -3797,7 +3797,16 @@ export const resolvers = { deliveryDate: string fulfillmentCenterId?: string // ID фулфилмент-центра для доставки logisticsPartnerId?: string // ID логистической компании - items: Array<{ productId: string; quantity: number }> + items: Array<{ + productId: string + quantity: number + recipe?: { + services: string[] + fulfillmentConsumables: string[] + sellerConsumables: string[] + marketplaceCardId?: string + } + }> notes?: string // Дополнительные заметки к заказу consumableType?: string // Классификация расходников } @@ -3941,6 +3950,11 @@ export const resolvers = { quantity: item.quantity, price: product.price, totalPrice: new Prisma.Decimal(itemTotal), + // Передача данных рецептуры в Prisma модель + services: item.recipe?.services || [], + fulfillmentConsumables: item.recipe?.fulfillmentConsumables || [], + sellerConsumables: item.recipe?.sellerConsumables || [], + marketplaceCardId: item.recipe?.marketplaceCardId, } }) diff --git a/src/graphql/typedefs.ts b/src/graphql/typedefs.ts index 90181cf..3ada0b4 100644 --- a/src/graphql/typedefs.ts +++ b/src/graphql/typedefs.ts @@ -609,6 +609,7 @@ export const typeDefs = gql` quantity: Int! price: Float! totalPrice: Float! + recipe: ProductRecipe } enum SupplyOrderStatus { @@ -635,6 +636,7 @@ export const typeDefs = gql` input SupplyOrderItemInput { productId: ID! quantity: Int! + recipe: ProductRecipeInput } type PendingSuppliesCount { @@ -655,6 +657,21 @@ export const typeDefs = gql` status: String! # Текущий статус заказа } + # Типы для рецептуры продуктов + type ProductRecipe { + services: [Service!]! + fulfillmentConsumables: [Supply!]! + sellerConsumables: [Supply!]! + marketplaceCardId: String + } + + input ProductRecipeInput { + services: [ID!]! + fulfillmentConsumables: [ID!]! + sellerConsumables: [ID!]! + marketplaceCardId: String + } + type SupplyOrderResponse { success: Boolean! message: String!