---
name: telegram-worklog
description: Сбор данных о выполненных работах с участков через Telegram-бот. Используй когда пользователь говорит "журнал производства работ", "ежедневный отчёт", "данные с участка", "отчёт прораба", "телеграм журнал", "сбор данных с участков", "электронный журнал работ".
---

# Telegram Work Log — Электронный журнал производства работ

## Назначение

Сбор ежедневных отчётов о выполненных работах с участков через Telegram-бот:
- Приём данных от прорабов и мастеров
- Структурирование информации о работах
- Хранение в базе данных
- Экспорт для анализа и отчётов
- Интеграция с progress-tracker для план/факт анализа

## Структура отчёта

### Обязательные поля

1. **Проект** — название или код проекта
2. **Участок/Секция** — место выполнения работ
3. **Дата** — дата выполнения работ
4. **Выполненные работы** — описание выполненных работ
5. **Объёмы** — количество с единицами измерения (м³, м², м, шт, тонн)

### Дополнительные поля

6. **Персонал** — количество человек, ФИО ключевых специалистов
7. **Техника** — используемая техника и оборудование
8. **Погода** — погодные условия (температура, осадки, ветер)
9. **Проблемы/Риски** — выявленные проблемы или риски
10. **План на завтра** — запланированные работы на следующий день
11. **Фото/Документы** — прикреплённые файлы

## Формат сообщений в Telegram

### Вариант 1: Пошаговый диалог (рекомендуется)

Бот задаёт вопросы последовательно, пользователь отвечает:

```
Бот: 📝 Начало отчёта о работах
     Выберите проект:
     [Кнопка: Мост №5] [Кнопка: Развязка] [Кнопка: Другое]

Пользователь: [Нажимает "Мост №5"]

Бот: Укажите участок/секцию:
     (например: "Опоры 1-3", "Пролёт 2", "Участок А")

Пользователь: Опоры 1-3

Бот: Какие работы выполнены сегодня?
     (опишите подробно)

Пользователь: Бетонирование опор №1 и №2, установка арматуры на опору №3

Бот: Укажите объёмы выполненных работ:
     (формат: количество + единица, например: "50 м³", "120 м²")

Пользователь: 45 м³ бетона, 2.5 тонн арматуры

Бот: Количество персонала?
     (например: "5 человек" или "Бригада Иванова - 5 чел.")

Пользователь: 5 человек

Бот: Использовалась техника?
     (например: "Бетононасос, кран 25т" или "Нет")

Пользователь: Бетононасос, кран 25т

Бот: Погодные условия?
     (например: "Ясно, +5°C" или "Дождь, +2°C")

Пользователь: Ясно, +5°C

Бот: Были проблемы или риски?
     (опишите или напишите "Нет")

Пользователь: Нет

Бот: План работ на завтра?
     (опишите или напишите "Без изменений")

Пользователь: Бетонирование опоры №3, подготовка к монтажу пролёта

Бот: Прикрепите фото (если есть) или нажмите "Пропустить"

Пользователь: [Прикрепляет фото или нажимает "Пропустить"]

Бот: ✅ Отчёт сохранён!
     ID: #12345
     Проект: Мост №5
     Участок: Опоры 1-3
     Дата: 26.01.2026
     
     Отчёт будет доступен для просмотра администраторам.
```

### Вариант 2: Структурированное сообщение (для опытных пользователей)

Пользователь отправляет одно сообщение в структурированном формате:

```
/отчёт

Проект: Мост №5
Участок: Опоры 1-3
Дата: 26.01.2026

Работы: Бетонирование опор №1 и №2, установка арматуры на опору №3
Объёмы: 45 м³ бетона, 2.5 тонн арматуры
Персонал: 5 человек
Техника: Бетононасос, кран 25т
Погода: Ясно, +5°C
Проблемы: Нет
План на завтра: Бетонирование опоры №3, подготовка к монтажу пролёта
```

Бот парсит структурированное сообщение и сохраняет данные.

## Workflow обработки

### Шаг 1: Приём данных

1. Пользователь запускает бота командой `/start` или `/отчёт`
2. Бот определяет роль пользователя (прораб, мастер, администратор)
3. Для прорабов/мастеров — запускается процесс создания отчёта
4. Для администраторов — показывается меню управления

### Шаг 2: Валидация данных

Проверка обязательных полей:
- Проект должен существовать в системе
- Дата не может быть в будущем (или не более чем на 1 день вперёд)
- Объёмы должны содержать число и единицу измерения
- Работы не должны быть пустыми

### Шаг 3: Сохранение в БД

Структура таблицы `work_reports`:

```sql
CREATE TABLE work_reports (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    report_id TEXT UNIQUE NOT NULL,  -- Уникальный ID отчёта (#12345)
    project_name TEXT NOT NULL,
    section TEXT NOT NULL,
    report_date DATE NOT NULL,
    work_description TEXT NOT NULL,
    volumes TEXT,  -- JSON: [{"value": 45, "unit": "м³", "material": "бетон"}]
    personnel_count INTEGER,
    personnel_details TEXT,
    equipment TEXT,
    weather TEXT,
    issues TEXT,
    next_day_plan TEXT,
    attachments TEXT,  -- JSON: [{"type": "photo", "file_id": "..."}]
    reporter_telegram_id INTEGER NOT NULL,
    reporter_name TEXT,
    status TEXT DEFAULT 'submitted',  -- submitted, approved, rejected
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    approved_at TIMESTAMP,
    approved_by INTEGER
);
```

### Шаг 4: Уведомления

После сохранения:
- Подтверждение пользователю с ID отчёта
- Уведомление администраторам (если настроено)
- Интеграция с progress-tracker для обновления фактических данных

## Административные команды

### Просмотр отчётов

```
/reports_today — список всех отчётов за сегодня
/report <ID> — детальная информация об отчёте
/reports_project <название> — отчёты по проекту
/reports_date <дата> — отчёты за дату (формат: ДД.ММ.ГГГГ)
```

### Экспорт данных

```
/export_today — экспорт всех отчётов за сегодня в CSV
/export_date <дата> — экспорт за дату
/export_project <название> — экспорт по проекту
```

### Управление

```
/approve <ID> — одобрить отчёт
/reject <ID> <причина> — отклонить отчёт с причиной
/users — список пользователей
/stats — статистика по отчётам
```

## Формат экспорта CSV

```csv
ID,Дата,Проект,Участок,Работы,Объёмы,Персонал,Техника,Погода,Проблемы,План на завтра,Автор,Статус
#12345,26.01.2026,Мост №5,Опоры 1-3,"Бетонирование опор №1 и №2, установка арматуры на опору №3","45 м³ бетона, 2.5 тонн арматуры",5 человек,Бетононасос кран 25т,Ясно +5°C,Нет,"Бетонирование опоры №3, подготовка к монтажу пролёта",Иванов И.И.,submitted
```

## Интеграция с другими скиллами

### progress-tracker

После сохранения отчёта автоматически:
1. Извлекаются объёмы выполненных работ
2. Обновляются фактические данные в progress-tracker
3. Пересчитываются индексы SPI/CPI
4. Генерируются алерты при отклонениях

### deviation-alert

При обнаружении проблем в отчёте:
- Автоматическое создание алерта
- Уведомление руководителя проекта
- Эскалация критических проблем

### gantt-planner

Объёмы из отчётов используются для:
- Обновления фактического прогресса в графике Ганта
- Корректировки сроков при необходимости

## Примеры использования

### Пример 1: Создание отчёта

```
Пользователь: /отчёт

Claude (через бота):
📝 Начало отчёта о работах
Выберите проект:
[Мост №5] [Развязка] [Дорога А-123]

[Пользователь выбирает проект и заполняет данные]

✅ Отчёт сохранён!
ID: #12345
Проект: Мост №5
Участок: Опоры 1-3
Дата: 26.01.2026

Данные переданы в систему мониторинга.
```

### Пример 2: Просмотр отчётов администратором

```
Администратор: /reports_today

Бот:
📊 Отчёты за сегодня (26.01.2026)

1. #12345 — Мост №5, Опоры 1-3
   Работы: Бетонирование опор
   Объёмы: 45 м³ бетона
   Автор: Иванов И.И.
   Статус: ✅ Подтверждён

2. #12346 — Развязка, Участок Б
   Работы: Укладка асфальта
   Объёмы: 120 м²
   Автор: Петров П.П.
   Статус: ⏳ На проверке

Всего: 2 отчёта
```

### Пример 3: Экспорт данных

```
Администратор: /export_today

Бот:
📥 Генерация CSV файла...

[Отправляет файл work_reports_2026-01-26.csv]

✅ Экспортировано 2 отчёта
Файл готов для импорта в Excel или 1С:PM
```

## Выходные документы

1. **work_reports_[дата].csv** — экспорт отчётов за дату
2. **work_reports_[проект].csv** — экспорт по проекту
3. **work_reports_summary_[период].xlsx** — сводный отчёт (через xlsx skill)

## Безопасность и права доступа

### Роли пользователей

- **Прораб/Мастер** — может создавать отчёты, просматривать свои отчёты
- **Руководитель проекта** — может просматривать отчёты по своим проектам, одобрять/отклонять
- **PMO/Администратор** — полный доступ ко всем отчётам, экспорт, статистика

### Валидация

- Проверка существования проекта
- Проверка прав доступа к проекту
- Валидация формата данных
- Защита от дублирования отчётов (один отчёт на участок в день)
