From ee72a9488bcb419fb9f93971c5735bcca39e4cec Mon Sep 17 00:00:00 2001 From: Veronika Smirnova Date: Tue, 5 Aug 2025 00:19:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=20=D0=B2=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=83=20=D0=B7=D0=BD=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20v3.0=20=D1=81=20=D1=83=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE=D1=80=D0=B5=D1=87=D0=B8=D0=B9=20=D0=B8=20=D0=B4=D1=83?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.?= =?UTF-8?q?=20=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=20rules-unified.md=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5=20rules.md,?= =?UTF-8?q?=20rules1.md=20=D0=B8=20rules2.md=20=D1=81=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D1=83=D0=BD=D0=B8=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=BC=D0=B8=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B=20?= =?UTF-8?q?=D1=81=20=D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B8=D0=B5=D0=BC=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=85=D0=B5=D0=BC=D0=B5=20=D0=91=D0=94=20?= =?UTF-8?q?(=D0=A2=D0=9E=D0=92=D0=90=D0=A0=E2=86=92PRODUCT,=20=D0=A0=D0=90?= =?UTF-8?q?=D0=A1=D0=A5=D0=9E=D0=94=D0=9D=D0=98=D0=9A=D0=98=E2=86=92CONSUM?= =?UTF-8?q?ABLE).=20=D0=90=D1=80=D1=85=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D1=8B=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20archive.=20?= =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=B2=20CLAUDE.md=20=D0=B8=20?= =?UTF-8?q?development-checklist.md=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=8B=D0=B9=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CLAUDE.md | 58 + rules.md => archive/rules-v1.0.md | 17 +- rules1.md => archive/rules-v1.1.md | 17 +- rules2.md => archive/rules-v2.0.md | 734 +++- development-checklist.md | 49 +- rules-unified.md | 1626 ++++++++ server.log | 3644 +++++++++++++++++ src/app/supplies/create-suppliers/page.tsx | 13 +- src/components/supplies/add-goods-modal.tsx | 392 ++ .../create-consumables-supply-page.tsx | 57 +- .../supplies/create-suppliers-supply-page.tsx | 1210 ++++++ .../fulfillment-supplies/all-supplies-tab.tsx | 52 +- .../supplies/goods-supplies-table.tsx | 735 ++++ .../supplies/supplies-dashboard.tsx | 146 +- .../supplies/supplies-statistics.tsx | 211 + src/graphql/queries.ts | 45 + src/graphql/resolvers.ts | 70 + src/graphql/typedefs.ts | 13 +- src/lib/apollo-client.ts | 67 +- src/lib/utils.ts | 10 + visual-design-rules.md | 155 +- 21 files changed, 9147 insertions(+), 174 deletions(-) create mode 100644 CLAUDE.md rename rules.md => archive/rules-v1.0.md (98%) rename rules1.md => archive/rules-v1.1.md (97%) rename rules2.md => archive/rules-v2.0.md (60%) create mode 100644 rules-unified.md create mode 100644 server.log create mode 100644 src/components/supplies/add-goods-modal.tsx create mode 100644 src/components/supplies/create-suppliers-supply-page.tsx create mode 100644 src/components/supplies/goods-supplies-table.tsx create mode 100644 src/components/supplies/supplies-statistics.tsx diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..19fb48a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,58 @@ +# СИСТЕМНЫЕ ПРАВИЛА ДЛЯ CLAUDE CODE + +## 🚨 ОБЯЗАТЕЛЬНЫЕ ФАЙЛЫ ДЛЯ ПРОВЕРКИ + +**ПЕРЕД ЛЮБЫМ ИЗМЕНЕНИЕМ КОДА ВСЕГДА ЧИТАТЬ:** + +1. **`development-checklist.md`** - Критические проверки и запреты +2. **`rules-unified.md`** - Полная база знаний системы (v4.0) +3. **`fulfillment-cabinet-rules.md`** - Правила кабинета фулфилмента +4. **`visual-design-rules.md`** - Правила визуального дизайна + +> **Архивированы**: `rules.md`, `rules1.md`, `rules2.md` → `archive/` + +## 🔄 WORKFLOW РАЗРАБОТКИ + +### Шаг 1: Анализ задачи +- [ ] Прочитать `development-checklist.md` +- [ ] Проверить применимые правила из всех файлов правил +- [ ] Убедиться что задача не нарушает критические запреты + +### Шаг 2: Планирование +- [ ] Использовать TodoWrite для планирования задач +- [ ] Проверить соответствие архитектуре системы +- [ ] Учесть все обязательные проверки + +### Шаг 3: Реализация +- [ ] Следовать техническим правилам (GraphQL, TypeScript) +- [ ] Соблюдать систему партнерства и типизацию +- [ ] Добавлять необходимое логирование + +### Шаг 4: Проверка +- [ ] Проверить все пункты checklist'а +- [ ] Протестировать функциональность +- [ ] Убедиться в отсутствии нарушений запретов + +## 🎯 КЛЮЧЕВЫЕ ПРИНЦИПЫ + +1. **НЕ ПРЕДПОЛАГАТЬ** - всегда уточнять при сомнениях +2. **ПРОВЕРЯТЬ СХЕМЫ** - GraphQL и Prisma должны соответствовать коду +3. **СЛЕДОВАТЬ WORKFLOW** - не нарушать последовательность статусов +4. **ДОКУМЕНТИРОВАТЬ** - обновлять правила при решении проблем + +## 📋 КРИТИЧЕСКИЕ ФАЙЛЫ + +### Файлы с правилами (ВСЕГДА ПРОВЕРЯТЬ): +- `development-checklist.md` - ОБЯЗАТЕЛЬНЫЕ проверки +- `rules-unified.md` - Полная база знаний системы (v4.0) +- `fulfillment-cabinet-rules.md` - Правила кабинета фулфилмента +- `visual-design-rules.md` - Правила визуального дизайна + +### Технические файлы: +- `prisma/schema.prisma` - Схема базы данных +- `src/graphql/typedefs.ts` - GraphQL схема +- `src/graphql/resolvers.ts` - GraphQL резолверы + +## 🚨 НАПОМИНАНИЕ + +**ЭТОТ ФАЙЛ СЛУЖИТ ПОСТОЯННЫМ НАПОМИНАНИЕМ О НЕОБХОДИМОСТИ ПРОВЕРКИ ВСЕХ ФАЙЛОВ С ПРАВИЛАМИ ПЕРЕД КАЖДЫМ ИЗМЕНЕНИЕМ КОДА!** \ No newline at end of file diff --git a/rules.md b/archive/rules-v1.0.md similarity index 98% rename from rules.md rename to archive/rules-v1.0.md index c529b09..a90f5ac 100644 --- a/rules.md +++ b/archive/rules-v1.0.md @@ -2,6 +2,13 @@ > ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данные из этого файла могут быть удалены только с разрешения пользователя. Все изменения должны согласовываться. +## 🔤 ТЕРМИНЫ СИСТЕМЫ +> Для людей → `В коде` +- ТОВАР → `PRODUCT` +- РАСХОДНИКИ → `CONSUMABLE` +- БРАК → `DEFECT` *(планируется)* +- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* + ## 1. 🎯 ОСНОВНЫЕ ПРИНЦИПЫ ### 1.0 Структура системы по кабинетам @@ -27,14 +34,14 @@ **🏢 КАБИНЕТ ПОСТАВЩИКА:** -1. **ТОВАР** - базовый тип товара от поставщика -2. **РАСХОДНИКИ** - материалы и вспомогательные товары от поставщика +1. **ТОВАР** (`PRODUCT`) - базовый тип товара от поставщика +2. **РАСХОДНИКИ** (`CONSUMABLE`) - материалы и вспомогательные товары от поставщика **🏭 КАБИНЕТ ФУЛФИЛМЕНТА:** -1. **ТОВАР** - базовые товары от поставщиков (принятые на склад) -2. **БРАК** - производная от товара (товар с дефектами) -3. **ПРОДУКТ** - производная от товара (готовый к продаже товар) +1. **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) +2. **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) +3. **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар 4. **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента 5. **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров diff --git a/rules1.md b/archive/rules-v1.1.md similarity index 97% rename from rules1.md rename to archive/rules-v1.1.md index 6ef57bd..3124ac1 100644 --- a/rules1.md +++ b/archive/rules-v1.1.md @@ -2,6 +2,13 @@ > ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данные из этого файла могут быть удалены только с разрешения пользователя. Все изменения должны согласовываться. +## 🔤 ТЕРМИНЫ СИСТЕМЫ +> Для людей → `В коде` +- ТОВАР → `PRODUCT` +- РАСХОДНИКИ → `CONSUMABLE` +- БРАК → `DEFECT` *(планируется)* +- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* + --- ## 📑 ОГЛАВЛЕНИЕ @@ -30,14 +37,14 @@ **🏢 КАБИНЕТ ПОСТАВЩИКА** - создает и управляет: -- **ТОВАР** - базовые товары от поставщика -- **РАСХОДНИКИ** - материалы и вспомогательные товары от поставщика +- **ТОВАР** (`PRODUCT`) - базовые товары от поставщика +- **РАСХОДНИКИ** (`CONSUMABLE`) - материалы и вспомогательные товары от поставщика **🏭 КАБИНЕТ ФУЛФИЛМЕНТА** - принимает, обрабатывает и управляет всеми типами: -- **ТОВАР** - базовые товары от поставщиков (принятые на склад) -- **БРАК** - производная от товара (товар с дефектами) -- **ПРОДУКТ** - производная от товара (готовый к продаже товар) +- **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) +- **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) +- **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар - **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента - **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров diff --git a/rules2.md b/archive/rules-v2.0.md similarity index 60% rename from rules2.md rename to archive/rules-v2.0.md index c94925c..fd93199 100644 --- a/rules2.md +++ b/archive/rules-v2.0.md @@ -2,6 +2,17 @@ > ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данный файл является объединенной базой знаний системы на основе анализа rules.md, rules1.md и description.md. Все изменения должны согласовываться. +## 🔤 ТЕРМИНЫ СИСТЕМЫ +> Для людей → `В коде` +- ТОВАР → `PRODUCT` +- РАСХОДНИКИ → `CONSUMABLE` +- БРАК → `DEFECT` *(планируется)* +- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* +- ПОСТАВЩИК → `WHOLESALE` +- СЕЛЛЕР → `SELLER` +- ФУЛФИЛМЕНТ → `FULFILLMENT` +- ЛОГИСТИКА → `LOGIST` + --- ## 📑 ОГЛАВЛЕНИЕ @@ -27,23 +38,27 @@ 11. [🏭 Кабинет фулфилмента](#11--кабинет-фулфилмента) 12. [🚚 Кабинет логистики](#12--кабинет-логистики) +### 🤝 **СИСТЕМА ПАРТНЕРСТВА** + +13. [🤝 Система партнерства и контрагентов](#13--система-партнерства-и-контрагентов) + ### 🌐 **ИНТЕГРАЦИИ И ФУНКЦИИ** -13. [🌐 Интеграции с системой](#13--интеграции-с-системой) -14. [📊 Статистика и аналитика](#14--статистика-и-аналитика) -15. [⚠️ Критические запреты](#15--критические-запреты) +14. [🌐 Интеграции с системой](#14--интеграции-с-системой) +15. [📊 Статистика и аналитика](#15--статистика-и-аналитика) +16. [⚠️ Критические запреты](#16--критические-запреты) ### 💻 **ТЕХНИЧЕСКИЕ ПРАВИЛА** -16. [📱 Правила пользовательского интерфейса](#16--правила-пользовательского-интерфейса) -17. [🚨 Правила обработки ошибок](#17--правила-обработки-ошибок) -18. [📈 Правила производительности](#18--правила-производительности) -19. [🔐 Правила безопасности данных](#19--правила-безопасности-данных) -20. [🎯 Правила качества кода](#20--правила-качества-кода) +17. [📱 Правила пользовательского интерфейса](#17--правила-пользовательского-интерфейса) +18. [🚨 Правила обработки ошибок](#18--правила-обработки-ошибок) +19. [📈 Правила производительности](#19--правила-производительности) +20. [🔐 Правила безопасности данных](#20--правила-безопасности-данных) +21. [🎯 Правила качества кода](#21--правила-качества-кода) ### 📋 **ДОПОЛНИТЕЛЬНО** -21. [📋 Приложение: Дополнительные возможности и планы](#-приложение-дополнительные-возможности-и-планы) +22. [📋 Приложение: Дополнительные возможности и планы](#22-приложение-дополнительные-возможности-и-планы) --- @@ -53,10 +68,12 @@ | Сущность | Название в системе | Кабинет создания | Описание | Статус | | ---------- | ---------------------------------- | ---------------- | ----------------------------------------------- | --------------- | -| Товар | `Product` (type: PRODUCT) | Поставщик | Базовый тип товара от поставщика | ✅ Реализовано | -| Брак | `Product` (type: DEFECT) | Фулфилмент | Производная от товара с дефектами | 🔄 В разработке | -| Расходники | `Product` (type: CONSUMABLE) | Поставщик | Материалы и вспомогательные товары | ✅ Реализовано | -| Продукт | `Product` (type: FINISHED_PRODUCT) | Фулфилмент | Готовый к продаже товар (производная от товара) | 🔄 В разработке | +| Товар | `Product` (type: `PRODUCT`) | Поставщик | Базовый тип товара от поставщика | ✅ Реализовано | +| Расходники | `Product` (type: `CONSUMABLE`) | Поставщик | Материалы и вспомогательные товары | ✅ Реализовано | +| Брак | `Product` (type: `DEFECT`)* | Фулфилмент | Производная от товара с дефектами | 📋 Планируется | +| Продукт | `Product` (type: `FINISHED_PRODUCT`)* | Фулфилмент | Готовый к продаже товар (производная от товара) | 📋 Планируется | + +> **\* Планируется**: Типы `DEFECT` и `FINISHED_PRODUCT` еще не добавлены в Prisma схему ### 🏢 **ОРГАНИЗАЦИИ И РОЛИ** @@ -96,9 +113,9 @@ ## 2. 📦 ТИПИЗАЦИЯ ПРЕДМЕТОВ -### 2.1 Четыре основных типа предметов +### 2.1 Два реализованных и два планируемых типа предметов -#### **1. ТОВАР** (базовый тип) +#### **1. ТОВАР** (`PRODUCT` - базовый тип) - **СОЗДАЕТСЯ**: Поставщиком - **СТАТУС**: Может быть активным/неактивным @@ -106,9 +123,17 @@ - **ТРАНСФОРМАЦИЯ**: Может стать ПРОДУКТОМ или БРАКОМ - **ЦЕНА**: Обязательна, больше 0 -#### **2. БРАК** (производная от товара) +#### **2. РАСХОДНИКИ** (`CONSUMABLE` - базовый тип) -- **СОЗДАЕТСЯ**: Фулфилментом на основе существующего ТОВАРА при обнаружении дефектов +- **СОЗДАЕТСЯ**: Поставщиком как универсальный тип +- **КЛАССИФИКАЦИЯ ПРИ ЗАКАЗЕ**: + - Фулфилмент заказывает → "Расходники фулфилмента" + - Селлер заказывает → "Расходники селлеров" +- **ДОСТУП**: Видны всем типам организаций в маркете + +#### **3. БРАК** (`DEFECT` - планируется, производная от товара) + +- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе существующего ТОВАРА при обнаружении дефектов - **МОМЕНТ СОЗДАНИЯ**: В процессе "Создание продукта" / "В работе" после подсчета факта - **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) - **ЗАКАЗ**: ЗАПРЕЩЕН заказ брака @@ -117,23 +142,17 @@ - **WORKFLOW**: Особый процесс списания и утилизации - **УЧЕТ**: Отдельный учет в статистике потерь - **ОТОБРАЖЕНИЕ**: Виден только для учета потерь +- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `DEFECT` еще не добавлен в схему БД -#### **3. РАСХОДНИКИ** (базовый тип) +#### **4. ПРОДУКТ** (`FINISHED_PRODUCT` - планируется, производная от товара) -- **СОЗДАЕТСЯ**: Поставщиком как универсальный тип -- **КЛАССИФИКАЦИЯ ПРИ ЗАКАЗЕ**: - - Фулфилмент заказывает → "Расходники фулфилмента" - - Селлер заказывает → "Расходники селлеров" -- **ДОСТУП**: Видны всем типам организаций в маркете - -#### **4. ПРОДУКТ** (производная от товара) - -- **СОЗДАЕТСЯ**: Фулфилментом на основе ТОВАРА по заказу селлера +- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе ТОВАРА по заказу селлера - **ИНИЦИАТОР**: Селлер создает заказ с рецептурой, фулфилмент исполняет - **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) - **РЕЦЕПТУРА**: Задается селлером при создании заказа (Товар + Услуга + Расходники) - **СТАТУСЫ**: "в работе" → "готов к отправке" - **ЗАКАЗ**: Доступен только в статусе "готов к отправке" +- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `FINISHED_PRODUCT` еще не добавлен в схему БД ### 2.2 Обязательные поля карточки @@ -595,7 +614,419 @@ transition-all duration-150 - **ПРИЧИНА**: Заменяется контекстными кнопками в табах - **СОХРАНИТЬ**: Стили и логику навигации, но адаптировать под новые роуты -### 9.4 Экономика +### 9.4 Структура страницы "Мои поставки" - Трёхблочная архитектура + +#### **9.4.1 Обязательная структура страницы** + +**ПРИНЦИП**: Страница состоит из трёх визуально разделённых блоков + +``` +┌─────────────────────────────────────────┐ +│ 1. БЛОК ТАБОВ (навигация) │ +│ - Фиксированная высота │ +│ - Glass-эффект │ +│ - Иерархическая структура │ +├─────────────────────────────────────────┤ +│ 2. БЛОК СТАТИСТИКИ (метрики) │ +│ - Контекстные данные │ +│ - 4 карточки в ряд (desktop) │ +│ - Динамическое обновление │ +├─────────────────────────────────────────┤ +│ 3. ОСНОВНОЙ БЛОК (контент) │ +│ - Сохраняет весь функционал │ +│ - Таблицы, фильтры, действия │ +│ - Высота до низа sidebar │ +└─────────────────────────────────────────┘ +``` + +#### **9.4.2 Блок статистики - контекстные метрики** + +**ПРАВИЛО**: Статистика меняется в зависимости от выбранных табов + +**Для путей "Фулфилмент → Товар → Карточки/Поставщики":** +- Всего поставок +- Активных поставок +- Сумма активных поставок +- В пути + +**Для пути "Фулфилмент → Расходники селлера":** +- Всего поставок +- Активных поставок +- Видов расходников +- Критические остатки + +**Для путей "Маркетплейсы → Wildberries/Ozon":** +- Поставок на маркетплейс +- Товаров отправлено +- Возвраты за неделю +- Эффективность поставок + +#### **9.4.3 Высота основного блока** + +**ФОРМУЛА РАСЧЕТА**: +```css +height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) +``` + +**ПРАВИЛО ВЫРАВНИВАНИЯ**: +- Нижняя граница основного блока должна быть на одном уровне с нижней границей sidebar +- При изменении размера окна высота пересчитывается +- Внутренний скролл: `overflow-y-auto` + +#### **9.4.4 Сохранение функционала** + +**КРИТИЧЕСКИ ВАЖНО**: При добавлении блока статистики весь существующий функционал сохраняется: +- Таблицы с данными поставок +- Фильтры и сортировка +- Кнопки действий +- Детализация при клике +- Пагинация +- Поиск + +**ЗАПРЕЩЕНО**: +- Удалять существующие компоненты +- Изменять логику работы таблиц +- Нарушать существующие API вызовы + +#### **9.4.5 Проверка остатков при создании поставки** + +**ОБЯЗАТЕЛЬНАЯ ВАЛИДАЦИЯ**: + +1. **Проверка на клиенте**: +```typescript +// При изменении количества +if (quantity > product.stock) { + toast.error(`Недостаточно товара. Доступно: ${product.stock}`); + return; +} +``` + +2. **Проверка на сервере**: +```typescript +// Перед созданием заказа +const stockAvailable = await checkStockAvailability(productId, quantity); +if (!stockAvailable) { + throw new Error("Insufficient stock"); +} +``` + +3. **Логирование проверок**: +- Все попытки добавления в корзину +- Результаты проверки остатков +- ID пользователя и timestamp + +#### **9.4.6 Адаптивность блоков** + +**Desktop (>1024px)**: +- Все три блока вертикально +- Статистика: 4 карточки в ряд + +**Tablet (768-1024px)**: +- Все три блока вертикально +- Статистика: 2 карточки в ряд + +**Mobile (<768px)**: +- Блоки в колонку +- Статистика: 1 карточка в ряд +- Сворачиваемая статистика + +### 9.5 Табы "Карточки" и "Поставщики" - объединённая логика + +#### **9.5.1 Принцип единого типа предмета** + +**КЛЮЧЕВОЕ ПРАВИЛО**: Табы "Карточки" и "Поставщики" - это два способа создания поставок одного типа предмета (ТОВАР) + +**СПОСОБЫ СОЗДАНИЯ**: +- **Карточки** - импорт товаров через WB API с автоматическим созданием поставки +- **Поставщики** - прямой заказ товаров у поставщика с указанием рецептуры + +**РЕЗУЛЬТАТ**: Оба способа создают `SupplyOrder` с товарами типа `PRODUCT` + +#### **9.5.2 Общая статистика** + +**ПРАВИЛО**: Блок статистики показывает ОДИНАКОВЫЕ данные для обоих табов + +**МЕТРИКИ ДЛЯ ТАБОВ "КАРТОЧКИ" И "ПОСТАВЩИКИ"**: +- Всего поставок товаров (из всех источников) +- Активных поставок товаров (в работе) +- Сумма активных поставок товаров +- Товаров в пути (все способы доставки) + +**ЗАПРЕЩЕНО**: Разделять статистику по способу создания + +#### **9.5.3 Общий основной блок** + +**СОДЕРЖИМОЕ**: Единая таблица всех поставок товаров + +**ИСТОЧНИКИ ДАННЫХ**: +- Поставки, созданные через импорт карточек WB +- Поставки, созданные через заказ у поставщиков +- Все промежуточные и завершённые поставки + +**РАЗЛИЧИЯ ТАБОВ**: +- Только кнопки создания ведут на разные страницы +- Таб "Карточки": `/supplies/create-cards` +- Таб "Поставщики": `/supplies/create-suppliers` + +#### **9.5.4 Структура таблицы поставок товаров** + +**ОБЯЗАТЕЛЬНЫЕ КОЛОНКИ**: +- Номер поставки +- Способ создания (иконка: 📱 карточки / 🏢 поставщик) +- Количество товаров +- Общая стоимость +- Поставщик/Источник +- Дата поставки (планируемая дата доставки) +- Статус +- Дата создания +- Действия + +**ФИЛЬТРЫ**: +- По статусу workflow +- По способу создания +- По поставщику +- По периоду +- По дате поставки +- По сумме заказа + +#### **9.5.5 Детализация поставки** + +**ПРИ КЛИКЕ НА ПОСТАВКУ**: +- Раскрывается детализация товаров в поставке +- Информация о рецептуре (если применимо) +- История изменения статусов +- Логистическая информация +- Связанные документы + +**ДЕЙСТВИЯ В ДЕТАЛИЗАЦИИ**: +- Отслеживание статуса +- Связь с поставщиком/логистикой +- Отмена (если статус позволяет) +- Экспорт данных + +#### **9.5.6 Принципы реализации** + +**ОБЯЗАТЕЛЬНО**: +- Использовать единый компонент для отображения таблицы +- Агрегировать данные из всех источников в статистике +- Сохранять фильтрацию при переключении между табами + +**ЗАПРЕЩЕНО**: +- Создавать отдельные таблицы для разных способов создания +- Разделять статистику по источникам +- Дублировать логику отображения поставок + +### 9.7 Форма создания поставки товаров через поставщиков + +#### **9.7.1 Маршрут и навигация** +**URL**: `/supplies/create-suppliers` +**Доступ**: Только для селлеров и администраторов +**Возврат**: Кнопка "Назад" ведет к табу "Поставщики" в разделе товаров + +#### **9.7.2 Структура страницы - 3 блока (аналогично create-consumables)** + +**БЛОК 1: ЗАГОЛОВОК И НАВИГАЦИЯ** +- Заголовок: "Создание поставки товаров через поставщиков" +- Подзаголовок: "Прямой заказ товаров у поставщика с указанием рецептуры" +- Кнопка "Назад" (возврат к табу "Поставщики") +- Индикатор прогресса: "Шаг 1 из 3" (Товары → Логистика → Подтверждение) + +**БЛОК 2: ФОРМА ТОВАРОВ** +- **Выбор поставщика**: Работает как на create-consumables (выбор из существующих) +- **Каталог товаров поставщика**: Отображение доступных товаров выбранного поставщика +- **Корзина товаров**: Система добавления товаров в корзину как на create-consumables +- **Поля товара при добавлении в корзину**: + - Название товара (из каталога поставщика) + - Артикул поставщика (из каталога) + - Категория (из каталога) + - Количество (вводит пользователь, > 0) + - Цена за единицу (из каталога или договорная) + - Комплектность (если есть) - описание состава комплекта + - Рецептура/состав (текстовое поле для дополнений) + - Параметры товара (цвет, размер, материал - если применимо) + +**БЛОК 3: КОРЗИНА И ИТОГИ** +- Таблица товаров в корзине +- **Желаемая дата поставки** (обязательное поле с календарем) +- **Выбор логистики**: + - Dropdown "Логистическая компания" (опционально) + - Если не выбрано: "Логистику выберет фulfilment" + - Ориентировочная стоимость логистики (расчетная) +- Общее количество товаров в корзине +- Общая стоимость товаров +- Ориентировочная стоимость фулфилмента (расчетная) +- **Итого к оплате** (сумма всех составляющих) +- Кнопка "Продолжить" (переход к подтверждению заказа) + +#### **9.7.3 Принцип работы с поставщиками-партнерами** + +**ИСТОЧНИК ПОСТАВЩИКОВ**: +- Показываются только поставщики-партнеры из таблицы `Counterparty` +- Фильтрация: `counterparty.type === "WHOLESALE"` +- Партнерство может быть создано двумя способами: + 1. Через заказ в маркете → автоматическое партнерство после одобрения + 2. Через раздел "Партнеры" → отправка и принятие заявки `CounterpartyRequest` + +**ВЫБОР ПОСТАВЩИКА**: +- Dropdown с поиском партнеров-поставщиков +- Отображение: Название поставщика, ИНН, статус партнерства +- Только активные партнеры с типом WHOLESALE +- При выборе загружается каталог товаров поставщика из `Product` таблицы + +**КАТАЛОГ ТОВАРОВ ПАРТНЕРА**: +- Товары из `Product` where `organizationId = поставщик.id` +- Отображение в виде карточек с полями: + - Картинка товара + - Название, артикул + - Цена за единицу + - Доступное количество + - Поле ввода количества (минимум 5 цифр) с кнопками +/- +- Фильтрация по категориям +- Поиск по названию/артикулу + +#### **9.7.4 Принцип работы с товарами и корзиной (как на create-consumables)** + +**ДОБАВЛЕНИЕ В КОРЗИНУ**: +- Клик по товару → модальное окно с деталями +- Указание количества, комплектности, дополнительных параметров +- Кнопка "Добавить в корзину" + +**КОРЗИНА**: +- Отображение добавленных товаров в таблице +- Колонки: Товар, Артикул, Количество, Цена, Комплектность, Сумма +- Возможность изменения количества +- Кнопка удаления товара из корзины +- Автоматический пересчет итогов + +#### **9.7.5 Поля формы товара** + +**ОСНОВНЫЕ ПОЛЯ** (из каталога поставщика): +- Название товара +- Артикул поставщика +- Категория +- Базовая цена + +**ПОЛЯ ДЛЯ ЗАПОЛНЕНИЯ**: +- Количество (целое число > 0) +- Комплектность (если есть) - текстовое описание состава +- Цена за единицу (может отличаться от базовой по договоренности) +- Описание/рецептура (дополнительные требования) +- Особые требования к товару + +**ПАРАМЕТРЫ ТОВАРА** (если применимо): +- Цвет, Размер, Материал, Бренд +- Динамические параметры для конкретной категории + +#### **9.7.6 Валидация и проверки** + +**ОБЯЗАТЕЛЬНАЯ ВАЛИДАЦИЯ**: +- Выбран поставщик +- В корзине минимум 1 товар +- Указана желаемая дата поставки +- У всех товаров указано количество > 0 +- Все товары проверены на наличие у поставщика +- Количество каждого товара ≤ доступному остатку + +**ПРЕДУПРЕЖДЕНИЯ**: +- "Товар заканчивается на складе поставщика (осталось X шт)" +- "Товар недоступен, выберите другое количество" +- "Выбранная дата может не соответствовать возможностям логистики" +- "Габариты не указаны - стоимость логистики ориентировочная" +- Превышение лимитов заказа +- Значительное отклонение цены от каталожной + +**АВТОМАТИЧЕСКИЕ РАСЧЕТЫ**: +- Стоимость по каждому товару = количество × цена +- Общая стоимость товаров в корзине +- Комиссии фулфилмента (% от стоимости) +- Логистика (по весу/габаритам или фиксированная ставка) + +#### **9.7.7 Выбор логистики** + +**ОПЦИИ ЛОГИСТИКИ**: +- "Автоматический выбор" (фулфилмент выберет оптимальную) +- Список доступных логистических компаний +- Отображение ориентировочной стоимости по каждой опции +- Сроки доставки по каждой опции + +**ЛОГИКА ВЫБОРА**: +- Если селлер не выбрал → фулфилмент выбирает оптимальную +- Если селлер выбрал → используется выбранная компания +- Финальная стоимость может отличаться от ориентировочной + +#### **9.7.8 Желаемая дата поставки** + +**РАСПОЛОЖЕНИЕ**: В блоке корзины и итогов + +**ПОЛЕ "ЖЕЛАЕМАЯ ДАТА ПОСТАВКИ"**: +- **Обязательное поле** для планирования +- **Календарь** с ограничениями: + - Минимум: завтра (нельзя выбрать прошедшие даты) + - Максимум: +90 дней от текущей даты +- **Проверка на рабочие дни** (опционально) +- **Подсказки** по срокам доставки от выбранной логистической компании + +**ЛОГИКА РАБОТЫ С ДАТОЙ**: +- При выборе логистики → автоматическое обновление возможных дат +- При изменении даты → пересчет стоимости логистики (если зависит от срочности) +- Отображение: "Ориентировочная дата доставки: 15-17 января 2024" + +#### **9.7.9 Ограничения и проверки товаров** + +**КОЛИЧЕСТВЕННЫЕ ОГРАНИЧЕНИЯ**: +- **НЕТ ограничений** на максимальное количество товаров в поставке +- **ОБЯЗАТЕЛЬНАЯ проверка** доступности на складах поставщиков +- **В реальном времени** проверка остатков при добавлении в корзину +- **Предупреждения** если запрашиваемое количество превышает доступное +- **Блокировка** добавления товара если его нет в наличии у поставщика + +**ЛОГИКА ПРОВЕРКИ ОСТАТКОВ**: +- При добавлении товара в корзину → запрос к API поставщика +- При изменении количества → повторная проверка +- Отображение доступного количества рядом с полем ввода +- Сообщение: "Доступно: 150 шт" или "Нет в наличии" + +#### **9.7.10 Габариты и логистические данные** + +**НА ЭТАПЕ СОЗДАНИЯ ПОСТАВКИ**: +- **НЕТ обязательных** полей для габаритов/веса +- **Ориентировочный расчет** логистики по средним показателям категории +- **Предупреждение** что финальная стоимость может отличаться + +**В КАБИНЕТЕ ПОСТАВЩИКА** (при одобрении поставки): +- **Возможность ввести** точные логистические данные: + - Габариты каждого товара (Д×Ш×В в см) + - Объем упаковки (в куб.м) + - Количество мест/коробок + - Общий вес поставки +- **НЕ обязательные** для заполнения (можно оставить пустыми) +- **Уточнение стоимости** логистики после заполнения данных + +#### **9.7.11 Навигация и сохранение** + +**УПРАВЛЕНИЕ СЕССИЕЙ**: +- Автосохранение корзины каждые 30 секунд +- Сохранение состояния при смене поставщика +- Предупреждение при попытке покинуть страницу + +**ПЕРЕХОДЫ**: +- "Назад" → возврат к табу "Поставщики" (с предупреждением о потере данных) +- "Очистить корзину" → очистка всех товаров с подтверждением +- "Продолжить" → переход к подтверждению и оформлению заказа + +#### **9.7.12 Интеграция с системой** + +**СВЯЗЬ С ДАННЫМИ**: +- Работа с каталогом товаров поставщиков +- Проверка остатков в реальном времени +- Создание черновика `SupplyOrder` типа `ТОВАР` способом `suppliers` + +**ОСОБЕННОСТИ**: +- Отличие от "Карточки": здесь товары выбираются из каталога поставщика +- Отличие от "Расходники": здесь товары предназначены для перепродажи +- Возможность указания комплектности для наборов товаров + +### 9.8 Экономика _Раздел находится в разработке. Будет добавлен позже._ @@ -801,9 +1232,169 @@ _Раздел находится в разработке. Будет добав --- -## 13. 🌐 ИНТЕГРАЦИИ С СИСТЕМОЙ +## 13. 🤝 СИСТЕМА ПАРТНЕРСТВА И КОНТРАГЕНТОВ -### 13.1 Глобальная интеграция +### 13.1 Основы системы партнерства + +**ПРИНЦИП РАБОТЫ**: +- Все типы кабинетов могут создавать партнерские отношения +- Партнерство реализовано через таблицы `Counterparty` и `CounterpartyRequest` +- Двустороннее партнерство: каждая организация видит другую в разделе "Партнеры" + +**ТИПЫ ОРГАНИЗАЦИЙ-ПАРТНЕРОВ**: +- `WHOLESALE` - Поставщики товаров и расходников +- `FULFILLMENT` - Фулфилмент-центры +- `LOGIST` - Логистические компании +- `SELLER` - Селлеры (торговые организации) + +### 13.2 Способы создания партнерства + +#### **СПОСОБ 1: Через заказ в маркете (автоматическое партнерство)** + +**WORKFLOW**: +1. Поставщик создает товар → товар попадает в глобальный маркет +2. Селлер/Фулфилмент находит товар в маркете +3. Создает заказ (`SupplyOrder`) → статус `PENDING` +4. Поставщик получает уведомление в разделе "Заявки" +5. Поставщик одобряет заявку → статус `SUPPLIER_APPROVED` +6. **Автоматически создается двустороннее партнерство**: + - Запись в `Counterparty` для заказчика (`organizationId` → `counterpartyId`) + - Обратная запись в `Counterparty` для поставщика +7. Обе организации видят друг друга в разделе "Партнеры" + +#### **СПОСОБ 2: Через раздел "Партнеры" (заявочная система)** + +**WORKFLOW**: +1. Любая организация идет в раздел "Партнеры" +2. Использует поиск для нахождения нужной организации +3. Отправляет заявку на партнерство → создается `CounterpartyRequest`: + - `senderId` - отправитель заявки + - `receiverId` - получатель заявки + - `status: PENDING` + - `message` - опциональное сообщение +4. Получатель видит заявку в разделе "Партнеры" → "Входящие заявки" +5. Получатель принимает заявку → статус меняется на `ACCEPTED` +6. **Автоматически создается двустороннее партнерство** (аналогично способу 1) + +**СТАТУСЫ ЗАЯВОК**: +- `PENDING` - Ожидает рассмотрения +- `ACCEPTED` - Принята (партнерство создано) +- `REJECTED` - Отклонена +- `CANCELLED` - Отменена отправителем + +### 13.3 Использование партнерства в системе + +#### **В форме создания поставки товаров через поставщиков** + +**ПРАВИЛО ОТОБРАЖЕНИЯ ПОСТАВЩИКОВ**: +- Показываются только партнеры с типом `WHOLESALE` +- Источник: таблица `Counterparty` where `counterparty.type === "WHOLESALE"` +- Фильтрация по `organizationId` текущего пользователя + +**ЛОГИКА РАБОТЫ**: +1. Пользователь выбирает поставщика из dropdown партнеров-поставщиков +2. Загружается каталог товаров поставщика из `Product` таблицы +3. Товары фильтруются по `organizationId = поставщик.id` +4. Пользователь может добавлять товары в корзину и создавать заказ + +#### **В других разделах системы** + +**ВЫБОР ФУЛФИЛМЕНТ-ЦЕНТРА**: +- Партнеры с типом `FULFILLMENT` +- Используется при создании поставок расходников + +**ВЫБОР ЛОГИСТИКИ**: +- Партнеры с типом `LOGIST` +- Используется при планировании доставок + +**МЕССЕНДЖЕР**: +- Общение доступно только между партнерами +- Список чатов формируется из таблицы `Counterparty` + +### 13.4 Технические правила + +**СОЗДАНИЕ ЗАПИСЕЙ В COUNTERPARTY**: +```sql +-- При создании партнерства создаются ДВЕ записи +INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org1_id, org2_id); +INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org2_id, org1_id); +``` + +**ПРОВЕРКА ПАРТНЕРСТВА**: +```typescript +const isPartner = await prisma.counterparty.findFirst({ + where: { + organizationId: currentOrgId, + counterpartyId: targetOrgId + } +}); +``` + +**ПОЛУЧЕНИЕ ПАРТНЕРОВ ПО ТИПУ**: +```typescript +const wholesalePartners = await prisma.counterparty.findMany({ + where: { + organizationId: currentOrgId, + counterparty: { + type: "WHOLESALE" + } + }, + include: { + counterparty: true + } +}); +``` + +### 13.5 Решение распространенных проблем + +#### **ПРОБЛЕМА: GraphQL запрос не возвращает данные партнеров** + +**Симптомы**: +- В консоли браузера: `All counterparties: 0`, `All counterparties data: []` +- GraphQL запрос отправляется успешно, но возвращает пустой массив +- В базе данных партнеры существуют + +**Возможные причины и решения**: + +1. **НЕПРАВИЛЬНОЕ ИМЯ ПОЛЯ В КОДЕ** (наиболее частая ошибка): + ```typescript + // ❌ НЕПРАВИЛЬНО + const allCounterparties = counterpartiesData?.getMyCounterparties || []; + + // ✅ ПРАВИЛЬНО + const allCounterparties = counterpartiesData?.myCounterparties || []; + ``` + **Объяснение**: В GraphQL схеме поле называется `myCounterparties`, а не `getMyCounterparties` + +2. **НЕСООТВЕТСТВИЕ ID ПОЛЬЗОВАТЕЛЯ**: + - Проверить что пользователь авторизован под правильным аккаунтом + - Убедиться что `context.user.id` соответствует ожидаемому пользователю + +3. **ПРОБЛЕМЫ С КЕШИРОВАНИЕМ APOLLO CLIENT**: + ```typescript + const { data, loading, error } = useQuery(GET_MY_COUNTERPARTIES, { + fetchPolicy: 'network-only', // Обходим кеш + errorPolicy: 'all' + }); + ``` + +4. **ОТСУТСТВИЕ ЛОГИРОВАНИЯ В РЕЗОЛВЕРЕ**: + - Добавить console.log в GraphQL резолвер для отладки + - Проверить что резолвер вызывается + +**Чек-лист для диагностики**: +- [ ] Проверить правильность имени поля в коде (`myCounterparties`) +- [ ] Убедиться что пользователь авторизован +- [ ] Проверить логи сервера на вызов резолвера +- [ ] Добавить отладочное логирование в браузере +- [ ] Проверить данные в базе через Prisma Studio +- [ ] Использовать `fetchPolicy: 'network-only'` для обхода кеша + +--- + +## 14. 🌐 ИНТЕГРАЦИИ С СИСТЕМОЙ + +### 14.1 Глобальная интеграция - **МАРКЕТ**: Товары поставщиков отображаются в глобальном маркете - **СИНХРОНИЗАЦИЯ**: Данные склада синхронизируются с модулем аналитики @@ -1137,6 +1728,89 @@ _Раздел находится в разработке. Будет добав --- +## 21. 🎯 ПРАВИЛА КАЧЕСТВА КОДА + +### 21.1 GraphQL Rules + +#### **Правила именования полей** + +**ВАЖНО**: Имена полей в GraphQL запросах должны точно соответствовать схеме! + +```typescript +// ✅ ПРАВИЛЬНО - соответствует схеме +export const GET_MY_COUNTERPARTIES = gql` + query GetMyCounterparties { + myCounterparties { // <- имя поля в схеме + id + name + type + } + } +`; + +// Использование в компоненте +const allCounterparties = counterpartiesData?.myCounterparties || []; +``` + +```typescript +// ❌ НЕПРАВИЛЬНО - не соответствует схеме +const allCounterparties = counterpartiesData?.getMyCounterparties || []; // Ошибка! +``` + +#### **Правила отладки GraphQL** + +**При проблемах с GraphQL запросами следовать чек-листу**: + +1. **Проверить соответствие имен полей схеме** +2. **Добавить fetchPolicy: 'network-only' для обхода кеша** +3. **Логировать данные в браузере и сервере** +4. **Проверить авторизацию пользователя** +5. **Убедиться что резолвер вызывается** + +#### **Обязательные поля для отладки** + +```typescript +const { data, loading, error } = useQuery(QUERY_NAME, { + fetchPolicy: 'network-only', // Обходим кеш при отладке + errorPolicy: 'all' // Показываем все ошибки +}); + +// Логирование для отладки +console.log("Data:", data); +console.log("Loading:", loading); +console.log("Error:", error); +``` + +### 21.2 TypeScript Rules + +#### **Интерфейсы данных** + +**Поля интерфейсов должны соответствовать GraphQL схеме**: + +```typescript +// ✅ ПРАВИЛЬНО - соответствует schema.prisma +interface GoodsProduct { + id: string; + name: string; + article: string; // <- соответствует полю в schema + quantity?: number; // <- соответствует полю в schema + organization: { + id: string; + name: string; + }; +} +``` + +```typescript +// ❌ НЕПРАВИЛЬНО - не соответствует schema +interface GoodsProduct { + sku: string; // <- в schema поле называется 'article' + stock?: number; // <- в schema поле называется 'quantity' +} +``` + +--- + _Эта база знаний создана на основе анализа rules.md, rules1.md и description.md и является единым источником понимания структуры и логики проекта._ _Версия: 2.0_ diff --git a/development-checklist.md b/development-checklist.md index bf70bb3..b990da7 100644 --- a/development-checklist.md +++ b/development-checklist.md @@ -2,14 +2,24 @@ > ⚠️ **КРИТИЧЕСКИ ВАЖНО**: Этот чеклист ОБЯЗАТЕЛЕН к проверке перед любым изменением кода! +## 🔤 ТЕРМИНЫ СИСТЕМЫ +> Для людей → `В коде` +- ТОВАР → `PRODUCT` +- РАСХОДНИКИ → `CONSUMABLE` +- БРАК → `DEFECT` *(планируется)* +- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* + ## 🔴 КРИТИЧЕСКИЕ ПРОВЕРКИ (НЕЛЬЗЯ НАРУШАТЬ) ### ✅ Типизация предметов -- [ ] Каждый предмет имеет один из 4 типов: ТОВАР, БРАК, РАСХОДНИКИ, ПРОДУКТ +- [ ] Каждый предмет имеет один из типов: ТОВАР (`PRODUCT`), РАСХОДНИКИ (`CONSUMABLE`), БРАК и ПРОДУКТ (планируются) - [ ] БРАК и ПРОДУКТ имеют обязательную связь с родительским товаром (parentId) - [ ] Расходники создаются как универсальный тип, классифицируются при заказе - [ ] ТОВАР ≠ ПРОДУКТ (разные сущности в системе) +- [ ] **В формах создания поставок товаров показываются ТОЛЬКО предметы типа ТОВАР** (`PRODUCT`) +- [ ] **В формах создания поставок расходников показываются ТОЛЬКО предметы типа РАСХОДНИКИ** (`CONSUMABLE`) +- [ ] **Фильтрация по типу предмета происходит на уровне GraphQL резолвера**, не на фронтенде ### ✅ Workflow статусов @@ -121,6 +131,35 @@ - [ ] Документирование всех API методов - [ ] Автоматическое тестирование при развертывании +### ✅ GraphQL и TypeScript + +- [ ] Имена полей в коде соответствуют GraphQL схеме (`myCounterparties`, не `getMyCounterparties`) +- [ ] Интерфейсы TypeScript соответствуют schema.prisma (`article`, не `sku`; `quantity`, не `stock`) +- [ ] При проблемах с GraphQL использовать `fetchPolicy: 'network-only'` для обхода кеша +- [ ] Добавлять логирование при отладке GraphQL запросов +- [ ] Проверка что резолверы вызываются (логи сервера) +- [ ] **Использовать специализированные запросы вместо общих** (`GET_ORGANIZATION_PRODUCTS` вместо `GET_ALL_PRODUCTS` для конкретного поставщика) +- [ ] **Обязательная фильтрация по типу предмета** в резолверах (`PRODUCT`/`CONSUMABLE`) +- [ ] **Параметр `organizationId` обязателен** для запросов товаров конкретной организации + +### ✅ Система партнерства + +- [ ] Поставщики в формах берутся только из партнеров с типом `WHOLESALE` +- [ ] Используется запрос `GET_MY_COUNTERPARTIES` с фильтрацией по типу +- [ ] НЕ используется `GET_SUPPLY_SUPPLIERS` для отображения поставщиков в формах +- [ ] Партнерство создается двумя способами: через заказ в маркете или через раздел "Партнеры" +- [ ] Двусторонние записи в таблице `Counterparty` при создании партнерства + +### ✅ Архитектурные принципы GraphQL + +- [ ] **Создавать специализированные резолверы** для каждого контекста использования +- [ ] **Использовать параметризованные запросы** (`organizationId`, `type`, `search`) вместо фильтрации на фронтенде +- [ ] **Добавлять подробное логирование** в резолверы для отладки (входные параметры, результаты фильтрации) +- [ ] **Типы запросов должны отражать бизнес-логику**: `organizationProducts` для товаров конкретной организации +- [ ] **Значения по умолчанию в резолверах** для критических параметров (`type: args.type || "PRODUCT"`) +- [ ] **Валидация обязательных параметров** на уровне схемы (`organizationId: ID!`) +- [ ] **Кеширование обходить при проблемах** через `fetchPolicy: 'network-only'` + ## 🟢 РЕКОМЕНДУЕМЫЕ ПРОВЕРКИ ### ✅ Пользовательский опыт @@ -147,6 +186,12 @@ 8. Нарушать последовательность статусов 9. Игнорировать валидацию 10. Нарушать последовательность модулей в статистике фулфилмента +11. **Использовать неправильные имена полей GraphQL** (`getMyCounterparties` вместо `myCounterparties`) +12. **Использовать GET_SUPPLY_SUPPLIERS для отображения поставщиков в формах** (только партнеры WHOLESALE) +13. **Создавать интерфейсы TypeScript не соответствующие schema.prisma** (`sku`/`stock` вместо `article`/`quantity`) +14. **Использовать общие запросы вместо специализированных** (`GET_ALL_PRODUCTS` вместо `GET_ORGANIZATION_PRODUCTS` для конкретного поставщика) +15. **Показывать расходники в формах создания поставок товаров** (строгая типизация `PRODUCT`/`CONSUMABLE`) +16. **Фильтровать предметы по типу на фронтенде** (фильтрация должна быть в GraphQL резолвере) --- @@ -174,5 +219,5 @@ --- **ПРАВИЛО**: Перед каждым изменением кода проверить этот чеклист! -**ИСТОЧНИК ИСТИНЫ**: rules2.md +**ИСТОЧНИК ИСТИНЫ**: rules-unified.md (v4.0) **СТАТУС**: ОБЯЗАТЕЛЬНЫЙ К ВЫПОЛНЕНИЮ diff --git a/rules-unified.md b/rules-unified.md new file mode 100644 index 0000000..26ff7bb --- /dev/null +++ b/rules-unified.md @@ -0,0 +1,1626 @@ +# ПРАВИЛА СИСТЕМЫ УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - ПОЛНАЯ БАЗА ЗНАНИЙ v3.0 + +> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данный файл является объединенной полной базой знаний системы, созданной на основе rules.md, rules1.md и rules2.md. Все изменения должны согласовываться. + +## 🔤 ТЕРМИНЫ СИСТЕМЫ +> Для людей → `В коде` +- ТОВАР → `PRODUCT` +- РАСХОДНИКИ → `CONSUMABLE` +- БРАК → `DEFECT` *(планируется)* +- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* +- ПОСТАВЩИК → `WHOLESALE` +- СЕЛЛЕР → `SELLER` +- ФУЛФИЛМЕНТ → `FULFILLMENT` +- ЛОГИСТИКА → `LOGIST` + +--- + +## 📑 ОГЛАВЛЕНИЕ + +### 🏗️ **АРХИТЕКТУРА И ОСНОВЫ** + +1. [🎯 Основные принципы системы](#1--основные-принципы-системы) +2. [📦 Типизация предметов](#2--типизация-предметов) +3. [🏢 Структура кабинетов](#3--структура-кабинетов) +4. [🔐 Система ролей и доступов](#4--система-ролей-и-доступов) + +### 🚚 **WORKFLOW И ПРОЦЕССЫ** + +5. [🚚 Workflow поставок](#5--workflow-поставок) +6. [🔄 Процесс создания продукта](#6--процесс-создания-продукта) +7. [📊 Система учета движения товаров](#7--система-учета-движения-товаров) + +### 🏢 **КАБИНЕТЫ СИСТЕМЫ** + +8. [🏠 Общие правила кабинетов](#8--общие-правила-кабинетов) +9. [🏠 Кабинет селлера (детальные правила)](#9--кабинет-селлера-детальные-правила) +10. [🏪 Кабинет поставщика](#10--кабинет-поставщика) +11. [🏭 Кабинет фулфилмента](#11--кабинет-фулфилмента) +12. [🚚 Кабинет логистики](#12--кабинет-логистики) + +### 🤝 **СИСТЕМА ПАРТНЕРСТВА** + +13. [🤝 Система партнерства и контрагентов](#13--система-партнерства-и-контрагентов) + +### 🌐 **ИНТЕГРАЦИИ И ФУНКЦИИ** + +14. [🌐 Интеграции с системой](#14--интеграции-с-системой) +15. [📊 Статистика и аналитика](#15--статистика-и-аналитика) +16. [📱 Правила UI/UX и интерфейса](#16--правила-uiux-и-интерфейса) +17. [⚠️ Критические запреты](#17--критические-запреты) + +### 🛠️ **ТЕХНИЧЕСКИЕ ПРАВИЛА** + +18. [🛠️ GraphQL и TypeScript правила](#18--graphql-и-typescript-правила) +19. [🔧 Архитектурные принципы](#19--архитектурные-принципы) +20. [🎯 Правила качества кода](#20--правила-качества-кода) +21. [🔍 Диагностика и решение проблем](#21--диагностика-и-решение-проблем) + +### 📋 **ПРИЛОЖЕНИЯ** + +22. [📋 Категории товаров и расходников](#22--категории-товаров-и-расходников) +23. [🎖️ Приоритеты разработки](#23--приоритеты-разработки) + +### 🌐 **ИНТЕГРАЦИИ И ФУНКЦИИ** + +14. [🌐 Интеграции с системой](#14--интеграции-с-системой) +15. [📊 Статистика и аналитика](#15--статистика-и-аналитика) +16. [📱 Правила UI/UX и интерфейса](#16--правила-uiux-и-интерфейса) +17. [⚠️ Критические запреты](#17--критические-запреты) + +### 🛠️ **ТЕХНИЧЕСКИЕ ПРАВИЛА** + +18. [🛠️ GraphQL и TypeScript правила](#18--graphql-и-typescript-правила) +19. [🔧 Архитектурные принципы](#19--архитектурные-принципы) +20. [🎯 Правила качества кода](#20--правила-качества-кода) +21. [🔍 Диагностика и решение проблем](#21--диагностика-и-решение-проблем) + +### 📋 **ПРИЛОЖЕНИЯ** + +22. [📋 Категории товаров и расходников](#22--категории-товаров-и-расходников) +23. [🎖️ Приоритеты разработки](#23--приоритеты-разработки) + +--- + +## 🏷️ РЕЕСТР СУЩНОСТЕЙ СИСТЕМЫ + +### 📦 **ОСНОВНЫЕ ПРЕДМЕТЫ** + +| Сущность | Название в системе | Кабинет создания | Описание | Статус | +| ---------- | ---------------------------------- | ---------------- | ----------------------------------------------- | --------------- | +| Товар | `Product` (type: `PRODUCT`) | Поставщик | Базовый тип товара от поставщика | ✅ Реализовано | +| Расходники | `Product` (type: `CONSUMABLE`) | Поставщик | Материалы и вспомогательные товары | ✅ Реализовано | +| Брак | `Product` (type: `DEFECT`)* | Фулфилмент | Производная от товара с дефектами | 📋 Планируется | +| Продукт | `Product` (type: `FINISHED_PRODUCT`)* | Фулфилмент | Готовый к продаже товар (производная от товара) | 📋 Планируется | + +> **\* Планируется**: Типы `DEFECT` и `FINISHED_PRODUCT` еще не добавлены в Prisma схему + +### 🏢 **ОРГАНИЗАЦИИ И РОЛИ** + +| Сущность | Название в системе | Основные функции | Статус | +| ---------- | ---------------------------------- | --------------------------------------- | -------------- | +| Поставщик | `Organization` (type: `WHOLESALE`) | Создание товаров, управление поставками | ✅ Реализовано | +| Селлер | `Organization` (type: `SELLER`) | Заказ товаров, управление поставками | ✅ Реализовано | +| Фулфилмент | `Organization` (type: `FULFILLMENT`) | Обработка товаров, управление складом | ✅ Реализовано | +| Логистика | `Organization` (type: `LOGIST`) | Управление доставками | ✅ Реализовано | + +### 🤝 **СИСТЕМА ПАРТНЕРСТВА** + +| Сущность | Название в системе | Описание | Статус | +| ------------ | ------------------ | ---------------------------------- | -------------- | +| Контрагент | `Counterparty` | Связь между организациями | ✅ Реализовано | +| Заявка | `CounterpartyRequest` | Запрос на сотрудничество | ✅ Реализовано | + +--- + +## 1. 🎯 ОСНОВНЫЕ ПРИНЦИПЫ СИСТЕМЫ + +### 1.1 Архитектура системы + +**СТРУКТУРА СИСТЕМЫ ПО КАБИНЕТАМ:** + +**🏢 КАБИНЕТ ПОСТАВЩИКА** - создает и управляет: +- **ТОВАР** (`PRODUCT`) - базовые товары от поставщика +- **РАСХОДНИКИ** (`CONSUMABLE`) - материалы и вспомогательные товары от поставщика + +**🏭 КАБИНЕТ ФУЛФИЛМЕНТА** - принимает, обрабатывает и управляет всеми типами: +- **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) +- **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) +- **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар +- **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента +- **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров + +**🛍️ КАБИНЕТ СЕЛЛЕРА** - заказывает и управляет поставками: +- Создает заказы товаров и расходников +- Управляет поставками на фулфилмент и маркетплейсы +- Отслеживает статусы поставок + +### 1.2 Основные принципы разработки + +**КРИТИЧЕСКИ ВАЖНЫЕ ПРИНЦИПЫ:** + +1. **Строгая типизация**: Каждый предмет имеет один из типов: ТОВАР (`PRODUCT`), РАСХОДНИКИ (`CONSUMABLE`), БРАК и ПРОДУКТ (планируется) +2. **Партнерская система**: Все связи между организациями через модель `Counterparty` +3. **Workflow статусов**: Строгая последовательность статусов поставок +4. **Безопасность доступа**: Контроль доступа на уровне GraphQL резолверов +5. **Единый источник истины**: Централизованное управление данными + +--- + +## 2. 📦 ТИПИЗАЦИЯ ПРЕДМЕТОВ + +### 2.1 Два реализованных и два планируемых типа предметов + +#### **1. ТОВАР** (`PRODUCT` - базовый тип) + +- **СОЗДАЕТСЯ**: Поставщиком +- **СТАТУС**: Может быть активным/неактивным +- **ЗАКАЗ**: Доступен для заказа всеми типами организаций +- **ТРАНСФОРМАЦИЯ**: Может стать ПРОДУКТОМ или БРАКОМ +- **ЦЕНА**: Обязательна, больше 0 + +#### **2. РАСХОДНИКИ** (`CONSUMABLE` - базовый тип) + +- **СОЗДАЕТСЯ**: Поставщиком как универсальный тип +- **КЛАССИФИКАЦИЯ ПРИ ЗАКАЗЕ**: + - Фулфилмент заказывает → "Расходники фулфилмента" + - Селлер заказывает → "Расходники селлеров" +- **ДОСТУП**: Видны всем типам организаций в маркете + +#### **3. БРАК** (`DEFECT` - планируется, производная от товара) + +- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе существующего ТОВАРА при обнаружении дефектов +- **МОМЕНТ СОЗДАНИЯ**: В процессе "Создание продукта" / "В работе" после подсчета факта +- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) +- **ЗАКАЗ**: ЗАПРЕЩЕН заказ брака +- **СТАТУС**: Всегда неактивен для заказа +- **ЦЕНА**: Для селлера - себестоимость дефектного товара, для фулфилмента - 0 +- **WORKFLOW**: Особый процесс списания и утилизации +- **УЧЕТ**: Отдельный учет в статистике потерь +- **ОТОБРАЖЕНИЕ**: Виден только для учета потерь +- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `DEFECT` еще не добавлен в схему БД + +#### **4. ПРОДУКТ** (`FINISHED_PRODUCT` - планируется, производная от товара) + +- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе ТОВАРА по заказу селлера +- **ИНИЦИАТОР**: Селлер создает заказ с рецептурой, фулфилмент исполняет +- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) +- **РЕЦЕПТУРА**: Задается селлером при создании заказа (Товар + Услуга + Расходники) +- **СТАТУСЫ**: "в работе" → "готов к отправке" +- **ЗАКАЗ**: Доступен только в статусе "готов к отправке" +- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `FINISHED_PRODUCT` еще не добавлен в схему БД + +### 2.2 Обязательные поля карточки + +**КРИТИЧЕСКИ ВАЖНО**: Название, артикул, цена > 0, тип предмета +**ИСКЛЮЧЕНИЕ ДЛЯ БРАКА**: Цена может быть 0 для фулфилмента (себестоимость для селлера) +**ОБЯЗАТЕЛЬНО**: Количество (может быть 0 для предзаказа) +**ДЛЯ ПРОИЗВОДНЫХ ТИПОВ**: Обязательная связь с родительским предметом + +--- + +## 3. 🏢 СТРУКТУРА КАБИНЕТОВ + +### 3.1 Общие принципы кабинетов + +**КАЖДЫЙ КАБИНЕТ ИМЕЕТ:** + +1. **Главная страница** (`/dashboard`) - общая информация и статистика +2. **Экономика** (`/economics`) - финансовая аналитика +3. **Универсальные разделы**: + - Маркет (`/market`) - просмотр и заказ товаров + - Партнеры (`/partners`) - управление контрагентами + - Мессенджер (`/messenger`) - связь между организациями + - Настройки (`/settings`) - профиль и API ключи + +### 3.2 Специфические разделы по типам организаций + +**🏪 ПОСТАВЩИК (`WHOLESALE`):** +- Склад (`/warehouse`) - управление товарами и расходниками +- Поставки (`/supplies`) - обработка заказов от селлеров + +**🛍️ СЕЛЛЕР (`SELLER`):** +- Мои поставки (`/supplies`) - управление заказами товаров +- WB Интеграция (`/wb-integration`) - связь с Wildberries + +**🏭 ФУЛФИЛМЕНТ (`FULFILLMENT`):** +- Склад фулфилмента (`/fulfillment-warehouse`) - управление всеми типами товаров +- Поставки фулфилмента (`/fulfillment-supplies`) - обработка поставок +- Услуги (`/services`) - управление услугами, логистикой, расходниками +- Сотрудники (`/employees`) - управление персоналом +- Статистика фулфилмента (`/fulfillment-statistics`) - детальная аналитика + +**🚚 ЛОГИСТИКА (`LOGIST`):** +- Заявки (`/logistics-requests`) - управление заявками на доставку +- Маршруты (`/routes`) - планирование маршрутов + +--- + +## 4. 🔐 СИСТЕМА РОЛЕЙ И ДОСТУПОВ + +### 4.1 Контроль доступа к разделам + +**ПРОВЕРКА НА УРОВНЕ КОМПОНЕНТОВ:** + +```typescript +{user?.organization?.type === "FULFILLMENT" && ( + // Компоненты доступны только фулфилменту +)} +``` + +**СПЕЦИАЛЬНАЯ ЛОГИКА РОУТИНГА:** + +```typescript +const handleSuppliesClick = () => { + switch (user?.organization?.type) { + case "FULFILLMENT": + router.push("/fulfillment-supplies"); + break; + case "SELLER": + router.push("/supplies"); + break; + // ... другие типы + } +}; +``` + +### 4.2 GraphQL проверки доступа + +**В Apollo Client запросах:** + +```typescript +const { data } = useQuery(GET_MY_SERVICES, { + skip: user?.organization?.type !== "FULFILLMENT", +}); +``` + +**В GraphQL резолверах:** + +```typescript +if (currentUser.organization.type !== "FULFILLMENT") { + throw new GraphQLError("Доступно только для фулфилмент центров"); +} +``` + +### 4.3 Контроль доступа к заказам + +- **Создатель заказа** - полный доступ к своим заказам +- **Поставщик** - доступ к заказам, где он является поставщиком +- **Фулфилмент-центр** - доступ к заказам, направленным в его центр +- **Логистическая компания** - доступ к заказам для доставки + +--- + +## 5. 🚚 WORKFLOW ПОСТАВОК + +### 5.1 Детализированная система статусов + +**Статусы SupplyOrder (Заказ поставки):** + +1. **PENDING** - Ожидает подтверждения поставщиком +2. **SUPPLIER_APPROVED** - Одобрено поставщиком +3. **CONFIRMED** - Подтвержден (готов к обработке) +4. **LOGISTICS_CONFIRMED** - Подтверждено логистикой +5. **SHIPPED** - Отгружено поставщиком +6. **IN_TRANSIT** - В пути (логистика доставляет) +7. **DELIVERED** - Доставлен на фулфилмент +8. **CANCELLED** - Отменен + +### 5.2 Пошаговый процесс поставки + +**ЭТАП 1: Создание заказа** +1. Селлер заказывает товар/расходники у поставщика +2. Система создает SupplyOrder со статусом `PENDING` +3. Автоматическое уведомление поставщику + +**ЭТАП 2: Обработка поставщиком** +4. Поставщик получает оповещение +5. Поставщик нажимает "Одобрить" +6. Статус меняется на `SUPPLIER_APPROVED` + +**ЭТАП 3: Передача в фулфилмент** +7. Поставка отображается в кабинете фулфилмента +8. Фулфилмент выбирает ответственного и логистику +9. Статус меняется на `CONFIRMED` + +**ЭТАП 4: Логистическое подтверждение** +10. Логистика подтверждает доставку +11. Статус меняется на `LOGISTICS_CONFIRMED` + +**ЭТАП 5: Отгрузка** +12. Поставщик отгружает товар +13. Статус меняется на `SHIPPED`, затем `IN_TRANSIT` + +**ЭТАП 6: Доставка и приемка** +14. Логистика доставляет на фулфилмент +15. Фулфилмент принимает товар +16. Статус меняется на `DELIVERED` + +### 5.3 Система уведомлений + +**Обязательные уведомления:** +- Поставщику: о новом заказе +- Фулфилменту: о подтвержденной поставке +- Логистике: о назначении на заявку +- Селлеру: об изменении каждого статуса + +--- + +## 6. 🔄 ПРОЦЕСС СОЗДАНИЯ ПРОДУКТА + +### 6.1 Workflow создания продукта + +**ЭТАПЫ ПРОЦЕССА:** + +1. **ПОСТУПЛЕНИЕ**: Товар приходит на склад фулфилмента (статус "на складе") +2. **СОРТИРОВКА**: Перебор товара, отсеивание брака +3. **ПОДГОТОВКА К РАБОТЕ**: Менеджер задает параметры работы +4. **ОБРАБОТКА**: Превращение товара в продукт по "рецептуре" селлера +5. **ЗАВЕРШЕНИЕ**: Готовый продукт (статус "готов к отправке") + +### 6.2 Управление процессом + +**РАЗДЕЛ "СОЗДАНИЕ ПРОДУКТА":** + +- **НОВЫЕ**: Поставки после нажатия "принято", ожидающие назначения +- **В РАБОТЕ**: Поставки в процессе обработки +- **ВЫПОЛНЕНО**: Завершенные поставки с готовыми продуктами + +**ДЕЙСТВИЯ МЕНЕДЖЕРА В "НОВЫЕ":** + +- **ДЕДЛАЙН**: Указание срока выполнения работы +- **ОТВЕТСТВЕННЫЙ**: Назначение исполнителя +- **МЕСТО ХРАНЕНИЯ**: Указание локации для готовых продуктов (опционально) +- **ЗАПУСК**: Нажатие кнопки "В работе" + +### 6.3 Рецептура продукта + +**СЕЛЛЕР УКАЗЫВАЕТ В ПОСТАВКЕ:** + +- **БАЗОВЫЙ ТОВАР**: Исходный материал (например, футболка) +- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг (например, "погладить") +- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (например, фирменный пакет) +- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (например, короб + маркировка) + +**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники + +### 6.4 Учет план/факт в процессе работы + +**ПЛАН**: Количество товара из поставки селлера +**ФАКТ**: Реальное количество после сортировки + +**ФИКСАЦИЯ БРАКА:** +- **КОГДА**: В процессе работы (вкладка "В работе") +- **КТО**: Ответственный исполнитель +- **ДЕТАЛИЗАЦИЯ**: По каждому предмету (размер/объем) +- **ОБНОВЛЕНИЕ**: Можно вносить изменения до нажатия "Выполнено" + +**ВЛИЯНИЕ НА СТАТИСТИКУ:** +- При принятии поставки: +План в статистику +- При выявлении факта: корректировка на реальные данные +- **ФОРМУЛА**: Факт = Брак + Хороший товар +- **ЛОГИКА**: Фактическое количество = сумма всех пересчитанных предметов + +--- + +## 7. 📊 СИСТЕМА УЧЕТА ДВИЖЕНИЯ ТОВАРОВ + +### 7.1 Принципы учета в фулфилменте + +**ОСНОВНЫЕ ПРИНЦИПЫ:** + +- **ПРИХОД**: Товары поступают через принятые поставки (из состояния "в пути" → "на складе") +- **ОБРАБОТКА**: Товары переходят в статус "в работе" для создания продуктов +- **РАСХОД**: Товары убывают при отгрузке, списании, возврате, превращении в продукты +- **УЧЁТ**: Ведется учет прихода и расхода для каждого типа предметов +- **ВИЗУАЛИЗАЦИЯ**: Движение отображается в дополнительных значениях + +### 7.2 Дополнительные и основные значения + +**ДОПОЛНИТЕЛЬНЫЕ ЗНАЧЕНИЯ (показатели движения):** + +- **ПРИБЫЛО**: Количество предметов, поступивших на склад +- **УБЫЛО**: Количество предметов, списанных со склада +- **ВЛИЯНИЕ**: От этих значений зависят основные значения (общее количество) + +**ОСНОВНЫЕ ЗНАЧЕНИЯ (текущие остатки):** + +- **ОПРЕДЕЛЕНИЕ**: Итоговое количество предметов на складе +- **РАСЧЁТ**: Основные значения = Предыдущие остатки + Прибыло - Убыло +- **ОТОБРАЖЕНИЕ**: Показываются в каждом модуле статистики +- **РАЗДЕЛЕНИЕ ТОВАРОВ**: + - Товары "на складе" - готовы к обработке + - Товары "в обработке" - находятся в процессе создания продукта + +--- + +## 8. 🏠 ОБЩИЕ ПРАВИЛА КАБИНЕТОВ + +### 8.1 Универсальная структура кабинетов + +**ВСЕ ТИПЫ КАБИНЕТОВ** включают следующие обязательные разделы: + +#### 8.1.1 Страница "Главная" + +**СТАТУС**: Реализовано +**ДОСТУП**: Через навигацию в sidebar для всех типов кабинетов +**СОДЕРЖАНИЕ**: Универсальная страница с типо-зависимыми компонентами + +**ПРАВИЛА**: + +- **ОБЯЗАТЕЛЬНО**: Каждый тип кабинета должен иметь страницу "Главная" +- **НАВИГАЦИЯ**: Доступ через кнопку в sidebar (первая в списке) +- **УНИВЕРСАЛЬНОСТЬ**: Одинаковая структура навигации для всех кабинетов +- **РОУТ**: `/home` с универсальным компонентом HomePageWrapper +- **КОМПОНЕНТЫ**: 4 типо-зависимых компонента: SellerHomePage, FulfillmentHomePage, WholesaleHomePage, LogistHomePage + +#### 8.1.2 Раздел "Экономика" + +**СТАТУС**: Реализовано в системе +**РАСПОЛОЖЕНИЕ**: Перед настройками в каждом кабинете +**СОДЕРЖАНИЕ**: Пустые разделы-заглушки с пометкой "будет добавлен позже" + +**ПРАВИЛА**: + +- **ОБЯЗАТЕЛЬНО**: Каждый кабинет имеет раздел "Экономика" +- **РОУТ**: `/economics` с универсальным компонентом EconomicsPageWrapper +- **КОМПОНЕНТЫ**: 4 типо-зависимых компонента экономики: SellerEconomicsPage, FulfillmentEconomicsPage, WholesaleEconomicsPage, LogistEconomicsPage +- **КНОПКА**: "Экономика" в sidebar навигации перед настройками +- **БЕЗОПАСНОСТЬ**: Проверки доступа и безопасности в экономических компонентах + +#### 8.1.3 Общие разделы для всех кабинетов + +**УНИВЕРСАЛЬНЫЕ РАЗДЕЛЫ** (доступны всем типам): + +- 🏠 **Главная** - основная страница кабинета (реализовано) +- 🛒 **Маркет** - просмотр и заказ товаров +- 🤝 **Партнеры** - управление контрагентами +- 💬 **Мессенджер** - внутренняя связь +- 💰 **Экономика** - финансовая аналитика (реализовано) +- ⚙️ **Настройки** - профиль и конфигурация + +**СПЕЦИАЛИЗИРОВАННЫЕ РАЗДЕЛЫ** (зависят от типа кабинета): +- Определяются в соответствующих разделах каждого кабинета + +### 8.2 Правила sidebar навигации + +#### 8.2.1 Структура навигации + +**ОБЩИЙ ПРИНЦИП**: + +- Условное отображение: `{user?.organization?.type === "TYPE" && (...)}` +- Адаптивность: сворачиваемый sidebar с `getSidebarMargin()` +- Состояния активности: подсветка текущего раздела + +**ПОРЯДОК РАЗДЕЛОВ В SIDEBAR**: + +1. 🏠 **Главная** (реализовано для всех) +2. **Специализированные разделы** (зависят от типа кабинета) +3. 🛒 **Маркет** (универсальный) +4. 🤝 **Партнеры** (универсальный) +5. 💬 **Мессенджер** (универсальный) +6. 💰 **Экономика** (универсальный, реализовано) +7. ⚙️ **Настройки** (универсальный) +8. **Выход** (универсальный) + +#### 8.2.2 Типо-зависимая логика + +**АДАПТИВНЫЙ РОУТИНГ**: + +```typescript +// Пример: кнопка "Поставки" ведет на разные страницы +const handleSuppliesClick = () => { + switch (user?.organization?.type) { + case "FULFILLMENT": + router.push("/fulfillment-supplies"); + break; + case "SELLER": + router.push("/supplies"); + break; + case "WHOLESALE": + router.push("/supplies"); + break; + case "LOGIST": + router.push("/logistics-orders"); + break; + } +}; +``` + +--- + +## 9. 🏠 КАБИНЕТ СЕЛЛЕРА (ДЕТАЛЬНЫЕ ПРАВИЛА) + +### 9.1 Структура раздела "Мои поставки" + +#### **🏢 ПОСТАВКИ НА ФУЛФИЛМЕНТ**: + +- **Товар** - поставка товаров для создания продуктов + - **Карточки** - поставка через WB API с рецептурой (результат: WildberriesSupply) + - **Поставщики** - заказ товаров у поставщиков с рецептурой (результат: SupplyOrder) +- **Расходники селлера** - поставка материалов для товаров селлера + +#### **🛒 ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ** _(планируется)_: + +- **Wildberries** - прямые поставки на WB +- **Ozon** - прямые поставки на Ozon + +### 9.2 Правила кнопки "Создать поставку" в разделе "Мои поставки" + +#### **9.2.1 Общие принципы** + +- **КОНТЕКСТНОСТЬ**: Кнопка создания появляется только в активном табе +- **РАСПОЛОЖЕНИЕ**: Правая часть строки таба, на том же уровне что и название +- **СТИЛИСТИКА**: В том же стиле что и сами табы (соответствует уровню иерархии) +- **ФУНКЦИОНАЛЬНОСТЬ**: Кнопка ведет на страницу создания поставки соответствующего типа + +#### **9.2.2 Размещение кнопок по табам** + +**УРОВЕНЬ 2 (Подтабы фулфилмента):** + +- **📦 Товар → Карточки**: Кнопка "Создать поставку" → `/supplies/create-cards` +- **📦 Товар → Поставщики**: Кнопка "Создать поставку" → `/supplies/create-suppliers` +- **🔧 Расходники селлера**: Кнопка "Создать поставку" → `/supplies/create-consumables` + +**УРОВЕНЬ 2 (Подтабы маркетплейсов):** + +- **🟣 Wildberries**: Кнопка "Создать поставку" → `/supplies/create-wildberries` +- **🔵 Ozon**: Кнопка "Создать поставку" → `/supplies/create-ozon` + +#### **9.2.3 Стили кнопок** + +**ДЛЯ УРОВНЯ 2 (h-9):** + +```css +/* Размер и отступы */ +h-9 px-3 py-1 ml-auto + +/* Фон и границы */ +bg-white/8 border border-white/20 hover:bg-white/12 + +/* Текст и иконки */ +text-xs font-medium text-white/80 hover:text-white + +/* Скругления */ +rounded-lg + +/* Переходы */ +transition-all duration-150 +``` + +**ДЛЯ УРОВНЯ 3 (h-8):** + +```css +/* Размер и отступы */ +h-8 px-2 py-1 ml-auto + +/* Фон и границы */ +bg-white/5 border border-white/15 hover:bg-white/8 + +/* Текст и иконки */ +text-xs font-normal text-white/60 hover:text-white/80 + +/* Скругления */ +rounded-md + +/* Переходы */ +transition-all duration-150 +``` + +#### **9.2.4 Поведение кнопок** + +- **ВИДИМОСТЬ**: Кнопка показывается только в активном табе +- **ИКОНКА**: `Plus` размером `h-3 w-3` слева от текста +- **ТЕКСТ**: "Создать" на мобильных, "Создать поставку" на десктопах +- **АДАПТИВНОСТЬ**: Скрытие текста на маленьких экранах (`hidden sm:inline`) + +#### **9.2.5 Удаление старой кнопки** + +- **УБРАТЬ**: Текущий dropdown "Создать поставку" из верхней части +- **ПРИЧИНА**: Заменяется контекстными кнопками в табах +- **СОХРАНИТЬ**: Стили и логику навигации, но адаптировать под новые роуты + +### 9.3 Структура страницы "Мои поставки" - Трёхблочная архитектура + +#### **9.3.1 Обязательная структура страницы** + +**ПРИНЦИП**: Страница состоит из трёх визуально разделённых блоков + +``` +┌─────────────────────────────────────────┐ +│ 1. БЛОК ТАБОВ (навигация) │ +│ - Фиксированная высота │ +│ - Glass-эффект │ +│ - Иерархическая структура │ +├─────────────────────────────────────────┤ +│ 2. БЛОК СТАТИСТИКИ (метрики) │ +│ - Контекстные данные │ +│ - 4 карточки в ряд (desktop) │ +│ - Динамическое обновление │ +├─────────────────────────────────────────┤ +│ 3. ОСНОВНОЙ БЛОК (контент) │ +│ - Сохраняет весь функционал │ +│ - Таблицы, фильтры, действия │ +│ - Высота до низа sidebar │ +└─────────────────────────────────────────┘ +``` + +#### **9.3.2 Блок статистики - контекстные метрики** + +**ПРАВИЛО**: Статистика меняется в зависимости от выбранных табов + +**Для путей "Фулфилмент → Товар → Карточки/Поставщики":** +- Всего поставок +- Активных поставок +- Сумма активных поставок +- В пути + +**Для пути "Фулфилмент → Расходники селлера":** +- Всего поставок +- Активных поставок +- Видов расходников +- Критические остатки + +**Для путей "Маркетплейсы → Wildberries/Ozon":** +- Поставок на маркетплейс +- Товаров отправлено +- Возвраты за неделю +- Эффективность поставок + +#### **9.3.3 Высота основного блока** + +**ФОРМУЛА РАСЧЕТА**: +```css +height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) +``` + +**ПРАВИЛО ВЫРАВНИВАНИЯ**: +- Нижняя граница основного блока должна быть на одном уровне с нижней границей sidebar +- При изменении размера окна высота пересчитывается +- Внутренний скролл: `overflow-y-auto` + +#### **9.3.4 Сохранение функционала** + +**КРИТИЧЕСКИ ВАЖНО**: При добавлении блока статистики весь существующий функционал сохраняется: +- Таблицы с данными поставок +- Фильтры и сортировка +- Кнопки действий +- Детализация при клике +- Пагинация +- Поиск + +**ЗАПРЕЩЕНО**: +- Удалять существующие компоненты +- Изменять логику работы таблиц +- Нарушать существующие API вызовы + +### 9.4 Табы "Карточки" и "Поставщики" - объединённая логика + +#### **9.4.1 Принцип единого типа предмета** + +**КЛЮЧЕВОЕ ПРАВИЛО**: Табы "Карточки" и "Поставщики" - это два способа создания поставок одного типа предмета (ТОВАР) + +**СПОСОБЫ СОЗДАНИЯ**: +- **Карточки** - импорт товаров через WB API с автоматическим созданием поставки +- **Поставщики** - прямой заказ товаров у поставщика с указанием рецептуры + +**РЕЗУЛЬТАТ**: Оба способа создают `SupplyOrder` с товарами типа `PRODUCT` + +#### **9.4.2 Общая статистика** + +**ПРАВИЛО**: Блок статистики показывает ОДИНАКОВЫЕ данные для обоих табов + +**МЕТРИКИ ДЛЯ ТАБОВ "КАРТОЧКИ" И "ПОСТАВЩИКИ"**: +- Всего поставок товаров (из всех источников) +- Активных поставок товаров (в работе) +- Сумма активных поставок товаров +- Товаров в пути (все способы доставки) + +**ЗАПРЕЩЕНО**: Разделять статистику по способу создания + +#### **9.4.3 Общий основной блок** + +**СОДЕРЖИМОЕ**: Единая таблица всех поставок товаров + +**ИСТОЧНИКИ ДАННЫХ**: +- Поставки, созданные через импорт карточек WB +- Поставки, созданные через заказ у поставщиков +- Все промежуточные и завершённые поставки + +**РАЗЛИЧИЯ ТАБОВ**: +- Только кнопки создания ведут на разные страницы +- Таб "Карточки": `/supplies/create-cards` +- Таб "Поставщики": `/supplies/create-suppliers` + +### 9.5 Создание поставки расходников селлера + +#### **Структура страницы**: + +**БЛОК 1: ПОСТАВЩИКИ** _(обязательный, верхняя часть)_: + +- Карточки поставщиков из раздела "Партнеры" +- Горизонтальный скролл при превышении ширины +- Выбор только одного поставщика одновременно + +**БЛОК 2: РАСХОДНИКИ** _(зависимый, центральная часть)_: + +- Активен только после выбора поставщика +- Сортировка: цена, название, категория +- Фильтры: категория, ценовой диапазон +- Карточка с полем ввода количества и кнопками +/- + +**БЛОК 3: КОРЗИНА** _(правая часть)_: + +- **РАСПОЛОЖЕНИЕ**: Правая часть экрана +- **СОДЕРЖАНИЕ**: + - Счетчик видов расходников + - Детализация по каждому расходнику (название, количество, цена, сумма) + - Общая сумма всех расходников +- **УПРАВЛЕНИЕ**: + - Изменение количества (с валидацией остатков) + - Удаление позиций +- **ОБЯЗАТЕЛЬНЫЕ ПОЛЯ**: + - Выбор фулфилмент-центра (из партнеров) + - Дата поставки (не прошедшая, по умолчанию - текущая) + +### 9.6 Многоуровневая таблица поставок + +#### **ПЕРВЫЙ УРОВЕНЬ** _(основной список)_: + +- **СОРТИРОВКА**: Номер поставки от большего к меньшему +- **ОБЯЗАТЕЛЬНЫЕ КОЛОНКИ**: + - Порядковый номер поставки + - Количество видов расходников + - Стоимость всей поставки + - Количество категорий + - Статус поставки + +#### **ВТОРОЙ УРОВЕНЬ** _(детализация по клику)_: + +- **АКТИВАЦИЯ**: По клику на строку первого уровня +- **СОДЕРЖАНИЕ**: + - Название расходника + - Количество + - Цена + - Категория + - Поставщик +- **ОГРАНИЧЕНИЯ**: Только просмотр, редактирование запрещено + +--- + +## 10. 🏪 КАБИНЕТ ПОСТАВЩИКА + +### 10.1 Основные возможности + +**СОЗДАНИЕ КАРТОЧЕК**: + +- **ТОВАР** - базовые товары поставщика +- **РАСХОДНИКИ** - материалы и вспомогательные товары + +### 10.2 Обязательные поля карточки + +**Базовые параметры**: + +- Фото (система загрузки и управления изображениями) +- Название +- Автоматическая генерация артикула СФ +- Описание +- Количество предметов в единицах +- Количество комплектов (если применимо) +- Категория (28 предустановленных + специализированные для расходников) +- Бренд, Цвет, Размер/объем, Вес, Габариты, Материал +- Цена за единицу и за комплект +- Заказано, В пути, Остаток, Продано + +### 10.3 Отображение информации в карточках + +**Каждая карточка содержит**: + +- Основное изображение +- Название и артикул СФ +- Цена за единицу/комплект +- Категория и статус активности +- Данные о движении: остаток, заказано, в пути, продано +- Индикаторы низких остатков + +### 10.4 Статистика поставщика + +**Блок статистики включает**: + +- **ТОВАРЫ**: Общая статистика товаров поставщика +- **РАСХОДНИКИ**: Материалы и вспомогательные товары + - Классифицируются при заказе в зависимости от заказчика + - Общая статистика по всем расходникам + +--- + +## 11. 🏭 КАБИНЕТ ФУЛФИЛМЕНТА + +### 11.1 Структура раздела склад фулфилмента + +#### **Модули в обязательной последовательности**: + +1. **📦 ПРОДУКТ** - готовые к продаже товары +2. **🛒 ТОВАР** - базовые товары от поставщиков + - Товары "на складе" - готовы к обработке + - Товары "в обработке" - в процессе создания продукта +3. **❌ БРАК** - товары с дефектами +4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары +5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров +6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы + - **КЛИКАБЕЛЬНЫЙ МОДУЛЬ** - содержит полноценный раздел учёта + +### 11.2 Движение товаров в фулфилменте + +#### **Поступление товаров**: + +- **ПОСТАВКИ**: От поставщиков через систему заказов +- **ВОЗВРАТЫ**: Товары, возвращенные с ПВЗ +- **ПЕРЕМЕЩЕНИЯ**: Между складами и магазинами + +#### **Расход товаров**: + +- **ОТГРУЗКА**: Товары отправлены селлерам +- **СПИСАНИЕ**: Брак, утрата, утилизация +- **ВОЗВРАТ**: Возврат поставщику +- **ИСПОЛЬЗОВАНИЕ**: Расходники для операций + +### 11.3 Модуль "Расходники фулфилмента" + +**ОСОБЕННОСТИ**: + +- **ИНТЕРАКТИВНОСТЬ**: Кликабельный элемент в статистике +- **ФУНКЦИОНАЛЬНОСТЬ**: Полноценный раздел учёта +- **СОДЕРЖАНИЕ**: Управление расходниками фулфилмента + +### 11.4 Блок детализации по магазинам + +**НАЗНАЧЕНИЕ**: Распределение товаров по торговым точкам/магазинам + +**ФУНКЦИИ**: + +- **ОСТАТКИ ПО МАГАЗИНАМ**: Отображение количества товаров в каждом магазине +- **УПРАВЛЕНИЕ РАСПРЕДЕЛЕНИЕМ**: Перемещение товаров между точками +- **КОНТРОЛЬ ДВИЖЕНИЯ**: Отслеживание перемещений между складами и магазинами +- **АНАЛИТИКА**: Сравнение эффективности разных точек +- **ПЛАНИРОВАНИЕ**: Оптимизация распределения товаров + +--- + +## 12. 🚚 КАБИНЕТ ЛОГИСТИКИ + +### 12.1 Основные функции логистики + +**РОЛЬ В СИСТЕМЕ**: Управление доставками и транспортировкой + +**ОСНОВНЫЕ ФУНКЦИИ**: + +- **ПОДТВЕРЖДЕНИЕ ДОСТАВКИ**: Подтверждение возможности доставки поставок +- **ТРАНСПОРТИРОВКА**: Организация и выполнение доставки товаров +- **КОНТРОЛЬ МАРШРУТОВ**: Управление логистическими маршрутами +- **ОТСЛЕЖИВАНИЕ**: Мониторинг грузов в пути + +### 12.2 Workflow для логистики + +#### **ЭТАП 1: Получение заявки** + +1. Логистика получает уведомление о новой поставке +2. Заявка появляется в разделе "Заявки" кабинета логистики +3. Логист изучает детали поставки (объем, вес, маршрут) + +#### **ЭТАП 2: Подтверждение доставки** + +4. Логист нажимает кнопку "Одобрить" +5. Статус поставки меняется на `LOGISTICS_CONFIRMED` +6. Уведомления отправляются всем участникам + +#### **ЭТАП 3: Забор товара** + +7. Логист приезжает к поставщику за товаром +8. Поставщик отгружает товар логисту +9. Поставщик отмечает "Отправлено" +10. Статус меняется на `SHIPPED`, затем `IN_TRANSIT` + +#### **ЭТАП 4: Доставка** + +11. Логистика доставляет товар на фулфилмент-центр +12. В кабинете логистики нажимают "Доставлено" +13. Фулфилмент принимает товар и отмечает "Принято" + +### 12.3 Система тарификации + +**ПАРАМЕТРЫ ТАРИФИКАЦИИ**: + +- **Тариф до 1м³** - базовая стоимость для малых грузов +- **Тариф свыше 1м³** - стоимость для крупных грузов +- **Маршруты доставки** - от точки отправления до точки назначения +- **Описание услуг** - дополнительные условия доставки + +**РАСЧЕТ СТОИМОСТИ**: + +- Автоматический расчет стоимости доставки по объему груза +- Отображение примерной стоимости при создании заказа +- Учет специфики маршрута и условий доставки + +### 12.4 Управление заявками + +**РАЗДЕЛЫ КАБИНЕТА ЛОГИСТИКИ**: + +- **НОВЫЕ ЗАЯВКИ** - поступившие заявки на доставку +- **В РАБОТЕ** - принятые к исполнению заявки +- **ВЫПОЛНЕННЫЕ** - завершенные доставки +- **ОТКЛОНЕННЫЕ** - заявки, которые не могут быть выполнены + +**ИНФОРМАЦИЯ О ЗАЯВКЕ**: + +- Детали груза (объем, вес, габариты) +- Маршрут доставки (откуда - куда) +- Срочность доставки +- Особые требования к транспортировке +- Контактная информация участников + +### 12.5 Правила логистики + +**ОБЯЗАТЕЛЬНО**: + +- Своевременное подтверждение заявок +- Соблюдение сроков доставки +- Бережная транспортировка товаров +- Уведомление о статусе доставки + +**ЗАПРЕЩЕНО**: + +- Принятие заявок без подтверждения возможности выполнения +- Нарушение сроков доставки без уведомления +- Повреждение товаров при транспортировке + +--- + +## 13. 🤝 СИСТЕМА ПАРТНЕРСТВА И КОНТРАГЕНТОВ + +### 13.1 Основы системы партнерства + +**ПРИНЦИП РАБОТЫ**: +- Все типы кабинетов могут создавать партнерские отношения +- Партнерство реализовано через таблицы `Counterparty` и `CounterpartyRequest` +- Двустороннее партнерство: каждая организация видит другую в разделе "Партнеры" + +**ТИПЫ ОРГАНИЗАЦИЙ-ПАРТНЕРОВ**: +- `WHOLESALE` - Поставщики товаров и расходников +- `FULFILLMENT` - Фулфилмент-центры +- `LOGIST` - Логистические компании +- `SELLER` - Селлеры (торговые организации) + +### 13.2 Способы создания партнерства + +#### **СПОСОБ 1: Через заказ в маркете (автоматическое партнерство)** + +**WORKFLOW**: +1. Поставщик создает товар → товар попадает в глобальный маркет +2. Селлер/Фулфилмент находит товар в маркете +3. Создает заказ (`SupplyOrder`) → статус `PENDING` +4. Поставщик получает уведомление в разделе "Заявки" +5. Поставщик одобряет заявку → статус `SUPPLIER_APPROVED` +6. **Автоматически создается двустороннее партнерство**: + - Запись в `Counterparty` для заказчика (`organizationId` → `counterpartyId`) + - Обратная запись в `Counterparty` для поставщика +7. Обе организации видят друг друга в разделе "Партнеры" + +#### **СПОСОБ 2: Через раздел "Партнеры" (заявочная система)** + +**WORKFLOW**: +1. Любая организация идет в раздел "Партнеры" +2. Использует поиск для нахождения нужной организации +3. Отправляет заявку на партнерство → создается `CounterpartyRequest`: + - `senderId` - отправитель заявки + - `receiverId` - получатель заявки + - `status: PENDING` + - `message` - опциональное сообщение +4. Получатель видит заявку в разделе "Партнеры" → "Входящие заявки" +5. Получатель принимает заявку → статус меняется на `ACCEPTED` +6. **Автоматически создается двустороннее партнерство** (аналогично способу 1) + +**СТАТУСЫ ЗАЯВОК**: +- `PENDING` - Ожидает рассмотрения +- `ACCEPTED` - Принята (партнерство создано) +- `REJECTED` - Отклонена +- `CANCELLED` - Отменена отправителем + +### 13.3 Использование партнерства в системе + +#### **В форме создания поставки товаров через поставщиков** + +**ПРАВИЛО ОТОБРАЖЕНИЯ ПОСТАВЩИКОВ**: +- Показываются только партнеры с типом `WHOLESALE` +- Источник: таблица `Counterparty` where `counterparty.type === "WHOLESALE"` +- Фильтрация по `organizationId` текущего пользователя + +**ЛОГИКА РАБОТЫ**: +1. Пользователь выбирает поставщика из dropdown партнеров-поставщиков +2. Загружается каталог товаров поставщика из `Product` таблицы +3. Товары фильтруются по `organizationId = поставщик.id` +4. Пользователь может добавлять товары в корзину и создавать заказ + +#### **В других разделах системы** + +**ВЫБОР ФУЛФИЛМЕНТ-ЦЕНТРА**: +- Партнеры с типом `FULFILLMENT` +- Используется при создании поставок расходников + +**ВЫБОР ЛОГИСТИКИ**: +- Партнеры с типом `LOGIST` +- Используется при планировании доставок + +**МЕССЕНДЖЕР**: +- Общение доступно только между партнерами +- Список чатов формируется из таблицы `Counterparty` + +### 13.4 Технические правила + +**СОЗДАНИЕ ЗАПИСЕЙ В COUNTERPARTY**: +```sql +-- При создании партнерства создаются ДВЕ записи +INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org1_id, org2_id); +INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org2_id, org1_id); +``` + +**ПРОВЕРКА ПАРТНЕРСТВА**: +```typescript +const isPartner = await prisma.counterparty.findFirst({ + where: { + organizationId: currentOrgId, + counterpartyId: targetOrgId + } +}); +``` + +**ПОЛУЧЕНИЕ ПАРТНЕРОВ ПО ТИПУ**: +```typescript +const wholesalePartners = await prisma.counterparty.findMany({ + where: { + organizationId: currentOrgId, + counterparty: { + type: "WHOLESALE" + } + }, + include: { + counterparty: true + } +}); +``` + +### 13.5 Решение распространенных проблем + +#### **ПРОБЛЕМА: GraphQL запрос не возвращает данные партнеров** + +**Симптомы**: +- В консоли браузера: `All counterparties: 0`, `All counterparties data: []` +- GraphQL запрос отправляется успешно, но возвращает пустой массив +- В базе данных партнеры существуют + +**Возможные причины и решения**: + +1. **НЕПРАВИЛЬНОЕ ИМЯ ПОЛЯ В КОДЕ** (наиболее частая ошибка): + ```typescript + // ❌ НЕПРАВИЛЬНО + const allCounterparties = counterpartiesData?.getMyCounterparties || []; + + // ✅ ПРАВИЛЬНО + const allCounterparties = counterpartiesData?.myCounterparties || []; + ``` + **Объяснение**: В GraphQL схеме поле называется `myCounterparties`, а не `getMyCounterparties` + +2. **НЕСООТВЕТСТВИЕ ID ПОЛЬЗОВАТЕЛЯ**: + - Проверить что пользователь авторизован под правильным аккаунтом + - Убедиться что `context.user.id` соответствует ожидаемому пользователю + +3. **ПРОБЛЕМЫ С КЕШИРОВАНИЕМ APOLLO CLIENT**: + ```typescript + const { data, loading, error } = useQuery(GET_MY_COUNTERPARTIES, { + fetchPolicy: 'network-only', // Обходим кеш + errorPolicy: 'all' + }); + ``` + +4. **ОТСУТСТВИЕ ЛОГИРОВАНИЯ В РЕЗОЛВЕРЕ**: + - Добавить console.log в GraphQL резолвер для отладки + - Проверить что резолвер вызывается + +**Чек-лист для диагностики**: +- [ ] Проверить правильность имени поля в коде (`myCounterparties`) +- [ ] Убедиться что пользователь авторизован +- [ ] Проверить логи сервера на вызов резолвера +- [ ] Добавить отладочное логирование в браузере +- [ ] Проверить данные в базе через Prisma Studio +- [ ] Использовать `fetchPolicy: 'network-only'` для обхода кеша + +--- + +## 14. 🌐 ИНТЕГРАЦИИ С СИСТЕМОЙ + +### 14.1 Глобальная интеграция + +- **МАРКЕТ**: Товары поставщиков отображаются в глобальном маркете +- **СИНХРОНИЗАЦИЯ**: Данные склада синхронизируются с модулем аналитики +- **УВЕДОМЛЕНИЯ**: Единая система через встроенный мессенджер + +### 14.2 Интеграция с маркетплейсами + +- **WILDBERRIES**: Обязательная проверка активности API ключа +- **СИНХРОНИЗАЦИЯ**: Регулярное обновление данных из внешних источников +- **ЛОКАЛЬНЫЕ КОПИИ**: Сохранение данных для офлайн работы + +### 14.3 Интеграция с модулем "Услуги" + +**РАСХОДНИКИ ФУЛФИЛМЕНТА В УСЛУГАХ**: + +- Расходники фулфилмента - собственность фулфилмента (куплены у поставщиков) +- Фулфилмент создает заявки-поставки для покупки расходников у поставщиков +- Селлеры могут использовать расходники фулфилмента в разделе "Услуги / Расходники" +- Для создания продукта из товара +- Расходники списываются с остатков фулфилмента +- Стоимость включается в стоимость услуги + +**WORKFLOW ИСПОЛЬЗОВАНИЯ**: + +1. Селлер выбирает услугу "Создание продукта" +2. Указывает базовый товар +3. Выбирает необходимые расходники фулфилмента +4. Фулфилмент обрабатывает заказ и создает продукт +5. Расходники списываются, создается готовый продукт + +--- + +## 15. 📊 СТАТИСТИКА И АНАЛИТИКА + +### 15.1 Структура статистики по кабинетам + +#### **В КАБИНЕТЕ ПОСТАВЩИКА**: + +- **ТОВАРЫ**: Общая статистика товаров поставщика +- **РАСХОДНИКИ**: Материалы и вспомогательные товары (классифицируются при заказе) + +#### **В КАБИНЕТЕ ФУЛФИЛМЕНТА**: + +- **ТОВАРЫ**: Базовые товары от поставщиков (принятые на склад) +- **ПРОДУКТЫ**: Отдельный блок готовой продукции +- **БРАК**: Статистика потерь и списаний +- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: Операционные материалы фулфилмента +- **РАСХОДНИКИ СЕЛЛЕРОВ**: Материалы для товаров селлеров + +### 15.2 Ключевые метрики + +**ОБЩИЕ ПОКАЗАТЕЛИ**: + +- Общие остатки, заказано, в пути, остаток, продано +- Подсветка предметов с остатками ниже критического уровня + +**АКТУАЛИЗАЦИЯ ДАННЫХ**: + +- При изменении количества в карточке данные актуализируются во всей системе +- Статистика обновляется в реальном времени +- Отслеживание изменений для аналитики + +--- + +## 16. 📱 ПРАВИЛА UI/UX И ИНТЕРФЕЙСА + +### 16.1 Отзывчивость интерфейса + +- **ОБЯЗАТЕЛЬНО**: Интерфейс должен работать на всех устройствах +- **ПРАВИЛО**: Адаптивная сетка для карточек товаров +- **ФУНКЦИЯ**: Оптимизация для мобильных устройств +- **ТРЕБОВАНИЕ**: Корректное отображение на экранах от 320px до 4K + +### 16.2 Обратная связь пользователю + +- **ОБЯЗАТЕЛЬНО**: Уведомления об успешных/неуспешных операциях +- **ПРАВИЛО**: Индикаторы загрузки для длительных операций +- **ФУНКЦИЯ**: Подтверждение критических действий (удаление, деактивация) +- **UX**: Понятные сообщения об ошибках с предложением решения + +### 16.3 Правила обработки ошибок + +- **ОБЯЗАТЕЛЬНО**: Логирование всех ошибок с детальной информацией +- **ПРАВИЛО**: Понятные сообщения об ошибках для пользователя +- **ФУНКЦИЯ**: Автоматическое восстановление после сбоев +- **МОНИТОРИНГ**: Отслеживание критических ошибок в реальном времени + +### 16.4 Производительность + +- **ПРАВИЛО**: Пагинация для больших списков товаров +- **ФУНКЦИЯ**: Ленивая загрузка изображений +- **ОПТИМИЗАЦИЯ**: Кэширование часто запрашиваемых данных +- **ПРОИЗВОДИТЕЛЬНОСТЬ**: Время загрузки страницы не более 3 секунд + +--- + +## 17. ⚠️ КРИТИЧЕСКИЕ ЗАПРЕТЫ + +### 17.1 НИКОГДА НЕ ДЕЛАТЬ: + +1. ❌ Удалять предметы с существующими заказами +2. ❌ Изменять статусы заказов без уведомлений +3. ❌ Обходить проверки остатков предметов +4. ❌ Давать доступ к чужим данным +5. ❌ Игнорировать ошибки валидации +6. ❌ Сохранять пароли в открытом виде +7. ❌ Пропускать логирование критических операций +8. ❌ Блокировать интерфейс без индикации загрузки +9. ❌ Создавать брак или продукт без связи с родительским товаром +10. ❌ Создавать отдельные типы расходников (только общий тип "РАСХОДНИКИ") +11. ❌ Разрешать заказ брака +12. ❌ Нарушать иерархию типов предметов +13. ❌ Пропускать промежуточные статусы в workflow +14. ❌ Нарушать обязательную последовательность модулей в статистике фулфилмента +15. ❌ **Использовать неправильные имена полей GraphQL** (`getMyCounterparties` вместо `myCounterparties`) +16. ❌ **Использовать GET_SUPPLY_SUPPLIERS для отображения поставщиков в формах** (только партнеры WHOLESALE) +17. ❌ **Создавать интерфейсы TypeScript не соответствующие schema.prisma** (`sku`/`stock` вместо `article`/`quantity`) +18. ❌ **Использовать общие запросы вместо специализированных** (`GET_ALL_PRODUCTS` вместо `GET_ORGANIZATION_PRODUCTS` для конкретного поставщика) +19. ❌ **Показывать расходники в формах создания поставок товаров** (строгая типизация `PRODUCT`/`CONSUMABLE`) +20. ❌ **Фильтровать предметы по типу на фронтенде** (фильтрация должна быть в GraphQL резолвере) + +### 17.2 ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА: + +1. ✅ Проверка остатков перед добавлением в корзину +2. ✅ Валидация всех числовых значений (цена > 0, вес > 0) +3. ✅ Автоматическая генерация уникальных артикулов СФ +4. ✅ Логирование всех изменений статусов +5. ✅ Уведомления всех участников при изменении статусов +6. ✅ Обязательная типизация всех предметов +7. ✅ Связь производных типов с родительскими предметами +8. ✅ Проверка доступности товаров перед заказом +9. ✅ Соблюдение жизненного цикла статусов поставок +10. ✅ Фиксация план/факт в процессе создания продукта + +--- + +## 18. 🛠️ GRAPHQL И TYPESCRIPT ПРАВИЛА + +### 18.1 Правила именования полей + +**ВАЖНО**: Имена полей в GraphQL запросах должны точно соответствовать схеме! + +```typescript +// ✅ ПРАВИЛЬНО - соответствует схеме +export const GET_MY_COUNTERPARTIES = gql` + query GetMyCounterparties { + myCounterparties { // <- имя поля в схеме + id + name + type + } + } +`; + +// Использование в компоненте +const allCounterparties = counterpartiesData?.myCounterparties || []; +``` + +```typescript +// ❌ НЕПРАВИЛЬНО - не соответствует схеме +const allCounterparties = counterpartiesData?.getMyCounterparties || []; // Ошибка! +``` + +### 18.2 Правила отладки GraphQL + +**При проблемах с GraphQL запросами следовать чек-листу**: + +1. **Проверить соответствие имен полей схеме** +2. **Добавить fetchPolicy: 'network-only' для обхода кеша** +3. **Логировать данные в браузере и сервере** +4. **Проверить авторизацию пользователя** +5. **Убедиться что резолвер вызывается** + +### 18.3 Обязательные поля для отладки + +```typescript +const { data, loading, error } = useQuery(QUERY_NAME, { + fetchPolicy: 'network-only', // Обходим кеш при отладке + errorPolicy: 'all' // Показываем все ошибки +}); + +// Логирование для отладки +console.log("Data:", data); +console.log("Loading:", loading); +console.log("Error:", error); +``` + +### 18.4 TypeScript Rules + +#### **Интерфейсы данных** + +**Поля интерфейсов должны соответствовать GraphQL схеме**: + +```typescript +// ✅ ПРАВИЛЬНО - соответствует schema.prisma +interface GoodsProduct { + id: string; + name: string; + article: string; // <- соответствует полю в schema + quantity?: number; // <- соответствует полю в schema + organization: { + id: string; + name: string; + }; +} +``` + +```typescript +// ❌ НЕПРАВИЛЬНО - не соответствует schema +interface GoodsProduct { + sku: string; // <- в schema поле называется 'article' + stock?: number; // <- в schema поле называется 'quantity' +} +``` + +### 18.5 Система партнерства в GraphQL + +**ПРАВИЛА ИСПОЛЬЗОВАНИЯ ПАРТНЕРСТВА**: + +- Поставщики в формах берутся только из партнеров с типом `WHOLESALE` +- Используется запрос `GET_MY_COUNTERPARTIES` с фильтрацией по типу +- НЕ используется `GET_SUPPLY_SUPPLIERS` для отображения поставщиков в формах +- Партнерство создается двумя способами: через заказ в маркете или через раздел "Партнеры" +- Двусторонние записи в таблице `Counterparty` при создании партнерства + +### 18.6 Архитектурные принципы GraphQL + +- **Создавать специализированные резолверы** для каждого контекста использования +- **Использовать параметризованные запросы** (`organizationId`, `type`, `search`) вместо фильтрации на фронтенде +- **Добавлять подробное логирование** в резолверы для отладки (входные параметры, результаты фильтрации) +- **Типы запросов должны отражать бизнес-логику**: `organizationProducts` для товаров конкретной организации +- **Значения по умолчанию в резолверах** для критических параметров (`type: args.type || "PRODUCT"`) +- **Валидация обязательных параметров** на уровне схемы (`organizationId: ID!`) +- **Кеширование обходить при проблемах** через `fetchPolicy: 'network-only'` + +--- + +## 19. 🔧 АРХИТЕКТУРНЫЕ ПРИНЦИПЫ + +### 19.1 Стандарты разработки + +- **ОБЯЗАТЕЛЬНО**: Покрытие тестами критической функциональности +- **ПРАВИЛО**: Следование принципам SOLID +- **ФУНКЦИЯ**: Автоматическое тестирование при развертывании +- **КАЧЕСТВО**: Минимальное покрытие тестами 80% + +### 19.2 Документация + +- **ОБЯЗАТЕЛЬНО**: Документирование всех API методов +- **ПРАВИЛО**: Комментарии к сложной бизнес-логике +- **ФУНКЦИЯ**: Автоматическая генерация документации +- **СТАНДАРТ**: Актуальная техническая документация + +### 19.3 Масштабируемость + +- **АРХИТЕКТУРА**: Модульная структура для легкого расширения +- **ПРАВИЛО**: Использование индексов для быстрого поиска +- **ФУНКЦИЯ**: Горизонтальное масштабирование при росте нагрузки +- **ПЛАНИРОВАНИЕ**: Готовность к увеличению нагрузки в 10 раз + +### 19.4 Безопасность данных + +- **ОБЯЗАТЕЛЬНО**: Шифрование чувствительных данных +- **ПРАВИЛО**: Аудит всех действий пользователей +- **ФУНКЦИЯ**: Контроль доступа на уровне API +- **БЕЗОПАСНОСТЬ**: Двухфакторная аутентификация для критических операций + +--- + +## 20. 🎯 ПРАВИЛА КАЧЕСТВА КОДА + +### 20.1 Проверки и валидация + +**ОБЯЗАТЕЛЬНЫЕ ПРОВЕРКИ**: + +- ✅ Типизация предметов: каждый предмет имеет один из типов: ТОВАР (`PRODUCT`), РАСХОДНИКИ (`CONSUMABLE`), БРАК и ПРОДУКТ (планируются) +- ✅ БРАК и ПРОДУКТ имеют обязательную связь с родительским товаром (parentId) +- ✅ Расходники создаются как универсальный тип, классифицируются при заказе +- ✅ **В формах создания поставок товаров показываются ТОЛЬКО предметы типа ТОВАР** (`PRODUCT`) +- ✅ **В формах создания поставок расходников показываются ТОЛЬКО предметы типа РАСХОДНИКИ** (`CONSUMABLE`) +- ✅ **Фильтрация по типу предмета происходит на уровне GraphQL резолвера**, не на фронтенде + +### 20.2 Workflow статусов + +- ✅ Соблюдена последовательность: PENDING → SUPPLIER_APPROVED → CONFIRMED → LOGISTICS_CONFIRMED → SHIPPED → IN_TRANSIT → DELIVERED +- ✅ Нет пропуска промежуточных статусов +- ✅ Каждое изменение статуса сопровождается уведомлением + +### 20.3 Правила доступа + +- ✅ Поставщик НЕ может добавлять собственные товары в корзину +- ✅ Заказ брака ЗАПРЕЩЕН +- ✅ Только активные предметы отображаются в маркете +- ✅ Проверка остатков перед добавлением в корзину + +--- + +## 21. 🔍 ДИАГНОСТИКА И РЕШЕНИЕ ПРОБЛЕМ + +### 21.1 Правило уточнений + +**КРИТИЧЕСКИ ВАЖНО**: Если я не уверен в выполнении задачи или вижу противоречия в правилах - ОБЯЗАТЕЛЬНО уточнить у пользователя! + +### 21.2 КОГДА УТОЧНЯТЬ: + +- [ ] Недостаточно информации для правильного выполнения +- [ ] Вижу противоречия между правилами +- [ ] Задача может нарушить критические правила +- [ ] Неясно как применить правило в конкретной ситуации +- [ ] Есть сомнения в интерпретации требований + +### 21.3 КАК УТОЧНЯТЬ: + +1. Четко сформулировать что именно неясно +2. Указать какие правила/требования конфликтуют +3. Предложить варианты решения если возможно +4. Запросить конкретные уточнения + +**❌ НИКОГДА не делать предположений если есть сомнения!** + +--- + +## 22. 📋 КАТЕГОРИИ ТОВАРОВ И РАСХОДНИКОВ + +### 22.1 Полный список 28 универсальных категорий товаров + +1. Одежда и обувь +2. Косметика и парфюмерия +3. Дом и сад +4. Детские товары +5. Спорт и отдых +6. Электроника +7. Книги +8. Здоровье +9. Автотовары +10. Строительство и ремонт +11. Продукты питания +12. Зоотовары +13. Дача, сад и огород +14. Канцелярские товары +15. Хобби и творчество +16. Украшения и аксессуары +17. Сумки и чемоданы +18. Техника для дома +19. Музыкальные инструменты +20. Игры и игрушки +21. Мебель +22. Товары для красоты +23. Бытовая химия +24. Товары для путешествий +25. Медицинские товары +26. Религиозные товары +27. Антиквариат и коллекционирование +28. Прочие товары + +### 22.2 12 специализированных категорий расходников + +#### 🎁 **1. УПАКОВКА И ЗАЩИТА** +- Коробки (различных размеров) +- Пакеты (полиэтиленовые, бумажные, фирменные) +- Пузырчатая пленка, воздушные подушки +- Стрейч-пленка, гофрокартон +- Паллетная пленка, защитные уголки + +#### 🏷️ **2. МАРКИРОВКА И ИДЕНТИФИКАЦИЯ** +- Этикетки (адресные, штрих-код, QR-код) +- Бирки (ценники, размерники) +- Стикеры и наклейки +- Маркеры и ручки +- Штампы и печати, термоэтикетки + +#### 🔧 **3. КРЕПЕЖ И СОЕДИНЕНИЕ** +- Скотч (прозрачный, цветной, армированный) +- Клей и клеевые составы +- Стяжки пластиковые +- Степлер и скобы +- Веревки и шнуры, стрейч-лента + +#### 📄 **4. ДОКУМЕНТООБОРОТ И ВКЛАДЫШИ** +- Накладные и сопроводительные документы +- Инструкции по эксплуатации +- Гарантийные талоны +- Рекламные буклеты, визитки и флаеры +- Благодарственные письма, купоны и промокоды + +#### 🧼 **5. ГИГИЕНА И БЕЗОПАСНОСТЬ** +- Перчатки (латексные, нитриловые) +- Маски и респираторы +- Антисептики и дезинфекторы +- Салфетки и тряпки +- Фартуки и халаты, бахилы + +#### 🛠️ **6. ИНСТРУМЕНТЫ И ПРИСПОСОБЛЕНИЯ** +- Ножи и резаки, ножницы +- Линейки и рулетки +- Упаковочные машины (ленточные) +- Дозаторы скотча +- Пистолеты для термоклея +- Весы и мерная тара + +#### 🎨 **7. БРЕНДИНГ И ДИЗАЙН** +- Фирменные пакеты с логотипом +- Брендированные коробки +- Цветная упаковочная бумага +- Ленты и банты +- Наклейки с логотипом компании +- Подарочная упаковка + +#### ⚡ **8. СПЕЦИАЛИЗИРОВАННЫЕ МАТЕРИАЛЫ** +- Антистатические пакеты +- Влагопоглотители +- Температурные индикаторы +- Хрупкие наклейки +- Пломбы и пломбировочные материалы +- Защита от краж (магнитные датчики) + +#### 🏪 **9. ТОРГОВОЕ ОБОРУДОВАНИЕ** +- Манекены и вешалки +- Ценникодержатели +- Подставки и стойки +- Корзины и тележки +- Зеркала примерочные +- Освещение витрин + +#### 🚚 **10. ЛОГИСТИКА И СКЛАДИРОВАНИЕ** +- Паллеты и поддоны +- Контейнеры и ящики +- Стеллажные системы +- Погрузочные ремни +- Защитные чехлы +- Адресные ярлыки для груза + +#### 💻 **11. ТЕХНИЧЕСКИЕ РАСХОДНИКИ** +- Картриджи для принтеров +- Термоголовки, красящие ленты +- Батарейки для сканеров +- Чистящие средства для техники +- Запчасти для упаковочного оборудования + +#### 🎪 **12. СЕЗОННЫЕ И ПРАЗДНИЧНЫЕ** +- Новогодняя упаковка +- Подарочные мешки +- Праздничные ленты +- Тематические наклейки +- Открытки и поздравления +- Сезонная упаковочная бумага + +**ПРИМЕЧАНИЕ**: Данные категории являются рекомендательными и могут быть адаптированы под специфику конкретного поставщика расходников. + +--- + +## 23. 🎖️ ПРИОРИТЕТЫ РАЗРАБОТКИ + +### 23.1 ВЫСОКИЙ ПРИОРИТЕТ: + +1. 🔴 Безопасность и контроль доступа +2. 🔴 Целостность данных и валидация +3. 🔴 Корректность статусов поставок +4. 🔴 Уведомления участников процесса +5. 🔴 Правильная типизация предметов +6. 🔴 Связи между товарами и производными типами + +### 23.2 СРЕДНИЙ ПРИОРИТЕТ: + +1. 🟡 Производительность и оптимизация +2. 🟡 Пользовательский опыт +3. 🟡 Аналитика и отчетность +4. 🟡 Интеграции с внешними системами +5. 🟡 Workflow для брака и продуктов +6. 🟡 Разделение расходников по типам + +### 23.3 НИЗКИЙ ПРИОРИТЕТ: + +1. 🟢 Дополнительные фильтры +2. 🟢 Косметические улучшения +3. 🟢 Экспериментальные функции +4. 🟢 Расширенная кастомизация + +--- + +_Эта база знаний создана на основе анализа rules.md, rules1.md и rules2.md и является единым источником понимания структуры и логики проекта._ + +_Версия: 4.0_ +_Дата создания: 2024_ +_Статус: ПОЛНАЯ УНИФИЦИРОВАННАЯ БАЗА ЗНАНИЙ_ diff --git a/server.log b/server.log new file mode 100644 index 0000000..2807cf8 --- /dev/null +++ b/server.log @@ -0,0 +1,3644 @@ + +> sferav@0.1.0 dev +> next dev --turbopack + + ▲ Next.js 15.4.1 (Turbopack) + - Local: http://localhost:3000 + - Network: http://192.168.0.104:3000 + - Environments: .env + + ✓ Starting... + ✓ Ready in 823ms + ○ Compiling /api/graphql ... + ✓ Compiled /api/graphql in 1234ms +🚀 Проверка инициализации базы данных... +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 582ms +✨ Инициализация базы данных завершена + POST /api/graphql 200 in 3932ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 4435ms + POST /api/graphql 200 in 4521ms + POST /api/graphql 200 in 1014ms + POST /api/graphql 200 in 4627ms + POST /api/graphql 200 in 1194ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 776ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 466ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 288ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 716ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 1026ms + POST /api/graphql 200 in 605ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + POST /api/graphql 200 in 369ms + POST /api/graphql 200 in 782ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 302ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 381ms + POST /api/graphql 200 in 389ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 275ms + POST /api/graphql 200 in 326ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 738ms + POST /api/graphql 200 in 1119ms + POST /api/graphql 200 in 1131ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 1185ms + POST /api/graphql 200 in 1052ms + POST /api/graphql 200 in 1198ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 482ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 286ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 710ms + POST /api/graphql 200 in 622ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 601ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + POST /api/graphql 200 in 458ms + POST /api/graphql 200 in 1121ms + ○ Compiling / ... + ✓ Compiled / in 1642ms + GET / 200 in 1852ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 397ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 343ms + POST /api/graphql 200 in 341ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 265ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 279ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 1281ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 683ms + POST /api/graphql 200 in 589ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 602ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 1193ms + POST /api/graphql 200 in 602ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 379ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 267ms + ○ Compiling /supplies/create-suppliers ... + ✓ Compiled /supplies/create-suppliers in 580ms + GET /supplies/create-suppliers 200 in 797ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + ✓ Compiled /favicon.ico in 130ms + GET /favicon.ico?favicon.45db1c09.ico 200 in 393ms + POST /api/graphql 200 in 413ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + POST /api/graphql 200 in 325ms + POST /api/graphql 200 in 499ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 827ms + POST /api/graphql 200 in 833ms + POST /api/graphql 200 in 629ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 615ms + POST /api/graphql 200 in 619ms + GET /supplies/create-suppliers 200 in 118ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + GET /favicon.ico?favicon.45db1c09.ico 200 in 245ms + POST /api/graphql 200 in 371ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + POST /api/graphql 200 in 321ms + POST /api/graphql 200 in 335ms + POST /api/graphql 200 in 724ms + POST /api/graphql 200 in 950ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +🏢 ORGANIZATION_PRODUCTS RESOLVER - ВЫЗВАН: { + userId: 'cmdxbhacs0004y52vqs3cu86k', + organizationId: 'cmdxbievj000ay52vliq4h23r', + search: '', + category: '', + type: 'ТОВАР', + timestamp: '2025-08-04T17:38:34.516Z' +} + POST /api/graphql 200 in 58ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 387ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 285ms + POST /api/graphql 200 in 358ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 285ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 282ms + POST /api/graphql 200 in 705ms + POST /api/graphql 200 in 818ms + POST /api/graphql 200 in 819ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 638ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 602ms + POST /api/graphql 200 in 601ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 408ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 385ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 794ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 606ms + POST /api/graphql 200 in 692ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmhhY3MwMDA0eTUydnFzM2N1ODZrIiwicGhvbmUiOiI3ODg4ODg4ODg4OCIsImlhdCI6MTc1NDMyNDQ0NywiZXhwIjoxNzU2OTE2NDQ3fQ.G3fwU6DYC7Ue649ibdA7G3D9Xy3DBHQukcXNVRaFQ6E +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbhacs0004y52vqs3cu86k', phone: '78888888888' } + POST /api/graphql 200 in 291ms + POST /api/graphql 200 in 822ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 273ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 273ms + POST /api/graphql 200 in 359ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 295ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } + POST /api/graphql 200 in 699ms + POST /api/graphql 200 in 695ms + POST /api/graphql 200 in 810ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 293ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Yml2NjQwMDBjeTUydnhoNTdkMnJ5IiwicGhvbmUiOiI3NjY2NjY2NjY2NiIsImlhdCI6MTc1NDMyNDUyMCwiZXhwIjoxNzU2OTE2NTIwfQ.JFgG4M95MTlnkRxJET8ZkcGEwVtaOaH4ofbosZbk9yQ +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbiv64000cy52vxh57d2ry', phone: '76666666666' } + POST /api/graphql 200 in 1482ms +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4YmkxcHYwMDA5eTUydnZrenkzOWdyIiwicGhvbmUiOiI3Nzc3Nzc3Nzc3NyIsImlhdCI6MTc1NDMyNDQ4MiwiZXhwIjoxNzU2OTE2NDgyfQ.uudvqWO9a8S0RAiFO1J-rTHHUO13x3QZ5m1d7VQ8YOU +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbi1pv0009y52vvkzy39gr', phone: '77777777777' } +GraphQL Context - Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjbWR4Ymc2cmswMDAxeTUydjNnbm9ncGcyIiwicGhvbmUiOiI3OTk5OTk5OTk5OSIsImlhdCI6MTc1NDMyNDM5NSwiZXhwIjoxNzU2OTE2Mzk1fQ.kQHVo5zIbifiqwkxnXKGiKh0fZJYEvC8LSG1k-C929s +GraphQL Context - Token: eyJhbGciOiJIUzI1NiIs... +GraphQL Context - Decoded user: { id: 'cmdxbg6rk0001y52v3gnogpg2', phone: '79999999999' } + POST /api/graphql 200 in 932ms + POST /api/graphql 200 in 932ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ○ Compiling /_error ... + ✓ Compiled /_error in 847ms + POST /api/graphql 500 in 1332ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 92ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 70ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 132ms + POST /api/graphql 500 in 129ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 118ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 85ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 114ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 138ms + POST /api/graphql 500 in 138ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 77ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 143ms + POST /api/graphql 500 in 149ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 51ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 95ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 61ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 114ms + POST /api/graphql 500 in 119ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 92ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 80ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 105ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 121ms + POST /api/graphql 500 in 124ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 93ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 85ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 94ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 141ms + POST /api/graphql 500 in 145ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 83ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 91ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 97ms + POST /api/graphql 500 in 106ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 113ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 95ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 188ms + POST /api/graphql 500 in 188ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 90ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 92ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 77ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 283ms + POST /api/graphql 500 in 295ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 222ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 84ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 152ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 101ms + POST /api/graphql 500 in 109ms + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/supplies/create-suppliers/page/app-build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/favicon.ico/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/app/api/graphql/[__metadata_id__]/route/app-paths-manifest.json' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + POST /api/graphql 500 in 205ms + POST /api/graphql 500 in 60ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ [Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} +[Error: ENOENT: no such file or directory, open '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json'] { + errno: -2, + code: 'ENOENT', + syscall: 'open', + path: '/Users/veronikasmirnova/Desktop/Projects/sfera/.next/server/pages/_app/build-manifest.json' +} + POST /api/graphql 500 in 336ms + POST /api/graphql 500 in 42ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 108ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 115ms + POST /api/graphql 500 in 118ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 75ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 65ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 103ms + POST /api/graphql 500 in 101ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 86ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 56ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 93ms + POST /api/graphql 500 in 95ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 53ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 140ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 98ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 84ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 108ms + POST /api/graphql 500 in 110ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 119ms + POST /api/graphql 500 in 116ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 94ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 83ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 94ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 113ms + POST /api/graphql 500 in 116ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 70ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 160ms + POST /api/graphql 500 in 171ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 110ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 119ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 66ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 122ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 115ms + POST /api/graphql 500 in 124ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 115ms + POST /api/graphql 500 in 117ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 90ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 82ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 79ms + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + ⨯ GraphQLError: Syntax Error: Unexpected character: U+0422. + at parseDocument (../src/index.ts:96:25) + at Module.gql (../src/index.ts:134:9) + at [project]/src/graphql/typedefs.ts [app-route] (ecmascript) (src/graphql/typedefs.ts:3:28) + at [project]/src/app/api/graphql/route.ts [app-route] (ecmascript) (src/app/api/graphql/route.ts:5:0) + at Object. (.next/server/app/api/graphql/route.js:15:9) + 1 | import { gql } from "graphql-tag"; + 2 | +> 3 | export const typeDefs = gql` + | ^ + 4 | scalar DateTime + 5 | + 6 | type Query { { + path: undefined, + locations: [Array], + extensions: [Object: null prototype] {}, + page: '/api/graphql' +} + POST /api/graphql 500 in 106ms + POST /api/graphql 500 in 110ms +[?25h diff --git a/src/app/supplies/create-suppliers/page.tsx b/src/app/supplies/create-suppliers/page.tsx index e62a887..5d6957d 100644 --- a/src/app/supplies/create-suppliers/page.tsx +++ b/src/app/supplies/create-suppliers/page.tsx @@ -1,19 +1,10 @@ import { AuthGuard } from "@/components/auth-guard"; +import { CreateSuppliersSupplyPage } from "@/components/supplies/create-suppliers-supply-page"; export default function CreateSuppliersSupplyPageRoute() { return ( -
-
-

- Создание поставки поставщиков -

-

- Заказ товаров у поставщиков с рецептурой -

-

Раздел находится в разработке

-
-
+
); } diff --git a/src/components/supplies/add-goods-modal.tsx b/src/components/supplies/add-goods-modal.tsx new file mode 100644 index 0000000..45569ec --- /dev/null +++ b/src/components/supplies/add-goods-modal.tsx @@ -0,0 +1,392 @@ +"use client"; + +import React, { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, +} from "@/components/ui/dialog"; +import { Badge } from "@/components/ui/badge"; +import { + Package, + Plus, + Minus, + X, + FileText, + Settings, + ShoppingCart, +} from "lucide-react"; +import Image from "next/image"; + +interface GoodsProduct { + id: string; + name: string; + description?: string; + price: number; + category?: { name: string }; + images: string[]; + mainImage?: string; + sku: string; + organization: { + id: string; + name: string; + }; + stock?: number; + unit?: string; + weight?: number; + dimensions?: { + length: number; + width: number; + height: number; + }; +} + +interface ProductParameter { + name: string; + value: string; +} + +interface AddGoodsModalProps { + product: GoodsProduct | null; + isOpen: boolean; + onClose: () => void; + onAdd: ( + product: GoodsProduct, + quantity: number, + additionalData: { + completeness?: string; + recipe?: string; + specialRequirements?: string; + parameters?: ProductParameter[]; + customPrice?: number; + } + ) => void; +} + +export function AddGoodsModal({ + product, + isOpen, + onClose, + onAdd, +}: AddGoodsModalProps) { + const [quantity, setQuantity] = useState(1); + const [completeness, setCompleteness] = useState(""); + const [recipe, setRecipe] = useState(""); + const [specialRequirements, setSpecialRequirements] = useState(""); + const [customPrice, setCustomPrice] = useState(""); + const [parameters, setParameters] = useState([]); + const [newParameterName, setNewParameterName] = useState(""); + const [newParameterValue, setNewParameterValue] = useState(""); + + // Сброс формы при закрытии + const handleClose = () => { + setQuantity(1); + setCompleteness(""); + setRecipe(""); + setSpecialRequirements(""); + setCustomPrice(""); + setParameters([]); + setNewParameterName(""); + setNewParameterValue(""); + onClose(); + }; + + // Добавление параметра + const addParameter = () => { + if (newParameterName.trim() && newParameterValue.trim()) { + setParameters(prev => [ + ...prev, + { name: newParameterName.trim(), value: newParameterValue.trim() } + ]); + setNewParameterName(""); + setNewParameterValue(""); + } + }; + + // Удаление параметра + const removeParameter = (index: number) => { + setParameters(prev => prev.filter((_, i) => i !== index)); + }; + + // Обработка добавления в корзину + const handleAdd = () => { + if (!product) return; + + // Проверка остатков согласно rules2.md 9.7.9 + if (product.stock !== undefined && quantity > product.stock) { + return; // Ошибка будет показана в родительском компоненте + } + + const finalPrice = customPrice ? parseFloat(customPrice) : product.price; + + onAdd(product, quantity, { + completeness: completeness.trim() || undefined, + recipe: recipe.trim() || undefined, + specialRequirements: specialRequirements.trim() || undefined, + parameters: parameters.length > 0 ? parameters : undefined, + customPrice: finalPrice !== product.price ? finalPrice : undefined, + }); + + handleClose(); + }; + + if (!product) return null; + + const isStockAvailable = product.stock === undefined || quantity <= product.stock; + const totalPrice = (customPrice ? parseFloat(customPrice) || product.price : product.price) * quantity; + + return ( + + + + + + Добавить товар в корзину + + + +
+ {/* Информация о товаре */} +
+
+ {product.mainImage && ( +
+ {product.name} +
+ )} + +
+

{product.name}

+

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

+ {product.category && ( + + {product.category.name} + + )} +
+

+ Цена: {product.price.toLocaleString('ru-RU')} ₽ за {product.unit || 'шт'} +

+ {product.stock !== undefined && ( +

+ В наличии: {product.stock} {product.unit || 'шт'} +

+ )} +
+
+
+ + {product.description && ( +

+ {product.description} +

+ )} +
+ + {/* Основные поля */} +
+ {/* Количество */} +
+ +
+ + setQuantity(Math.max(1, parseInt(e.target.value) || 1))} + className="bg-white/10 border-white/20 text-white text-center w-20" + /> + +
+ {!isStockAvailable && ( +

+ Недостаточно товара на складе +

+ )} +
+ + {/* Договорная цена */} +
+ + setCustomPrice(e.target.value)} + placeholder={product.price.toString()} + className="bg-white/10 border-white/20 text-white" + /> +

+ Оставьте пустым для использования базовой цены +

+
+
+ + {/* Комплектность согласно rules2.md 9.7.2 */} +
+ +