338 lines
18 KiB
Plaintext
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 |