Files
MBS/PROYECTO/nodir/noprmt030.4gl
T

338 lines
18 KiB
Plaintext

{
PROGRAMA : NOPRMT030
OBJETIVO : GENERAR INFORMACION PARA LAS HORAS EXTRAS Y TRABAJADAS A PARTIR DE LOS
DISPOSITIVOS BIOMETRICOS
DESARROLLADO POR: ING. JUAN SOTO
FECHA DESARROLLADO: JUNIO 30, 2021
DETALLE ADICIONAL: ESTE PROGRAMA USA UNAS TABLAS INTERMEDIAS PARA PODER RESOLVER EL TEMA DE QUE UN EMPLEADO
PUNCHE DOS VECES EN LOS DISPOSITIVOS BIOMETRICOS, RESOLVIENDO QUE EL PROCESO SOLO TOME
UNA DE LAS DOS REGISTROS PARA EL MISMO DIA AL MOMENTO DE LA ENTRADA O LA SALIDA
}
GLOBALS "noprgb000.4gl"
DEFINE buf base.StringBuffer,
chdepartamento STRING
DEFINE fecha_inicial,fecha_final,fecha_corte DATE,
criterio,selec,respuesta,afecta STRING,
data1 RECORD
USERID int,CHECKTIME DATETIME YEAR TO minute,CHECKTYPE CHAR(1)
END RECORD,
xtipoemp CHAR(1),
xdepartamento,xnivel,xpuesto,pbar,numnomi,numemp,xuserid,xdia,xmes,xwd,dnumnomi,horaAlmuerzo,idx INT,
nombreempleado VARCHAR(100),
xhtrabajadas ,xhextras35,xhextras100 DEC(12,2),
fechaEntrada,fechaSalida,xhoraentrada,xhorasalida,xhhsalida DATETIME HOUR TO MINUTE,
cantidadh35,cantidadh100,cantidadTrabajadas,valorExtra35,valorExtra100,salario_diario,salario,
salario_hora DEC(12,2),
chcantidad35,chcantidad100,chcantidadtrabaja CHAR(20),
arr_departamentos DYNAMIC ARRAY OF RECORD
chequeado SMALLINT,
departamento INT,
titulo VARCHAR(100),
tipodepto VARCHAR(100)
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuarios USING clave
SELECT * INTO p_companias.* FROM companias
CALL noprmt030()
END MAIN
FUNCTION noprmt030()
OPEN WINDOW w1 WITH FORM "nofmmt037"
DIALOG ATTRIBUTE(UNBUFFERED)
INPUT BY NAME fecha_inicial,fecha_final,afecta
BEFORE INPUT
CALL departamentos()
AFTER INPUT
IF fecha_inicial > fecha_final THEN
CALL msg(86)
NEXT FIELD fecha_inicial
END IF
SELECT MIN(a.num_nomi) INTO numnomi FROM notb00010 a
WHERE a.fecha_cierre_nomina > fecha_inicial
END INPUT
INPUT ARRAY arr_departamentos FROM sdepartamentos.* ATTRIBUTE(WITHOUT DEFAULTS)
AFTER INPUT
END INPUT
ON ACTION procesar ATTRIBUTE(TEXT="Procesa")
LET respuesta = fgl_winquestion("ACTUALIZA","ESTA SEGURO DE ACTUALIZAR ESTAS INFORMACIONES?",
"NO","YES|NO","QUESTION",0 )
IF respuesta = "YES" THEN
LET selec = "SELECT DATEDIFF(minute,?,?) "
PREPARE comando FROM selec
LET criterio = "b.departamento in ("
FOR idx = 1 TO arr_departamentos.getLength()
IF arr_departamentos[idx].chequeado =1 THEN
LET chdepartamento = chdepartamento CLIPPED,arr_departamentos[idx].departamento USING "<<<<",","
END IF
END FOR
IF chdepartamento IS NOT NULL THEN
LET criterio = criterio CLIPPED,chdepartamento CLIPPED,")"
LET buf = base.StringBuffer.create()
CALL buf.append(criterio)
CALL buf.replace(",)",")",1)
LET criterio = buf.toString()
ELSE
LET criterio = 'b.departamento=b.departamento '
END IF
LET horaAlmuerzo = 1
# BORRA LA DATA EN EL RANGO DE FECHAS
LET pbar = 10
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
DISPLAY "BORRANDO INFORMACION.... " TO mensajes
DELETE FROM checkinout1 WHERE checktime BETWEEN fecha_inicial AND fecha_final
DELETE FROM checkinout2 WHERE checktime BETWEEN fecha_inicial AND fecha_final
LET pbar = 20
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
# BORRA REGISTROS DE LA TABLA DE NOVEDADES DEL SISTEMA DE NOMINAS
# DECLARE novedad CURSOR FOR
# SELECT DISTINCT a.num_nomi FROM checkinout a WHERE checktime BETWEEN fecha_inicial AND fecha_final
# FOREACH novedad INTO dnumnomi
IF afecta = 'SI' THEN
DELETE FROM notb00007 WHERE cod_mov IN (2,3) AND us_crea = 'noprmt030' AND num_nomi = numnomi
END IF
# END FOREACH
DELETE FROM checkinout WHERE checktime BETWEEN fecha_inicial AND fecha_final
LET pbar = 30
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
LET selec = " SELECT a.USERID,MIN(a.CHECKTIME),a.CHECKTYPE from facial.dbo.CHECKINOUT a
RIGHT OUTER JOIN marmotech.dbo.adtb00003 b ON a.userid = b.cuenta_out and b.status_T is null
where a.CHECKTIME between ? and ? and ",criterio CLIPPED,
" GROUP BY a.USERID,a.CHECKTYPE,CAST(checktime as date) "
PREPARE comando1 FROM selec
DECLARE busca1 CURSOR FOR comando1
OPEN busca1 USING fecha_inicial,fecha_final
DISPLAY "INICIO PROCESO.... " TO mensajes
FOREACH busca1 INTO data1.*
IF EXTEND(data1.CHECKTIME,HOUR TO MINUTE) < '11:00' THEN
LET data1.CHECKTYPE = 'I'
END IF
IF EXTEND(data1.CHECKTIME,HOUR TO MINUTE) > '11:01' THEN
LET data1.CHECKTYPE = 'O'
END IF
INSERT INTO CHECKINOUT1(USERID,CHECKTIME,CHECKTYPE) VALUES (data1.*)
END FOREACH
LET pbar = 60
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
# PROCESO DE GENERACION HORAS EXTRAS, TRABAJADAS
LET selec = " SELECT a.userid,a.checktime,a.checktype from
CHECKINOUT1 a RIGHT OUTER JOIN adtb00003 b ON a.userid = b.cuenta_out and b.status_t is null
where a.CHECKTIME between ? and ? and ",criterio CLIPPED
PREPARE comando3 FROM selec
DECLARE buscaemp SCROLL CURSOR FOR comando3
OPEN buscaemp USING fecha_inicial,fecha_final
LET idx = 1
BEGIN WORK
FOREACH buscaemp INTO data1.*
SELECT UNIQUE a.num_emp,RTRIM(a.nom1_emp)||' '||a.apell1_emp,
a.departamento,a.cod_puesto,a.nivel_emp,b.userid,a.nomina,
a.sueldo_ac
INTO numemp,nombreempleado,xdepartamento,xpuesto,xnivel,xuserid,xtipoemp,
salario
from adtb00003 a,CHECKINOUT1 b
where a.cuenta_out = b.USERID AND b.userid = data1.USERID AND b.checktime = data1.CHECKTIME AND
b.checktype = data1.CHECKTYPE
IF data1.CHECKTYPE = 'O' THEN
SELECT MIN(a.checktime) INTO fechaEntrada from CHECKINOUT1 a
WHERE cast(a.checktime as date) = CAST(data1.CHECKTIME AS DATE)
and a.userid =data1.USERID and a.CHECKTYPE='I'
SELECT MAX(a.checktime) INTO fechaSalida from CHECKINOUT1 a
WHERE cast(a.checktime as date) = CAST(data1.CHECKTIME AS DATE)
and a.userid =data1.USERID and a.CHECKTYPE='O'
LET xhhsalida = data1.CHECKTIME
EXECUTE comando INTO xhtrabajadas USING fechaentrada,fechasalida
LET xhtrabajadas = xhtrabajadas/60
LET xhtrabajadas = xhtrabajadas - horaAlmuerzo
LET chcantidadtrabaja = xhtrabajadas
LET xwd = WEEKDAY(data1.CHECKTIME)
IF xwd > 0 THEN
#--------- BUSCAR HORARIOS EMPLEDOS
SELECT a.entrada,a.salida INTO xhoraentrada,xhorasalida FROM adtb00054 a,adtb00055 b
WHERE a.id_hora = b.id_horario and b.num_emp=numemp
LET xhhsalida = data1.CHECKTIME
DISPLAY "HORAS: ",xhorasalida," ",xhhsalida," EMP ",numemp
IF xhorasalida < xhhsalida THEN
EXECUTE comando INTO xhextras35 USING xhorasalida,xhhsalida
DISPLAY "HORA EXTRA: ",xhextras35," EMP ",numemp
LET xhextras35 = xhextras35/60
# LET xhextras35 = xhhsalida - xhorasalida
LET chcantidad35 = xhextras35
LET cantidadh35 = chcantidad35
END IF
ELSE
# DIAS FERIADOS
LET xhorasalida = EXTEND(fechaEntrada,HOUR TO MINUTE)
LET xhhsalida = EXTEND(data1.CHECKTIME, HOUR TO MINUTE)
EXECUTE comando INTO xhextras100 USING xhorasalida,xhhsalida
LET xhextras100 = xhextras100/60
# LET xhextras100 = EXTEND(data1.CHECKTIME, HOUR TO MINUTE) - EXTEND(fechaEntrada,HOUR TO MINUTE)
LET chcantidad100 = xhextras100
LET cantidadh100 = chcantidad100
END IF
# dias feriados fuera del domingo
LET xmes = MONTH(data1.CHECKTIME)
LET xdia = DAY(data1.CHECKTIME)
LET salario_diario =salario/23.83
SELECT a.dias FROM notb00012 a WHERE a.cod_mes = xmes and a.dias = xdia
IF STATUS <> NOTFOUND THEN
# DISPLAY "hora1 ",EXTEND(data1.CHECKTIME, HOUR TO MINUTE) -EXTEND(fechaEntrada,HOUR TO MINUTE)," num emp ",data1.USERID
# LET xhextras100 = EXTEND(data1.CHECKTIME, HOUR TO MINUTE) - EXTEND(fechaEntrada,HOUR TO MINUTE)
# LET chcantidad100 = xhextras100
# LET cantidadh100 = chcantidad100
LET xhorasalida = EXTEND(fechaEntrada,HOUR TO MINUTE)
LET xhhsalida = EXTEND(data1.CHECKTIME, HOUR TO MINUTE)
EXECUTE comando INTO xhextras100 USING xhorasalida,xhhsalida
LET xhextras100 = xhextras100/60
END IF
END IF
# IF xhextras35 IS NOT NULL THEN
# LET xhtrabajadas = xhtrabajadas - xhextras35 -horaAlmuerzo
# END IF
SELECT DISTINCT a.checktime FROM checkinout a WHERE a.checktime = data1.CHECKTIME AND
a.userid = data1.USERID
IF STATUS = NOTFOUND THEN
INSERT INTO CHECKINOUT (userid,CHECKTIME,CHECKTYPE,num_emp,nombre_empleado,
h_trabajadas,h_extras35,h_extras100)
values (data1.*,numemp,nombreempleado,xhtrabajadas,xhextras35,xhextras100)
END IF
IF cantidadh35 > 0 THEN
#empleado a 3335 860.26 37.64 2.00 75.28 sueldo 20500.00
LET salario_hora = (salario_diario / 8)*1.35
LET valorExtra35 = salario_hora * cantidadh35
IF afecta = 'SI' THEN
SELECT a.num_emp FROM notb00007 a
WHERE a.num_nomi = numnomi AND a.num_emp = numemp AND a.cod_mov = 3
IF STATUS = NOTFOUND THEN
# IF cantidadh35 > 0 THEN
INSERT INTO notb00007
(num_nomi,tipo_emp,cod_mov,num_emp,departamento,cod_puesto,nivel_emp,cantidad,valor,us_crea,fech_crea)
VALUES (numnomi,xtipoemp,3,numemp,xdepartamento,xpuesto,xnivel,cantidadh35,valorExtra35,'noprmt030',getdate())
# END IF
ELSE
# IF cantidadh35 > 0 THEN
UPDATE notb00007 SET cantidad = cantidad + cantidadh35,us_mod = 'noprmt030',fech_mod = getdate(),
valor = valor + valorExtra35
WHERE num_emp = numemp AND num_nomi = numnomi AND cod_mov = 3
# END IF
END IF
END IF
END IF
IF cantidadh100 IS NOT NULL THEN
LET salario_hora = (salario_diario / 8)*2
LET valorExtra100 = salario_hora * cantidadh100
IF afecta = 'SI' THEN
SELECT a.num_emp FROM notb00007 a
WHERE a.num_nomi = numnomi AND a.num_emp = numemp AND a.cod_mov = 3
IF STATUS = NOTFOUND THEN
INSERT INTO notb00007
(num_nomi,tipo_emp,cod_mov,num_emp,departamento,cod_puesto,nivel_emp,cantidad,valor,us_crea,fech_crea)
VALUES (numnomi,xtipoemp,2,numemp,xdepartamento,xpuesto,xnivel,cantidadh100,valorExtra100,'noprmt030',getdate())
ELSE
UPDATE notb00007 SET cantidad = cantidad + cantidadh100,
us_mod = 'noprmt030',fech_mod = getdate(),
valor = valor + valorExtra100
WHERE num_emp = numemp AND num_nomi = numnomi AND cod_mov = 2
END IF
END IF
END IF
LET xhextras35 =0
LET xhextras100 = 0
LET xhtrabajadas =0
LET cantidadTrabajadas =0
LET cantidadh35=0
LET cantidadh100 =0
LET valorExtra100 =0
LET valorExtra35 = 0
IF pbar < 90 THEN
IF idx = 4 THEN
LET idx = 1
END IF
IF idx < 4 THEN
LET pbar = pbar+1
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
END IF
END IF
LET idx = idx + 1
END FOREACH
COMMIT WORK
LET pbar = 100
CALL ui.Interface.refresh()
DISPLAY pbar TO pbar
CALL fgl_Winmessage("INFO","PROCESO TERMINADO","INFO")
EXIT PROGRAM
END IF
ON ACTION CANCEL
LET int_flag = FALSE
EXIT PROGRAM
END DIALOG
END FUNCTION
FUNCTION departamentos()
CALL arr_departamentos.clear()
DECLARE busca_dep CURSOR FOR
SELECT '0',a.departamento,a.nom_dpto,a.tipo_departamento
FROM adtb00001 a WHERE a.status_t IS NULL
ORDER BY a.nom_dpto
LET idx = 1
FOREACH busca_dep INTO arr_departamentos[idx].*
LET idx = idx + 1
END FOREACH
END FUNCTION