From 4b2d63007b968192e5a6ed5e8e2d17688bdf64d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Wed, 7 Oct 2026 12:53:51 -0400 Subject: [PATCH 01/14] Proyecto: mover librerias y programas del grupo NOMINA a RECURSOS HUMANOS Solo cambia la ubicacion en mbsERP.4pw (ids, dependencias y fuentes sin cambios). El grupo NOMINA queda vacio. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/mbsERP.4pw | 266 ++++++++++++++++++++++---------------------- 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 2eaded1..193be8b 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -470,139 +470,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -882,6 +749,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 61818beb315f0b5de784fc7d76e5de2bb4dc5228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Wed, 7 Oct 2026 12:54:04 -0400 Subject: [PATCH 02/14] Registra noprrp045 (Formulario Ministerio de Trabajo) - Registra nofmrp045.per y la aplicacion noprrp045 en mbsERP.4pw. - Mueve noprrp045.4rp a bin/ (igual que los demas reportes). - Diseno: el gris/negrita de columnas aplica solo a filas mensuales (A/M/C); las secciones 4-8 se ven planas. Declara x.tipo como input-variable. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/{nodir => bin}/noprrp045.4rp | 25 +++++++++++++------------ PROYECTO/mbsERP.4pw | 6 ++++++ 2 files changed, 19 insertions(+), 12 deletions(-) rename PROYECTO/{nodir => bin}/noprrp045.4rp (80%) diff --git a/PROYECTO/nodir/noprrp045.4rp b/PROYECTO/bin/noprrp045.4rp similarity index 80% rename from PROYECTO/nodir/noprrp045.4rp rename to PROYECTO/bin/noprrp045.4rp index 4012cae..35f0481 100644 --- a/PROYECTO/nodir/noprrp045.4rp +++ b/PROYECTO/bin/noprrp045.4rp @@ -61,6 +61,7 @@ + @@ -68,73 +69,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 193be8b..0e40bf5 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -776,6 +776,7 @@ + @@ -882,6 +883,11 @@ + + + + + From ad1a97dd9a6c0455dcb766865bcf39125ffcaa01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Wed, 7 Oct 2026 13:06:20 -0400 Subject: [PATCH 03/14] noprrp045: corrige expresiones del diseno (.4rp) Quita espacios dentro de las expresiones RTL de bgColor/fontBold, que el parser rechazaba al cargar el reporte. Datos verificados contra la BD (monto y cantidad por mes y sexo, ano 2025). Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/noprrp045.4rp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/PROYECTO/bin/noprrp045.4rp b/PROYECTO/bin/noprrp045.4rp index 35f0481..2884ea3 100644 --- a/PROYECTO/bin/noprrp045.4rp +++ b/PROYECTO/bin/noprrp045.4rp @@ -69,73 +69,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + From 79a4a4530c48fce34c4733f14276a6efba0aae36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Thu, 8 Oct 2026 16:48:11 -0400 Subject: [PATCH 04/14] Proyecto: reorganiza grupos de RECURSOS HUMANOS - Programas y librerias de nomina (FORMULARIOS_NO, FUNCIONES_NO y las aplicaciones noprmt/noprcs/noprrp) pasan al subgrupo NOMINA. - FORMULARIOS_AD y FUNCIONES_AD pasan al subgrupo ADMINISTRACION PERSONAL. Solo cambia la ubicacion en mbsERP.4pw; ids, dependencias y fuentes sin cambios. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/mbsERP.4pw | 292 ++++++++++++++++++++++---------------------- 1 file changed, 147 insertions(+), 145 deletions(-) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 483f089..195dc66 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -747,151 +747,153 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 659e690af35e2bf7122b05b8dee44372d8f5777e Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Wed, 14 Oct 2026 18:30:22 -0400 Subject: [PATCH 05/14] JSOTO adicione los 4rp del ipprrp014 --- PROYECTO/bin/ipprrp014.4rp | 107 + PROYECTO/bin/ipprrp014r.4rp | 74 + PROYECTO/cgdir/edprrp118b.4gl | 4 +- PROYECTO/cgdir/edprrp118b.4gl.bak-20261008 | 299 +++ PROYECTO/lqdir/lqprrp009.4gl | 4 +- PROYECTO/lqdir/lqprrp009.4gl.bak_20261012 | 1040 +++++++++ PROYECTO/lqdir/lqprrp009.rdd.bak_20261012 | 1969 ++++++++++++++++++ PROYECTO/mbsERP.4pw | 2 + PROYECTO/otrodir/apiclient.4gl | 373 +++- PROYECTO/otrodir/apiclient.4gl.bak_20261014 | 305 +++ WEBSERVICES/apiclient.4gl | 172 -- WEBSERVICES/productosconteo.4gl | 35 +- WEBSERVICES/productosconteo.4gl.bak_20261012 | 213 ++ 13 files changed, 4313 insertions(+), 284 deletions(-) create mode 100644 PROYECTO/bin/ipprrp014.4rp create mode 100644 PROYECTO/bin/ipprrp014r.4rp create mode 100644 PROYECTO/cgdir/edprrp118b.4gl.bak-20261008 create mode 100644 PROYECTO/lqdir/lqprrp009.4gl.bak_20261012 create mode 100644 PROYECTO/lqdir/lqprrp009.rdd.bak_20261012 create mode 100644 PROYECTO/otrodir/apiclient.4gl.bak_20261014 delete mode 100644 WEBSERVICES/apiclient.4gl create mode 100644 WEBSERVICES/productosconteo.4gl.bak_20261012 diff --git a/PROYECTO/bin/ipprrp014.4rp b/PROYECTO/bin/ipprrp014.4rp new file mode 100644 index 0000000..aa9ac33 --- /dev/null +++ b/PROYECTO/bin/ipprrp014.4rp @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/bin/ipprrp014r.4rp b/PROYECTO/bin/ipprrp014r.4rp new file mode 100644 index 0000000..a0076cc --- /dev/null +++ b/PROYECTO/bin/ipprrp014r.4rp @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/cgdir/edprrp118b.4gl b/PROYECTO/cgdir/edprrp118b.4gl index 983031a..4e92b29 100644 --- a/PROYECTO/cgdir/edprrp118b.4gl +++ b/PROYECTO/cgdir/edprrp118b.4gl @@ -121,7 +121,7 @@ REPORT entrada14( fecha1, fecha2 DATE, #### Almacena las fecha del rango de busqueda hora CHAR(5), - entrada CHAR(14), + entrada VARCHAR(25), -- ref. completa ED.nn-nnnnn/mmaa (CHAR(14) cortaba el anio) actual VARCHAR(20), afecta CHAR(3), p_companias, desc_cuenta CHAR(30) @@ -274,7 +274,7 @@ REPORT entrada14( entrada, y.cuenta_inv, detalle1, - invcredito, + invdebito, 0, usuarios, GETDATE()) diff --git a/PROYECTO/cgdir/edprrp118b.4gl.bak-20261008 b/PROYECTO/cgdir/edprrp118b.4gl.bak-20261008 new file mode 100644 index 0000000..983031a --- /dev/null +++ b/PROYECTO/cgdir/edprrp118b.4gl.bak-20261008 @@ -0,0 +1,299 @@ +GLOBALS "cgprgb000.4gl" + +FUNCTION edprrp118( + fecha1, fecha2, detalle, entra, afecta, p_companias, acumulado_arr, usuario) + DEFINE + handler + om + .SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings() + r_filename + STRING, -- filename of Report Design Document including .4rp extension + r_output STRING, -- output format option + preview INTEGER + + DEFINE + acumulado_arr DYNAMIC ARRAY OF RECORD + cod_mov LIKE irtb00006.cod_mov, + descrip_mov LIKE intb00005.descrip_mov, + departamento SMALLINT, + nombre CHAR(30), + consumo DECIMAL(12, 2), + cuenta CHAR(10), + gasto_ind LIKE irtb00013.costo_st, + descripcion CHAR(50), + consumo_cuenta DECIMAL(12, 2), + cuenta_inv CHAR(10) + END RECORD, + ordenar CHAR(30) + + DEFINE + afecta CHAR(3), + fecha1, fecha2 DATE, + p_cctb01 RECORD LIKE cctb00001.*, + entra CHAR(14), + detalle CHAR(100), + p_companias CHAR(30), + idz INT, + ###### Variables para almacenar los datos selecionados + usuario, clave CHAR(80), + impresor SMALLINT + + LET r_filename = "edprrp118b.4rp" + LET idz = 1 + + FOR idx = 1 TO acumulado_arr.getLength() + IF idx = 1 THEN + IF fgl_report_loadCurrentSettings(r_filename) THEN + + LET preview = 1 + CALL seleccionarsalida() + RETURNING r_output -- load the .4rp file + CALL fgl_report_selectDevice(r_output) -- changing default + CALL fgl_report_selectPreview(preview) -- changing default + LET handler = + fgl_report_commitCurrentSettings() -- commit changes + + END IF + + START REPORT entrada14 TO XML HANDLER HANDLER + + END IF + + LET ordenar = + acumulado_arr[idz].cuenta CLIPPED, + "-", + acumulado_arr[idz].departamento USING "&&&&&" + OUTPUT TO REPORT entrada14( + p_cctb01.*, + fecha1, + fecha2, + detalle, + entra, + afecta, + p_companias, + acumulado_arr[idz].*, + ordenar, usuario) + LET idz = idz + 1 + END FOR + + IF idx > 1 THEN + FINISH REPORT entrada14 + ELSE + CALL fgl_winmessage( + "INFO", + "NO HAY REGISTROS EN ESTE RANGO DE FECHA Y CON LOS PARAMETROS INDICADOS", + "INFO") + END IF + --RUN imprime +END FUNCTION + +REPORT entrada14( + x, fecha1, fecha2, detalle1, entrada, afecta, p_companias, y, xordenar, usuario) + + DEFINE x RECORD LIKE cctb00001.* + DEFINE usuario VARCHAR(50) + DEFINE + y RECORD + cod_mov LIKE irtb00006.cod_mov, + descrip_mov LIKE intb00005.descrip_mov, + departamento SMALLINT, + nombre CHAR(30), + consumo DECIMAL(12, 2), + cuenta CHAR(10), + gasto_ind LIKE irtb00013.costo_st, + descripcion CHAR(30), + consumo_cuenta DECIMAL(12, 2), + cuenta_inv CHAR(10) + END RECORD, + xordenar VARCHAR(30) + + ### Acumula los valores de las diferentes cuentas para entrada diario de nomina + DEFINE + invdebito, + invcredito, + debito, + credito, + total_departamento, + total_haber, + total_deber + DECIMAL(12, 2), + detalle1, nombre_cta, rango_fecha CHAR(100), + + fecha1, fecha2 DATE, #### Almacena las fecha del rango de busqueda + hora CHAR(5), + entrada CHAR(14), + actual VARCHAR(20), + afecta CHAR(3), + p_companias, desc_cuenta CHAR(30) + ORDER BY xordenar + FORMAT + FIRST PAGE HEADER + LET hora = TIME + LET actual = TODAY USING "dd/mm/yyyy" + LET rango_fecha = + "Del ", + fecha1 USING "dd/mm/yyyy", + " Al ", + fecha2 USING "dd/mm/yyyy" + LET total_deber = 0 + LET total_haber = 0 + BEFORE GROUP OF y.departamento + LET total_departamento = 0 + + AFTER GROUP OF xordenar + + IF y.consumo < 0 THEN + LET debito = GROUP SUM(y.consumo_cuenta) * -1 + LET credito = 0 + ELSE + LET debito = 0 + LET credito = GROUP SUM(y.consumo_cuenta) + END IF + PRINTX entrada, + hora, + actual, + rango_fecha, + p_companias, + y.cod_mov, + y.consumo, + y.cuenta, + y.departamento, + y.descrip_mov, + y.gasto_ind, + y.nombre, + y.consumo_cuenta, + y.descripcion, + debito, + credito, + detalle1 + + IF afecta = "S" THEN + BEGIN WORK + IF y.consumo < 0 THEN + INSERT INTO cgtb00004( + fecha, + tipo, + ref, + cuenta_no, + departamento, + detalle_1, + debito, + credito, + us_crea, + fech_crea) + VALUES(fecha2, + 1, + entrada, + y.cuenta, + y.departamento, + detalle1, + debito, + 0, + usuarios, + GETDATE()) + ELSE + INSERT INTO cgtb00004( + fecha, + tipo, + ref, + cuenta_no, + departamento, + detalle_1, + debito, + credito, + us_crea, + fech_crea) + VALUES(fecha2, + 1, + entrada, + y.cuenta, + y.departamento, + detalle1, + 0, + credito, + usuarios, + GETDATE()) + END IF + COMMIT WORK + END IF + LET total_deber = debito + total_deber + LET total_haber = credito + total_haber + ON LAST ROW + SELECT a.descripcion + INTO nombre_cta + FROM cgtb00001 a + WHERE a.cuenta_no = y.cuenta_inv + + IF nombre_cta IS NULL THEN + LET nombre_cta = "CUENTA SIN DESCRIPCION" + END IF + IF y.consumo < 0 THEN + LET invcredito = SUM(y.consumo_cuenta * -1) + LET invdebito = 0 + LET total_haber = invcredito + total_haber + ELSE + LET invdebito = SUM(y.consumo_cuenta) + LET invcredito = 0 + LET total_deber = invdebito + total_deber + END IF + IF afecta = "S" THEN + BEGIN WORK + IF y.consumo < 0 THEN + INSERT INTO cgtb00004( + fecha, + tipo, + ref, + cuenta_no, + detalle_1, + debito, + credito, + us_crea, + fech_crea) + VALUES(fecha2, + 1, + entrada, + y.cuenta_inv, + detalle1, + 0, + invcredito, + usuarios, + GETDATE()) + ELSE + INSERT INTO cgtb00004( + fecha, + tipo, + ref, + cuenta_no, + detalle_1, + debito, + credito, + us_crea, + fech_crea) + VALUES(fecha2, + 1, + entrada, + y.cuenta_inv, + detalle1, + invcredito, + 0, + usuarios, + GETDATE()) + END IF + + {UPDATE cgtb00011 + SET referencia = referencia + 1, + us_mod = usuario, + fech_mod = getdate() + WHERE entrada_no = 5} + COMMIT WORK + + END IF + + PRINTX y.cuenta_inv, + total_haber, + nombre_cta, + desc_cuenta, + total_deber, + invdebito, + invcredito +END REPORT diff --git a/PROYECTO/lqdir/lqprrp009.4gl b/PROYECTO/lqdir/lqprrp009.4gl index a23e2d4..eabe3a8 100644 --- a/PROYECTO/lqdir/lqprrp009.4gl +++ b/PROYECTO/lqdir/lqprrp009.4gl @@ -29,7 +29,7 @@ DEFINE t_variacion DECIMAL(12,2) ###### Variables que la almacenan la informacion enviada al reporte DEFINE diario1 RECORD cuenta_no CHAR(8), - debito DECIMAL(10,2) + debito DECIMAL(14,2) # 14: el SUM del periodo excedia 10,2 (-1226) END RECORD DEFINE i SMALLINT @@ -820,7 +820,7 @@ END FUNCTION DEFINE x RECORD cuenta_no CHAR(8), - debito DECIMAL(10,2) + debito DECIMAL(14,2) # 14: el SUM del periodo excedia 10,2 (-1226) END RECORD ### Acumula los valores de las diferentes cuentas para entrada diario de nomina diff --git a/PROYECTO/lqdir/lqprrp009.4gl.bak_20261012 b/PROYECTO/lqdir/lqprrp009.4gl.bak_20261012 new file mode 100644 index 0000000..a23e2d4 --- /dev/null +++ b/PROYECTO/lqdir/lqprrp009.4gl.bak_20261012 @@ -0,0 +1,1040 @@ +{ +============================================================================== + PROGRAMA : lqprrp009 + SISTEMA : Sistema de Liquidacion Materiales + Objetivo : Liquidacion Mercancia Compras Exterior REPUESTSO + Nota: En los gastos y otros se segrega la entrada "ED.64" + PROGRAMADOR : Juan F. Soto + FECHA : Noviembre 26, 1996 + MODIFICADO : + FECHA : +============================================================================== +} +GLOBALS + "lqprgb000.4gl" +###### Variables para busqueda de rango de fecha +DEFINE elije,imp,afecta CHAR(1) +DEFINE m_mes,mes SMALLINT +DEFINE chequea_ent,p_ano CHAR(4) +DEFINE detalla CHAR(30) +DEFINE no_entrada CHAR(14) +DEFINE fecha1, fecha2 DATE ,p_fecha char(10) +DEFINE entra CHAR(14) +DEFINE entra1 CHAR(5) +DEFINE t_costst,p_fob,valor,mano_obra,sueldo_ind,monto_banco, + interes,val_64 DECIMAL(12,2) +DEFINE orden CHAR(10) +DEFINE t_variacion DECIMAL(12,2) + +###### Variables que la almacenan la informacion enviada al reporte +DEFINE diario1 RECORD + cuenta_no CHAR(8), + debito DECIMAL(10,2) +END RECORD + + DEFINE i SMALLINT + DEFINE fecha_inicial,fecha_final DATE + DEFINE tasa DECIMAL(8,2) + DEFINE primera,imp_entrada CHAR(1), salida VARCHAR(4) + +MAIN + DEFER INTERRUPT + CALL ARG_VAL(1) RETURNING usuarios + CALL ARG_VAL(2) RETURNING clave + CALL ARG_VAL(3) RETURNING impresor + + CONNECT to "smarmotech" USER usuarios USING clave + + CALL lqprrp009() +END MAIN + + FUNCTION lqprrp009() + + DEFINE busca_datos RECORD + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion CHAR(30), + unidad CHAR(3), + cod_sp SMALLINT, + cod_sp_sec SMALLINT, + entrada INTEGER, + num_doc INTEGER, + num_oc INTEGER, + tipo CHAR(2), + cantidad DECIMAL(12,2), + precio DECIMAL(12,2), + flete DECIMAL(12,2), + tasa DECIMAL(8,2), + mercado CHAR(1), + imp_colect DECIMAL(12,2), + imp_aduana DECIMAL(12,2), + cost_std DECIMAL(12,3), + clave CHAR(6) + END RECORD + + LET int_flag = FALSE + + OPTIONS + FORM LINE 8 + + OPEN FORM lqfmrp009 FROM "lqfmrp009" + DISPLAY FORM lqfmrp009 + DISPLAY "lqprrp009" AT 4,3 + DISPLAY "Liquidacion Partes y Repuestos" AT 6,24 + + LET tipo_papel = 2 + CALL msgrp000(tipo_papel) + + INPUT BY NAME p_ano,m_mes,elije,imp_entrada,imp,chstd + + AFTER FIELD p_ano + IF p_ano is null THEN + LET numero_msg = 16 + CALL msg(numero_msg) + NEXT FIELD p_ano + END IF + AFTER FIELD m_mes + IF m_mes is null THEN + LET numero_msg = 16 + CALL msg(numero_msg) + NEXT FIELD m_mes + END IF + SELECT Convert(varchar(10),a.fecha_inicio,103),Convert(varchar(10),a.fecha_corte,103) INTO fecha_inicial,fecha_final + FROM prdtable a WHERE a.mes = m_mes and a.ano = p_ano + + DISPLAY BY NAME fecha_inicial,fecha_final ATTRIBUTE(BOLD) + LET chequea_ent = m_mes using "&&",p_ano[3,4] + LET no_entrada = "ED.29-000/",chequea_ent + + + LET p_fechas = fecha_final using "ddmmyy" + CALL prd(p_fechas,usuarios) RETURNING bandera + IF bandera = 1 THEN + LET bandera = 0 + NEXT FIELD p_ano + END IF + + AFTER FIELD elije + IF elije = "E" THEN + SELECT unique a.ref FROM cgtb00004 a WHERE a.ref = no_entrada + + IF status != notfound THEN + LET numero_msg = 222 + CALL msg(numero_msg) + #NEXT FIELD p_ano + END IF + END IF + END INPUT + + IF int_flag THEN + LET numero_msg = 2 + CALL msg(numero_msg) + LET int_flag = FALSE + RETURN + END IF + LET primera = "S" + CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, + doble_on,doble_off,comp_on,comp_off, + doce,normal,archivo,copia + + + LET r_filename = 'lqprrp009.4rp' + LET preview = 1 + + IF fgl_report_loadCurrentSettings(r_filename) THEN + + CALL seleccionarsalida() RETURNING r_output -- load the .4rp file + CALL fgl_report_selectDevice(r_output) -- changing default + CALL fgl_report_selectPreview(preview) -- changing default + LET handler = fgl_report_commitCurrentSettings() -- commit changes + END IF + + IF HANDLER IS NOT NULL THEN + START REPORT liquida7 TO XML HANDLER HANDLER + + + + DISPLAY "<<>>" AT 19,14 + ATTRIBUTE(YELLOW) + + DELETE FROM cttb00032 WHERE mes = m_mes and ano = p_ano AND tipo = '3' + DELETE FROM cttb00013 WHERE fecha_lq = fecha_final and tipo_lq = elije AND tipo_orden =3 + INSERT INTO cttb000log1 VALUES (GETDATE(),usuarios,'lqprrp009','ELIMINO') + + + DECLARE busca CURSOR FOR + SELECT UNIQUE a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + a.descrip_esp,a.unidad_med, + d.cod_sp,d.cod_sp_sec,d.rep_entrada,c.rep_entrada,c.num_oc,c.tipo, + c.cantidad_oc,c.cantidad_oc*c.fob,c.costo_flete,d.prima_us,d.liquidada,c.impuesto,c.otros_g + FROM irtb00002 a,cgtb00018 c,cgtb00017 d + WHERE a.cod_n = c.cod_n and a.cod_grupo = c.cod_grupo and + a.cod_tipo = c.cod_tipo and a.cod_sec = c.cod_sec and + c.rep_entrada = d.rep_entrada and d.liquidada = elije and + d.fecha between fecha_inicial and fecha_final and c.status_t is null + AND c.num_oc = d.num_oc and c.tipo = d.tipo AND c.status_t IS NULL AND + c.tipo = 3 AND + d.status_t is null ORDER BY c.num_oc,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec + + FOREACH busca INTO busca_datos.* + LET orden = busca_datos.num_oc USING "<<<<<<" + IF elije != "L" THEN +{# Busca el monto pagado al colector + SELECT sum(a.debito-a.credito) INTO busca_datos.imp_colect FROM cgtb00004 a + WHERE (a.cuenta_no = "1161-01" and a.status_t is null and + a.fecha <= fecha_final and a.cod_sec = a.cod_sec and + a.num_doc = orden) +} + IF busca_datos.imp_colect is null THEN + LET busca_datos.imp_colect = 0 + END IF + + IF busca_datos.imp_colect < 0 THEN + LET busca_datos.imp_colect = busca_datos.imp_colect * -1 + END IF + +#Busca la entrada 64 del rango especificado + SELECT sum(a.debito-a.credito) INTO val_64 FROM cgtb00004 a + WHERE (a.fecha between fecha_inicial and fecha_final and + a.ref[1,5] = "ED.64") AND (a.cod_aux = a.cod_aux and a.cod_sec = a.cod_sec + and a.num_doc = orden and a.status_t is null) + + IF val_64 is null THEN + LET val_64 = 0 + END IF + +{# Busca los gastos aduanales + SELECT sum(a.debito-a.credito) INTO busca_datos.imp_aduana FROM cgtb00004 a + WHERE (cuenta_no = "1161" and a.status_t is null and + a.fecha <= fecha_final and a.cod_sec = a.cod_sec and + a.num_doc = orden) +} + END IF + + IF busca_datos.imp_aduana is null THEN + LET busca_datos.imp_aduana = 0 + END IF + + IF busca_datos.imp_aduana < 0 THEN + LET busca_datos.imp_aduana = busca_datos.imp_aduana * -1 + END IF + + IF busca_datos.imp_aduana != 0 THEN + LET busca_datos.imp_aduana = busca_datos.imp_aduana - val_64 + END IF +# Busca el costos standard + LET busca_datos.cost_std = 0 + SELECT a.costo_st INTO busca_datos.cost_std FROM irtb00013 a + WHERE a.ano = p_Ano and a.cod_n = busca_datos.cod_n and + a.cod_grupo=busca_datos.cod_grupo and a.cod_tipo=busca_datos.cod_tipo + AND a.mes_fin = 12 + AND a.cod_sec = busca_datos.cod_sec and a.status_t is null + + IF busca_datos.cost_std is null THEN + LET busca_datos.cost_std = 0 + END IF + LET busca_datos.clave = busca_datos.num_oc using "<<<<",busca_datos.tipo + OUTPUT TO REPORT liquida7(busca_datos.*) + END FOREACH + + FINISH REPORT liquida7 + + END IF + + #IF imp = "S" THEN + # RUN imprime + #END IF + + IF imp_entrada = "S" THEN + CALL entrada0271() + END IF + CLEAR SCREEN + END FUNCTION + +REPORT liquida7(x) + DEFINE x RECORD + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion varchar(100), + unidad CHAR(3), + cod_sp SMALLINT, + cod_sp_sec SMALLINT, + entrada INTEGER, + num_doc INTEGER, + num_oc INTEGER, + tipo CHAR(10), + cantidad DECIMAL(12,2), + precio DECIMAL(12,2), + flete DECIMAL(12,2), + tasa DECIMAL(8,2), + mercado CHAR(10), + imp_colect DECIMAL(12,2), + imp_aduana DECIMAL(12,2), + cost_std DECIMAL(12,3), + clave CHAR(10) + END RECORD + + DEFINE n_reg SMALLINT + + DEFINE fecha1,fecha2 DATE + DEFINE variacion,precio_std,fob,c_f,seguro,cost_pl,valor,t_fob,t_flete, + t_seguro,t_cf,t_impcol,t_impaduana,t_dollar,t_costopl,t_recibida, + t_precio,o_variacion,total_cf,o_impaduana,o_impcolect,o_dollar,o_cf, + balan_act, + ot_fob, + ot_flete, + ot_cf, + ot_seguro, + ot_impcol, + ot_impaduana, + ot_dollar, + ot_costopl, + ot_costo, + ot_precio, + ot_costst, + ot_variacion DECIMAL(12,2) + + DEFINE descrip1 CHAR(30) + DEFINE t_costo, costo_unit DECIMAL(12,4) + DEFINE p_cuenta CHAR(8) + DEFINE otras_cta CHAR(8) + DEFINE tituloFecha, producto_codigo,proveedor,orden_tipo VARCHAR(250) + +## DEFINICION DE LAS VARIABLES DE IMPRESION + DEFINE doble_on CHAR(2) + DEFINE doble_off CHAR(2) + DEFINE negrillas_on CHAR(2) + DEFINE negrillas_off CHAR(2) + DEFINE comp_on CHAR(2) + DEFINE comp_off CHAR(2) + DEFINE doce CHAR(2) + DEFINE normal CHAR(2) + DEFINE hora CHAR(5) + + OUTPUT +## DEFINICION DE LOS MARGENES DE IMPRESION + TOP MARGIN 0 + LEFT MARGIN 0 + BOTTOM MARGIN 3 + PAGE LENGTH 150 + FORMAT + PAGE HEADER + LET hora = TIME + LET tituloFecha = "Del ",fecha_inicial USING "dd/mm/yy"," Al ", + fecha_final USING "dd/mm/yy" + + FIRST PAGE HEADER + PRINTX p_compania.nombre, hora, tituloFecha + +## AQUI SE INDICA LA IMPRESION DE LOS ENCABEZADOS + + { LET l = (210 - LENGTH(p_compania.nombre CLIPPED))/2 + PRINT COLUMN 2, comp_on,"lqprrp007", + COLUMN l, p_compania.nombre CLIPPED, + COLUMN 210, "Pag. ",pageno using "###" + LET l = (210 - LENGTH("Sistema de Contabilidad de Costo"))/2 + PRINT COLUMN l, "Sistema de Contabilidad de Costo", + COLUMN 210, today using "dd/mm/yy" + LET l = (210 - LENGTH("Liquidacion Mercancia Partes y Repuestos"))/2 + PRINT COLUMN l, "Liquidacion Mercancia Partes y Repuestos", + COLUMN 210, hora + PRINT COLUMN 98, "Del ",fecha_inicial USING "dd/mm/yy"," Al ", + fecha_final USING "dd/mm/yy" + PRINT negrillas_on + PRINT COLUMN 1, "---------------------------------------------------", + "---------------------------------------------------", + "---------------------------------------------------", + "---------------------------------------------------", + "----------------------" + + PRINT COLUMN 128,"GASTO" + + PRINT COLUMN 50, "Reporte", + COLUMN 61, "Ordenes", + COLUMN 96, "COSTO &", + COLUMN 115, "IMPUESTO", + COLUMN 128, "ADUANAL", + COLUMN 141, "PRIMA ", + COLUMN 153, "COSTO EN", + COLUMN 166, "UNIDADES", + COLUMN 183, "COSTO", + COLUMN 194, "PRECIO", + COLUMN 206, "COSTO" + + PRINT COLUMN 1, "Materiales", + COLUMN 50, "Entrada ", + COLUMN 61, "Compras", + COLUMN 76, "FOB", + COLUMN 83, "FLETE", + COLUMN 96, "FLETE", + COLUMN 104, "SEGURO", + COLUMN 115, "COLECTOR", + COLUMN 128, "Y OTROS", + COLUMN 141, "DOLLAR", + COLUMN 153, "PLANTA", + COLUMN 166, "RECIBIDA", + COLUMN 183, "UNIT.", + COLUMN 195, "STD", + COLUMN 206, "STD", + COLUMN 218, "VARIACION" + + + PRINT COLUMN 1, "----------------------------------------------------", + "----------------------------------------------------", + "----------------------------------------------------", + "----------------------------------------------------", + "------------------"} + + IF primera = "S" THEN + LET t_fob = 0 + LET t_flete = 0 + LET t_seguro = 0 + LET t_cf = 0 + LET t_impcol = 0 + LET t_impaduana = 0 + LET t_dollar = 0 + LET t_costopl = 0 + LET t_recibida = 0 + LET t_costo = 0 + LET t_precio = 0 + LET t_costst = 0 + LET t_variacion = 0 + LET o_variacion = 0 + LET o_impaduana = 0 + LET o_impcolect = 0 + LET o_dollar = 0 + LET o_cf = 0 + LET idx = 1 + LET primera = "N" + END IF + + BEFORE GROUP OF x.clave +# Busca La suma del costo y flete + SELECT SUM(a.fob+a.costo_flete),count(*) INTO total_cf,n_reg + FROM cgtb00018 a,cgtb00017 b + WHERE (a.num_oc = x.num_oc) and (a.tipo = x.tipo) and + (b.fecha between fecha_inicial and fecha_final) and + (a.num_oc = b.num_oc and a.tipo = b.tipo) and + (a.status_t is null) and (a.rep_entrada = b.rep_entrada) + + IF total_cf is null THEN + LET total_cf = 0 + END IF + #PRINT negrillas_off + +BEFORE GROUP OF x.num_oc + LET ot_fob =0 + LET ot_flete =0 + LET ot_cf =0 + LET ot_seguro =0 + LET ot_impcol =0 + LET ot_impaduana =0 + LET ot_dollar =0 + LET ot_costopl =0 + LET ot_costo =0 + LET ot_precio =0 + LET ot_costst =0 + LET ot_variacion =0 + ON EVERY ROW +# Busca la fecha del reporte de entrada para actualizar la tabla de +# liquidacion + LET selec = + "SELECT DISTINCT a.fecha FROM irtb00006 a ", + "WHERE a.num_doc = ? and ", + " a.cod_mov in (1,2) ", + " and a.status_t IS NULL" + + PREPARE comando FROM selec + EXECUTE comando USING x.entrada INTO p_fecha + LET fob = x.precio +#----------------------------------------------- + LET seguro = 0 +#----------------------------------------------- + + LET c_f = fob + x.flete + # jhonny 10/4/99 LET seguro = (c_f * .10) + LET valor = c_f * x.tasa + #IF n_reg > 1 THEN + # LET x.imp_aduana = (x.imp_aduana / total_cf) * c_f + # LET x.imp_colect = (x.imp_colect / total_cf) * c_f + #END IF + IF x.mercado = "L" THEN + LET seguro = 0 + LET x.imp_colect = 0 + LET x.imp_aduana = 0 + LET valor = 0 + END IF + LET cost_pl = seguro + c_f + x.imp_colect + x.imp_aduana + valor + LET costo_unit = cost_pl / x.cantidad + LET precio_std = x.cantidad * x.cost_std + LET variacion = cost_pl - precio_std + + LET producto_codigo = x.cod_n using "&&&&&","-",x.cod_grupo using "&&&&&","-", + x.cod_tipo using "&&&&&","-",x.cod_sec using "&&&&&", + " ",x.descripcion," ",x.unidad + + LET proveedor = x.cod_sp using "&&","-",x.cod_sp_sec using "&&&&" + + LET orden_tipo = x.num_oc using "&&&&&","-",x.tipo + + DISPLAY producto_codigo, + proveedor, + orden_tipo, + x.entrada using "&&&&&&", + fob using "#,###,###.##", + x.flete using "##,###.##", + c_f using "#,###,###.##", + seguro using "##,###.##", + x.imp_colect using "#,###,###.##", + x.imp_aduana using "###,###.##", + valor using "####,###.##", + cost_pl using "####,###.##", + x.cantidad using "##,###,###.##", + costo_unit using "###,###.####", + x.cost_std using "####,###.####", + precio_std using "#####,###.##", + variacion using "--,---,---.##" + + PRINTX producto_codigo, + proveedor, + orden_tipo, + x.entrada using "&&&&&&", + fob using "#,###,###.##", + x.flete using "##,###.##", + c_f using "#,###,###.##", + seguro using "##,###.##", + x.imp_colect using "#,###,###.##", + x.imp_aduana using "###,###.##", + valor using "####,###.##", + cost_pl using "####,###.##", + x.cantidad using "##,###,###.##", + costo_unit using "###,###.####", + x.cost_std using "####,###.####", + precio_std using "#####,###.##", + variacion using "--,---,---.##" + + IF chstd = "S" THEN + SELECT a.cod_n FROM irtb00013 a + WHERE a.cod_n = x.cod_n AND a.cod_grupo = x.cod_grupo AND + a.cod_tipo = x.cod_tipo AND + a.cod_sec = x.cod_Sec AND a.mes_ini = "01" AND a.mes_fin = "12" + AND a.ano = p_ano + + IF STATUS = NOTFOUND THEN + INSERT INTO irtb00013 + VALUES ("01","12",p_ano,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec, + costo_unit,null, SUSER_SNAME(),GETDATE(),null,null) + + END IF + END IF +INSERT INTO cttb00013 + (fecha_lq ,fecha ,tipo_lq ,num_oc ,cod_n ,cod_grupo + ,cod_tipo ,cod_sec ,cantidad ,costo_lq ,status_t,us_crea + ,fech_crea ,us_mod ,fech_mod,tipo_orden) + + + VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo, + x.cod_sec,x.cantidad,costo_unit,null,SUSER_SNAME(),GETDATE(),null,null,x.tipo) + + INSERT INTO cttb00032 + VALUES (p_ano,m_mes,elije,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec,x.cod_sp, + x.cod_sp_sec,x.entrada,x.num_oc,x.tipo,fob,x.flete,c_f,seguro, + x.imp_colect,x.imp_aduana,valor,cost_pl,x.cantidad,costo_unit, + x.cost_std,precio_std,null,SUSER_SNAME(),GETDATE(),null,null) + +INSERT INTO cttb000log2 +(fecha_lq ,fecha ,tipo_lq ,num_oc ,cod_n ,cod_grupo + ,cod_tipo ,cod_sec ,cantidad ,costo_lq ,status_t,us_crea + ,fech_crea ,us_mod ,fech_mod,tipo_orden,programa) + + + VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo, + x.cod_sec,x.cantidad,costo_unit,null,SUSER_SNAME(),GETDATE(),null,null,x.tipo,'lqprrp007') + +# Acumulacion de totales + LET t_fob = t_fob + fob + LET t_flete = t_flete + x.flete + LET t_seguro = t_seguro + seguro + LET t_cf = t_cf + c_f + LET t_impcol = t_impcol + x.imp_colect + LET t_impaduana = t_impaduana + x.imp_aduana + LET t_dollar = t_dollar + valor + LET t_costopl = t_costopl + cost_pl + LET t_costo = t_costo + costo_unit + LET t_precio = t_precio + x.cost_std + LET t_costst = t_costst + precio_std + LET t_variacion = t_variacion + variacion + LET o_variacion = o_variacion + cost_pl + LET o_impaduana = o_impaduana + x.imp_aduana + seguro + LET o_impcolect = o_impcolect + x.imp_colect + LET o_dollar = o_dollar + valor + LET o_cf = o_cf + c_f + + LET ot_fob = ot_fob + fob + LET ot_flete = ot_flete + x.flete + LET ot_cf = ot_cf + c_f + LET ot_seguro = ot_seguro + seguro + LET ot_impcol = ot_impcol + x.imp_colect + LET ot_impaduana = ot_impaduana + x.imp_aduana + LET ot_dollar = ot_dollar + valor + LET ot_costopl = ot_costopl + cost_pl + LET ot_costo = ot_costo + costo_unit + LET ot_precio = ot_precio + x.cost_std + LET ot_costst = ot_costst + precio_std + LET ot_variacion = ot_variacion + variacion + + + AFTER GROUP OF x.num_oc +# Validacion del arreglo para imprimir la entrada 27 + + IF imp_entrada = "S" THEN + LET entrada27[idx].cuenta_no = "1161" + LET entrada27[idx].cod_aux = x.cod_sp + LET entrada27[idx].cod_sec = x.cod_sp_sec + LET entrada27[idx].num_doc = x.num_oc + LET entrada27[idx].valor = o_impaduana + LET o_impaduana = 0 + LET idx = idx + 1 + LET entrada27[idx].cuenta_no = "1161-01" + LET entrada27[idx].cod_aux = x.cod_sp + LET entrada27[idx].cod_sec = x.cod_sp_sec + LET entrada27[idx].num_doc = x.num_oc + LET entrada27[idx].valor = o_impcolect + LET o_impcolect = 0 + LET idx = idx + 1 + + LET entrada27[idx].cuenta_no = "1161-02" + LET entrada27[idx].cod_aux = x.cod_sp + LET entrada27[idx].cod_sec = x.cod_sp_sec + LET entrada27[idx].num_doc = x.num_oc + LET entrada27[idx].valor = o_dollar + LET o_dollar = 0 + LET idx = idx + 1 + + LET entrada27[idx].cuenta_no = "1161-03" + LET entrada27[idx].cod_aux = x.cod_sp + LET entrada27[idx].cod_sec = x.cod_sp_sec + LET entrada27[idx].num_doc = x.num_oc + LET entrada27[idx].valor = o_cf + LET o_cf = 0 + LET idx = idx + 1 + END IF + + PRINTX ot_fob using "#,###,###.##", + ot_flete using "##,###.##", + ot_cf using "###,###.##", + ot_seguro using "##,###.##", + ot_impcol using "####,###.##", + ot_impaduana using "####,###.##", + ot_dollar using "##,###,###.##", + ot_costopl using "##,###,###.##", + ot_costo using "####,###.##", + ot_precio using "####,###.####", + ot_costst using "##,###,###.####", + ot_variacion using "--,---,---.##" + SKIP 1 LINE +#------------------------------------------------------------------------- + ON LAST ROW + + + PRINTX t_fob using "#,###,###.##", + t_flete using "##,###.##", + t_cf using "###,###.##", + t_seguro using "##,###.##", + t_impcol using "####,###.##", + t_impaduana using "####,###.##", + t_dollar using "##,###,###.##", + t_costopl using "##,###,###.##", + t_costo using "####,###.##", + t_precio using "####,###.####", + t_costst using "##,###,###.####", + t_variacion using "--,---,---.##" +END REPORT + +{ +------------------------------------------------------------------------------- +PROGRAMA : EDPRRP027 +OBJETIVO : Listar las Entrada de Diario Partes y Repuestos +PROGRAMADOR : Juan F. Soto +FECHA REALIZACION : Noviembre 27, 1996. +------------------------------------------------------------------------------- +} +FUNCTION entrada0271() + DEFINE longitud,u_mes,ultimo,numero_ent SMALLINT, + ch_ano,tiempo CHAR(4) + + +# WHENEVER ERROR CONTINUE + + OPTIONS + FORM LINE 8, + ERROR LINE 23, + COMMENT LINE 21 + +##### Abriendo y desplegando el formulario de captura de datos + + OPEN FORM entrada27 FROM "lqfmfu002" + DISPLAY FORM entrada27 + DISPLAY "entrada029" AT 4,3 + DISPLAY "Entrada de Diario Partes y Repuestos" AT 6,16 + + LET tipo_papel = 1 + CALL msgrp000(tipo_papel) + + ###### Aceptando los valores para el rango de fecha + + INPUT BY NAME entra,fecha1,fecha2,afecta,detalla + BEFORE INPUT + LET numero_ent = 29 + LET fecha1 =fecha_inicial + LET fecha2 =fecha_final + DISPLAY BY NAME fecha1,fecha2 + + LET entra = 'ED.',numero_ent USING "&&" + LET ch_ano = YEAR(fecha1) USING "&&&&" + + SELECT MAX(mes) INTO u_mes FROM prdtable + WHERE @ano = p_ano and fecha_inicio >= fecha1 AND + fecha_corte <= fecha2 + + LET tiempo = u_mes USING "&&",ch_ano[3,4] + # SELECT MAX(a.ref[7,9]) INTO ultimo FROM cgtb00004 a + # WHERE a.ref[4,5] = numero_ent and a.ref[11,14] = tiempo + + # IF ultimo is null THEN + # LET ultimo = 0 + # END IF + # LET ultimo = ultimo + 1 + LET entra = entra CLIPPED,'-',ultimo using "&&&","/", + tiempo + DISPLAY BY NAME entra + + AFTER FIELD entra + LET longitud = LENGTH(entra) + IF longitud != 14 THEN + LET numero_msg = 77 + CALL msg(numero_msg) + NEXT FIELD entra + END IF + SELECT unique a.ref FROM cgtb00004 a WHERE a.ref=entra AND a.status_t IS NULL + + IF STATUS != NOTFOUND THEN + ERROR "(12) REGISTRO EXISTE" + NEXT FIELD entra + END IF + + LET entra1 = entra + + BEFORE FIELD fecha1 + SELECT MAX (Convert(varchar(10),(a.fecha),103)) INTO p_fecha FROM cgtb00004 a + WHERE a.ref[1,5] = entra1 AND a.status_t IS NULL + LET fecha1 = p_fecha + 1 + + DISPLAY BY NAME fecha1 + + AFTER FIELD fecha1 + IF fecha1 IS NULL THEN + ERROR "(16) CAMPO EN BLANCO" + NEXT FIELD fecha1 + END IF + + IF fecha1 <= p_fecha THEN + LET existe = "S" + END IF + + AFTER FIELD fecha2 + IF fecha2 is null THEN + ERROR "(16) CAMPO EN BLANCO" + NEXT FIELD fecha2 + END IF + + IF fecha1 > fecha2 THEN + ERROR "(149) FECHA NO PUEDE SER MAYOR QUE LA ANTERIOR" + NEXT FIELD fecha1 + END IF + + ###### Selecionando en rango de fecha de la tabla de periodo para el fecha2 + +AFTER INPUT + IF int_flag THEN + ERROR "(2) OPERACION CANCELADA" + LET int_flag = false + RETURN + END IF + END INPUT +##### Creando la facilidad para cancelar proceso con SUPR + +LET idx = idx - 1 +# Busca la informacion requerida + + DISPLAY "<< Buscando Informacion ... Espere Por Favor. >>" AT 19,14 + ATTRIBUTE (REVERSE,BOLD) + + + + + CALL seleccionarsalida() RETURNING salida + CALL configureoutput(salida) RETURNING HANDLER + START REPORT entrada641 TO XML HANDLER handler + + DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" + AT 19,14 ATTRIBUTE (REVERSE) + +##### Loop para enviar informacion al reporte +DECLARE buscar CURSOR FOR + SELECT '1135-01',SUM(c.cantidad_oc*b.costo_st) + FROM irtb00013 b,cgtb00018 c,cgtb00017 d + WHERE b.status_t IS NULL and (b.cod_n = c.cod_n and + b.cod_grupo = c.cod_grupo and b.cod_tipo = c.cod_tipo and + b.cod_sec = c.cod_sec) and (c.num_oc = d.num_oc) and + d.fecha BETWEEN fecha1 AND fecha2 AND d.status_t IS NULL + + OPEN buscar + WHILE STATUS != NOTFOUND + FETCH buscar INTO diario1.* + + IF status = NOTFOUND THEN + EXIT WHILE + END IF + + IF int_flag THEN + ERROR "(2) OPERACION CANCELADA" + LET int_flag = FALSE + RETURN + END IF + LET diario1.debito = t_costst + OUTPUT TO REPORT entrada641(diario1.*,fecha1,fecha2,detalla,entra) + END WHILE + FINISH REPORT entrada641 + +END FUNCTION + +#### Funcion para dar salida ordenada a la informacion requerida de +#### una entrada de diario de nominas local + + REPORT entrada641(x,fecha1,fecha2,detalle1,entrada) + +DEFINE x RECORD + cuenta_no CHAR(8), + debito DECIMAL(10,2) +END RECORD + + ### Acumula los valores de las diferentes cuentas para entrada diario de nomina + DEFINE debito,credito DECIMAL(12,2) + DEFINE detalle1 CHAR(30) + DEFINE mano_obra,sueldo_ind,monto_banco DECIMAL(12,2) + DEFINE total1,total2,total3,total4,total5,total6 DECIMAL(12,2) + DEFINE total7,total8 DECIMAL(12,2) ## Acumula los totales DEBITO Y CREDITO + DEFINE tasa1 DECIMAL(5,2) ## Almacena la tasa de la tasa de cambio + DEFINE fecha1,fecha2 DATE #### Almacena las fecha del rango de busqueda + DEFINE nomina CHAR(1) + DEFINE doble_on CHAR(2) + DEFINE doble_off CHAR(2) + DEFINE negrillas_on CHAR(6) + DEFINE negrillas_off CHAR(6) + DEFINE comp_on CHAR(2) + DEFINE comp_off CHAR(2) + DEFINE doce CHAR(2) + DEFINE normal CHAR(2) + DEFINE normall CHAR(3) + DEFINE comprimido CHAR(3) + DEFINE hora CHAR(5) + DEFINE dpto INTEGER + DEFINE nomina1 CHAR(24) + DEFINE entrada CHAR(14) + + OUTPUT + TOP MARGIN 0 + LEFT MARGIN 0 + BOTTOM MARGIN 2 + PAGE LENGTH 150 + + FORMAT + PAGE HEADER + { LET doble_on = ASCII 14 + LET negrillas_on = ASCII 27, ASCII 69 + LET negrillas_off = ASCII 27, ASCII 70 + LET comp_on = ASCII 15 + LET comp_off = ASCII 18 + LET doce = ASCII 27,ASCII 77 + LET normal = ASCII 27, ASCII 80} + LET hora = time + +##### Selecionado la descripcion del fecha2 + + LET l = (100 - LENGTH(p_compania.nombre CLIPPED))/2 + PRINT COLUMN 2, normal,doce,comp_off,comp_on,"lqprrp009", + COLUMN l, p_compania.nombre CLIPPED, + COLUMN 90, "Pag. ",pageno using "###" + LET l = (100 - LENGTH("Sistema de Contabilidad de Costo"))/2 + PRINT COLUMN l, "Sistema de Contabilidad de Costo", + COLUMN 90, today using "dd/mm/yy" + LET l = (100 - LENGTH("Entrada de Diario Liquidacion Partes Y Repuestos"))/2 + PRINT COLUMN l, "Entrada de Diario Liquidacion Partes Y Repuestos", + COLUMN 90, hora + PRINT COLUMN 1, "Del ",fecha_inicial USING "dd/mm/yy"," Al ", + fecha_final USING "dd/mm/yy" +# , negrillas_off + + SKIP 1 LINE + + PRINT COLUMN 01,"Entrada de Diario No.", + doble_on,entrada + + PRINT COLUMN 1,"Observaciones: _____________________________________" + PRINT COLUMN 1," _____________________________________" + + PRINT doce + PRINT COLUMN 1, + "--------------------------------------------------", + "--------------------------------------------------", + negrillas_on + + PRINT COLUMN 2, "Cuenta ", + COLUMN 11, "Dpto", + COLUMN 17, "Catalogo", + COLUMN 26, "Refe", + COLUMN 41, "Concepto", + COLUMN 75, "Debe", + COLUMN 93, "Haber",negrillas_off + + PRINT COLUMN 1, + "--------------------------------------------------", + "--------------------------------------------------", + negrillas_off + SKIP 1 LINE + + IF debito is null THEN + LET debito = 0 + END IF + ON EVERY ROW + PRINT COLUMN 4, x.cuenta_no, + COLUMN 35, "INVENTARIO REPUESTOS", + COLUMN 66, x.debito using "###,###,##&.&&" + LET debito = debito + x.debito + + IF afecta = "S" THEN + INSERT INTO cgtb00004 + (fecha + ,tipo + ,ref + ,cuenta_no + ,detalle_1 + ,debito + ,credito + ,us_crea + ,fech_crea + + ) + VALUES(fecha2,1,entrada,x.cuenta_no,detalle1,x.debito,0,SUSER_SNAME(),GETDATE() + ) + + END IF + +ON LAST ROW + IF credito is null THEN + LET credito = 0 + END IF + ###### Acumulando totales por columna + PRINT COLUMN 4, "5501", + COLUMN 35, "VARIACION COSTO INDIRECTO"; + + IF t_variacion > 0 THEN + PRINT COLUMN 66, t_variacion USING "###,###,##&.&&" + LET debito = debito + t_variacion + IF afecta = "S" THEN + INSERT INTO cgtb00004 + (fecha + ,tipo + ,ref + ,cuenta_no + ,detalle_1 + ,debito + ,credito + ,us_crea + ,fech_crea + + ) + VALUES (fecha2,1,entrada,"5501",detalle1, + t_variacion,0,SUSER_SNAME(),GETDATE()) + END IF + ELSE + PRINT COLUMN 84, t_variacion using "###,###,##&.&&" + LET t_variacion = t_variacion * -1 + LET credito = credito + t_variacion + IF afecta = "S" THEN + INSERT INTO cgtb00004 + (fecha + ,tipo + ,ref + ,cuenta_no + ,detalle_1 + ,debito + ,credito + ,us_crea + ,fech_crea + + ) + VALUES (fecha2,1,entrada,"5501",detalle1, + 0,t_variacion,SUSER_SNAME(),GETDATE()) + END IF + END IF +# Impresion detalle de la entrada con ordenes de compras + FOR i = 1 TO idx + IF entrada27[i].cod_aux is not null THEN + + IF entrada27[i].valor < 0 THEN + LET entrada27[i].valor = entrada27[i].valor * -1 + END IF + + PRINT COLUMN 4, entrada27[i].cuenta_no, + COLUMN 17, entrada27[i].cod_aux using "&&","-", + entrada27[i].cod_sec using "&&&&", + COLUMN 26, entrada27[i].num_doc using "&&&&&&", + COLUMN 84, entrada27[i].valor using "###,###,##&.&&" + IF entrada27[i].valor is not null THEN + LET credito = credito + entrada27[i].valor + END IF + END IF + + IF afecta = "S" THEN + INSERT INTO cgtb00004 + (fecha + ,tipo + ,ref + ,cuenta_no + ,num_doc + ,cod_aux + ,cod_sec + ,detalle_1 + ,debito + ,credito + ,us_crea + ,fech_crea + + ) + VALUES (fecha2,1,entrada,entrada27[i].cuenta_no, + entrada27[i].num_doc,entrada27[i].cod_aux, + entrada27[i].cod_sec,detalle1,0,entrada27[i].valor,SUSER_SNAME(),GETDATE()) + END IF + END FOR + +###### Imprime total DEBITO y total CREDITO + SKIP 1 LINE + PRINT COLUMN 1,negrillas_on + PRINT COLUMN 66,"--------------", + COLUMN 84,"--------------" + PRINT COLUMN 35,"Totales-->", + COLUMN 66,debito USING "###,###,##&.&&", + COLUMN 84,credito USING "###,###,##&.&&",negrillas_off + LET debito = 0 + LET credito = 0 + SKIP 2 LINE + PRINT COLUMN 1, detalle1 + PRINT COLUMN 1,comp_off,negrillas_off + SKIP 4 LINE +END REPORT diff --git a/PROYECTO/lqdir/lqprrp009.rdd.bak_20261012 b/PROYECTO/lqdir/lqprrp009.rdd.bak_20261012 new file mode 100644 index 0000000..ad6b245 --- /dev/null +++ b/PROYECTO/lqdir/lqprrp009.rdd.bak_20261012 @@ -0,0 +1,1969 @@ +S^1^0^M^lqprrp009^MODULE^^ +S^2^1^R^entrada641^^^public +F^0^C:\Users\jsoto\OneDrive - MARMOTECH, S. A\Equipo Tecnologia\Fuentes\MARMOTECH\PROYECTO\lqdir\lqprrp009.4gl +D^2^819^1040^12^0^0 +X^2^c^812^21^0^finish +X^2^c^810^31^0^output +X^2^c^782^24^0^start +X^2^D^819^12^0^ +S^3^2^P^x^RECORD^^ +D^3^821^824^8^0^0 +X^3^r^933^48^0^ +X^3^r^933^27^0^ +X^3^r^918^32^0^ +X^3^r^917^28^0^ +X^3^r^915^28^0^ +X^3^l^819^23^0^ +X^3^D^821^8^0^ +S^4^3^P^cuenta_no^CHAR(8)^^ +D^4^822^822^8^0^0 +X^4^D^822^8^0^ +S^5^3^P^debito^DECIMAL(10,2)^^ +D^5^823^823^8^0^0 +X^5^D^823^8^0^ +S^6^2^P^fecha1^DATE^^ +D^6^833^833^12^0^0 +X^6^l^819^25^0^ +X^6^D^833^12^0^ +S^7^2^P^fecha2^DATE^^ +D^7^833^833^19^0^0 +X^7^r^1020^23^0^ +X^7^r^982^25^0^ +X^7^r^962^24^0^ +X^7^r^933^10^0^ +X^7^l^819^32^0^ +X^7^D^833^19^0^ +S^8^2^P^detalle1^CHAR(30)^^ +D^8^828^828^12^0^0 +X^8^r^1037^27^0^ +X^8^r^1022^44^0^ +X^8^r^982^49^0^ +X^8^r^962^48^0^ +X^8^r^933^39^0^ +X^8^l^819^39^0^ +X^8^D^828^12^0^ +S^9^2^P^entrada^CHAR(14)^^ +D^9^848^848^12^0^0 +X^9^r^1020^32^0^ +X^9^r^982^34^0^ +X^9^r^962^33^0^ +X^9^r^933^19^0^ +X^9^r^886^38^0^ +X^9^l^819^48^0^ +X^9^D^848^12^0^ +S^10^2^V^debito^DECIMAL(12,2)^^ +D^10^827^827^12^0^0 +X^10^l^1034^14^0^ +X^10^r^1032^26^0^ +X^10^r^948^26^0^ +X^10^l^948^17^0^ +X^10^r^918^23^0^ +X^10^l^918^14^0^ +X^10^l^912^17^0^ +X^10^r^911^13^0^ +X^10^D^827^12^0^ +S^11^2^V^credito^DECIMAL(12,2)^^ +D^11^827^827^19^0^0 +X^11^l^1035^14^0^ +X^11^r^1033^26^0^ +X^11^r^1000^32^0^ +X^11^l^1000^22^0^ +X^11^r^968^28^0^ +X^11^l^968^18^0^ +X^11^l^940^11^0^ +X^11^r^939^7^0^ +X^11^D^827^19^0^ +S^12^2^V^mano_obra^DECIMAL(12,2)^^ +D^12^829^829^12^0^0 +X^12^D^829^12^0^ +S^13^2^V^sueldo_ind^DECIMAL(12,2)^^ +D^13^829^829^22^0^0 +X^13^D^829^22^0^ +S^14^2^V^monto_banco^DECIMAL(12,2)^^ +D^14^829^829^33^0^0 +X^14^D^829^33^0^ +S^15^2^V^total1^DECIMAL(12,2)^^ +D^15^830^830^12^0^0 +X^15^D^830^12^0^ +S^16^2^V^total2^DECIMAL(12,2)^^ +D^16^830^830^19^0^0 +X^16^D^830^19^0^ +S^17^2^V^total3^DECIMAL(12,2)^^ +D^17^830^830^26^0^0 +X^17^D^830^26^0^ +S^18^2^V^total4^DECIMAL(12,2)^^ +D^18^830^830^33^0^0 +X^18^D^830^33^0^ +S^19^2^V^total5^DECIMAL(12,2)^^ +D^19^830^830^40^0^0 +X^19^D^830^40^0^ +S^20^2^V^total6^DECIMAL(12,2)^^ +D^20^830^830^47^0^0 +X^20^D^830^47^0^ +S^21^2^V^total7^DECIMAL(12,2)^^ +D^21^831^831^12^0^0 +X^21^D^831^12^0^ +S^22^2^V^total8^DECIMAL(12,2)^^ +D^22^831^831^19^0^0 +X^22^D^831^19^0^ +S^23^2^V^tasa1^DECIMAL(5,2)^^ +D^23^832^832^12^0^0 +X^23^D^832^12^0^ +S^24^2^V^nomina^CHAR(1)^^ +D^24^834^834^12^0^0 +X^24^D^834^12^0^ +S^25^2^V^doble_on^CHAR(2)^^ +D^25^835^835^12^0^0 +X^25^r^886^29^0^ +X^25^D^835^12^0^ +S^26^2^V^doble_off^CHAR(2)^^ +D^26^836^836^12^0^0 +X^26^D^836^12^0^ +S^27^2^V^negrillas_on^CHAR(6)^^ +D^27^837^837^12^0^0 +X^27^r^1028^25^0^ +X^27^r^895^21^0^ +X^27^D^837^12^0^ +S^28^2^V^negrillas_off^CHAR(6)^^ +D^28^838^838^12^0^0 +X^28^r^1038^34^0^ +X^28^r^1033^57^0^ +X^28^r^908^21^0^ +X^28^r^903^40^0^ +X^28^D^838^12^0^ +S^29^2^V^comp_on^CHAR(2)^^ +D^29^839^839^12^0^0 +X^29^r^870^51^0^ +X^29^D^839^12^0^ +S^30^2^V^comp_off^CHAR(2)^^ +D^30^840^840^12^0^0 +X^30^r^1038^25^0^ +X^30^r^870^42^0^ +X^30^D^840^12^0^ +S^31^2^V^doce^CHAR(2)^^ +D^31^841^841^12^0^0 +X^31^r^891^18^0^ +X^31^r^870^37^0^ +X^31^D^841^12^0^ +S^32^2^V^normal^CHAR(2)^^ +D^32^842^842^12^0^0 +X^32^r^870^30^0^ +X^32^D^842^12^0^ +S^33^2^V^normall^CHAR(3)^^ +D^33^843^843^12^0^0 +X^33^D^843^12^0^ +S^34^2^V^comprimido^CHAR(3)^^ +D^34^844^844^12^0^0 +X^34^D^844^12^0^ +S^35^2^V^hora^CHAR(5)^^ +D^35^845^845^12^0^0 +X^35^r^878^29^0^ +X^35^l^865^13^0^ +X^35^D^845^12^0^ +S^36^2^V^dpto^INTEGER^^ +D^36^846^846^12^0^0 +X^36^D^846^12^0^ +S^37^2^V^nomina1^CHAR(24)^^ +D^37^847^847^12^0^0 +X^37^D^847^12^0^ +S^38^2^V^reportDef^base.Report^^ +D^38^0^0^0^0^0 +S^39^1^F^entrada0271^^^public +D^39^666^814^10^0^0 +X^39^c^251^10^0^ +X^39^D^666^10^0^ +S^40^39^V^longitud^SMALLINT^^ +D^40^667^667^10^0^0 +X^40^r^718^15^0^ +X^40^l^717^16^0^ +X^40^D^667^10^0^ +S^41^39^V^u_mes^SMALLINT^^ +D^41^667^667^19^0^0 +X^41^r^704^23^0^ +X^41^l^700^32^0^ +X^41^D^667^19^0^ +S^42^39^V^ultimo^SMALLINT^^ +D^42^667^667^25^0^0 +X^42^r^712^47^0^ +X^42^D^667^25^0^ +S^43^39^V^numero_ent^SMALLINT^^ +D^43^667^667^32^0^0 +X^43^r^697^28^0^ +X^43^l^692^15^0^ +X^43^D^667^32^0^ +S^44^39^V^ch_ano^CHAR(4)^^ +D^44^668^668^12^0^0 +X^44^r^704^40^0^ +X^44^l^698^15^0^ +X^44^D^668^12^0^ +S^45^39^V^tiempo^CHAR(4)^^ +D^45^668^668^19^0^0 +X^45^r^713^29^0^ +X^45^l^704^14^0^ +X^45^D^668^19^0^ +S^46^1^R^liquida7^^^public +D^46^256^656^8^0^0 +X^46^c^242^16^0^finish +X^46^c^239^23^0^output +X^46^c^155^42^0^start +X^46^D^256^8^0^ +S^47^46^P^x^RECORD^^ +D^47^257^279^10^0^0 +X^47^r^621^36^0^ +X^47^r^620^36^0^ +X^47^r^619^36^0^ +X^47^r^613^36^0^ +X^47^r^612^36^0^ +X^47^r^611^36^0^ +X^47^r^605^36^0^ +X^47^r^604^36^0^ +X^47^r^603^36^0^ +X^47^r^598^36^0^ +X^47^r^597^36^0^ +X^47^r^596^36^0^ +X^47^l^591^17^0^ +X^47^r^586^38^0^ +X^47^r^582^41^0^ +X^47^r^581^38^0^ +X^47^r^578^37^0^ +X^47^r^573^36^0^ +X^47^r^572^36^0^ +X^47^r^568^30^0^ +X^47^r^564^36^0^ +X^47^r^563^30^0^ +X^47^r^560^28^0^ +X^47^r^556^83^0^ +X^47^r^556^22^0^ +X^47^r^556^12^0^ +X^47^r^555^67^0^ +X^47^r^555^55^0^ +X^47^r^555^47^0^ +X^47^r^555^38^0^ +X^47^r^547^12^0^ +X^47^r^546^52^0^ +X^47^r^546^25^0^ +X^47^r^546^12^0^ +X^47^r^545^55^0^ +X^47^r^545^44^0^ +X^47^r^545^35^0^ +X^47^r^545^25^0^ +X^47^r^545^12^0^ +X^47^r^544^71^0^ +X^47^r^544^61^0^ +X^47^r^544^50^0^ +X^47^r^544^38^0^ +X^47^r^544^30^0^ +X^47^r^541^83^0^ +X^47^r^541^22^0^ +X^47^r^541^12^0^ +X^47^r^540^67^0^ +X^47^r^540^55^0^ +X^47^r^540^47^0^ +X^47^r^540^38^0^ +X^47^r^529^69^0^ +X^47^r^529^58^0^ +X^47^r^529^46^0^ +X^47^r^529^38^0^ +X^47^r^524^26^0^ +X^47^r^523^27^0^ +X^47^r^522^50^0^ +X^47^r^522^24^0^ +X^47^r^516^19^0^ +X^47^r^514^19^0^ +X^47^r^511^19^0^ +X^47^r^510^19^0^ +X^47^r^507^19^0^ +X^47^r^505^19^0^ +X^47^r^498^19^0^ +X^47^r^496^19^0^ +X^47^r^493^19^0^ +X^47^r^492^19^0^ +X^47^r^489^19^0^ +X^47^r^487^19^0^ +X^47^r^482^56^0^ +X^47^r^482^29^0^ +X^47^r^480^51^0^ +X^47^r^480^27^0^ +X^47^r^478^50^0^ +X^47^r^478^32^0^ +X^47^r^477^57^0^ +X^47^r^477^28^0^ +X^47^r^476^59^0^ +X^47^r^476^33^0^ +X^47^r^473^41^0^ +X^47^r^473^28^0^ +X^47^r^472^38^0^ +X^47^r^471^55^0^ +X^47^r^471^40^0^ +X^47^l^468^18^0^ +X^47^l^467^18^0^ +X^47^r^465^14^0^ +X^47^r^460^29^0^ +X^47^r^458^27^0^ +X^47^r^453^21^0^ +X^47^l^452^31^0^ +X^47^l^429^17^0^ +X^47^r^419^48^0^ +X^47^r^419^24^0^ +X^47^l^415^20^0^ +X^47^l^256^17^0^ +X^47^D^257^10^0^ +S^48^47^P^cod_n^SMALLINT^^ +D^48^258^258^10^0^0 +X^48^D^258^10^0^ +S^49^47^P^cod_grupo^SMALLINT^^ +D^49^259^259^10^0^0 +X^49^D^259^10^0^ +S^50^47^P^cod_tipo^SMALLINT^^ +D^50^260^260^10^0^0 +X^50^D^260^10^0^ +S^51^47^P^cod_sec^SMALLINT^^ +D^51^261^261^10^0^0 +X^51^D^261^10^0^ +S^52^47^P^descripcion^VARCHAR(100)^^ +D^52^262^262^10^0^0 +X^52^D^262^10^0^ +S^53^47^P^unidad^CHAR(3)^^ +D^53^263^263^10^0^0 +X^53^D^263^10^0^ +S^54^47^P^cod_sp^SMALLINT^^ +D^54^264^264^10^0^0 +X^54^D^264^10^0^ +S^55^47^P^cod_sp_sec^SMALLINT^^ +D^55^265^265^10^0^0 +X^55^D^265^10^0^ +S^56^47^P^entrada^INTEGER^^ +D^56^266^266^10^0^0 +X^56^D^266^10^0^ +S^57^47^P^num_doc^INTEGER^^ +D^57^267^267^10^0^0 +X^57^D^267^10^0^ +S^58^47^P^num_oc^INTEGER^^ +D^58^268^268^10^0^0 +X^58^D^268^10^0^ +S^59^47^P^tipo^CHAR(10)^^ +D^59^269^269^10^0^0 +X^59^D^269^10^0^ +S^60^47^P^cantidad^DECIMAL(12,2)^^ +D^60^270^270^10^0^0 +X^60^D^270^10^0^ +S^61^47^P^precio^DECIMAL(12,2)^^ +D^61^271^271^10^0^0 +X^61^D^271^10^0^ +S^62^47^P^flete^DECIMAL(12,2)^^ +D^62^272^272^10^0^0 +X^62^D^272^10^0^ +S^63^47^P^tasa^DECIMAL(8,2)^^ +D^63^273^273^10^0^0 +X^63^D^273^10^0^ +S^64^47^P^mercado^CHAR(10)^^ +D^64^274^274^10^0^0 +X^64^D^274^10^0^ +S^65^47^P^imp_colect^DECIMAL(12,2)^^ +D^65^275^275^10^0^0 +X^65^D^275^10^0^ +S^66^47^P^imp_aduana^DECIMAL(12,2)^^ +D^66^276^276^10^0^0 +X^66^D^276^10^0^ +S^67^47^P^cost_std^DECIMAL(12,3)^^ +D^67^277^277^10^0^0 +X^67^D^277^10^0^ +S^68^47^P^clave^CHAR(10)^^ +D^68^278^278^10^0^0 +X^68^D^278^10^0^ +S^69^46^V^n_reg^SMALLINT^^ +D^69^281^281^11^0^0 +X^69^l^417^61^0^ +X^69^D^281^11^0^ +S^70^46^V^fecha1^DATE^^ +D^70^283^283^11^0^0 +X^70^D^283^11^0^ +S^71^46^V^fecha2^DATE^^ +D^71^283^283^18^0^0 +X^71^D^283^18^0^ +S^72^46^V^variacion^DECIMAL(12,2)^^ +D^72^284^299^11^0^0 +X^72^r^588^41^0^ +X^72^r^570^36^0^ +X^72^r^518^19^0^ +X^72^r^500^19^0^ +X^72^l^474^15^0^ +X^72^D^284^11^0^ +S^73^46^V^precio_std^DECIMAL(12,2)^^ +D^73^284^299^21^0^0 +X^73^r^587^38^0^ +X^73^r^569^30^0^ +X^73^r^547^23^0^ +X^73^r^517^19^0^ +X^73^r^499^19^0^ +X^73^r^474^37^0^ +X^73^l^473^15^0^ +X^73^D^284^21^0^ +S^74^46^V^fob^DECIMAL(12,2)^^ +D^74^284^299^32^0^0 +X^74^r^577^35^0^ +X^74^r^559^24^0^ +X^74^r^545^51^0^ +X^74^r^506^19^0^ +X^74^r^488^19^0^ +X^74^r^458^21^0^ +X^74^l^453^15^0^ +X^74^D^284^32^0^ +S^75^46^V^c_f^DECIMAL(12,2)^^ +D^75^284^299^36^0^0 +X^75^r^579^34^0^ +X^75^r^575^23^0^ +X^75^r^562^22^0^ +X^75^r^545^63^0^ +X^75^r^508^19^0^ +X^75^r^490^19^0^ +X^75^r^471^34^0^ +X^75^r^460^23^0^ +X^75^l^458^15^0^ +X^75^D^284^36^0^ +S^76^46^V^seguro^DECIMAL(12,2)^^ +D^76^284^299^40^0^0 +X^76^r^580^38^0^ +X^76^r^572^51^0^ +X^76^r^561^30^0^ +X^76^r^545^67^0^ +X^76^r^509^19^0^ +X^76^r^491^19^0^ +X^76^r^471^25^0^ +X^76^l^466^18^0^ +X^76^l^455^15^0^ +X^76^D^284^40^0^ +S^77^46^V^cost_pl^DECIMAL(12,2)^^ +D^77^284^299^47^0^0 +X^77^r^584^39^0^ +X^77^r^571^36^0^ +X^77^r^566^32^0^ +X^77^r^546^44^0^ +X^77^r^513^19^0^ +X^77^r^495^19^0^ +X^77^r^474^27^0^ +X^77^r^472^28^0^ +X^77^l^471^15^0^ +X^77^D^284^47^0^ +S^78^46^V^valor^DECIMAL(12,2)^^ +D^78^284^299^55^0^0 +X^78^r^583^38^0^ +X^78^r^574^30^0^ +X^78^r^565^30^0^ +X^78^r^546^38^0^ +X^78^r^512^19^0^ +X^78^r^494^19^0^ +X^78^r^471^70^0^ +X^78^l^469^18^0^ +X^78^l^460^15^0^ +X^78^D^284^55^0^ +S^79^46^V^t_fob^DECIMAL(12,2)^^ +D^79^284^299^61^0^0 +X^79^r^644^14^0^ +X^79^r^559^16^0^ +X^79^l^559^8^0^ +X^79^l^393^14^0^ +X^79^D^284^61^0^ +S^80^46^V^t_flete^DECIMAL(12,2)^^ +D^80^284^299^67^0^0 +X^80^r^645^14^0^ +X^80^r^560^18^0^ +X^80^l^560^8^0^ +X^80^l^394^14^0^ +X^80^D^284^67^0^ +S^81^46^V^t_seguro^DECIMAL(12,2)^^ +D^81^285^299^11^0^0 +X^81^r^647^14^0^ +X^81^r^561^19^0^ +X^81^l^561^8^0^ +X^81^l^395^14^0^ +X^81^D^285^11^0^ +S^82^46^V^t_cf^DECIMAL(12,2)^^ +D^82^285^299^20^0^0 +X^82^r^646^14^0^ +X^82^r^562^15^0^ +X^82^l^562^8^0^ +X^82^l^396^14^0^ +X^82^D^285^20^0^ +S^83^46^V^t_impcol^DECIMAL(12,2)^^ +D^83^285^299^25^0^0 +X^83^r^648^14^0^ +X^83^r^563^19^0^ +X^83^l^563^8^0^ +X^83^l^397^14^0^ +X^83^D^285^25^0^ +S^84^46^V^t_impaduana^DECIMAL(12,2)^^ +D^84^285^299^34^0^0 +X^84^r^649^14^0^ +X^84^r^564^22^0^ +X^84^l^564^8^0^ +X^84^l^398^14^0^ +X^84^D^285^34^0^ +S^85^46^V^t_dollar^DECIMAL(12,2)^^ +D^85^285^299^46^0^0 +X^85^r^650^14^0^ +X^85^r^565^19^0^ +X^85^l^565^8^0^ +X^85^l^399^14^0^ +X^85^D^285^46^0^ +S^86^46^V^t_costopl^DECIMAL(12,2)^^ +D^86^285^299^55^0^0 +X^86^r^651^14^0^ +X^86^r^566^20^0^ +X^86^l^566^8^0^ +X^86^l^400^14^0^ +X^86^D^285^55^0^ +S^87^46^V^t_recibida^DECIMAL(12,2)^^ +D^87^285^299^65^0^0 +X^87^l^401^14^0^ +X^87^D^285^65^0^ +S^88^46^V^t_precio^DECIMAL(12,2)^^ +D^88^286^299^11^0^0 +X^88^r^653^14^0^ +X^88^r^568^19^0^ +X^88^l^568^8^0^ +X^88^l^403^14^0^ +X^88^D^286^11^0^ +S^89^46^V^o_variacion^DECIMAL(12,2)^^ +D^89^286^299^20^0^0 +X^89^r^571^22^0^ +X^89^l^571^8^0^ +X^89^l^406^14^0^ +X^89^D^286^20^0^ +S^90^46^V^total_cf^DECIMAL(12,2)^^ +D^90^286^299^32^0^0 +X^90^l^425^13^0^ +X^90^r^424^9^0^ +X^90^l^417^52^0^ +X^90^D^286^32^0^ +S^91^46^V^o_impaduana^DECIMAL(12,2)^^ +D^91^286^299^41^0^0 +X^91^l^600^11^0^ +X^91^r^599^34^0^ +X^91^r^572^22^0^ +X^91^l^572^8^0^ +X^91^l^407^14^0^ +X^91^D^286^41^0^ +S^92^46^V^o_impcolect^DECIMAL(12,2)^^ +D^92^286^299^53^0^0 +X^92^l^607^11^0^ +X^92^r^606^34^0^ +X^92^r^573^22^0^ +X^92^l^573^8^0^ +X^92^l^408^14^0^ +X^92^D^286^53^0^ +S^93^46^V^o_dollar^DECIMAL(12,2)^^ +D^93^286^299^65^0^0 +X^93^l^615^11^0^ +X^93^r^614^34^0^ +X^93^r^574^19^0^ +X^93^l^574^8^0^ +X^93^l^409^14^0^ +X^93^D^286^65^0^ +S^94^46^V^o_cf^DECIMAL(12,2)^^ +D^94^286^299^74^0^0 +X^94^l^623^11^0^ +X^94^r^622^34^0^ +X^94^r^575^16^0^ +X^94^l^575^8^0^ +X^94^l^410^14^0^ +X^94^D^286^74^0^ +S^95^46^V^balan_act^DECIMAL(12,2)^^ +D^95^287^299^11^0^0 +X^95^D^287^11^0^ +S^96^46^V^ot_fob^DECIMAL(12,2)^^ +D^96^288^299^11^0^0 +X^96^r^627^14^0^ +X^96^r^577^26^0^ +X^96^l^577^11^0^ +X^96^l^430^10^0^ +X^96^D^288^11^0^ +S^97^46^V^ot_flete^DECIMAL(12,2)^^ +D^97^289^299^11^0^0 +X^97^r^628^14^0^ +X^97^r^578^26^0^ +X^97^l^578^11^0^ +X^97^l^431^15^0^ +X^97^D^289^11^0^ +S^98^46^V^ot_cf^DECIMAL(12,2)^^ +D^98^290^299^12^0^0 +X^98^r^629^14^0^ +X^98^r^579^26^0^ +X^98^l^579^11^0^ +X^98^l^432^15^0^ +X^98^D^290^12^0^ +S^99^46^V^ot_seguro^DECIMAL(12,2)^^ +D^99^291^299^12^0^0 +X^99^r^630^14^0^ +X^99^r^580^26^0^ +X^99^l^580^11^0^ +X^99^l^433^15^0^ +X^99^D^291^12^0^ +S^100^46^V^ot_impcol^DECIMAL(12,2)^^ +D^100^292^299^12^0^0 +X^100^r^631^14^0^ +X^100^r^581^26^0^ +X^100^l^581^11^0^ +X^100^l^434^15^0^ +X^100^D^292^12^0^ +S^101^46^V^ot_impaduana^DECIMAL(12,2)^^ +D^101^293^299^12^0^0 +X^101^r^632^14^0^ +X^101^r^582^26^0^ +X^101^l^582^11^0^ +X^101^l^435^15^0^ +X^101^D^293^12^0^ +S^102^46^V^ot_dollar^DECIMAL(12,2)^^ +D^102^294^299^12^0^0 +X^102^r^633^14^0^ +X^102^r^583^26^0^ +X^102^l^583^11^0^ +X^102^l^436^15^0^ +X^102^D^294^12^0^ +S^103^46^V^ot_costopl^DECIMAL(12,2)^^ +D^103^295^299^12^0^0 +X^103^r^634^14^0^ +X^103^r^584^26^0^ +X^103^l^584^11^0^ +X^103^l^437^15^0^ +X^103^D^295^12^0^ +S^104^46^V^ot_costo^DECIMAL(12,2)^^ +D^104^296^299^12^0^0 +X^104^r^635^14^0^ +X^104^r^585^26^0^ +X^104^l^585^11^0^ +X^104^l^438^15^0^ +X^104^D^296^12^0^ +S^105^46^V^ot_precio^DECIMAL(12,2)^^ +D^105^297^299^12^0^0 +X^105^r^636^14^0^ +X^105^r^586^26^0^ +X^105^l^586^11^0^ +X^105^l^439^15^0^ +X^105^D^297^12^0^ +S^106^46^V^ot_costst^DECIMAL(12,2)^^ +D^106^298^299^12^0^0 +X^106^r^637^14^0^ +X^106^r^587^26^0^ +X^106^l^587^11^0^ +X^106^l^440^15^0^ +X^106^D^298^12^0^ +S^107^46^V^ot_variacion^DECIMAL(12,2)^^ +D^107^299^299^12^0^0 +X^107^r^638^14^0^ +X^107^r^588^26^0^ +X^107^l^588^11^0^ +X^107^l^441^15^0^ +X^107^D^299^12^0^ +S^108^46^V^descrip1^CHAR(30)^^ +D^108^301^301^11^0^0 +X^108^D^301^11^0^ +S^109^46^V^t_costo^DECIMAL(12,4)^^ +D^109^302^302^11^0^0 +X^109^r^652^14^0^ +X^109^r^567^18^0^ +X^109^l^567^8^0^ +X^109^l^402^14^0^ +X^109^D^302^11^0^ +S^110^46^V^costo_unit^DECIMAL(12,4)^^ +D^110^302^302^20^0^0 +X^110^r^585^37^0^ +X^110^r^567^28^0^ +X^110^r^556^33^0^ +X^110^r^546^63^0^ +X^110^r^541^33^0^ +X^110^r^530^22^0^ +X^110^r^515^19^0^ +X^110^r^497^19^0^ +X^110^l^472^15^0^ +X^110^D^302^20^0^ +S^111^46^V^p_cuenta^CHAR(8)^^ +D^111^303^303^11^0^0 +X^111^D^303^11^0^ +S^112^46^V^otras_cta^CHAR(8)^^ +D^112^304^304^11^0^0 +X^112^D^304^11^0^ +S^113^46^V^tituloFecha^VARCHAR(250)^^ +D^113^305^305^11^0^0 +X^113^r^331^41^0^ +X^113^l^327^13^0^ +X^113^D^305^11^0^ +S^114^46^V^producto_codigo^VARCHAR(250)^^ +D^114^305^305^24^0^0 +X^114^r^502^19^0^ +X^114^r^484^19^0^ +X^114^l^476^15^0^ +X^114^D^305^24^0^ +S^115^46^V^proveedor^VARCHAR(250)^^ +D^115^305^305^40^0^0 +X^115^r^503^19^0^ +X^115^r^485^19^0^ +X^115^l^480^15^0^ +X^115^D^305^40^0^ +S^116^46^V^orden_tipo^VARCHAR(250)^^ +D^116^305^305^50^0^0 +X^116^r^504^19^0^ +X^116^r^486^19^0^ +X^116^l^482^15^0^ +X^116^D^305^50^0^ +S^117^46^V^doble_on^CHAR(2)^^ +D^117^308^308^12^0^0 +X^117^D^308^12^0^ +S^118^46^V^doble_off^CHAR(2)^^ +D^118^309^309^12^0^0 +X^118^D^309^12^0^ +S^119^46^V^negrillas_on^CHAR(2)^^ +D^119^310^310^12^0^0 +X^119^D^310^12^0^ +S^120^46^V^negrillas_off^CHAR(2)^^ +D^120^311^311^12^0^0 +X^120^D^311^12^0^ +S^121^46^V^comp_on^CHAR(2)^^ +D^121^312^312^12^0^0 +X^121^D^312^12^0^ +S^122^46^V^comp_off^CHAR(2)^^ +D^122^313^313^12^0^0 +X^122^D^313^12^0^ +S^123^46^V^doce^CHAR(2)^^ +D^123^314^314^12^0^0 +X^123^D^314^12^0^ +S^124^46^V^normal^CHAR(2)^^ +D^124^315^315^12^0^0 +X^124^D^315^12^0^ +S^125^46^V^hora^CHAR(5)^^ +D^125^316^316^12^0^0 +X^125^r^331^35^0^ +X^125^l^326^13^0^ +X^125^D^316^12^0^ +S^126^46^V^reportDef^base.Report^^ +D^126^0^0^0^0^0 +S^127^1^F^lqprrp009^^^public +D^127^51^254^12^0^0 +X^127^c^48^7^0^ +X^127^D^51^12^0^ +S^128^127^V^busca_datos^RECORD^^ +D^128^53^75^10^0^0 +X^128^r^239^32^0^ +X^128^r^238^62^0^ +X^128^r^238^30^0^ +X^128^l^238^10^0^ +X^128^l^236^13^0^ +X^128^r^235^9^0^ +X^128^r^233^24^0^ +X^128^r^231^61^0^ +X^128^r^231^24^0^ +X^128^r^230^40^0^ +X^128^l^229^29^0^ +X^128^l^228^10^0^ +X^128^r^225^38^0^ +X^128^l^225^13^0^ +X^128^r^224^9^0^ +X^128^r^221^38^0^ +X^128^l^221^13^0^ +X^128^r^220^9^0^ +X^128^l^217^13^0^ +X^128^r^216^9^0^ +X^128^r^195^38^0^ +X^128^l^195^13^0^ +X^128^r^194^9^0^ +X^128^l^191^13^0^ +X^128^r^190^9^0^ +X^128^r^182^18^0^ +X^128^r^181^21^0^ +X^128^D^53^10^0^ +S^129^128^V^cod_n^SMALLINT^^ +D^129^54^54^10^0^0 +X^129^D^54^10^0^ +S^130^128^V^cod_grupo^SMALLINT^^ +D^130^55^55^10^0^0 +X^130^D^55^10^0^ +S^131^128^V^cod_tipo^SMALLINT^^ +D^131^56^56^10^0^0 +X^131^D^56^10^0^ +S^132^128^V^cod_sec^SMALLINT^^ +D^132^57^57^10^0^0 +X^132^D^57^10^0^ +S^133^128^V^descripcion^CHAR(30)^^ +D^133^58^58^10^0^0 +X^133^D^58^10^0^ +S^134^128^V^unidad^CHAR(3)^^ +D^134^59^59^10^0^0 +X^134^D^59^10^0^ +S^135^128^V^cod_sp^SMALLINT^^ +D^135^60^60^10^0^0 +X^135^D^60^10^0^ +S^136^128^V^cod_sp_sec^SMALLINT^^ +D^136^61^61^10^0^0 +X^136^D^61^10^0^ +S^137^128^V^entrada^INTEGER^^ +D^137^62^62^10^0^0 +X^137^D^62^10^0^ +S^138^128^V^num_doc^INTEGER^^ +D^138^63^63^10^0^0 +X^138^D^63^10^0^ +S^139^128^V^num_oc^INTEGER^^ +D^139^64^64^10^0^0 +X^139^D^64^10^0^ +S^140^128^V^tipo^CHAR(2)^^ +D^140^65^65^10^0^0 +X^140^D^65^10^0^ +S^141^128^V^cantidad^DECIMAL(12,2)^^ +D^141^66^66^10^0^0 +X^141^D^66^10^0^ +S^142^128^V^precio^DECIMAL(12,2)^^ +D^142^67^67^10^0^0 +X^142^D^67^10^0^ +S^143^128^V^flete^DECIMAL(12,2)^^ +D^143^68^68^10^0^0 +X^143^D^68^10^0^ +S^144^128^V^tasa^DECIMAL(8,2)^^ +D^144^69^69^10^0^0 +X^144^D^69^10^0^ +S^145^128^V^mercado^CHAR(1)^^ +D^145^70^70^10^0^0 +X^145^D^70^10^0^ +S^146^128^V^imp_colect^DECIMAL(12,2)^^ +D^146^71^71^10^0^0 +X^146^D^71^10^0^ +S^147^128^V^imp_aduana^DECIMAL(12,2)^^ +D^147^72^72^10^0^0 +X^147^D^72^10^0^ +S^148^128^V^cost_std^DECIMAL(12,3)^^ +D^148^73^73^10^0^0 +X^148^D^73^10^0^ +S^149^128^V^clave^CHAR(6)^^ +D^149^74^74^10^0^0 +X^149^D^74^10^0^ +S^150^1^F^main^^^public +D^150^40^49^1^0^0 +X^150^D^40^1^0^ +S^151^1^V^elije^CHAR(1)^^private +D^151^16^16^8^0^0 +X^151^r^555^32^0^ +X^151^r^544^24^0^ +X^151^r^540^32^0^ +X^151^r^183^5^0^ +X^151^r^175^56^0^ +X^151^r^163^67^0^ +X^151^r^120^9^0^ +X^151^l^90^30^0^ +X^151^D^16^8^0^ +S^152^1^V^imp^CHAR(1)^^private +D^152^16^16^14^0^0 +X^152^l^90^48^0^ +X^152^D^16^14^0^ +S^153^1^V^afecta^CHAR(1)^^private +D^153^16^16^18^0^0 +X^153^r^1004^15^0^ +X^153^r^969^17^0^ +X^153^r^949^16^0^ +X^153^r^920^5^0^ +X^153^l^690^37^0^ +X^153^D^16^18^0^ +S^154^1^V^m_mes^SMALLINT^^private +D^154^17^17^8^0^0 +X^154^r^544^18^0^ +X^154^r^162^36^0^ +X^154^r^108^23^0^ +X^154^r^105^35^0^ +X^154^r^99^8^0^ +X^154^l^90^24^0^ +X^154^D^17^8^0^ +S^155^1^V^mes^SMALLINT^^private +D^155^17^17^14^0^0 +X^155^r^700^22^0^ +X^155^r^162^30^0^ +X^155^D^17^14^0^ +S^156^1^V^chequea_ent^CHAR(4)^^private +D^156^18^18^8^0^0 +X^156^r^109^35^0^ +X^156^l^108^9^0^ +X^156^D^18^8^0^ +S^157^1^V^p_ano^CHAR(4)^^private +D^157^18^18^20^0^0 +X^157^r^701^23^0^ +X^157^r^544^12^0^ +X^157^r^529^32^0^ +X^157^r^525^22^0^ +X^157^r^230^20^0^ +X^157^r^162^52^0^ +X^157^r^108^40^0^ +X^157^r^105^53^0^ +X^157^r^93^8^0^ +X^157^l^90^18^0^ +X^157^D^18^20^0^ +S^158^1^V^detalla^CHAR(30)^^private +D^158^19^19^8^0^0 +X^158^r^810^66^0^ +X^158^l^690^44^0^ +X^158^D^19^8^0^ +S^159^1^V^no_entrada^CHAR(14)^^private +D^159^20^20^8^0^0 +X^159^r^121^60^0^ +X^159^l^109^9^0^ +X^159^D^20^8^0^ +S^160^1^V^fecha1^DATE^^private +D^160^21^21^8^0^0 +X^160^r^810^52^0^ +X^160^r^794^24^0^ +X^160^r^755^13^0^ +X^160^r^745^13^0^ +X^160^r^740^14^0^ +X^160^l^737^28^0^ +X^160^l^735^16^0^ +X^160^r^701^49^0^ +X^160^r^698^29^0^ +X^160^l^695^27^0^ +X^160^l^693^15^0^ +X^160^l^690^23^0^ +X^160^D^21^8^0^ +S^161^1^V^fecha2^DATE^^private +D^161^21^21^16^0^0 +X^161^r^810^59^0^ +X^161^r^794^35^0^ +X^161^r^755^22^0^ +X^161^r^750^13^0^ +X^161^r^702^31^0^ +X^161^l^695^34^0^ +X^161^l^694^15^0^ +X^161^l^690^30^0^ +X^161^D^21^16^0^ +S^162^1^V^p_fecha^CHAR(10)^^private +D^162^21^21^30^0^0 +X^162^r^745^23^0^ +X^162^r^735^25^0^ +X^162^l^733^65^0^ +X^162^r^555^24^0^ +X^162^r^540^24^0^ +X^162^l^452^47^0^ +X^162^D^21^30^0^ +S^163^1^V^entra^CHAR(14)^^private +D^163^22^22^8^0^0 +X^163^r^810^74^0^ +X^163^r^730^26^0^ +X^163^r^723^61^0^ +X^163^r^717^34^0^ +X^163^l^714^27^0^ +X^163^r^712^29^0^ +X^163^l^712^21^0^ +X^163^l^697^14^0^ +X^163^l^690^17^0^ +X^163^D^22^8^0^ +S^164^1^V^entra1^CHAR(5)^^private +D^164^23^23^8^0^0 +X^164^r^734^31^0^ +X^164^l^730^17^0^ +X^164^D^23^8^0^ +S^165^1^V^t_costst^DECIMAL(12,2)^^private +D^165^24^25^8^0^0 +X^165^r^809^35^0^ +X^165^r^654^14^0^ +X^165^r^569^19^0^ +X^165^l^569^8^0^ +X^165^l^404^14^0^ +X^165^D^24^8^0^ +S^166^1^V^p_fob^DECIMAL(12,2)^^private +D^166^24^25^17^0^0 +X^166^D^24^17^0^ +S^167^1^V^valor^DECIMAL(12,2)^^private +D^167^24^25^23^0^0 +X^167^D^24^23^0^ +S^168^1^V^mano_obra^DECIMAL(12,2)^^private +D^168^24^25^29^0^0 +X^168^D^24^29^0^ +S^169^1^V^sueldo_ind^DECIMAL(12,2)^^private +D^169^24^25^39^0^0 +X^169^D^24^39^0^ +S^170^1^V^monto_banco^DECIMAL(12,2)^^private +D^170^24^25^50^0^0 +X^170^D^24^50^0^ +S^171^1^V^interes^DECIMAL(12,2)^^private +D^171^25^25^8^0^0 +X^171^D^25^8^0^ +S^172^1^V^val_64^DECIMAL(12,2)^^private +D^172^25^25^16^0^0 +X^172^r^225^63^0^ +X^172^l^205^13^0^ +X^172^r^204^9^0^ +X^172^l^199^42^0^ +X^172^D^25^16^0^ +S^173^1^V^orden^CHAR(10)^^private +D^173^26^26^8^0^0 +X^173^r^202^26^0^ +X^173^l^182^10^0^ +X^173^D^26^8^0^ +S^174^1^V^t_variacion^DECIMAL(12,2)^^private +D^174^27^27^8^0^0 +X^174^r^983^27^0^ +X^174^r^968^38^0^ +X^174^r^967^32^0^ +X^174^l^967^18^0^ +X^174^r^966^32^0^ +X^174^r^963^24^0^ +X^174^r^948^35^0^ +X^174^r^947^30^0^ +X^174^r^946^13^0^ +X^174^r^655^14^0^ +X^174^r^570^22^0^ +X^174^l^570^8^0^ +X^174^l^405^14^0^ +X^174^D^27^8^0^ +S^175^1^V^diario1^RECORD^^private +D^175^30^33^8^0^0 +X^175^r^810^42^0^ +X^175^l^809^18^0^ +X^175^r^798^24^0^ +X^175^D^30^8^0^ +S^176^175^V^cuenta_no^CHAR(8)^^ +D^176^31^31^8^0^0 +X^176^D^31^8^0^ +S^177^175^V^debito^DECIMAL(10,2)^^ +D^177^32^32^8^0^0 +X^177^D^32^8^0^ +S^178^1^V^i^SMALLINT^^private +D^178^35^35^9^0^0 +X^178^r^1022^65^0^ +X^178^r^1022^33^0^ +X^178^r^1021^54^0^ +X^178^r^1021^33^0^ +X^178^r^1020^50^0^ +X^178^r^1000^52^0^ +X^178^r^999^28^0^ +X^178^r^998^43^0^ +X^178^r^997^43^0^ +X^178^r^996^43^0^ +X^178^r^995^43^0^ +X^178^r^994^43^0^ +X^178^r^991^53^0^ +X^178^l^991^32^0^ +X^178^r^990^28^0^ +X^178^r^988^25^0^ +X^178^l^987^12^0^ +X^178^D^35^9^0^ +S^179^1^V^fecha_inicial^DATE^^private +D^179^36^36^10^0^0 +X^179^r^879^36^0^ +X^179^r^693^23^0^ +X^179^r^420^29^0^ +X^179^r^327^34^0^ +X^179^r^200^29^0^ +X^179^r^176^24^0^ +X^179^l^107^21^0^ +X^179^l^104^96^0^ +X^179^D^36^10^0^ +S^180^1^V^fecha_final^DATE^^private +D^180^36^36^24^0^0 +X^180^r^880^37^0^ +X^180^r^694^23^0^ +X^180^r^555^12^0^ +X^180^r^540^12^0^ +X^180^r^420^47^0^ +X^180^r^328^37^0^ +X^180^r^200^47^0^ +X^180^r^176^42^0^ +X^180^r^163^41^0^ +X^180^r^112^20^0^ +X^180^l^107^35^0^ +X^180^l^104^110^0^ +X^180^D^36^24^0^ +S^181^1^V^tasa^DECIMAL(8,2)^^private +D^181^37^37^10^0^0 +X^181^D^37^10^0^ +S^182^1^V^primera^CHAR(1)^^private +D^182^38^38^10^0^0 +X^182^l^412^14^0^ +X^182^r^392^10^0^ +X^182^l^137^6^0^ +X^182^D^38^10^0^ +S^183^1^V^imp_entrada^CHAR(1)^^private +D^183^38^38^18^0^0 +X^183^r^594^7^0^ +X^183^r^250^5^0^ +X^183^l^90^36^0^ +X^183^D^38^18^0^ +S^184^1^V^salida^VARCHAR(4)^^private +D^184^38^38^39^0^0 +X^184^r^781^32^0^ +X^184^l^780^46^0^ +X^184^D^38^39^0^ +S^185^1^C^busca^base.SqlHandle^^private +D^185^167^167^10^0^0 +X^185^u^181^10^0^ +X^185^D^167^10^0^ +S^186^1^C^comando^base.SqlHandle^^private +D^186^451^451^17^0^0 +X^186^u^452^17^0^ +X^186^D^451^17^0^ +S^187^1^C^buscar^base.SqlHandle^^private +D^187^788^788^9^0^0 +X^187^u^798^12^0^ +X^187^u^796^7^0^ +X^187^D^788^9^0^ +S^188^0^V^status^INTEGER^^builtin +F^1^C:\Program Files\FourJs\Genero Studio\fgl\lib/fgl.4gl +D^188^15^15^9^1^1 +X^188^r^800^13^0^ +X^188^r^797^10^0^ +X^188^r^725^16^0^ +X^188^r^527^11^0^ +X^188^r^123^12^0^ +X^188^D^15^9^1^ +S^189^0^V^int_flag^INTEGER^^builtin +D^189^15^15^17^1^1 +X^189^l^806^17^0^ +X^189^r^804^13^0^ +X^189^l^765^14^0^ +X^189^r^763^10^0^ +X^189^l^134^9^0^ +X^189^r^131^5^0^ +X^189^l^77^7^0^ +X^189^D^15^17^1^ +S^190^0^V^opt4^CHAR(1)^^global +F^2^lqprgb000.4gl +D^190^5^6^10^2^2 +X^190^D^5^10^2^ +S^191^0^V^opt3^CHAR(1)^^global +D^191^5^6^15^2^2 +X^191^D^5^15^2^ +S^192^0^V^impresion^CHAR(1)^^global +D^192^5^6^20^2^2 +X^192^D^5^20^2^ +S^193^0^V^verdad^CHAR(1)^^global +D^193^5^6^30^2^2 +X^193^D^5^30^2^ +S^194^0^V^identifica^CHAR(1)^^global +D^194^5^6^37^2^2 +X^194^D^5^37^2^ +S^195^0^V^existe^CHAR(1)^^global +D^195^5^6^48^2^2 +X^195^l^746^17^0^ +X^195^D^5^48^2^ +S^196^0^V^tiene_facturas^CHAR(1)^^global +D^196^5^6^55^2^2 +X^196^D^5^55^2^ +S^197^0^V^opt^CHAR(1)^^global +D^197^6^6^10^2^2 +X^197^D^6^10^2^ +S^198^0^V^control^CHAR(1)^^global +D^198^6^6^14^2^2 +X^198^D^6^14^2^ +S^199^0^V^detalle^CHAR(1)^^global +D^199^6^6^22^2^2 +X^199^D^6^22^2^ +S^200^0^V^status_reg^CHAR(1)^^global +D^200^6^6^30^2^2 +X^200^D^6^30^2^ +S^201^0^V^chstd^CHAR(3)^^global +D^201^7^7^10^2^2 +X^201^r^520^8^0^ +X^201^l^90^52^0^ +X^201^D^7^10^2^ +S^202^0^V^criterio^CHAR(1000)^^global +D^202^8^8^10^2^2 +X^202^D^8^10^2^ +S^203^0^V^selec^CHAR(1000)^^global +D^203^9^9^10^2^2 +X^203^r^451^30^0^ +X^203^l^445^8^0^ +X^203^D^9^10^2^ +S^204^0^V^selec2^CHAR(500)^^global +D^204^10^10^10^2^2 +X^204^D^10^10^2^ +S^205^0^V^selec3^CHAR(1000)^^global +D^205^11^11^10^2^2 +X^205^D^11^10^2^ +S^206^0^V^tipo2^CHAR(2)^^global +D^206^12^12^10^2^2 +X^206^D^12^10^2^ +S^207^0^V^opcion^CHAR(2)^^global +D^207^12^12^16^2^2 +X^207^D^12^16^2^ +S^208^0^V^valor_letras^CHAR(90)^^global +D^208^13^13^10^2^2 +X^208^D^13^10^2^ +S^209^0^V^compania^CHAR(50)^^global +D^209^14^14^10^2^2 +X^209^D^14^10^2^ +S^210^0^V^parametro^CHAR(10)^^global +D^210^15^15^10^2^2 +X^210^D^15^10^2^ +S^211^0^V^numero_msg^INTEGER^^global +D^211^16^16^10^2^2 +X^211^r^720^24^0^ +X^211^l^719^19^0^ +X^211^r^133^14^0^ +X^211^l^132^9^0^ +X^211^r^125^21^0^ +X^211^l^124^16^0^ +X^211^r^101^17^0^ +X^211^l^100^12^0^ +X^211^r^95^17^0^ +X^211^l^94^12^0^ +X^211^D^16^10^2^ +S^212^0^V^bandera^INTEGER^^global +D^212^16^16^21^2^2 +X^212^l^115^11^0^ +X^212^r^114^8^0^ +X^212^l^113^43^0^ +X^212^D^16^21^2^ +S^213^0^V^scr_l^INTEGER^^global +D^213^16^16^29^2^2 +X^213^D^16^29^2^ +S^214^0^V^curr1^INTEGER^^global +D^214^16^16^35^2^2 +X^214^D^16^35^2^ +S^215^0^V^curr^INTEGER^^global +D^215^16^16^41^2^2 +X^215^D^16^41^2^ +S^216^0^V^idx^INTEGER^^global +D^216^16^16^46^2^2 +X^216^r^987^21^0^ +X^216^r^771^11^0^ +X^216^l^771^5^0^ +X^216^r^624^17^0^ +X^216^l^624^11^0^ +X^216^l^622^21^0^ +X^216^l^621^21^0^ +X^216^l^620^21^0^ +X^216^l^619^21^0^ +X^216^l^618^21^0^ +X^216^r^616^17^0^ +X^216^l^616^11^0^ +X^216^l^614^21^0^ +X^216^l^613^21^0^ +X^216^l^612^21^0^ +X^216^l^611^21^0^ +X^216^l^610^21^0^ +X^216^r^608^17^0^ +X^216^l^608^11^0^ +X^216^l^606^21^0^ +X^216^l^605^21^0^ +X^216^l^604^21^0^ +X^216^l^603^21^0^ +X^216^l^602^21^0^ +X^216^r^601^17^0^ +X^216^l^601^11^0^ +X^216^l^599^21^0^ +X^216^l^598^21^0^ +X^216^l^597^21^0^ +X^216^l^596^21^0^ +X^216^l^595^21^0^ +X^216^l^411^14^0^ +X^216^D^16^46^2^ +S^217^0^V^descrip^CHAR(30)^^global +D^217^17^17^10^2^2 +X^217^D^17^10^2^ +S^218^0^V^p_descripcion^CHAR(30)^^global +D^218^17^17^18^2^2 +X^218^D^17^18^2^ +S^219^0^V^nombre^CHAR(30)^^global +D^219^17^17^32^2^2 +X^219^D^17^32^2^ +S^220^0^V^l^SMALLINT^^global +D^220^18^18^10^2^2 +X^220^r^877^26^0^ +X^220^l^876^16^0^ +X^220^r^874^26^0^ +X^220^l^873^16^0^ +X^220^r^871^26^0^ +X^220^l^869^16^0^ +X^220^D^18^10^2^ +S^221^0^V^tipo_papel^SMALLINT^^global +D^221^18^18^12^2^2 +X^221^r^686^19^0^ +X^221^l^685^9^0^ +X^221^r^88^18^0^ +X^221^l^87^8^0^ +X^221^D^18^12^2^ +S^222^0^V^p_compania^RECORD^^global +D^222^19^19^10^2^2 +X^222^r^871^29^0^ +X^222^r^869^34^0^ +X^222^r^331^16^0^ +X^222^D^19^10^2^ +S^223^222^V^cod_comp^CHAR(5)^smarmotech.companias.cod_comp^ +D^223^0^0^0^0^0 +S^224^222^V^nombre^CHAR(40)^smarmotech.companias.nombre^ +D^224^0^0^0^0^0 +S^225^222^V^rnc^CHAR(30)^smarmotech.companias.rnc^ +D^225^0^0^0^0^0 +S^226^222^V^direccion^CHAR(40)^smarmotech.companias.direccion^ +D^226^0^0^0^0^0 +S^227^222^V^telefono^CHAR(15)^smarmotech.companias.telefono^ +D^227^0^0^0^0^0 +S^228^222^V^fax^CHAR(15)^smarmotech.companias.fax^ +D^228^0^0^0^0^0 +S^229^222^V^administrador^CHAR(40)^smarmotech.companias.administrador^ +D^229^0^0^0^0^0 +S^230^222^V^email^CHAR(100)^smarmotech.companias.email^ +D^230^0^0^0^0^0 +S^231^222^V^paginaweb^CHAR(100)^smarmotech.companias.paginaweb^ +D^231^0^0^0^0^0 +S^232^222^V^direccion1^CHAR(50)^smarmotech.companias.direccion1^ +D^232^0^0^0^0^0 +S^233^222^V^telefono1^CHAR(15)^smarmotech.companias.telefono1^ +D^233^0^0^0^0^0 +S^234^222^V^fax1^CHAR(15)^smarmotech.companias.fax1^ +D^234^0^0^0^0^0 +S^235^222^V^status_t^CHAR(1)^smarmotech.companias.status_t^ +D^235^0^0^0^0^0 +S^236^222^V^us_crea^CHAR(9)^smarmotech.companias.us_crea^ +D^236^0^0^0^0^0 +S^237^222^V^fech_crea^DATE^smarmotech.companias.fech_crea^ +D^237^0^0^0^0^0 +S^238^222^V^us_mod^CHAR(9)^smarmotech.companias.us_mod^ +D^238^0^0^0^0^0 +S^239^222^V^fech_mod^DATE^smarmotech.companias.fech_mod^ +D^239^0^0^0^0^0 +S^240^222^V^codnomina^CHAR(30)^smarmotech.companias.codnomina^ +D^240^0^0^0^0^0 +S^241^222^V^cuenta_no_inv^CHAR(10)^smarmotech.companias.cuenta_no_inv^ +D^241^0^0^0^0^0 +S^242^222^V^dias_vence_reservas^SMALLINT^smarmotech.companias.dias_vence_reservas^ +D^242^0^0^0^0^0 +S^243^222^V^path_documentos_ordenes^CHAR(100)^smarmotech.companias.path_documentos_ordenes^ +D^243^0^0^0^0^0 +S^244^222^V^url_file_destino^CHAR(100)^smarmotech.companias.url_file_destino^ +D^244^0^0^0^0^0 +S^245^222^V^control_ubicaciones^CHAR(10)^smarmotech.companias.control_ubicaciones^ +D^245^0^0^0^0^0 +S^246^222^V^facturacion_conduces^CHAR(10)^smarmotech.companias.facturacion_conduces^ +D^246^0^0^0^0^0 +S^247^222^V^email_facturacion^VARCHAR(100)^smarmotech.companias.email_facturacion^ +D^247^0^0^0^0^0 +S^248^222^V^cod_provincia^INTEGER^smarmotech.companias.cod_provincia^ +D^248^0^0^0^0^0 +S^249^222^V^cod_seccion^INTEGER^smarmotech.companias.cod_seccion^ +D^249^0^0^0^0^0 +S^250^222^V^cod_tramo^INTEGER^smarmotech.companias.cod_tramo^ +D^250^0^0^0^0^0 +S^251^222^V^cod_fila^INTEGER^smarmotech.companias.cod_fila^ +D^251^0^0^0^0^0 +S^252^222^V^cod_pos^INTEGER^smarmotech.companias.cod_pos^ +D^252^0^0^0^0^0 +S^253^0^V^respuesta^CHAR(3)^^global +D^253^20^20^8^2^2 +X^253^D^20^8^2^ +S^254^0^V^tipo_inventario^VARCHAR(1)^^global +D^254^21^21^8^2^2 +X^254^D^21^8^2^ +S^255^0^V^handler^om.SaxDocumentHandler^^global +D^255^23^23^11^2^2 +X^255^r^782^50^0^ +X^255^l^781^50^0^ +X^255^r^155^66^0^ +X^255^r^154^13^0^ +X^255^l^151^22^0^ +X^255^D^23^11^2^ +S^256^0^V^r_filename^STRING^^global +D^256^24^24^16^2^2 +X^256^r^146^43^0^ +X^256^l^143^15^0^ +X^256^D^24^16^2^ +S^257^0^V^r_output^STRING^^global +D^257^25^25^16^2^2 +X^257^r^149^47^0^ +X^257^l^148^53^0^ +X^257^D^25^16^2^ +S^258^0^V^preview^INTEGER^^global +D^258^26^26^16^2^2 +X^258^r^150^48^0^ +X^258^l^144^15^0^ +X^258^D^26^16^2^ +S^259^0^V^normal^CHAR(3)^^global +D^259^30^31^10^2^2 +X^259^l^140^61^0^ +X^259^D^30^10^2^ +S^260^0^V^negrilla_on^CHAR(3)^^global +D^260^30^31^17^2^2 +X^260^l^138^58^0^ +X^260^D^30^17^2^ +S^261^0^V^negrillas_of^CHAR(3)^^global +D^261^30^31^29^2^2 +X^261^l^138^70^0^ +X^261^D^30^29^2^ +S^262^0^V^comp_on^CHAR(3)^^global +D^262^30^31^42^2^2 +X^262^l^139^75^0^ +X^262^D^30^42^2^ +S^263^0^V^comp_off^CHAR(3)^^global +D^263^30^31^50^2^2 +X^263^l^139^83^0^ +X^263^D^30^50^2^ +S^264^0^V^doce^CHAR(3)^^global +D^264^30^31^59^2^2 +X^264^l^140^56^0^ +X^264^D^30^59^2^ +S^265^0^V^doble_on^CHAR(3)^^global +D^265^30^31^64^2^2 +X^265^l^139^56^0^ +X^265^D^30^64^2^ +S^266^0^V^doble_off^CHAR(3)^^global +D^266^30^31^73^2^2 +X^266^l^139^65^0^ +X^266^D^30^73^2^ +S^267^0^V^cmd^CHAR(150)^^global +D^267^33^33^10^2^2 +X^267^D^33^10^2^ +S^268^0^V^imprime^CHAR(150)^^global +D^268^33^33^14^2^2 +X^268^l^138^50^0^ +X^268^D^33^14^2^ +S^269^0^V^copia^CHAR(150)^^global +D^269^33^33^22^2^2 +X^269^l^140^76^0^ +X^269^D^33^22^2^ +S^270^0^V^archivo^CHAR(80)^^global +D^270^33^33^38^2^2 +X^270^l^140^68^0^ +X^270^D^33^38^2^ +S^271^0^V^impresor^SMALLINT^^global +D^271^33^33^55^2^2 +X^271^r^138^30^0^ +X^271^l^44^28^0^ +X^271^D^33^55^2^ +S^272^0^V^catalogo^RECORD^^global +D^272^35^35^11^2^2 +X^272^D^35^11^2^ +S^273^272^V^cuenta_no^VARCHAR(8)^smarmotech.cgtb00001.cuenta_no^ +D^273^0^0^0^0^0 +S^274^272^V^descripcion^VARCHAR(50)^smarmotech.cgtb00001.descripcion^ +D^274^0^0^0^0^0 +S^275^272^V^descrip_ing^VARCHAR(50)^smarmotech.cgtb00001.descrip_ing^ +D^275^0^0^0^0^0 +S^276^272^V^analitico^VARCHAR(1)^smarmotech.cgtb00001.analitico^ +D^276^0^0^0^0^0 +S^277^272^V^cata^VARCHAR(1)^smarmotech.cgtb00001.cata^ +D^277^0^0^0^0^0 +S^278^272^V^depto^VARCHAR(1)^smarmotech.cgtb00001.depto^ +D^278^0^0^0^0^0 +S^279^272^V^nivel^SMALLINT^smarmotech.cgtb00001.nivel^ +D^279^0^0^0^0^0 +S^280^272^V^ref^VARCHAR(1)^smarmotech.cgtb00001.ref^ +D^280^0^0^0^0^0 +S^281^272^V^origen^VARCHAR(1)^smarmotech.cgtb00001.origen^ +D^281^0^0^0^0^0 +S^282^272^V^estado_a^VARCHAR(4)^smarmotech.cgtb00001.estado_a^ +D^282^0^0^0^0^0 +S^283^272^V^estado_m^VARCHAR(4)^smarmotech.cgtb00001.estado_m^ +D^283^0^0^0^0^0 +S^284^272^V^aplica_a^VARCHAR(8)^smarmotech.cgtb00001.aplica_a^ +D^284^0^0^0^0^0 +S^285^272^V^status_t^VARCHAR(1)^smarmotech.cgtb00001.status_t^ +D^285^0^0^0^0^0 +S^286^272^V^us_crea^VARCHAR(9)^smarmotech.cgtb00001.us_crea^ +D^286^0^0^0^0^0 +S^287^272^V^fech_crea^DATETIME YEAR TO FRACTION^smarmotech.cgtb00001.fech_crea^ +D^287^0^0^0^0^0 +S^288^272^V^us_mod^VARCHAR(9)^smarmotech.cgtb00001.us_mod^ +D^288^0^0^0^0^0 +S^289^272^V^fech_mod^DATETIME YEAR TO FRACTION^smarmotech.cgtb00001.fech_mod^ +D^289^0^0^0^0^0 +S^290^272^V^cuenta_resultado^CHAR(1)^smarmotech.cgtb00001.cuenta_resultado^ +D^290^0^0^0^0^0 +S^291^272^V^grupo^CHAR(1)^smarmotech.cgtb00001.grupo^ +D^291^0^0^0^0^0 +S^292^272^V^tipo_cuenta^VARCHAR(50)^smarmotech.cgtb00001.tipo_cuenta^ +D^292^0^0^0^0^0 +S^293^272^V^selectivo_consumo^CHAR(10)^smarmotech.cgtb00001.selectivo_consumo^ +D^293^0^0^0^0^0 +S^294^272^V^retencion^CHAR(10)^smarmotech.cgtb00001.retencion^ +D^294^0^0^0^0^0 +S^295^272^V^codigo_isr^SMALLINT^smarmotech.cgtb00001.codigo_isr^ +D^295^0^0^0^0^0 +S^296^0^V^usuarios^CHAR(50)^^global +D^296^37^37^15^2^2 +X^296^r^164^44^0^ +X^296^r^138^15^0^ +X^296^r^113^23^0^ +X^296^r^46^32^0^ +X^296^l^42^28^0^ +X^296^D^37^15^2^ +S^297^0^V^clave^CHAR(50)^^global +D^297^37^37^25^2^2 +X^297^r^138^24^0^ +X^297^r^46^47^0^ +X^297^l^43^28^0^ +X^297^D^37^25^2^ +S^298^0^V^progreso^SMALLINT^^global +D^298^38^38^10^2^2 +X^298^D^38^10^2^ +S^299^0^V^descripcion^CHAR(70)^^global +D^299^39^39^10^2^2 +X^299^D^39^10^2^ +S^300^0^V^impresor^SMALLINT^^global +D^300^40^40^10^2^2 +X^300^D^40^10^2^ +S^301^0^V^p_companias^RECORD^^global +D^301^42^42^8^2^2 +X^301^D^42^8^2^ +S^302^301^V^cod_comp^CHAR(5)^smarmotech.companias.cod_comp^ +D^302^0^0^0^0^0 +S^303^301^V^nombre^CHAR(40)^smarmotech.companias.nombre^ +D^303^0^0^0^0^0 +S^304^301^V^rnc^CHAR(30)^smarmotech.companias.rnc^ +D^304^0^0^0^0^0 +S^305^301^V^direccion^CHAR(40)^smarmotech.companias.direccion^ +D^305^0^0^0^0^0 +S^306^301^V^telefono^CHAR(15)^smarmotech.companias.telefono^ +D^306^0^0^0^0^0 +S^307^301^V^fax^CHAR(15)^smarmotech.companias.fax^ +D^307^0^0^0^0^0 +S^308^301^V^administrador^CHAR(40)^smarmotech.companias.administrador^ +D^308^0^0^0^0^0 +S^309^301^V^email^CHAR(100)^smarmotech.companias.email^ +D^309^0^0^0^0^0 +S^310^301^V^paginaweb^CHAR(100)^smarmotech.companias.paginaweb^ +D^310^0^0^0^0^0 +S^311^301^V^direccion1^CHAR(50)^smarmotech.companias.direccion1^ +D^311^0^0^0^0^0 +S^312^301^V^telefono1^CHAR(15)^smarmotech.companias.telefono1^ +D^312^0^0^0^0^0 +S^313^301^V^fax1^CHAR(15)^smarmotech.companias.fax1^ +D^313^0^0^0^0^0 +S^314^301^V^status_t^CHAR(1)^smarmotech.companias.status_t^ +D^314^0^0^0^0^0 +S^315^301^V^us_crea^CHAR(9)^smarmotech.companias.us_crea^ +D^315^0^0^0^0^0 +S^316^301^V^fech_crea^DATE^smarmotech.companias.fech_crea^ +D^316^0^0^0^0^0 +S^317^301^V^us_mod^CHAR(9)^smarmotech.companias.us_mod^ +D^317^0^0^0^0^0 +S^318^301^V^fech_mod^DATE^smarmotech.companias.fech_mod^ +D^318^0^0^0^0^0 +S^319^301^V^codnomina^CHAR(30)^smarmotech.companias.codnomina^ +D^319^0^0^0^0^0 +S^320^301^V^cuenta_no_inv^CHAR(10)^smarmotech.companias.cuenta_no_inv^ +D^320^0^0^0^0^0 +S^321^301^V^dias_vence_reservas^SMALLINT^smarmotech.companias.dias_vence_reservas^ +D^321^0^0^0^0^0 +S^322^301^V^path_documentos_ordenes^CHAR(100)^smarmotech.companias.path_documentos_ordenes^ +D^322^0^0^0^0^0 +S^323^301^V^url_file_destino^CHAR(100)^smarmotech.companias.url_file_destino^ +D^323^0^0^0^0^0 +S^324^301^V^control_ubicaciones^CHAR(10)^smarmotech.companias.control_ubicaciones^ +D^324^0^0^0^0^0 +S^325^301^V^facturacion_conduces^CHAR(10)^smarmotech.companias.facturacion_conduces^ +D^325^0^0^0^0^0 +S^326^301^V^email_facturacion^VARCHAR(100)^smarmotech.companias.email_facturacion^ +D^326^0^0^0^0^0 +S^327^301^V^cod_provincia^INTEGER^smarmotech.companias.cod_provincia^ +D^327^0^0^0^0^0 +S^328^301^V^cod_seccion^INTEGER^smarmotech.companias.cod_seccion^ +D^328^0^0^0^0^0 +S^329^301^V^cod_tramo^INTEGER^smarmotech.companias.cod_tramo^ +D^329^0^0^0^0^0 +S^330^301^V^cod_fila^INTEGER^smarmotech.companias.cod_fila^ +D^330^0^0^0^0^0 +S^331^301^V^cod_pos^INTEGER^smarmotech.companias.cod_pos^ +D^331^0^0^0^0^0 +S^332^0^V^p_fechas^DATE^^global +D^332^44^44^8^2^2 +X^332^r^113^14^0^ +X^332^l^112^9^0^ +X^332^D^44^8^2^ +S^333^0^V^comp_fech^DATE^^global +D^333^45^45^8^2^2 +X^333^D^45^8^2^ +S^334^0^V^comp_fech1^DATE^^global +D^334^45^45^18^2^2 +X^334^D^45^18^2^ +S^335^0^V^mes_control^CHAR(2)^^global +D^335^46^46^8^2^2 +X^335^D^46^8^2^ +S^336^0^V^mes_calc^SMALLINT^^global +D^336^47^47^8^2^2 +X^336^D^47^8^2^ +S^337^0^V^dia^SMALLINT^^global +D^337^47^47^17^2^2 +X^337^D^47^17^2^ +S^338^0^V^fecha_c^DATE^^global +D^338^48^48^8^2^2 +X^338^D^48^8^2^ +S^339^0^V^c_ano^CHAR(4)^^global +D^339^49^49^8^2^2 +X^339^D^49^8^2^ +S^340^0^V^a_ano^CHAR(4)^^global +D^340^49^49^14^2^2 +X^340^D^49^14^2^ +S^341^0^V^entrada27^ARRAY[500] OF RECORD^^global +D^341^51^58^8^2^2 +X^341^r^1022^55^0^ +X^341^r^1022^23^0^ +X^341^r^1021^44^0^ +X^341^r^1021^23^0^ +X^341^r^1020^40^0^ +X^341^r^1000^42^0^ +X^341^r^999^18^0^ +X^341^r^998^33^0^ +X^341^r^997^33^0^ +X^341^r^996^33^0^ +X^341^r^995^33^0^ +X^341^r^994^33^0^ +X^341^r^991^43^0^ +X^341^l^991^22^0^ +X^341^r^990^18^0^ +X^341^r^988^15^0^ +X^341^l^622^11^0^ +X^341^l^621^11^0^ +X^341^l^620^11^0^ +X^341^l^619^11^0^ +X^341^l^618^11^0^ +X^341^l^614^11^0^ +X^341^l^613^11^0^ +X^341^l^612^11^0^ +X^341^l^611^11^0^ +X^341^l^610^11^0^ +X^341^l^606^11^0^ +X^341^l^605^11^0^ +X^341^l^604^11^0^ +X^341^l^603^11^0^ +X^341^l^602^11^0^ +X^341^l^599^11^0^ +X^341^l^598^11^0^ +X^341^l^597^11^0^ +X^341^l^596^11^0^ +X^341^l^595^11^0^ +X^341^D^51^8^2^ +S^342^341^V^cuenta_no^CHAR(8)^^ +D^342^52^52^8^2^2 +X^342^D^52^8^2^ +S^343^341^V^depto^SMALLINT^^ +D^343^53^53^8^2^2 +X^343^D^53^8^2^ +S^344^341^V^cod_aux^SMALLINT^^ +D^344^54^54^8^2^2 +X^344^D^54^8^2^ +S^345^341^V^cod_sec^SMALLINT^^ +D^345^55^55^8^2^2 +X^345^D^55^8^2^ +S^346^341^V^num_doc^INTEGER^^ +D^346^56^56^8^2^2 +X^346^D^56^8^2^ +S^347^341^V^valor^DECIMAL(12,2)^^ +D^347^57^57^8^2^2 +X^347^D^57^8^2^ +S^348^0^F^configureoutput^^^extern +X^348^c^781^16^0^ +S^349^0^F^fgl_report_commitCurrentSettings^^^extern +X^349^c^151^32^0^ +S^350^0^F^fgl_report_selectPreview^^^extern +X^350^c^150^23^0^ +S^351^0^F^fgl_report_selectDevice^^^extern +X^351^c^149^23^0^ +S^352^0^F^seleccionarsalida^^^extern +X^352^c^780^16^0^ +X^352^c^148^23^0^ +S^353^0^F^fgl_report_loadCurrentSettings^^^extern +X^353^c^146^12^0^ +S^354^0^F^defecto^^^extern +X^354^c^138^7^0^ +S^355^0^F^prd^^^extern +X^355^c^113^10^0^ +S^356^0^F^msg^^^extern +X^356^c^720^20^0^ +X^356^c^133^10^0^ +X^356^c^125^17^0^ +X^356^c^101^13^0^ +X^356^c^95^13^0^ +S^357^0^F^msgrp000^^^extern +X^357^c^686^10^0^ +X^357^c^88^9^0^ +T^13^38^d^0^0^DEFINE +T^30^33^d^0^0^RECORD +T^40^49^f^0^0^MAIN +T^51^254^f^0^0^FUNCTION +T^53^75^d^0^0^DEFINE +T^53^75^d^0^0^RECORD +T^90^129^i^0^0^INPUT +T^92^97^i^0^0^ +T^93^97^c^0^0^IF +T^94^96^c^0^0^THEN +T^98^117^i^0^0^ +T^99^103^c^0^0^IF +T^100^102^c^0^0^THEN +T^114^117^c^0^0^IF +T^115^116^c^0^0^THEN +T^119^128^i^0^0^ +T^120^128^c^0^0^IF +T^121^127^c^0^0^THEN +T^123^127^c^0^0^IF +T^124^125^c^0^0^THEN +T^131^136^c^0^0^IF +T^132^135^c^0^0^THEN +T^146^152^c^0^0^IF +T^148^151^c^0^0^THEN +T^154^244^c^0^0^IF +T^155^242^c^0^0^THEN +T^181^240^l^0^0^FOREACH +T^183^214^c^0^0^IF +T^190^206^c^0^0^THEN +T^190^192^c^0^0^IF +T^191^191^c^0^0^THEN +T^194^196^c^0^0^IF +T^195^195^c^0^0^THEN +T^204^206^c^0^0^IF +T^205^205^c^0^0^THEN +T^216^218^c^0^0^IF +T^217^217^c^0^0^THEN +T^220^222^c^0^0^IF +T^221^221^c^0^0^THEN +T^224^226^c^0^0^IF +T^225^225^c^0^0^THEN +T^235^237^c^0^0^IF +T^236^236^c^0^0^THEN +T^250^252^c^0^0^IF +T^251^251^c^0^0^THEN +T^256^656^f^0^0^REPORT +T^257^316^d^0^0^DEFINE +T^257^279^d^0^0^RECORD +r^46^TOP MARGIN^0 +r^46^LEFT MARGIN^0 +r^46^BOTTOM MARGIN^3 +r^46^PAGE LENGTH^150 +T^325^328^a^0^0^PAGE HEADER +T^330^413^a^0^0^FIRST PAGE HEADER +x^331^0^ +p^v^224 +p^v^125 +p^v^113 +T^392^413^c^0^0^IF +T^393^412^c^0^0^THEN +T^415^426^a^0^0^BEFORE GROUP OF 68 +T^424^426^c^0^0^IF +T^425^425^c^0^0^THEN +T^429^441^a^0^0^BEFORE GROUP OF 58 +T^442^588^a^0^0^ON EVERY ROW +T^465^470^c^0^0^IF +T^466^469^c^0^0^THEN +x^502^0^ +p^v^114 +p^v^115 +p^v^116 +p^v^56 +p^v^74 +p^v^62 +p^v^75 +p^v^76 +p^v^65 +p^v^66 +p^v^78 +p^v^77 +p^v^60 +p^v^110 +p^v^67 +p^v^73 +p^v^72 +T^520^533^c^0^0^IF +T^521^532^c^0^0^THEN +T^527^532^c^0^0^IF +T^528^530^c^0^0^THEN +T^591^639^a^0^0^AFTER GROUP OF 58 +T^594^625^c^0^0^IF +T^595^624^c^0^0^THEN +x^627^0^ +p^v^96 +p^v^97 +p^v^98 +p^v^99 +p^v^100 +p^v^101 +p^v^102 +p^v^103 +p^v^104 +p^v^105 +p^v^106 +p^v^107 +T^641^655^a^0^0^ON LAST ROW +x^644^0^ +p^v^79 +p^v^80 +p^v^82 +p^v^81 +p^v^83 +p^v^84 +p^v^85 +p^v^86 +p^v^109 +p^v^88 +p^v^165 +p^v^174 +T^666^814^f^0^0^FUNCTION +T^667^668^d^0^0^DEFINE +T^690^768^i^0^0^INPUT +T^691^714^i^0^0^ +T^716^730^i^0^0^ +T^718^722^c^0^0^IF +T^719^721^c^0^0^THEN +T^725^728^c^0^0^IF +T^726^727^c^0^0^THEN +T^732^737^i^0^0^ +T^739^747^i^0^0^ +T^740^743^c^0^0^IF +T^741^742^c^0^0^THEN +T^745^747^c^0^0^IF +T^746^746^c^0^0^THEN +T^749^758^i^0^0^ +T^750^753^c^0^0^IF +T^751^752^c^0^0^THEN +T^755^758^c^0^0^IF +T^756^757^c^0^0^THEN +T^762^767^i^0^0^ +T^763^767^c^0^0^IF +T^764^766^c^0^0^THEN +T^797^811^l^0^0^WHILE +T^800^802^c^0^0^IF +T^801^801^c^0^0^THEN +T^801^801^g^0^0^EXIT WHILE +T^804^808^c^0^0^IF +T^805^807^c^0^0^THEN +T^819^1040^f^0^0^REPORT +T^821^848^d^0^0^DEFINE +T^821^824^d^0^0^RECORD +r^2^TOP MARGIN^0 +r^2^LEFT MARGIN^0 +r^2^BOTTOM MARGIN^2 +r^2^PAGE LENGTH^150 +T^857^913^a^0^0^PAGE HEADER +x^870^0^ +p^c^2 +p^v^32 +p^v^31 +p^v^30 +p^v^29 +p^l^lqprrp009 +p^c^expr +p^e^ +p^c^90 +p^l^Pag. +p^e^ +x^874^0^ +p^c^expr +p^l^Sistema de Contabilidad de Costo +p^c^90 +p^e^ +x^877^0^ +p^c^expr +p^l^Entrada de Diario Liquidacion Partes Y Repuestos +p^c^90 +p^v^35 +x^879^0^ +p^c^1 +p^l^Del +p^v^179 +p^l^ Al +p^v^180 +x^885^0^ +p^c^01 +p^l^Entrada de Diario No. +p^v^25 +p^v^9 +x^888^0^ +p^c^1 +p^l^Observaciones: _____________________________________ +x^889^0^ +p^c^1 +p^l^ _____________________________________ +x^891^0^ +p^v^31 +x^892^0^ +p^c^1 +p^l^-------------------------------------------------- +p^l^-------------------------------------------------- +p^v^27 +x^897^0^ +p^c^2 +p^l^Cuenta +p^c^11 +p^l^Dpto +p^c^17 +p^l^Catalogo +p^c^26 +p^l^Refe +p^c^41 +p^l^Concepto +p^c^75 +p^l^Debe +p^c^93 +p^l^Haber +p^v^28 +x^905^0^ +p^c^1 +p^l^-------------------------------------------------- +p^l^-------------------------------------------------- +p^v^28 +T^911^913^c^0^0^IF +T^912^912^c^0^0^THEN +T^914^936^a^0^0^ON EVERY ROW +x^915^0^ +p^c^4 +p^v^4 +p^c^35 +p^l^INVENTARIO REPUESTOS +p^c^66 +p^v^5 +T^920^936^c^0^0^IF +T^921^934^c^0^0^THEN +T^938^1039^a^0^0^ON LAST ROW +T^939^941^c^0^0^IF +T^940^940^c^0^0^THEN +p^c^4 +p^l^5501 +p^c^35 +p^l^VARIACION COSTO INDIRECTO +T^946^985^c^0^0^IF +T^947^964^c^0^0^THEN +x^947^0^ +p^c^66 +p^v^174 +T^949^964^c^0^0^IF +T^950^963^c^0^0^THEN +T^965^984^c^0^0^ELSE +x^966^0^ +p^c^84 +p^v^174 +T^969^984^c^0^0^IF +T^970^983^c^0^0^THEN +T^987^1024^l^0^0^FOR +T^988^1002^c^0^0^IF +T^990^1001^c^0^0^THEN +T^990^992^c^0^0^IF +T^991^991^c^0^0^THEN +x^994^0^ +p^c^4 +p^v^342 +p^c^17 +p^v^344 +p^l^- +p^v^345 +p^c^26 +p^v^346 +p^c^84 +p^v^347 +T^999^1001^c^0^0^IF +T^1000^1000^c^0^0^THEN +T^1004^1023^c^0^0^IF +T^1005^1022^c^0^0^THEN +x^1028^0^ +p^c^1 +p^v^27 +x^1029^0^ +p^c^66 +p^l^-------------- +p^c^84 +p^l^-------------- +x^1031^0^ +p^c^35 +p^l^Totales--> +p^c^66 +p^v^10 +p^c^84 +p^v^11 +p^v^28 +x^1037^0^ +p^c^1 +p^v^8 +x^1038^0^ +p^c^1 +p^v^30 +p^v^28 diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 51afa9f..8934dbd 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -773,6 +773,8 @@ + + diff --git a/PROYECTO/otrodir/apiclient.4gl b/PROYECTO/otrodir/apiclient.4gl index f40b458..a244f88 100644 --- a/PROYECTO/otrodir/apiclient.4gl +++ b/PROYECTO/otrodir/apiclient.4gl @@ -60,6 +60,9 @@ FUNCTION apiclient(pemail) DEFINE estado,purl,cmd,res, msg,s,pemail,tiposervice STRING, ret INT + DEFINE dominio, detalle, api_url, api_key STRING, + dns_estado SMALLINT, + hunter_ok BOOLEAN # LA API PARA VERIFICAR ESTA OFFLINE 29/05/2025 @@ -68,115 +71,115 @@ FUNCTION apiclient(pemail) RETURN estado,ret } # SE DEVUELVE SI EL EMAIL ESTA EN BLANCO - IF pemail IS NULL THEN - + LET pemail = pemail.trim() + IF pemail IS NULL OR pemail.getLength() = 0 THEN + LET ret = 400 LET estado = 'DEBES DIGITAR EL EMAIL POR FAVOR' RETURN estado,ret - END IF + END IF DISPLAY "llego: ",pemail + + # VALIDACION PROPIA 14/10/2026: FORMATO + DOMINIO EN DNS (NO DEPENDE DE LA API) + IF NOT email_formato_valido(pemail) THEN + INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,'formato_invalido',getdate(),'mt101_local',suser_Sname(),0) + LET ret = 400 + LET estado = 'EL FORMATO DEL EMAIL NO ES VALIDO' + RETURN estado,ret + END IF + + LET dominio = pemail.subString(pemail.getIndexOf("@",1) + 1, pemail.getLength()) + LET dns_estado = email_dominio_dns(dominio) + DISPLAY "dominio: ",dominio," dns: ",dns_estado + IF dns_estado = 0 THEN + INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,'dominio_inexistente',getdate(),'mt101_dns',suser_Sname(),0) + LET ret = 400 + LET estado = 'EL DOMINIO DEL EMAIL NO EXISTE O NO RECIBE CORREO' + RETURN estado,ret + END IF # ELECCION DE SERVICIOS, POR EL MOMENTO ES IPQUALITY - SELECT a.IDENTIFICACION INTO tiposervice FROM APIS a + # URL Y API KEY SE LEEN DE LA TABLA APIS (YA NO VAN EN EL FUENTE) + SELECT a.IDENTIFICACION, a.url, a.apikey INTO tiposervice, api_url, api_key FROM APIS a WHERE a.estado = 'ONLINE' IF STATUS = NOTFOUND THEN RETURN estado,ret END IF - # LET tiposervice = 'ipq1' - + LET tiposervice = tiposervice.trim() + LET api_url = api_url.trim() + LET api_key = api_key.trim() + # LET tiposervice = 'ipq1' + IF tiposervice = 'HUNTER' THEN - LET purl = "https://api.hunter.io/v2/email-verifier?email=",pemail CLIPPED,"&api_key=2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766" - CALL ipquality_send_command(purl) RETURNING ret,res + LET purl = api_url,"?email=",pemail CLIPPED,"&api_key=",api_key + CALL ipquality_send_command(purl, NULL) RETURNING ret,res DISPLAY "response api: ",res," longitud: ",res.getLength() - IF res.getLength() =0 THEN - INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) - VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score) - - LET ret = 400 - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - RETURN estado,ret - END IF - TRY + + # HUNTER PUEDE NO RESPONDER (CAIDO, 202 EN PROCESO, 222/451 SMTP): + # EN ESE CASO DECIDE LA VALIDACION DNS PROPIA + LET hunter_ok = FALSE + IF ret == 0 AND res.getLength() > 0 THEN + TRY CALL util.JSON.parse(res,data) - CATCH - LET ret = 400 - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET hunter_ok = TRUE + CATCH + LET hunter_ok = FALSE + END TRY + END IF + + IF NOT hunter_ok THEN + INSERT INTO envia_email_log (email,display_name,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,SFMT('hunter http=%1',ret),'hunter_sin_respuesta',getdate(),'mt101_dns',suser_Sname(),0) + CALL email_resultado_dns(dns_estado) RETURNING estado,ret RETURN estado,ret - END TRY + END IF -# INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) -# VALUES (pemail,data.data.status,getdate(),'forzado',suser_Sname(),data.data.score) - - # LET estado = 'VALIDO' - # LET ret = 200 - # RETURN estado,ret + DISPLAY "DATA EMAIL: ",pemail CLIPPED, " score: ",data.data.score + LET detalle = SFMT('mx=%1 smtp=%2 check=%3 regexp=%4 disp=%5 dns=%6', + data.data.mx_records, data.data.smtp_server, data.data.smtp_check, + data.data.regexp, data.data.disposable, dns_estado) + INSERT INTO envia_email_log (email,display_name,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,detalle,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score) - LET s = util.JSON.stringify(res) - - DISPLAY "DATA EMAIL: ",pemail CLIPPED, " score: ",data.data.score - INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) - VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score) - - IF ret ==0 THEN + # DESECHABLES (MAILINATOR, ETC.) SE RECHAZAN SIEMPRE + IF data.data.disposable THEN + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + END IF - IF data.data.mx_records = TRUE THEN - LET estado = 'VALIDO' - LET ret = 200 - RETURN estado,ret - ELSE - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - LET ret = 400 - RETURN estado,ret - END IF + IF (data.data.status = 'valid' OR data.data.status = 'accept_all' OR + data.data.status = 'unknown') AND data.data.score > 29 THEN + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + END IF - IF data.data.smtp_server = TRUE THEN - LET estado = 'VALIDO' - LET ret = 200 - RETURN estado,ret - ELSE - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - LET ret = 400 - RETURN estado,ret - END IF + # HUNTER LO RECHAZA: SOLO SE RESPETA SI LLEGO AL SERVIDOR DE CORREO + # Y ESTE RECHAZO EL BUZON (EL BUZON NO EXISTE) + IF data.data.mx_records AND data.data.smtp_server AND NOT data.data.smtp_check THEN + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + END IF - IF data.data.regexp = TRUE THEN - LET estado = 'VALIDO' - LET ret = 200 - RETURN estado,ret - ELSE - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - LET ret = 400 - RETURN estado,ret - END IF + # HUNTER NO VE EL DOMINIO O NO PUDO CONECTAR (DOMINIOS .DO PEQUENOS): + # SI EL DNS CONFIRMA QUE EL DOMINIO RECIBE CORREO, SE ACEPTA + CALL email_resultado_dns(dns_estado) RETURNING estado,ret + IF ret = 200 THEN + INSERT INTO envia_email_log (email,display_name,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,detalle,'valid_dns',getdate(),'mt101_dns',suser_Sname(),0) + END IF + RETURN estado,ret - IF data.data.disposable = TRUE THEN - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - LET ret = 400 - RETURN estado,ret - ELSE - LET estado = 'VALIDO' - LET ret = 200 - RETURN estado,ret - END IF - - - IF (data.data.status = 'valid' OR data.data.status = 'accept_all' OR - data.data.status = 'unknown') AND data.data.score > 29 THEN - LET estado = 'VALIDO' - LET ret = 200 - RETURN estado,ret - ELSE - LET ret = 400 - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - RETURN estado,ret - END IF - END IF - END IF IF tiposervice = 'IPQUALITY' THEN - LET purl = 'https://ipqualityscore.com/api/json/email/cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3/',pemail CLIPPED - CALL ipquality_send_command(purl) RETURNING ret,res + # EN APIS LA URL DE IPQUALITY YA TRAE LA KEY: .../email// + LET purl = api_url,pemail CLIPPED + CALL ipquality_send_command(purl, api_key) RETURNING ret,res IF ret ==0 THEN LET s = util.JSON.stringify(res) @@ -195,8 +198,8 @@ DISPLAY "response api: ",res," longitud: ",res.getLength() END IF IF tiposervice = 'APILAYER' THEN # DISPLAY " ESTOY EN APILAYER" - LET purl= "https://api.apilayer.com/email_verification/",pemail CLIPPED - CALL apilayer_send_command(purl, cmd) RETURNING ret, res + LET purl= api_url,pemail CLIPPED + CALL apilayer_send_command(purl, api_key) RETURNING ret, res # DISPLAY "res ",res," ",ret IF ret ==0 THEN LET s = util.JSON.stringify(res) @@ -233,9 +236,9 @@ END FUNCTION ## Communications library using com (http or https) # -FUNCTION apilayer_send_command(url, cmd) +FUNCTION apilayer_send_command(url, papikey) - DEFINE url, cmd STRING + DEFINE url, papikey STRING DEFINE result, tmp STRING DEFINE http_req com.HTTPRequest DEFINE http_resp com.HTTPResponse @@ -247,7 +250,7 @@ FUNCTION apilayer_send_command(url, cmd) LET http_req = com.HTTPRequest.Create(url) - CALL http_req.setHeader("api_key","2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766") + CALL http_req.setHeader("apikey",papikey) CALL http_req.doRequest() @@ -270,21 +273,22 @@ FUNCTION apilayer_send_command(url, cmd) END FUNCTION -FUNCTION ipquality_send_command(url) +FUNCTION ipquality_send_command(url, papikey) - DEFINE url, cmd STRING + DEFINE url, papikey STRING DEFINE result, tmp STRING DEFINE http_req com.HTTPRequest DEFINE http_resp com.HTTPResponse - - DISPLAY "url", url + # NO SE MUESTRA LA URL: LLEVA LA API KEY TRY LET http_req = com.HTTPRequest.Create(url) - CALL http_req.setHeader("apikey","cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3") - + IF papikey IS NOT NULL THEN + CALL http_req.setHeader("apikey",papikey) + END IF + CALL http_req.doRequest() - + LET http_resp=http_req.getResponse() IF http_resp.getStatusCode() != 200 THEN @@ -298,8 +302,177 @@ FUNCTION ipquality_send_command(url) CATCH RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2]) END TRY - - + + RETURN 0, result END FUNCTION + +# +## VALIDACION PROPIA DEL EMAIL (14/10/2026) +## Formato basico + el dominio debe existir y recibir correo (registro MX, o A +## como MX implicito segun RFC 5321). Se consulta el DNS por HTTPS (dns.google) +## porque BDL no tiene resolvedor DNS. +# + +FUNCTION email_formato_valido(pemail) + DEFINE pemail, usuario, dominio, etiqueta, c, permitidos STRING + DEFINE i, arroba, inicio INT + + LET permitidos = "._%+-!#$&'*/=?^`{|}~" + + IF pemail IS NULL OR pemail.getLength() > 254 THEN + RETURN FALSE + END IF + + # UNA SOLA ARROBA, CON USUARIO Y DOMINIO + LET arroba = pemail.getIndexOf("@",1) + IF arroba <= 1 OR arroba = pemail.getLength() THEN + RETURN FALSE + END IF + IF pemail.getIndexOf("@",arroba + 1) > 0 THEN + RETURN FALSE + END IF + + LET usuario = pemail.subString(1, arroba - 1) + LET dominio = pemail.subString(arroba + 1, pemail.getLength()) + + # USUARIO: MAX 64, SIN PUNTO AL INICIO/FINAL NI DOBLE PUNTO + IF usuario.getLength() > 64 THEN + RETURN FALSE + END IF + IF usuario.getCharAt(1) = "." OR usuario.getCharAt(usuario.getLength()) = "." + OR usuario.getIndexOf("..",1) > 0 THEN + RETURN FALSE + END IF + FOR i = 1 TO usuario.getLength() + LET c = usuario.getCharAt(i) + IF NOT (c MATCHES "[a-zA-Z0-9]" OR permitidos.getIndexOf(c,1) > 0) THEN + RETURN FALSE + END IF + END FOR + + # DOMINIO: AL MENOS UN PUNTO, ETIQUETAS DE LETRAS/NUMEROS/GUION, + # SIN GUION AL INICIO/FINAL, Y EXTENSION (TLD) DE 2+ LETRAS + IF dominio.getLength() > 253 OR dominio.getIndexOf(".",1) = 0 THEN + RETURN FALSE + END IF + LET inicio = 1 + FOR i = 1 TO dominio.getLength() + 1 + IF i > dominio.getLength() OR dominio.getCharAt(i) = "." THEN + LET etiqueta = dominio.subString(inicio, i - 1) + IF etiqueta.getLength() = 0 OR etiqueta.getLength() > 63 THEN + RETURN FALSE + END IF + IF etiqueta.getCharAt(1) = "-" OR etiqueta.getCharAt(etiqueta.getLength()) = "-" THEN + RETURN FALSE + END IF + LET inicio = i + 1 + ELSE + LET c = dominio.getCharAt(i) + IF NOT (c MATCHES "[a-zA-Z0-9]" OR c = "-") THEN + RETURN FALSE + END IF + END IF + END FOR + # ETIQUETA FINAL = TLD + IF etiqueta.getLength() < 2 THEN + RETURN FALSE + END IF + FOR i = 1 TO etiqueta.getLength() + IF NOT (etiqueta.getCharAt(i) MATCHES "[a-zA-Z]") THEN + RETURN FALSE + END IF + END FOR + + RETURN TRUE +END FUNCTION + +# 1 = EL DOMINIO RECIBE CORREO, 0 = NO EXISTE / SIN MX NI A, -1 = NO SE PUDO CONSULTAR +FUNCTION email_dominio_dns(pdominio) + DEFINE pdominio STRING + DEFINE r SMALLINT + + LET r = email_dns_consulta(pdominio, "MX") + IF r <> 0 THEN + RETURN r + END IF + # SIN MX: EL REGISTRO A FUNCIONA COMO MX IMPLICITO + RETURN email_dns_consulta(pdominio, "A") +END FUNCTION + +FUNCTION email_dns_consulta(pdominio, ptipo) + DEFINE pdominio, ptipo, res, dato STRING + DEFINE http_req com.HTTPRequest + DEFINE http_resp com.HTTPResponse + DEFINE obj, rr util.JSONObject + DEFINE answers util.JSONArray + DEFINE i, dns_status, tipo_rr, tipo_buscado INT + + IF ptipo = "MX" THEN + LET tipo_buscado = 15 + ELSE + LET tipo_buscado = 1 + END IF + + TRY + LET http_req = com.HTTPRequest.Create( + SFMT("https://dns.google/resolve?name=%1&type=%2", pdominio.toLowerCase(), ptipo)) + CALL http_req.setTimeOut(10) + CALL http_req.setHeader("Accept","application/dns-json") + CALL http_req.doRequest() + LET http_resp = http_req.getResponse() + IF http_resp.getStatusCode() != 200 THEN + RETURN -1 + END IF + LET res = http_resp.getTextResponse() + LET obj = util.JSONObject.parse(res) + LET dns_status = obj.get("Status") + CATCH + DISPLAY "email_dns_consulta error: ",STATUS + RETURN -1 + END TRY + + # 3 = NXDOMAIN (EL DOMINIO NO EXISTE); OTRO <> 0 = FALLA DEL DNS + IF dns_status = 3 THEN + RETURN 0 + END IF + IF dns_status <> 0 THEN + RETURN -1 + END IF + IF NOT obj.has("Answer") THEN + RETURN 0 + END IF + IF obj.getType("Answer") <> "ARRAY" THEN + RETURN 0 + END IF + + LET answers = obj.get("Answer") + FOR i = 1 TO answers.getLength() + LET rr = answers.get(i) + LET tipo_rr = rr.get("type") + LET dato = rr.get("data") + IF tipo_rr = tipo_buscado THEN + # "0 ." ES UN NULL MX (RFC 7505): EL DOMINIO DECLARA QUE NO RECIBE CORREO + IF tipo_buscado = 15 AND dato.trim() MATCHES "* ." THEN + CONTINUE FOR + END IF + RETURN 1 + END IF + END FOR + + RETURN 0 +END FUNCTION + +FUNCTION email_resultado_dns(dns_estado) + DEFINE dns_estado SMALLINT + + CASE dns_estado + WHEN 1 + RETURN 'VALIDO', 200 + WHEN 0 + RETURN 'EL DOMINIO DEL EMAIL NO EXISTE O NO RECIBE CORREO', 400 + OTHERWISE + RETURN 'NO FUE POSIBLE VERIFICAR EL EMAIL, INTENTE DE NUEVO', 400 + END CASE +END FUNCTION diff --git a/PROYECTO/otrodir/apiclient.4gl.bak_20261014 b/PROYECTO/otrodir/apiclient.4gl.bak_20261014 new file mode 100644 index 0000000..f40b458 --- /dev/null +++ b/PROYECTO/otrodir/apiclient.4gl.bak_20261014 @@ -0,0 +1,305 @@ +OPTIONS SHORT CIRCUIT + +IMPORT util +IMPORT com + + +FUNCTION apiclient(pemail) + DEFINE data_apilayer RECORD + email,did_you_mean,USER,domain,syntax_valid STRING, + is_disposable,is_role_account,is_catch_all,is_deliverable,can_connect_smtp, + is_inbox_full,is_disabled,mx_records,FREE,score BOOLEAN + END RECORD + DEFINE data RECORD + data RECORD + status , + result, + deprecation_notice string, + score smallint, + email string, + regexp, + gibberish, + disposable, + webmail, + mx_records, + smtp_server, + smtp_check, + accept_all, + block BOOLEAN + + END RECORD, + source DYNAMIC ARRAY OF STRING, + meta RECORD + param STRING + END RECORD + END RECORD + + DEFINE data_ipq RECORD + MESSAGE STRING, + success, + valid, + disposable BOOLEAN, + smtp_score , + overall_score DEC(10,2), + first_name string, + generic, + common, + dns_valid, + honeypot BOOLEAN, + deliverability STRING, + frequent_complainer BOOLEAN, + spam_trap_score STRING, + catch_all, + timed_out, + suspect, + recent_abuse BOOLEAN, + fraud_score DEC(10,2), + suggested_domain string, + leaked BOOLEAN + END RECORD + + DEFINE estado,purl,cmd,res, msg,s,pemail,tiposervice STRING, + ret INT + + # LA API PARA VERIFICAR ESTA OFFLINE 29/05/2025 + +{ LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret +} + # SE DEVUELVE SI EL EMAIL ESTA EN BLANCO + IF pemail IS NULL THEN + + LET ret = 400 + LET estado = 'DEBES DIGITAR EL EMAIL POR FAVOR' + RETURN estado,ret + END IF + DISPLAY "llego: ",pemail + # ELECCION DE SERVICIOS, POR EL MOMENTO ES IPQUALITY + SELECT a.IDENTIFICACION INTO tiposervice FROM APIS a + WHERE a.estado = 'ONLINE' + IF STATUS = NOTFOUND THEN + RETURN estado,ret + END IF + # LET tiposervice = 'ipq1' + + IF tiposervice = 'HUNTER' THEN + + LET purl = "https://api.hunter.io/v2/email-verifier?email=",pemail CLIPPED,"&api_key=2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766" + CALL ipquality_send_command(purl) RETURNING ret,res +DISPLAY "response api: ",res," longitud: ",res.getLength() + IF res.getLength() =0 THEN + INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score) + + LET ret = 400 + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + RETURN estado,ret + END IF + TRY + CALL util.JSON.parse(res,data) + CATCH + LET ret = 400 + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + RETURN estado,ret + END TRY + +# INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) +# VALUES (pemail,data.data.status,getdate(),'forzado',suser_Sname(),data.data.score) + + # LET estado = 'VALIDO' + # LET ret = 200 + # RETURN estado,ret + + LET s = util.JSON.stringify(res) + + DISPLAY "DATA EMAIL: ",pemail CLIPPED, " score: ",data.data.score + INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score) + VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score) + + IF ret ==0 THEN + + IF data.data.mx_records = TRUE THEN + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + ELSE + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + END IF + + IF data.data.smtp_server = TRUE THEN + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + ELSE + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + END IF + + IF data.data.regexp = TRUE THEN + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + ELSE + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + END IF + + IF data.data.disposable = TRUE THEN + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + LET ret = 400 + RETURN estado,ret + ELSE + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + END IF + + + IF (data.data.status = 'valid' OR data.data.status = 'accept_all' OR + data.data.status = 'unknown') AND data.data.score > 29 THEN + LET estado = 'VALIDO' + LET ret = 200 + RETURN estado,ret + ELSE + LET ret = 400 + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + RETURN estado,ret + END IF + END IF + + END IF + + IF tiposervice = 'IPQUALITY' THEN + LET purl = 'https://ipqualityscore.com/api/json/email/cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3/',pemail CLIPPED + CALL ipquality_send_command(purl) RETURNING ret,res + + IF ret ==0 THEN + LET s = util.JSON.stringify(res) + CALL util.JSON.parse(res,data_ipq) + + IF data_ipq.valid THEN + LET estado = 'VALIDO' + LET ret = 200 + + ELSE + LET ret = 400 + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + + END IF + END IF + END IF + IF tiposervice = 'APILAYER' THEN + # DISPLAY " ESTOY EN APILAYER" + LET purl= "https://api.apilayer.com/email_verification/",pemail CLIPPED + CALL apilayer_send_command(purl, cmd) RETURNING ret, res + # DISPLAY "res ",res," ",ret + IF ret ==0 THEN + LET s = util.JSON.stringify(res) + CALL util.JSON.parse(res,data_apilayer) + + IF data_apilayer.can_connect_smtp THEN + LET estado = 'VALIDO' + LET ret = 200 + + ELSE + LET ret = 400 + LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' + + END IF + + + # DISPLAY "sintax ",data.syntax_valid," deliv ",data.is_deliverable + ELSE + IF ret = 429 THEN + LET ret = 200 + LET estado ='VALIDO POR EXESO DE REQUEST' + ELSE + LET ret = 400 + LET estado = 'NO FUE POSIBLE LA CONEXION, ' + END IF + END IF + END IF + # LET ret = 200 + DISPLAY "en return ",estado," ",ret + RETURN estado,ret +END FUNCTION + +# +## Communications library using com (http or https) +# + +FUNCTION apilayer_send_command(url, cmd) + + DEFINE url, cmd STRING + DEFINE result, tmp STRING + DEFINE http_req com.HTTPRequest + DEFINE http_resp com.HTTPResponse + + + + TRY + UPDATE apis SET cuenta = cuenta + 1 WHERE estado = 'ONLINE' + + + LET http_req = com.HTTPRequest.Create(url) + CALL http_req.setHeader("api_key","2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766") + + CALL http_req.doRequest() + + LET http_resp=http_req.getResponse() + + IF http_resp.getStatusCode() != 200 THEN + RETURN http_resp.getStatusCode(), http_resp.getStatusDescription() + END IF + LET tmp = http_resp.getStatusDescription() + IF (tmp == "OK" || tmp == "no error" ) THEN + RETURN -1, SFMT("HTTP request status description: %1 ",tmp) + END IF + LET result = http_resp.getTextResponse() + CATCH + RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2]) + END TRY + + + RETURN 0, result + +END FUNCTION + +FUNCTION ipquality_send_command(url) + + DEFINE url, cmd STRING + DEFINE result, tmp STRING + DEFINE http_req com.HTTPRequest + DEFINE http_resp com.HTTPResponse + + + DISPLAY "url", url + TRY + LET http_req = com.HTTPRequest.Create(url) + CALL http_req.setHeader("apikey","cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3") + + CALL http_req.doRequest() + + LET http_resp=http_req.getResponse() + + IF http_resp.getStatusCode() != 200 THEN + RETURN http_resp.getStatusCode(), http_resp.getStatusDescription() + END IF + LET tmp = http_resp.getStatusDescription() + IF (tmp == "OK" || tmp == "no error" ) THEN + RETURN -1, SFMT("HTTP request status description: %1 ",tmp) + END IF + LET result = http_resp.getTextResponse() + CATCH + RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2]) + END TRY + + + RETURN 0, result + +END FUNCTION diff --git a/WEBSERVICES/apiclient.4gl b/WEBSERVICES/apiclient.4gl deleted file mode 100644 index 874a82c..0000000 --- a/WEBSERVICES/apiclient.4gl +++ /dev/null @@ -1,172 +0,0 @@ -OPTIONS SHORT CIRCUIT - -IMPORT util -IMPORT com - - -FUNCTION apiclient(pemail) - DEFINE data_apilayer RECORD - email,did_you_mean,USER,domain,syntax_valid STRING, - is_disposable,is_role_account,is_catch_all,is_deliverable,can_connect_smtp, - is_inbox_full,is_disabled,mx_records,FREE,score BOOLEAN - END RECORD - - DEFINE data_ipq RECORD - MESSAGE STRING, - success, - valid, - disposable BOOLEAN, - smtp_score , - overall_score DEC(10,2), - first_name string, - generic, - common, - dns_valid, - honeypot BOOLEAN, - deliverability STRING, - frequent_complainer BOOLEAN, - spam_trap_score STRING, - catch_all, - timed_out, - suspect, - recent_abuse BOOLEAN, - fraud_score DEC(10,2), - suggested_domain string, - leaked BOOLEAN - END RECORD - - DEFINE estado,purl,cmd,res, msg,s,pemail,tiposervice STRING, - ret INT - - # ELECCION DE SERVICIOS, POR EL MOMENTO ES IPQUALITY - LET tiposervice = 'ipq1' - - - IF tiposervice = 'ipq' THEN - LET purl = 'https://ipqualityscore.com/api/json/email/cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3/',pemail CLIPPED - CALL ipquality_send_command(purl) RETURNING ret,res - DISPLAY "estoy a qui" - IF ret ==0 THEN - LET s = util.JSON.stringify(res) - CALL util.JSON.parse(res,data_ipq) - - IF data_ipq.valid THEN - LET estado = 'VALIDO' - LET ret = 200 - - ELSE - LET ret = 400 - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - - END IF - - ELSE - - CALL apilayer_send_command(purl, cmd) RETURNING ret, res - # DISPLAY "res ",res," ",ret - IF ret ==0 THEN - LET s = util.JSON.stringify(res) - CALL util.JSON.parse(res,data_apilayer) - - IF data_apilayer.can_connect_smtp THEN - LET estado = 'VALIDO' - LET ret = 200 - - ELSE - LET ret = 400 - LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL' - - END IF - - - # DISPLAY "sintax ",data.syntax_valid," deliv ",data.is_deliverable - ELSE - IF ret = 429 THEN - LET ret = 200 - LET estado ='VALIDO POR EXESO DE REQUEST' - ELSE - LET ret = 400 - LET estado = 'NO FUE POSIBLE LA CONEXION, ' - END IF - END IF - END IF - END IF - DISPLAY "en return ",estado," ",ret - RETURN estado,ret -END FUNCTION - -# -## Communications library using com (http or https) -# - -FUNCTION apilayer_send_command(url, cmd) - - DEFINE url, cmd STRING - DEFINE result, tmp STRING - DEFINE http_req com.HTTPRequest - DEFINE http_resp com.HTTPResponse - - - - TRY - LET http_req = com.HTTPRequest.Create(url) - CALL http_req.setHeader("apikey","gPWg6pDyOt3k2RL2ElbghaMqs6dNMAwm") - - CALL http_req.doRequest() - - LET http_resp=http_req.getResponse() - - IF http_resp.getStatusCode() != 200 THEN - RETURN http_resp.getStatusCode(), http_resp.getStatusDescription() - END IF - LET tmp = http_resp.getStatusDescription() - IF (tmp == "OK" || tmp == "no error" ) THEN - RETURN -1, SFMT("HTTP request status description: %1 ",tmp) - END IF - LET result = http_resp.getTextResponse() - CATCH - RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2]) - END TRY - - - RETURN 0, result - -END FUNCTION - -FUNCTION ipquality_send_command(url) - - DEFINE url, cmd STRING - DEFINE result, tmp STRING - DEFINE http_req com.HTTPRequest - DEFINE http_resp com.HTTPResponse - - - - TRY - LET http_req = com.HTTPRequest.Create(url) - CALL http_req.setHeader("apikey","cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3") - - CALL http_req.doRequest() - - LET http_resp=http_req.getResponse() - - IF http_resp.getStatusCode() != 200 THEN - RETURN http_resp.getStatusCode(), http_resp.getStatusDescription() - END IF - LET tmp = http_resp.getStatusDescription() - IF (tmp == "OK" || tmp == "no error" ) THEN - RETURN -1, SFMT("HTTP request status description: %1 ",tmp) - END IF - LET result = http_resp.getTextResponse() - CATCH - RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2]) - END TRY - - - RETURN 0, result - -END FUNCTION -FUNCTION show_sync_err(msg) - DEFINE msg STRING - CALL fgl_winmessage(%"ERROR", msg, "exclamation") -END FUNCTION diff --git a/WEBSERVICES/productosconteo.4gl b/WEBSERVICES/productosconteo.4gl index fd93dab..6aece4a 100644 --- a/WEBSERVICES/productosconteo.4gl +++ b/WEBSERVICES/productosconteo.4gl @@ -97,16 +97,25 @@ FUNCTION productosconteo(pdata) IF STATUS < 0 THEN LET p.mensajes.cod_msg=STATUS LET p.mensajes.descripcion = 'ERROR EN CONEXION ',SQLCA.sqlerrm - DISCONNECT CURRENT + # sin DISCONNECT: no hay conexion abierta y el error tumbaba el server RETURN util.JSON.stringify(p) - - END IF - LET fecha = TODAY + + END IF + LET fecha = TODAY LET fecha_ini = fecha - 90 - + + IF p.credenciales.tipo_inventario IS NULL OR p.credenciales.tipo_inventario <> "productos" THEN + # solo productos tiene consulta; antes PREPARE de NULL tumbaba el server + LET p.mensajes.cod_msg = -1 + LET p.mensajes.descripcion = 'TIPO DE INVENTARIO NO DISPONIBLE PARA CONTEO: ', + p.credenciales.tipo_inventario + DISCONNECT CURRENT + RETURN util.JSON.stringify(p) + END IF + IF p.credenciales.tipo_inventario = "productos" THEN - SELECT a.fecha_conteo INTO xfecha_conteo FROM intb00044 a - WHERE a.tipo_inventario = tipo_inventario AND a.disponible = "SI" + SELECT a.fecha_conteo INTO xfecha_conteo FROM intb00044 a + WHERE a.tipo_inventario = 'PRODUCTOS TERMINADOS' AND a.disponible = "SI" DISPLAY "ESTOY PRODUCTOS",p.credenciales.codn LET selec = @@ -127,7 +136,9 @@ FUNCTION productosconteo(pdata) "SELECT a.codid,b.bodega,c.descripcion,0"{ISNULL(SUM(b.cantidad_2),0)},",d.cod_seccion,d.cod_tramo,d.cod_fila,d.cod_pos FROM iptb00006 b,iptb00002 a INNER JOIN intb00015 e ON e.cod_n = a.cod_n and e.cod_grupo = a.cod_grupo and e.cod_tipo = a.cod_tipo and e.cod_sec = a.cod_sec and - e.estado='Pendiente' ,intb00009 c,iptb00062 d + e.estado='Pendiente' AND + e.semana_del = (SELECT MIN (x.semana_del) FROM intb00015 x WHERE x.semana_del >= GETDATE()) + ,intb00009 c,iptb00062 d WHERE (a.cod_n = b.cod_n and ", " a.cod_grupo = b.cod_grupo and a.cod_tipo = b.cod_tipo and a.cod_sec = b.cod_sec) and b.status_t is null ", @@ -189,6 +200,14 @@ FUNCTION productosconteo(pdata) END FOREACH DISPLAY "NUMERO DE PRODUCTOS ",i + IF p.productos.getLength() = 0 THEN + # sin semana programada en intb00015 no hay nada que contar; evita la + # consulta de existencias (iptb00006) que tardaba >5 min y bloqueaba el WS + LET p.mensajes.cod_msg = 100 + LET p.mensajes.descripcion = 'NO HAY PRODUCTOS PROGRAMADOS PARA CONTEO (intb00015)' + DISCONNECT CURRENT + RETURN util.JSON.stringify(p) + END IF LET i = 1 PREPARE comando2 FROM s1 diff --git a/WEBSERVICES/productosconteo.4gl.bak_20261012 b/WEBSERVICES/productosconteo.4gl.bak_20261012 new file mode 100644 index 0000000..fd93dab --- /dev/null +++ b/WEBSERVICES/productosconteo.4gl.bak_20261012 @@ -0,0 +1,213 @@ +IMPORT util +IMPORT os + +FUNCTION productosconteo(pdata) + DEFINE xfecha_conteo DATE + DEFINE pdata STRING + + DEFINE producto RECORD + codid INT, + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion VARCHAR(100), + unidad_med VARCHAR(4), + factor_conv FLOAT, + despiece STRING, + existencia DEC(12,5), + consumo DEC(12,5), + costo DEC(12,5), + precio DEC(12,2), + ordenes DEC(12,5), + despachado DEC(12,5), + desglose VARCHAR(1), + + reservada DEC(12,5), + disponible DEC(12,5), + transito DEC(12,5), + dias SMALLINT, + fecha CHAR(10), + fecha_conteo CHAR(10) + END RECORD + DEFINE existencia RECORD + codid INT, + bodega SMALLINT, + descripcion_bodega VARCHAR(100), + cantidad FLOAT, + cod_seccion INT,cod_tramo INT,cod_fila INT,cod_pos, + fecha DATE + END RECORD + DEFINE p RECORD + credenciales RECORD + usuario,clave,tipo_inventario VARCHAR(50), + codn INT + END RECORD, + + productos DYNAMIC ARRAY OF RECORD + codid INT, + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion VARCHAR(100), + unidad_med VARCHAR(4), + factor_conv FLOAT, + despiece STRING, + existencia DEC(12,5), + consumo DEC(12,5), + costo DEC(12,5), + precio DEC(12,2), + ordenes DEC(12,5), + despachado DEC(12,5), + desglose VARCHAR(1), + reservada DEC(12,5), + disponible DEC(12,5), + transito DEC(12,5), + dias SMALLINT, + fecha CHAR(10), + fecha_conteo CHAR(10) + + END RECORD , + existencia DYNAMIC ARRAY OF RECORD + codid INT, + bodega SMALLINT, + descripcion_bodega VARCHAR(100), + cantidad FLOAT, + cod_seccion INT,cod_tramo INT,cod_fila INT,cod_pos, + fecha DATE + END RECORD, + mensajes RECORD + cod_msg INT, + descripcion STRING + END RECORD + END RECORD, + i int, + selec,s1 STRING, + fecha,fecha_ini DATE + CALL util.JSON.parse(pdata,p) + IF STATUS < 0 THEN + LET p.mensajes.cod_msg=STATUS + LET p.mensajes.descripcion = 'ERROR EN CONEXION ',SQLCA.sqlerrm + RETURN util.JSON.stringify(p) + + END IF + # DISPLAY "productos ",p.credenciales.usuario," ",p.credenciales.clave," ",p.credenciales.tipo_inventario + CONNECT TO "smarmotech" USER p.credenciales.usuario USING p.credenciales.clave + IF STATUS < 0 THEN + LET p.mensajes.cod_msg=STATUS + LET p.mensajes.descripcion = 'ERROR EN CONEXION ',SQLCA.sqlerrm + DISCONNECT CURRENT + RETURN util.JSON.stringify(p) + + END IF + LET fecha = TODAY + LET fecha_ini = fecha - 90 + + IF p.credenciales.tipo_inventario = "productos" THEN + SELECT a.fecha_conteo INTO xfecha_conteo FROM intb00044 a + WHERE a.tipo_inventario = tipo_inventario AND a.disponible = "SI" + DISPLAY "ESTOY PRODUCTOS",p.credenciales.codn + + LET selec = + "SELECT a.codid,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.descrip_esp,a.unidad_med,ISNULL(d.factor_conv,1),b.cod_n, + '0','0', '0','0','0','0',a.desglose ", + " FROM iptb00002 a,iptb00001 d INNER JOIN intb00015 e ON e.cod_n = d.cod_n and + e.cod_grupo = d.cod_grupo and e.cod_tipo = d.cod_tipo and e.cod_sec = d.cod_sec and + e.estado = 'Pendiente' + LEFT OUTER JOIN iptb00027 b ON d.cod_n = b.cod_n and + d.cod_grupo = b.cod_grupo and d.cod_tipo = b.cod_tipo and d.cod_sec = b.cod_sec + where ", + " (a.cod_n = d.cod_n and a.cod_grupo = d.cod_grupo and a.cod_tipo = d.cod_tipo and ", + " a.cod_sec = d.cod_sec) AND a.status_t IS NULL AND ", + "a.control_existencia='SI' AND e.semana_del = (SELECT MIN (a.semana_del) FROM intb00015 a WHERE semana_del >= GETDATE())", + " ORDER BY a.codid " + + LET s1 = + "SELECT a.codid,b.bodega,c.descripcion,0"{ISNULL(SUM(b.cantidad_2),0)},",d.cod_seccion,d.cod_tramo,d.cod_fila,d.cod_pos + FROM iptb00006 b,iptb00002 a INNER JOIN intb00015 e ON e.cod_n = a.cod_n and + e.cod_grupo = a.cod_grupo and e.cod_tipo = a.cod_tipo and e.cod_sec = a.cod_sec and + e.estado='Pendiente' ,intb00009 c,iptb00062 d + WHERE (a.cod_n = b.cod_n and ", + + " a.cod_grupo = b.cod_grupo and a.cod_tipo = b.cod_tipo and a.cod_sec = b.cod_sec) and b.status_t is null ", + " and (d.cod_n = a.cod_n and d.cod_grupo = a.cod_grupo and d.cod_tipo = a.cod_tipo and d.cod_Sec = a.cod_sec) ", + " and ", + "a.control_existencia='SI' AND a.dispositivo_movil='SI' and b.bodega = c.cod_bodega ", + + " group by a.codid,b.bodega,c.descripcion,d.cod_seccion,d.cod_tramo,d.cod_fila,d.cod_pos ", + " having SUM(b.cantidad_2) > 0 " + + END IF + PREPARE comando FROM selec + DECLARE c2 CURSOR FOR comando + + LET i = 1 + FOREACH c2 INTO producto.* + + IF producto.cod_n IS NOT null THEN + IF p.credenciales.tipo_inventario = 'productos' THEN + LET producto.costo=0 + # CALL disponibles(producto.cod_n,producto.cod_grupo,producto.cod_tipo,producto.cod_sec,TODAY) + # RETURNING producto.ordenes,producto.despachado,producto.transito,producto.existencia, + # producto.reservada + LET producto.disponible = producto.existencia - (producto.ordenes+producto.despachado+producto.reservada) + IF producto.disponible IS NULL THEN + LET producto.disponible=0 + END IF + # DESPIECE + IF producto.despiece IS NULL THEN + LET producto.despiece = 'NO' + ELSE + LET producto.despiece = 'SI' + END IF + + END IF + IF producto.consumo < 0 THEN + LET producto.consumo = producto.consumo * -1 + END IF + IF producto.consumo > 0 THEN + LET producto.dias =(producto.disponible/ producto.consumo) * 90 + ELSE + LET producto.dias=0 + END IF + IF producto.descripcion IS NULL THEN + LET producto.descripcion = "NO TIENE" + END IF + IF producto.unidad_med IS NULL THEN + LET producto.unidad_med='UD' + END IF + LET producto.fecha=TODAY USING "dd/mm/yyyy" + + LET producto.fecha_conteo = xfecha_conteo + LET p.productos[i].* = producto.* + LET i = i + 1 + + + END IF + + + END FOREACH + DISPLAY "NUMERO DE PRODUCTOS ",i + LET i = 1 + + PREPARE comando2 FROM s1 + DECLARE c3 CURSOR FOR comando2 + + FOREACH c3 INTO existencia.* + IF existencia.cantidad IS NOT NULL THEN + IF existencia.codid > 0 THEN + LET existencia.fecha = today + LET p.existencia[i].* = existencia.* + IF p.existencia[i].cantidad IS NULL THEN + LET p.existencia[i].cantidad=0 + END IF + LET i = i+1 + END IF + END IF + END FOREACH +DISPLAY "NUMERO DE PRODUCTOS EXISTENCIA ",i + DISCONNECT CURRENT + RETURN util.JSON.stringify(p) + +END FUNCTION From 95aa24c029e575c4311b44eb99f8af9c16f07982 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Thu, 15 Oct 2026 17:37:36 -0400 Subject: [PATCH 06/14] JSOTO Restaura configureOutput() de 3.20 en msgrp000 (reportes GRE) El stub RETURN NULL dejaba sin handler a los ~90 programas que usan configureOutput(): todos caian con -8083 en START REPORT ... TO XML HANDLER. Se vuelve a la version de 3.20 y se agrega IMPORT FGL greruntime para que las funciones fgl_report_* resuelvan aunque la app no declare libgre.42x. Verificado con gsmake (fgl602) sobre las 79 apps que dependen de FUNCIONESREPORT: ninguna empeora; las de CxP, Compras y Nomina siguen compilando y 8 reportes de Ventas pasan a compilar. Co-Authored-By: Claude Opus 5.5 --- PROYECTO/otrodir/msgrp000.4gl | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/PROYECTO/otrodir/msgrp000.4gl b/PROYECTO/otrodir/msgrp000.4gl index fcacf98..60da6aa 100644 --- a/PROYECTO/otrodir/msgrp000.4gl +++ b/PROYECTO/otrodir/msgrp000.4gl @@ -1,3 +1,4 @@ +IMPORT FGL greruntime -- fgl_report_* (Genero Report Writer) para configureOutput() { Esta funcion se utiliza para desplegar mensajes de los reportes de los sistemas de Ray-O-Vac Dominicana. @@ -274,10 +275,19 @@ END FUNCTION FUNCTION configureOutput(tipo_file) DEFINE tipo_file CHAR(3) - -- La API fgl_report_* (Report Writer 2.0) no esta disponible en este - -- FGL 6.00.01. Esta salida (XML/XLS/PDF por handler) no esta soportada - -- en este entorno; usar r_output = 'MA' (impresion clasica) en su lugar. - RETURN NULL + IF NOT fgl_report_loadCurrentSettings(NULL) THEN + RETURN NULL + END IF + # CALL fgl_report_selectLogicalPageMapping("multipage") + # CALL fgl_report_configureMultipageOutput(2, 4, TRUE) + CALL fgl_report_setPageMargins("0.5cm","0.5cm","0.5cm","0.5cm") + --CALL fgl_report_selectDevice("XLS") + # CALL fgl_report_selectDevice(getPreviewDevice()) + # CALL fgl_report_configureCompatibilityOutput(1,'Franklin Gothic Heavy',false,'existencia',NULL,NULL) + CALL fgl_report_selectDevice(tipo_file) + CALL fgl_report_configurexlsxdevice(null,null,null,false,false,null,1) + CALL fgl_report_selectPreview(TRUE) + RETURN fgl_report_commitCurrentSettings() END FUNCTION FUNCTION getPreviewDevice() From 705fadfdb46b02af5be2651c0a5adf492ba679e9 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Fri, 16 Oct 2026 15:30:24 -0400 Subject: [PATCH 07/14] JSOTO QA G6 (.250): arreglos CG/Activos/Repuestos/Informatica, DBDATE, imagenes de reportes y cgprrp008 Programas (bugs encontrados en las pruebas funcionales en la .250): - acprmt004/acprmt005: MIN/MAX sobre la fecha real (no sobre texto CONVERT 103); acprmt004 alinea rowid. - cgprrp008: lee cgtb00004 (no la copia cgtb00004_tmp del 14-mar-2026) y solo regenera cgtb00016 cuando se corre sin filtro de cuenta. - cgprrp014: CONSTRUCT con los nombres de campo del form (cod_sp_sc). - cgfmrp013: defaultValue del combo = cgprrp012.4rp. - cgprrp022/edprrp029: salida getPreviewDevice() en lugar de SVG fijo. - edprrp080: no consume numero ED con afecta = NO. - cgprmt004/022/037, segprmt0001: sin CONNECT "IFMX" (-6366); EXTERIOR via cross-DB. - irprcs001: agrega CONNECT; irprmt021: columna idestado; irprmt066: la anulacion sin MaintainX ya no se deshace (-255); otrodir/bodegas: rama '2' llena origen y destino. - teprmt001: ajustes G6. Despliegue G6: - DBDATE=dmy4 en config/Application.xcf, config/Main_prg.xcf, resources/Application.xcf y en el grupo MODULOS del .4pw (los programas lanzados por el menu heredan el entorno). - 31 .4rp: IMAGEBOX con rutas absolutas file:///E:|F:|C: -> relativas IMAGENES/...; se agregan IMAGENES/LOGO.JPG y genero_logo.png. - Paquete mbs: incluye bin/*.4rp y bin/IMAGENES (antes el GAR no llevaba los reportes). - resources/TopMenu.4st (irprcs008 daba -8014); bin/cgprcs024.4rp. Co-Authored-By: Claude Opus 5.5 --- PROYECTO/PRDIR/prprrp021.4rp | 2 +- PROYECTO/acdir/acprmt004.4gl | 5 +- PROYECTO/acdir/acprmt005.4gl | 3 +- PROYECTO/bin/IMAGENES/LOGO.JPG | Bin 0 -> 12735 bytes PROYECTO/bin/IMAGENES/genero_logo.png | Bin 0 -> 46856 bytes PROYECTO/bin/acprrp010.4rp | 2 +- PROYECTO/bin/ccprmt003.4rp | 2 +- PROYECTO/bin/cgprcs024.4rp | 84 ++++++++++++++ PROYECTO/bin/coprmt009.4rp | 2 +- PROYECTO/bin/coprmt009_1.4rp | 2 +- PROYECTO/bin/cumpleanos.4rp | 2 +- PROYECTO/bin/cumpleanos_1.4rp | 2 +- PROYECTO/bin/ipprrp010a.4rp | 2 +- PROYECTO/bin/ipprrp010a1.4rp | 2 +- PROYECTO/bin/ipprrp010e.4rp | 2 +- PROYECTO/bin/ipprrp010f.4rp | 2 +- PROYECTO/bin/ipprrp010f_1.4rp | 2 +- PROYECTO/bin/ipprrp010h.4rp | 2 +- PROYECTO/bin/irprrpcs008.4rp | 2 +- PROYECTO/bin/noprrp044_1_otros_ant.4rp | 2 +- PROYECTO/bin/noprrp044_2.4rp | 2 +- PROYECTO/bin/pretiqueta4x3.4rp | 2 +- PROYECTO/bin/prprmt003.4rp | 2 +- PROYECTO/bin/sendemail.4rp | 2 +- PROYECTO/bin/svprmt001.4rp | 2 +- PROYECTO/bin/vefactura.4rp | 2 +- PROYECTO/bin/vefactura_1.4rp | 2 +- PROYECTO/bin/veprcs001.4rp | 2 +- PROYECTO/bin/veprmt022.4rp | 2 +- PROYECTO/bin/veprmt022_1.4rp | 2 +- PROYECTO/bin/veprmt049.4rp | 2 +- PROYECTO/bin/veprmt049_GR.4rp | 2 +- PROYECTO/bin/veprrp049 (copy).4rp | 2 +- PROYECTO/bin/veprrp049.4rp | 2 +- PROYECTO/bin/veprrp049back.4rp | 2 +- PROYECTO/cgdir/cgfmrp013.4fd | 4 +- PROYECTO/cgdir/cgprmt004.4gl | 147 +++++++++++-------------- PROYECTO/cgdir/cgprmt022.4gl | 3 +- PROYECTO/cgdir/cgprmt037.4gl | 6 +- PROYECTO/cgdir/cgprrp008.4gl | 39 +++++-- PROYECTO/cgdir/cgprrp014.4gl | 2 +- PROYECTO/cgdir/cgprrp022.4gl | 2 +- PROYECTO/cgdir/edprrp029.4gl | 6 +- PROYECTO/cgdir/edprrp080.4gl | 14 ++- PROYECTO/config/Application.xcf | 1 + PROYECTO/config/Main_prg.xcf | 1 + PROYECTO/irdir/irprcs001.4gl | 4 + PROYECTO/irdir/irprmt021.4gl | 2 +- PROYECTO/irdir/irprmt066.4gl | 10 +- PROYECTO/irdir/irprrpcs008C.4rp | 2 +- PROYECTO/mbsERP.4pw | 7 +- PROYECTO/nodir/cumpleanos1.4rp | 2 +- PROYECTO/otrodir/bodegas.4gl | 16 +++ PROYECTO/resources/Application.xcf | 1 + PROYECTO/resources/TopMenu.4st | 14 +++ PROYECTO/seguridad2.0/segprmt0001.4gl | 6 +- PROYECTO/tedir/teprmt001.4gl | 125 ++++++++++++--------- 57 files changed, 358 insertions(+), 208 deletions(-) create mode 100644 PROYECTO/bin/IMAGENES/LOGO.JPG create mode 100644 PROYECTO/bin/IMAGENES/genero_logo.png create mode 100644 PROYECTO/bin/cgprcs024.4rp create mode 100644 PROYECTO/resources/TopMenu.4st diff --git a/PROYECTO/PRDIR/prprrp021.4rp b/PROYECTO/PRDIR/prprrp021.4rp index 7c11701..3eaef14 100644 --- a/PROYECTO/PRDIR/prprrp021.4rp +++ b/PROYECTO/PRDIR/prprrp021.4rp @@ -18,7 +18,7 @@ - + diff --git a/PROYECTO/acdir/acprmt004.4gl b/PROYECTO/acdir/acprmt004.4gl index d3b7fe1..0d1fe16 100644 --- a/PROYECTO/acdir/acprmt004.4gl +++ b/PROYECTO/acdir/acprmt004.4gl @@ -235,11 +235,12 @@ FUNCTION acpcmf004() RETURN END IF + -- G6: trans LIKE actb00004.* incluye rowid; sin el 2o a.rowid todo quedaba corrido una columna (-1213) LET SELEC = - "SELECT a.rowid,a.codigo + "SELECT a.rowid,a.rowid,a.codigo ,a.num_doc ,CONVERT(VARCHAR(10),a.fecha,103) ,a.cod_mov @@ -419,7 +420,7 @@ FUNCTION acpcmf004() CALL fgl_winmessage("INFO","NO SE ACTUALIZARON REGISTROS","INFO") EXIT PROGRAM END IF - SELECT MIN(convert(varchar(10),a.fecha,103)) INTO fecha6 FROM actb00004 a + SELECT MIN(a.fecha) INTO fecha6 FROM actb00004 a -- G6: MIN sobre texto dd/mm/yyyy no da la fecha menor WHERE a.codigo = trans.codigo AND a.status_t IS NULL IF fecha6 IS NULL THEN diff --git a/PROYECTO/acdir/acprmt005.4gl b/PROYECTO/acdir/acprmt005.4gl index fba6ccb..5bfa522 100644 --- a/PROYECTO/acdir/acprmt005.4gl +++ b/PROYECTO/acdir/acprmt005.4gl @@ -92,7 +92,8 @@ INPUT BY NAME p_ano1,p_mes1 NEXT FIELD p_ano1 END IF - SELECT MAX(CONVERT(VARCHAR(10),a.fecha,103)) INTO fecha_ant FROM actb00004 a + -- G6: MAX sobre texto dd/mm/yyyy devolvia 31/12 y no la ultima depreciacion (permitia duplicar el mes) + SELECT MAX(a.fecha) INTO fecha_ant FROM actb00004 a WHERE a.status_t IS NULL AND a.cod_mov = 5 IF fecha_ant >= trans.fecha THEN diff --git a/PROYECTO/bin/IMAGENES/LOGO.JPG b/PROYECTO/bin/IMAGENES/LOGO.JPG new file mode 100644 index 0000000000000000000000000000000000000000..b125c9d59732d9ee26f411369ab877eb4c843e6c GIT binary patch literal 12735 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 - + diff --git a/PROYECTO/bin/ccprmt003.4rp b/PROYECTO/bin/ccprmt003.4rp index 1f37e47..f53b3e0 100644 --- a/PROYECTO/bin/ccprmt003.4rp +++ b/PROYECTO/bin/ccprmt003.4rp @@ -14,7 +14,7 @@ - + diff --git a/PROYECTO/bin/cgprcs024.4rp b/PROYECTO/bin/cgprcs024.4rp new file mode 100644 index 0000000..b5f1106 --- /dev/null +++ b/PROYECTO/bin/cgprcs024.4rp @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/bin/coprmt009.4rp b/PROYECTO/bin/coprmt009.4rp index 0cf9fdd..27abfa9 100644 --- a/PROYECTO/bin/coprmt009.4rp +++ b/PROYECTO/bin/coprmt009.4rp @@ -25,7 +25,7 @@ - + diff --git a/PROYECTO/bin/coprmt009_1.4rp b/PROYECTO/bin/coprmt009_1.4rp index 0249bcc..54cb143 100644 --- a/PROYECTO/bin/coprmt009_1.4rp +++ b/PROYECTO/bin/coprmt009_1.4rp @@ -28,7 +28,7 @@ - + diff --git a/PROYECTO/bin/cumpleanos.4rp b/PROYECTO/bin/cumpleanos.4rp index e9a8d20..8c52666 100644 --- a/PROYECTO/bin/cumpleanos.4rp +++ b/PROYECTO/bin/cumpleanos.4rp @@ -14,7 +14,7 @@ - + diff --git a/PROYECTO/bin/cumpleanos_1.4rp b/PROYECTO/bin/cumpleanos_1.4rp index a0a51bd..046383f 100644 --- a/PROYECTO/bin/cumpleanos_1.4rp +++ b/PROYECTO/bin/cumpleanos_1.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010a.4rp b/PROYECTO/bin/ipprrp010a.4rp index c30cc86..906f796 100644 --- a/PROYECTO/bin/ipprrp010a.4rp +++ b/PROYECTO/bin/ipprrp010a.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010a1.4rp b/PROYECTO/bin/ipprrp010a1.4rp index 393685d..f90f055 100644 --- a/PROYECTO/bin/ipprrp010a1.4rp +++ b/PROYECTO/bin/ipprrp010a1.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010e.4rp b/PROYECTO/bin/ipprrp010e.4rp index e27f168..70ecb15 100644 --- a/PROYECTO/bin/ipprrp010e.4rp +++ b/PROYECTO/bin/ipprrp010e.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010f.4rp b/PROYECTO/bin/ipprrp010f.4rp index 4a41e00..1c725e9 100644 --- a/PROYECTO/bin/ipprrp010f.4rp +++ b/PROYECTO/bin/ipprrp010f.4rp @@ -16,7 +16,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010f_1.4rp b/PROYECTO/bin/ipprrp010f_1.4rp index 898a1ef..b20ca52 100644 --- a/PROYECTO/bin/ipprrp010f_1.4rp +++ b/PROYECTO/bin/ipprrp010f_1.4rp @@ -16,7 +16,7 @@ - + diff --git a/PROYECTO/bin/ipprrp010h.4rp b/PROYECTO/bin/ipprrp010h.4rp index 5aeed0f..b5b93bf 100644 --- a/PROYECTO/bin/ipprrp010h.4rp +++ b/PROYECTO/bin/ipprrp010h.4rp @@ -16,7 +16,7 @@ - + diff --git a/PROYECTO/bin/irprrpcs008.4rp b/PROYECTO/bin/irprrpcs008.4rp index 99a7b9b..b218fb6 100644 --- a/PROYECTO/bin/irprrpcs008.4rp +++ b/PROYECTO/bin/irprrpcs008.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/noprrp044_1_otros_ant.4rp b/PROYECTO/bin/noprrp044_1_otros_ant.4rp index 0e406db..96f40ed 100644 --- a/PROYECTO/bin/noprrp044_1_otros_ant.4rp +++ b/PROYECTO/bin/noprrp044_1_otros_ant.4rp @@ -16,7 +16,7 @@ - + diff --git a/PROYECTO/bin/noprrp044_2.4rp b/PROYECTO/bin/noprrp044_2.4rp index 232d45a..ee41fdc 100644 --- a/PROYECTO/bin/noprrp044_2.4rp +++ b/PROYECTO/bin/noprrp044_2.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/pretiqueta4x3.4rp b/PROYECTO/bin/pretiqueta4x3.4rp index c061e68..ede0b57 100644 --- a/PROYECTO/bin/pretiqueta4x3.4rp +++ b/PROYECTO/bin/pretiqueta4x3.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/prprmt003.4rp b/PROYECTO/bin/prprmt003.4rp index 422079d..ec046ee 100644 --- a/PROYECTO/bin/prprmt003.4rp +++ b/PROYECTO/bin/prprmt003.4rp @@ -18,7 +18,7 @@ - + diff --git a/PROYECTO/bin/sendemail.4rp b/PROYECTO/bin/sendemail.4rp index d12e5f9..9faac85 100644 --- a/PROYECTO/bin/sendemail.4rp +++ b/PROYECTO/bin/sendemail.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/svprmt001.4rp b/PROYECTO/bin/svprmt001.4rp index 8dabd65..dcf4acb 100644 --- a/PROYECTO/bin/svprmt001.4rp +++ b/PROYECTO/bin/svprmt001.4rp @@ -13,7 +13,7 @@ - + diff --git a/PROYECTO/bin/vefactura.4rp b/PROYECTO/bin/vefactura.4rp index 7c47aa8..a1bbf27 100644 --- a/PROYECTO/bin/vefactura.4rp +++ b/PROYECTO/bin/vefactura.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/vefactura_1.4rp b/PROYECTO/bin/vefactura_1.4rp index aa0bd50..fbc64e6 100644 --- a/PROYECTO/bin/vefactura_1.4rp +++ b/PROYECTO/bin/vefactura_1.4rp @@ -16,7 +16,7 @@ - + diff --git a/PROYECTO/bin/veprcs001.4rp b/PROYECTO/bin/veprcs001.4rp index 35e4059..c736778 100644 --- a/PROYECTO/bin/veprcs001.4rp +++ b/PROYECTO/bin/veprcs001.4rp @@ -20,7 +20,7 @@ - + diff --git a/PROYECTO/bin/veprmt022.4rp b/PROYECTO/bin/veprmt022.4rp index 2112d0d..180edb0 100644 --- a/PROYECTO/bin/veprmt022.4rp +++ b/PROYECTO/bin/veprmt022.4rp @@ -21,7 +21,7 @@ - + diff --git a/PROYECTO/bin/veprmt022_1.4rp b/PROYECTO/bin/veprmt022_1.4rp index c2f3b5e..99442c2 100644 --- a/PROYECTO/bin/veprmt022_1.4rp +++ b/PROYECTO/bin/veprmt022_1.4rp @@ -19,7 +19,7 @@ - + diff --git a/PROYECTO/bin/veprmt049.4rp b/PROYECTO/bin/veprmt049.4rp index e9733f7..1b79ee2 100644 --- a/PROYECTO/bin/veprmt049.4rp +++ b/PROYECTO/bin/veprmt049.4rp @@ -15,7 +15,7 @@ - + diff --git a/PROYECTO/bin/veprmt049_GR.4rp b/PROYECTO/bin/veprmt049_GR.4rp index 7d068c2..2bb181f 100644 --- a/PROYECTO/bin/veprmt049_GR.4rp +++ b/PROYECTO/bin/veprmt049_GR.4rp @@ -13,7 +13,7 @@ - + diff --git a/PROYECTO/bin/veprrp049 (copy).4rp b/PROYECTO/bin/veprrp049 (copy).4rp index 7d68e9e..359e650 100644 --- a/PROYECTO/bin/veprrp049 (copy).4rp +++ b/PROYECTO/bin/veprrp049 (copy).4rp @@ -13,7 +13,7 @@ - + diff --git a/PROYECTO/bin/veprrp049.4rp b/PROYECTO/bin/veprrp049.4rp index e61a681..a5ad784 100644 --- a/PROYECTO/bin/veprrp049.4rp +++ b/PROYECTO/bin/veprrp049.4rp @@ -13,7 +13,7 @@ - + diff --git a/PROYECTO/bin/veprrp049back.4rp b/PROYECTO/bin/veprrp049back.4rp index bac305f..54f636a 100644 --- a/PROYECTO/bin/veprrp049back.4rp +++ b/PROYECTO/bin/veprrp049back.4rp @@ -13,7 +13,7 @@ - + diff --git a/PROYECTO/cgdir/cgfmrp013.4fd b/PROYECTO/cgdir/cgfmrp013.4fd index 402e398..11e0a95 100644 --- a/PROYECTO/cgdir/cgfmrp013.4fd +++ b/PROYECTO/cgdir/cgfmrp013.4fd @@ -4,7 +4,7 @@ - +
@@ -27,7 +27,7 @@
@@ -899,6 +900,10 @@ + + + +
diff --git a/PROYECTO/nodir/noprmt026.4gl b/PROYECTO/nodir/noprmt026.4gl index 085541f..3b3df80 100644 --- a/PROYECTO/nodir/noprmt026.4gl +++ b/PROYECTO/nodir/noprmt026.4gl @@ -20,7 +20,9 @@ DEFINE rcol,arch_pc,prog STRING, d_tipos,mensaje,f_tipos,filepath,p_res,res,fila,val STRING DEFINE usuarios,clave CHAR(80), - FILE,nombre_cia STRING + FILE,nombre_cia STRING, + celdas DICTIONARY OF STRING, + maxfila,maxcol INTEGER END GLOBALS MAIN @@ -49,7 +51,7 @@ DEFINE ptss RECORD departamento INT, valor_isr DEC(12,2) END RECORD, - fecha_inicial,fecha_final DATE, + fecha_inicial,fecha_final,fecha_sig DATE, kano,kmes, cnt,numero_msg SMALLINT, cels CHAR(40), filename,sysos CHAR(200), @@ -79,7 +81,7 @@ DEFINE ptss RECORD AFTER FIELD kmes LET selec = - "SELECT CONVERT(CHAR(10),MIN(a.fecha_del),103) ,CONVERT(CHAR(10),MAX(a.fecha_al),103) ", + "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 @@ -98,6 +100,8 @@ DEFINE ptss RECORD 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 @@ -144,7 +148,7 @@ DEFINE ptss RECORD 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,convert(char(10),b.fech_nac,103),", + " 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 ", @@ -154,8 +158,8 @@ DEFINE ptss RECORD " 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 ", - " convert(char(10), a.fecha,101) between '",fecha_inicial USING "mm/dd/yyyy", - "' and '",fecha_final using "mm/dd/yyyy","' and b.nomina = 'Q' ", + " 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 @@ -176,7 +180,7 @@ DEFINE ptss RECORD 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,convert(char(10),b.fech_nac,103),", + " 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 ", @@ -186,8 +190,8 @@ DEFINE ptss RECORD #" 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 ", - " convert(char(10), a.fecha,101) between '",fecha_inicial USING "mm/dd/yyyy", - "' and '",fecha_final using "mm/dd/yyyy","' and b.nomina = 'Q' ", + " 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 @@ -197,7 +201,7 @@ DEFINE ptss RECORD LET cuenta = 0 IF tipo_reporte = 'NOR' THEN - FOREACH busca INTO ptss.* + FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt @@ -240,7 +244,7 @@ DEFINE ptss RECORD LET col = 9 LET fila = cnt - LET val = ptss.fecha_n + LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 10 @@ -253,7 +257,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO ptss.valor_isr FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final 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 @@ -267,7 +271,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final 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 @@ -275,7 +279,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO valor_vacaciones FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final 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 @@ -305,7 +309,7 @@ DEFINE ptss RECORD SELECT SUM(a.valor) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final AND + a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov in (32) @@ -333,7 +337,7 @@ DEFINE ptss RECORD ELSE #BONI CANCELADOS IF tipo_reporte = "BON1" THEN - FOREACH busca INTO ptss.* + FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt @@ -368,7 +372,7 @@ DEFINE ptss RECORD LET col = 8 LET fila = cnt - LET val = ptss.fecha_n + LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 9 @@ -392,32 +396,82 @@ DEFINE ptss RECORD END IF - CALL fgl_winmessage("INFO","REPROTE TERMINADO","INFO") + 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,xval,xcelda STRING - - DISPLAY "enviado ",xfila," c ",xcol," v ",xval - - LET xcelda = fila_office CLIPPED,xfila CLIPPED,"C",xcol CLIPPED - DISPLAY "celda ",xcelda - LET xval=xval CLIPPED - CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,xcelda,xval], [res] ); - CALL checkError(res) + 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 ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] ); - CALL checkError(res) - + CALL celdas.clear() + LET maxfila = 0 + LET maxcol = 0 END FUNCTION FUNCTION conectarDDE() - CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [res] ) - CALL checkError(res) + CALL celdas.clear() + LET maxfila = 0 + LET maxcol = 0 +END FUNCTION +-- Escribe las celdas acumuladas en FGLSPOOL/noprmt026__.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) From 0991743a80e5e67a3c3129fb7d3fe1dcfb1b01dd Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Fri, 16 Oct 2026 16:50:08 -0400 Subject: [PATCH 10/14] JSOTO QA G6 (.250): arreglos en reportes de Repuestos y Contabilidad Repuestos (irdir): - irprrp002: cod_sec USING '&&&&' (con '&&&' salia *** en sec >= 1000); encabezado con companias.nombre (estaba fijo "EUROSTONE"). - irprrp003: filtro de fecha real con parametros (antes CONVERT(...,103) BETWEEN texto: traia movimientos de cualquier ano); codigo CHAR(8)/'&&&&' (los sec >= 1000 se mezclaban en un mismo grupo y saldo); RIGHT MARGIN 170 (saldo y balance cortados). - irprrp004: CONSTRUCT sobre irtb00005.cod_mov (antes intb00005: fallaba con filtro). - irprrp006: JOIN b.cod_n = c.cod_n (antes c.cod_n = c.cod_n). - irprrp009: CONSTRUCT calificado con b. (columnas ambiguas en el JOIN). - irprrp045: sin departamento solo muestra los departamentos del usuario (adtb00056). Contabilidad (cgdir): - cgprrp014: saldo de apertura acreedor va positivo a la columna CR (restaba en totales). - cgprrp009: ya no modifica cgtb00004 (UPDATE departamento=0 y reversion); el NULL se trata como 0 en las consultas; corrige idx1 (START REPORT se repetia por fila). - cgprcs024: el acumulado anterior termina el dia antes de "desde" (se contaba doble). Co-Authored-By: Claude Opus 5.5 --- PROYECTO/cgdir/cgprcs024.4gl | 2 +- PROYECTO/cgdir/cgprrp009.4gl | 23 +++++++++++------------ PROYECTO/cgdir/cgprrp014.4gl | 2 +- PROYECTO/irdir/irprrp002.4gl | 4 ++-- PROYECTO/irdir/irprrp003.4gl | 22 ++++++++++++---------- PROYECTO/irdir/irprrp004.4gl | 2 +- PROYECTO/irdir/irprrp006.4gl | 4 ++-- PROYECTO/irdir/irprrp009.4gl | 5 ++++- PROYECTO/irdir/irprrp045.4gl | 16 ++++++++++------ 9 files changed, 44 insertions(+), 36 deletions(-) diff --git a/PROYECTO/cgdir/cgprcs024.4gl b/PROYECTO/cgdir/cgprcs024.4gl index 2c02c9b..be025e9 100644 --- a/PROYECTO/cgdir/cgprcs024.4gl +++ b/PROYECTO/cgdir/cgprcs024.4gl @@ -126,7 +126,7 @@ FUNCTION cgprcs024() FROM cgtb00004 a WHERE (a.ref =a.ref AND a.tipo<>3) AND (a.cuenta_no = gastos[idx].cuenta_no) AND - (a.fecha BETWEEN fecha_ini_act AND fecha.desde ) AND + (a.fecha >= fecha_ini_act AND a.fecha < fecha.desde) AND -- antes BETWEEN ... AND desde: el dia 'desde' se sumaba tambien en el rango (doble) (a.departamento = cdepartamentos) AND a.status_t is NULL --227-1322-2108 diff --git a/PROYECTO/cgdir/cgprrp009.4gl b/PROYECTO/cgdir/cgprrp009.4gl index dfdfbbe..bf472b4 100644 --- a/PROYECTO/cgdir/cgprrp009.4gl +++ b/PROYECTO/cgdir/cgprrp009.4gl @@ -127,20 +127,21 @@ END MAIN # (7) y tienen el departamento nulo. # Este UPDATE se reversa al momento de acabar el reporte - UPDATE cgtb00004 set departamento = 0 - WHERE departamento is null and cuenta_no[1] = "7" + -- G6: antes UPDATE cgtb00004 SET departamento = 0 (y al final lo revertia a NULL): modificaba + -- el mayor real, no se revertia si no habia datos y convertia en NULL los 0 legitimos. + -- Ahora el departamento nulo se trata como 0 en las consultas (ISNULL/NVL). DELETE FROM cgtb00016 WHERE ano =p_ano AND mes = p_mes AND programa='cgprrp013.4rp' AND estado_a <> '275' LET selec = - "SELECT distinct a.cuenta_no,b.descripcion,d.dpto,a.departamento,c.nom_dpto ", + "SELECT distinct a.cuenta_no,b.descripcion,d.dpto,ISNULL(a.departamento,0),c.nom_dpto ", "FROM cgtb00001 b, cgtb00004 a, chequeo d,adtb00001 c ", "WHERE (a.cuenta_no = b.cuenta_no) AND (SUBSTRING(b.cuenta_no,1,1) = '7') AND ", - " (a.departamento = d.departamento) AND a.status_t IS NULL AND ", - " (a.departamento = c.departamento) AND ", + " (ISNULL(a.departamento,0) = d.departamento) AND a.status_t IS NULL AND ", + " (ISNULL(a.departamento,0) = c.departamento) AND ", " (a.fecha <= ?) AND b.status_t is null AND ",criterio CLIPPED, - "ORDER BY d.dpto,a.departamento,a.cuenta_no" + "ORDER BY d.dpto,ISNULL(a.departamento,0),a.cuenta_no" DISPLAY "<<>>" AT 19,14 ATTRIBUTE(blue) @@ -189,12 +190,10 @@ END MAIN END IF OUTPUT TO REPORT gastos_gral(gastos.*,fecha_inicial,fecha_final,p_ano, ano_ant) - LET idx1 = idx+1 + LET idx1 = idx1+1 -- antes idx+1: idx1 no avanzaba y START REPORT se repetia por fila END FOREACH IF idx1 > 1 THEN FINISH REPORT gastos_gral - UPDATE cgtb00004 set departamento = NULL - WHERE departamento = 0 and cuenta_no[1] = "7" ELSE CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS","INFO") END IF @@ -314,18 +313,18 @@ REPORT gastos_gral(x,fecha1,fecha2,p_ano1,ano_ant1) FROM cgtb00004 a WHERE (a.ref NOT MATCHES "ED.99-999/12*") and (a.cuenta_no = x.cuenta_no) and (a.fecha BETWEEN fecha4 AND fecha5) and - (a.departamento = x.departamento) and a.status_t is null + (a.departamento = x.departamento OR (a.departamento IS NULL AND x.departamento = 0)) and a.status_t is null SELECT SUM(a.debito-a.credito) INTO x.valor FROM cgtb00004 a WHERE (a.cuenta_no = x.cuenta_no) and (a.fecha BETWEEN fecha_inicial AND fecha_final) and - (a.departamento = x.departamento) and a.status_t is null + (a.departamento = x.departamento OR (a.departamento IS NULL AND x.departamento = 0)) and a.status_t is null SELECT SUM(a.debito-a.credito) INTO x.valor_ant FROM cgtb00004 a WHERE (a.ref != ent_diario) and (a.cuenta_no = x.cuenta_no) and (a.fecha < fecha_inicial) and - (a.departamento = x.departamento) and a.status_t is null + (a.departamento = x.departamento OR (a.departamento IS NULL AND x.departamento = 0)) and a.status_t is null IF x.ano_ante is null THEN LET x.ano_ante = 0 diff --git a/PROYECTO/cgdir/cgprrp014.4gl b/PROYECTO/cgdir/cgprrp014.4gl index 054afc3..935bb99 100644 --- a/PROYECTO/cgdir/cgprrp014.4gl +++ b/PROYECTO/cgdir/cgprrp014.4gl @@ -302,7 +302,7 @@ REPORT mayor_ref(x,fecha1,fecha2) LET total1 = balance LET total2 = 0 ELSE - LET total2 = balance + LET total2 = balance * -1 -- saldo acreedor va POSITIVO a la columna CR (antes negativo: restaba en los totales) LET total1 = 0 END IF IF balance != 0 OR balance_final != 0 THEN diff --git a/PROYECTO/irdir/irprrp002.4gl b/PROYECTO/irdir/irprrp002.4gl index e18bb62..5c376d0 100644 --- a/PROYECTO/irdir/irprrp002.4gl +++ b/PROYECTO/irdir/irprrp002.4gl @@ -210,7 +210,7 @@ END FUNCTION LET hora = time PRINT COLUMN 3, comp_off,negrillas_on PRINT COLUMN 1, "irprrp002", - COLUMN 17, " E U R O S T O N E, S. A.", + COLUMN 31, p_companias.nombre CLIPPED, -- antes "E U R O S T O N E" fijo COLUMN 75, "Pag. ",pageno using "###" PRINT COLUMN 17, " Sistema de Inventario de Repuestos ", COLUMN 75, today using "dd/mm/yyyy" @@ -259,7 +259,7 @@ END FUNCTION END IF PRINT COLUMN 1, x.cod_n USING "&","-",x.cod_grupo USING "&&","-", - x.cod_tipo USING "&&","-",x.cod_sec USING "&&&"," ", + x.cod_tipo USING "&&","-",x.cod_sec USING "&&&&"," ", -- &&& daba *** con sec >= 1000 x.descrip_esp CLIPPED," ",x.descrip_ing, COLUMN 91, x.unidad_med, COLUMN 100, x.dia_llegada using "###", diff --git a/PROYECTO/irdir/irprrp003.4gl b/PROYECTO/irdir/irprrp003.4gl index bf32803..62a9163 100644 --- a/PROYECTO/irdir/irprrp003.4gl +++ b/PROYECTO/irdir/irprrp003.4gl @@ -43,7 +43,7 @@ FUNCTION irprrp03() cantidad_2 LIKE irtb00006.cantidad_2, cod_mov LIKE irtb00006.cod_mov, descrip_mov LIKE irtb00005.descrip_mov, - codigo CHAR(7), + codigo CHAR(8), balance_in DECIMAL(12,2) END RECORD @@ -107,7 +107,9 @@ LET selec = "FROM irtb00006 a, irtb00002 b, irtb00005 c ", "WHERE ",criterio clipped," AND a.cod_n=b.cod_n AND a.cod_grupo=b.cod_grupo ", "AND a.cod_tipo=b.cod_tipo AND a.cod_sec=b.cod_sec AND c.cod_mov=a.cod_mov ", - "AND b.status_t is NULL AND CONVERT(CHAR(10),a.fecha,103) between '", datos_cons.fech_in USING 'dd/mm/yyyy', "' and '",datos_cons.fech_fi USING 'dd/mm/yyyy', "' AND a.status_t IS NULL ", + -- antes CONVERT(CHAR(10),a.fecha,103) BETWEEN 'dd/mm/yyyy' AND ...: comparaba TEXTO y traia + -- movimientos de cualquier ano cuyo dd/mm cayera en el rango -> fecha real con parametros + "AND b.status_t is NULL AND a.fecha BETWEEN ? AND ? AND a.status_t IS NULL ", "ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.fecha" # Abrir el archivo del spool para la impresion @@ -117,17 +119,16 @@ LET selec = DISPLAY selec PREPARE busca FROM selec DECLARE accion CURSOR FOR busca - OPEN accion - + LET selec1 = "SELECT COUNT(*) FROM irtb00006 a, irtb00002 b, irtb00005 c ", "WHERE ",criterio clipped," AND a.cod_n=b.cod_n AND a.cod_grupo=b.cod_grupo ", "AND a.cod_tipo=b.cod_tipo AND a.cod_sec=b.cod_sec AND c.cod_mov=a.cod_mov ", - "AND b.status_t is NULL AND a.fecha between '", datos_cons.fech_in USING 'mm/dd/yyyy', "' and '",datos_cons.fech_fi USING 'mm/dd/yyyy', "' AND a.status_t IS NULL " + "AND b.status_t is NULL AND a.fecha BETWEEN ? AND ? AND a.status_t IS NULL " PREPARE comando1 FROM selec1 DECLARE busca1 CURSOR FOR comando1 - OPEN busca1 + OPEN busca1 USING datos_cons.fech_in, datos_cons.fech_fi FETCH busca1 INTO regi LET p_param = "S" @@ -146,14 +147,14 @@ LET selec1 = # Loop para la busqueda de los movimientos de los codigos especificados - FOREACH accion INTO transacc.* + FOREACH accion USING datos_cons.fech_in, datos_cons.fech_fi INTO transacc.* CALL termometro(regi,p_param) LET p_param = "N" LET transacc.codigo = transacc.cod_n USING "&", transacc.cod_grupo USING "&", transacc.cod_tipo USING "&&", - transacc.cod_sec USING "&&&" + transacc.cod_sec USING "&&&&" -- &&& = *** con sec >= 1000: mezclaba articulos en un grupo LET transacc.balance_in = 0 @@ -185,7 +186,7 @@ END FUNCTION cantidad_2 LIKE irtb00006.cantidad_2, cod_mov LIKE irtb00006.cod_mov, descrip_mov LIKE irtb00005.descrip_mov, - codigo CHAR(7), + codigo CHAR(8), balance_in DECIMAL(12,2) END RECORD @@ -203,6 +204,7 @@ END FUNCTION entrada,salida DECIMAL(12,2) OUTPUT LEFT MARGIN 0 + RIGHT MARGIN 170 -- el balance se imprime hasta la col. 166; con el default (132) GRE lo cortaba ORDER BY x.codigo FORMAT @@ -273,7 +275,7 @@ END FUNCTION PRINT COLUMN 1, x.cod_n USING "&","-", COLUMN 3, x.cod_grupo USING "&","-", COLUMN 5, x.cod_tipo USING "&&","-", - COLUMN 8, x.cod_sec USING "&&&", + COLUMN 8, x.cod_sec USING "&&&&", COLUMN 15, x.descrip_esp, COLUMN 45, x.unidad_med, COLUMN 132, "Inicial ---> ", diff --git a/PROYECTO/irdir/irprrp004.4gl b/PROYECTO/irdir/irprrp004.4gl index 0ae3a4f..8c69005 100644 --- a/PROYECTO/irdir/irprrp004.4gl +++ b/PROYECTO/irdir/irprrp004.4gl @@ -56,7 +56,7 @@ FUNCTION irprrp04() RETURN END IF - CONSTRUCT criterio ON intb00005.cod_mov FROM cod_mov + CONSTRUCT criterio ON irtb00005.cod_mov FROM cod_mov -- antes intb00005 (tabla de MP): con filtro el SQL sobre irtb00005 fallaba IF int_flag THEN LET numero_msg = 2 diff --git a/PROYECTO/irdir/irprrp006.4gl b/PROYECTO/irdir/irprrp006.4gl index e68caf3..8bcfc5e 100644 --- a/PROYECTO/irdir/irprrp006.4gl +++ b/PROYECTO/irdir/irprrp006.4gl @@ -68,7 +68,7 @@ FUNCTION irprrp006() " b.descrip_ing,b.unidad_med,b.exist_min,ISNULL(sum(c.cantidad_2),0) ", "FROM irtb00002 b,irtb00006 c ", "WHERE ",criterio CLIPPED, - " AND (c.cod_n = c.cod_n AND b.cod_Grupo = c.cod_Grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec) ", + " AND (b.cod_n = c.cod_n AND b.cod_Grupo = c.cod_Grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec) ", " AND c.status_t IS NULL " , " AND b.status_t IS NULL ", "GROUP BY b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,b.exist_min,b.descrip_esp,b.descrip_ing,b.unidad_med ", @@ -79,7 +79,7 @@ FUNCTION irprrp006() " b.descrip_ing,b.unidad_med,b.exist_min,ISNULL(sum(c.cantidad_2),0) ", "FROM irtb00002 b,irtb00006 c ", "WHERE ",criterio CLIPPED, - " AND (c.cod_n = c.cod_n AND b.cod_Grupo = c.cod_Grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec) ", + " AND (b.cod_n = c.cod_n AND b.cod_Grupo = c.cod_Grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec) ", " AND c.status_t IS NULL " , " AND b.status_t IS NULL ", "GROUP BY b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,b.exist_min,b.descrip_esp,b.descrip_ing,b.unidad_med ", diff --git a/PROYECTO/irdir/irprrp009.4gl b/PROYECTO/irdir/irprrp009.4gl index 30c3cb7..078ecbe 100644 --- a/PROYECTO/irdir/irprrp009.4gl +++ b/PROYECTO/irdir/irprrp009.4gl @@ -71,7 +71,10 @@ FUNCTION irprrp009() OPEN FORM edfmrp118 FROM "irfmrp009" DISPLAY FORM edfmrp118 - CONSTRUCT BY NAME criterio ON cod_mov,cod_n,cod_grupo,cod_tipo,cod_sec + -- columnas calificadas con b. (irtb00006): sin prefijo, cod_n/cod_grupo/cod_tipo/cod_sec + -- son ambiguas en el JOIN con irtb00002 y cualquier filtro por codigo fallaba + CONSTRUCT criterio ON b.cod_mov,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec + FROM cod_mov,cod_n,cod_grupo,cod_tipo,cod_sec BEFORE CONSTRUCT CALL ircmovimientos() AFTER CONSTRUCT diff --git a/PROYECTO/irdir/irprrp045.4gl b/PROYECTO/irdir/irprrp045.4gl index fef5ba1..7944ec0 100644 --- a/PROYECTO/irdir/irprrp045.4gl +++ b/PROYECTO/irdir/irprrp045.4gl @@ -110,13 +110,16 @@ FUNCTION irprrp045() ##### Selecionando la informacion requerida para la salida de ##### informacion IF departamento IS NULL THEN - LET selec = + -- Sin departamento: solo los departamentos asignados al usuario (adtb00056), igual + -- que el combo; antes dejarlo vacio mostraba el consumo de TODOS los departamentos. + LET selec = "SELECT 'REPUESTOS',a.sec_a as departamento,b.nom_dpto,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, ", " c.descrip_esp,c.unidad_med,a.fecha,a.num_doc,cast(d.cod_mov as char(5))+'-'+d.descrip_mov, a.cantidad_2*-1 ", - "FROM irtb00006 a,adtb00001 b,irtb00002 c,irtb00005 d ", + "FROM irtb00006 a,adtb00001 b,irtb00002 c,irtb00005 d ", "WHERE a.cod_n = c.cod_n AND a.cod_grupo = c.cod_grupo AND ", " a.cod_tipo = c.cod_tipo AND a.cod_sec = c.cod_sec AND ", - " a.cod_mov = d.cod_mov AND d.consumo = 'SI' AND ", + " a.cod_mov = d.cod_mov AND d.consumo = 'SI' AND ", + " a.sec_a IN (SELECT u.departamento_visualiza FROM adtb00056 u WHERE u.usuario = '", usuarios CLIPPED, "') AND ", " a.sec_a = b.departamento AND a.status_t is NULL AND ", " a.fecha BETWEEN ? AND ? AND a.cantidad_2 < 0 AND ", criterio CLIPPED , @@ -126,12 +129,13 @@ IF departamento IS NULL THEN "FROM intb00006 a,adtb00001 b,intb00001 c,intb00005 d ", "WHERE a.cod_n = c.cod_n AND a.cod_grupo = c.cod_grupo AND ", " a.cod_tipo = c.cod_tipo AND a.cod_sec = c.cod_sec AND ", - " a.cod_mov = d.cod_mov AND d.consumo = 'SI' AND ", + " a.cod_mov = d.cod_mov AND d.consumo = 'SI' AND ", + " a.depto_a IN (SELECT u.departamento_visualiza FROM adtb00056 u WHERE u.usuario = '", usuarios CLIPPED, "') AND ", " a.depto_a = b.departamento AND a.status_t is NULL AND ", " a.fecha BETWEEN ? AND ? AND a.cantidad_2 < 0 AND ", criterio CLIPPED, - - " ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec" + + " ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec" ELSE LET selec = "SELECT 'REPUESTOS',a.sec_a as departamento,b.nom_dpto,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, ", From b8f403c2e43585db0597eb1f5b4ef8ea4e406892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Fri, 16 Oct 2026 16:53:41 -0400 Subject: [PATCH 11/14] Proyecto: elimina el grupo NOMINA vacio de MODULOS El grupo estaba vacio (despues de MATERIA PRIMA) y no se usara; los programas de nomina viven en RECURSOS HUMANOS > NOMINA. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/mbsERP.4pw | 2 -- 1 file changed, 2 deletions(-) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 255663d..0062bf5 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -469,8 +469,6 @@ - - From a52b16b8b2676cfdd930df254858d3a2624e2a6f Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 16 Oct 2026 17:00:54 -0400 Subject: [PATCH 12/14] ipprmt005 (Clase): graba Inventario y oculta clases eliminadas - Alta y modificacion ahora graban cod_inv (Inventario); antes se leia en la consulta pero nunca se guardaba (igual en el 42m de produccion 3.20). - La consulta excluye las clases con status_t = 'E' (eliminadas) y lee status_t, para que al consultar una eliminada salga REGISTRO NO EXISTE y funcione el control de Escoger sobre registros anulados. - Impresora se deja sin tocar, como en 3.20: el combo no tiene opciones (tampoco en produccion) y guardarlo borraria valores existentes (80-83) que usa veconvierteorden para rutear impresion de ordenes. - Configuracion de ejecucion con el usuario de la responsable (antes usaba el de jsoto, por eso grababa ese usuario como creador/modificador). Verificado: consulta de clase eliminada (211) da REGISTRO NO EXISTE; alta (212) graba Inventario y usuario jpeguero. Pendiente: probar Escoger y eLiminar con la nueva version y confirmar en produccion que cod_inv solo usa los valores del combo. Co-Authored-By: Claude Opus 5.5 --- PROYECTO/ipdir/ipprmt005.4gl | 21 +++++++++++---------- PROYECTO/mbsERP.4pw | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/PROYECTO/ipdir/ipprmt005.4gl b/PROYECTO/ipdir/ipprmt005.4gl index 7a7d25f..66a79a8 100644 --- a/PROYECTO/ipdir/ipprmt005.4gl +++ b/PROYECTO/ipdir/ipprmt005.4gl @@ -79,8 +79,8 @@ FUNCTION ippcad012() LET p_iptb20.cod_n = p_iptb20.cod_n + 1 DISPLAY p_iptb20.cod_n TO cod_n BEGIN WORK - INSERT INTO iptb00020 (cod_n,producto,us_crea,fech_crea,comentario,genera_orden,instalacion) - VALUES (p_iptb20.cod_n,p_iptb20.producto,usuarios,getdate(),p_iptb20.comentario,p_iptb20.genera_orden,p_iptb20.instalacion) + INSERT INTO iptb00020 (cod_n,producto,us_crea,fech_crea,comentario,genera_orden,instalacion,cod_inv) + VALUES (p_iptb20.cod_n,p_iptb20.producto,usuarios,getdate(),p_iptb20.comentario,p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.cod_inv) INSERT INTO iptb00035 (cod_n,cod_cat) VALUES (p_iptb20.cod_n,p_iptb20.cod_cat) COMMIT WORK @@ -108,8 +108,8 @@ SET CONNECTION "MSSQL" EXIT CONSTRUCT END CONSTRUCT LET SELEC = " SELECT DISTINCT a.cod_n,a.producto,a.us_crea,a.us_mod,a.fech_crea,a.fech_mod,a.cod_inv,b.cod_cat, - a.comentario,a.genera_orden,a.instalacion FROM iptb00020 a LEFT OUTER JOIN iptb00035 b ON a.cod_n = b.cod_n ", - " WHERE ", + a.comentario,a.genera_orden,a.instalacion,a.status_t FROM iptb00020 a LEFT OUTER JOIN iptb00035 b ON a.cod_n = b.cod_n ", + " WHERE a.status_t IS NULL AND ", criterio clipped, " ORDER BY a.cod_n" @@ -119,7 +119,7 @@ SET CONNECTION "MSSQL" FETCH FIRST datos INTO p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, p_iptb20.fech_mod,p_iptb20.cod_inv, p_iptb20.cod_cat,p_iptb20.comentario, - p_iptb20.genera_orden,p_iptb20.instalacion + p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.status_t IF status >= 0 THEN IF STATUS = NOTFOUND THEN @@ -140,7 +140,7 @@ SET CONNECTION "MSSQL" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, p_iptb20.fech_mod,p_iptb20.cod_inv, p_iptb20.cod_cat,p_iptb20.comentario, - p_iptb20.genera_orden,p_iptb20.instalacion + p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.status_t IF STATUS = NOTFOUND THEN @@ -157,7 +157,7 @@ SET CONNECTION "MSSQL" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, p_iptb20.fech_mod,p_iptb20.cod_inv, p_iptb20.cod_cat,p_iptb20.comentario, - p_iptb20.genera_orden,p_iptb20.instalacion + p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.status_t IF STATUS = NOTFOUND THEN @@ -174,7 +174,7 @@ SET CONNECTION "MSSQL" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, p_iptb20.fech_mod,p_iptb20.cod_inv, p_iptb20.cod_cat,p_iptb20.comentario, - p_iptb20.genera_orden,p_iptb20.instalacion + p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.status_t DISPLAY BY NAME p_iptb20.*,p_iptb20.cod_cat @@ -185,7 +185,7 @@ SET CONNECTION "MSSQL" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, p_iptb20.fech_mod,p_iptb20.cod_inv, p_iptb20.cod_cat,p_iptb20.comentario, - p_iptb20.genera_orden,p_iptb20.instalacion + p_iptb20.genera_orden,p_iptb20.instalacion,p_iptb20.status_t DISPLAY BY NAME p_iptb20.cod_n,p_iptb20.producto,p_iptb20.us_crea,p_iptb20.us_mod,p_iptb20.fech_crea, @@ -203,7 +203,7 @@ SET CONNECTION "MSSQL" CALL msg(36) EXIT MENU END IF - INPUT BY NAME p_iptb20.producto,p_iptb20.cod_cat,p_iptb20.comentario,p_iptb20.genera_orden,p_iptb20.instalacion WITHOUT DEFAULTS + INPUT BY NAME p_iptb20.producto,p_iptb20.cod_inv,p_iptb20.comentario,p_iptb20.cod_cat,p_iptb20.genera_orden,p_iptb20.instalacion WITHOUT DEFAULTS AFTER INPUT @@ -222,6 +222,7 @@ SET CONNECTION "MSSQL" BEGIN WORK UPDATE iptb00020 SET producto = p_iptb20.producto, comentario = p_iptb20.comentario, + cod_inv = p_iptb20.cod_inv, genera_orden = p_iptb20.genera_orden, us_mod = SUSER_SNAME(), fech_mod = GETDATE() , diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 502b77a..8088842 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -678,7 +678,7 @@ - + From f363390589a8d3fcffada9688202fd68c32be310 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Fri, 16 Oct 2026 17:05:01 -0400 Subject: [PATCH 13/14] JSOTO cgprmt022 adaptado a MARMOTECH y cgprmt037 fuera del proyecto MBS cgprmt022 (actualizacion de tasa mensual, cgtb00084; la usa edprrp116): - La fuente era la version de EXTERIOR, donde vetb00060/vetb00061 estan invertidas respecto a marmotech: el combo de moneda ahora sale de vetb00061 y los tipos de cliente de vetb00060. - SELECT INTO tenia 5 columnas para 4 variables. - Se quita la segunda escritura a marmotech.dbo.cgtb00084 (en marmotech es la misma tabla). - cgfmmt022.4fd: formulario de EXTERIOR (campo Replicar y tabla de tipos de cliente); el de MARMOTECH (2022) no tenia esos campos (-1102). mbsERP.4pw: se quita la aplicacion cgprmt037 y sus formularios cgfmmt037/cgfmwd006 (solo los usaba ese programa). Pertenece al proyecto EXTERIOR (sistema de tablas de la BD exterior, aun no iniciado); las fuentes quedan en cgdir. Co-Authored-By: Claude Opus 5.5 --- PROYECTO/cgdir/cgfmmt022.4fd | 71 +++++++++++++++++++----------------- PROYECTO/cgdir/cgprmt022.4gl | 21 ++++------- PROYECTO/mbsERP.4pw | 7 ---- 3 files changed, 45 insertions(+), 54 deletions(-) diff --git a/PROYECTO/cgdir/cgfmmt022.4fd b/PROYECTO/cgdir/cgfmmt022.4fd index 3b536d8..e0272f1 100644 --- a/PROYECTO/cgdir/cgfmmt022.4fd +++ b/PROYECTO/cgdir/cgfmmt022.4fd @@ -1,5 +1,5 @@ - + @@ -7,41 +7,46 @@ - - + + - - - + + + -
- - - - - - -
-
-
- - - - -
+ + +
- +
\ No newline at end of file diff --git a/PROYECTO/cgdir/cgprmt022.4gl b/PROYECTO/cgdir/cgprmt022.4gl index 2e95654..3ed6574 100644 --- a/PROYECTO/cgdir/cgprmt022.4gl +++ b/PROYECTO/cgdir/cgprmt022.4gl @@ -60,7 +60,8 @@ FUNCTION cgprmt022() ON CHANGE tasa DECLARE busca_tipos CURSOR for - SELECT DISTINCT a.tipo_cliente FROM vetb00061 a WHERE a.ventas = mtasa.ventas AND a.tipo_cliente > 14 + -- En marmotech vetb00060 = tipo_cliente x moneda (en EXTERIOR es al reves: vetb00061) + SELECT DISTINCT a.tipo_cliente FROM vetb00060 a WHERE a.ventas = mtasa.ventas AND a.tipo_cliente > 14 LET i =1 FOREACH busca_tipos INTO clientes[i].* @@ -82,7 +83,7 @@ FUNCTION cgprmt022() CALL msg(16) NEXT FIELD tasa END IF - SELECT DISTINCT a.ano,a.mes,a.ventas,a.tipo_cliente,a.tasa + SELECT DISTINCT a.ano,a.mes,a.ventas,a.tipo_cliente INTO mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1 FROM cgtb00084 a WHERE a.ano = mtasa.ano AND a.mes = mtasa.mes AND a.ventas = mtasa.ventas AND a.tipo_cliente = clientes[i].tipo_cliente1 @@ -101,17 +102,9 @@ FUNCTION cgprmt022() END IF - # PARA LA BASE DE DATOS MARMOTECH - EXECUTE selecciona USING mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1 - - IF STATUS = NOTFOUND THEN - IF clientes[i].tipo_cliente1 IS NOT NULL THEN - EXECUTE adicionar USING mtasa.ano,mtasa.mes,clientes[i].tipo_cliente1,mtasa.ventas,mtasa.tasa - END IF - ELSE - EXECUTE actual USING mtasa.tasa,mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1 - END IF - + -- (la version EXTERIOR repetia aqui el INSERT/UPDATE en marmotech.dbo.cgtb00084; + -- conectado a marmotech es la misma tabla: se quito la doble escritura) + END IF END FOR LET pano = mtasa.ano @@ -144,7 +137,7 @@ FUNCTION cventas() LET pventas = ui.combobox.forname("formonly.ventas") DECLARE bventas CURSOR FOR - SELECT a.ventas,a.descripcion FROM vetb00060 a + SELECT a.ventas,a.descripcion FROM vetb00061 a -- monedas en marmotech CALL pventas.clear() FOREACH bventas INTO kventas,dventas diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 3b22743..5f360ba 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -221,11 +221,6 @@
- - - - - @@ -442,8 +437,6 @@ - -
From f6e41932b135148a0778eae4b02ed7da1328c890 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Sat, 17 Oct 2026 12:05:43 -0400 Subject: [PATCH 14/14] prprmt011 (Administracion Ordenes): formularios faltantes y fechas -1205 - Registra en FORMULARIOS_PR los formularios que el programa y sus librerias abren y no estaban en el proyecto: prfmmt011b, prfmmt011c, prfmwd015, prfmcs002, prfmmt021b/c/d, prfmwd002, prfmwd012, prfmwd013. - prfmmt012 registrado era el de ccdir (otro formulario con el mismo nombre); se reemplaza por PRDIR/prfmmt012.4fd (campos iguales al 42f de produccion). - Rescata otrodir/existenciaalmacenes.4fd del respaldo PROYECTOS y lo registra en FUNCIONES_PR junto a existenciaalmacenes.4gl. - prfmwd014.per: s_llegada[9] -> [5]; la pantalla dibuja 5 filas y el formulario no compilaba (-2029). Tampoco existia compilado en produccion. - Quita CONVERT(...,103) en 8 lecturas que llenan campos DATE (consulta principal, fecha_llegada, parciales y datos de cotizacion); con dias >12 el programa terminaba con error al buscar. Se dejan los CONVERT que llenan campos CHAR(10). - Titulo de ventana "Administracion Ordenes". Verificado: busqueda 01/07/2026-02/07/2026 trae 189 lineas con colores; botones transacciones y Requisicion funcionan. Pendiente probar Existencia, flujo, Documentos, fllegada, parciales, visualiza_log, Reporte Data e Informe. Nota: un mes completo (3,105 lineas) tarda varios minutos por las consultas por linea (diseno original). Pendiente Johnny: FORMULARIOS_PR no compila completo por prfmmt006 (columna prtb00007.orden_pedido inexistente) y msgfmwd001 (msgrp000) no tiene fuente en ningun lado. Co-Authored-By: Claude Opus 5.5 --- PROYECTO/PRDIR/prprmt011.4gl | 13 ++++---- PROYECTO/mbsERP.4pw | 13 +++++++- PROYECTO/otrodir/existenciaalmacenes.4fd | 38 ++++++++++++++++++++++++ PROYECTO/vedir/prfmwd014.per | 2 +- 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 PROYECTO/otrodir/existenciaalmacenes.4fd diff --git a/PROYECTO/PRDIR/prprmt011.4gl b/PROYECTO/PRDIR/prprmt011.4gl index 693b54c..ec806e4 100644 --- a/PROYECTO/PRDIR/prprmt011.4gl +++ b/PROYECTO/PRDIR/prprmt011.4gl @@ -140,6 +140,7 @@ FUNCTION prprmt011() --fechaSolDespacho OPEN WINDOW prfmmt011 AT 10,10 WITH FORM "prfmmt011" + CALL ui.Window.getCurrent().setText("Administracion Ordenes") #WHENEVER ERROR CONTINUE LET w = ui.Window.getCurrent() @@ -201,7 +202,7 @@ FUNCTION prprmt011() IF busqueda IS NULL THEN LET selec1 = " SELECT 'N', x.cerrada, x1.estado_produccion,x1.estado_producto,x1.departamento,x3.nom_dpto,RTRIM(CAST(x.sec_vend AS CHAR)) + ' ' + RTRIM(b.nom1_emp), b.apell1_emp, ", - " CONVERT(CHAR(10), x.fecha_oc,103) AS fecha_orden , CONVERT(char(10),x1.fecha_compromiso,103) ,x1.fecha_llegada, x1.fecha_disp_entrega, ", + " x.fecha_oc AS fecha_orden , x1.fecha_compromiso ,x1.fecha_llegada, x1.fecha_disp_entrega, ", " x1.fecha_solic_despacho, x1.fecha_instalacion, x.cotizacion_no, x.num_oc,x5.num_oc, x.observacion,g.descripcion, CAST(e.tipo_cliente AS CHAR(2)) ", " + '-' + CAST(e.sec_cliente AS CHAR(6)) + ' ' + RTRIM(e.nombre) ,x4.descripcion, CAST(x1.cod_n AS VARCHAR(4)) + '-' + CAST(x1.cod_grupo AS VARCHAR(4)) ", " + '-' + CAST(x1.cod_tipo AS VARCHAR(4)) + '-' + CAST(x1.cod_sec AS VARCHAR(7)) + ' ' + RTRIM(x2.descrip_esp), ", @@ -243,7 +244,7 @@ FUNCTION prprmt011() END IF LET selec1 = " SELECT 'N', x.cerrada, x1.estado_produccion,x1.estado_producto,x1.departamento,x3.nom_dpto,RTRIM(CAST(x.sec_vend AS CHAR)) + ' ' + RTRIM(b.nom1_emp), b.apell1_emp, ", - " CONVERT(CHAR(10), x.fecha_oc,103) AS fecha_orden , CONVERT(char(10),x1.fecha_compromiso,103) , + " x.fecha_oc AS fecha_orden , x1.fecha_compromiso , x1.fecha_llegada,x1.fecha_disp_entrega, ", " x1.fecha_solic_despacho, x1.fecha_instalacion, x.cotizacion_no, x.num_oc,x5.num_oc, x.observacion,g.descripcion, CAST(e.tipo_cliente AS CHAR(2)) ", " + '-' + CAST(e.sec_cliente AS CHAR(6)) + ' ' + RTRIM(e.nombre) ,x4.descripcion, CAST(x1.cod_n AS VARCHAR(4)) + '-' + CAST(x1.cod_grupo AS VARCHAR(4)) ", @@ -281,7 +282,7 @@ FUNCTION prprmt011() IF actualiza_log_produccion="SI" THEN LET selec1= " SELECT 'N', x.cerrada, x1.estado_produccion,x1.departamento,x3.nom_dpto,RTRIM(CAST(x.sec_vend AS CHAR)) + ' ' + RTRIM(b.nom1_emp), b.apell1_emp, ", - " CONVERT(CHAR(10), x.fecha_oc,103) AS fecha_orden , CONVERT(char(10),x1.fecha_compromiso,103) ,' ', x.cotizacion_no, x.num_oc, x.observacion,g.descripcion, CAST(e.tipo_cliente AS CHAR(2)) ", + " x.fecha_oc AS fecha_orden , x1.fecha_compromiso ,' ', x.cotizacion_no, x.num_oc, x.observacion,g.descripcion, CAST(e.tipo_cliente AS CHAR(2)) ", " + '-' + CAST(e.sec_cliente AS CHAR(6)) + ' ' + RTRIM(e.nombre) , CAST(x1.cod_n AS VARCHAR(4)) + '-' + CAST(x1.cod_grupo AS VARCHAR(4)) ", " + '-' + CAST(x1.cod_tipo AS VARCHAR(4)) + '-' + CAST(x1.cod_sec AS VARCHAR(4)) + ' ' + RTRIM(x2.descrip_esp), ", " SUM(x1.cantidad), '0' , '0' , '0' , x.sec_vend, x1.cod_n, x1.cod_grupo, x1.cod_tipo, x1.cod_Sec, e.tipo_cliente, e.sec_cliente, ", @@ -440,7 +441,7 @@ FUNCTION prprmt011() IF veces > 1 THEN LET att[idx].col7 = 'blue reverse' ELSE - SELECT CONVERT(CHAR(10),a.fecha_llegada,103) INTO arr_ordenes[idx].fecha_llegada + SELECT a.fecha_llegada INTO arr_ordenes[idx].fecha_llegada FROM cctb00026 a WHERE a.num_oc = arr_ordenes[idx].num_oc AND a.cod_n = arr_ordenes[idx].cod_n AND @@ -1091,7 +1092,7 @@ FUNCTION fparciales(xnum_oc,xcodn,xcodgrupo,xcodtipo,xcodsec,xfecha,xproducto) DECLARE busca_parcial CURSOR FOR - SELECT CONVERT(CHAR(10),a.fecha_compromiso,103),a.cantidad FROM prtb00028 a + SELECT a.fecha_compromiso,a.cantidad FROM prtb00028 a WHERE a.num_oc = xnum_oc AND a.cod_n = xcodn AND a.cod_grupo = xcodgrupo AND @@ -1313,7 +1314,7 @@ FUNCTION vepcmf008(num_cotizacion) LET SELEC = " SELECT DISTINCT a.cod_cia,a.ventas,a.cotizacion_no,a.tipo_cliente,a.sec_cliente,a.nombre_cliente, " || " a.rnc,a.nombre_proyecto,a.direccion_cliente,a.cod_provincia,a.direccion_proyecto, " || " a.telefono_r,a.telefono_o,a.email,a.tipo_precio,a.beeper,a.celular,a.prima,a.fax1,a.celular1, " || - " a.fax, CONVERT(CHAR(10),a.fecha,103),CONVERT(CHAR(10),a.fecha_entrega,103), " || + " a.fax, a.fecha,a.fecha_entrega, " || " a.plazo_entrega,a.comentario,a.contacto, a.cond_pago,a.sec_Vend,a.porc_itbi," || " a.total_bruto,a.sub_total,a.monto_Desc,a.monto_itbi,a.total_neto,a.monto_dolar,a.num_emp_inst, " || " a.codigo_dgii,a.tipo_ncf,a.cliente_generico,a.sec_vend_aux,a.codigo,a.cod_zona,a.sincronizado, "|| diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 90b8326..8c1a66f 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -913,11 +913,21 @@ + + + + + + + + + + - + @@ -929,6 +939,7 @@ + diff --git a/PROYECTO/otrodir/existenciaalmacenes.4fd b/PROYECTO/otrodir/existenciaalmacenes.4fd new file mode 100644 index 0000000..dbdc7f9 --- /dev/null +++ b/PROYECTO/otrodir/existenciaalmacenes.4fd @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + +
+ + +
+ + + +
\ No newline at end of file diff --git a/PROYECTO/vedir/prfmwd014.per b/PROYECTO/vedir/prfmwd014.per index 5cfce84..294297e 100644 --- a/PROYECTO/vedir/prfmwd014.per +++ b/PROYECTO/vedir/prfmwd014.per @@ -20,7 +20,7 @@ X = formonly.fecha,FORMAT="dd/mm/yyyy"; x1 = formonly.num_req,TITLE="REQUISICION"; f1 = formonly.fecha_llegada,TITLE="FECHA LLEGADA"; instructions - screen record s_llegada[9] (fecha_llegada,num_req,fecha) + screen record s_llegada[5] (fecha_llegada,num_req,fecha) delimiters " " end