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