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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Нет меток