Files
MBS/PROYECTO/nodir/noprmt026.4gl
T
Abel LópezandClaude Sonnet 5.5 70c3131e9c Registra noprmt026 (Pago TSS) y migra la salida de DDE a CSV
- Registra nofmmt026.4fd y la aplicacion noprmt026 (con FGLSPOOL) en el
  subgrupo NOMINA.
- GDC 6.00 ya no incluye el modulo WINDDE (error -6331): enviaDDE() guarda
  las celdas en memoria y escribeCSV() genera FGLSPOOL/noprmt026_<tipo>_
  <periodo>.csv con las mismas filas/columnas de la plantilla TSS.
- SQL: se quitan los CONVERT(...,103) sobre variables DATE (-1205), la
  comparacion de fechas como texto (101) y el date+int dentro del SQL
  (-206); rango con fecha_sig = fecha_final+1. FOREACH con THRU (10 cols).
Verificado contra la BD .250: Normal 2026/7 = 636 filas / 33,933,711.43;
Bonificacion cancelados 2026/4 = 229 filas / 1,596,887.98.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 16:47:15 -04:00

488 lines
16 KiB
Plaintext

{
---------------------------------------------------------------------------
PROGRAMA : NOPRMT026
OBJETIVO : PROCESO PARA EL PAGO DE LA TESORERIA DE LA SEGURIDAD SOCIAL
PROGRAMADOR : Ing. JUAN SOTO
FECHA REALIZACION : MAYO 31, 2005
---------------------------------------------------------------------------
}
GLOBALS
CONSTANT prog = "EXCEL"
DEFINE rcol,arch_pc,prog STRING,
p_res,no_registro INT,cuenta,xi,progreso,col SMALLINT,
selec CHAR(1000),
ciarnc CHAR(11),
dir_file VARCHAR(60),
fila_office varchar(1),
d_tipos,mensaje,f_tipos,filepath,p_res,res,fila,val STRING
DEFINE usuarios,clave CHAR(80),
FILE,nombre_cia STRING,
celdas DICTIONARY OF STRING,
maxfila,maxcol INTEGER
END GLOBALS
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL startlog("NORP26.txt")
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.rnc,a.nombre INTO ciarnc,nombre_cia FROM companias a
DISPLAY "NOMBRE ",nombre_cia
CALL pago_tss()
END MAIN
FUNCTION pago_tss()
DEFINE ptss RECORD
ficha INTEGER,
nom1 CHAR(30),
apell1 CHAR(30),
apell2 CHAR(30),
sexo VARCHAR,
tipo_documento VARCHAR(50),
cedula CHAR(11),
fecha_n DATE,
valor_tss DEC(12,2),
departamento INT,
valor_isr DEC(12,2)
END RECORD,
fecha_inicial,fecha_final,fecha_sig DATE,
kano,kmes, cnt,numero_msg SMALLINT,
cels CHAR(40),
filename,sysos CHAR(200),
archivo1 CHAR(125),
periodo CHAR(6),
valor_boni,valor_vacaciones DEC(12,2),
idioma_office VARCHAR,
tipo_reporte VARCHAR(10)
OPTIONS
FORM LINE 9,
ERROR LINE 24
OPEN FORM nofmmt026 FROM "nofmmt026"
DISPLAY FORM nofmmt026
INPUT BY NAME kano,kmes,idioma_office,tipo_reporte
BEFORE INPUT
CALL terminaDDE()
ON ACTION abrir
CALL ui.Interface.frontCall("standard","openfile", [dir_file,d_tipos,f_tipos,mensaje], [filepath] )
CALL ui.Interface.frontCall("standard","shellexec", [filepath], [p_res] )
AFTER FIELD kmes
LET selec =
"SELECT MIN(a.fecha_del), MAX(a.fecha_al) ",
" FROM notb00010 a ",
" WHERE a.ano ='", kano,"' AND a.mes ='", kmes, "'"
PREPARE busca_fecha FROM selec
EXECUTE busca_fecha INTO fecha_inicial,fecha_final
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
IF tipo_reporte IS NULL THEN
CALL msg(16)
NEXT FIELD tipo_reporte
END IF
END INPUT
LET fecha_sig = fecha_final + 1 -- el +1 no se puede hacer dentro del SQL (date + int)
LET periodo = kmes USING "&&",kano USING "&&&&"
LET FILE = filepath
CALL conectarDDE()
IF idioma_office = "E" THEN
LET fila_office = "F"
ELSE
LET fila_office = "R"
END IF
# CALL ui.Interface.frontCall("standard","getenv", ["USTSS"], [file] )
#LET arch_pc='"',file,'"' -- le agrega las comillas por si hay blancos (solo se necesita para shellexec)
# LET arch_pc=FILE CLIPPED --PARA OFFICE 2010 en adelante no es necesario colocar las comillas.
# CALL ui.Interface.frontCall("standard","shellexec", [arch_pc], [p_res] )
# CALL chqDdeError(p_res,"shellexec "||arch_pc)
# CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [p_res] )
# CALL chqDdeError(p_res,"DDEConnect "||file)
# CALL ui.Interface.refresh()
# CALL fgl_winmessage("periodo",periodo,"stop")
LET no_registro=1
IF tipo_reporte = "NOR" THEN
LET col = 4
LET fila = 7
LET val = ciarnc
CALL enviaDDE(fila,col,val)
LET col = 4
LET fila = 8
LET val = periodo
CALL enviaDDE(fila,col,val)
LET cnt = 14
LET progreso = 5
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET selec =
" SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,b.fech_nac,",
" SUM(a.valor),b.departamento ",
" FROM adtb00003 b, notb00008 a,notb00010 c,adtb00021 d ",
" WHERE b.num_emp = a.num_emp AND c.mes ='",kmes,"' AND ",
" c.ano ='",kano,"' AND b.num_emp = d.num_emp and ",
" a.num_nomi = c.num_nomi and ",#" b.num_emp = 3355 and ",
" a.tipo_emp = c.tipo_emp and ",
" a.cod_mov in (1,40,36,5,24,51,34,56) AND ",
" a.num_emp = d.num_emp AND ",
#" a.cod_mov in (32) AND ",
" a.fecha >= '",fecha_inicial USING "yyyymmdd",
"' and a.fecha < '",(fecha_final + 1) using "yyyymmdd","' and b.nomina = 'Q' ",
" GROUP BY a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.cedula,b.fech_nac,b.departamento,a.num_emp,b.tipo_documento ",
" ORDER BY b.departamento,a.num_emp "
ELSE
IF tipo_reporte = "BON1" THEN
LET col = 4
LET fila = 8
LET val = ciarnc
CALL enviaDDE(fila,col,val)
LET col = 4
LET fila = 9
LET val = periodo
CALL enviaDDE(fila,col,val)
LET progreso = 5
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET cnt = 15
LET selec =
" SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,b.fech_nac,",
" SUM(a.valor),a.departamento ",
" FROM adtb00003 b, notb00008 a,notb00010 c,adtb00021 d ",
" WHERE b.num_emp = a.num_emp AND b.status_t is not null and c.mes ='",kmes,"' AND ",
" c.ano ='",kano,"' AND b.num_emp = d.num_emp and ",
" a.num_nomi = c.num_nomi and ",#" b.num_emp = 3355 and ",
" a.tipo_emp = c.tipo_emp and ",
#" a.cod_mov in (1,40,36,5,24,51,34) AND ",
" a.num_emp = d.num_emp AND ",
" a.cod_mov in (33) AND ",
" a.fecha >= '",fecha_inicial USING "yyyymmdd",
"' and a.fecha < '",(fecha_final + 1) using "yyyymmdd","' and b.nomina = 'Q' ",
" GROUP BY a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.cedula,b.fech_nac,a.departamento,a.num_emp,b.tipo_documento ",
" ORDER BY a.departamento,a.num_emp "
END IF
END IF
PREPARE comando FROM selec
DECLARE busca CURSOR FOR comando
LET cuenta = 0
IF tipo_reporte = 'NOR' THEN
FOREACH busca INTO ptss.ficha THRU ptss.departamento
LET col = 2
LET fila = cnt
LET val = "001"
CALL enviaDDE(fila,col,val)
LET col = 3
LET fila = cnt
IF ptss.tipo_documento = 'CEDULA' THEN
LET val = "C"
ELSE
LET val = "P"
END IF
CALL enviaDDE(fila,col,val)
LET col = 4
LET fila = cnt
LET val = ptss.cedula
CALL enviaDDE(fila,col,val)
LET col = 5
LET fila = cnt
LET val = ptss.nom1
CALL enviaDDE(fila,col,val)
LET col = 6
LET fila = cnt
LET val = ptss.apell1
CALL enviaDDE(fila,col,val)
LET col = 7
LET fila = cnt
LET val = ptss.apell2
CALL enviaDDE(fila,col,val)
LET col = 8
LET fila = cnt
LET val = ptss.sexo
CALL enviaDDE(fila,col,val)
LET col = 9
LET fila = cnt
LET val = ptss.fecha_n USING "dd/mm/yyyy"
CALL enviaDDE(fila,col,val)
LET col = 10
LET fila = cnt
LET val = ptss.valor_tss
CALL enviaDDE(fila,col,val)
LET ptss.valor_isr = 0
SELECT ISNULL(SUM(a.valor),0) INTO ptss.valor_isr
FROM notb00008 a
WHERE a.num_emp = ptss.ficha AND
a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND
a.clase_mov IN ("E","I") and a.cod_mov not in (32,33)
LET col = 12
LET fila = cnt
LET val = ptss.valor_isr
CALL enviaDDE(fila,col,val)
# BONIFICACION
LET valor_boni = 0
SELECT ISNULL(SUM(a.valor),0) INTO valor_boni
FROM notb00008 a
WHERE a.num_emp = ptss.ficha AND
a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND
a.clase_mov IN ("E","I") and a.cod_mov in (33)
# VARIFICACION VACACIONES
LET valor_vacaciones = 0
SELECT ISNULL(SUM(a.valor),0) INTO valor_vacaciones
FROM notb00008 a
WHERE a.num_emp = ptss.ficha AND
a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND
a.clase_mov IN ("E","I") and a.cod_mov in (36)
IF valor_vacaciones =0 THEN
LET col = 13
LET fila = cnt
LET val = 'Normal'
CALL enviaDDE(fila,col,val)
ELSE
LET col = 13
LET fila = cnt
LET val = 'No laboró mes completo por razones varias'
CALL enviaDDE(fila,col,val)
END IF
LET col = 14
LET fila = cnt
LET val = valor_boni
CALL enviaDDE(fila,col,val)
LET col = 15
LET fila = cnt
LET val = ciarnc
CALL enviaDDE(fila,col,val)
#REGALIA PASCUAL
LET valor_boni = 0
SELECT SUM(a.valor) INTO valor_boni
FROM notb00008 a
WHERE a.num_emp = ptss.ficha AND
a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND
a.clase_mov IN ("E","I") and a.cod_mov in (32)
LET col = 18
LET fila = cnt
LET val = valor_boni
CALL enviaDDE(fila,col,val)
LET col = 21
LET fila = cnt
LET val = ptss.valor_tss USING "###,###.##"
CALL enviaDDE(fila,col,val)
LET cnt = cnt + 1
IF cuenta > 3 THEN
LET cuenta = 0
LET progreso =progreso + 1
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END IF
DISPLAY BY NAME no_registro
LET cuenta = cuenta + 1
LET no_registro = no_registro+1
END FOREACH
ELSE
#BONI CANCELADOS
IF tipo_reporte = "BON1" THEN
FOREACH busca INTO ptss.ficha THRU ptss.departamento
LET col = 2
LET fila = cnt
LET val = "001"
CALL enviaDDE(fila,col,val)
LET col = 3
LET fila = cnt
LET val = ptss.cedula
CALL enviaDDE(fila,col,val)
LET col = 4
LET fila = cnt
LET val = ptss.nom1
CALL enviaDDE(fila,col,val)
LET col = 5
LET fila = cnt
LET val = ptss.apell1
CALL enviaDDE(fila,col,val)
LET col = 6
LET fila = cnt
LET val = ptss.apell2
CALL enviaDDE(fila,col,val)
LET col = 7
LET fila = cnt
LET val = ptss.sexo
CALL enviaDDE(fila,col,val)
LET col = 8
LET fila = cnt
LET val = ptss.fecha_n USING "dd/mm/yyyy"
CALL enviaDDE(fila,col,val)
LET col = 9
LET fila = cnt
LET val = ptss.valor_tss
CALL enviaDDE(fila,col,val)
LET cnt = cnt + 1
IF cuenta > 3 THEN
LET cuenta = 0
LET progreso =progreso + 1
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END IF
DISPLAY BY NAME no_registro
LET cuenta = cuenta + 1
LET no_registro = no_registro+1
END FOREACH
END IF
END IF
CALL escribeCSV(tipo_reporte,periodo) RETURNING mensaje
CALL fgl_winmessage("INFO","REPORTE TERMINADO. ARCHIVO: "||mensaje,"INFO")
END FUNCTION
-- Genero 6 (GDC 6.00) ya no incluye el modulo WINDDE: en lugar de llenar Excel
-- celda por celda, cada "celda" se guarda en memoria y al final se escribe un
-- CSV (separador ;) con las mismas filas y columnas de la plantilla de la TSS.
FUNCTION celda_key(xf,xc)
DEFINE xf,xc INTEGER
DEFINE sf,sc STRING
LET sf = xf USING "<<<<<&"
LET sc = xc USING "<<<<<&"
RETURN sf || "," || sc
END FUNCTION
FUNCTION enviaDDE(xfila,xcol,xval)
DEFINE xfila,xcol INTEGER
DEFINE xval STRING
DEFINE k STRING
LET k = celda_key(xfila,xcol)
LET celdas[k] = xval CLIPPED
IF xfila > maxfila THEN LET maxfila = xfila END IF
IF xcol > maxcol THEN LET maxcol = xcol END IF
END FUNCTION
FUNCTION terminaDDE()
CALL celdas.clear()
LET maxfila = 0
LET maxcol = 0
END FUNCTION
FUNCTION conectarDDE()
CALL celdas.clear()
LET maxfila = 0
LET maxcol = 0
END FUNCTION
-- Escribe las celdas acumuladas en FGLSPOOL/noprmt026_<tipo>_<periodo>.csv
-- y devuelve la ruta del archivo.
FUNCTION escribeCSV(xtipo,xperiodo)
DEFINE xtipo,xperiodo STRING
DEFINE ch base.Channel
DEFINE ruta STRING
DEFINE f,c INTEGER
DEFINE lin base.StringBuffer
DEFINE k,v STRING
LET ruta = FGL_GETENV("FGLSPOOL")
IF ruta IS NULL OR ruta.getLength() = 0 THEN LET ruta = "." END IF
LET ruta = ruta || "\\noprmt026_" || xtipo || "_" || xperiodo || ".csv"
LET ch = base.Channel.create()
LET lin = base.StringBuffer.create()
CALL ch.openFile(ruta,"w")
FOR f = 1 TO maxfila
CALL lin.clear()
FOR c = 1 TO maxcol
LET k = celda_key(f,c)
IF celdas.contains(k) THEN
LET v = celdas[k]
IF v.getIndexOf(";",1) > 0 OR v.getIndexOf("\"",1) > 0 THEN
LET v = "\"" || v.trim() || "\""
END IF
ELSE
LET v = ""
END IF
IF c > 1 THEN CALL lin.append(";") END IF
CALL lin.append(v)
END FOR
CALL ch.writeNoNL(lin.toString())
CALL ch.writeNoNL("\r\n")
END FOR
CALL ch.close()
RETURN ruta
END FUNCTION
FUNCTION checkError(res)
DEFINE res INTEGER
DEFINE mess STRING
IF res THEN RETURN END IF
DISPLAY "DDE Error:"
CALL ui.Interface.frontCall("WINDDE","DDEError",[],[mess]);
DISPLAY mess
CALL ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] );
DISPLAY "Exit with DDE Error."
EXIT PROGRAM (-1)
END FUNCTION