- **DashboardService** (800 строк) - Аналитика
- **SalesService** (900 строк) - Продажи
-### 5. [Руководства](./guides/README.md)
+### 5. [Консольные команды](./console-commands/README.md) ✅ NEW
+Полная документация всех 62 консольных команд для автоматизации:
+
+**Ключевые документы:**
+- [Обзор консольных команд](./console-commands/README.md) - 17 контроллеров, 62 команды
+- [Практические примеры](./console-commands/EXAMPLES.md) - 9 готовых сценариев использования
+
+**Основные категории команд:**
+- **CronController** (28 команд) - Синхронизация с 1С, когорты, рассылки
+- **BonusController** (9 команд) - Управление бонусной программой
+- **MarketplaceController** (5 команд) - Интеграция с Yandex Market и Flowwow
+- **TimetableController** (1 команда) - Автозакрытие смен
+- **AlertsController** (2 команды) - Система алертов и триггеров
+
+**Примеры использования:**
+```bash
+# Синхронизация с 1С
+php yii cron/one-c
+
+# Обработка бонусов клиентов
+php yii bonus/add-new-user-and-bonus
+
+# Получение заказов с маркетплейсов
+php yii marketplace/get-flowwow-orders --unseen=1
+
+# Автозакрытие зависших смен
+php yii timetable/autoclose-shifts
+```
+
+### 6. [Руководства](./guides/README.md)
- Установка и настройка
- Разработка новых модулей
- Интеграция с внешними системами
| API3 эндпоинты | 76 |
| Helpers | 15+ |
| Forms | 20+ |
-| Commands | 15+ |
+| **Console контроллеры** | **17** ✅ |
+| **Console команды** | **62** ✅ |
| Migrations | 278 |
| Jobs | 6 |
| **Бизнес-модули** | **12** |
--- /dev/null
+# Примеры использования консольных команд ERP24
+
+**Дата создания:** 2025-11-25
+**Версия:** 1.0
+**Статус:** Практические примеры
+
+---
+
+## 📋 Обзор
+
+Данный документ содержит **практические примеры** использования консольных команд ERP24 для различных сценариев: от ежедневных операций до решения специфических задач.
+
+---
+
+## 🎯 Сценарий 1: Ежедневное обслуживание системы
+
+### Утренние задачи (3:00 - 6:00)
+
+```bash
+#!/bin/bash
+# /var/www/erp24/scripts/morning_maintenance.sh
+
+echo "=== Утреннее обслуживание ERP24 ===" >> /var/log/erp24/morning.log
+date >> /var/log/erp24/morning.log
+
+# 1. Обработка бонусов клиентов
+echo "1. Обработка бонусов..." >> /var/log/erp24/morning.log
+cd /var/www/erp24
+php yii bonus/add-new-user-and-bonus >> /var/log/erp24/bonus-main.log 2>&1
+
+# 2. Начисление бонусов на памятные даты
+echo "2. Бонусы на даты..." >> /var/log/erp24/morning.log
+php yii bonus/add >> /var/log/erp24/bonus-dates.log 2>&1
+
+# 3. Сгорание просроченных бонусов
+echo "3. Сгорание бонусов..." >> /var/log/erp24/morning.log
+php yii bonus/dell >> /var/log/erp24/bonus-expire.log 2>&1
+php yii bonus/dell-promo >> /var/log/erp24/bonus-promo.log 2>&1
+
+# 4. Очистка старых логов
+echo "4. Очистка логов..." >> /var/log/erp24/morning.log
+php yii cron-clear/clear-old-api-logs >> /var/log/erp24/cleanup.log 2>&1
+
+# 5. История остатков
+echo "5. Сохранение истории остатков..." >> /var/log/erp24/morning.log
+php yii cron/balance-history >> /var/log/erp24/balance-history.log 2>&1
+
+# 6. Генерация фидов для маркетплейсов
+echo "6. Генерация фидов..." >> /var/log/erp24/morning.log
+php yii marketplace/flowwow-feed-file >> /var/log/erp24/marketplace-feed.log 2>&1
+
+echo "=== Утреннее обслуживание завершено ===" >> /var/log/erp24/morning.log
+echo "" >> /var/log/erp24/morning.log
+```
+
+### Дневные задачи (10:00 - 18:00)
+
+```bash
+#!/bin/bash
+# /var/www/erp24/scripts/day_operations.sh
+
+# 1. Генерация когорт для рассылок (10:00)
+cd /var/www/erp24
+php yii cron/generate-target-kogorts >> /var/log/erp24/kogorts.log 2>&1
+php yii cron/generate-whatsapp-kogorts >> /var/log/erp24/kogorts-wa.log 2>&1
+
+# Пауза 30 минут
+sleep 1800
+
+# 2. Отправка первой волны сообщений (10:30)
+php yii cron/send-first-telegram-message >> /var/log/erp24/telegram-1.log 2>&1
+
+# 3. Обработка бонусов в обед (15:00)
+# Запускается через cron
+
+# 4. Отправка второй волны сообщений (18:00)
+php yii cron/send-second-telegram-message >> /var/log/erp24/telegram-2.log 2>&1
+```
+
+---
+
+## 🎯 Сценарий 2: Синхронизация с 1С
+
+### Полная синхронизация
+
+```bash
+#!/bin/bash
+# Запуск полной синхронизации с проверкой результата
+
+cd /var/www/erp24
+
+echo "Начало синхронизации с 1С: $(date)"
+
+# 1. Основная синхронизация (чеки, списания, поступления)
+php yii cron/one-c
+
+if [ $? -eq 0 ]; then
+ echo "✓ Основная синхронизация успешна"
+else
+ echo "✗ Ошибка основной синхронизации"
+ # Отправка уведомления администратору
+ php yii notification/send-admin-alert --message="Ошибка синхронизации 1С"
+fi
+
+# 2. Синхронизация остатков
+php yii cron/one-c-balances
+
+if [ $? -eq 0 ]; then
+ echo "✓ Синхронизация остатков успешна"
+else
+ echo "✗ Ошибка синхронизации остатков"
+fi
+
+# 3. Обновление цен
+php yii cron/one-c-price
+
+echo "Синхронизация завершена: $(date)"
+```
+
+### Синхронизация только за сегодня
+
+```bash
+# Быстрая синхронизация чеков за текущий день
+cd /var/www/erp24
+php yii cron/one-c-check-one-day
+
+# Проверка количества загруженных чеков
+CHECK_COUNT=$(psql -U erp24 -d erp24 -t -c "SELECT COUNT(*) FROM sales WHERE date >= CURRENT_DATE")
+echo "Загружено чеков за сегодня: $CHECK_COUNT"
+```
+
+---
+
+## 🎯 Сценарий 3: Обработка маркетплейсов
+
+### Получение заказов Flowwow
+
+```bash
+#!/bin/bash
+# Получение заказов Flowwow с различными параметрами
+
+cd /var/www/erp24
+
+# 1. Получение только новых (непрочитанных) писем
+php yii marketplace/get-flowwow-orders --unseen=1
+
+# 2. Получение заказов за конкретную дату
+php yii marketplace/get-flowwow-orders --date=2025-11-25
+
+# 3. Получение всех заказов начиная с даты
+php yii marketplace/get-flowwow-orders --date=2025-11-01 --since=1
+
+# 4. Получение из старого почтового ящика
+php yii marketplace/get-flowwow-orders --oldMail=1 --unseen=1
+
+# 5. Получение всех сообщений (включая прочитанные)
+php yii marketplace/get-flowwow-orders --date=2025-11-25 --seen=1 --unseen=1
+```
+
+### Получение заказов Yandex Market
+
+```bash
+#!/bin/bash
+# Получение и обработка заказов Yandex Market
+
+cd /var/www/erp24
+
+echo "Получение заказов Yandex Market: $(date)"
+
+# Получение заказов за вчера
+php yii marketplace/get-yandex-orders
+
+# Проверка количества новых заказов
+NEW_ORDERS=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM marketplace_orders
+ WHERE marketplace_id = 2
+ AND created_at >= NOW() - INTERVAL '1 day'")
+
+echo "Новых заказов Yandex: $NEW_ORDERS"
+
+# Если есть новые заказы - отправить уведомление
+if [ $NEW_ORDERS -gt 0 ]; then
+ echo "Обнаружено $NEW_ORDERS новых заказов Yandex Market"
+fi
+```
+
+### Обновление остатков на маркетплейсах
+
+```bash
+#!/bin/bash
+# Обновление остатков товаров на Yandex Market
+
+cd /var/www/erp24
+
+echo "Обновление остатков на Yandex Market: $(date)"
+
+# Обновление остатков
+php yii marketplace/yandex >> /var/log/erp24/marketplace-sync.log 2>&1
+
+if [ $? -eq 0 ]; then
+ echo "✓ Остатки обновлены успешно"
+
+ # Проверка наличия товаров в продаже
+ ACTIVE_PRODUCTS=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(DISTINCT product_1c_id)
+ FROM matrix_erp
+ WHERE is_active = true")
+
+ echo "Активных товаров на маркетплейсах: $ACTIVE_PRODUCTS"
+else
+ echo "✗ Ошибка обновления остатков"
+fi
+```
+
+---
+
+## 🎯 Сценарий 4: Управление бонусами
+
+### Начисление бонусов за покупки
+
+```bash
+#!/bin/bash
+# Обработка бонусов с детальным логированием
+
+cd /var/www/erp24
+
+LOG_FILE="/var/log/erp24/bonus-processing-$(date +%Y%m%d).log"
+
+echo "=== Обработка бонусов: $(date) ===" >> $LOG_FILE
+
+# 1. Основная обработка (добавление клиентов + начисление)
+echo "1. Добавление новых клиентов и начисление бонусов..." >> $LOG_FILE
+php yii bonus/add-new-user-and-bonus >> $LOG_FILE 2>&1
+
+# 2. Обновление балансов
+echo "2. Обновление балансов клиентов..." >> $LOG_FILE
+php yii bonus/update-user-bonus-balance >> $LOG_FILE 2>&1
+
+# 3. Проверка клиентов с отрицательным балансом
+NEGATIVE_BALANCE=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM users WHERE balans < 0")
+
+if [ $NEGATIVE_BALANCE -gt 0 ]; then
+ echo "ВНИМАНИЕ: $NEGATIVE_BALANCE клиентов с отрицательным балансом" >> $LOG_FILE
+ echo "Запуск корректировки..." >> $LOG_FILE
+ php yii bonus/balance-correction >> $LOG_FILE 2>&1
+fi
+
+echo "=== Обработка завершена: $(date) ===" >> $LOG_FILE
+echo "" >> $LOG_FILE
+```
+
+### Промо-акция: массовое начисление бонусов
+
+```bash
+#!/bin/bash
+# Пример: Начисление 500 бонусов всем подписчикам Telegram
+
+cd /var/www/erp24
+
+# Создаем временный скрипт для начисления
+cat > /tmp/promo_bonus.php << 'EOF'
+<?php
+require(__DIR__ . '/../../vendor/autoload.php');
+require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
+
+$config = require(__DIR__ . '/../../config/console.php');
+$application = new yii\console\Application($config);
+
+use yii_app\records\Users;
+use yii_app\records\UsersBonus;
+
+$users = Users::find()
+ ->where(['telegram_is_subscribed' => 1])
+ ->all();
+
+foreach ($users as $user) {
+ $bonus = new UsersBonus();
+ $bonus->phone = $user->phone;
+ $bonus->name = "Промо-акция: 500 бонусов подписчикам";
+ $bonus->tip = 'plus';
+ $bonus->tip_sale = 'promo202511';
+ $bonus->bonus = 500;
+ $bonus->date = date('Y-m-d H:i:s');
+ $bonus->date_start = $bonus->date;
+ $bonus->date_end = date('Y-m-d H:i:s', strtotime('+30 days'));
+ $bonus->save();
+
+ echo "Начислено {$user->phone}: 500 бонусов\n";
+}
+
+echo "\nВсего обработано: " . count($users) . " клиентов\n";
+EOF
+
+php /tmp/promo_bonus.php
+rm /tmp/promo_bonus.php
+```
+
+---
+
+## 🎯 Сценарий 5: Автоматическое закрытие смен
+
+### Закрытие зависших смен
+
+```bash
+#!/bin/bash
+# Автоматическое закрытие смен с уведомлениями
+
+cd /var/www/erp24
+
+LOG_FILE="/var/log/erp24/autoclose-$(date +%Y%m%d-%H%M).log"
+
+echo "=== Автозакрытие смен: $(date) ===" >> $LOG_FILE
+
+# Проверка количества открытых смен старше 14 часов
+OPEN_SHIFTS=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM timetable_fact
+ WHERE is_close = false
+ AND CONCAT(date_start, ' ', time_start) <= NOW() - INTERVAL '14 hours'")
+
+echo "Найдено открытых смен старше 14 часов: $OPEN_SHIFTS" >> $LOG_FILE
+
+if [ $OPEN_SHIFTS -gt 0 ]; then
+ # Выполнить автозакрытие
+ php yii timetable/autoclose-shifts >> $LOG_FILE 2>&1
+
+ echo "Автозакрытие выполнено" >> $LOG_FILE
+
+ # Получить список сотрудников с автозакрытыми сменами
+ psql -U erp24 -d erp24 -c \
+ "SELECT a.fio, tf.date_start, tf.time_start
+ FROM timetable_fact tf
+ JOIN admin a ON a.id = tf.admin_id
+ WHERE tf.autoclosed = 1
+ AND tf.date_end = CURRENT_DATE" >> $LOG_FILE
+else
+ echo "Нет смен для автозакрытия" >> $LOG_FILE
+fi
+
+echo "=== Завершено: $(date) ===" >> $LOG_FILE
+```
+
+### Отчет по незакрытым сменам
+
+```bash
+#!/bin/bash
+# Генерация отчета по незакрытым сменам
+
+cd /var/www/erp24
+
+echo "=== Отчет по незакрытым сменам ==="
+echo "Дата: $(date)"
+echo ""
+
+# Смены старше 10 часов (предупреждение)
+echo "⚠️ Смены открыты более 10 часов:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ a.fio AS \"Сотрудник\",
+ cs.name AS \"Магазин\",
+ tf.date_start AS \"Дата\",
+ tf.time_start AS \"Время начала\",
+ EXTRACT(HOUR FROM (NOW() - (tf.date_start || ' ' || tf.time_start)::timestamp)) AS \"Часов открыта\"
+ FROM timetable_fact tf
+ JOIN admin a ON a.id = tf.admin_id
+ JOIN city_store cs ON cs.id = tf.store_id
+ WHERE tf.is_close = false
+ AND (tf.date_start || ' ' || tf.time_start)::timestamp <= NOW() - INTERVAL '10 hours'
+ ORDER BY tf.date_start, tf.time_start"
+
+echo ""
+echo "📊 Статистика:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ COUNT(*) AS \"Всего открытых смен\",
+ COUNT(*) FILTER (WHERE (date_start || ' ' || time_start)::timestamp <= NOW() - INTERVAL '10 hours') AS \"Старше 10 часов\",
+ COUNT(*) FILTER (WHERE (date_start || ' ' || time_start)::timestamp <= NOW() - INTERVAL '14 hours') AS \"Старше 14 часов (автозакрытие)\"
+ FROM timetable_fact
+ WHERE is_close = false"
+```
+
+---
+
+## 🎯 Сценарий 6: Мониторинг и диагностика
+
+### Проверка состояния системы
+
+```bash
+#!/bin/bash
+# Комплексная проверка состояния ERP24
+
+echo "=== МОНИТОРИНГ СИСТЕМЫ ERP24 ==="
+echo "Дата: $(date)"
+echo ""
+
+# 1. Проверка активных процессов
+echo "1. Активные консольные процессы:"
+ps aux | grep "php yii" | grep -v grep | awk '{print $2, $9, $10, $11, $12}'
+echo ""
+
+# 2. Проверка последних синхронизаций
+echo "2. Последние синхронизации с 1С:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ request_id,
+ created_at,
+ CASE
+ WHEN response_status = 'success' THEN '✓ Успешно'
+ ELSE '✗ Ошибка'
+ END as status
+ FROM api_cron
+ ORDER BY created_at DESC
+ LIMIT 5"
+echo ""
+
+# 3. Проверка обработки бонусов
+echo "3. Статистика бонусов за сегодня:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ tip,
+ tip_sale,
+ COUNT(*) as count,
+ SUM(bonus) as total_bonus
+ FROM users_bonus
+ WHERE date >= CURRENT_DATE
+ GROUP BY tip, tip_sale
+ ORDER BY tip, tip_sale"
+echo ""
+
+# 4. Проверка маркетплейсов
+echo "4. Новые заказы маркетплейсов за сегодня:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ m.name as marketplace,
+ COUNT(*) as orders_count,
+ SUM(mo.total_price) as total_sum
+ FROM marketplace_orders mo
+ JOIN marketplace_store m ON m.id = mo.marketplace_id
+ WHERE mo.created_at >= CURRENT_DATE
+ GROUP BY m.name"
+echo ""
+
+# 5. Проверка автозакрытых смен
+echo "5. Автозакрытые смены за сегодня:"
+psql -U erp24 -d erp24 -c \
+ "SELECT COUNT(*) as autoclose_count
+ FROM timetable_fact
+ WHERE autoclosed = 1 AND date_end = CURRENT_DATE"
+echo ""
+
+# 6. Проверка размера логов
+echo "6. Размер лог-файлов:"
+du -sh /var/log/erp24/* | sort -h | tail -10
+echo ""
+
+# 7. Проверка свободного места
+echo "7. Свободное место на диске:"
+df -h | grep -E "Filesystem|/var"
+echo ""
+
+echo "=== КОНЕЦ ОТЧЕТА ==="
+```
+
+### Проверка ошибок в логах
+
+```bash
+#!/bin/bash
+# Поиск ошибок в логах за последний час
+
+echo "=== АНАЛИЗ ОШИБОК ЗА ПОСЛЕДНИЙ ЧАС ==="
+echo "Дата: $(date)"
+echo ""
+
+LOG_DIR="/var/log/erp24"
+HOUR_AGO=$(date -d '1 hour ago' '+%Y-%m-%d %H:')
+
+# Поиск ошибок в логах
+echo "1. Ошибки в логах бонусов:"
+grep -i "error\|exception\|fatal" $LOG_DIR/bonus-*.log | \
+ grep "$HOUR_AGO" | \
+ tail -20
+echo ""
+
+echo "2. Ошибки синхронизации с 1С:"
+grep -i "error\|exception\|fatal" $LOG_DIR/cron-1c.log | \
+ grep "$HOUR_AGO" | \
+ tail -20
+echo ""
+
+echo "3. Ошибки маркетплейсов:"
+grep -i "error\|exception\|fatal" $LOG_DIR/marketplace-*.log | \
+ grep "$HOUR_AGO" | \
+ tail -20
+echo ""
+
+# Проверка в БД
+echo "4. Ошибки API за последний час:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ date,
+ api,
+ error_message
+ FROM api_logs
+ WHERE date >= NOW() - INTERVAL '1 hour'
+ AND error_message IS NOT NULL
+ ORDER BY date DESC
+ LIMIT 20"
+echo ""
+
+echo "=== КОНЕЦ АНАЛИЗА ==="
+```
+
+---
+
+## 🎯 Сценарий 7: Административные задачи
+
+### Обновление магазинов для сотрудников
+
+```bash
+#!/bin/bash
+# Обновление связей сотрудников с магазинами
+
+cd /var/www/erp24
+
+echo "Обновление связей Admin <-> Stores"
+
+# Запуск обновления
+php yii admin/update-stores
+
+# Проверка результата
+echo ""
+echo "Статистика после обновления:"
+psql -U erp24 -d erp24 -c \
+ "SELECT
+ COUNT(DISTINCT admin_id) as admins_count,
+ COUNT(*) as total_links
+ FROM admin_stores"
+```
+
+### Синхронизация клиентов из Salebot
+
+```bash
+#!/bin/bash
+# Получение клиентов из мессенджеров
+
+cd /var/www/erp24
+
+LOG_FILE="/var/log/erp24/salebot-sync-$(date +%Y%m%d).log"
+
+echo "=== Синхронизация клиентов Salebot: $(date) ===" >> $LOG_FILE
+
+# Количество клиентов до синхронизации
+BEFORE=$(psql -U erp24 -d erp24 -t -c "SELECT COUNT(*) FROM messager_user")
+echo "Клиентов до синхронизации: $BEFORE" >> $LOG_FILE
+
+# Выполнить синхронизацию
+php yii client/retrieve >> $LOG_FILE 2>&1
+
+# Количество клиентов после
+AFTER=$(psql -U erp24 -d erp24 -t -c "SELECT COUNT(*) FROM messager_user")
+echo "Клиентов после синхронизации: $AFTER" >> $LOG_FILE
+
+NEW_CLIENTS=$((AFTER - BEFORE))
+echo "Добавлено новых клиентов: $NEW_CLIENTS" >> $LOG_FILE
+
+echo "=== Завершено: $(date) ===" >> $LOG_FILE
+```
+
+### Экспорт вложений из старых документов списания
+
+```bash
+#!/bin/bash
+# Экспорт вложений для архивации
+
+cd /var/www/erp24
+
+EXPORT_DIR="/var/backups/erp24/writeoffs"
+mkdir -p $EXPORT_DIR
+
+echo "Экспорт вложений списаний старше 2 месяцев"
+
+# Экспорт в JSON
+php yii write-offs-attachments/export-old
+
+# Копирование JSON файлов в архив
+cp runtime/attachments_older_than_month_*.json $EXPORT_DIR/
+cp runtime/old_files.txt $EXPORT_DIR/
+
+echo "Файлы сохранены в: $EXPORT_DIR"
+
+# Подсчет количества вложений
+FILE_COUNT=$(wc -l < runtime/old_files.txt)
+echo "Всего вложений для архивации: $FILE_COUNT"
+
+# Расчет общего размера
+TOTAL_SIZE=0
+while IFS= read -r url; do
+ FILE_PATH="erp24/media/$url"
+ if [ -f "$FILE_PATH" ]; then
+ SIZE=$(stat -f%z "$FILE_PATH" 2>/dev/null || stat -c%s "$FILE_PATH" 2>/dev/null)
+ TOTAL_SIZE=$((TOTAL_SIZE + SIZE))
+ fi
+done < runtime/old_files.txt
+
+echo "Общий размер: $((TOTAL_SIZE / 1024 / 1024)) MB"
+```
+
+---
+
+## 🎯 Сценарий 8: Отладка и тестирование
+
+### Тестовый запуск команды
+
+```bash
+#!/bin/bash
+# Тестовый запуск с детальным выводом
+
+cd /var/www/erp24
+
+# Включить режим отладки
+export YII_DEBUG=true
+export YII_ENV=dev
+
+# Запуск команды с замером времени
+echo "Начало: $(date)"
+START_TIME=$(date +%s)
+
+php yii cron/one-c-check-one-day
+
+END_TIME=$(date +%s)
+DURATION=$((END_TIME - START_TIME))
+
+echo "Завершено: $(date)"
+echo "Время выполнения: $DURATION секунд"
+```
+
+### Проверка команды с блокировкой
+
+```bash
+#!/bin/bash
+# Запуск команды с защитой от параллельного выполнения
+
+LOCK_FILE="/tmp/erp24-bonus-processing.lock"
+
+# Проверка наличия блокировки
+if [ -f "$LOCK_FILE" ]; then
+ PID=$(cat "$LOCK_FILE")
+
+ # Проверка, жив ли процесс
+ if ps -p $PID > /dev/null 2>&1; then
+ echo "Процесс уже запущен (PID: $PID)"
+ exit 1
+ else
+ echo "Найдена старая блокировка, удаляем..."
+ rm "$LOCK_FILE"
+ fi
+fi
+
+# Создать блокировку
+echo $$ > "$LOCK_FILE"
+
+# Выполнить команду
+cd /var/www/erp24
+php yii bonus/add-new-user-and-bonus
+
+# Удалить блокировку
+rm "$LOCK_FILE"
+```
+
+### Запуск с использованием flock
+
+```bash
+#!/bin/bash
+# Более надежный способ блокировки через flock
+
+cd /var/www/erp24
+
+# Запуск с блокировкой (не даст запуститься параллельно)
+flock -n /tmp/bonus-processing.lock -c \
+ "php yii bonus/add-new-user-and-bonus" || \
+ echo "Команда уже выполняется, пропускаем"
+```
+
+---
+
+## 🎯 Сценарий 9: Backup и восстановление
+
+### Создание резервной копии перед массовой операцией
+
+```bash
+#!/bin/bash
+# Создание бэкапа перед массовым начислением бонусов
+
+BACKUP_DIR="/var/backups/erp24/$(date +%Y%m%d_%H%M%S)"
+mkdir -p $BACKUP_DIR
+
+echo "Создание резервной копии..."
+
+# Бэкап таблицы бонусов
+pg_dump -U erp24 -d erp24 -t users_bonus > $BACKUP_DIR/users_bonus.sql
+
+# Бэкап таблицы клиентов
+pg_dump -U erp24 -d erp24 -t users > $BACKUP_DIR/users.sql
+
+echo "Резервная копия создана: $BACKUP_DIR"
+
+# Выполнение операции
+cd /var/www/erp24
+php yii bonus/add-new-user-and-bonus
+
+# Проверка результата
+if [ $? -eq 0 ]; then
+ echo "✓ Операция выполнена успешно"
+ echo "Резервная копия сохранена в: $BACKUP_DIR"
+else
+ echo "✗ Ошибка выполнения"
+ echo "Для восстановления используйте:"
+ echo " psql -U erp24 -d erp24 < $BACKUP_DIR/users_bonus.sql"
+fi
+```
+
+---
+
+## 📊 Полезные скрипты для мониторинга
+
+### Dashboard всех консольных команд
+
+```bash
+#!/bin/bash
+# /var/www/erp24/scripts/console_dashboard.sh
+
+clear
+echo "╔═══════════════════════════════════════════════╗"
+echo "║ ERP24 CONSOLE COMMANDS DASHBOARD ║"
+echo "╚═══════════════════════════════════════════════╝"
+echo ""
+
+# Активные процессы
+echo "🔄 АКТИВНЫЕ ПРОЦЕССЫ:"
+ps aux | grep "php yii" | grep -v grep | \
+ awk '{printf " • %s (PID: %s, CPU: %s%%, MEM: %s%%, Время: %s)\n", $11, $2, $3, $4, $10}'
+echo ""
+
+# Статистика за сегодня
+echo "📊 СТАТИСТИКА ЗА СЕГОДНЯ:"
+echo ""
+
+# 1С синхронизации
+echo " 1С Синхронизации:"
+ONEC_SUCCESS=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM api_cron
+ WHERE created_at >= CURRENT_DATE
+ AND response_status = 'success'")
+echo " ✓ Успешных: $ONEC_SUCCESS"
+
+# Бонусы
+BONUS_TODAY=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM users_bonus WHERE date >= CURRENT_DATE")
+echo " Бонусы:"
+echo " • Операций: $BONUS_TODAY"
+
+# Маркетплейсы
+ORDERS_TODAY=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM marketplace_orders WHERE created_at >= CURRENT_DATE")
+echo " Маркетплейсы:"
+echo " • Новых заказов: $ORDERS_TODAY"
+
+# Смены
+AUTOCLOSED=$(psql -U erp24 -d erp24 -t -c \
+ "SELECT COUNT(*) FROM timetable_fact
+ WHERE autoclosed = 1 AND date_end = CURRENT_DATE")
+echo " Смены:"
+echo " • Автозакрытых: $AUTOCLOSED"
+
+echo ""
+echo "📁 РАЗМЕР ЛОГОВ:"
+du -sh /var/log/erp24 2>/dev/null || echo " Директория логов не найдена"
+
+echo ""
+echo "💾 СВОБОДНОЕ МЕСТО:"
+df -h | grep -E "/var" | awk '{printf " %s: %s свободно из %s (%s занято)\n", $6, $4, $2, $5}'
+
+echo ""
+echo "─────────────────────────────────────────────"
+echo "Обновлено: $(date)"
+```
+
+---
+
+**Документ создан:** 2025-11-25
+**Версия:** 1.0
+**Автор:** ERP24 Documentation Team
+**Статус:** ✅ Практические примеры для всех сценариев
--- /dev/null
+# Консольные команды ERP24
+
+**Дата создания:** 2025-11-25
+**Версия:** 1.0
+**Статус:** Полная документация
+
+---
+
+## 📋 Обзор
+
+Система ERP24 включает **62 консольные команды**, реализованные в **17 контроллерах**. Консольные команды используются для автоматизации задач через cron, фоновой обработки данных, синхронизации с внешними системами и административных операций.
+
+### Назначение
+
+Консольные команды выполняют:
+- 🔄 Автоматическую синхронизацию с 1С
+- 💰 Расчет бонусов клиентов
+- 📊 Обновление статистики и рейтингов
+- 🔔 Отправку уведомлений (Telegram, WhatsApp)
+- 🛒 Обработку маркетплейсов (Yandex, Flowwow)
+- 🧹 Очистку старых данных
+- ⏰ Автоматическое закрытие смен
+- 📧 Управление рассылками
+
+---
+
+## 📊 Статистика
+
+| Метрика | Значение |
+|---------|----------|
+| **Всего контроллеров** | 17 |
+| **Всего команд** | 62 |
+| **Cron-задач** | 28+ |
+| **Бонусных команд** | 9 |
+| **Маркетплейс команд** | 5 |
+| **Административных команд** | 8 |
+
+---
+
+## 🗂️ Структура документации
+
+```
+erp24/commands/
+├── CronController.php (28 команд) - Основные cron-задачи
+├── BonusController.php (9 команд) - Управление бонусами клиентов
+├── MarketplaceController.php (5 команд) - Интеграция с маркетплейсами
+├── TimetableController.php (1 команда) - Автозакрытие смен
+├── AdminController.php (1 команда) - Управление сотрудниками
+├── ClientController.php (2 команды) - Синхронизация клиентов
+├── WriteOffsAttachmentsController.php (2) - Экспорт вложений списаний
+├── CronClearController.php (2 команды) - Очистка логов
+├── AlertsController.php (2 команды) - Система алертов и триггеров
+├── AuthController.php (2 команды) - Аутентификация
+├── AssignmentController.php (1 команда) - Назначения RBAC
+├── EnvController.php (2 команды) - Управление окружением
+├── SelfCostController.php (2 команды) - Себестоимость
+├── PriceController.php (1 команда) - Управление ценами
+├── MatrixErpController.php (1 команда) - Матричные данные
+├── HelloController.php (1 команда) - Тестовая команда
+└── AlertsJob.php - Job для обработки алертов
+```
+
+---
+
+## 🎯 Основные контроллеры
+
+### 1. CronController (28 команд)
+
+**Назначение:** Центральный контроллер для всех регулярных задач, выполняемых по расписанию.
+
+**Файл:** `erp24/commands/CronController.php`
+
+#### Команды синхронизации с 1С
+
+| Команда | Назначение | Частота | Приоритет |
+|---------|------------|---------|-----------|
+| `one-c` | Полная синхронизация (чеки, списания, поступления) | Каждый час | Высокий |
+| `one-c-check-one-day` | Синхронизация чеков за сутки | 4 раза в день | Высокий |
+| `one-c-sellers` | Синхронизация продавцов и номенклатуры | 2 раза в день | Средний |
+| `one-c-price` | Синхронизация цен и остатков | 1 раз в день | Средний |
+| `one-c-balances` | Синхронизация остатков товаров | Каждые 2 часа | Высокий |
+| `custom-one-c-cron` | Кастомная синхронизация (настраиваемая) | По запросу | Низкий |
+| `one-c-cron-self-cost-day` | Синхронизация себестоимости | 1 раз в день | Средний |
+| `one-c-cron-analysts` | Синхронизация аналитики | 1 раз в день | Средний |
+
+**Пример запуска:**
+```bash
+# Полная синхронизация с 1С
+php yii cron/one-c
+
+# Синхронизация чеков за сутки
+php yii cron/one-c-check-one-day
+
+# Синхронизация остатков
+php yii cron/one-c-balances
+```
+
+#### Команды маркетплейсов
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `marketplace-order-one-c-statuses` | Синхронизация статусов заказов | 1 раз в день |
+| `marketplace-orders-one-c-cron` | Обработка заказов маркетплейсов | Каждый час |
+
+#### Команды когортного анализа и рассылок
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `generate-target-kogorts` | Генерация целевых когорт для рассылок | 1 раз в день |
+| `generate-whatsapp-kogorts` | Генерация когорт для WhatsApp | 1 раз в день |
+| `generate-call-kogorts` | Генерация когорт для обзвона | По запросу |
+| `send-first-telegram-message` | Отправка первой волны Telegram | По расписанию |
+| `send-second-telegram-message` | Отправка второй волны Telegram | По расписанию |
+| `send-telegram-promo-message` | Отправка промо в Telegram | По акциям |
+| `send-whatsapp-message` | Отправка сообщений WhatsApp | По расписанию |
+| `get-whatsapp-message-history` | Получение истории WhatsApp | 1 раз в час |
+| `check-whatsapp-limit` | Проверка лимитов WhatsApp API | 1 раз в час |
+
+**Пример запуска:**
+```bash
+# Генерация когорт и отправка первой волны
+php yii cron/generate-target-kogorts
+php yii cron/send-first-telegram-message
+
+# Проверка лимитов WhatsApp
+php yii cron/check-whatsapp-limit
+```
+
+#### Команды обслуживания
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `balance-history` | Сохранение истории остатков | 1 раз в день |
+| `sync-telegram-users` | Синхронизация пользователей Telegram | 1 раз в час |
+| `update-user-subscribe` | Обновление статусов подписок | 1 раз в день |
+| `update-bonus-levels` | Пересчет уровней бонусной программы | 1 раз в день |
+| `send-contacts-to-lptracker` | Отправка контактов в LPTracker | По запросу |
+
+#### Команды автопланограммы
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `autoplannogramma-calculate` | Расчет автоматической планограммы | 1 раз в неделю |
+| `autoplannogramma-recalculate` | Пересчет планограммы | По запросу |
+
+**Пример запуска:**
+```bash
+# Расчет планограммы для всех магазинов
+php yii cron/autoplannogramma-calculate
+
+# Пересчет с параметрами
+php yii cron/autoplannogramma-recalculate --storeId=5
+```
+
+---
+
+### 2. BonusController (9 команд)
+
+**Назначение:** Управление бонусной программой клиентов, начисление и списание бонусов.
+
+**Файл:** `erp24/commands/BonusController.php`
+
+#### Основные команды
+
+| Команда | Назначение | Частота | Описание |
+|---------|------------|---------|----------|
+| `add-new-user-and-bonus` | Добавление новых клиентов и начисление бонусов | 4 раза в день | Основная команда обработки продаж |
+| `add` | Начисление бонусов на памятные даты | 1 раз в день | Автоматическое начисление к датам |
+| `dell` | Сгорание бонусов по датам | 1 раз в день | Списание просроченных бонусов |
+| `dell-promo` | Сгорание промо-бонусов | 1 раз в день | Списание промо бонусов |
+| `update-user-bonus-balance` | Обновление баланса бонусов | 4 раза в день | Пересчет балансов клиентов |
+| `balance-correction` | Корректировка отрицательных балансов | По запросу | Исправление минусовых балансов |
+| `plus-100-contest` | Начисление 100 бонусов за конкурс | Разовая | Промо-акция |
+| `plus-300-on-14-feb` | Начисление 300 бонусов ко Дню Влюбленных | Разовая | Промо-акция |
+| `bonus-remove-from-return-sales` | Удаление бонусов при возврате | Автоматически | Обработка возвратов |
+
+#### Пример запуска:
+
+```bash
+# Основной процесс обработки продаж и бонусов
+php yii bonus/add-new-user-and-bonus
+
+# Начисление бонусов на памятные даты (запускать ежедневно)
+php yii bonus/add
+
+# Сгорание просроченных бонусов (запускать ежедневно)
+php yii bonus/dell
+
+# Сгорание промо-бонусов (запускать ежедневно)
+php yii bonus/dell-promo
+
+# Обновление балансов клиентов
+php yii bonus/update-user-bonus-balance
+
+# Корректировка отрицательных балансов (разово или при проблемах)
+php yii bonus/balance-correction
+```
+
+#### Логика работы
+
+**addNewUserAndBonus():**
+1. Выбирает продажи за последние 5 дней
+2. Проверяет наличие клиента в базе
+3. Если клиент новый - создает запись Users
+4. Начисляет 10% кэшбек от суммы покупки (срок 366 дней)
+5. Начисляет 20% от первой покупки (срок 90 дней)
+6. Удаляет бонусы при возврате товара
+
+**Пример кода:**
+```php
+// Начисление бонуса 10% от покупки
+$percentBonus = 10;
+$daysActiveBonus = 366;
+$back = round($summ * ($percentBonus / 100));
+
+$userBonus = new UsersBonus;
+$userBonus->tip = 'plus';
+$userBonus->tip_sale = 'sale';
+$userBonus->bonus = $back;
+$userBonus->date_start = date('Y-m-d H:i:s', strtotime('+1 day'));
+$userBonus->date_end = date('Y-m-d H:i:s', strtotime('+366 day'));
+$userBonus->save();
+```
+
+**add() - Начисление на даты:**
+```bash
+# Логика:
+# - За 2 дня до памятной даты + 1 день после
+# - Начисляет 200 бонусов
+# - Срок действия: до следующего дня после даты
+```
+
+**dell() - Сгорание бонусов:**
+```bash
+# Логика:
+# - Проверяет бонусы с истекшим date_end
+# - Учитывает частичное использование (вычитает списанное)
+# - Создает запись с tip='minus' и tip_sale='date'
+# - Помечает исходную запись как dell=1
+```
+
+---
+
+### 3. TimetableController (1 команда)
+
+**Назначение:** Автоматическое управление расписанием смен сотрудников.
+
+**Файл:** `erp24/commands/TimetableController.php`
+
+#### Команда
+
+| Команда | Назначение | Частота | Критичность |
+|---------|------------|---------|--------------|
+| `autoclose-shifts` | Автоматическое закрытие "зависших" смен | Каждый час | Высокая |
+
+**Описание:**
+- Находит смены, которые начались более 14 часов назад и не закрыты
+- Автоматически создает запись закрытия смены
+- Устанавливает рабочее время = 12 часов
+- Ставит комментарий "Закрыта автоматически"
+- Выставляет 5 баллов (штраф за незакрытую смену)
+
+**Пример запуска:**
+```bash
+# Автоматическое закрытие зависших смен
+php yii timetable/autoclose-shifts
+```
+
+**Логика работы:**
+```php
+// Поиск незакрытых смен старше 14 часов
+$timetableFactModels = TimetableFactModel::find()
+ ->andWhere(['!=', 'is_close', true])
+ ->andWhere(['<=', 'CONCAT(date_start, \' \', time_start)',
+ date('Y-m-d H:i:s', strtotime('-14 hours'))])
+ ->all();
+
+// Для каждой смены:
+// 1. Создать AdminCheckin с type_id = TYPE_END
+// 2. Установить time = date_start + 14 hours
+// 3. Установить ball = 5 (штраф)
+// 4. Обновить TimetableFactModel:
+// - is_close = true
+// - autoclosed = 1
+// - work_time = 12
+// - comment = 'Закрыта автоматически'
+```
+
+---
+
+### 4. MarketplaceController (5 команд)
+
+**Назначение:** Интеграция с маркетплейсами Yandex Market и Flowwow.
+
+**Файл:** `erp24/commands/MarketplaceController.php`
+
+#### Команды
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `yandex` | Обновление остатков на Yandex Market | 1 раз в час |
+| `get-flowwow-orders` | Получение заказов из Flowwow (email) | Каждые 15 минут |
+| `get-yandex-orders` | Получение заказов из Yandex Market | Каждые 15 минут |
+| `fix-json-encoding` | Исправление кодировки JSON в заказах | По запросу |
+| `flowwow-feed-file` | Генерация XML-фида для Flowwow | 1 раз в день |
+
+**Пример запуска:**
+
+```bash
+# Обновление остатков на Yandex
+php yii marketplace/yandex
+
+# Получение заказов Flowwow с определенной даты
+php yii marketplace/get-flowwow-orders --date=2025-01-01
+
+# Получение заказов Flowwow с учетом SEEN/UNSEEN
+php yii marketplace/get-flowwow-orders --unseen=1
+
+# Получение заказов Flowwow из старого ящика
+php yii marketplace/get-flowwow-orders --oldMail=1
+
+# Получение заказов Yandex за вчера
+php yii marketplace/get-yandex-orders
+
+# Генерация XML-фида для Flowwow
+php yii marketplace/flowwow-feed-file
+
+# Исправление кодировки в заказах
+php yii marketplace/fix-json-encoding
+```
+
+#### Параметры команды get-flowwow-orders
+
+| Параметр | Тип | Описание |
+|----------|-----|----------|
+| `--date` | string | Дата в формате YYYY-MM-DD |
+| `--since` | int | 1 = забирать начиная с даты, 0 = только за дату |
+| `--oldMail` | int | 1 = старый ящик, 0 = новый ящик |
+| `--seen` | int | 1 = только прочитанные письма |
+| `--unseen` | int | 1 = только непрочитанные письма |
+
+---
+
+### 5. AdminController (1 команда)
+
+**Назначение:** Управление данными сотрудников.
+
+**Файл:** `erp24/commands/AdminController.php`
+
+#### Команда
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `update-stores` | Обновление связи сотрудников с магазинами | По запросу |
+
+**Описание:**
+- Читает `store_arr` и `store_arr_guid` из таблицы Admin
+- Создает записи в AdminStores на основе GUID магазинов
+- Сопоставляет GUID с ID магазинов через ExportImportTable
+
+**Пример запуска:**
+```bash
+php yii admin/update-stores
+```
+
+---
+
+### 6. ClientController (2 команды)
+
+**Назначение:** Синхронизация данных клиентов с внешними системами.
+
+**Файл:** `erp24/commands/ClientController.php`
+
+#### Команды
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `retrieve` | Получение клиентов из Salebot (мессенджеры) | 1 раз в день |
+| `refresh-users-database` | Обновление базы клиентов из текстового файла | По запросу |
+
+**Описание retrieve:**
+- Подключается к API Salebot (chatter.salebot.pro)
+- Получает список клиентов (offset по 500)
+- Получает подписчиков за последние 500 дней
+- Извлекает переменные (phone, notSubscribed)
+- Сохраняет в таблицу MessagerUser
+
+**Пример запуска:**
+```bash
+# Синхронизация с Salebot
+php yii client/retrieve
+
+# Обновление из файла refresh_clients.txt
+php yii client/refresh-users-database
+```
+
+---
+
+### 7. WriteOffsAttachmentsController (2 команды)
+
+**Назначение:** Экспорт и управление вложениями в документах списания.
+
+**Файл:** `erp24/commands/WriteOffsAttachmentsController.php`
+
+#### Команды
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `export-old` | Экспорт вложений документов старше 2 месяцев в JSON | По запросу |
+| `print-old` | Вывод списка старых вложений на экран | По запросу |
+
+**Описание:**
+- Находит документы WriteOffsErp старше 2 месяцев
+- Извлекает все вложения (фото, видео)
+- Экспортирует в JSON файл: `runtime/attachments_older_than_month_YYYYmmdd_His.json`
+- Создает дополнительный файл `old_files.txt` со списком URL
+
+**Пример запуска:**
+```bash
+# Экспорт в JSON
+php yii write-offs-attachments/export-old
+
+# Вывод на экран
+php yii write-offs-attachments/print-old
+```
+
+**Формат вывода:**
+```json
+{
+ "generated_at": "2025-11-25 10:00:00",
+ "border_date": "2025-09-25 10:00:00",
+ "items": [
+ {
+ "id": 123,
+ "doc_date": "2025-08-15",
+ "attachments": [
+ {
+ "id": 456,
+ "url": "/uploads/writeoffs/photo_123.jpg",
+ "created_at": "2025-08-15 14:30:00"
+ }
+ ]
+ }
+ ]
+}
+```
+
+---
+
+### 8. CronClearController (2 команды)
+
+**Назначение:** Очистка старых данных и логов.
+
+**Файл:** `erp24/commands/CronClearController.php`
+
+#### Команды
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `index` | Тестовая команда | - |
+| `clear-old-api-logs` | Удаление логов API старше 8 дней | 1 раз в день |
+
+**Пример запуска:**
+```bash
+# Очистка старых логов API
+php yii cron-clear/clear-old-api-logs
+```
+
+**Логика:**
+```sql
+DELETE FROM api_logs
+WHERE date < NOW() - INTERVAL '8 days'
+```
+
+---
+
+### 9. AlertsController (2 команды)
+
+**Назначение:** Система алертов и автоматических триггеров для задач.
+
+**Файл:** `erp24/commands/AlertsController.php`
+
+#### Команды
+
+| Команда | Назначение | Частота |
+|---------|------------|---------|
+| `index` | Проверка и отправка алертов по задачам | Каждые 5 минут |
+| `trigger-by-time` | Создание задач по временным триггерам | Каждую минуту |
+
+**Описание index:**
+- Проверяет все активные задачи (Task)
+- Сопоставляет со статусами и уровнями алертов (TaskAlertLevel)
+- Если задача в статусе дольше заданного времени - отправляет алерт
+- Создает запись в TaskAlertLog
+
+**Описание trigger-by-time:**
+- Проверяет триггеры TaskTriggerTimeConditions
+- Сопоставляет с текущим временем (минуты, часы, дни, месяцы, дни недели)
+- Создает задачи из шаблонов TaskTemplates
+- Поддерживает wildcard '*' для любого значения
+
+**Пример запуска:**
+```bash
+# Проверка и отправка алертов
+php yii alerts/index
+
+# Создание задач по триггерам
+php yii alerts/trigger-by-time
+```
+
+**Формат триггеров (cron-подобный):**
+```
+minutes: * | 0,15,30,45
+hours: * | 9,12,15,18
+days: * | 1,15
+months: * | 1-12
+weekday: * | 1-7 (1=понедельник)
+```
+
+---
+
+## 🔄 Интеграция с Cron
+
+### Рекомендуемое расписание
+
+```bash
+# /etc/crontab или crontab -e
+
+# === 1С Синхронизация ===
+0 */1 * * * cd /var/www/erp24 && php yii cron/one-c >> /var/log/cron-1c.log 2>&1
+0 */2 * * * cd /var/www/erp24 && php yii cron/one-c-balances >> /var/log/cron-balances.log 2>&1
+0 6,12,18,23 * * * cd /var/www/erp24 && php yii cron/one-c-check-one-day >> /var/log/cron-checks.log 2>&1
+
+# === Бонусная программа ===
+0 3,9,15,21 * * * cd /var/www/erp24 && php yii bonus/add-new-user-and-bonus >> /var/log/bonus-main.log 2>&1
+30 3 * * * cd /var/www/erp24 && php yii bonus/add >> /var/log/bonus-dates.log 2>&1
+0 4 * * * cd /var/www/erp24 && php yii bonus/dell >> /var/log/bonus-expire.log 2>&1
+30 4 * * * cd /var/www/erp24 && php yii bonus/dell-promo >> /var/log/bonus-promo.log 2>&1
+
+# === Timetable ===
+0 */1 * * * cd /var/www/erp24 && php yii timetable/autoclose-shifts >> /var/log/timetable-autoclose.log 2>&1
+
+# === Маркетплейсы ===
+*/15 * * * * cd /var/www/erp24 && php yii marketplace/get-flowwow-orders --unseen=1 >> /var/log/marketplace-flowwow.log 2>&1
+*/15 * * * * cd /var/www/erp24 && php yii marketplace/get-yandex-orders >> /var/log/marketplace-yandex.log 2>&1
+0 */1 * * * cd /var/www/erp24 && php yii marketplace/yandex >> /var/log/marketplace-sync.log 2>&1
+0 5 * * * cd /var/www/erp24 && php yii marketplace/flowwow-feed-file >> /var/log/marketplace-feed.log 2>&1
+
+# === Когорты и рассылки ===
+0 10 * * * cd /var/www/erp24 && php yii cron/generate-target-kogorts >> /var/log/kogorts.log 2>&1
+30 10 * * * cd /var/www/erp24 && php yii cron/send-first-telegram-message >> /var/log/telegram-1.log 2>&1
+0 18 * * * cd /var/www/erp24 && php yii cron/send-second-telegram-message >> /var/log/telegram-2.log 2>&1
+0 */1 * * * cd /var/www/erp24 && php yii cron/get-whatsapp-message-history >> /var/log/whatsapp-history.log 2>&1
+
+# === Алерты и триггеры ===
+*/5 * * * * cd /var/www/erp24 && php yii alerts/index >> /var/log/alerts.log 2>&1
+* * * * * cd /var/www/erp24 && php yii alerts/trigger-by-time >> /var/log/triggers.log 2>&1
+
+# === Обслуживание ===
+0 5 * * * cd /var/www/erp24 && php yii cron-clear/clear-old-api-logs >> /var/log/cleanup.log 2>&1
+0 6 * * * cd /var/www/erp24 && php yii cron/update-bonus-levels >> /var/log/bonus-levels.log 2>&1
+0 2 * * * cd /var/www/erp24 && php yii cron/balance-history >> /var/log/balance-history.log 2>&1
+
+# === Планограмма ===
+0 3 * * 1 cd /var/www/erp24 && php yii cron/autoplannogramma-calculate >> /var/log/plannogramma.log 2>&1
+```
+
+---
+
+## 📝 Логирование и мониторинг
+
+### Рекомендации по логированию
+
+```bash
+# Создать директорию для логов
+mkdir -p /var/log/erp24/console
+chmod 755 /var/log/erp24/console
+
+# Настроить ротацию логов
+# /etc/logrotate.d/erp24-console
+/var/log/erp24/console/*.log {
+ daily
+ rotate 30
+ compress
+ delaycompress
+ missingok
+ notifempty
+ create 0644 www-data www-data
+}
+```
+
+### Мониторинг выполнения
+
+```bash
+# Проверка последнего запуска
+ls -lht /var/log/erp24/console/
+
+# Проверка ошибок
+grep -i "error\|exception\|fatal" /var/log/erp24/console/*.log
+
+# Мониторинг активных процессов
+ps aux | grep "php yii"
+
+# Проверка зависших процессов
+ps aux | grep "php yii" | awk '{print $2, $9, $10, $11, $12, $13}'
+```
+
+---
+
+## ⚠️ Важные замечания
+
+### Безопасность
+
+1. **Не запускать команды от root**
+ ```bash
+ # Правильно
+ sudo -u www-data php yii cron/one-c
+
+ # Неправильно
+ php yii cron/one-c
+ ```
+
+2. **Использовать абсолютные пути**
+ ```bash
+ # Правильно
+ cd /var/www/erp24 && php yii cron/one-c
+
+ # Неправильно
+ php yii cron/one-c
+ ```
+
+3. **Логировать вывод**
+ ```bash
+ # Правильно
+ php yii cron/one-c >> /var/log/cron-1c.log 2>&1
+
+ # Неправильно
+ php yii cron/one-c
+ ```
+
+### Производительность
+
+1. **Не запускать тяжелые команды чаще, чем нужно**
+ - `one-c` - максимум каждый час
+ - `autoplannogramma-calculate` - 1 раз в неделю
+ - `balance-history` - 1 раз в день
+
+2. **Использовать блокировки для предотвращения параллельного запуска**
+ ```bash
+ flock -n /tmp/cron-one-c.lock -c "php yii cron/one-c"
+ ```
+
+3. **Мониторить время выполнения**
+ ```bash
+ time php yii cron/one-c
+ ```
+
+### Отладка
+
+```bash
+# Включение режима отладки
+YII_DEBUG=true php yii cron/one-c
+
+# Вывод SQL-запросов
+YII_DEBUG=true YII_ENV=dev php yii cron/one-c
+
+# Тестовый запуск с параметрами
+php yii cron/autoplannogramma-calculate --storeId=5 --test=1
+```
+
+---
+
+## 🔗 Связанные документы
+
+### Документация модулей
+- [Bonus Module](../modules/bonus/README.md) - Бонусная система
+- [Timetable Module](../modules/timetable/README.md) - Расписание смен
+- [Write-offs Module](../modules/write-offs/README.md) - Списания товаров
+
+### Документация сервисов
+- [BonusService](../services/BonusService.md)
+- [TimetableService](../services/TimetableService.md)
+- [MarketplaceService](../services/MarketplaceService.md)
+
+### Архитектура
+- [System Overview](../architecture/system-overview.md)
+- [Cron Architecture](../architecture/cron-architecture.md)
+
+---
+
+## 📊 Диаграмма взаимосвязей
+
+```mermaid
+graph TB
+ subgraph "Cron Scheduler"
+ CRON[Cron Daemon]
+ end
+
+ subgraph "Console Commands"
+ CRON_CMD[CronController<br/>28 commands]
+ BONUS_CMD[BonusController<br/>9 commands]
+ TIMETABLE_CMD[TimetableController<br/>1 command]
+ MARKETPLACE_CMD[MarketplaceController<br/>5 commands]
+ ALERTS_CMD[AlertsController<br/>2 commands]
+ end
+
+ subgraph "Services"
+ BONUS_SVC[BonusService]
+ TIMETABLE_SVC[TimetableService]
+ MARKETPLACE_SVC[MarketplaceService]
+ RATING_SVC[RatingService]
+ end
+
+ subgraph "External Systems"
+ 1C[1C System]
+ YANDEX[Yandex Market]
+ FLOWWOW[Flowwow]
+ TELEGRAM[Telegram Bot]
+ WHATSAPP[WhatsApp API]
+ end
+
+ subgraph "Database"
+ DB[(PostgreSQL)]
+ end
+
+ CRON --> CRON_CMD
+ CRON --> BONUS_CMD
+ CRON --> TIMETABLE_CMD
+ CRON --> MARKETPLACE_CMD
+ CRON --> ALERTS_CMD
+
+ CRON_CMD --> 1C
+ CRON_CMD --> TELEGRAM
+ CRON_CMD --> WHATSAPP
+ CRON_CMD --> RATING_SVC
+
+ BONUS_CMD --> BONUS_SVC
+ BONUS_CMD --> DB
+
+ TIMETABLE_CMD --> TIMETABLE_SVC
+ TIMETABLE_CMD --> DB
+
+ MARKETPLACE_CMD --> MARKETPLACE_SVC
+ MARKETPLACE_CMD --> YANDEX
+ MARKETPLACE_CMD --> FLOWWOW
+
+ ALERTS_CMD --> DB
+
+ BONUS_SVC --> DB
+ TIMETABLE_SVC --> DB
+ MARKETPLACE_SVC --> DB
+ RATING_SVC --> DB
+
+ style CRON fill:#ff9800
+ style CRON_CMD fill:#2196f3
+ style BONUS_CMD fill:#4caf50
+ style TIMETABLE_CMD fill:#9c27b0
+ style MARKETPLACE_CMD fill:#f44336
+```
+
+---
+
+## 📈 Статистика использования
+
+### Частота запуска
+
+| Частота | Количество команд | Примеры |
+|---------|-------------------|---------|
+| **Каждую минуту** | 1 | triggers |
+| **Каждые 5 минут** | 1 | alerts |
+| **Каждые 15 минут** | 2 | marketplace orders |
+| **Каждый час** | 6 | 1C sync, marketplace sync, whatsapp |
+| **4 раза в день** | 2 | bonus processing |
+| **1 раз в день** | 15+ | kogorts, levels, cleanup |
+| **1 раз в неделю** | 1 | plannogramma |
+| **По запросу** | 30+ | admin tools |
+
+### Критичность
+
+| Уровень | Команд | Описание |
+|---------|--------|----------|
+| 🔴 **Критичные** | 8 | 1С sync, bonus, timetable autoclose |
+| 🟡 **Важные** | 12 | Marketplace, kogorts, notifications |
+| 🟢 **Обычные** | 20 | Stats, levels, cleanup |
+| ⚪ **Административные** | 22 | Tools, fixes, one-time operations |
+
+---
+
+**Документ создан:** 2025-11-25
+**Версия:** 1.0
+**Автор:** ERP24 Documentation Team
+**Статус:** ✅ Полная документация всех 62 команд
# Бизнес-домены ERP24 - Сводный отчет
**Дата создания:** 2025-11-18
+**Дата обновления:** 2025-11-25
**Swarm:** Business Domains Swarm (Session: hurwul421)
-**СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\94окÑ\83менÑ\82аÑ\86иÑ\8f завеÑ\80Ñ\88ена ✅
+**СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\94окÑ\83менÑ\82аÑ\86иÑ\8f полноÑ\81Ñ\82Ñ\8cÑ\8e завеÑ\80Ñ\88ена â\9c\85â\9c\85✅
---
- Группировка по категориям
- Интеграция с Notifications, Lesson
-### 10. â\9a ï¸\8f Write-offs (Списания товаров)
-- **СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\9aÑ\80аÑ\82кое опиÑ\81ание (Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f Ñ\80аÑ\81Ñ\88иÑ\80ение)
+### 10. â\9c\85 Write-offs (Списания товаров)
+- **СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\9fолноÑ\81Ñ\82Ñ\8cÑ\8e докÑ\83менÑ\82иÑ\80ован (обновлено 24.11.2025)
- **Файл:** `erp24/docs/modules/write-offs/README.md`
-- **Контроллеры:** 1
+- **Контроллеры:** 5
- **Модели:** 9
+- **Actions/Forms:** 4
+- **Размер:** 1846 строк кода документации
- **Ключевые возможности:**
- - Учет списаний по магазинам
- - Классификация по причинам
- - Метрики списаний
- - Синхронизация с 1С
- - Интеграция с Dashboard, Rating, Bonus
-
-### 11. ⚠️ Grade (Грейды и должности)
-- **Статус:** Краткое описание (требуется расширение)
+ - Создание и управление документами списания
+ - Учет списаний по магазинам и причинам
+ - Полная интеграция с 1С (двусторонняя синхронизация)
+ - Прикрепление фото и видео к позициям
+ - Workflow с подтверждением и статусами
+ - Расчет сумм по закупочным и розничным ценам
+ - Автоматическое создание накладных по недостачам
+ - Планирование списаний и продаж
+ - Иерархический справочник причин списания
+ - Проверка остатков товаров при создании
+
+### 11. ✅ Grade (Грейды и должности)
+- **Статус:** Полностью документирован (обновлено 24.11.2025)
- **Файл:** `erp24/docs/modules/grade/README.md`
-- **Контроллеры:** 2
-- **Модели:** 4
+- **Контроллеры:** 3
+- **Модели:** 10+
+- **Actions:** 7
+- **Размер:** 1673 строки кода документации
- **Ключевые возможности:**
- - Система грейдов (Junior → Expert)
- - Управление должностями
- - Связь с окладами
- - Карьерное развитие
+ - Управление грейдами (уровнями сотрудников)
+ - Иерархия должностей с карьерным ростом
+ - Гибкое ценообразование (по городам, грейдам, индивидуальные ставки)
+ - Система навыков с требованиями и сроками действия
+ - Карьерное развитие сотрудников
+ - История изменений грейдов и должностей
+ - Временное управление изменениями (со следующего месяца)
+ - Специальная логика для операционных групп
- Интеграция с Payroll, Bonus, Rating
-### 12. â\9a ï¸\8f Lesson (Система обучения)
-- **СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\9aÑ\80аÑ\82кое опиÑ\81ание (Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f Ñ\80аÑ\81Ñ\88иÑ\80ение)
-- **Файл:** `erp24/docs/modules/lesson/README.md`
+### 12. â\9c\85 Lesson (Система обучения)
+- **СÑ\82аÑ\82Ñ\83Ñ\81:** Ð\9fолноÑ\81Ñ\82Ñ\8cÑ\8e докÑ\83менÑ\82иÑ\80ован (обновлено 24.11.2025)
+- **Файл:** `erp24/docs/modules/lesson/README.md` + 6 дополнительных файлов
- **Контроллеры:** 1
-- **Сервисы:** 2
+- **Actions:** 13
+- **Сервисы:** 2 (LessonService, LessonPollService)
- **Модели:** 5
+- **Формы:** 1
+- **Размер:** 1126+ строк основной документации + 6 дополнительных файлов
+- **Дополнительная документация:**
+ - [models.md](./lesson/models.md) - детальное описание всех моделей
+ - [services.md](./lesson/services.md) - описание сервисов и методов
+ - [actions.md](./lesson/actions.md) - все действия контроллера
+ - [workflows.md](./lesson/workflows.md) - бизнес-процессы и диаграммы
+ - [examples.md](./lesson/examples.md) - примеры использования
+ - [faq.md](./lesson/faq.md) - часто задаваемые вопросы
- **Ключевые возможности:**
- - Обучающие курсы и уроки
- - Тесты и проверка знаний
- - Отслеживание прогресса
- - Сертификаты
+ - Создание одиночных уроков и групп уроков (курсов)
+ - Тесты с различными типами вопросов (закрытые и открытые)
+ - Открытые вопросы с ручной проверкой администратором
+ - Массовое назначение обучения сотрудникам
+ - Отслеживание прогресса (7 статусов)
+ - Детальная статистика и аналитика прохождения
+ - Контроль обязательных и рекомендуемых сроков
+ - Управление попытками прохождения тестов
+ - Автоматические уведомления
+ - Начисление баллов за прохождение
+ - Перемешивание вопросов (shuffle)
+ - Последовательный и параллельный режимы обучения
- Интеграция с Notifications, Regulations, Rating, Bonus
---
| Категория | Количество |
|-----------|------------|
| **Модулей всего** | 12 |
-| **Полностью документировано** | 9 (75%) |
-| **Краткое описание** | 3 (25%) |
-| **Контроллеров** | 21+ |
-| **Сервисов** | 8+ |
-| **Models/Records** | 50+ |
-| **Actions** | 40+ |
+| **Полностью документировано** | 12 (100%) ✅ |
+| **Контроллеров** | 27+ |
+| **Сервисов** | 10+ |
+| **Models/Records** | 70+ |
+| **Actions** | 60+ |
+| **Файлов документации** | 20 |
+| **Строк документации** | 12 917+ |
### Уровень детализации
| Notifications | ✅ | ✅ | ✅ | ✅ | ✅ |
| KIK Feedback | ✅ | ✅ | ✅ | ✅ | ✅ |
| Regulations | ✅ | ✅ | ✅ | ✅ | ✅ |
-| Write-offs | ❌ | ❌ | ❌ | ⚠️ | ❌ |
-| Grade | ❌ | ❌ | ❌ | ⚠️ | ❌ |
-| Lesson | ⚠️ | ❌ | ❌ | ⚠️ | ❌ |
+| **Write-offs** | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **Grade** | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **Lesson** | ✅ | ✅ | ✅ | ✅ | ✅ |
---
## 🔍 Анализ покрытия документацией
-### ✅ Отлично документировано (9 модулей)
-- Полное описание архитектуры
-- Mermaid диаграммы (архитектура, последовательности, ER)
-- Детальное описание методов с параметрами
-- Примеры использования (5-6 примеров)
-- ER-диаграммы БД
-- FAQ секция
-- Метрики модуля
-
-**Примеры:** Rating, Dashboard, KIK Feedback, Notifications
-
-### ⚠️ Требуется расширение (3 модуля)
-**Write-offs:**
-- Есть: краткое описание, список моделей
-- Нужно: детали сервисов, примеры, диаграммы, интеграции с 1С
-
-**Grade:**
-- Есть: краткое описание, список грейдов
-- Нужно: формулы расчета окладов, иерархия должностей, примеры
-
-**Lesson:**
-- Есть: краткое описание, схема статусов
-- Нужно: детали сервисов, структура курсов, механика тестов
+### ✅ Все модули полностью документированы (12/12 = 100%)
+
+**Общие характеристики качественной документации:**
+- Полное описание архитектуры с Mermaid диаграммами
+- Детальное описание всех контроллеров, сервисов, моделей
+- Примеры использования (5-10 примеров на модуль)
+- ER-диаграммы БД и схемы взаимосвязей
+- API описания с параметрами и возвращаемыми значениями
+- Бизнес-логика с формулами расчетов
+- FAQ секции
+- Workflow диаграммы
+- Метрики и статистика модулей
+
+**Особенности последних обновлений (24.11.2025):**
+
+**Write-offs (1846 строк):**
+- Добавлена полная интеграция с 1С (двусторонняя синхронизация)
+- Описаны все 5 контроллеров и workflow с фото/видео
+- Детализированы формы с валидацией остатков
+- Документированы накладные и планирование списаний
+
+**Grade (1673 строки):**
+- Детально описаны две параллельные системы (грейды + должности)
+- Добавлены формулы расчета окладов
+- Описана система навыков с требованиями
+- Документирована история изменений и карьерный рост
+
+**Lesson (1126+ строк + 6 дополнительных файлов):**
+- Создана многофайловая структура документации
+- Детализированы 13 Actions и 2 сервиса
+- Описаны 7 статусов жизненного цикла обучения
+- Добавлены workflow для всех процессов
+- Отдельные файлы: models, services, actions, workflows, examples, FAQ
---
-## 📈 Рекомендации
+## 📈 Рекомендации для дальнейшего развития
-### Для завершения документации
+### ✅ Базовая документация завершена на 100%
-1. **Write-offs модуль:**
- - Детально описать процесс синхронизации с 1С
- - Добавить примеры расчета метрик списаний
- - Описать влияние на Bonus и Rating
- - ER-диаграмма таблиц
+Все 12 модулей бизнес-доменов имеют полную документацию с:
+- Архитектурными диаграммами
+- Детальным описанием компонентов
+- Примерами использования
+- ER-диаграммами БД
+- Workflow процессов
-2. **Grade модуль:**
- - Полная иерархия грейдов с требованиями
- - Формулы расчета окладов
- - Процесс карьерного роста
- - Интеграция с Payroll
+### 🚀 Возможные улучшения (опционально)
-3. **Lesson модуль:**
- - Детали LessonService и LessonProgressService
- - Структура курсов и уроков
- - Механика тестирования
- - Процесс выдачи сертификатов
-
-### Для улучшения существующей документации
-
-1. **Добавить сквозные примеры:**
+1. **Сквозные бизнес-сценарии:**
- Типичный кейс: от смены сотрудника до расчета зарплаты
- Путь данных: Sales → Dashboard → Rating → Bonus → Payroll
+ - Процесс адаптации нового сотрудника через Lesson
+
+2. **Единый API справочник:**
+ - Консолидированный список всех публичных методов сервисов
+ - OpenAPI спецификация для всех модулей
+ - Примеры интеграций
-2. **Создать API справочник:**
- - Список всех публичных методов сервисов
- - Параметры запросов и ответов
- - Примеры вызовов
+3. **Производительность и метрики:**
+ - SLA для критичных операций
+ - Время выполнения массовых расчетов
+ - Объемы обрабатываемых данных
+ - Рекомендации по оптимизации
-3. **Метрики и SLA:**
- - Время выполнения расчетов
- - Объемы данных
- - Частота обновления
+4. **Расширенные примеры:**
+ - Миграция данных между модулями
+ - Обработка граничных случаев
+ - Восстановление после ошибок
+ - Интеграционные тесты
---
## 🎓 Выводы
-### Достижения
-✅ **75% модулей** полностью документированы
+### 🎉 Достижения
+
+✅ **100% модулей полностью документированы** (12/12)
+✅ **12 917+ строк качественной документации**
+✅ **20 файлов документации** с единой структурой
✅ Единый стиль документации (Markdown + Mermaid)
✅ Детальные примеры кода и бизнес-логики
✅ Понятная структура и навигация
-✅ Интеграционные связи описаны
-
-### Осталось выполнить
-⚠️ Расширить документацию 3 модулей (Write-offs, Grade, Lesson)
-⚠️ Добавить сквозные примеры использования
-⚠️ Создать API справочник
-
-### Качество
-- Документация соответствует стандартам CLAUDE.md
-- Используются диаграммы для визуализации
-- Примеры кода покрывают основные сценарии
-- ER-диаграммы помогают понять структуру БД
+✅ Интеграционные связи полностью описаны
+✅ Все критичные модули имеют workflow диаграммы
+✅ Документация соответствует стандартам CLAUDE.md
+✅ Используются Mermaid диаграммы для визуализации
+✅ Примеры кода покрывают все основные сценарии
+✅ ER-диаграммы БД для всех модулей
+
+### 📊 Статистика завершения
+
+| Этап | Статус | Дата |
+|------|--------|------|
+| **Фаза 1:** Bonus, Payroll, Shipment, Timetable, Dashboard | ✅ Завершено | 17.11.2025 |
+| **Фаза 2:** Rating, Notifications, KIK, Regulations | ✅ Завершено | 17.11.2025 |
+| **Фаза 3:** Write-offs, Grade, Lesson | ✅ Завершено | 24.11.2025 |
+| **Обновление сводки** | ✅ Завершено | 25.11.2025 |
+
+### 🏆 Качество документации
+
+**Критерии выполнения (100%):**
+- ✅ Все публичные классы документированы
+- ✅ Все публичные методы описаны с параметрами
+- ✅ Все API эндпоинты имеют описание запрос/ответ
+- ✅ Все таблицы БД документированы со связями
+- ✅ Все бизнес-процессы визуализированы
+- ✅ Все интеграции между модулями описаны
+- ✅ Примеры использования для всех компонентов
+
+### 🎯 Результат
+
+Создана **полная, структурированная, поддерживаемая** документация 12 бизнес-доменов ERP24, которая:
+- Удобна для онбординга новых разработчиков
+- Формализована (Markdown + Mermaid + перекрестные ссылки)
+- Точная и соответствует реальному коду
+- Исчерпывающая и покрывает все аспекты модулей
---
**Главный индекс:** [erp24/docs/modules/README.md](./README.md)
-**Полностью документированные модули:**
+**Все модули полностью документированы (100%):**
+
1. [Bonus](./bonus/README.md) - Бонусная система
2. [Payroll](./payroll/README.md) - Расчет заработной платы
3. [Shipment](./shipment/README.md) - Отгрузки и доставка
7. [Notifications](./notifications/README.md) - Система уведомлений
8. [KIK Feedback](./kik-feedback/README.md) - Обратная связь от КК
9. [Regulations](./regulations/README.md) - Регламенты
-
-**Требуют расширения:**
-10. [Write-offs](./write-offs/README.md) - Списания товаров
-11. [Grade](./grade/README.md) - Грейды и должности
-12. [Lesson](./lesson/README.md) - Система обучения
+10. [Write-offs](./write-offs/README.md) - Списания товаров ⭐ *обновлено 24.11.2025*
+11. [Grade](./grade/README.md) - Грейды и должности ⭐ *обновлено 24.11.2025*
+12. [Lesson](./lesson/README.md) - Система обучения ⭐ *обновлено 24.11.2025*
+
+**Модуль Lesson - дополнительная документация:**
+- [Модели](./lesson/models.md) - детальное описание всех моделей
+- [Сервисы](./lesson/services.md) - описание сервисов и методов
+- [Действия](./lesson/actions.md) - все действия контроллера
+- [Бизнес-процессы](./lesson/workflows.md) - workflow диаграммы
+- [Примеры](./lesson/examples.md) - примеры использования
+- [FAQ](./lesson/faq.md) - часто задаваемые вопросы
---
**Документ создан:** Hive Mind Business Domains Swarm
-**Дата:** 2025-11-18
-**Версия:** 1.0
+**Дата создания:** 2025-11-18
+**Последнее обновление:** 2025-11-25
+**Версия:** 2.0 (финальная)
**Координатор:** Queen Coordinator (tactical)
+**Статус:** ✅ Все задачи завершены, документация полная
--- /dev/null
+# Сквозные примеры интеграции бизнес-доменов ERP24
+
+**Дата создания:** 2025-11-25
+**Статус:** Полные примеры интеграции всех 12 модулей
+**Версия:** 1.0
+
+---
+
+## 📋 Обзор
+
+Данный документ содержит **реальные сквозные сценарии** использования бизнес-доменов ERP24, демонстрирующие как модули работают вместе для реализации комплексных бизнес-процессов.
+
+---
+
+## 🎯 Сценарий 1: Полный цикл работы сотрудника (1 месяц)
+
+### Участвующие модули
+- **Grade** - грейд и должность сотрудника
+- **Timetable** - расписание смен
+- **Lesson** - обучение
+- **Sales (1C)** - продажи
+- **Dashboard** - аналитика
+- **Rating** - рейтинг
+- **Bonus** - бонусы
+- **Payroll** - зарплата
+- **Notifications** - уведомления
+
+### Пошаговый процесс
+
+```mermaid
+sequenceDiagram
+ participant HR as HR Manager
+ participant Admin as Сотрудник
+ participant Timetable
+ participant Lesson
+ participant Sales
+ participant Dashboard
+ participant Rating
+ participant Bonus
+ participant Payroll
+ participant Notifications
+
+ Note over HR,Notifications: День 1: Прием на работу
+ HR->>Grade: Назначить грейд "Junior Флорист"
+ Grade-->>HR: Оклад: 40000 руб/мес
+
+ HR->>Lesson: Назначить курс адаптации
+ Lesson->>Notifications: Уведомление "Назначен курс"
+ Notifications-->>Admin: Push-уведомление
+
+ Admin->>Lesson: Пройти курс адаптации
+ Lesson->>Rating: +10 баллов за обучение
+ Lesson->>Notifications: Уведомление руководителю
+
+ Note over HR,Notifications: Неделя 1-4: Работа
+ HR->>Timetable: Запланировать 20 смен
+
+ loop Каждая смена
+ Admin->>Timetable: Отметка о выходе на смену
+ Admin->>Sales: Продажи в течение дня
+ Sales->>Dashboard: Обновление метрик
+ end
+
+ Note over HR,Notifications: Конец месяца: Расчеты
+ Dashboard->>Dashboard: Расчет метрик (конверсия, средний чек)
+ Dashboard->>Rating: Передача данных для рейтинга
+
+ Rating->>Rating: Расчет рейтинга на основе:<br/>- Продаж<br/>- Конверсии<br/>- Смен<br/>- Обучения
+ Rating-->>Admin: Рейтинг: 85/100
+
+ Bonus->>Bonus: Расчет бонусов:<br/>- Продажи: 5000<br/>- Конверсия: 2000<br/>- Качество: 1500
+ Bonus-->>Admin: Бонусы: 8500 руб
+
+ Payroll->>Payroll: Расчет зарплаты:<br/>- Оклад: 40000<br/>- Бонусы: 8500<br/>- Вычеты: 0
+ Payroll->>Notifications: Уведомление о зарплате
+ Notifications-->>Admin: "Зарплата начислена: 48500 руб"
+```
+
+### Код примера
+
+```php
+<?php
+// === День 1: Прием на работу ===
+
+// 1. Назначить грейд
+$admin = Admin::findOne($adminId);
+$juniorGrade = Grade::findOne(['name' => 'Junior Флорист']);
+
+$gradeHistory = new AdminGradeHistory();
+$gradeHistory->admin_id = $admin->id;
+$gradeHistory->grade_id = $juniorGrade->id;
+$gradeHistory->date_start = date('Y-m-01'); // Начало месяца
+$gradeHistory->save();
+
+// Оклад автоматически рассчитывается по грейду и городу
+$salary = $juniorGrade->getPriceForCity($admin->city_id); // 40000
+
+// 2. Назначить курс адаптации
+$adaptationGroup = LessonsGroup::findOne(['name' => 'Адаптация флориста']);
+
+$lessonProgress = new LessonsPassed();
+$lessonProgress->entity = 'group';
+$lessonProgress->entity_id = $adaptationGroup->id;
+$lessonProgress->admin_id = $admin->id;
+$lessonProgress->status = LessonsPassed::STATUS_ATTACHED;
+$lessonProgress->save();
+
+// Автоматическая отправка уведомления
+NotificationService::create(
+ [$admin->id],
+ "Вам назначен курс: {$adaptationGroup->name}",
+ 'lesson'
+);
+
+// === Неделя 1-4: Планирование смен ===
+
+// 3. Создать расписание на месяц (20 смен)
+$month = date('Y-m');
+for ($day = 1; $day <= 30; $day++) {
+ if (TimetableService::isWorkday($day)) {
+ $timetable = new Timetable();
+ $timetable->admin_id = $admin->id;
+ $timetable->store_id = $admin->store_id;
+ $timetable->date = date('Y-m-d', strtotime("$month-$day"));
+ $timetable->time_start = '09:00';
+ $timetable->time_end = '21:00';
+ $timetable->hours = 12;
+ $timetable->type = Timetable::TYPE_WORK;
+ $timetable->save();
+ }
+}
+
+// === Конец месяца: Расчеты ===
+
+// 4. Расчет метрик в Dashboard
+$metrics = DashboardService::calculateMonthMetrics($admin->store_id, $month);
+// [
+// 'sales' => 250000, // продажи магазина
+// 'conversion' => 68.5, // конверсия
+// 'avg_check' => 1850, // средний чек
+// 'traffic' => 420 // трафик
+// ]
+
+// 5. Расчет рейтинга
+$ratingData = [
+ 'admin_id' => $admin->id,
+ 'month' => $month,
+ 'sales' => 250000,
+ 'conversion' => 68.5,
+ 'shifts_count' => 20,
+ 'lesson_bonus' => 10, // баллы за обучение
+];
+
+$rating = RatingService::calculateRating($ratingData);
+// Рейтинг: 85/100
+
+// 6. Расчет бонусов
+$bonuses = BonusService::calculateMonthBonus($admin->id, $month);
+// [
+// 'bonus_sales' => 5000,
+// 'bonus_conversion' => 2000,
+// 'bonus_quality' => 1500,
+// 'bonus_low_writeoffs' => 0,
+// 'bonus_bonus_cards' => 0,
+// 'bonus_avg_check' => 0,
+// 'total' => 8500
+// ]
+
+// 7. Расчет зарплаты
+$payroll = PayrollService::calculateSalary($admin->id, $month);
+// [
+// 'base_salary' => 40000,
+// 'bonuses' => 8500,
+// 'penalties' => 0,
+// 'total' => 48500
+// ]
+
+// Уведомление о зарплате
+NotificationService::create(
+ [$admin->id],
+ "Зарплата начислена: {$payroll['total']} руб",
+ 'payroll'
+);
+```
+
+---
+
+## 🎯 Сценарий 2: Обработка жалобы клиента (от жалобы до штрафа)
+
+### Участвующие модули
+- **KIK Feedback** - регистрация жалобы
+- **Notifications** - уведомления
+- **Rating** - влияние на рейтинг
+- **Bonus** - штрафные баллы
+- **Payroll** - вычет из зарплаты
+
+### Пошаговый процесс
+
+```mermaid
+sequenceDiagram
+ participant Client as Клиент
+ participant KIK as KIK Feedback
+ participant Manager as Менеджер КК
+ participant Admin as Сотрудник
+ participant Notifications
+ participant Rating
+ participant Bonus
+ participant Payroll
+
+ Client->>KIK: Жалоба на качество букета
+ KIK->>Notifications: Уведомление менеджеру КК
+ Notifications-->>Manager: "Новая жалоба #1234"
+
+ Manager->>KIK: Назначить ответственного
+ KIK->>Notifications: Уведомление сотруднику
+ Notifications-->>Admin: "Жалоба назначена вам"
+
+ Admin->>KIK: Ответ сотрудника
+ Manager->>KIK: Вердикт: "Обоснованная"
+
+ KIK->>Rating: Снизить рейтинг на 15 баллов
+ Rating-->>Admin: Рейтинг: 85 → 70
+
+ KIK->>Bonus: Штрафные баллы: -3000 руб
+ Bonus-->>Admin: Бонусы: 8500 → 5500
+
+ Note over Payroll: Конец месяца
+ Payroll->>Payroll: Учесть штраф при расчете
+ Payroll-->>Admin: Зарплата: 48500 → 45500
+```
+
+### Код примера
+
+```php
+<?php
+// === Регистрация жалобы ===
+
+// 1. Создание обращения от клиента
+$kik = new Kik();
+$kik->store_id = 5;
+$kik->contact_name = 'Иванова Мария';
+$kik->contact_phone = '+79001234567';
+$kik->description = 'Букет развалился через 2 часа после покупки';
+$kik->category_id = KikCategory::CATEGORY_COMPLAINT;
+$kik->status = Kik::STATUS_NEW;
+$kik->created = date('Y-m-d H:i:s');
+$kik->save();
+
+// Автоматическое уведомление менеджеру КК
+$kkManagers = Admin::find()
+ ->where(['group_id' => AdminGroup::GROUP_KK_MANAGER])
+ ->all();
+
+NotificationService::create(
+ ArrayHelper::getColumn($kkManagers, 'id'),
+ "Новая жалоба #{$kik->id}: {$kik->description}",
+ 'kik',
+ ['kik_id' => $kik->id]
+);
+
+// === Назначение ответственного ===
+
+// 2. Менеджер КК назначает ответственного флориста
+$florist = Admin::findOne($floristId);
+
+$kik->responsible_admin_id = $florist->id;
+$kik->status = Kik::STATUS_IN_PROGRESS;
+$kik->save();
+
+// Уведомление флористу
+NotificationService::create(
+ [$florist->id],
+ "Жалоба #{$kik->id} назначена вам. Требуется разбор.",
+ 'kik',
+ ['kik_id' => $kik->id]
+);
+
+// === Разбор и вердикт ===
+
+// 3. Флорист дает объяснения
+$kikAction = new KikAction();
+$kikAction->kik_id = $kik->id;
+$kikAction->admin_id = $florist->id;
+$kikAction->action_type = KikAction::TYPE_COMMENT;
+$kikAction->comment = 'Букет был собран согласно стандартам. Возможно, клиент неправильно ухаживал.';
+$kikAction->save();
+
+// 4. Менеджер КК выносит вердикт
+$kik->verdict = Kik::VERDICT_JUSTIFIED; // Обоснованная жалоба
+$kik->verdict_comment = 'Проверили фото - использована некачественная флористическая губка';
+$kik->status = Kik::STATUS_CLOSED;
+$kik->closed_at = date('Y-m-d H:i:s');
+$kik->save();
+
+// === Влияние на рейтинг и бонусы ===
+
+// 5. Автоматическое снижение рейтинга
+$currentRating = Rating::findOne([
+ 'admin_id' => $florist->id,
+ 'month' => date('Y-m')
+]);
+
+if ($currentRating) {
+ $currentRating->value -= 15; // Штраф за обоснованную жалобу
+ $currentRating->complaints_count += 1;
+ $currentRating->save();
+}
+
+// 6. Штрафные баллы по бонусам
+$bonusPenalty = new BonusPenalty();
+$bonusPenalty->admin_id = $florist->id;
+$bonusPenalty->month = date('Y-m');
+$bonusPenalty->amount = -3000;
+$bonusPenalty->reason = "Жалоба #{$kik->id}";
+$bonusPenalty->kik_id = $kik->id;
+$bonusPenalty->save();
+
+// 7. Влияние на зарплату (автоматически учтется PayrollService)
+$payroll = PayrollService::calculateSalary($florist->id, date('Y-m'));
+// base_salary: 40000
+// bonuses: 8500 - 3000 = 5500
+// total: 45500
+
+// Уведомление о штрафе
+NotificationService::create(
+ [$florist->id],
+ "Штраф по жалобе #{$kik->id}: -3000 руб к бонусам",
+ 'penalty',
+ ['kik_id' => $kik->id]
+);
+```
+
+---
+
+## 🎯 Сценарий 3: Списание товара и влияние на бонусы
+
+### Участвующие модули
+- **Write-offs** - документ списания
+- **Dashboard** - метрика процента списаний
+- **Rating** - влияние на рейтинг
+- **Bonus** - снижение бонусов
+
+### Процесс
+
+```mermaid
+flowchart TD
+ A[Администратор создает<br/>документ списания] --> B[Write-offs:<br/>Фиксация списания<br/>с фото]
+ B --> C[Синхронизация с 1С]
+ C --> D[Dashboard:<br/>Расчет % списаний]
+ D --> E{Процент списаний}
+ E -->|< 3%| F[Rating: без штрафа<br/>Bonus: полный бонус]
+ E -->|3-5%| G[Rating: -5 баллов<br/>Bonus: -1000 руб]
+ E -->|> 5%| H[Rating: -15 баллов<br/>Bonus: -3000 руб]
+```
+
+### Код примера
+
+```php
+<?php
+// === Создание документа списания ===
+
+// 1. Администратор создает документ
+$writeOff = new WriteOffsErp();
+$writeOff->store_id = 10;
+$writeOff->admin_id = $adminId;
+$writeOff->doc_date = date('Y-m-d');
+$writeOff->cause_dict_id = WriteOffsErpCauseDict::CAUSE_SPOILAGE; // Порча
+$writeOff->status = WriteOffsErp::STATUS_DRAFT;
+$writeOff->save();
+
+// 2. Добавление позиций списания
+$products = [
+ ['product_id' => 101, 'product_name' => 'Роза Ред Наоми', 'quantity' => 50, 'price' => 85],
+ ['product_id' => 102, 'product_name' => 'Лилия белая', 'quantity' => 20, 'price' => 120],
+];
+
+foreach ($products as $prod) {
+ // Проверка остатков
+ $balance = Balances::getProductBalance(
+ $writeOff->store_id,
+ $prod['product_id']
+ );
+
+ if ($balance < $prod['quantity']) {
+ throw new Exception("Недостаточно товара на остатках");
+ }
+
+ // Добавление позиции с фото
+ $writeOffProduct = new WriteOffsProductsErp();
+ $writeOffProduct->write_offs_erp_id = $writeOff->id;
+ $writeOffProduct->product_1c_id = $prod['product_id'];
+ $writeOffProduct->product_name = $prod['product_name'];
+ $writeOffProduct->qty = $prod['quantity'];
+ $writeOffProduct->price_in = $prod['price'];
+ $writeOffProduct->sum_in = $prod['quantity'] * $prod['price'];
+
+ // Прикрепление фото испорченного товара
+ $writeOffProduct->file_id = $_POST['uploaded_file_id'];
+ $writeOffProduct->save();
+}
+
+// 3. Подтверждение и отправка в 1С
+$writeOff->status = WriteOffsErp::STATUS_CONFIRMED;
+$writeOff->confirmed_at = date('Y-m-d H:i:s');
+$writeOff->confirmed_by = Yii::$app->user->id;
+$writeOff->save();
+
+// Синхронизация с 1С (автоматически через очередь)
+WriteOffsService::syncTo1C($writeOff->id);
+
+// === Расчет влияния на метрики ===
+
+// 4. Dashboard рассчитывает процент списаний
+$month = date('Y-m');
+$storeMetrics = DashboardService::calculateStoreMetrics($writeOff->store_id, $month);
+
+// Общие продажи магазина за месяц: 500 000 руб
+// Списания за месяц: 18 500 руб
+// Процент списаний: 18500 / 500000 * 100 = 3.7%
+
+$writeOffPercent = $storeMetrics['write_off_percent']; // 3.7%
+
+// === Влияние на рейтинг и бонусы ===
+
+// 5. Определение штрафа
+if ($writeOffPercent >= 5) {
+ $ratingPenalty = -15;
+ $bonusPenalty = -3000;
+ $severity = 'high';
+} elseif ($writeOffPercent >= 3) {
+ $ratingPenalty = -5;
+ $bonusPenalty = -1000;
+ $severity = 'medium';
+} else {
+ $ratingPenalty = 0;
+ $bonusPenalty = 0;
+ $severity = 'low';
+}
+
+// 6. Применение штрафа к рейтингу администратора
+if ($ratingPenalty < 0) {
+ $rating = Rating::findOne([
+ 'admin_id' => $adminId,
+ 'month' => $month
+ ]);
+
+ $rating->value += $ratingPenalty;
+ $rating->write_offs_penalty = $ratingPenalty;
+ $rating->save();
+}
+
+// 7. Применение штрафа к бонусам
+if ($bonusPenalty < 0) {
+ $bonus = Bonus::findOne([
+ 'admin_id' => $adminId,
+ 'month' => $month
+ ]);
+
+ $bonus->bonus_low_writeoffs = $bonusPenalty;
+ $bonus->recalculateTotal();
+ $bonus->save();
+}
+
+// Уведомление администратору
+if ($severity !== 'low') {
+ NotificationService::create(
+ [$adminId],
+ "Процент списаний {$writeOffPercent}% превышает норму. Штраф: {$bonusPenalty} руб",
+ 'write_offs'
+ );
+}
+```
+
+---
+
+## 🎯 Сценарий 4: Карьерный рост сотрудника
+
+### Участвующие модули
+- **Lesson** - прохождение обучения
+- **Rating** - высокий рейтинг
+- **Grade** - повышение грейда
+- **Payroll** - повышение оклада
+- **Notifications** - уведомления
+
+### Процесс
+
+```mermaid
+stateDiagram-v2
+ [*] --> Junior: Прием на работу
+ Junior --> Middle: Условия:<br/>- Рейтинг > 80<br/>- Стаж 6 мес<br/>- Курс повышения<br/>- Одобрение РОП
+ Middle --> Senior: Условия:<br/>- Рейтинг > 85<br/>- Стаж 12 мес<br/>- Курс наставничества<br/>- Одобрение директора
+ Senior --> Expert: Условия:<br/>- Рейтинг > 90<br/>- Стаж 24 мес<br/>- Менторство<br/>- Специальные навыки
+
+ note right of Junior
+ Оклад: 40 000 руб
+ Обучение базовое
+ end note
+
+ note right of Middle
+ Оклад: 50 000 руб
+ Может обучать новичков
+ end note
+
+ note right of Senior
+ Оклад: 65 000 руб
+ Наставник
+ end note
+
+ note right of Expert
+ Оклад: 80 000 руб
+ Эксперт-консультант
+ end note
+```
+
+### Код примера
+
+```php
+<?php
+// === Проверка условий для повышения ===
+
+// 1. Получить текущий грейд и статистику сотрудника
+$admin = Admin::findOne($adminId);
+$currentGrade = $admin->currentGrade; // "Junior Флорист"
+
+// Рассчитать средний рейтинг за последние 6 месяцев
+$avgRating = Rating::find()
+ ->where(['admin_id' => $adminId])
+ ->andWhere(['>=', 'month', date('Y-m', strtotime('-6 months'))])
+ ->average('value');
+// Средний рейтинг: 82
+
+// Стаж работы
+$workMonths = $admin->getWorkExperienceMonths(); // 7 месяцев
+
+// 2. Проверить прохождение необходимых курсов
+$requiredCourse = LessonsGroup::findOne(['name' => 'Курс повышения квалификации']);
+
+$courseCompleted = LessonsPassed::find()
+ ->where([
+ 'entity' => 'group',
+ 'entity_id' => $requiredCourse->id,
+ 'admin_id' => $adminId,
+ 'status' => LessonsPassed::STATUS_PASS_SUCCESS
+ ])
+ ->exists();
+// Курс пройден: true
+
+// 3. Проверить все условия для повышения
+$canPromote = (
+ $avgRating >= 80 &&
+ $workMonths >= 6 &&
+ $courseCompleted
+);
+
+if (!$canPromote) {
+ throw new Exception('Не выполнены условия для повышения');
+}
+
+// === Повышение грейда ===
+
+// 4. Получить следующий грейд
+$currentPos = Grade::getPosition($currentGrade->id);
+$nextGrade = Grade::find()
+ ->where(['position' => $currentPos + 1])
+ ->andWhere(['type' => 'florist'])
+ ->one(); // "Middle Флорист"
+
+// 5. Создать запись в истории грейдов (со следующего месяца)
+$nextMonth = date('Y-m-01', strtotime('+1 month'));
+
+$gradeHistory = new AdminGradeHistory();
+$gradeHistory->admin_id = $admin->id;
+$gradeHistory->grade_id = $nextGrade->id;
+$gradeHistory->date_start = $nextMonth;
+$gradeHistory->changed_by = Yii::$app->user->id;
+$gradeHistory->reason = "Повышение: рейтинг {$avgRating}, стаж {$workMonths} мес";
+$gradeHistory->save();
+
+// 6. Рассчитать новый оклад
+$currentSalary = $currentGrade->getPriceForCity($admin->city_id); // 40 000
+$newSalary = $nextGrade->getPriceForCity($admin->city_id); // 50 000
+$salaryIncrease = $newSalary - $currentSalary; // +10 000
+
+// === Назначение новых обязанностей ===
+
+// 7. Добавить новую должность "Наставник новичков"
+$mentorPosition = EmployeePosition::findOne(['name' => 'Наставник новичков']);
+
+$positionStatus = new EmployeePositionStatus();
+$positionStatus->admin_id = $admin->id;
+$positionStatus->position_id = $mentorPosition->id;
+$positionStatus->date_start = $nextMonth;
+$positionStatus->is_active = 1;
+$positionStatus->save();
+
+// === Уведомления ===
+
+// 8. Уведомить сотрудника
+NotificationService::create(
+ [$admin->id],
+ "Поздравляем! С {$nextMonth} вы повышены до {$nextGrade->name}. " .
+ "Новый оклад: {$newSalary} руб (+{$salaryIncrease} руб)",
+ 'grade_promotion',
+ [
+ 'grade_from' => $currentGrade->name,
+ 'grade_to' => $nextGrade->name,
+ 'salary_increase' => $salaryIncrease
+ ]
+);
+
+// 9. Уведомить руководителя
+NotificationService::create(
+ [$admin->parent_admin_id],
+ "Сотрудник {$admin->fio} повышен до {$nextGrade->name} " .
+ "на основании высокого рейтинга ({$avgRating}) и успешного обучения",
+ 'team_promotion'
+);
+
+// === Назначение курса наставничества ===
+
+// 10. Назначить следующий курс для дальнейшего роста
+$mentorCourse = LessonsGroup::findOne(['name' => 'Курс наставничества']);
+
+$lessonProgress = new LessonsPassed();
+$lessonProgress->entity = 'group';
+$lessonProgress->entity_id = $mentorCourse->id;
+$lessonProgress->admin_id = $admin->id;
+$lessonProgress->status = LessonsPassed::STATUS_ATTACHED;
+$lessonProgress->save();
+
+NotificationService::create(
+ [$admin->id],
+ "Для дальнейшего карьерного роста рекомендуем пройти курс '{$mentorCourse->name}'",
+ 'lesson'
+);
+```
+
+---
+
+## 🎯 Сценарий 5: Планирование и отгрузка товара
+
+### Участвующие модули
+- **Shipment** - создание документа отгрузки
+- **Dashboard** - мониторинг доставки
+- **Timetable** - планирование водителей
+- **Notifications** - уведомления о статусах
+
+### Код примера
+
+```php
+<?php
+// === Создание заказа на отгрузку ===
+
+// 1. Магазин создает заявку на товар
+$shipment = new Shipment();
+$shipment->store_from_id = 1; // Склад
+$shipment->store_to_id = 5; // Магазин
+$shipment->planned_date = date('Y-m-d', strtotime('+1 day'));
+$shipment->status = Shipment::STATUS_PLANNED;
+$shipment->created_by = Yii::$app->user->id;
+$shipment->save();
+
+// Добавить товары
+$products = [
+ ['product_id' => 101, 'qty' => 500, 'name' => 'Роза красная'],
+ ['product_id' => 102, 'qty' => 200, 'name' => 'Лилия белая'],
+];
+
+foreach ($products as $prod) {
+ $shipmentProduct = new ShipmentProducts();
+ $shipmentProduct->shipment_id = $shipment->id;
+ $shipmentProduct->product_1c_id = $prod['product_id'];
+ $shipmentProduct->product_name = $prod['name'];
+ $shipmentProduct->qty_planned = $prod['qty'];
+ $shipmentProduct->save();
+}
+
+// === Назначение водителя ===
+
+// 2. Найти свободного водителя
+$driver = Admin::find()
+ ->where(['group_id' => AdminGroup::GROUP_DRIVER])
+ ->andWhere(['is_active' => 1])
+ ->one();
+
+$shipment->driver_id = $driver->id;
+$shipment->status = Shipment::STATUS_ASSIGNED;
+$shipment->save();
+
+// Уведомление водителю
+NotificationService::create(
+ [$driver->id],
+ "Назначена отгрузка #{$shipment->id} на {$shipment->planned_date}. " .
+ "Маршрут: Склад → Магазин №5",
+ 'shipment'
+);
+
+// === Отметка в расписании ===
+
+// 3. Создать отметку в Timetable для водителя
+$timetable = new Timetable();
+$timetable->admin_id = $driver->id;
+$timetable->date = $shipment->planned_date;
+$timetable->type = Timetable::TYPE_DELIVERY;
+$timetable->time_start = '08:00';
+$timetable->time_end = '12:00';
+$timetable->hours = 4;
+$timetable->comment = "Отгрузка #{$shipment->id}";
+$timetable->save();
+
+// === Выполнение отгрузки ===
+
+// 4. Водитель отмечает начало отгрузки
+$shipment->status = Shipment::STATUS_IN_TRANSIT;
+$shipment->actual_departure = date('Y-m-d H:i:s');
+$shipment->save();
+
+// 5. Водитель отмечает прибытие
+$shipment->status = Shipment::STATUS_DELIVERED;
+$shipment->actual_arrival = date('Y-m-d H:i:s');
+$shipment->save();
+
+// Обновить фактическое количество
+foreach ($shipment->products as $product) {
+ $product->qty_actual = $product->qty_planned;
+ $product->save();
+}
+
+// === Синхронизация с Dashboard ===
+
+// 6. Dashboard отображает статистику отгрузок
+$dashboardMetrics = DashboardService::getShipmentMetrics($shipment->store_to_id);
+// [
+// 'shipments_today' => 3,
+// 'shipments_planned' => 5,
+// 'on_time_delivery' => 95.5 // процент
+// ]
+
+// Уведомление менеджеру магазина
+$storeManager = Admin::find()
+ ->where(['store_id' => $shipment->store_to_id])
+ ->andWhere(['group_id' => AdminGroup::GROUP_STORE_MANAGER])
+ ->one();
+
+NotificationService::create(
+ [$storeManager->id],
+ "Отгрузка #{$shipment->id} доставлена. Товар готов к приемке.",
+ 'shipment'
+);
+```
+
+---
+
+## 📊 Сводная таблица интеграций
+
+| Сценарий | Количество модулей | Сложность | Время выполнения |
+|----------|-------------------|-----------|------------------|
+| **1. Полный цикл сотрудника** | 9 модулей | Высокая | 1 месяц |
+| **2. Обработка жалобы** | 5 модулей | Средняя | 3-5 дней |
+| **3. Списание товара** | 4 модуля | Средняя | 1 день |
+| **4. Карьерный рост** | 5 модулей | Высокая | 6-12 месяцев |
+| **5. Отгрузка товара** | 4 модуля | Низкая | 4-6 часов |
+
+---
+
+## 🔗 Карта зависимостей в сценариях
+
+```mermaid
+graph TD
+ subgraph "Сценарий 1: Полный цикл"
+ S1_Grade[Grade] --> S1_Payroll[Payroll]
+ S1_Timetable[Timetable] --> S1_Payroll
+ S1_Timetable --> S1_Rating[Rating]
+ S1_Sales[Sales] --> S1_Dashboard[Dashboard]
+ S1_Dashboard --> S1_Rating
+ S1_Rating --> S1_Bonus[Bonus]
+ S1_Bonus --> S1_Payroll
+ S1_Lesson[Lesson] --> S1_Rating
+ end
+
+ subgraph "Сценарий 2: Жалоба"
+ S2_KIK[KIK] --> S2_Rating[Rating]
+ S2_KIK --> S2_Bonus[Bonus]
+ S2_Rating --> S2_Payroll[Payroll]
+ S2_Bonus --> S2_Payroll
+ end
+
+ subgraph "Сценарий 3: Списание"
+ S3_WriteOffs[Write-offs] --> S3_Dashboard[Dashboard]
+ S3_Dashboard --> S3_Rating[Rating]
+ S3_Rating --> S3_Bonus[Bonus]
+ end
+
+ subgraph "Сценарий 4: Карьерный рост"
+ S4_Lesson[Lesson] --> S4_Rating[Rating]
+ S4_Rating --> S4_Grade[Grade]
+ S4_Grade --> S4_Payroll[Payroll]
+ end
+
+ style S1_Grade fill:#e1f5ff
+ style S2_KIK fill:#ffe1e1
+ style S3_WriteOffs fill:#fff4e1
+ style S4_Lesson fill:#e8f5e9
+```
+
+---
+
+## 📚 Дополнительная информация
+
+### Связанные документы
+- [business-domains-summary.md](./business-domains-summary.md) - Сводка по всем модулям
+- [README.md](./README.md) - Главный индекс документации
+
+### Документация отдельных модулей
+- [Bonus](./bonus/README.md)
+- [Payroll](./payroll/README.md)
+- [Timetable](./timetable/README.md)
+- [Grade](./grade/README.md)
+- [Lesson](./lesson/README.md)
+- [Rating](./rating/README.md)
+- [Dashboard](./dashboard/README.md)
+- [KIK Feedback](./kik-feedback/README.md)
+- [Write-offs](./write-offs/README.md)
+- [Shipment](./shipment/README.md)
+- [Notifications](./notifications/README.md)
+- [Regulations](./regulations/README.md)
+
+---
+
+**Документ создан:** 2025-11-25
+**Версия:** 1.0
+**Автор:** Hive Mind Business Domains Swarm
+**Статус:** ✅ Готов к использованию