{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/akeda-ru/json-schema/akeda-ru-crminbox-line-schema.json",
  "title": "CRMInboxLine",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/akeda-ru-openapi.yaml#/components/schemas/CRMInboxLine",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "is_active",
    "distribution",
    "member_ids",
    "schedule",
    "off_hours_message",
    "off_hours_wait",
    "consent_enabled",
    "consent_url",
    "consent_text",
    "transfer_enabled",
    "transfer_minutes",
    "known_client_owner",
    "busy_enabled",
    "busy_minutes",
    "busy_message",
    "close_enabled",
    "close_minutes",
    "close_message_enabled",
    "close_message",
    "reopen_mode",
    "reopen_days",
    "rating_enabled",
    "rating_text",
    "rating_thanks",
    "mail_autoreply_enabled",
    "mail_autoreply_text",
    "mail_autoreply_hours",
    "crm_create",
    "crm_match_contacts",
    "crm_repeat",
    "crm_owner_mode",
    "crm_follow_up",
    "crm_calendar",
    "crm_due_minutes",
    "channel_ids",
    "rating_today",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "id": {
      "$ref": "#/$defs/UUID"
    },
    "name": {
      "type": "string"
    },
    "is_active": {
      "type": "boolean",
      "description": "Выключенная линия не действует: каналы работают как без линии"
    },
    "distribution": {
      "type": "string",
      "enum": [
        "round_robin",
        "even",
        "all"
      ],
      "description": "round_robin — по очереди; even — тому, у кого меньше открытых диалогов; all — всем сразу, диалог без назначения"
    },
    "member_ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "format": "int64"
      },
      "description": "Очередь сотрудников в порядке распределения"
    },
    "schedule": {
      "$ref": "#/$defs/CRMInboxLineSchedule"
    },
    "off_hours_message": {
      "type": "string",
      "description": "Сообщение клиенту в нерабочее время, не чаще раза за ночь"
    },
    "off_hours_wait": {
      "type": "boolean",
      "description": "true — обращение в нерабочее время получает запись CRM и ответственного в начале рабочего дня"
    },
    "consent_enabled": {
      "type": "boolean",
      "description": "Отправлять клиенту согласие на обработку персональных данных вместе с приветствием"
    },
    "consent_url": {
      "type": "string",
      "description": "Ссылка на документ согласия"
    },
    "consent_text": {
      "type": "string",
      "description": "Текст перед ссылкой; метка {ссылка} или {link} заменяется адресом документа"
    },
    "transfer_enabled": {
      "type": "boolean",
      "description": "Если сотрудник не ответил за transfer_minutes минут, передать диалог следующему в очереди (в рабочее время, каждому — один раз за обращение)"
    },
    "transfer_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440,
      "description": "Через сколько минут без ответа передать следующему"
    },
    "known_client_owner": {
      "type": "boolean",
      "description": "Знакомого клиента (уже есть запись CRM) — сразу ответственному этой записи, минуя очередь"
    },
    "busy_enabled": {
      "type": "boolean",
      "description": "Через busy_minutes минут без ответа отправить клиенту busy_message — один раз за обращение, только в рабочее время"
    },
    "busy_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440,
      "description": "Через сколько минут без ответа отправить сообщение «все заняты»"
    },
    "busy_message": {
      "type": "string",
      "description": "Сообщение «все сотрудники заняты»"
    },
    "close_enabled": {
      "type": "boolean",
      "description": "Закрыть диалог, если клиент молчит close_minutes минут после ответа сотрудника"
    },
    "close_minutes": {
      "type": "integer",
      "minimum": 5,
      "maximum": 43200,
      "description": "Сколько минут тишины клиента до закрытия"
    },
    "close_message_enabled": {
      "type": "boolean",
      "description": "Отправить клиенту close_message при закрытии"
    },
    "close_message": {
      "type": "string",
      "description": "Сообщение при закрытии диалога"
    },
    "reopen_mode": {
      "type": "string",
      "enum": [
        "new",
        "return"
      ],
      "description": "Клиент написал после закрытия: new — новое обращение (снова приветствие и очередь); return — прежнему сотруднику, если с закрытия прошло меньше reopen_days дней"
    },
    "reopen_days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 90,
      "description": "Срок возврата прежнему сотруднику, дней"
    },
    "rating_enabled": {
      "type": "boolean",
      "description": "Просить клиента оценить ответ после закрытия: кнопки «👍 Хорошо» и «👎 Плохо» в Telegram, VK и MAX, ответ «1» или «2» в Avito"
    },
    "rating_text": {
      "type": "string",
      "description": "Текст просьбы оценить; пусто — «Оцените, пожалуйста, как мы вам помогли:»"
    },
    "rating_thanks": {
      "type": "string",
      "description": "Ответ на оценку; пусто — «Спасибо за оценку!»"
    },
    "mail_autoreply_enabled": {
      "type": "boolean",
      "description": "Автоответ письмом на новое письмо почты этой линии; не уходит роботам, на автоответы и отчёты о доставке и одному адресу не чаще раза в mail_autoreply_hours часов"
    },
    "mail_autoreply_text": {
      "type": "string",
      "description": "Текст автоответа письмом; вне рабочего времени уходит off_hours_message, если оно задано"
    },
    "mail_autoreply_hours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 720,
      "description": "Не чаще раза в столько часов на один адрес"
    },
    "crm_create": {
      "type": "string",
      "enum": [
        "none",
        "lead",
        "deal",
        "customer"
      ],
      "description": "Работа с CRM: что создать по новому клиенту — none — ничего (менеджер создаст сам из переписки), lead — лид, deal — сделку с клиентом в воронке crm_pipeline_id, customer — только карточку клиента. В режиме работы CRM deals вместо лида заводится сделка"
    },
    "crm_pipeline_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "Воронка новых сделок; нет — основная воронка"
    },
    "crm_stage_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "Рабочий этап воронки crm_pipeline_id, на который встаёт сделка; нет — первый рабочий этап"
    },
    "crm_match_contacts": {
      "type": "boolean",
      "description": "Узнавать знакомого клиента по телефону и почте из сообщения во всех каналах, а не только по аккаунту мессенджера"
    },
    "crm_repeat": {
      "type": "string",
      "enum": [
        "open",
        "new",
        "customer"
      ],
      "description": "Знакомый клиент пишет снова: open — в его открытую сделку или лид, если открытых нет — как новый клиент; new — всегда новая сделка (лид в режиме с лидами); customer — только в карточку клиента"
    },
    "crm_owner_mode": {
      "type": "string",
      "enum": [
        "queue",
        "user",
        "first_reply"
      ],
      "description": "Ответственный за новую запись: queue — очередь линии; user — сотрудник crm_owner_id; first_reply — кто первым ответил в чате (до ответа запись числится за первым в очереди)"
    },
    "crm_owner_id": {
      "type": [
        "integer",
        "null"
      ],
      "format": "int64",
      "description": "Ответственный при crm_owner_mode = user"
    },
    "crm_follow_up": {
      "type": "boolean",
      "description": "Ставить ответственному дело «Ответить клиенту» по новому обращению"
    },
    "crm_calendar": {
      "type": "boolean",
      "description": "Дело «Ответить клиенту» — ещё и в календарь ответственного"
    },
    "crm_due_minutes": {
      "type": "integer",
      "enum": [
        15,
        30,
        60,
        120,
        240,
        1440
      ],
      "description": "Через сколько минут срок дела «Ответить клиенту»"
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/UUID"
      },
      "description": "Каналы линии"
    },
    "rating_today": {
      "$ref": "#/$defs/CRMInboxLineRatingStats"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  },
  "$defs": {
    "CRMInboxLineRatingStats": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "good",
        "bad",
        "percent"
      ],
      "description": "Оценки ответов линии с начала сегодняшнего дня по её часовому поясу",
      "properties": {
        "good": {
          "type": "integer",
          "minimum": 0,
          "description": "Сколько оценок «👍 Хорошо»"
        },
        "bad": {
          "type": "integer",
          "minimum": 0,
          "description": "Сколько оценок «👎 Плохо»"
        },
        "percent": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "description": "Доля хороших оценок, %; 0 — оценок нет"
        }
      }
    },
    "CRMInboxLineSchedule": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "always",
            "schedule"
          ],
          "description": "always — круглосуточно; schedule — по дням и часам"
        },
        "days": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 7
          },
          "description": "Рабочие дни недели: 1 — понедельник, 7 — воскресенье"
        },
        "from": {
          "type": "string",
          "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
          "description": "Начало рабочего дня, ЧЧ:ММ"
        },
        "to": {
          "type": "string",
          "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
          "description": "Конец рабочего дня, ЧЧ:ММ; меньше начала — смена через полночь"
        },
        "timezone": {
          "type": "string",
          "description": "Часовой пояс IANA, например Europe/Moscow"
        },
        "holidays": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Нерабочие даты каждого года: ММ-ДД или промежуток ММ-ДД:ММ-ДД"
        }
      }
    },
    "UUID": {
      "type": "string",
      "format": "uuid"
    }
  }
}