Контроллер БОРЕЙ совместно с Платформой НЕЙРОСС позволяют указывать перечень выходных и праздничных дней и ограничивать либо разрешать доступ в такие дни.
Общие сведения
При наличии лицензии на графики работы, управление доступом в выходные и праздничные дни обеспечивается посредством функционала Специальные дни.
График работы строится на основе шаблонов графиков и назначения индивидуальных правил: дней нетрудоспособности, отпуска и дополнительных выходных (отгулов), неполного рабочего дня и прочих данных. При этом учитываются специальные дни: государственные праздники, предпраздничные дни, корпоративные праздники и любые другие дни, график работы в которые зависит от календарной даты. Доступ сотрудника на предприятие осуществляется строго в соответствии с его индивидуальным графиком и только к точкам доступа, заданных Маршрутом.
При отсутствии необходимости в полновесном функционале графиков работы, доступ в выходные дни ограничивается уровнем доступа (или режимом доступа как совокупности уровней доступа), которые позволяют задать набор временных интервалов доступа в зависимости от дня недели, например, — ограничить доступ в субботу и воскресенье [Уровни доступа]. Однако уровни доступа не позволяют учитывать праздничные дни, а также сдвиг выходных дней.
Для решения задачи управления доступом в выходные и праздничные дни реализован LUA-скрипт, который выполняется непосредственно на контроллере БОРЕЙ и переопределяет «заводскую» логику работы контроллера. Скрипт позволяет осуществлять дополнительную проверку прав доступа в конкретные дни календаря и принимать решение о разрешении или запрете доступа. Перечень выходных и праздничных дней задаётся пользователем самостоятельно в текстовом формате и обновляется ежегодно.
Алгоритм работы
При предъявлении валидного идентификатора (карты и проч.) на контроллер БОРЕЙ выполняется базовая проверка прав пользователя. Проверка, является ли текущий день выходным или праздничным, а также проверка прав пользователя на доступ в такие дни выполняется на последнем этапе. Пример последовательности шагов приведен в таблице ниже.
№ шага | Название | Комментарий |
---|---|---|
1 | Поиск пропуска | По предъявленному идентификатору производится поиск пропуска. Если пропуск не найден, доступ блокируется. Если найден, производится переход к следующему шагу. |
2 | Проверка второго идентификатора (если задано) | При двухфакторной идентификации осуществляется проверка второго фактора (биометрия по лицам или отпечаткам пальцев, ожидание ввода пин-кода). Если второй этап идентификации не пройден, доступ блокируется. В противном случае производится переход к следующему шагу. |
3 | Проверка режима или уровня доступа | Производится проверка наличия текущей точки доступа (точки доступа, на которую предъявлен идентификатор) в режиме или уровне доступа пропуска, если режим не задан. Если точки доступа нет в списке, доступ блокируется. В противном случае производится переход к следующему шагу. |
4 | Проверка временных интервалов | Проверяется, заданы ли в уровне/режиме доступа временные зоны, и разрешен ли доступ в текущий день недели и в текущее время. Если день недели «выключен» в уровне доступа или текущее время вне временного интервала, доступ блокируется. В противном случае производится переход к следующему шагу. |
5 | Проверка, является ли день выходным/праздничным | Если день не является выходным или праздничным (не перечислен в конфигурационном файле скрипта), доступ разрешается. Если да, производится переход к следующему шагу. |
6 | Проверка разрешения на доступ в выходные и праздничные дни | Проверяется, задано ли в свойствах пропуска право доступа в выходные и праздничные дни. Если не задано, доступ блокируется, если задано — разрешается. |
ОБРАТИТЕ ВНИМАНИЕ
Проверка разрешения доступа в выходные и праздничные дни производится после проверки наличия ограничений на дни недели во временных зонах. Во избежание наложений рекомендуется в уровне доступа разрешить доступ во все дни, при необходимости задав временные интервалы.
Порядок настройки
Настройка Платформы НЕЙРОСС
Вам потребуется:
- Сформировать и загрузить конфигурационный файл со списком выходных и праздничных дней;
- Добавить пользовательское свойство, которое будет «отвечать» за разрешение или запрет доступа в выходные и праздничные дни определённым сотрудникам, в конфигурацию системы;
- Добавить в форму пропуска поле со свойством, сконфигурированным на предыдущем этапе.
Скопируйте приведённый ниже код и сохраните в файле calendar.json.
{ "1": [1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 20, 21, 27, 28], "2": [3, 4, 10, 11, 17, 18, 23, 24, 25], "3": [2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31], "4": [6, 7, 13, 14, 21, 21, 28, 29, 30], "5": [1, 4, 5, 9, 10, 11, 12, 18, 19, 25, 26], "6": [1, 2, 8, 9, 12, 15, 16, 22, 23, 29, 30], "7": [6, 7, 13, 14, 20, 21, 27, 28], "8": [3, 4, 10, 11, 17, 18, 24, 25, 31], "9": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31], "10": [5, 6, 12, 13, 19, 20, 26, 27], "11": [3, 4, 9, 10, 16, 17, 23, 24, 30], "12": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31] }
Файл calendar.json содержит список выходных и праздничных дней на 2024 согласно общероссийскому трудовому календарю. В кавычках указан номер месяца (например, "3" означает Март), далее в квадратных скобках через запятую перечислены выходные и праздничные дни этого месяца (например в марте это дни: 2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31).
Отредактируйте данные согласно внутреннему трудовому распорядку вашей организации. Сохраните изменения. Файл можно откорректировать в любом текстовом редакторе, например, Блокнот, Notepad++ и другие.
ПОДСКАЗКА
Если вы заполняете календарь в середине года, указывайте даты текущего года для текущего и всех последующих месяцев. Для уже прошедших месяцев есть смысл указывать даты следующего года.
Загрузите полученный конфигурационный файл в файловое хранилище Платформы НЕЙРОСС [Файловое хранилище].
Скопируйте ссылку на файл. Ссылка потребуется для настройки скрипта в контроллере БОРЕЙ.
Добавьте в конфигурацию Платформы НЕЙРОСС пользовательское свойство пропуска, в котором будет храниться разрешение на доступ в выходные и праздничные дни для определённых сотрудников [Добавление пользовательских свойств].
ВАЖНО
Обратите внимание, что требуется добавить пользовательское свойство Пропуска, а не Владельца.
Поле | Значение | Комментарий |
---|---|---|
Название | Проход в выходные и праздничные дни | Название поля может быть любым. |
Уникальный ключ | days_off_allowed | Ключ используется в коде скрипта контроллера БОРЕЙ. Изменение не рекомендуется. |
Тип данных | Переключатель | Другие типы полей скриптом не поддерживаются. |
Добавьте новое свойство в форму пропуска [Настройка форм ввода данных]. Это легко сделать с помощью конструктора форм.
Если вы используете пользовательские HTML-формы, обратитесь к специалистам компании ИТРИУМ за инструкциями по добавлению поля.
Настройка БОРЕЙ
Вам потребуется сформировать и загрузить LUA-скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни.
Скопируйте приведённый ниже код.
local pacs = require("pacs") local log = require("log") local common = require("common") local http = require("http") local logger = log.get_logger("days_off.lua") local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff" local DAYS_OFF_ALLOWED_PROPERTY = "days_off_allowed" local DAYS_OFF = {} local function is_day_off(date_to_check) logger:debug("checking if day off today") if date_to_check ~=nil then for i,days in pairs(DAYS_OFF) do if i == tostring(date_to_check.tm_mon+1) then for idx,day in pairs(days) do if idx ~= "__type" then if day == date_to_check.tm_mday then logger:debug("It is day off today!") return true end end end end end end logger:debug("It is not day off today!") return false end local function days_off_allowed(token) logger:debug("checking process_data for point="..token) if pacs.process_data ~= nil and type(pacs.process_data) == "table" and pacs.process_data[token] ~= nil then for _,process_data in pairs(pacs.process_data[token]) do if process_data.pass then logger:debug("found pass="..process_data.pass.uuid) if process_data.pass.properties then for _,property in pairs(process_data.pass.properties) do if string.sub(property.key,1,string.len(DAYS_OFF_ALLOWED_PROPERTY)) == DAYS_OFF_ALLOWED_PROPERTY then return property.value == "true" end end end end end end return false end local function check_day_off_right(token) if days_off_allowed(token) == false then local currenttime = common.now() local datetime = common.localtime(currenttime) logger:info( tostring(datetime.tm_mday) .. "/" .. tostring(datetime.tm_mon+1) .. "/" .. tostring(datetime.tm_year+1900)) logger:info( tostring(datetime.tm_hour) .. ":" .. tostring(datetime.tm_min) .. ":" .. tostring(datetime.tm_sec)) if is_day_off(datetime) then return false end end return true end -- calendar local calendar_http_handler = {} function calendar_http_handler:on_http_response(response_data) if response_data == nil then logger:error("connection has failed; no response received") else logger:debug("response received; status="..response_data.status..", type(body)="..log.stringify(response_data.body)); DAYS_OFF = response_data.body end end function check_calendar_update(period) logger:info("Starting timeout on "..tostring(period).." seconds") set_timeout("check_calendar_update_timeout", period*1000) end function get_calendar() local http_request = { url = CALENDAR_URL, method = http.METHOD.GET, version = http.VERSION.HTTP10, timeout = 5000 } http.with(calendar_http_handler):transmit(http_request) end function check_calendar_update_timeout() logger:info("Timeout!") local currenttime = common.now() local datetime = common.localtime(currenttime) if datetime.tm_hour == 0 and datetime.tm_min == 30 then get_calendar() end check_calendar_update(60) end get_calendar() check_calendar_update(60) local function inject_patch(instance) instance.process_granted = function(self) if (self.anonymous_mode == 0) then local ready = true if (self.state ~= pacs.STATE.READY) then ready = false end if ready then logger:debug("all points are ready; checking timezone for pacs") if check_day_off_right(self.token) then getmetatable(self).__index.process_granted(self) else pacs_notify(self.token, "A2") getmetatable(self).__index.process_denied(self) end else -- invoke base process_granted implementation logger:debug("access point not ready; DENIE ACCESS") pacs_notify(self.token, "A2") getmetatable(self).__index.process_denied(self) end -- if ready check else logger:debug("Exit pushbutton pressed; GRANTING ACCESS") getmetatable(self).__index.process_granted(self) end end -- process_granted end -- inject to every access point if needed for key,instance in pairs(pacs.ap_instance) do logger:debug("injecting patch to ap with id="..instance.id.." (token="..instance.token..")") inject_patch(instance) end logger:info("days off script loaded!")
В веб-интерфейсе контроллера БОРЕЙ перейдите к разделу настройки скриптов [Скрипты].
В группе Скрипты автоматизации нажмите на кнопку Перейти в редактор скриптов.
В открывшемся редакторе скриптов вставьте скопированный код скрипта.
Измените параметр
local CALENDAR_URL
Указав в кавычках ссылку на загруженный в Платформу НЕЙРОСС конфигурационный файл (ссылка). В вашей ссылке будет IP-адрес вашей Платформы и другой уникальный идентификатор (uuid).
local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff"
Сохраните изменения.
Загрузите скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни.
Скрипт меняет алгоритм доступа для всех точек доступа контроллера. включая точки доступа модулей М1 и М3. При необходимости ограничения точек доступа обратитесь к специалистам компании ИТРИУМ с запросом на доработку скрипта.
Обновление дат календаря
При необходимости изменения календаря на следующий год, скачайте файл из файлового хранилища, измените даты на требуемые месяцы, загрузите файл обратно согласно инструкции «Замена содержимого файла» [Файловое хранилище].
Изменения календаря обновляются на контроллерах раз в сутки (около полуночи). При необходимости применить изменения сразу требуется зайти в редактор скриптов и повторно сохранить скрипт или перезагрузить контроллер.
Порядок использования
Оператор АРМ НЕЙРОСС Доступ задаёт право прохода в выходные и праздничные дни. Для этого он в свойствах пропуска задаёт в поле Проход в выходные и праздничные дни значение Установлено.
Владелец пропуска предъявляет пропуск на точку доступа в выходной день, доступ разрешается.
Если пропуску не надо разрешение на проход в выходные и праздничные дни, доступ в такие дни запрещается, формируется стандартное событие «Доступ запрещен. Пропуск неавторизован» [События БОРЕЙ].