Version 3.1 by admin on 2026/06/07 17:48

Show last authors
1 Контроллер БОРЕЙ совместно с Платформой НЕЙРОСС позволяют указывать перечень выходных и праздничных дней и ограничивать либо разрешать доступ в такие дни.
2
3 == {{id name="Доступввыходныеипраздничныедни-Общиесведения"/}}Общие сведения ==
4
5 При наличии лицензии на графики работы, управление доступом в выходные и праздничные дни обеспечивается посредством функционала [[neyross.АРМ НЕЙРОСС Доступ.Графики работы.Специальные дни.WebHome]].
6
7 {{info}}
8 [[neyross.АРМ НЕЙРОСС Доступ.Графики работы.График работы.WebHome]] строится на основе шаблонов графиков и назначения индивидуальных правил: дней нетрудоспособности, отпуска и дополнительных выходных (отгулов), неполного рабочего дня и прочих данных. При этом учитываются специальные дни: государственные праздники, предпраздничные дни, корпоративные праздники и любые другие дни, график работы в которые зависит от календарной даты. Доступ сотрудника на предприятие осуществляется строго в соответствии с его индивидуальным графиком и только к точкам доступа, заданных Маршрутом.
9 {{/info}}
10
11 При отсутствии необходимости в полновесном функционале графиков работы, доступ в выходные дни ограничивается уровнем доступа (или режимом доступа как совокупности уровней доступа), которые позволяют задать набор временных интервалов доступа в зависимости от дня недели, например, — ограничить доступ в субботу и воскресенье ~[[[neyross.АРМ НЕЙРОСС Доступ.Уровни доступа.WebHome]]]. Однако уровни доступа не позволяют учитывать праздничные дни, а также сдвиг выходных дней.
12
13 {{info}}
14 Для решения задачи управления доступом в выходные и праздничные дни реализован LUA-скрипт, который выполняется непосредственно на контроллере БОРЕЙ и переопределяет «заводскую» логику работы контроллера. Скрипт позволяет осуществлять дополнительную проверку прав доступа в конкретные дни календаря и принимать решение о разрешении или запрете доступа. Перечень выходных и праздничных дней задаётся пользователем самостоятельно в текстовом формате и обновляется ежегодно.
15 {{/info}}
16
17 == {{id name="Доступввыходныеипраздничныедни-Алгоритмработы"/}}Алгоритм работы ==
18
19 При предъявлении валидного идентификатора (карты и проч.) на контроллер БОРЕЙ выполняется базовая проверка прав пользователя. Проверка, является ли текущий день выходным или праздничным, а также проверка прав пользователя на доступ в такие дни выполняется на последнем этапе. Пример последовательности шагов приведен в таблице ниже.
20
21 |=(((
22 № шага
23 )))|=(((
24 Название
25 )))|=(((
26 Комментарий
27 )))
28 |(((
29 1
30 )))|(((
31 Поиск пропуска
32 )))|(((
33 По предъявленному идентификатору производится поиск пропуска. Если пропуск не найден, доступ блокируется. Если найден, производится переход к следующему шагу.
34 )))
35 |(((
36 2
37 )))|(((
38 Проверка второго идентификатора (если задано)
39 )))|(((
40 При двухфакторной идентификации осуществляется проверка второго фактора (биометрия по лицам или отпечаткам пальцев, ожидание ввода пин-кода). Если второй этап идентификации не пройден, доступ блокируется. В противном случае производится переход к следующему шагу.
41 )))
42 |(((
43 3
44 )))|(((
45 Проверка режима или уровня доступа
46 )))|(((
47 Производится проверка наличия текущей точки доступа (точки доступа, на которую предъявлен идентификатор) в режиме или уровне доступа пропуска, если режим не задан. Если точки доступа нет в списке, доступ блокируется. В противном случае производится переход к следующему шагу.
48 )))
49 |(((
50 4
51 )))|(((
52 Проверка временных интервалов
53 )))|(((
54 (% class="content-wrapper" %)
55 (((
56 Проверяется, заданы ли в уровне/режиме доступа временные зоны, и разрешен ли доступ в текущий день недели и в текущее время. Если день недели «выключен» в уровне доступа или текущее время вне временного интервала, доступ блокируется. В противном случае производится переход к следующему шагу.
57 )))
58 )))
59 |(((
60 5
61 )))|(((
62 Проверка, является ли день выходным/праздничным
63 )))|(((
64 Если день не является выходным или праздничным (не перечислен в конфигурационном файле скрипта), доступ разрешается. Если да, производится переход к следующему шагу.
65 )))
66 |(((
67 6
68 )))|(((
69 Проверка разрешения на доступ в выходные и праздничные дни
70 )))|(((
71 Проверяется, задано ли в свойствах пропуска право доступа в выходные и праздничные дни. Если не задано, доступ блокируется, если задано — разрешается.
72 )))
73
74 {{info}}
75 **ОБРАТИТЕ ВНИМАНИЕ**
76
77 Проверка разрешения доступа в выходные и праздничные дни производится после проверки наличия ограничений на дни недели во временных зонах. Во избежание наложений рекомендуется в уровне доступа разрешить доступ во все дни, при необходимости задав временные интервалы.
78 {{/info}}
79
80 \\
81
82 == {{id name="Доступввыходныеипраздничныедни-Порядокнастройки"/}}Порядок настройки ==
83
84 === {{id name="Доступввыходныеипраздничныедни-НастройкаПлатформыНЕЙРОСС"/}}Настройка Платформы НЕЙРОСС ===
85
86 {{info}}
87 Вам потребуется:
88
89 * Сформировать и загрузить конфигурационный файл со списком выходных и праздничных дней;
90 * Добавить пользовательское свойство, которое будет «отвечать» за разрешение или запрет доступа в выходные и праздничные дни определённым сотрудникам, в конфигурацию системы;
91 * Добавить в форму пропуска поле со свойством, сконфигурированным на предыдущем этапе.
92 {{/info}}
93
94 \\
95
96 Скопируйте приведённый ниже код и сохраните в файле calendar.json.(%%)
97
98 {{code language="java"}}
99 {
100 "1": [1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 20, 21, 27, 28],
101 "2": [3, 4, 10, 11, 17, 18, 23, 24, 25],
102 "3": [2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31],
103 "4": [6, 7, 13, 14, 21, 21, 28, 29, 30],
104 "5": [1, 4, 5, 9, 10, 11, 12, 18, 19, 25, 26],
105 "6": [1, 2, 8, 9, 12, 15, 16, 22, 23, 29, 30],
106 "7": [6, 7, 13, 14, 20, 21, 27, 28],
107 "8": [3, 4, 10, 11, 17, 18, 24, 25, 31],
108 "9": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31],
109 "10": [5, 6, 12, 13, 19, 20, 26, 27],
110 "11": [3, 4, 9, 10, 16, 17, 23, 24, 30],
111 "12": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31]
112 }
113 {{/code}}
114
115 {{info}}
116 Файл calendar.json содержит список выходных и праздничных дней на 2024 согласно общероссийскому трудовому календарю. В кавычках указан номер месяца (например, "3" означает Март), далее в квадратных скобках через запятую перечислены выходные и праздничные дни этого месяца (например в марте это дни: 2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31).
117 {{/info}}
118
119 \\
120
121 Отредактируйте данные согласно внутреннему трудовому распорядку вашей организации. Сохраните изменения. Файл можно откорректировать в любом текстовом редакторе, например, Блокнот, Notepad++ и другие.
122
123 {{info}}
124 **ПОДСКАЗКА**
125
126 Если вы заполняете календарь в середине года, указывайте даты текущего года для текущего и всех последующих месяцев. Для уже прошедших месяцев есть смысл указывать даты следующего года.
127 {{/info}}
128
129 \\
130
131 {{id name="Доступввыходныеипраздничныедни-JSON_link"/}}Загрузите полученный конфигурационный файл в файловое хранилище Платформы НЕЙРОСС ~[[[ui.Параметры узла.Накопители и файлы.Файловое хранилище.WebHome]]].
132
133 [[image:attach:file_storage_calendar.png||width="900"]]
134
135 Скопируйте ссылку на файл. Ссылка потребуется для настройки скрипта в контроллере БОРЕЙ.
136
137 \\
138
139 Добавьте в конфигурацию Платформы НЕЙРОСС пользовательское свойство пропуска, в котором будет храниться разрешение на доступ в выходные и праздничные дни для определённых сотрудников ~[[[neyross.Настройка Платформы НЕЙРОСС.Настройка функций контроля доступа.Добавление пользовательских свойств.WebHome]]].
140
141 {{error}}
142 **ВАЖНО**
143
144 Обратите внимание, что требуется добавить пользовательское свойство Пропуска, а не Владельца.
145 {{/error}}
146
147 \\
148
149 [[image:attach:userfields_days_off_allowed.png||height="250"]]
150
151 |=(% style="width: 82.0px;" %)(((
152 Поле
153 )))|=(% style="width: 29.0px;" %)(((
154 Значение
155 )))|=(% style="width: 517.0px;" %)(((
156 Комментарий
157 )))
158 |(% style="width: 82.0px;" %)(((
159 Название
160 )))|(% style="width: 29.0px;" %)(((
161 Проход в выходные и праздничные дни
162 )))|(% style="width: 517.0px;" %)(((
163 Название поля может быть любым.
164 )))
165 |(% style="width: 82.0px;" %)(((
166 Уникальный ключ
167 )))|(% style="width: 29.0px;" %)(((
168 days_off_allowed
169 )))|(% style="width: 517.0px;" %)(((
170 Ключ используется в коде скрипта контроллера БОРЕЙ. Изменение не рекомендуется.
171 )))
172 |(% style="width: 82.0px;" %)(((
173 Тип данных
174 )))|(% style="width: 29.0px;" %)(((
175 Переключатель
176 )))|(% style="width: 517.0px;" %)(((
177 Другие типы полей скриптом не поддерживаются.
178 )))
179
180 \\
181
182 Добавьте новое свойство в форму пропуска ~[[[neyross.Настройка Платформы НЕЙРОСС.Настройка функций контроля доступа.Настройка форм ввода данных.WebHome]]]. Это легко сделать с помощью конструктора форм.
183
184 [[image:attach:userfields_days_off_allowed_to_form.png||width="550"]]
185
186 {{info}}
187 Если вы используете пользовательские HTML-формы, обратитесь к специалистам компании ИТРИУМ за инструкциями по добавлению поля.
188 {{/info}}
189
190 \\
191
192 === {{id name="Доступввыходныеипраздничныедни-НастройкаБОРЕЙ"/}}Настройка БОРЕЙ ===
193
194 {{info}}
195 Вам потребуется сформировать и загрузить LUA-скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни.
196 {{/info}}
197
198 Скопируйте приведённый ниже код.
199
200 {{code language="java"}}
201 local pacs = require("pacs")
202 local log = require("log")
203 local common = require("common")
204 local http = require("http")
205
206 local logger = log.get_logger("days_off.lua")
207
208 local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff"
209 local DAYS_OFF_ALLOWED_PROPERTY = "days_off_allowed"
210
211 local DAYS_OFF = {}
212
213 local function is_day_off(date_to_check)
214 logger:debug("checking if day off today")
215 if date_to_check ~=nil then
216 for i,days in pairs(DAYS_OFF) do
217 if i == tostring(date_to_check.tm_mon+1) then
218 for idx,day in pairs(days) do
219 if idx ~= "__type" then
220 if day == date_to_check.tm_mday then
221 logger:debug("It is day off today!")
222 return true
223 end
224 end
225 end
226 end
227 end
228 end
229 logger:debug("It is not day off today!")
230 return false
231 end
232
233 local function days_off_allowed(token)
234 logger:debug("checking process_data for point="..token)
235 if pacs.process_data ~= nil and type(pacs.process_data) == "table" and pacs.process_data[token] ~= nil then
236 for _,process_data in pairs(pacs.process_data[token]) do
237 if process_data.pass then
238 logger:debug("found pass="..process_data.pass.uuid)
239 if process_data.pass.properties then
240 for _,property in pairs(process_data.pass.properties) do
241 if string.sub(property.key,1,string.len(DAYS_OFF_ALLOWED_PROPERTY)) == DAYS_OFF_ALLOWED_PROPERTY then
242 return property.value == "true"
243 end
244 end
245 end
246 end
247 end
248 end
249 return false
250 end
251
252 local function check_day_off_right(token)
253 if days_off_allowed(token) == false then
254 local currenttime = common.now()
255 local datetime = common.localtime(currenttime)
256 logger:info( tostring(datetime.tm_mday) .. "/" .. tostring(datetime.tm_mon+1) .. "/" .. tostring(datetime.tm_year+1900))
257 logger:info( tostring(datetime.tm_hour) .. ":" .. tostring(datetime.tm_min) .. ":" .. tostring(datetime.tm_sec))
258
259 if is_day_off(datetime) then
260 return false
261 end
262 end
263 return true
264 end
265
266 -- calendar
267 local calendar_http_handler = {}
268
269 function calendar_http_handler:on_http_response(response_data)
270 if response_data == nil then
271 logger:error("connection has failed; no response received")
272 else
273 logger:debug("response received; status="..response_data.status..", type(body)="..log.stringify(response_data.body));
274 DAYS_OFF = response_data.body
275 end
276 end
277
278 function check_calendar_update(period)
279 logger:info("Starting timeout on "..tostring(period).." seconds")
280 set_timeout("check_calendar_update_timeout", period*1000)
281 end
282
283 function get_calendar()
284 local http_request = {
285 url = CALENDAR_URL,
286 method = http.METHOD.GET,
287 version = http.VERSION.HTTP10,
288 timeout = 5000
289 }
290 http.with(calendar_http_handler):transmit(http_request)
291 end
292
293 function check_calendar_update_timeout()
294 logger:info("Timeout!")
295 local currenttime = common.now()
296 local datetime = common.localtime(currenttime)
297 if datetime.tm_hour == 0 and datetime.tm_min == 30 then
298 get_calendar()
299 end
300 check_calendar_update(60)
301 end
302
303 get_calendar()
304 check_calendar_update(60)
305
306 local function inject_patch(instance)
307
308 instance.process_granted = function(self)
309 if (self.anonymous_mode == 0) then
310 local ready = true
311 if (self.state ~= pacs.STATE.READY) then
312 ready = false
313 end
314
315 if ready then
316 logger:debug("all points are ready; checking timezone for pacs")
317
318 if check_day_off_right(self.token) then
319 getmetatable(self).__index.process_granted(self)
320 else
321 pacs_notify(self.token, "A2")
322 getmetatable(self).__index.process_denied(self)
323 end
324 else
325 -- invoke base process_granted implementation
326 logger:debug("access point not ready; DENIE ACCESS")
327 pacs_notify(self.token, "A2")
328 getmetatable(self).__index.process_denied(self)
329 end -- if ready check
330 else
331 logger:debug("Exit pushbutton pressed; GRANTING ACCESS")
332 getmetatable(self).__index.process_granted(self)
333 end
334 end -- process_granted
335 end
336
337 -- inject to every access point if needed
338 for key,instance in pairs(pacs.ap_instance) do
339 logger:debug("injecting patch to ap with id="..instance.id.." (token="..instance.token..")")
340 inject_patch(instance)
341 end
342
343 logger:info("days off script loaded!")
344
345 {{/code}}
346
347 В веб-интерфейсе контроллера БОРЕЙ перейдите к разделу настройки скриптов ~[[[ui.Параметры узла.Скрипты.WebHome]]].
348
349 В группе **Скрипты автоматизации** нажмите на кнопку **Перейти в редактор скриптов**.
350
351 [[image:attach:scrypt_redactor_btn.png||height="160"]]
352
353 В открывшемся редакторе скриптов вставьте скопированный код скрипта.
354
355 Измените параметр
356
357 {{code language="java"}}
358 local CALENDAR_URL
359 {{/code}}
360
361 Указав в кавычках ссылку на загруженный в Платформу НЕЙРОСС конфигурационный файл ([[ссылка>>doc:||anchor="Доступввыходныеипраздничныедни-JSON_link"]]). В вашей ссылке будет IP-адрес вашей Платформы и другой уникальный идентификатор (uuid).
362
363 {{code language="java"}}
364 local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff"
365 {{/code}}
366
367 [[image:attach:days_off_script_redactor.png||width="650"]]
368
369 Сохраните изменения.
370
371 Загрузите скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни.
372
373 {{info}}
374 Скрипт меняет алгоритм доступа для всех точек доступа контроллера. включая точки доступа модулей М1 и М3. При необходимости ограничения точек доступа обратитесь к специалистам компании ИТРИУМ с запросом на доработку скрипта.
375 {{/info}}
376
377 === {{id name="Доступввыходныеипраздничныедни-Обновлениедаткалендаря"/}}Обновление дат календаря ===
378
379 При необходимости изменения календаря на следующий год, скачайте файл из файлового хранилища, измените даты на требуемые месяцы, загрузите файл обратно согласно инструкции «Замена содержимого файла» ~[[[ui.Параметры узла.Накопители и файлы.Файловое хранилище.WebHome]]].
380
381 Изменения календаря обновляются на контроллерах раз в сутки (около полуночи). При необходимости применить изменения сразу требуется зайти в редактор скриптов и повторно сохранить скрипт или перезагрузить контроллер.
382
383 == {{id name="Доступввыходныеипраздничныедни-Порядокиспользования"/}}Порядок использования ==
384
385 Оператор [[neyross.АРМ НЕЙРОСС Доступ.WebHome]] задаёт право прохода в выходные и праздничные дни. Для этого он в свойствах пропуска задаёт в поле **Проход в выходные и праздничные дни** значение [[image:confluenceAttach:page:ui.Параметры узла@fa-on.png||thumbnail="true" height="18"]] **Установлено**.
386
387 Владелец пропуска предъявляет пропуск на точку доступа в выходной день, доступ разрешается.
388
389 {{info}}
390 Если пропуску не надо разрешение на проход в выходные и праздничные дни, доступ в такие дни запрещается, формируется стандартное событие «Доступ запрещен. Пропуск неавторизован» ~[[[doc:borey3.Руководство администратора БОРЕЙ Н.События БОРЕЙ.WebHome]]].
391 {{/info}}

Новый БОРЕЙ