# Планирование заказов Bitrix24

Клиентское приложение для планирования загрузки сотрудников по сделкам Bitrix24. Приложение показывает доступные и занятые человеко-дни, проверяет возможность размещения новой сделки в выбранном периоде, ведет рабочие графики сотрудников и при перегрузке может продлевать даты текущей сделки.

## Основные возможности

- Проверка новой сделки по количеству человеко-дней и периоду выполнения.
- Запись расчетных дат и человеко-дней в текущую сделку Bitrix24.
- Отображение графика загрузки ресурсов по дням.
- Учет рабочих, выходных, отпусков, больничных, дат приема и увольнения сотрудников.
- Управление сотрудниками и их рабочими графиками.
- Загрузка производственного календаря с `isdayoff.ru`.
- Автоматическое перераспределение перегрузки с изменением даты окончания только текущей сделки.

## Состав проекта

- `shedule.html` — основное Vue/Vuetify-приложение, весь интерфейс и бизнес-логика.
- `constants.js` — конфигурация: `API_BASE`, вебхук Bitrix24, поля CRM, лимиты приложения.

В проекте нет локальной сборки: приложение подключает зависимости через CDN и работает как статическая HTML-страница внутри Bitrix24.

## Зависимости

Приложение подключает:

- Vue 2
- Vuetify 2
- Highcharts
- Moment.js с русской локалью
- Bitrix24 JS SDK (`//api.bitrix24.com/api/v1/`)

Также используется внешний backend API (настраивается в `constants.js`):

```js
export const API_BASE = 'https://5648299-ej74484.twc1.net/shedule/api';
```

## Экраны приложения

### Планирование

Основной экран доступен всем пользователям. На нем есть блок `Новая сделка` и график загрузки.

Пользователь вводит:

- количество человеко-дней;
- дату начала;
- дату окончания.

Кнопка `Проверить возможность` запускает расчет доступной мощности. Если сделку можно разместить, приложение обновляет текущую сделку Bitrix24 и показывает кнопку `Добавить даты в сделку`.

График загрузки показывает:

- занятые человеко-дни;
- свободные человеко-дни;
- перегруз, если суммарная потребность больше доступной мощности.

### Рабочие Графики

Экран доступен администраторам. Администратор определяется по `BX24.isAdmin()` или по пользователю с ID `21`.

На экране можно:

- выбрать период таблицы;
- посмотреть статусы сотрудников по дням;
- вручную изменить статус дня;
- массово применить статус на диапазон дат;
- добавить сотрудника;
- уволить, отредактировать или полностью удалить сотрудника.

Статусы дней:

- `working` — рабочий день;
- `weekend` — выходной;
- `vacation` — отпуск;
- `sick` — больничный;
- `terminated` — уволен;
- `not_hired` — еще не принят.

## Интеграция с Bitrix24

Приложение использует Bitrix24 JS SDK:

- `user.current` — получение текущего пользователя;
- `crm.deal.list` — загрузка сделок для расчета загрузки;
- `crm.deal.update` — запись дат и человеко-дней в сделку;
- `crm.timeline.comment.add` — добавление комментария с результатом проверки;
- `BX24.placement.info().options.ID` — определение текущей сделки в карточке.

### Поля Сделки

Для расчета существующей загрузки используются поля:

- `UF_CRM_1755511210978` — дата начала сделки;
- `UF_CRM_1755511228885` — дата окончания сделки;
- `UF_CRM_1755511268203` — человеко-дни.

Для записи результата проверки в текущую сделку используются поля:

- `UF_CRM_1751532386933` — расчетная дата начала;
- `UF_CRM_1751532395170` — расчетная дата окончания;
- `UF_CRM_1751532404575` — расчетные человеко-дни.

## Backend API

Приложение обращается к backend API по `API_BASE`.

### `employees.php`

Используется для работы с сотрудниками:

- `GET` — загрузка списка сотрудников;
- `POST` — добавление сотрудника;
- `PUT` — изменение имени, даты приема и даты увольнения;
- `DELETE` — увольнение или полное удаление сотрудника.

### `schedule.php`

Используется для графиков сотрудников:

- `GET ?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD` — загрузка статусов по периоду;
- `POST` — сохранение статуса на дату или массовое обновление периода;
- `DELETE` — удаление записей графика сотрудника.

### `deals.php`

Используется для локального добавления или удаления сделок:

- `POST` — добавление сделки с человеко-днями и периодом;
- `DELETE` — удаление сделки.

Основной расчет загрузки берет сделки напрямую из Bitrix24 через `crm.deal.list`.

## Расчет Загрузки

Доступные человеко-дни на дату равны количеству сотрудников, которые:

- уже приняты на работу;
- не уволены на эту дату;
- не находятся в отпуске, больничном или выходном;
- доступны по производственному календарю или вручную отмечены как `working`.

Потребность сделки распределяется по рабочим дням ее периода:

```text
дневная нагрузка = человеко-дни сделки / количество рабочих дней сделки
```

Если равномерное распределение помещается в доступную мощность, используется простой расчет. Если появляется перегруз, включается динамическая симуляция: короткие сделки получают приоритет, остаток мощности дня добирается длинными сделками.

## Перераспределение Перегрузки

Метод `redistributeOverload()` запускается после начальной загрузки данных. Он:

- определяет текущую сделку через `BX24.placement.info().options.ID`;
- ищет перегруженные дни, где участвует текущая сделка;
- учитывает нагрузку всех сделок в расчете мощности;
- переносит только долю текущей сделки;
- при необходимости продлевает дату окончания только текущей сделки.

Если приложение открыто не в карточке сделки и ID текущей сделки определить нельзя, перераспределение пропускается.

## Производственный Календарь

Календарь загружается с:

```text
https://isdayoff.ru/api/getdata?year=<year>&delimeter=,
```

Если сервис недоступен или календарь на год еще не опубликован, приложение строит стандартный календарь: понедельник-пятница рабочие, суббота-воскресенье выходные.

## Запуск И Размещение

Для работы приложение должно быть открыто в окружении Bitrix24, где доступен объект `BX24`.

Минимальные условия:

- файл `shedule.html` доступен по HTTPS;
- страница подключена как приложение или placement Bitrix24;
- backend API доступен по адресу из `API_BASE`;
- у приложения Bitrix24 есть права на чтение и изменение CRM-сделок;
- доступны внешние CDN-зависимости.

Локальный запуск как обычной HTML-страницы возможен только для верстки. Функции Bitrix24 и часть бизнес-логики без `BX24` работать не будут.

## Частые Сценарии

### Проверить Сделку

1. Откройте приложение в карточке сделки Bitrix24.
2. Укажите человеко-дни, дату начала и дату окончания.
3. Нажмите `Проверить возможность`.
4. Если период подходит, приложение запишет расчетные значения в текущую сделку.

### Изменить График Сотрудника

1. Откройте раздел `Рабочие графики`.
2. Выберите период таблицы.
3. Нажмите на ячейку сотрудника и даты.
4. Выберите статус и сохраните.

### Массово Применить Статус

1. Откройте раздел `Рабочие графики`.
2. Выберите сотрудника.
3. Выберите действие: рабочий день, выходной, отпуск, больничный или производственный календарь.
4. Для обычных статусов укажите период.
5. Нажмите `Применить`.

## Сверка ЧД Графика И Таблицы

- График и таблица используют единый метод `isEmployeeAvailableForWork`.
- В таблице персонала внизу добавлена строка **«Доступно ЧД»** — она должна совпадать с линией **«Доступные ЧД»** на графике для тех же дат.
- При обновлении графика в консоль выводится результат `verifyPersonnelChartConsistency`.

## Вебхук Bitrix24 (fallback)

Если `BX24` SDK недоступен, укажите входящий вебхук в `shedule.html`:

```js
const BITRIX24_WEBHOOK = 'https://ваш-портал.bitrix24.ru/rest/1/xxxxxxxx/';
```

Запросы `crm.deal.list`, `crm.deal.update`, `crm.timeline.comment.add`, `user.current` будут выполняться через REST API вебхука.

## Сверка ЧД Графика И Таблицы

- График и таблица используют единый метод `isEmployeeAvailableForWork`.
- В таблице персонала внизу добавлена строка **«Доступно ЧД»** — она должна совпадать с линией **«Доступные ЧД»** на графике для тех же дат.
- При обновлении графика в консоль выводится результат `verifyPersonnelChartConsistency`.

## Вебхук Bitrix24 (fallback)

Если `BX24` SDK недоступен, укажите входящий вебхук в `shedule.html`:

```js
const BITRIX24_WEBHOOK = 'https://ваш-портал.bitrix24.ru/rest/1/xxxxxxxx/';
```

Запросы `crm.deal.list`, `crm.deal.update`, `crm.timeline.comment.add`, `user.current` будут выполняться через REST API вебхука.

