
- Разделение rules-complete.md на специализированные файлы - Создание interaction-integrity-rules.md с методологией работы Claude Code - Создание wholesale-cabinet-rules.md с техническими деталями кабинета поставщика - Обновление CLAUDE.md с новой структурой навигации по правилам - Добавление автоматических триггеров для различных типов задач 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
337 lines
11 KiB
Markdown
337 lines
11 KiB
Markdown
# ПРАВИЛА КАБИНЕТА ПОСТАВЩИКА (WHOLESALE)
|
||
|
||
> ⚠️ **ВАЖНО**: Это файл с техническими деталями кабинета поставщика.
|
||
> Общие бизнес-правила находятся в **[rules-complete.md](./rules-complete.md)**
|
||
|
||
## Когда использовать этот файл:
|
||
|
||
- Работа с компонентами `/warehouse`, `/supplier-orders`
|
||
- GraphQL запросы для поставщиков
|
||
- UI/UX специфика кабинета поставщика
|
||
- Технические детали реализации
|
||
|
||
## 1. 🏪 СТРУКТУРА КАБИНЕТА ПОСТАВЩИКА
|
||
|
||
### 1.1 Основные разделы
|
||
|
||
**ПОСТАВЩИК (`WHOLESALE`)** имеет доступ к следующим разделам:
|
||
|
||
- **Склад** (`/warehouse`) - управление товарами и расходниками
|
||
- **Поставки** (`/supplies`) - обработка заказов от селлеров
|
||
- **Маркет** (`/market`) - просмотр глобального каталога
|
||
- **Партнеры** (`/partners`) - управление контрагентами
|
||
- **Мессенджер** (`/messenger`) - связь с партнерами
|
||
- **Настройки** (`/settings`) - профиль и API ключи
|
||
- **Экономика** (`/economics`) - финансовая аналитика
|
||
|
||
### 1.2 Навигация и роутинг
|
||
|
||
#### При входе в систему:
|
||
|
||
```typescript
|
||
switch (user?.organization?.type) {
|
||
case 'WHOLESALE':
|
||
router.push('/supplies') // Направляем на страницу поставок
|
||
break
|
||
}
|
||
```
|
||
|
||
#### Специальная логика роутинга:
|
||
|
||
> 📖 **Бизнес-логика роутинга**: См. [rules-complete.md#4-система-ролей-и-доступов](./rules-complete.md#4--система-ролей-и-доступов)
|
||
|
||
## 2. 🎨 UI/UX КОМПОНЕНТЫ
|
||
|
||
### 2.1 Dashboard компоненты
|
||
|
||
#### Основные компоненты кабинета:
|
||
|
||
- `WarehouseDashboard` - главный компонент склада
|
||
- `SupplierOrdersDashboard` - управление заказами
|
||
- `WholesaleEconomicsPage` - экономическая аналитика
|
||
- `WholesaleHomePage` - домашняя страница поставщика
|
||
|
||
#### Wrapper-компоненты:
|
||
|
||
- `HomePageWrapper` - маршрутизация по типам организаций
|
||
- `EconomicsPageWrapper` - адаптивная экономика по кабинетам
|
||
|
||
#### Специализированные компоненты:
|
||
|
||
- `SupplierOrderCard` - карточка заказа для поставщика
|
||
- `SupplierOrdersContent` - контент страницы заказов
|
||
- `SupplierOrdersSearch` - поиск по заказам
|
||
- `SupplierOrdersTabs` - табы (активные/завершенные)
|
||
- `SupplierOrderStats` - статистика и аналитика заказов
|
||
|
||
### 2.2 Карточка поставщика в интерфейсе
|
||
|
||
#### Структура карточки:
|
||
|
||
```jsx
|
||
<div className="supplier-card glass-card">
|
||
<div className="flex items-start gap-2">
|
||
{/* Аватар организации */}
|
||
<OrganizationAvatar organization={supplier} size="sm" />
|
||
|
||
<div className="flex-1 min-w-0">
|
||
{/* Название поставщика */}
|
||
<h4 className="text-white font-medium text-sm truncate">{supplier.name || supplier.fullName}</h4>
|
||
|
||
{/* ИНН и рынок */}
|
||
<div className="flex items-center gap-2 mt-1">
|
||
<p className="text-white/60 text-xs font-mono">ИНН: {supplier.inn}</p>
|
||
{supplier.market && <Badge className="market-badge">{getMarketLabel(supplier.market)}</Badge>}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
```
|
||
|
||
#### Визуальные правила:
|
||
|
||
- **Аватар**: Размер `sm`, слева от текста
|
||
- **Название**: Приоритет `name` над `fullName`
|
||
- **ИНН**: Моноширинный шрифт, цвет `text-white/60`
|
||
- **Рынок**: Badge компонент с индивидуальными цветами
|
||
|
||
### 2.3 Поисковый интерфейс
|
||
|
||
```jsx
|
||
<Input
|
||
placeholder="Поиск поставщиков..."
|
||
className="bg-white/5 border-white/10 text-white placeholder:text-white/50 pl-10 h-9"
|
||
onChange={(e) => handleSearch(e.target.value)}
|
||
/>
|
||
```
|
||
|
||
### 2.4 Цветовые схемы рынков
|
||
|
||
> 📖 **Полная палитра цветов**: См. [visual-design-rules.md](./visual-design-rules.md)
|
||
|
||
Примеры для рынков:
|
||
|
||
- **"Садовод"** (`sadovod`): `bg-green-500/20 text-green-300 border-green-500/30`
|
||
- **"ТЯК Москва"** (`tyak-moscow`): `bg-blue-500/20 text-blue-300 border-blue-500/30`
|
||
|
||
## 3. 📊 ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ
|
||
|
||
> 📖 **Бизнес-правила**: См. [rules-complete.md#10-кабинет-поставщика](./rules-complete.md#10--кабинет-поставщика) для правил создания товаров, обязательных полей и статистики
|
||
|
||
## 4. 🛠️ GRAPHQL API
|
||
|
||
### 4.1 Основные запросы (Queries)
|
||
|
||
#### Получение товаров поставщика:
|
||
|
||
```graphql
|
||
query GetMyProducts {
|
||
myProducts {
|
||
id
|
||
name
|
||
article
|
||
price
|
||
quantity
|
||
organization {
|
||
id
|
||
name
|
||
market # Физический рынок поставщика
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Получение заказов:
|
||
|
||
```graphql
|
||
query GetSupplierOrders {
|
||
supplyOrders(where: { partnerId: $myOrgId }) {
|
||
id
|
||
status
|
||
totalAmount
|
||
organization {
|
||
name # Заказчик
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Получение партнеров:
|
||
|
||
```graphql
|
||
query GetMyCounterparties {
|
||
myCounterparties {
|
||
id
|
||
name
|
||
type
|
||
market
|
||
fullName
|
||
inn
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.2 Мутации (Mutations)
|
||
|
||
#### Создание товара:
|
||
|
||
```graphql
|
||
mutation CreateProduct($input: ProductInput!) {
|
||
createProduct(input: $input) {
|
||
success
|
||
product {
|
||
id
|
||
article
|
||
organization {
|
||
id
|
||
name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Обработка заказов поставщиком:
|
||
|
||
```graphql
|
||
mutation ApproveSupplyOrder($orderId: ID!) {
|
||
approveSupplyOrder(id: $orderId) {
|
||
success
|
||
order {
|
||
id
|
||
status
|
||
organization {
|
||
id
|
||
name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
mutation RejectSupplyOrder($orderId: ID!, $reason: String) {
|
||
rejectSupplyOrder(id: $orderId, reason: $reason) {
|
||
success
|
||
message
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Отгрузка заказов:
|
||
|
||
```graphql
|
||
mutation ShipSupplyOrder($orderId: ID!) {
|
||
shipSupplyOrder(id: $orderId) {
|
||
success
|
||
order {
|
||
id
|
||
status # SHIPPED -> IN_TRANSIT
|
||
organization {
|
||
id
|
||
name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.3 Правила партнерства
|
||
|
||
**КРИТИЧЕСКОЕ ПРАВИЛО**: Поставщики в формах берутся ТОЛЬКО из партнеров с типом `WHOLESALE`
|
||
|
||
```typescript
|
||
// ✅ ПРАВИЛЬНО
|
||
const suppliers = await useQuery(GET_MY_COUNTERPARTIES, {
|
||
variables: { type: 'WHOLESALE' },
|
||
})
|
||
|
||
// ❌ НЕПРАВИЛЬНО
|
||
const suppliers = await useQuery(GET_SUPPLY_SUPPLIERS)
|
||
```
|
||
|
||
> 📖 **Система партнерства**: См. [rules-complete.md#13-система-партнерства-и-контрагентов](./rules-complete.md#13--система-партнерства-и-контрагентов)
|
||
|
||
## 5. 📁 ТЕХНИЧЕСКИЕ КОМПОНЕНТЫ
|
||
|
||
> 📖 **Архитектура рынков**: См. [rules-complete.md#10-кабинет-поставщика](./rules-complete.md#10--кабинет-поставщика) для бизнес-логики принадлежности к рынкам
|
||
|
||
### 5.1 Расположение компонентов
|
||
|
||
```
|
||
src/components/
|
||
├── warehouse/ # Компоненты склада
|
||
│ ├── warehouse-dashboard.tsx
|
||
│ ├── product-card.tsx
|
||
│ ├── product-form.tsx
|
||
│ └── warehouse-statistics.tsx
|
||
├── supplier-orders/ # Компоненты заказов
|
||
│ ├── supplier-orders-dashboard.tsx
|
||
│ ├── supplier-order-card.tsx
|
||
│ └── supplier-orders-tabs.tsx
|
||
└── economics/ # Экономика
|
||
└── wholesale-economics-page.tsx
|
||
```
|
||
|
||
### 5.2 Страницы (Pages)
|
||
|
||
```
|
||
src/app/
|
||
├── warehouse/
|
||
│ └── page.tsx # Страница склада
|
||
├── supplier-orders/
|
||
│ └── page.tsx # Страница заказов
|
||
└── [общие страницы] # См. rules-complete.md
|
||
```
|
||
|
||
## 6. 🚨 ТЕХНИЧЕСКИЕ ПРАВИЛА И ОГРАНИЧЕНИЯ
|
||
|
||
> 📖 **Workflow поставок**: См. [rules-complete.md#5-workflow-поставок](./rules-complete.md#5--workflow-поставок) для бизнес-процессов
|
||
|
||
### 6.1 Обязательные проверки:
|
||
|
||
- Проверка типа организации: `organization.type === 'WHOLESALE'`
|
||
- Валидация прав доступа на уровне GraphQL резолверов
|
||
- Контроль остатков при подтверждении заказов
|
||
|
||
### 6.2 Правила безопасности доступа:
|
||
|
||
#### Контроль на уровне компонентов:
|
||
|
||
```typescript
|
||
{user?.organization?.type === "WHOLESALE" && (
|
||
<WarehouseDashboard />
|
||
)}
|
||
```
|
||
|
||
#### Проверки в GraphQL резолверах:
|
||
|
||
```typescript
|
||
// Проверка что пользователь - поставщик
|
||
if (context.user.organization.type !== 'WHOLESALE') {
|
||
throw new Error('Access denied: Wholesale access required')
|
||
}
|
||
|
||
// Проверка доступа к своим товарам
|
||
const product = await prisma.product.findFirst({
|
||
where: {
|
||
id: productId,
|
||
organizationId: context.user.organizationId,
|
||
},
|
||
})
|
||
```
|
||
|
||
### 6.3 Запрещено:
|
||
|
||
- Создавать товары с типами `DEFECT` или `FINISHED_PRODUCT`
|
||
- Изменять статусы заказов минуя workflow
|
||
- Показывать данные других поставщиков
|
||
|
||
> 📖 **Критические запреты**: См. [rules-complete.md#17-критические-запреты](./rules-complete.md#17--критические-запреты)
|
||
|
||
---
|
||
|
||
**Последнее обновление**: Декабрь 2024
|
||
**Связанные файлы**:
|
||
|
||
- [rules-complete.md](./rules-complete.md) - Общие бизнес-правила
|
||
- [visual-design-rules.md](./visual-design-rules.md) - Визуальные правила
|