Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Контроллер БОРЕЙ совместно с Платформой НЕЙРОСС позволяют указывать перечень выходных и праздничных дней и ограничивать либо разрешать доступ в такие дни. 

Общие сведения

При наличии лицензии на графики работы, управление доступом в выходные и праздничные дни обеспечивается посредством функционала Специальные дни

График работы строится на основе шаблонов графиков и назначения индивидуальных правил: дней нетрудоспособности, отпуска и дополнительных выходных (отгулов), неполного рабочего дня и прочих данных. При этом учитываются специальные дни: государственные праздники, предпраздничные дни, корпоративные праздники и любые другие дни, график работы в которые зависит от календарной даты. Доступ сотрудника на предприятие осуществляется строго в соответствии с его индивидуальным графиком и только к точкам доступа, заданных Маршрутом. 

При отсутствии необходимости в полновесном функционале графиков работы, доступ в выходные дни ограничивается уровнем доступа (или режимом доступа как совокупности уровней доступа), которые позволяют задать набор временных интервалов доступа в зависимости от дня недели, например, — ограничить доступ в субботу и воскресенье [Уровни доступа]. Однако уровни доступа не позволяют учитывать праздничные дни, а также сдвиг выходных дней.

Для решения задачи управления доступом в выходные и праздничные дни реализован 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. При необходимости ограничения точек доступа обратитесь к специалистам компании ИТРИУМ с запросом на доработку скрипта.

Обновление дат календаря

При необходимости изменения календаря на следующий год, скачайте файл из файлового хранилища, измените даты на требуемые месяцы, загрузите файл обратно согласно инструкции  [Файловое хранилище → Замена содержимого файла].

Изменения календаря обновляются на контроллерах раз в сутки (около полуночи). При необходимости применить изменения сразу требуется зайти в редактор скриптов и повторно сохранить скрипт или перезагрузить контроллер.

Порядок использования

Оператор АРМ НЕЙРОСС Доступ задаёт право прохода в выходные и праздничные дни. Для этого он в свойствах пропуска задаёт в поле Проход в выходные и праздничные дни значение  Установлено

Владелец пропуска предъявляет пропуск на точку доступа в выходной день, доступ разрешается. 

Если пропуску не надо разрешение на проход в выходные и праздничные дни, доступ в такие дни запрещается, формируется стандартное событие «Доступ запрещен. Пропуск неавторизован» [События БОРЕЙ].

  • Нет меток