-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSSIMXFUN.PRW
171 lines (143 loc) · 6.19 KB
/
SSIMXFUN.PRW
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "FWMBROWSE.CH"
#include "rwmake.ch"
#include "TbiConn.ch"
#include "TbiCode.ch"
// #########################################################################################
// Projeto: SSIM Controle
// Modulo : SIGATMK
// Rotina : RetT
// ---------+-------------------+-----------------------------------------------------------
// Data | Autor: William Gurzoni
// ---------+-------------------+-----------------------------------------------------------
// 24/10/15 | Esta função retornará a diferença entre duas datas / horas descontando
// | o horário de intervalo e tempo útil de trabalho
// ---------+-------------------+-----------------------------------------------------------
// #########################################################################################
User function RetT(dDataIni, cHoraIni, dDataFim, cHoraFim)
Local nMinutos := 0
Local nQtdDias := 0
Local nI := 1
Private cIniExp := "08:00:00"
Private cIniPausa := "12:00:00"
Private cFimPausa := "13:30:00"
Private cFimExp := "18:00:00"
If dDataIni == dDataFim
// Verifica se as duas interações foram realizadas no mesmo período (antes ou depois do descanso)
If (cHoraIni <= cIniPausa .And. cHoraFim <= cIniPausa) .Or. (cHoraIni >= cFimPausa .And. cHoraFim >= cFimPausa)
nMinutos := U_HoraToMin(ElapTime(cHoraIni, cHoraFim))
Else
// Desconta o horário da pausa
nMinutos := U_HoraToMin(ElapTime(cHoraIni, cHoraFim))
nMinutos -= U_HoraToMin(ElapTime(cIniPausa, cFimPausa))
EndIf
Else
// Caso as datas sejam diferentes, deverá considerar os dias cheios mais o dia incompleto
// neste caso verificar a diferença dos horários subtraindo 90 minutos de almoco
// Calcula tempo gasto no primeiro dia
nMinutos := U_HoraToMin(ElapTime(cHoraIni, cFimExp))
If cHoraIni <= cIniPausa
nMinutos -= U_HoraToMin(ElapTime(cIniPausa, cFimPausa)) //Desconta horario de pausa
EndIf
// Calcula tempo gasto no ultimo dia
nMinutos += U_HoraToMin(ElapTime(cIniExp, cHoraFim))
If cHoraFim >= cFimPausa
nMinutos -= U_HoraToMin(ElapTime(cIniPausa, cFimPausa)) //Desconta horario de pausa
EndIf
// Caso a diferença de datas tenha sido maior que um dia, calcula as horas dos
// dias despendidos para a analise, desconsiderando finais de semana e feriados
nQtdDias := dDataFim - dDataIni - 1
While nI <= nQtdDias
If DataValida(dDataIni + nI, .T.) == dDataIni + nI
nMinutos += 60 * 8.5
EndIf
nI++
EndDo
EndIf
Return nMinutos
// #########################################################################################
// Projeto: SSIM Controle
// Modulo : SIGATMK
// Rotina : HoraToMin
// ---------+-------------------+-----------------------------------------------------------
// Data | Autor: William Gurzoni
// ---------+-------------------+-----------------------------------------------------------
// 24/10/15 | Esta função receberá a hora em formato 00:00 e retornará em minutos no
// | formato numerico
// ---------+-------------------+-----------------------------------------------------------
// #########################################################################################
User Function HoraToMin(cHora)
Local nMin := 0
nMin := Val(SubStr(cHora, 1, 2)) * 60
nMin += Val(SubStr(cHora, 4, 2))
Return nMin
// #########################################################################################
// Projeto: SSIM Controle
// Modulo : SIGATMK
// Rotina : AcertaHR
// ---------+-------------------+-----------------------------------------------------------
// Data | Autor: William Gurzoni
// ---------+-------------------+-----------------------------------------------------------
// 25/10/15 | Ajusta horário de intervalo
// | Caso a interação tenha sido feita no horário de intervalo, considera o horário
// | Anterior ou posterior, de acordo com a variável INI / FIM
// | As variáveis devem ser passadas por referência
// ---------+-------------------+-----------------------------------------------------------
// #########################################################################################
User function AcertaHR(dData, cHora, lTotvs)
Local dDtValida
Private cIniExp := "08:00:00"
Private cIniPausa := "12:00:00"
Private cFimPausa := "13:30:00"
Private cFimExp := "18:00:00"
// Primeiramente verificar através da função específica se a data é final de semana ou feriado.
// O cadastro de feriados é realizado pela SX5 - tabela 63. O sábodo é considerado de acordo com
// o parâmetro MV_SABFERI = S
dDtValida := DataValida(dData, !lTotvs)
If dData != dDtValida
If lTotvs
cHora := cFimExp
Else
cHora := cIniExp
EndIf
dData := dDtValida
Else
If lTotvs
// Se o analista inseriu uma interação fora do expediente, a interação
// é considerada como sendo no final do expediente, mesmo se foi feita no dia seguinte
// Se foi feita no dia seguinte, deverá retroceder a data
If cHora <= cIniExp .Or. cHora >= cFimExp
// Caso tenha feito a interação antes do horário de expediente, considera dia anterior
If cHora <= cIniExp
cHora := cIniExp
// Caso tenha feito após o horário de expediente, considera como dia seguinte
ElseIf cHora >= cFimExp
dData := DataValida(dData + 1, .T.)
cHora := cIniExp
EndIf
// Se o analista inseriu a interação no horário de pausa, a interação
// é considerada como sendo no início da pausa
ElseIf cHora >= cIniPausa .And. cHora <= cFimPausa
cHora := cFimPausa
EndIf
Else
// Se o cliente inseriu a interação fora do expediente, a interação
// é considerada como sendo no início do expediente
If cHora <= cIniExp .Or. cHora >= cFimExp
// Caso tenha feito a interação antes do horário de expediente, considera dia anterior
If cHora <= cIniExp
cHora := cIniExp
// Caso tenha feito após o horário de expediente, considera como dia seguinte
ElseIf cHora >= cFimExp
dData := DataValida(dData + 1, .T.)
cHora := cIniExp
EndIf
// Se o cliente inseriu a interação no horário de pausa, a interação
// é considerada como sendo no final da pausa
ElseIf cHora >= cIniPausa .And. cHora <= cFimPausa
cHora := cFimPausa
EndIf
EndIf
EndIf
Return NIL