• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Бизнес часы? как посчитать?

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

Есть что-нить аналогичное функции @BusinessDays только в часах?
 
O

Omh

А если умножить на 24 :)
Что это за бред я написал почти год назад?
 
F

fedotxxl

А если мне нужна точность до часу?
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
33
непонятно что конкретно надо)
Получаем количество дней между датами, и умножаем на рабочий день.
Если нужен учет праздников и сокращенных дней то писать свою функцию.
 
F

fedotxxl

Нужно к 17:45 пятницы прибавить 3 рабочих часа и получить 12:45 понедельника, например
 
A

Akupaka

попробуй так подходит? :(

17-45 пятницы + 3 раб. часа:
StartDay - указанный день
Tdmax - поздняя границы времени указанного дня (т.е. пятница = 17-45, среда = 18-00, определяется из сетки рабочего времени по дням)
Td - указанное время указанного дня
Tdend - кол-во часов до окончания указанного дня
Ttoadd - кол-во часов, которое нужно добавить к указанному времени
Ttonewd - кол-во часов, которое нужно добавить к началу нового рабочего дня

Tdmax - Td = Tdend
Ttonewd = Ttoadd - Tdend
NewDay = StartDay
NewDay = nextworkdate(NewDay) (узнаем следующую рабочую дату от указанной)
NewDayWT = workhours(NewDay) (кол-во рабочих часов в новом дне, определяется из сетки рабочего времени по дням)
while Ttonewd > NewDayWT
Ttonewd = Ttonewd - NewDayWT
NewDay = nextworkdate(NewDay)
NewDayWT = workhours(NewDay)
end while
result = starttime(NewDay) + Ttonewd (starttime - начало рабочего дня в часах)
 
K

K-Fire

В общем эта задача ИМХО решается правильно только наличием своей самописной функции, плюс специального справочника раб/выходных дней, плюс настройками раб. часов для каждого отдельного сотрудника. Ну и наверное я еще не все случаи вспомнил которые могут влиять на результат, так что еще могут какие-то настройки понадобится.


UDP Сразу не заметил что Akupaka написал. Похоже что мы одинаково думаем :)
 
F

fedotxxl

Да, ещё вопрос - есть ли какие штатные функции, которые используют Holidays (справочник, который забивается в names.nsf)?
 
F

fedotxxl

Поднимаю свою же тему
Вопрос прежний, не решенный =)
Да, ещё вопрос - есть ли какие штатные функции, которые используют Holidays (справочник, который забивается в names.nsf)?
Наверняка уже писали подобные функции... поделитесь =)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
178
ф-ция на пост выше - с ошибкой (при одинаковом дне)!
Код:
If numDays = 1 Then
seconds = endTime.TimeDifferenceDouble(startTime)
If seconds < 0 Then
BusinessHours = -1
Else
BusinessHours = (seconds / 60) / 60
End If
Exit Function
End If
это не будет работать, в нек. случаях
патеч:
Код:
''*не правильная предпосылка: If @BusinessDays returns the value 1, then the start day and end day are the same working day.
If numDays = 1 Then
'патч ошибки		
If(startTime.DateOnly = endTime.DateOnly) Then
'			seconds = endTime.TimeDifferenceDouble(startTime)
'			If seconds < 0 Then
'				BusinessMinutes = -1
'			Else
'				BusinessMinutes = (seconds / 60)
'			End If
BusinessMinutes=OneDayWithLunch(startTime, endTime)
Exit Function
End If
End If

я её правил и дорабатывал для учёта времени обеда, и переводил на минуты
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
178
и вот-така ф-ция вычисления холидаусов из НАБ
Код:
	Dim Holiday As Variant
'выходные и празники - из адрессной книги	
Holiday =Evaluate({@DbLookup ("Notes":"ReCache"; "} & Dbset .Server & {" :"names.nsf";"Holidays";"Russian";"RepeatStartDate")})

If Isarray(Holiday) Then
'set Holiday array as datetime array	
Dim dI As Integer
Forall d In Holiday
Redim Preserve dtHolidays(dI) As NotesDateTime
Set dtHolidays(dI)=New NotesDateTime(d)
dI=dI+1
End Forall
Else
''* loopback for server outage
Holiday_S = "01.01.2009"
Redim dtHolidays(0) As NotesDateTime
Set dtHolidays(0)=New NotesDateTime(Holiday_S)
End If
массивчег подаём на вход ф-ции выше
 
F

fedotxxl

lmike, (по первому посту) каким образом функция учитываем данные из names.nsf?
lmike, (по второму посту) насколько я понял, не учитывается информация, выходной это (free) или рабочий день (busy). Все дни, заведенные names.nsf считаются выходными... не подходит... + инструкции типа "Move to Nearest Weekday" не исполняются
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
178
1 - подсовываем массив DT
2 - не понятно - что не подходит и причём здесь "Move to Nearest Weekday"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!