299 lines
10 KiB
Plaintext
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
|