🍽️

Система учета питания

Авторизуйтесь для доступа к панели управления

{{ getCurrentTabTitle() }}
🍽️ План питания
👤 {{ sessionUsername }}
Выбор отдела/подрядчика:
Текущий отдел: {{ currentDept.name }}
🍽️

Меню разделов

Система Учета Питания

{{ (sessionUsername || 'U').substring(0, 2).toUpperCase() }}

{{ sessionUsername }}

{{ sessionRole === 'admin' ? 'Администратор' : (sessionRole === 'hr' ? 'Кадры (HR)' : 'Менеджер') }}

🍽️ Питание и заявки
📊 Отчеты и аналитика
👥 Персонал и вахта
🛡️ Система и контроль

Сводный отчет по питаниям

Общая статистика количества порций по всем отделам предприятия

Завтраки (З)
{{ globalTotals.breakfast }}
Обеды (О)
{{ globalTotals.lunch }}
Ужины (У)
{{ globalTotals.dinner }}
Поздние Ужины (ПУ)
{{ globalTotals.late_dinner }}
Всего порций
{{ globalTotals.total }}
Расчетная сумма по отметкам
{{ formatCurrency(globalTotals.calculated_sum) }} ₸
З: 862, О: 2100, У: 1790, ПУ: 1680
Фактическая сумма (РК7)
{{ formatCurrency(globalTotals.rk7_sum) }} ₸
Синхронизировано из R-Keeper RK7
Разница (План - Факт)
{{ formatCurrency(globalTotals.calculated_sum - globalTotals.rk7_sum) }} ₸ ({{ formatPercent(globalTotals.calculated_sum, globalTotals.rk7_sum) }})
{{ globalTotals.calculated_sum - globalTotals.rk7_sum >= 0 ? 'Экономия / неиспользованный лимит' : 'Перерасход по картам' }}
Название Отдела / Цеха Завтраки (З) Обеды (О) Ужины (У) Поздние (ПУ) Итого порций Расчетная сумма Фактическая (РК7)
{{ item.department_name }} {{ item.breakfast }} {{ item.lunch }} {{ item.dinner }} {{ item.late_dinner }} {{ item.total }} {{ formatCurrency(item.calculated_sum) }} ₸ {{ formatCurrency(item.rk7_sum) }} ₸
Нет данных для отображения.
ИТОГО К ВЫДАЧЕ: {{ globalTotals.breakfast }} {{ globalTotals.lunch }} {{ globalTotals.dinner }} {{ globalTotals.late_dinner }} {{ globalTotals.total }} {{ formatCurrency(globalTotals.calculated_sum) }} ₸ {{ formatCurrency(globalTotals.rk7_sum) }} ₸

Доступ ограничен

Используйте персональную ссылку отдела.

📥 Работа с файлами Excel (.xlsx)
📋 Перенос состава и отметок из прошлых вахт
ФИО Сотрудника {{ formatDate(date) }}
{{ user.fio }} 🏨 Гость
📅 {{ formatDate(user.guest_start_date) }} - {{ formatDate(user.guest_end_date) }} 💳 {{ user.card_number }}
В этом отделе пока нет сотрудников на выбранную вахту. Добавьте персонал вручную через блок ниже.

ИТОГО ПО ОТДЕЛУ:

Завтраки (З): {{ totals.breakfast }}
Обеды (О): {{ totals.lunch }}
Ужины (У): {{ totals.dinner }}
Поздние (ПУ): {{ totals.late_dinner }}
Всего порций: {{ totals.all }}

👥 Добавление персонала на вахту

База цеха
✅ Все активные сотрудники этого цеха уже добавлены в текущую вахту.
🔍
💳 {{ user.card_number }} нет карты
Ничего не найдено по запросу "{{ unassignedSearchQuery }}"
Выбрано: {{ selectedUnassignedUserIds.length }} из {{ unassignedUsers.length }} чел.
🔐

Вход в панель администратора

Введите учетные данные для доступа к настройкам

⚙️

Панель Администратора

Управление вахтами, доступами, интеграциями (1С, СКУД, R-Keeper), камерами и безопасностью

1С:ЗУП Автосинхр. ● Активна ({{ autosync1c.interval_hours || 6 }}ч) ○ Выкл
{{ autosync1c.last_run || 'Еще не выполнялась' }}
{{ autosync1c.last_status || 'Нажмите для перехода →' }}
R-Keeper / PCards CARDS.dbf
Синхр.: {{ pcardsLastSync || 'Загрузка...' }}
Файл: {{ pcardsFileMtime || '—' }}
СКУД HikCentral Турникеты
{{ hikStats.linked_count }} из {{ hikStats.total_users }} привязано Привязка сотрудников
Нажмите для управления связками →
Email-отчеты вахты ● Вкл ({{ emailReportConfig.send_time || '08:00' }}) ○ Выкл
{{ emailReportConfig.last_run || 'Ожидание окончания вахты' }}
{{ emailReportConfig.recipients }}
{{ dailyPlanLink }}
Перейти ↗️

Отправляет «Сводный отчет» и «Отчет по блюдам» с почты {{ emailReportConfig.smtp_user || 'notifications@saryopan.com' }} автоматически на следующий день после завершения вахты.

● Автоотправка включена ({{ emailReportConfig.send_time || '08:00' }}) ○ Автоотправка выключена
🕒 Последняя отправка: {{ emailReportConfig.last_run || 'Еще не отправлялось' }} • Статус: {{ emailReportConfig.last_status }}

📅 Список вахт (периодов питания):

{{ periods.length }}
Название вахты Дата начала Дата окончания Действие
{{ p.name }} Выбрана {{ p.start_date }} {{ p.end_date }}
Вахты еще не созданы.

🔑 Учетные записи руководителей и права доступа: {{ managerAccounts.length }}

Настройка логинов, паролей, доступных вкладок, разрешенных цехов/подрядчиков и камер видеонаблюдения

➕ Создание новой учетной записи:

Заполните реквизиты и выберите разрешенные разделы
Показано пользователей: {{ filteredManagerAccounts.length }} из {{ managerAccounts.length }}
Пользователь / Цех Пароль
Доступные вкладки меню клик сохраняет сразу
Доступ к отделам Камеры CCTV Статус Действие
{{ acc.username }}
🏢 {{ acc.department_name }}
••••••••
Пресеты:
✓ Сохранено {{ getAccActiveTabsCount(acc.allowed_tabs) }}/{{ allTabsList.length }}
{{ adminAccSearchQuery ? 'Пользователи не найдены по запросу "' + adminAccSearchQuery + '"' : 'Учетные записи пользователей еще не созданы.' }}

🏢 Справочник цехов, отделов и подрядчиков: {{ departments.length }}

Управление активностью отделов, признаком подрядчика и разрешением редактирования прошлых дат

Название отдела Привязанные учетные записи Статус Тип отдела Прошлые дни Действия
{{ d.name }} Подрядчик 📁 В архиве
👤 {{ m.username }} —
Отделы не найдены по выбранному фильтру.
Принудительное обновление экспорта Вызов сервера для обновления файла с новыми картами.
Синхронизация отделов из PCards Импорт новых папок-отделов из CARDS.dbf в базу данных.
🕒 Последняя синхронизация: {{ pcardsLastSync || 'Загрузка...' }}
📄 Изменение файла CARDS.dbf: {{ pcardsFileMtime || 'Загрузка...' }}

👥 Синхронизация сотрудников 1С:ЗУП: {{ emp1cPreview.stats.total_1c_active }} в 1С

Автосинхронизация активна (каждые {{ autosync1c.interval_hours || 6 }} ч.) Автосинхронизация отключена
{{ isEmp1cSyncCollapsed ? '➕ Развернуть' : '➖ Свернуть' }}
Последний запуск: {{ autosync1c.last_run || 'еще не выполнялся' }} • Статус: {{ autosync1c.last_status }}
Всего в 1С: {{ autosync1c.stats.total_1c_active }} • Обновлено: {{ autosync1c.stats.matched_count || 0 }} • Создано: {{ autosync1c.stats.created_count || 0 }} • Уволено: {{ autosync1c.stats.dismissed_count || 0 }}

Ручной предпросмотр и синхронизация кадровых данных из 1С:ЗУП. Ручные переводы сотрудников между отделами защищены от перезаписи.

✅ {{ emp1cSuccessMsg }}
⚠️ {{ emp1cErrorMsg }}
ФИО в системе / 1С Цех Таб. № ИИН Должность Карта
{{ m.new_fio }} {{ m.new_dept }} 🔒 Ручной перевод {{ m.tab_number }} {{ m.iin || '—' }} {{ m.position }} {{ m.card_number || '—' }}
ФИО Цех назначения Таб. № ИИН Должность
{{ c.fio }} {{ c.department_name }} {{ c.tab_number }} {{ c.iin || '—' }} {{ c.position }}
ФИО Цех Таб. № Дата увольнения
{{ d.fio }} {{ d.department_name }} {{ d.tab_number || '—' }} {{ d.fired_at || 'Уволен' }}

🏢 Сопоставление подразделений 1С:ЗУП: {{ dept1cList.length }} hr_stage

{{ isDept1cListCollapsed ? '➕ Развернуть' : '➖ Свернуть' }}

Свяжите подразделения из кадровой базы 1С с внутренними цехами системы для корректного распределения сотрудников.

Всего в 1С: {{ dept1cList.length }} • Связано: {{ dept1cMappedCount }} • Работающих сотр.: {{ dept1cTotalWorkingEmployees }}
✅ {{ dept1cSuccessMsg }}
⚠️ {{ dept1cErrorMsg }}
Код 1С Подразделение в 1С Штат в 1С Цех / Отдел в системе Статус
{{ item.code_1c || '—' }} {{ item.name_1c }} {{ item.working_employees }} сотр. 0 сотр.
Игнор. ✓ Связано Не связано

🚪 СКУД HikCentral: Привязка сотрудников к турникетам: {{ hikStats.linked_count }} из {{ hikStats.total_users }} связано skudsync

{{ isHikSyncCollapsed ? '➕ Развернуть' : '➖ Свернуть' }}

Свяжите сотрудников системы с учетными записями СКУД HikCentral для автоматического расчета табеля по проходам турникетов.

В системе: {{ hikStats.total_users }} • Связано: {{ hikStats.linked_count }} • Не связано: {{ hikStats.unlinked_count }}
✅ {{ hikSuccessMsg }}
⚠️ {{ hikErrorMsg }}
№ Сотрудник в системе Цех Статус Привязка в HikCentral (СКУД) Действие
{{ idx + 1 }}
{{ emp.fio }}
{{ emp.position }}
{{ emp.department_name }} ✓ Связано 💡 Совет Не связан
{{ emp.linked_hik_name || emp.fio }}
Код: {{ emp.hik_person_code }}
{{ emp.suggested_hik.full_name }}
Код: {{ emp.suggested_hik.person_code }}
—
📹

Каталог и реестр камер видеонаблюдения {{ cctvAdminCameras.length }} камер

Настройка наименований, групп помещений, очередности и статуса активности камер

Группа:
# Поток (Stream ID) Название камеры Группа / Расположение Порядок Статус Действие
{{ idx + 1 }} {{ cam.stream_id }}

📜 Журнал аудита действий пользователей: {{ auditTotal }} записей

Фиксация всех действий в системе: изменения табелей, кадры, питание, привязка карт, учетные записи и авторизация

Период:
С: По:
№ Дата и время Пользователь / Роль Категория Описание действия Детали
Загрузка журнала аудита...
Записей в журнале за выбранный период не найдено
{{ (auditPage - 1) * auditPageSize + idx + 1 }}
{{ formatAuditDateTime(log.created_at) }}
IP: {{ log.actor_ip }}
{{ log.actor_username }} {{ log.actor_role }}
🏢 {{ log.department_name }}
{{ log.action_type_label || log.action_type }} {{ log.description }} —
Показано {{ auditLogs.length }} из {{ auditTotal }} записей (Страница {{ auditPage }} из {{ auditTotalPages }})
{{ auditPage }}
🏢

Разрешенные отделы и подрядчики

Пользователь: {{ accDeptsModalAccount.username }} (Основной цех: {{ accDeptsModalAccount.department_name }})

🏢 Основные цеха и отделы предприятия: Изменения сохраняются автоматически при клике
🚜 Подрядные организации:
Нет активных подрядных организаций.
📹

Доступ к камерам видеонаблюдения

Пользователь: {{ cctvPermAccount?.username }} ({{ cctvPermAccount?.department_name }})

Пресеты:
Выбрано: {{ cctvPermSelectedCameras.length }} из {{ cctvAdminCameras.length }}
Группа:
🔍

Детали события аудита #{{ auditActiveLog?.id }}

{{ formatAuditDateTime(auditActiveLog?.created_at) }} | {{ auditActiveLog?.actor_username }} ({{ auditActiveLog?.actor_role }})

Описание:
{{ auditActiveLog?.description }}
Структурированные данные (Payload / Изменения):
{{ JSON.stringify(auditActiveLog?.details, null, 2) }}

📈 Финансовый анализ и аудит (План vs Факт)

Сравнение плановой стоимости по отметкам и фактических транзакций по картам R-Keeper

Выполняется расчет плановых порций и опрос базы R-Keeper (это может занять до 5 секунд)...
Планируемый лимит (План)
{{ formatCurrency(analyticsSummary.calculated_sum) }} ₸
Стоимость по отмеченным галочкам
Фактический расход (Факт)
{{ formatCurrency(analyticsSummary.rk7_sum) }} ₸
Сумма чеков из R-Keeper за период
Итоговая разница (План - Факт)
{{ formatCurrency(analyticsSummary.difference) }} ₸ ({{ formatPercent(analyticsSummary.calculated_sum, analyticsSummary.rk7_sum) }})
{{ analyticsSummary.difference >= 0 ? 'Экономия выделенного лимита' : 'Перерасход средств по картам' }}

🏢 Расходы по отделам {{ analyticsDepts.length }}

Отдел План Факт Разница
{{ d.department_name }} {{ formatCurrency(d.calculated_sum) }} {{ formatCurrency(d.rk7_sum) }} {{ d.difference >= 0 ? '+' : '' }}{{ formatCurrency(d.difference) }}
({{ d.difference >= 0 ? '+' : '' }}{{ d.percent.toFixed(1) }}%)

👤 Детализация по сотрудникам {{ filteredAnalyticsEmployees.length }}

🔍
ФИО {{ getSortIcon('name') }} Отдел {{ getSortIcon('department_name') }} План {{ getSortIcon('calculated_sum') }} Факт {{ getSortIcon('rk7_sum') }} Разница {{ getSortIcon('difference') }}
{{ e.name }} {{ e.department_name }} {{ formatCurrency(e.calculated_sum) }} {{ formatCurrency(e.rk7_sum) }} {{ e.difference >= 0 ? '+' : '' }}{{ formatCurrency(e.difference) }}
({{ e.difference >= 0 ? '+' : '' }}{{ e.percent.toFixed(1) }}%)
Сотрудники не найдены.

🍽️ План питания по дням

Сводное количество запланированных порций З-О-У-ПУ на выбранную дату

⏳ Загрузка плана питания...
Нет запланированных порций на выбранную дату.
Завтраки (З)
{{ dailyPlanTotals.breakfast }}
Обеды (О)
{{ dailyPlanTotals.lunch }}
Ужины (У)
{{ dailyPlanTotals.dinner }}
Поздние Ужины (ПУ)
{{ dailyPlanTotals.late_dinner }}
Всего порций
{{ dailyPlanTotals.total }}

🏢 Сводная таблица по цехам / подразделениям

Название Отдела / Цеха Завтраки (З) Обеды (О) Ужины (У) Поздние (ПУ) Итого порций
{{ r.department_name }} {{ r.breakfast }} {{ r.lunch }} {{ r.dinner }} {{ r.late_dinner }} {{ r.total }}
ИТОГО ПОРЦИЙ {{ dailyPlanTotals.breakfast }} {{ dailyPlanTotals.lunch }} {{ dailyPlanTotals.dinner }} {{ dailyPlanTotals.late_dinner }} {{ dailyPlanTotals.total }}

🧾 Отчет по сотруднику (R-Keeper)

Фактический отчет по питанию (R-Keeper)

Официальные транзакции по картам сотрудника

Сотрудник:
{{ empReportFactData.user.fio }}
Цех / Отдел:
{{ empReportFactData.user.department_name }}
Вахта / Период:
{{ empReportFactData.period.name }}
Календарные даты вахты:
{{ formatDateRange(empReportFactData.period.start_date, empReportFactData.period.end_date) }}

📊 Сводка по блюдам

Наименование Кол-во
{{ item.dish }} {{ item.quantity }}

🕒 История пробитых чеков

Дата / Время Блюдо Кол-во
{{ formatReceiptDate(t.date) }} {{ t.time }} {{ t.dish }} {{ t.qty }}
Общая сумма по транзакциям R-Keeper: {{ empReportFactData.total_sum.toLocaleString() }} ₸
Загрузка данных R-Keeper...
Пожалуйста, выберите сотрудника для просмотра отчета.
Добавить в табель:
Загрузка данных табеля...

Табель для выбранного месяца и цеха ещё не создан.

Пожалуйста, выберите месяц, год и цех для начала работы с табелем.
Статус табеля: 🔒 Согласован и заблокирован ✍️ В редактировании (Черновик)
❓ Справка по кодам
* Редактирование заблокировано отделом кадров. Только администратор может разблокировать.
№ Ф.И.О. сотрудника Должность {{ getDayNumber(d) }} Дни Часы Ноч. Отп Б/Л Б/С
Действия
{{ idx + 1 }} {{ row.fio }}
{{ code }}
{{ calculateRowDays(row) }} {{ calculateRowHours(row) }} {{ calculateRowNightHours(row) }} {{ calculateRowVacations(row) }} {{ calculateRowSicks(row) }} {{ calculateRowUnpaid(row) }}
ИТОГО: {{ calculateTotalDays() }} {{ calculateTotalHours() }} {{ calculateTotalNightHours() }} {{ calculateTotalVacations() }} {{ calculateTotalSicks() }} {{ calculateTotalUnpaid() }}

Условные обозначения:

1111-часовая дневная смена
88-часовая смена
3/8Вахта: 3ч день, 8ч ночь (11ч всего)
ТПТолько приход (нет выхода)
ТУТолько уход (нет входа)
ВВыходной день
ОТрудовой отпуск
ББольничный лист (б/л)
б/сОтпуск без сохранения з/п
ОЖОтпуск по уходу за ребенком
НННевыясненная неявка / Прогул
ККомандировка
⏱️

Расчет рабочего времени по СКУД

HikCentral СКУД

Сотрудник: {{ tsActiveSkudRow?.fio }} (в СКУД: {{ tsActiveSkudData.matched_fio }}) | Месяц: {{ tsActiveSkudData?.month ? tsMonths.find(m => m.id === tsActiveSkudData.month)?.name : '' }} {{ tsActiveSkudData?.year }} г.

Запрос данных о проходах через турникеты СКУД...

Отработано дней
{{ tsActiveSkudData.summary.total_work_days }}
Всего рабочих часов
{{ tsActiveSkudData.summary.total_work_hours }} ч
Выходных / неявок
{{ tsActiveSkudData.summary.days_off }}
Всего проходов
{{ tsActiveSkudData.summary.total_passes }}
⚠️ Сотрудник не найден в событиях СКУД за этот период. Проверьте правильность написания ФИО в базе сотрудников.
День Дата Первый проход Последний проход Время на объекте Статус смены Код табеля
{{ dayInfo.day }} {{ dateStr }} (вых) {{ dayInfo.first_pass }} — {{ dayInfo.last_pass }} — {{ dayInfo.duration_str }} {{ dayInfo.status }}
* Вы можете скорректировать коды смен прямо в таблице перед переносом в табель.
📊

Отчет о посещаемости отдела

СКУД HikCentral {{ attReportData.period.name }}

Подразделение: {{ attReportData?.department_name || (tsAvailableDepts.find(d => d.id === attSelectedDeptId)?.name || 'Не выбран') }} | Период: {{ attStartDate }} — {{ attEndDate }} ({{ attReportData.dates.length }} дн.)

Быстрый выбор:

Формирование отчета и сопоставление отметок СКУД...

Опрос сервера турникетов HikCentral

⚠️ Внимание: {{ attReportData.skud_error }}
Всего в отделе
{{ attReportData.department_summary.total_employees }}
На вахте (с отметками)
{{ attReportData.department_summary.active_on_shift }}
Отработано дней
{{ attReportData.department_summary.total_work_days }}
Отработано часов
{{ attReportData.department_summary.total_work_hours }} ч
Проходов СКУД
{{ attReportData.department_summary.total_passes }}
Средняя явка в день
{{ attReportData.department_summary.avg_daily_attendance }} чел
🔍
Показано: {{ filteredAttEmployees.length }} из {{ attReportData.employees.length }} сотр.
# ФИО Должность
{{ d.day }}
{{ d.weekday }}
Дней Часов Прох.
{{ idx + 1 }}
{{ emp.fio }}
🏢 {{ emp.department_name }}
(СКУД: {{ emp.matched_skud_fio }})
{{ emp.position || '—' }} 11 8 {{ emp.days[d.date].suggested_code }} ТУ {{ emp.days[d.date].suggested_code }} В {{ emp.summary.total_work_days }} {{ emp.summary.total_work_hours }} {{ emp.summary.total_passes }}
Сотрудники не найдены
Всего на смене (чел.): {{ filteredAttEmployees.filter(e => e.days[d.date]?.is_work_day).length }} {{ filteredAttEmployees.reduce((sum, e) => sum + e.summary.total_work_days, 0) }} {{ filteredAttEmployees.reduce((sum, e) => sum + e.summary.total_work_hours, 0) }} {{ filteredAttEmployees.reduce((sum, e) => sum + e.summary.total_passes, 0) }}
Обозначения:
1111-часовая смена (от 10ч в СКУД)
88-часовая смена (от 7ч до 10ч в СКУД)
ТПТолько приход (нет выхода)
ТУТолько уход (нет входа)
ВВыходной / отсутствие отметок в СКУД
Всего дней в отчете: {{ attReportData.dates.length }}

👥 Реестр сотрудников (Мои кадры)

Учет личного состава подразделения, управление должностями, статусами и подготовка к объединению данных 1С, СКУД и R-Keeper

Всего в базе
{{ displayedPersonnelStats.total }}
В штате (Работают)
{{ displayedPersonnelStats.active }}
Уволены / Архив
{{ displayedPersonnelStats.inactive }}
R-Keeper / PCards
{{ displayedPersonnelStats.with_card }}
привязано карт
1С Предприятие
{{ displayedPersonnelStats.with_tab }}
таб. номеров
Подразделение:

Сотрудники подразделения

{{ filteredPersonnel.length }} чел.
Нажмите «Редактировать» для изменения реквизитов или «Перевести» для смены отдела
№ {{ getPersonnelSortIcon('id') }}
ФИО сотрудника {{ getPersonnelSortIcon('fio') }}
Должность {{ getPersonnelSortIcon('position') }}
Отдел {{ getPersonnelSortIcon('department_name') }}
Статус {{ getPersonnelSortIcon('is_active') }}
1С (Таб. №) {{ getPersonnelSortIcon('tab_number') }}
СКУД (HikCentral) {{ getPersonnelSortIcon('skud') }}
R-Keeper (Карта) {{ getPersonnelSortIcon('card_number') }}
Действия
{{ idx + 1 }}
{{ emp.fio }} 🏨 Гость 1С
📅 Визит: {{ formatDate(emp.guest_start_date) }} — {{ formatDate(emp.guest_end_date) }}
ИИН: {{ emp.iin }}
Гость {{ emp.position }} — не указана
📅 {{ emp.schedule }}
{{ emp.department_name }} 🚜 Подрядчик
Работает Уволен {{ emp.tab_number }} — СКУД —
Сотрудники не найдены по заданным критериям фильтра.
⏳ Загрузка реестра сотрудников...

➕ Новый сотрудник подразделения

✏️ Редактирование карточки сотрудника

🔁 Перевод сотрудника в другой отдел

Сотрудник: {{ personnelTransferUser.fio }}
Текущий отдел: {{ personnelTransferUser.department_name }}
🔀

Объединение сотрудников (Дубликатов)

Слияние профилей, перенос истории питания (плана) и привязанных карт

💡
Как работает объединение: Все записи плана питания (meals_records) и карты сотрудника-дубликата переносятся на Основной профиль (Эталон). Если у эталона отсутствовали таб. номер, ИИН или код турникета, они будут автоматически дозаполнены из дубликата. Профиль дубликата будет заархивирован и удален из активного реестра.
1. Эталон (Останется)
ID: {{ personnelMergeMasterUser.id }}
{{ personnelMergeMasterUser.fio }}
Отдел: {{ personnelMergeMasterUser.department_name }}
Должность: {{ personnelMergeMasterUser.position || '—' }}
Карта R-Keeper: {{ personnelMergeMasterUser.card_number || 'нет' }}
Код СКУД (Hik): {{ personnelMergeMasterUser.hik_person_code || personnelMergeMasterUser.hik_person_id || '—' }}
1С Таб. № / ИИН: {{ personnelMergeMasterUser.tab_number || '—' }} / {{ personnelMergeMasterUser.iin || '—' }}
Статус: {{ personnelMergeMasterUser.is_active ? 'В штате (работает)' : 'Уволен / архив' }}
Заявок в плане питания: {{ personnelMergePreviewData.master.total_meals }} блюд ({{ personnelMergePreviewData.master.total_days }} дней)
2. Дубликат (Будет слит и удален)
ID: {{ personnelMergeDuplicateUser.id }}
{{ personnelMergeDuplicateUser.fio }}
Отдел: {{ personnelMergeDuplicateUser.department_name }}
Должность: {{ personnelMergeDuplicateUser.position || '—' }}
Карта R-Keeper: {{ personnelMergeDuplicateUser.card_number || 'нет' }}
Код СКУД (Hik): {{ personnelMergeDuplicateUser.hik_person_code || personnelMergeDuplicateUser.hik_person_id || '—' }}
1С Таб. № / ИИН: {{ personnelMergeDuplicateUser.tab_number || '—' }} / {{ personnelMergeDuplicateUser.iin || '—' }}
Статус: {{ personnelMergeDuplicateUser.is_active ? 'В штате (работает)' : 'Уволен / архив' }}
Заявок в плане питания: ➕ {{ personnelMergePreviewData.duplicate.total_meals }} блюд ({{ personnelMergePreviewData.duplicate.total_days }} дней)
📊 Результат объединения:
  • Перенос записей плана питания: {{ personnelMergePreviewData.impact.moved_records }} новых дней (всего {{ personnelMergePreviewData.impact.total_dup_meals }} блюд).
  • Пересекающиеся даты: {{ personnelMergePreviewData.impact.merged_records }} дней (отметки питания будут безопасно объединены).
  • Привязка карт R-Keeper: {{ personnelMergePreviewData.duplicate.card_number || 'без новой карты' }}.
  • Профиль дубликата (ID {{ personnelMergeDuplicateUser.id }}) будет удален и заархивирован в журнал аудита.
🔍

Найденные дубликаты сотрудников

Автоматический поиск по совпадениям ФИО, карт, ИИН и табельных номеров

⏳ Сканирование базы данных на дубликаты...
🎉 Потенциальных дубликатов не обнаружено. Все профили чистые!
Найдено потенциальных пар: {{ autoDuplicatesList.length }} Нажмите «Объединить», чтобы открыть мастер слияния
Группа #{{ pIdx + 1 }} {{ pair.reason }}
Рекомендуемый эталон (ID: {{ pair.master.id }})
{{ pair.master.fio }}
Отдел: {{ pair.master.department_name }} | Карта: {{ pair.master.card_number || 'нет' }}
Таб: {{ pair.master.tab_number || '—' }} | ИИН: {{ pair.master.iin || '—' }} | Заявок: {{ pair.master.meals_count }}
Кандидат на слияние (ID: {{ pair.duplicate.id }})
{{ pair.duplicate.fio }}
Отдел: {{ pair.duplicate.department_name }} | Карта: {{ pair.duplicate.card_number || 'нет' }}
Таб: {{ pair.duplicate.tab_number || '—' }} | ИИН: {{ pair.duplicate.iin || '—' }} | Заявок: {{ pair.duplicate.meals_count }}
💳

История и управление картами R-Keeper

{{ cardHistoryUser.fio }} ({{ cardHistoryUser.department_name }})

💳
Текущая активная карта
{{ cardHistoryUser.current_card }} ● Активна
Карта не привязана

✨ {{ cardHistoryUser.current_card ? 'Заменить карту' : 'Выдать новую карту' }}

📜 История всех карт сотрудника Всего записей: {{ cardHistoryList.length }}

⏳ Загрузка истории карт...
История операций с картами отсутствует.
Карта Дата выдачи Дата закрытия Статус Причина / Основание
{{ c.card_number }} {{ formatCardDateTime(c.assigned_at) }} {{ c.revoked_at ? formatCardDateTime(c.revoked_at) : '—' }} Активна Закрыта {{ c.reason || '—' }}
📹

Видеонаблюдение онлайн {{ filteredCctvCameras.length }} камер доступно

Прямая трансляция потоков MediaMTX HLS с низкими задержками

Сетка:
Группы:
{{ cctvCurrentPage }} / {{ cctvTotalPages }}
⌛
Загрузка каталога камер видеонаблюдения...
🔒
Нет доступных камер видеонаблюдения

У вашей учетной записи нет разрешенных видеопотоков или ни одна камера не совпадает с условиями фильтра. Обратитесь к администратору.

Подключение к потоку...
⚠️ Поток временно недоступен {{ cam.stream_id }}
{{ cam.name }}
{{ cam.stream_id }}

{{ cctvFullscreenCamera ? cctvFullscreenCamera.name : '' }} {{ cctvFullscreenCamera ? cctvFullscreenCamera.stream_id : '' }}{{ cctvFullscreenIsHdActive ? '_main' : '' }} ✨ HD Основной поток SD Вторичный поток ⏳ Подключение HD (показ SD)...

{{ cctvFullscreenCamera ? cctvFullscreenCamera.group_name : '' }} • Основной поток высокой четкости (Main-stream HD) Вторичный поток (Sub-stream), выполняется буферизация HD...

🥛

Заявка на выдачу молока в столовой ✓ Сдана в столовую 📝 Черновик (сохранен) ⚡ Авторасчет по СКУД/питанию

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

Дата сдачи: {{ new Date(milkRequest.submitted_at).toLocaleString() }} (пользователь: {{ milkRequest.submitted_by }})
Подразделение:
Период (Вахта):
👥 Сотрудников
{{ milkTotals.total_employees }}
в заявке цеха
⏱️ Отработано смен
{{ milkTotals.total_shifts }}
СКУД / столовая
🥛 Норма за вахту
{{ milkTotals.total_period_norm }} л
0,5 л × смены
⚖️ Вх. остаток
{{ milkTotals.total_balance_in }} л
с прошлой вахты
📦 К ВЫДАЧЕ В СТОЛОВОЙ
{{ milkTotals.total_issued_liters }} шт.
упаковок по 1 литру
🔄 Исх. остаток
{{ milkTotals.total_balance_out }} л
перенос на след. вахту
Список сотрудников для выдачи молока ({{ filteredMilkItems.length }}) 💡 Число смен и вх. остаток можно редактировать прямо в ячейках
№ Ф.И.О. сотрудника Должность Отработано смен Норма/день Норма вахта Вх. долг (л) Всего (л) К ВЫДАЧЕ (1 л) Исх. остаток Источник Действ.
Нет данных для отображения. Выберите подразделение и период или нажмите «🔄 Пересчитать по СКУД».
{{ idx + 1 }} {{ item.fio }} {{ item.position }} {{ item.daily_norm }} л {{ item.period_norm }} л {{ item.total_liters }} л {{ item.liters_to_issue }} л +{{ item.carried_balance_out }} л 🚪 СКУД 🍽️ Столовая ⚡ СКУД+Еда {{ item.calc_source }}
ИТОГО ПО ПОДРАЗДЕЛЕНИЮ: {{ milkTotals.total_shifts }} {{ milkTotals.total_period_norm }} л {{ milkTotals.total_balance_in }} л {{ milkTotals.total_liters }} л {{ milkTotals.total_issued_liters }} упак. (1л) +{{ milkTotals.total_balance_out }} л
ТОО «Сарыопан» — Завод по производству извести
ЗАЯВКА-ВЕДОМОСТЬ НА ВЫДАЧУ МОЛОКА В СТОЛОВОЙ
Подразделение: {{ getMilkDeptName(milkDeptId) }} | Период: {{ getMilkPeriodName(milkPeriodId) }}
№ Ф.И.О. сотрудника Должность Смен Норма/дн Норма вахта Вх. остаток Всего К выдаче (1л) Исх. остаток Подпись сотрудника
{{ idx + 1 }} {{ it.fio }} {{ it.position }} {{ it.shifts_count }} {{ it.daily_norm }} {{ it.period_norm }} {{ it.carried_balance_in }} {{ it.total_liters }} {{ it.liters_to_issue }} {{ it.carried_balance_out }}
ИТОГО: {{ milkTotals.total_shifts }} {{ milkTotals.total_period_norm }} {{ milkTotals.total_balance_in }} {{ milkTotals.total_liters }} {{ milkTotals.total_issued_liters }} л (бут.) {{ milkTotals.total_balance_out }}
Заявку сдал (Руководитель подразделения):
Подпись: __________________ Ф.И.О.: __________________
Заявку принял (Заведующий столовой):
Подпись: __________________ Ф.И.О.: __________________
Сформировано в системе учета питания ТОО «Сарыопан». Дата распечатки: {{ new Date().toLocaleString() }}
🚐

Заявка на перевахтовку (Транспортировка) ✓ Сдана диспетчеру 📝 Черновик (сохранен) ⚡ Новая заявка

Организация транспортировки выезжающих с вахты и заезжающих сотрудников: Отдел, Ф.И.О., Телефон, Пункт назначения, Заезд / Отъезд.

Дата сдачи: {{ new Date(transferRequest.submitted_at).toLocaleString() }} (пользователь: {{ transferRequest.submitted_by }})
Режим отображения:
Подразделение:
Период (Вахта):
Пункт:
👥 Всего пассажиров
{{ transferViewMode === 'dept' ? transferTotals.total : transferAllManifestTotals.total }}
человек в списке
🟢 Заезд на вахту
{{ transferViewMode === 'dept' ? transferTotals.arrivals : transferAllManifestTotals.arrivals }}
прибывающие
🔴 Отъезд с вахты
{{ transferViewMode === 'dept' ? transferTotals.departures : transferAllManifestTotals.departures }}
убывающие
📍 Пунктов назначения
{{ transferViewMode === 'dept' ? uniqueTransferDestinations.length : transferAllManifestTotals.destinations_count }}
городов / станций
📋 Статус списка
Сдано Черновик Не сохранен
готовность к рейсу
🚌 Расчёт потребности в посадочных местах по направлениям (маршрутам): Всего пассажиров: {{ transferAllManifestTotals.total }} чел.
{{ dName }}: {{ cnt.total }} чел. (🟢 Заезд: {{ cnt.arrivals }}, 🔴 Отъезд: {{ cnt.departures }})
Список сотрудников для транспортировки ({{ filteredTransferItems.length }})
💡 Телефон, пункт назначения и примечание можно редактировать прямо в таблице
№ Ф.И.О. сотрудника Контактный телефон Пункт назначения Направление Примечание Действ.
В заявке пока нет сотрудников. Нажмите , чтобы выбрать сотрудников цеха.
{{ idx + 1 }}
{{ item.fio }}
ИТОГО ПО ПОДРАЗДЕЛЕНИЮ: {{ transferTotals.total }} чел. 🟢 Заезд: {{ transferTotals.arrivals }} 🔴 Отъезд: {{ transferTotals.departures }}
Сводный список транспортировки сотрудников завода ({{ filteredTransferManifest.length }}) Вахта: {{ getTransferPeriodName(transferPeriodId) }}
№ Подразделение Ф.И.О. сотрудника Телефон Пункт назначения Направление Примечание Статус заявки
Нет данных по перевахтовке для выбранного периода.
{{ idx + 1 }} {{ item.department_name }} {{ item.fio }} {{ item.phone || '—' }} {{ item.destination }} {{ item.direction === 'Заезд' ? '🟢 Заезд' : '🔴 Отъезд' }} {{ item.comment || '—' }} ✓ Сдана Черновик
ИТОГО ПО ВСЕМ ЦЕХАМ: {{ transferAllManifestTotals.total }} чел. 🟢 Заезд: {{ transferAllManifestTotals.arrivals }} 🔴 Отъезд: {{ transferAllManifestTotals.departures }}
ТОО «Сарыопан» — Завод по производству извести
ЗАЯВКА НА ТРАНСПОРТИРОВКУ СОТРУДНИКОВ (ПЕРЕВАХТОВКА)
Подразделение: {{ getTransferDeptName(transferDeptId) }} Сводная ведомость по всем подразделениям завода  |  Вахта: {{ getTransferPeriodName(transferPeriodId) }}
№ Отдел Ф.И.О. сотрудника Телефон Пункт назначения Заезд / Отъезд Примечание Подпись сотрудника
{{ idx + 1 }} {{ it.department_name }} {{ it.fio }} {{ it.phone || '—' }} {{ it.destination }} {{ it.direction }} {{ it.comment }}
ИТОГО ПАССАЖИРОВ: {{ transferViewMode === 'dept' ? transferTotals.total : transferAllManifestTotals.total }} чел. Заезд: {{ transferViewMode === 'dept' ? transferTotals.arrivals : transferAllManifestTotals.arrivals }} / Отъезд: {{ transferViewMode === 'dept' ? transferTotals.departures : transferAllManifestTotals.departures }}
Заявку сдал (Руководитель подразделения):
Подпись: __________________ Ф.И.О.: __________________
Заявку принял (Диспетчер транспортной службы):
Подпись: __________________ Ф.И.О.: __________________
Сформировано в системе ТОО «Сарыопан». Дата распечатки: {{ new Date().toLocaleString() }}
👥

Выбрать сотрудников цеха в заявку на перевахтовку

Цех: {{ getTransferDeptName(transferDeptId) }} (всего сотрудников: {{ transferDeptUsers.length }})

Сотрудники не найдены
🏨

Добавление гостя предприятия

Краткосрочный визит с питанием (1–3 дня максимум)

Гостя можно зарегистрировать в любом подразделении компании

📅 Сроки пребывания (1–3 дня):
Длительность: {{ guestDurationDays }} дн. (макс. 3 дня)
⚠️ Превышен лимит (макс. 3 дня)!
✓ Корректный срок
💳

Номер карты будет привязан к гостю, чтобы проходы на кассе R-Keeper сопоставлялись автоматически.

Отметки питания будут автоматически проставлены в график вахты на дни пребывания.