# API Documentation

## GraphQL Schema Overview

### Основные типы

#### Organization Types
```graphql
enum OrganizationType {
  SELLER       # Селлер
  WHOLESALE    # Поставщик
  FULFILLMENT  # Фулфилмент
  LOGIST       # Логистика
}
```

#### Product Types
```graphql
enum ProductType {
  PRODUCT      # Товар
  CONSUMABLE   # Расходники
  DEFECT       # Брак (планируется)
  FINISHED_PRODUCT # Готовый продукт (планируется)
}
```

#### Supply Order Statuses
```graphql
enum SupplyOrderStatus {
  PENDING
  SUPPLIER_APPROVED
  CONFIRMED
  LOGISTICS_CONFIRMED
  SHIPPED
  IN_TRANSIT
  DELIVERED
  CANCELLED
}
```

## Основные Query запросы

### Аутентификация и пользователи
- `me` - Текущий пользователь
- `checkUserExists(phone: String!)` - Проверка существования пользователя

### Организации и партнеры
- `myOrganization` - Организация текущего пользователя
- `myCounterparties` - Список партнеров
- `myCounterpartyRequests` - Заявки на партнерство
- `searchOrganizations(search: String, type: OrganizationType)` - Поиск организаций

### Товары и склад
- `myProducts` - Товары организации
- `organizationProducts(organizationId: ID!, type: ProductType)` - Товары конкретной организации
- `getSupplierGoods(supplierId: ID!)` - Товары поставщика
- `myWarehouseStats` - Статистика склада
- `fulfillmentWarehouseStats` - Статистика фулфилмент склада

### Поставки
- `mySupplyOrders` - Заказы поставок
- `mySupplies` - Поставки организации
- `getSupplySuppliers` - Поставщики для поставок

### Услуги (Фулфилмент)
- `myServices` - Услуги фулфилмента
- `myLogistics` - Логистические маршруты
- `myEmployees` - Сотрудники
- `employeeSchedule(employeeId: ID!, year: Int!, month: Int!)` - График сотрудника

### Wildberries интеграция
- `getWBProducts` - Товары из WB
- `getWBWarehouseData` - Данные склада WB
- `getWBReturnClaims` - Заявки на возврат WB

## Основные Mutations

### Аутентификация
- `sendSmsCode(phone: String!)` - Отправка SMS кода
- `verifySmsCode(phone: String!, code: String!)` - Верификация кода
- `updateUserAvatar(avatar: String!)` - Обновление аватара

### Организации
- `createOrganization(input: CreateOrganizationInput!)` - Создание организации
- `updateOrganization(input: UpdateOrganizationInput!)` - Обновление организации

### Товары
- `createProduct(input: CreateProductInput!)` - Создание товара
- `updateProduct(id: ID!, input: UpdateProductInput!)` - Обновление товара
- `deleteProduct(id: ID!)` - Удаление товара
- `toggleProductStatus(id: ID!)` - Изменение статуса товара

### Поставки
- `createSupplyOrder(input: CreateSupplyOrderInput!)` - Создание заказа
- `updateSupplyOrderStatus(id: ID!, status: SupplyOrderStatus!)` - Обновление статуса
- `createWildberriesSupply(input: CreateWildberriesSupplyInput!)` - Создание WB поставки

### Партнерство
- `sendCounterpartyRequest(receiverId: ID!, message: String)` - Отправка заявки
- `acceptCounterpartyRequest(requestId: ID!)` - Принятие заявки
- `rejectCounterpartyRequest(requestId: ID!)` - Отклонение заявки

### Услуги (Фулфилмент)
- `createService(input: CreateServiceInput!)` - Создание услуги
- `updateService(id: ID!, input: UpdateServiceInput!)` - Обновление услуги
- `deleteService(id: ID!)` - Удаление услуги

### Сотрудники (Фулфилмент)
- `createEmployee(input: CreateEmployeeInput!)` - Создание сотрудника
- `updateEmployee(id: ID!, input: UpdateEmployeeInput!)` - Обновление сотрудника
- `deleteEmployee(id: ID!)` - Удаление сотрудника
- `updateEmployeeSchedule(input: UpdateEmployeeScheduleInput!)` - Обновление графика

## Правила доступа

### Общие правила
- Все запросы требуют аутентификации (кроме auth endpoints)
- Доступ ограничен типом организации пользователя
- Фулфилмент имеет максимальные права доступа

### Специфичные ограничения
- **Создание товаров**: Только WHOLESALE
- **Создание услуг**: Только FULFILLMENT
- **Управление сотрудниками**: Только FULFILLMENT
- **Просмотр всех заказов**: FULFILLMENT и участники заказа

## Примеры запросов

### Получение товаров поставщика
```graphql
query GetSupplierProducts($organizationId: ID!) {
  organizationProducts(organizationId: $organizationId, type: PRODUCT) {
    id
    name
    article
    price
    quantity
    images
  }
}
```

### Создание заказа поставки
```graphql
mutation CreateSupplyOrder($input: CreateSupplyOrderInput!) {
  createSupplyOrder(input: $input) {
    id
    status
    items {
      product {
        name
      }
      quantity
      price
    }
  }
}
```

### Обновление статуса поставки
```graphql
mutation UpdateSupplyStatus($id: ID!, $status: SupplyOrderStatus!) {
  updateSupplyOrderStatus(id: $id, status: $status) {
    id
    status
    updatedAt
  }
}
```

---

*Последнее обновление: ${new Date().toISOString().split('T')[0]}*