- Сообщения
- 8,671
- Репутация
- 2,481
Версия AutoIt: 3.3.10.2
Описание:
Требуется разработать функцию, которая смогла бы детально подсчитать процентное соотношение рабочих часов.
Известно что на многих предприятиях и фирмах (так по крайней мере у нас в Израиле), за дополнительные часы работы есть доплата, также доплата полагается и за работу в выходные и праздники, вот собственно это и следует подсчитать по определённому алгоритму.
Я уже сделал набросок того как я это вижу, и что нужно учитывать при подсчёте.
В наброске ниже есть уже рабочие вспомогательные функции, которые мне помогли написать в моей же теме "Подсчёт разницы времени с учётом захода солнца", за что ребятам большое спасибо.
Пытался сделать сам, честно, но мозг видимо уже не тот, заржавел я немного :whistle:...
Вот несколько примеров, где показано наглядно при каком раскладе какой должен быть результат (обратите также внимание, что параметр $bHolidayIn иногда меняется, вместе с ним меняется и параметр $sHolidayInOutTime):
№1
№2
№3
Вот собственно сам набросок скрипта для тестирования и построения функции подсчёта:
Примечания:
Если $sHolidayInOutTime не указан (0), то считать все часы нужно без учёта захода или выхода праздника, т.е по обычной схеме подсчёта часов и часов переработки.
В наброске нужно доделать (точнее проработать) функцию _PrecentCalc.
Задача очень интересная, и я уверен что есть несложное решение, но мозг кипел пока я сам пытался это решить.
Спасибо за внимание.
Описание:
Требуется разработать функцию, которая смогла бы детально подсчитать процентное соотношение рабочих часов.
Известно что на многих предприятиях и фирмах (так по крайней мере у нас в Израиле), за дополнительные часы работы есть доплата, также доплата полагается и за работу в выходные и праздники, вот собственно это и следует подсчитать по определённому алгоритму.
Я уже сделал набросок того как я это вижу, и что нужно учитывать при подсчёте.
В наброске ниже есть уже рабочие вспомогательные функции, которые мне помогли написать в моей же теме "Подсчёт разницы времени с учётом захода солнца", за что ребятам большое спасибо.
Пытался сделать сам, честно, но мозг видимо уже не тот, заржавел я немного :whistle:...
Вот несколько примеров, где показано наглядно при каком раскладе какой должен быть результат (обратите также внимание, что параметр $bHolidayIn иногда меняется, вместе с ним меняется и параметр $sHolidayInOutTime):
№1
Код:
;Тут "Total hours" должно быть 16 (всего часов)
;100% должно быть 8
;125% должно быть 2
;150% это 0, поскольку $vExtraPaymentAbove150 = True, свыше 10-ти часов идёт надбавка в 50%, а к этому времени идёт работа в праздничные часы, поэтому по сути остальные часы это 200%.
;175 это 0, см. выше
;200% должно быть 6
$bHolidayIn = True ;Это значит что праздник заходит (начинается)
_PrecentCalc('07:00', '23:00', $bHolidayIn, $sHolidayInOutTime, $vExtraPaymentAbove150)
№2
Код:
;Тут "Total hours" должно быть 10 (всего часов)
;100% должно быть 4
;125% должно быть 0 (от 13:00 до 17:00 (время захода праздника) 4 часа, поэтому остальное уже надбавка в 50%)
;150% это 4, поскольку в остальные часы идёт надбавка в 25%, как часы переработки (свыше 8-и).
;175 должно быть 2 (те самые часы переработки, где 25% добавляются к 50% т.к уже пошло время работы в праздничные часы)
;200% это 0, надбавки уже нет
$bHolidayIn = True ;Это значит что праздник заходит (начинается)
_PrecentCalc('13:00', '23:00', $bHolidayIn, $sHolidayInOutTime, $vExtraPaymentAbove150)
№3
Код:
;Тут "Total hours" должно быть 16 (всего часов)
;100% должно быть 0
;125% должно быть 0
;150% это 16, т.е все часы, т.к от 07:00 (начало работы) и до 17:00 (время "выхода" праздника), это часы в 150%, а дальше уже свыше 10-ти часов, т.е это часы переработки где идёт надбавка в 50%, т.е тоже 150%
;175 должно быть 0
;200% должно быть 0
$bHolidayIn = False ;Это значит что праздник выходит (заканчивается)
_PrecentCalc('07:00', '23:00', $bHolidayIn, $sHolidayInOutTime, $vExtraPaymentAbove150)
Вот собственно сам набросок скрипта для тестирования и построения функции подсчёта:
Код:
Global $vExtraPayment125 = 9 ;Оплата в 125% если число раб. часов достигло этого значения
Global $vExtraPayment150 = 10 ;Оплата в 150% если число раб. часов достигло этого значения
Global $vHolidayInTime = '17:00' ;Время "захода" (начало) праздника (время захода солнца)
Global $vHolidayOutTime = '17:00' ;Время "выхода" (конец) праздника (время захода солнца)
Global $vExtraPaymentAbove150 = True ;Учитывать подсчёт экстра-часов (свыше 150%), в некоторых случаях это не нужно учитывать
Global $bHolidayIn = True ;Указывает на то, начинается или нет время с которого следует считать часы работы как праздн. часы (время указывается в след. параметре)
Global $sHolidayInOutTime = $bHolidayIn ? $vHolidayInTime : $vHolidayOutTime
$aPrecentCalc = _PrecentCalc('07:00', '23:00', $bHolidayIn, $sHolidayInOutTime, $vExtraPaymentAbove150)
MsgBox(64, @ScriptName, _
'Total hours: ' & $aPrecentCalc[0] & @CRLF & @CRLF & _
'100%: ' & $aPrecentCalc[1] & @CRLF & _
'125%: ' & $aPrecentCalc[2] & @CRLF & _
'150%: ' & $aPrecentCalc[3] & @CRLF & _
'175%: ' & $aPrecentCalc[4] & @CRLF & _
'200%: ' & $aPrecentCalc[5] _
)
;Функция должна вернуть расчёт часов разделённые на 100%, 125%, и т.д., с учётом начала праздника (по часам) или его завершения (выход)
;Параметры:
;$sTimeStart - время начала работы
;$sTimeEnd - время завершения работы
;$bHolidayIn - указывает на то, начинается или нет время с которого следует считать часы работы как праздн. часы (время указывается в след. параметре)
;$sHolidayTime - время начала или завершения праздничных часов, если 0 то все часы должны считаться обычно (в соот-вий с таблицей часов переработки)
;$bAbove150 - указывает на то, следует ли считать часы переработки (или праздн. часы) свыше 150%.
Func _PrecentCalc($sTimeStart, $sTimeEnd, $bHolidayIn, $sHolidayTime, $bAbove150 = True)
Local $iTotalHours = 0
Local $i100 = 0, $i125 = 0, $i150 = 0, $i175 = 0, $i200 = 0
;???
Local $aRet[6] = [$iTotalHours, $i100, $i125, $i150, $i175, $i200]
Return $aRet
EndFunc
;Функция возвращает:
;$aArr[0] - всего часов между $sTimeStart и $sTimeEnd
;$aArr[1] - время ДО заката ($sTimeSunset), т.е это по сути время начала или завершения праздника
;$aArr[2] - время ПОСЛЕ заката ($sTimeSunset), "..."
Func _TimeCalc($sTimeStart, $sTimeEnd, $sTimeSunset)
Local $mTimeStart, $mTimeEnd, $iTotalMinutes, $iTotalHours, $mTimeSunset, $iTimeInMinutes
Local $iTimeBeforeSunsetMinutes, $iTimeAfterSunsetMinutes, $iTimeBeforeSunset, $iTimeAfterSunset
$mTimeStart = _TimeInMinutes($sTimeStart)
$mTimeEnd = _TimeInMinutes($sTimeEnd)
If $mTimeEnd < $mTimeStart Then
$mTimeEnd += 1440
EndIf
$iTotalMinutes = $mTimeEnd - $mTimeStart
$iTimeInMinutes = _TimeInMinutes($sTimeSunset)
If $iTimeInMinutes Then
$mTimeSunset = $iTimeInMinutes
$iTimeBeforeSunsetMinutes = _TimeBetween($mTimeStart, $mTimeSunset) - _TimeBetween($mTimeEnd, $mTimeSunset)
$iTimeAfterSunsetMinutes = $iTotalMinutes - $iTimeBeforeSunsetMinutes
$iTimeBeforeSunset = Round(Round($iTimeBeforeSunsetMinutes / 30, 1) / 2, 2)
$iTimeAfterSunset = Round(Round($iTimeAfterSunsetMinutes / 30, 1) / 2, 2)
Else
$iTimeBeforeSunset = 0
$iTimeAfterSunset = 0
EndIf
$iTotalHours = Round(Round($iTotalMinutes / 30, 1) / 2, 2)
Local $aRet[3] = [$iTotalHours, $iTimeBeforeSunset, $iTimeAfterSunset]
Return $aRet
EndFunc
;Функция переводит время в минуты
Func _TimeInMinutes($sTimeParam)
Return Execute(StringReplace($sTimeParam, ':', '*60+'))
EndFunc
;Функция возвращает разницу между минутами времени
Func _TimeBetween($iTime1, $iTime2)
Return($iTime1 < $iTime2 ? $iTime2 - $iTime1 : 0)
EndFunc
Примечания:
Если $sHolidayInOutTime не указан (0), то считать все часы нужно без учёта захода или выхода праздника, т.е по обычной схеме подсчёта часов и часов переработки.
В наброске нужно доделать (точнее проработать) функцию _PrecentCalc.
Задача очень интересная, и я уверен что есть несложное решение, но мозг кипел пока я сам пытался это решить.
Спасибо за внимание.