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