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

299 lines
10 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : NOPRRP002
OBJETIVO : Reporte de nomina agrupado (buckets via notb00013)
DESARROLLADOR : Ing. Elvis Garcia
-------------------------------------------------------------------------------
}
GLOBALS
"noprgb000.4gl"
DEFINE
inv DYNAMIC ARRAY OF RECORD
departamento LIKE adtb00003.departamento,
nom_dpto CHAR(25),
num_emp LIKE notb00008.num_emp,
nombre CHAR(30),
sueldo DECIMAL(14,2),
hextra DECIMAL(14,2),
otring DECIMAL(14,2),
afp DECIMAL(14,2),
sfs DECIMAL(14,2),
isr DECIMAL(14,2),
coop DECIMAL(14,2),
avance DECIMAL(14,2),
segmed DECIMAL(14,2),
otdesc DECIMAL(14,2)
END RECORD,
idx INT,
selec1 STRING,
r_filename STRING,
r_output SMALLINT,
preview SMALLINT,
handler om.SaxDocumentHandler,
varia CHAR(12)
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 noprrp002()
END MAIN
FUNCTION noprrp002()
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
CLEAR SCREEN
LET formulario = formulario CLIPPED, "nofmrp002"
OPEN FORM nofmrp002 FROM "nofmrp002"
DISPLAY FORM nofmrp002
DISPLAY "noprrp002" AT 4,3
DISPLAY "Nomina de Pago" AT 6,33
------------------------------------------------------------------
-- Criterio: nomina + tipo, luego fechas desde notb00010
------------------------------------------------------------------
INPUT BY NAME per_nomi.num_nomi, per_nomi.tipo_emp
AFTER FIELD num_nomi
IF per_nomi.num_nomi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
AFTER FIELD tipo_emp
IF per_nomi.tipo_emp IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo_emp
END IF
SELECT num_nomi, tipo_emp, fecha_del, fecha_al
INTO per_nomi.num_nomi, per_nomi.tipo_emp,
per_nomi.fecha_del, per_nomi.fecha_al
FROM notb00010
WHERE num_nomi = per_nomi.num_nomi
AND tipo_emp = per_nomi.tipo_emp
IF status = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
RETURN
END IF
DISPLAY BY NAME per_nomi.fecha_del, per_nomi.fecha_al
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
END INPUT
CONSTRUCT criterio ON b.departamento, a.num_emp
FROM departamento, num_emp
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
CASE per_nomi.tipo_emp
WHEN "Q" LET varia = "QUINCENALES"
WHEN "S" LET varia = "SEMANALES"
WHEN "V" LET varia = "VENDEDORES"
OTHERWISE LET varia = ""
END CASE
------------------------------------------------------------------
-- Query pivote: un row por (departamento, empleado) con los 8 buckets
-- Deducciones ya vienen en magnitud (ABS) para que el .4rp no tenga
-- que decidir signo.
------------------------------------------------------------------
LET selec1 =
"SELECT b.departamento, ",
" ISNULL(c.nom_dpto,'') AS nom_dpto, ",
" a.num_emp, ",
" MAX(RTRIM(b.nom1_emp)+' '+RTRIM(b.apell1_emp)) AS nombre, ",
" SUM(CASE WHEN g.cod_mov = 1 THEN a.valor ELSE 0 END) AS sueldo, ",
" SUM(CASE WHEN g.cod_mov = 2 THEN a.valor ELSE 0 END) AS hextra, ",
" SUM(CASE WHEN g.cod_mov = 52 THEN a.valor ELSE 0 END) AS otring, ",
" ABS(SUM(CASE WHEN g.cod_mov = 49 THEN a.valor ELSE 0 END)) AS afp, ",
" ABS(SUM(CASE WHEN g.cod_mov IN (29, 53) THEN a.valor ELSE 0 END)) AS sfs, ",
" ABS(SUM(CASE WHEN g.cod_mov = 23 THEN a.valor ELSE 0 END)) AS isr, ",
" ABS(SUM(CASE WHEN g.cod_mov IN (59) THEN a.valor ELSE 0 END)) AS coop, ",
" ABS(SUM(CASE WHEN g.cod_mov = 25 THEN a.valor ELSE 0 END)) AS avance, ",
" ABS(SUM(CASE WHEN g.cod_mov = 27 THEN a.valor ELSE 0 END)) AS segmed, ",
" ABS(SUM(CASE WHEN g.cod_mov = 41 THEN a.valor ELSE 0 END)) AS otdesc ",
"FROM notb00008 a ",
" JOIN adtb00003 b ON a.num_emp = b.num_emp ",
" LEFT JOIN notb00013 g ON g.cod_mov_a = a.cod_mov AND g.status_t IS NULL ",
" LEFT JOIN adtb00001 c ON c.departamento = b.departamento ",
"WHERE a.num_nomi = '", per_nomi.num_nomi, "' ",
" AND a.tipo_emp = '", per_nomi.tipo_emp, "' ",
" AND a.fecha BETWEEN '", per_nomi.fecha_del USING "yyyymmdd",
"' AND '", per_nomi.fecha_al USING "yyyymmdd", "' ",
" AND a.cod_mov NOT IN (100,101,102) ",
" AND ", criterio CLIPPED, " ",
"GROUP BY b.departamento, c.nom_dpto, a.num_emp ",
"ORDER BY b.departamento, a.num_emp"
LET idx = 1
DECLARE accion CURSOR FROM selec1
FOREACH accion INTO inv[idx].*
LET idx = idx + 1
END FOREACH
CALL inv.deleteElement(idx) -- descarta la fila vacia que deja el FOREACH
IF inv.getLength() = 0 THEN
CALL fgl_winmessage("INFO", "NO EXISTEN REGISTROS PARA ESTE CRITERIO", "INFO")
RETURN
END IF
------------------------------------------------------------------
-- Carga del diseno visual noprrp002.4rp
------------------------------------------------------------------
LET r_filename = "noprrp002.4rp"
IF fgl_report_loadCurrentSettings(r_filename) THEN
LET preview = 1
CALL selectoutput2() RETURNING r_output
CALL fgl_report_selectDevice(r_output)
CALL fgl_report_selectPreview(preview)
LET handler = fgl_report_commitCurrentSettings()
END IF
START REPORT nomina_agr TO XML HANDLER handler
FOR idx = 1 TO inv.getLength()
OUTPUT TO REPORT nomina_agr(inv[idx].*, per_nomi.num_nomi, varia,
per_nomi.fecha_del, per_nomi.fecha_al)
END FOR
FINISH REPORT nomina_agr
CLEAR SCREEN
END FUNCTION
REPORT nomina_agr(x, no_nomina, tipo_desc, fecha1, fecha2)
DEFINE x RECORD
departamento LIKE adtb00003.departamento,
nom_dpto CHAR(25),
num_emp LIKE notb00008.num_emp,
nombre CHAR(30),
sueldo DECIMAL(14,2),
hextra DECIMAL(14,2),
otring DECIMAL(14,2),
afp DECIMAL(14,2),
sfs DECIMAL(14,2),
isr DECIMAL(14,2),
coop DECIMAL(14,2),
avance DECIMAL(14,2),
segmed DECIMAL(14,2),
otdesc DECIMAL(14,2)
END RECORD
DEFINE no_nomina CHAR(5)
DEFINE tipo_desc CHAR(12)
DEFINE fecha1, fecha2, fecha_actual DATE
DEFINE variable VARCHAR(25)
-- detalle (calculados por fila)
DEFINE d_toting, d_totded, d_neto DECIMAL(14,2)
-- subtotal departamento
DEFINE st_sueldo, st_hextra, st_otring,
st_afp, st_sfs, st_isr, st_coop,
st_avance, st_segmed, st_otdesc DECIMAL(16,2)
DEFINE st_toting, st_totded, st_neto DECIMAL(16,2)
DEFINE st_emp INTEGER
-- gran total
DEFINE gt_sueldo, gt_hextra, gt_otring,
gt_afp, gt_sfs, gt_isr, gt_coop,
gt_avance, gt_segmed, gt_otdesc DECIMAL(18,2)
DEFINE gt_toting, gt_totded, gt_neto DECIMAL(18,2)
DEFINE gt_emp INTEGER
FORMAT
FIRST PAGE HEADER
LET fecha_actual = CURRENT
PRINTX p_companias.nombre, no_nomina, tipo_desc,
fecha1, fecha2, fecha_actual
BEFORE GROUP OF x.departamento
PRINTX x.departamento, x.nom_dpto
ON EVERY ROW
LET d_toting = x.sueldo + x.hextra + x.otring
LET d_totded = x.afp + x.sfs + x.isr + x.coop
+ x.avance + x.segmed + x.otdesc
LET d_neto = d_toting - d_totded
PRINTX x.num_emp, x.nombre,
x.sueldo, x.hextra, x.otring, d_toting,
x.afp, x.sfs, x.isr, x.coop,
x.avance, x.segmed, x.otdesc, d_totded,
d_neto
AFTER GROUP OF x.departamento
LET st_sueldo = GROUP SUM(x.sueldo)
LET st_hextra = GROUP SUM(x.hextra)
LET st_otring = GROUP SUM(x.otring)
LET st_afp = GROUP SUM(x.afp)
LET st_sfs = GROUP SUM(x.sfs)
LET st_isr = GROUP SUM(x.isr)
LET st_coop = GROUP SUM(x.coop)
LET st_avance = GROUP SUM(x.avance)
LET st_segmed = GROUP SUM(x.segmed)
LET st_otdesc = GROUP SUM(x.otdesc)
LET st_emp = GROUP COUNT(*)
LET st_toting = st_sueldo + st_hextra + st_otring
LET st_totded = st_afp + st_sfs + st_isr + st_coop
+ st_avance + st_segmed + st_otdesc
LET st_neto = st_toting - st_totded
PRINTX st_emp,
st_sueldo, st_hextra, st_otring, st_toting,
st_afp, st_sfs, st_isr, st_coop,
st_avance, st_segmed, st_otdesc, st_totded,
st_neto
ON LAST ROW
LET gt_sueldo = SUM(x.sueldo)
LET gt_hextra = SUM(x.hextra)
LET gt_otring = SUM(x.otring)
LET gt_afp = SUM(x.afp)
LET gt_sfs = SUM(x.sfs)
LET gt_isr = SUM(x.isr)
LET gt_coop = SUM(x.coop)
LET gt_avance = SUM(x.avance)
LET gt_segmed = SUM(x.segmed)
LET gt_otdesc = SUM(x.otdesc)
LET gt_emp = COUNT(*)
LET gt_toting = gt_sueldo + gt_hextra + gt_otring
LET gt_totded = gt_afp + gt_sfs + gt_isr + gt_coop
+ gt_avance + gt_segmed + gt_otdesc
LET gt_neto = gt_toting - gt_totded
PRINTX gt_emp,
gt_sueldo, gt_hextra, gt_otring, gt_toting,
gt_afp, gt_sfs, gt_isr, gt_coop,
gt_avance, gt_segmed, gt_otdesc, gt_totded,
gt_neto
END REPORT