{ ------------------------------------------------------------------------------- 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