{ ----------------------------------------------------------------------------- PROGRAMA : CCPRMT001 OBJETIVO : Mantenimiento de Recibo de Pago y otros Movimientos REALIZADO POR : JUAN SOTO FECHA : Enero 1997 MODIFICACION : El campo cod_emp de la tabla cctb00001 se guarda el codigo de la sucursale quien emite el recibo En el campo costo de la tabla cctb00001 seguarda 1-Si el documento debe salir en el reporte de cobros de la encargada y 0- En caso contrario ----------------------------------------------------------------------------- } GLOBALS "ccprgb000.4gl" 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 -- TRUE/FALSE, to set preview option DEFINE decenas DYNAMIC ARRAY OF CHAR(20) DEFINE centenas DYNAMIC ARRAY OF CHAR(20) DEFINE unidades1 DYNAMIC ARRAY OF CHAR(20) DEFINE valor_cheque1,p_num_doc,xcotizacion,xorden,xfactura_ext,numero_doc INTEGER DEFINE valor_ctrl1,valor_nc,nc_pend,valor_ctrl,p_total, valor_orig,remanente,val_pen,valor_aplicado,valor2 DECIMAL(12,2), psimbolo,pmoneda,valor_letras string DEFINE fecha1 DATE DEFINE nombre_cta CHAR(30) DEFINE tipo_ant,tipo_doc2,tipo_doc1 CHAR(2) DEFINE opc CHAR(1), avance BOOLEAN, navance SMALLINT, ch_itbis char(2), afecta_ex varchar(3), ppaga_itbis,encontre_factura CHAR(1), avance_e DYNAMIC ARRAY OF INT MAIN DEFER INTERRUPT CALL STARTLOG("ccprmt01.log") CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(3) RETURNING impresor CONNECT to "marmotech" AS "IFMX" USER usuarios USING clave CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a SELECT a.sucid,a.sucnombre INTO codigo_sucursal,nombre_sucursal FROM sucursales a,seg0001 b WHERE b.usuario = usuarios AND b.sucid = a.sucid IF STATUS = NOTFOUND THEN CALL fgl_winmessage("ERROR","USTED NO TIENE LOCALIDAD ASIGNADA, CONTACTE ADMINISTRADOR SISTEMAS","STOP") EXIT PROGRAM END IF CALL ccprmt001() END MAIN ####### Funcion para agregar un recibo de pago FUNCTION ccprmt001() OPTIONS FORM LINE 8, ERROR LINE 24, COMMENT LINE 22, PROMPT LINE 23 # CALL pantalla() OPEN FORM ccfmmt001 FROM "ccfmmt001" DISPLAY FORM ccfmmt001 DISPLAY "ccprmt001" AT 4,3 DISPLAY "Movimientos de CXC" AT 6,31 DISPLAY nombre_sucursal TO localidad LET fecha1 = today MENU "OPCION" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" LET INT_FLAG = FALSE CALL ccpcad001() COMMAND "Consultar-modificar" " Busca Registro Cancela Operacion" CALL ccpcmf001() COMMAND "Salir" "Retorna Menu Anterior" EXIT MENU END MENU END FUNCTION FUNCTION ccpcad001() DEFINE emp SMALLINT DEFINE hoy DATE LET hoy = null LABEL volver: LET recibo.fecha_orig = fecha1 LET valor_ctrl = NULL LET tipo_ant = "PG" DISPLAY nombre_sucursal TO localidad INPUT BY NAME recibo.*,valor_ctrl,ch_itbis,aplicacion_antiguas WITHOUT DEFAULTS ## VENTANAS PARA BUSCAR LOS CLIENTES Y LOS EMPLEADOS BEFORE INPUT LET ch_itbis = 'SI' LET aplicacion_antiguas = 'NO' DISPLAY BY NAME ch_itbis BEFORE FIELD num_doc IF recibo.tipo_doc = 'PG' THEN NEXT FIELD tipo_cliente END IF ON KEY (CONTROL-W) CASE WHEN INFIELD(tipo_cliente) CALL consulta_clientes() LET recibo.tipo_cliente = cliente_dir.tipo_cliente LET recibo.sec_cliente = cliente_dir.sec_cliente SELECT a.nombre INTO nom_cli FROM vetb00004 a WHERE a.tipo_cliente = recibo.tipo_cliente and a.sec_cliente = recibo.sec_cliente AND a.status_t IS NULL DISPLAY BY NAME recibo.tipo_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME recibo.sec_cliente ATTRIBUTE(BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) NEXT FIELD cod_emp_sec WHEN INFIELD(sec_cliente) CALL consulta_clientes() LET recibo.tipo_cliente = cliente_dir.tipo_cliente LET recibo.sec_cliente = cliente_dir.sec_cliente SELECT nombre INTO nom_cli FROM vetb00004 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente LET nom_cli = nom_cli CLIPPED," ",recibo.tipo_cliente USING "<<","-",recibo.sec_cliente USING "<<<<<<<" DISPLAY BY NAME recibo.tipo_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME recibo.sec_cliente ATTRIBUTE(BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) NEXT FIELD cod_emp_sec WHEN INFIELD(cod_emp_sec) CALL consulta_empleados() LET recibo.cod_emp_sec = transportista.sec_transp SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec DISPLAY BY NAME recibo.cod_emp_sec ATTRIBUTE (BOLD) LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME nombre_emp ATTRIBUTE (BOLD) NEXT FIELD fecha_orig END CASE { AFTER FIELD deposito IF recibo.cuenta_no is not null THEN IF recibo.deposito is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD deposito END IF SELECT unique num_doc FROM tetb00001 WHERE cuenta_no = recibo.cuenta_no and num_doc = recibo.deposito IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD deposito END IF END IF } ## AQUI SE PREPARA PARA LA CAPTURA DE INFORMACION BEFORE FIELD tipo_doc LET recibo.tipo_doc = tipo_ant AFTER FIELD tipo_doc IF recibo.tipo_doc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_doc END IF LET tipo_ant = recibo.tipo_doc { IF recibo.tipo_doc = "PG" AND recibo.deposito IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD deposito ELSE IF recibo.tipo_doc != "PG" AND recibo.deposito IS NOT NULL THEN LET numero_msg = 192 CALL msg(numero_msg) LET recibo.deposito = null DISPLAY BY NAME recibo.deposito END IF END IF } CASE WHEN recibo.tipo_doc = "PG" LET nombre_tipo = "PAGOS" EXIT CASE WHEN recibo.tipo_doc = "OC" LET nombre_tipo = "OTROS CREDITOS" EXIT CASE WHEN recibo.tipo_doc = "NC" LET nombre_tipo = "NOTA CREDITO" EXIT CASE WHEN recibo.tipo_doc = "ND" LET nombre_tipo = "NOTA DEBITO" EXIT CASE WHEN recibo.tipo_doc = "PI" LET nombre_tipo = "PAGO INTER." EXIT CASE WHEN recibo.tipo_doc = "DV" LET nombre_tipo = "DEVOLUCION DINERO" EXIT CASE END CASE #DISPLAY BY NAME nombre_tipo ATTRIBUTE (BOLD) LET p_nombre_tipo = nombre_tipo #IF recibo.tipo_doc <> "RM" AND recibo.tipo_doc <> 'RC' THEN SELECT a.ult_recibo INTO p_num_doc FROM cctb00003 a WHERE a.tipo_doc = recibo.tipo_doc IF STATUS = NOTFOUND THEN LET p_num_doc = 0 END IF LET p_num_doc = p_num_doc + 1 LET recibo.num_doc = p_num_doc #END IF { AFTER FIELD cuenta_no IF recibo.cuenta_no is not null THEN SELECT descripcion INTO nombre_cta FROM cgtb00001 WHERE cuenta_no = recibo.cuenta_no and status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF DISPLAY BY NAME nombre_cta ATTRIBUTE (blue) END IF } ## CHEQUEA QUE EL REGISTRO NO SE REPITA AFTER FIELD num_doc IF recibo.num_doc IS NULL or recibo.num_doc = 0 THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT UNIQUE a.num_doc FROM cctb00001 a WHERE a.tipo_doc = recibo.tipo_doc AND a.num_doc = recibo.num_doc IF STATUS != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT a.paga_itbis INTO ppaga_itbis FROM vetb00060 a WHERE a.tipo_cliente = recibo.tipo_cliente IF ppaga_itbis = 'N' THEN LET ch_itbis = 'NO' ELSE LET ch_itbis = "SI" END IF ## CHEQUEA QUE EL CLIENTE EXISTA, SI EXISTE DESPLEGA SU NOMBRE AFTER FIELD tipo_cliente IF recibo.tipo_cliente IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF # Controla que el TIPO DE MOVIMIENTO FI solo sea a tipo clientes 13 IF recibo.tipo_doc = "FI" AND recibo.tipo_cliente = 12 THEN LET numero_msg = 240 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF AFTER FIELD sec_cliente IF recibo.sec_cliente IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD sec_cliente END IF SELECT b.nombre,ISNULL(c.calle,' ')+ISNULL(c.casa_num,' ')+ISNULL(c.urbanizacion,' ') +ISNULL(c.barrio,' ') INTO nom_cli,xdireccion FROM vetb00004 b LEFT OUTER JOIN vetb00005 c ON b.tipo_cliente = c.tipo_cliente AND b.sec_cliente = c.sec_cliente WHERE b.tipo_cliente = recibo.tipo_cliente and b.sec_cliente = recibo.sec_cliente IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF LET nom_cli = nom_cli CLIPPED," ",recibo.tipo_cliente USING "<<","-",recibo.sec_cliente USING "<<<<<<<" DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) # BUSCA EL VENDEDOR PARA ESTE CLIENTE SELECT a.sec_vend INTO recibo.cod_emp_sec FROM vetb00028 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente DISPLAY BY NAME recibo.cod_emp_sec IF recibo.cod_emp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD sec_cliente END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec LET nombre_emp = descrip2 CLIPPED," ",descrip3 DISPLAY BY NAME nombre_emp ATTRIBUTE (BOLD) NEXT FIELD fecha_orig AFTER FIELD cod_emp_sec IF recibo.cod_emp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME nombre_emp ATTRIBUTE (BOLD) IF recibo.tipo_doc = "ND" THEN SELECT sec_vend FROM vetb00028 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente IF status != notfound THEN LET numero_msg = 357 CALL msg(numero_msg) END IF END IF ## VERIFICA EL ULTIMO NUMERO DE RECIBO DEL VENDEDOR { IF recibo.tipo_doc = "PG" THEN SELECT ult_recibo INTO p_num_doc FROM cctb00003 WHERE sec_vend = recibo.cod_emp_sec and status_t is null and tipo_doc = "PG" IF status = notfound THEN LET numero_msg = 128 CALL msg(numero_msg) SLEEP 2 RETURN END IF LET p_num_doc = p_num_doc + 1 # Chequea que el recibo del vendedor este fuera de secuencia IF recibo.num_doc != p_num_doc THEN LET numero_msg = 155 CALL msg(numero_msg) NEXT FIELD num_doc END IF DISPLAY BY NAME recibo.num_doc ATTRIBUTE (BOLD) # Controlando que el numero del recibo este dentro de la secuencia # del vendedor SELECT max(sec_de),max(sec_a),max(fecha) INTO relacion.sec_de,relacion.sec_a,relacion.fecha FROM cctb00002 WHERE sec_vend = recibo.cod_emp_sec and status_t is null IF status = notfound THEN LET numero_msg = 123 CALL msg(numero_msg) NEXT FIELD num_doc END IF IF recibo.num_doc < relacion.sec_de OR recibo.num_doc > relacion.sec_a THEN LET numero_msg = 125 CALL msg(numero_msg) NEXT FIELD num_doc END IF END IF} AFTER FIELD fecha_orig IF recibo.fecha_orig IS NULL OR recibo.fecha_orig > TODAY THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = recibo.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF LET fecha1 = recibo.fecha_orig BEFORE FIELD valor_ctrl LET valor_ctrl = null DISPLAY BY NAME valor_ctrl AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec LET nombre_emp = descrip2 CLIPPED," ",descrip3 SELECT a.paga_itbis INTO ppaga_itbis FROM vetb00060 a WHERE a.tipo_cliente = recibo.tipo_cliente IF ppaga_itbis = 'N' THEN LET ch_itbis = 'NO' ELSE LET ch_itbis = "SI" END IF { IF recibo.tipo_doc = "PG" THEN IF recibo.cuenta_no is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF } CALL arr_recibo.clear() IF valor_ctrl IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_ctrl END IF DISPLAY "APL ",aplicacion_antiguas IF aplicacion_antiguas = "SI" THEN CALL aplica_mas_antiguas() END IF EXIT INPUT END INPUT LABEL arreglo1: ## AQUI SE INTRODUCEN LOS DATOS DEL ARREGLO INPUT ARRAY arr_recibo WITHOUT DEFAULTS FROM s_recibo.* BEFORE INPUT IF recibo.tipo_doc="PG" THEN LET curr=arr_curr() LET scr_l = scr_line() CALL busca_avance() RETURNING arr_recibo[curr].num_nc,arr_recibo[curr].valor_pen, arr_recibo[curr].cotizacion_no LET arr_recibo[curr].valor_pag = arr_recibo[curr].valor_pen DISPLAY arr_recibo[curr].num_nc to s_recibo[scr_l].num_nc DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo[curr].valor_pag to s_recibo[scr_l].valor_pag DISPLAY arr_recibo[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo[curr].cotizacion_no to s_recibo[scr_l].cotizacion_no END IF ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON ACTION aplicacion CASE WHEN INFIELD (aplica_a) CALL busca_aplicacion() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD aplica_a END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD aplica_a END IF DISPLAY arr_recibo[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen LET bandera = 0 CALL repetir() IF bandera = 1 THEN NEXT FIELD aplica_a END IF NEXT FIELD aplica_a WHEN INFIELD(num_nc) LET curr = arr_curr() LET scr_l = scr_line() CALL busca_avance() RETURNING arr_recibo[curr].num_nc,arr_recibo[curr].valor_pen, arr_recibo[curr].cotizacion_no LET arr_recibo[curr].valor_pag = arr_recibo[curr].valor_pen DISPLAY arr_recibo[curr].num_nc to s_recibo[scr_l].num_nc DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo[curr].valor_pag to s_recibo[scr_l].valor_pag DISPLAY arr_recibo[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo[curr].cotizacion_no to s_recibo[scr_l].cotizacion_no END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD num_nc LET nc_pend = 0 IF recibo.tipo_doc = "AV" THEN LET arr_recibo[curr].num_nc = NULL DISPLAY arr_recibo[curr].num_nc TO s_recibo[scr_l].num_nc END IF IF arr_recibo[curr].num_nc IS NOT NULL THEN SELECT UNIQUE num_doc FROM cctb00001 a WHERE a.tipo_doc = "AV" AND a.status_t IS NULL AND a.num_doc = arr_recibo[curr].num_nc AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_nc END IF LET valor_nc = 0 SELECT SUM(a.valor+a.monto_desc) INTO valor_nc FROM cctb00001 a WHERE a.tipo_doc = "AV" AND a.status_t IS NULL AND a.num_doc = arr_recibo[curr].num_nc AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente IF valor_nc IS NULL THEN LET valor_nc = 0 END IF LET nc_pend = valor_nc LET arr_recibo[curr].valor_pen = nc_pend DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY BY NAME nc_pend END IF AFTER FIELD aplica_a IF arr_recibo[curr].num_nc IS NOT NULL THEN IF arr_recibo[curr].aplica_a IS NULL THEN CALL fgl_winmessage("ERROR","DEBE COLOCAR EL DOCUMENTO DE FACTURA APLICAR EL AVANCE","INFO") NEXT FIELD aplica_a END IF END IF IF arr_recibo[curr].aplica_a IS NOT NULL THEN LET bandera = 0 CALL repetir() IF bandera = 1 THEN NEXT FIELD aplica_a END IF # Controla que el documento factura pertenezca al cliente # IF recibo.tipo_doc = "PG" OR recibo.tipo_doc='ND' THEN SELECT unique a.tipo_cliente FROM cctb00001 a WHERE a.num_doc = arr_recibo[curr].aplica_a and a.tipo_cliente = recibo.tipo_cliente and a.sec_cliente = recibo.sec_cliente and (a.tipo_doc = arr_recibo[curr].tipo_doc_aplica) and a.status_t is null IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD aplica_a END IF # END IF # busca cotizacion y orden LET xcotizacion = NULL LET xorden = NULL LET condicionPago = NULL IF arr_recibo[curr].tipo_doc_aplica = 'FT' OR arr_recibo[curr].tipo_doc_aplica ='FE' THEN SELECT MAX(a.cotizacion_no),MAX(a.orden),MAX(b.descrip) INTO xcotizacion,xorden,condicionPago FROM vetb00002 a,vetb00012 b WHERE (a.factura = arr_recibo[curr].aplica_a) AND a.status_t IS NULL AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente END IF # Busca el valor pendiente de la factura IF arr_recibo[curr].num_nc IS NULL THEN SELECT sum(a.valor+a.monto_desc) INTO valor_fac FROM cctb00001 a WHERE (a.aplica_a = arr_recibo[curr].aplica_a) and (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente) AND a.tipo_doc NOT IN ('AV','AP') AND a.status_t is NULL IF arr_recibo[curr].valor_pag IS NULL THEN LET arr_recibo[curr].valor_pag=valor_fac END IF IF aplicacion_antiguas = "NO" THEN LET arr_recibo[curr].valor_pen = valor_fac END IF ELSE SELECT sum(a.valor+a.monto_desc) INTO valor_fac FROM cctb00001 a WHERE (a.aplica_a = arr_recibo[curr].num_nc) AND (a.tipo_doc IN ('AV','AP')) AND (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente) AND a.status_t is null LET arr_recibo[curr].valor_pen =valor_fac END IF DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen END IF BEFORE FIELD desc_p IF arr_recibo[curr].num_nc IS NOT NULL THEN LET arr_recibo[curr].desc_p = 0 NEXT FIELD valor_pag ELSE LET arr_recibo[curr].desc_p = 0 IF aplicacion_antiguas = "NO" THEN LET arr_recibo[curr].valor_pag = arr_recibo[curr].valor_pen END IF DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo[curr].desc_p to s_recibo[scr_l].desc_p END IF AFTER FIELD desc_p IF arr_recibo[curr].num_nc IS NOT NULL THEN LET arr_recibo[curr].desc_p = 0 ELSE IF arr_recibo[curr].desc_p is null THEN LET arr_recibo[curr].desc_p = 0 END IF LET arr_recibo[curr].valor_pag = arr_recibo[curr].valor_pag - arr_recibo[curr].desc_p END IF DISPLAY arr_recibo[curr].valor_pag to s_recibo[scr_l].valor_pag AFTER FIELD valor_pag IF arr_recibo[curr].aplica_a IS NULL AND arr_recibo[curr].num_nc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arr_recibo[curr].valor_pag IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF recibo.tipo_doc <> 'ND' THEN IF recibo.tipo_doc <> 'OD' THEN IF arr_recibo[curr].valor_pen < 0 THEN CALL fgl_winmessage("INFO","NO PUEDE APLICAR VALOR A ESTE DOCUMENTO, ESTA EN NEGATIVO","INFO") LET arr_recibo[curr].valor_pag=0 NEXT FIELD aplica_a END IF IF arr_recibo[curr].valor_pen > 0 THEN IF arr_recibo[curr].valor_pag > arr_recibo[curr].valor_pen THEN CALL fgl_winmessage("INFO","NO PUEDE APLICAR VALOR MAYOR AL VALOR PENDIENTE","INFO") NEXT FIELD valor_pag END IF END IF END IF END IF LET p_total = 0 LET remanente = valor_ctrl FOR idx = 1 TO arr_count() IF arr_recibo[idx].valor_pag is not null THEN IF arr_recibo[idx].num_nc IS NULL THEN LET p_total = p_total + arr_recibo[idx].valor_pag LET remanente = remanente - arr_recibo[idx].valor_pag END IF END IF END FOR IF p_total < 0 THEN LET p_total = p_total * -1 END IF if arr_recibo[curr].num_nc is not null then IF p_total > valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) END IF end if DISPLAY BY NAME p_total ATTRIBUTE(BOLD) DISPLAY BY NAME remanente ATTRIBUTE(blue) # Controla que el valor aplicado a las facturas no exceda el monto del recibo AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF FOR idx = 1 TO arr_recibo.getLength() IF arr_recibo[idx].num_nc IS NULL THEN IF arr_recibo[idx].aplica_a IS NOT NULL THEN # BUSCA VALOR FACTURA IF arr_recibo[curr].num_nc IS NULL THEN SELECT sum(a.valor+a.monto_desc) INTO valor_fac FROM cctb00001 a WHERE (a.aplica_a = arr_recibo[curr].aplica_a) and (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente) AND a.tipo_doc NOT IN ('AV','AP') AND a.status_t is NULL IF arr_recibo[curr].valor_pag IS NULL THEN LET arr_recibo[curr].valor_pag=valor_fac END IF IF aplicacion_antiguas = "NO" THEN LET arr_recibo[curr].valor_pen = valor_fac END IF ELSE SELECT sum(a.valor+a.monto_desc) INTO valor_fac FROM cctb00001 a WHERE (a.aplica_a = arr_recibo[curr].num_nc) AND (a.tipo_doc IN ('AV','AP')) AND (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente) AND a.status_t is NULL LET arr_recibo[curr].valor_pen =valor_fac END IF IF recibo.tipo_doc <> 'ND' THEN IF recibo.tipo_doc <> 'OD' THEN IF arr_recibo[curr].valor_pen < 0 THEN CALL fgl_winmessage("INFO","NO PUEDE APLICAR VALOR A ESTE DOCUMENTO, ESTA EN NEGATIVO","INFO") LET arr_recibo[curr].valor_pag=0 NEXT FIELD aplica_a END IF END IF END IF # ESTA ENCOMENTARIO PORQUE LOS DEBI # IF recibo.tipo_doc = 'ND' OR recibo.tipo_doc = 'OD' OR recibo.tipo_doc = 'DV' THEN # IF arr_recibo[idx].valor_pag > valor_fac THEN # CALL fgl_winmessage("INFO","CON ESTE VALOR EL VALOR PENDIENTE DE LA FACTURA SOBRE VALORA EL MONTO ORIGINAL DE LA FACTURA","INFO") # NEXT FIELD aplica_a # END IF # END IF IF arr_recibo[idx].valor_pen > 0 THEN IF arr_recibo[idx].valor_pag > arr_recibo[idx].valor_pen THEN CALL fgl_winmessage("INFO","NO PUEDE APLICAR VALOR MAYOR AL VALOR PENDIENTE","INFO") NEXT FIELD valor_pag END IF END IF END IF END IF END FOR END INPUT LET p_companias.cod_comp = 1 { IF p_total != valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) LET curr = 0 LET scr_l = 0 GOTO arreglo1 END IF } LET opc = NULL LET valor_cheque1 = NULL LET afecta_ex="YES" IF recibo.tipo_doc = 'OD' OR recibo.tipo_doc = 'OC' THEN LET afecta_ex = fgl_winquestion("AFECTA","DESEA AFECTAR CXC FISCAL?","YES","YES|NO","QUESTION",0) END IF IF recibo.tipo_doc = "ND" THEN PROMPT "NOTA DE DEBITO ES DEBIDO A CHEQUE DEVUELTO...[S/N]? " FOR CHAR opc LET opc = UPSHIFT(opc) IF opc = "S" THEN SELECT sec_vend INTO recibo.cod_emp_sec FROM vetb00028 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente DISPLAY BY NAME recibo.cod_emp_sec LET valor_cheque1 = recibo.num_doc ELSE LET valor_cheque1 = NULL END IF END IF { CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia START REPORT cctb01 TO archivo } SELECT a.ult_recibo INTO p_num_doc FROM cctb00003 a WHERE a.tipo_doc = recibo.tipo_doc IF STATUS = NOTFOUND THEN LET p_num_doc = 0 END IF LET p_num_doc = p_num_doc + 1 LET recibo.num_doc = p_num_doc DISPLAY BY NAME recibo.num_doc # INSERTA EL COMENTARIO BEGIN WORK UPDATE cctb00003 set ult_recibo = recibo.num_doc, us_crea = SUSER_SNAME(), fech_crea = GETDATE(), us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc = recibo.tipo_doc INSERT INTO cctb00011(cod_cia,num_doc,tipo_doc,tipo_cliente,sec_cliente,comentario,us_crea,fech_crea,SucID,chitbis, cod_emp_sec,valor_recibo) VALUES (p_companias.cod_comp,recibo.num_doc,recibo.tipo_Doc,recibo.tipo_cliente,recibo.sec_cliente, recibo.comentario,SUSER_SNAME(),GETDATE(),codigo_sucursal,ch_itbis,recibo.cod_emp_sec, valor_ctrl) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF LET avance = FALSE LET navance = 1 ## SI NO OCURRE NINGUN ERROR SE PROCEDE A INSERTAR EL REGISTRO FOR idx = 1 to arr_count() IF arr_recibo[idx].aplica_a is not null THEN IF recibo.tipo_doc = "PG" THEN IF recibo.cod_emp_sec IS NULL OR recibo.cod_emp_sec = 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO TIENE VENDEDOR","STOP") GOTO arreglo1 END IF END IF IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "DV" THEN IF recibo.tipo_doc != "FI" THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * -1 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 END IF END IF # ESTAS INSTRUCCIONES ES PARA ENTRAR LOS AV-AVANCES POR ESTE PROGRAMA # SUPONGO QUE ESTAS LINEAS SERAN TEMPORALES HASTA QUE LOS AVANCES SE # INTRODUZCAN POR OTRO MANTENIMIENTO IF recibo.tipo_doc = "AV" THEN IF arr_recibo[idx].num_nc IS NOT NULL THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","El Campo de Numero de Avancve Debe Estar En Nulo","STOP") RETURN END IF IF arr_recibo[idx].aplica_a != recibo.num_doc THEN ROLLBACK WORK CALL fgl_winmessage("ERROR", "Documento Debe Aplicarse a Si Mismo","STOP") RETURN END IF IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * - 1 END IF END IF #-------------------------------------------------------------------------- LET navance = 1 LET tipo_doc1 = NULL IF tipo_doc1 = 'PG' THEN LET navance = 1 END IF LET numero_doc =arr_recibo[idx].num_nc IF arr_recibo[idx].num_nc IS NOT NULL THEN LET tipo_doc1 = "AV" LET avance = TRUE LET navance = 0 SELECT a.num_trans INTO avance_e[idx] FROM cctb00020 a WHERE a.num_oc = arr_recibo[idx].num_nc ELSE LET numero_doc = recibo.num_doc # LET arr_recibo[idx].num_nc = recibo.num_doc ASI ERA QUE ESTABA ANTES DEL 3/6/2019 LET tipo_doc1 = recibo.tipo_doc LET avance = FALSE LET navance = 1 END IF IF recibo.tipo_doc = "DV" OR recibo.tipo_doc='OD' THEN IF arr_recibo[idx].tipo_doc_aplica = 'AV' THEN LET valor_aplicado = arr_recibo[idx].valor_pag*-1 IF arr_recibo[idx].valor_pag > 0 THEN LET valor_aplicado = arr_recibo[idx].valor_pag*-1 END IF SELECT a.num_trans INTO avance_e[idx] FROM cctb00020 a WHERE a.num_oc = arr_recibo[idx].aplica_a # PARA REAPLICAR LOS AVANCES CUANDO ES POR DEVOLUCION DE DINERO DEL AVANCE ORIGINAL INSERT INTO cctb00001 (cod_cia,tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp,cod_emp_sec,fecha_orig, fecha_ven,aplica_a,num_cheque,valor,valor_cheque,costo,monto_desc,us_crea,fech_crea, banco,tipo_doc_aplica,documento_ref,num_oc) values (p_companias.cod_comp,'AP', arr_recibo[idx].aplica_a,recibo.tipo_cliente,recibo.sec_cliente,codigo_sucursal, recibo.cod_emp_sec,recibo.fecha_orig,"010101",arr_recibo[idx].aplica_a, recibo.num_doc,valor_aplicado, valor_cheque1,navance,arr_recibo[idx].desc_p,SUSER_SNAME(),GETDATE(), arr_recibo[idx].cotizacion_no,arr_recibo[idx].tipo_doc_aplica,xcotizacion,xorden) END IF IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF IF recibo.tipo_doc = "ND" THEN IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF LET p_companias.cod_comp = 1 INSERT INTO cctb00001 (cod_cia,tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp,cod_emp_sec,fecha_orig, fecha_ven,aplica_a,num_cheque,valor,valor_cheque,costo,monto_desc,us_crea,fech_crea, banco,tipo_doc_aplica,documento_ref,num_oc) values (p_companias.cod_comp,tipo_doc1, numero_doc,recibo.tipo_cliente,recibo.sec_cliente,codigo_sucursal, recibo.cod_emp_sec,recibo.fecha_orig,"010101",arr_recibo[idx].aplica_a, recibo.num_doc,arr_recibo[idx].valor_pag, valor_cheque1,navance,arr_recibo[idx].desc_p,SUSER_SNAME(),GETDATE(), arr_recibo[idx].cotizacion_no,arr_recibo[idx].tipo_doc_aplica,xcotizacion,xorden) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF INSERT INTO cctb00005 (num_doc,tipo_Doc,aplica_a,valor_pagado) VALUES (recibo.num_doc,recibo.tipo_doc,arr_recibo[idx].aplica_a,arr_recibo[idx].valor_pag) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF { IF tipo_doc1 = "ND" THEN UPDATE cctb00001 set valor_cheque = numero_recibo WHERE num_doc = recibo.num_doc AND tipo_doc = "ND" END IF INSERT INTO cctb00001 values (recibo.cuenta_no,null,tipo_doc1, arr_recibo[idx].num_nc,recibo.tipo_cliente,recibo.sec_cliente,null, recibo.cod_emp_sec,recibo.fecha_orig,null,arr_recibo[idx].aplica_a, recibo.deposito,recibo.num_doc,arr_recibo[idx].valor_pag,null, valor_cheque1,null,arr_recibo[idx].desc_p,null,SUSER_SNAME(),GETDATE(),null,null) } #IF avance = FALSE THEN #OUTPUT TO REPORT cctb01(recibo.tipo_cliente, # recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, # recibo.cod_emp_sec,tipo_doc1,null,null, # arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, # nom_cli,nombre_emp,nombre_cta,recibo.comentario) # END IF END IF END FOR LET r_filename = "ccprmt001a.4rp" LET r_output = "SVG" LET preview = 1 -- configure report engine; the functions prefixed fgl that are called here are part of the GRW API IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default IF preview = 0 THEN CALL fgl_report_selectPreview(1) -- changing default # CALL fgl_report_configureSVGPreview("PrintOnDefaultPrinter") ELSE CALL fgl_report_selectPreview(preview) END if LET handler = fgl_report_commitCurrentSettings() -- commit changes ELSE EXIT PROGRAM END IF --run the report IF handler IS NOT NULL THEN -- report engine was configured ok START REPORT cctb01b TO XML HANDLER HANDLER FOR idx = 1 TO arr_recibo.getLength() IF arr_recibo[idx].num_nc IS NULL THEN IF arr_recibo[idx].valor_pag IS NOT NULL THEN OUTPUT TO REPORT cctb01b(recibo.tipo_cliente, recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, recibo.cod_emp_sec,recibo.tipo_doc,null,null, arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, nom_cli,nombre_emp,nombre_cta,recibo.comentario) END IF END IF END FOR FINISH REPORT cctb01b END IF # FINISH REPORT cctb01 # RUN imprime CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF COMMIT WORK # ACTUALIZA OTRA DB IF afecta_ex = "YES" THEN SET CONNECTION "IFMX" LET encontre_factura = 'S' IF recibo.tipo_doc = 'PG' THEN LET recibo.tipo_doc = 'RC' END IF SELECT a.ult_recibo INTO p_num_doc FROM cctb00003 a WHERE a.tipo_doc = recibo.tipo_doc IF STATUS = NOTFOUND THEN LET p_num_doc = 0 END IF LET p_num_doc = p_num_doc + 1 LET recibo.num_doc = p_num_doc DISPLAY BY NAME recibo.num_doc # INSERTA EL COMENTARIO BEGIN WORK UPDATE cctb00003 set ult_recibo = recibo.num_doc, us_crea = SUSER_SNAME(), fech_crea = GETDATE(), us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc = recibo.tipo_doc INSERT INTO cctb00011(cod_cia,num_doc,tipo_doc,tipo_cliente,sec_cliente,comentario,us_crea,fech_crea,SucID, cod_emp_sec,valor_recibo) VALUES (p_companias.cod_comp,recibo.num_doc,recibo.tipo_Doc,recibo.tipo_cliente,recibo.sec_cliente, recibo.comentario,SUSER_SNAME(),GETDATE(),codigo_sucursal,recibo.cod_emp_sec, valor_ctrl) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF LET avance = FALSE LET navance = 1 ## SI NO OCURRE NINGUN ERROR SE PROCEDE A INSERTAR EL REGISTRO FOR idx = 1 to arr_count() IF arr_recibo[idx].aplica_a is not null THEN IF recibo.tipo_doc = "RC" THEN IF recibo.cod_emp_sec IS NULL OR recibo.cod_emp_sec = 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO TIENE VENDEDOR","STOP") GOTO arreglo1 END IF END IF IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "DV" THEN IF recibo.tipo_doc != "FI" THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * -1 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 END IF END IF # ESTAS INSTRUCCIONES ES PARA ENTRAR LOS AV-AVANCES POR ESTE PROGRAMA # SUPONGO QUE ESTAS LINEAS SERAN TEMPORALES HASTA QUE LOS AVANCES SE # INTRODUZCAN POR OTRO MANTENIMIENTO IF recibo.tipo_doc = "AV" THEN IF arr_recibo[idx].num_nc IS NOT NULL THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","El Campo de Numero de Avancve Debe Estar En Nulo","STOP") RETURN END IF IF arr_recibo[idx].aplica_a != recibo.num_doc THEN ROLLBACK WORK CALL fgl_winmessage("ERROR", "Documento Debe Aplicarse a Si Mismo","STOP") RETURN END IF IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * - 1 END IF END IF #-------------------------------------------------------------------------- LET navance = 1 LET tipo_doc1 = NULL IF tipo_doc1 = 'RC' THEN LET navance = 1 END IF IF arr_recibo[idx].num_nc IS NOT NULL THEN LET tipo_doc1 = "AV" LET avance = TRUE LET navance = 0 ELSE LET arr_recibo[idx].num_nc = recibo.num_doc LET tipo_doc1 = recibo.tipo_doc LET avance = FALSE LET navance = 1 END IF # DEVOLUCION DINERO IF recibo.tipo_doc = "DV" THEN IF arr_recibo[idx].tipo_doc_aplica = 'AV' THEN LET valor_aplicado = arr_recibo[idx].valor_pag*-1 IF arr_recibo[idx].valor_pag > 0 THEN LET valor_aplicado = arr_recibo[idx].valor_pag*-1 END IF # PARA REAPLICAR LOS AVANCES CUANDO ES POR DEVOLUCION DE DINERO DEL AVANCE ORIGINAL INSERT INTO cctb00001 (cod_cia,tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp,cod_emp_sec,fecha_orig, fecha_ven,aplica_a,num_cheque,valor,valor_cheque,costo,monto_desc,us_crea,fech_crea, banco,tipo_doc_aplica,documento_ref,num_oc) values (p_companias.cod_comp,'AP', avance_e[idx],recibo.tipo_cliente,recibo.sec_cliente,codigo_sucursal, recibo.cod_emp_sec,recibo.fecha_orig,"010101",avance_e[idx], recibo.num_doc,valor_aplicado, valor_cheque1,avance_e[idx],arr_recibo[idx].desc_p,SUSER_SNAME(),GETDATE(), arr_recibo[idx].cotizacion_no,arr_recibo[idx].tipo_doc_aplica,xcotizacion,xorden) END IF IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF IF recibo.tipo_doc = "ND" THEN IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF LET p_companias.cod_comp = 1 LET xfactura_ext = NULL IF arr_recibo[idx].tipo_doc_aplica = 'AV' THEN SELECT DISTINCT a.num_doc FROM cctb00001 a WHERE a.tipo_doc = arr_recibo[idx].tipo_doc_aplica AND a.num_doc = avance_e[idx] AND a.num_doc = a.aplica_a AND a.status_t IS NULL IF STATUS = NOTFOUND THEN ROLLBACK WORK END IF END IF IF arr_recibo[idx].tipo_doc_aplica = 'FT' OR arr_recibo[idx].tipo_doc_aplica = 'FE' THEN SELECT a.factura,a.orden INTO xfactura_ext,xorden FROM vetb00002 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.factura_c = arr_recibo[idx].aplica_a AND a.status_t IS NULL IF STATUS = NOTFOUND THEN ROLLBACK WORK LET encontre_factura = 'N' EXIT FOR END IF LET xcotizacion = NULL SELECT a.cotizacion_no INTO xcotizacion FROM prtb00012 a WHERE a.num_oc = xorden END IF IF tipo_Doc1 = 'RC' AND arr_recibo[idx].valor_pag > 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * -1 END IF IF tipo_Doc1 = 'OC' AND arr_recibo[idx].valor_pag > 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * -1 END IF SELECT a.factura INTO avance_e[idx] FROM vetb00002 a WHERE a.factura_c = arr_recibo[idx].aplica_a AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.status_t IS NULL IF STATUS = NOTFOUND THEN ROLLBACK WORK CONTINUE FOR END IF INSERT INTO cctb00001 (cod_cia,tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp,cod_emp_sec,fecha_orig, fecha_ven,aplica_a,num_cheque,valor,valor_cheque,costo,monto_desc,us_crea,fech_crea, banco,tipo_doc_aplica,documento_ref,num_oc) values (p_companias.cod_comp,tipo_doc1, arr_recibo[idx].num_nc,recibo.tipo_cliente,recibo.sec_cliente,codigo_sucursal, recibo.cod_emp_sec,recibo.fecha_orig,"010101",xfactura_ext, recibo.num_doc,arr_recibo[idx].valor_pag, valor_cheque1,avance_e[idx],arr_recibo[idx].desc_p,SUSER_SNAME(),GETDATE(), arr_recibo[idx].cotizacion_no,arr_recibo[idx].tipo_doc_aplica,xcotizacion,xorden) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF END IF END FOR IF encontre_factura = 'S' THEN COMMIT WORK END IF END if LET numero_msg = 1 CALL msg(numero_msg) LET emp = recibo.cod_emp_sec CLEAR FORM LET INT_FLAG = FALSE SET CONNECTION "MSSQL" GOTO volver END FUNCTION ## Funcion para consultar/modificar un recibo de pago FUNCTION ccpcmf001() DEFINE usuario RECORD us_crea CHAR(9), fech_crea LIKE cctb00001.fech_crea END RECORD ## SE PREPARA EL CRITERIO PARA CONSULTAR/MODIFICAR UN REGISTRO CONSTRUCT CRITERIO ON b.tipo_doc,b.num_doc,b.tipo_cliente, b.sec_cliente, b.cod_emp_sec,b.fecha_orig FROM tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp_sec, fecha_orig IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET selec = "SELECT b.tipo_doc,b.num_doc,b.tipo_cliente, ", " b.sec_cliente,a.cod_emp_sec,a.fecha_orig,b.comentario,b.chitbis,a.cod_emp_sec,b.valor_recibo ", "FROM cctb00011 b,cctb00001 a ", "WHERE ",criterio clipped," AND ", " a.num_cheque = b.num_doc AND ", " b.tipo_Doc = a.tipo_Doc AND ", " a.cod_emp = b.sucid AND ", " a.status_t is null ORDER BY b.tipo_Doc,b.num_doc " PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos FETCH FIRST datos INTO recibo.*,ch_itbis,recibo.cod_emp_sec,valor_ctrl IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF CALL datos_doc() MENU "OPCION" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO recibo.*,ch_itbis,recibo.cod_emp_sec,valor_ctrl IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF CALL datos_doc() COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO recibo.*,ch_itbis,recibo.cod_emp_sec,valor_ctrl IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF CALL datos_doc() COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO recibo.*,ch_itbis,recibo.cod_emp_sec,valor_ctrl IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF CALL datos_doc() COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO recibo.*,ch_itbis,recibo.cod_emp_sec,valor_ctrl IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF CALL datos_doc() { COMMAND KEY("I") "re-Imprimir" CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia START REPORT cctb01 TO archivo IF recibo.tipo_doc = "PG" THEN LET selec = "SELECT a.num_doc,a.aplica_a,a.valor,a.monto_desc,a.valor ", "FROM cctb00001 a ", "WHERE ((a.tipo_doc = ? OR a.tipo_doc = 'AV') AND ", " a.num_cheque = ?) AND (a.tipo_cliente = ? AND ", " a.sec_cliente = ?) ORDER BY 2,1 " ELSE LET selec = "SELECT num_doc,aplica_a,valor,monto_desc,valor FROM cctb00001 ", "WHERE (tipo_doc=? AND num_cheque=?)AND (tipo_cliente = ? AND ", " sec_cliente = ?) ORDER BY 2,1 " END IF PREPARE comando1 FROM selec DECLARE buscar11 CURSOR FOR comando1 OPEN buscar11 USING recibo.tipo_doc,recibo.num_doc,recibo.tipo_cliente, recibo.sec_cliente LET idx = 1 WHILE STATUS != NOTFOUND FETCH buscar11 INTO arr_recibo[idx].* IF STATUS = NOTFOUND THEN EXIT WHILE END IF IF arr_recibo[idx].num_nc = recibo.num_doc THEN LET arr_recibo[idx].num_nc = NULL END IF IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "OD" THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen * -1 ELSE IF arr_recibo[idx].valor_pen < 0 THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen *-1 END IF END IF LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pen LET arr_recibo[idx].valor_pen = 0 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 OUTPUT TO REPORT cctb01(recibo.tipo_cliente, recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, recibo.cod_emp_sec,recibo.tipo_doc,null,null, arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, nom_cli,nombre_emp,nombre_cta,recibo.comentario) LET idx = idx + 1 END WHILE FINISH REPORT cctb01 RUN imprime COMMAND "Escoger" INPUT BY NAME recibo.tipo_cliente, recibo.sec_cliente,recibo.cod_emp_sec,valor_ctrl, recibo.comentario,ch_itbis WITHOUT DEFAULTS ## CHEQUEA QUE EL CLIENTE EXISTA, SI EXISTE DESPLEGA SU NOMBRE AFTER FIELD tipo_cliente IF recibo.tipo_cliente IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF # Controla que el TIPO DE MOVIMIENTO FI solo sea a tipo clientes 13 IF recibo.tipo_doc = "FI" AND recibo.tipo_cliente = 12 THEN LET numero_msg = 240 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF AFTER FIELD sec_cliente IF recibo.sec_cliente IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD sec_cliente END IF SELECT b.nombre INTO nom_cli FROM vetb00004 b WHERE b.tipo_cliente = recibo.tipo_cliente and b.sec_cliente = recibo.sec_cliente IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) AFTER FIELD cod_emp_sec IF recibo.cod_emp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME nombre_emp ATTRIBUTE (BOLD) IF recibo.tipo_doc = "ND" THEN SELECT sec_vend FROM vetb00028 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente IF status != notfound THEN LET numero_msg = 357 CALL msg(numero_msg) END IF END IF AFTER FIELD valor_ctrl IF valor_ctrl IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_ctrl END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE GO TO vuelve END IF EXIT INPUT END INPUT IF recibo.tipo_doc = "PG" THEN LET selec = "SELECT a.num_doc,a.aplica_a,a.valor,a.monto_desc,a.valor ", "FROM cctb00001 a ", "WHERE ((a.tipo_doc = ? OR a.tipo_doc = 'AV') AND ", " a.num_cheque = ?) AND (a.tipo_cliente = ? AND ", " a.sec_cliente = ?) ORDER BY 2,1 " ELSE LET selec = "SELECT num_doc,aplica_a,valor,monto_desc,valor FROM cctb00001 ", "WHERE (tipo_doc=? AND num_cheque=?)AND (tipo_cliente = ? AND ", " sec_cliente = ?) ORDER BY 2,1 " END IF PREPARE comando FROM selec DECLARE buscar1 CURSOR FOR comando OPEN buscar1 USING recibo.tipo_doc,recibo.num_doc,recibo.tipo_cliente, recibo.sec_cliente LET idx = 1 WHILE STATUS != NOTFOUND FETCH buscar1 INTO arr_recibo[idx].* IF STATUS = NOTFOUND THEN EXIT WHILE END IF IF arr_recibo[idx].num_nc = recibo.num_doc THEN LET arr_recibo[idx].num_nc = null END IF IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "OD" THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen * -1 ELSE IF arr_recibo[idx].valor_pen < 0 THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen *-1 END IF END IF LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pen LET arr_recibo[idx].valor_pen = 0 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 SELECT sum(valor) INTO valor2 FROM cctb00001 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente and aplica_a = arr_recibo[idx].aplica_a and status_t is null AND num_cheque = recibo.num_doc LET arr_recibo[idx].valor_pen = valor2 LET idx = idx + 1 END WHILE CALL set_count(idx - 1) LABEL arreglo2: ## AQUI SE MODIFICAN/ACTUALIZAN LOS CAMPOS DEL ARREGLO INPUT ARRAY arr_recibo WITHOUT DEFAULTS FROM s_recibo.* ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON KEY (CONTROL-W) LET curr = arr_curr() LET scr_l = scr_line() CASE WHEN INFIELD (aplica_a) CALL busca_aplicacion() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD aplica_a END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD aplica_a END IF DISPLAY arr_recibo[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen LET bandera = 0 CALL repetir() IF bandera = 1 THEN NEXT FIELD aplica_a END IF NEXT FIELD aplica_a END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD num_nc LET nc_pend = 0 IF recibo.tipo_doc = "AV" THEN LET arr_recibo[curr].num_nc = NULL DISPLAY arr_recibo[curr].num_nc TO s_recibo[scr_l].num_nc END IF IF arr_recibo[curr].num_nc IS NOT NULL THEN SELECT UNIQUE num_doc FROM cctb00001 a WHERE a.tipo_doc = "AV" AND a.status_t IS NULL AND a.num_doc = arr_recibo[curr].num_nc AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_nc END IF LET valor_nc = 0 SELECT SUM(a.valor+a.monto_desc) INTO valor_nc FROM cctb00001 a WHERE a.tipo_doc = "AV" AND a.status_t IS NULL AND a.num_doc = arr_recibo[curr].num_nc AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente IF valor_nc IS NULL THEN LET valor_nc = 0 END IF END IF AFTER FIELD aplica_a IF arr_recibo[curr].aplica_a IS NOT NULL THEN LET bandera = 0 CALL repetir() IF bandera = 1 THEN NEXT FIELD aplica_a END IF IF recibo.tipo_doc = "AV" THEN IF recibo.num_doc != arr_recibo[curr].aplica_a THEN ERROR "Si Es Un Avance Debe Aplicarse a Si Mismo" NEXT FIELD aplica_a END IF END IF #IF recibo.tipo_doc != "AV" AND # arr_recibo[curr].aplica_a = recibo.num_doc THEN # LET numero_msg = 131 # CALL msg(numero_msg) # NEXT FIELD aplica_a #END IF # Controla que la factura pertenezca al cliente IF recibo.tipo_doc = "PG" THEN SELECT unique tipo_cliente FROM cctb00001 WHERE num_doc = arr_recibo[curr].aplica_a and tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente and (tipo_doc IN ("FT","FE","FI","ND")) and status_t is null IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD aplica_a END IF END IF # Busca el valor pendiente de la factura IF arr_recibo[curr].num_nc IS NULL THEN SELECT sum(a.valor+a.monto_desc) INTO valor_fac FROM cctb00001 a WHERE a.aplica_a=arr_recibo[curr].aplica_a and a.status_t is null AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente LET arr_recibo[curr].valor_pen = valor_fac ELSE LET arr_recibo[curr].valor_pen = 0 END IF DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo[curr].valor_pen to s_recibo[scr_l].valor_pen END IF BEFORE FIELD desc_p IF arr_recibo[curr].num_nc IS NOT NULL THEN LET arr_recibo[curr].desc_p = 0 NEXT FIELD valor_pag END IF IF arr_recibo[curr].desc_p IS NULL THEN LET arr_recibo[curr].desc_p = 0 END IF DISPLAY arr_recibo[curr].desc_p to s_recibo[scr_l].desc_p AFTER FIELD desc_p IF arr_recibo[curr].num_nc IS NOT NULL THEN LET arr_recibo[curr].desc_p = 0 ELSE IF arr_recibo[curr].desc_p is null THEN LET arr_recibo[curr].desc_p = 0 END IF END IF AFTER FIELD valor_pag IF arr_recibo[curr].aplica_a IS NULL AND arr_recibo[curr].num_nc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arr_recibo[curr].valor_pag IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_pag END IF LET remanente = valor_ctrl LET p_total = 0 FOR idx = 1 TO arr_count() IF arr_recibo[idx].valor_pag is not null THEN IF arr_recibo[idx].num_nc IS NULL THEN LET p_total = p_total - arr_recibo[idx].valor_pag END IF END IF END FOR IF p_total < 0 THEN LET p_total = p_total * -1 END IF DISPLAY BY NAME remanente ATTRIBUTE(blue) IF p_total != valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) END IF DISPLAY BY NAME p_total ATTRIBUTE(BOLD) # Controla que el valor aplicado a las facturas no exceda el monto del recibo END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF IF p_total != valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) GOTO arreglo2 END IF LET opc = NULL LET valor_cheque1 = NULL IF recibo.tipo_doc = "ND" THEN PROMPT "NOTA DE DEBITO ES DEBIDO A CHEQUE DEVUELTO...[S/N]? " FOR CHAR opc LET opc = UPSHIFT(opc) IF opc = "S" THEN LET valor_cheque1 = recibo.num_doc ELSE LET valor_cheque1 = NULL END IF END IF ## AQUI SE REALIZA LA MODIFICACION DEL REGISTRO IF recibo.tipo_doc = "PG" THEN BEGIN WORK DELETE FROM cctb00001 WHERE num_cheque= recibo.num_doc and tipo_doc IN ("PG","AV") AND valor < 0 AND fecha_orig = recibo.fecha_orig IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF ELSE IF recibo.tipo_doc = "ND" THEN SELECT unique a.valor_cheque INTO valor_cheque1 FROM cctb00001 a WHERE a.num_doc = recibo.num_doc AND a.tipo_doc = "ND" END IF BEGIN WORK UPDATE cctb00011 SET comentario = recibo.comentario, cod_emp_Sec = recibo.cod_emp_sec, valor_recibo = valor_ctrl, fecha_orig = recibo.fecha_orig, cctb00011.chitis = chitbis, us_mod = usuarios, fech_mod = getdate() WHERE num_doc = recibo.num_doc AND tipo_doc = recibo.tipo_doc DELETE FROM cctb00005 WHERE num_Doc = recibo.num_doc AND tipo_Doc = recibo.tipo_doc IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF DELETE FROM cctb00001 WHERE cctb00001.num_doc= recibo.num_doc and cctb00001.tipo_doc = recibo.tipo_doc and CONVERT (CHAR(10),fech_crea,101) > '01/01/2009' IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF END IF CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia START REPORT cctb01 TO archivo LET avance = FALSE FOR idx = 1 to arr_count() IF arr_recibo[idx].aplica_a is not null OR arr_recibo[idx].num_nc is not null THEN IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "OD" THEN IF recibo.tipo_doc != "FI" THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag * -1 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 END IF END IF LET tipo_doc1 = NULL LET navance = 1 IF arr_recibo[idx].num_nc IS NOT NULL THEN LET tipo_doc1 = "AV" LET avance = TRUE LET navance = 1 ELSE LET arr_recibo[idx].num_nc = recibo.num_doc LET tipo_doc1 = recibo.tipo_doc LET avance = FALSE LET navance = 0 END IF IF recibo.tipo_doc = "DV" THEN IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF IF recibo.tipo_doc = "ND" THEN IF arr_recibo[idx].valor_pag < 0 THEN LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pag *-1 END IF END IF IF avance = FALSE THEN # CONTROL AVANCE INSERT INTO cctb00001 VALUES (p_companias.cod_comp,null,tipo_doc1,arr_recibo[idx].num_nc, recibo.tipo_cliente,recibo.sec_cliente,codigo_sucursal,recibo.cod_emp_sec, recibo.fecha_orig,"010101",arr_recibo[idx].aplica_a,null, recibo.num_doc,arr_recibo[idx].valor_pag,null,valor_cheque1,navance, arr_recibo[idx].desc_p,null,SUSER_SNAME(),GETDATE(),null,null,NULL) IF SQLSTATE > 02 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO FUE POSIBLE GUARDAR LA TRANSACCION","STOP") RETURN END IF OUTPUT TO REPORT cctb01(recibo.tipo_cliente, recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, recibo.cod_emp_sec,tipo_doc1,null,null, arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, nom_cli,nombre_emp,nombre_cta,recibo.comentario) END IF # IF DEL AVANCE END IF END FOR COMMIT WORK FINISH REPORT cctb01 RUN imprime COMMIT WORK LET numero_msg = 13 CALL msg(numero_msg) } COMMAND KEY ("N") "aNular" ## AQUI SE REALIZA LA ANULACION DE UN REGISTRO LET p_fechas = recibo.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 RETURN END IF LET respuesta = fgl_winquestion("INFO","ESTA SEGURO DE QUERER ANULAR ESTE DOCUMENTO?","NO","NO|YES","question",0) IF UPSHIFT(respuesta) = "YES" THEN IF recibo.tipo_doc = "PG" THEN UPDATE cctb00001 set status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc IN ("AV","PG") and num_cheque = recibo.num_doc AND tipo_cliente = recibo.tipo_cliente AND sec_cliente = recibo.sec_cliente ELSE UPDATE cctb00001 set status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc = recibo.tipo_doc and num_cheque = recibo.num_doc END IF LET numero_msg = 82 CALL msg(numero_msg) END IF COMMAND "Retornar" CLEAR FORM FOR idx = 1 to 3 LET arr_recibo[idx].aplica_a = null LET arr_recibo[idx].valor_pen = null LET arr_recibo[idx].valor_pag = null DISPLAY arr_recibo[idx].aplica_a to s_recibo[idx].aplica_a DISPLAY arr_recibo[idx].valor_pen to s_recibo[idx].valor_pen DISPLAY arr_recibo[idx].valor_pag to s_recibo[idx].valor_pag END FOR EXIT MENU END MENU END FUNCTION FUNCTION busca_aplicacion() OPEN WINDOW busqueda1 AT 10,10 WITH FORM "ccfmwd001" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, comment line last) CALL ui.Interface.LoadStyles("mbsStyle") DECLARE aplicar CURSOR FOR SELECT a.aplica_a,SUM(a.valor+a.monto_desc),b.fecha_factura,b.cotizacion_no,b.orden FROM cctb00001 a,vetb00002 b WHERE (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.tipo_cliente = b.tipo_cliente AND a.sec_cliente = b.sec_cliente) AND (a.tipo_doc NOT IN ('AV','AP') AND a.aplica_a=b.factura) AND a.status_t is null GROUP BY b.fecha_factura,a.aplica_a,b.cotizacion_no,b.orden HAVING SUM(a.valor+a.monto_desc) > 0 ORDER BY b.fecha_factura LET existe = "N" LET idx = 1 FOREACH aplicar INTO aplica_wd[idx].aplica_a,aplica_wd[idx].pendiente,aplica_wd[idx].fecha, aplica_wd[idx].cotizacion_no, aplica_wd[idx].num_oc IF status = NOTFOUND THEN LET existe = "N" EXIT FOREACH END IF CALL integridad() # Busca el tipo de movimiento SELECT MAX(a.tipo_doc) INTO tipo_doc2 FROM cctb00001 a WHERE (a.tipo_cliente = recibo.tipo_cliente and a.sec_cliente = recibo.sec_cliente and a.tipo_doc NOT IN ("PG","AV") and a.num_doc = aplica_wd[idx].aplica_a) and a.status_t is null IF status < 0 THEN CALL integridad() LET tipo_doc2 = "SQ" END IF LET aplica_wd[idx].tipo_doc = tipo_doc2 # Busca ordes y cotizacion de la factura IF tipo_Doc2 = 'FT' OR tipo_Doc2 = 'FE' THEN SELECT a.orden,a.cotizacion_no,a.factura_ext,CONVERT(CHAR(10),a.fecha_factura,103) INTO aplica_wd[idx].num_oc,aplica_wd[idx].cotizacion_no,aplica_wd[idx].factura_e, aplica_wd[idx].fecha FROM vetb00002 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.factura = aplica_wd[idx].aplica_a END IF # Busca Nota de credito LET valor_ctrl1 = 0 IF tipo_doc2 = "AV" THEN LET aplica_wd[idx].cotizacion_no = null SELECT MAX(a.banco) INTO aplica_wd[idx].cotizacion_no FROM cctb00001 a WHERE a.num_doc = aplica_wd[idx].num_oc AND a.num_doc = a.aplica_a SELECT SUM(a.valor*-1) INTO valor_ctrl1 FROM cctb00001 a WHERE (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.num_doc = aplica_wd[idx].aplica_a AND a.tipo_doc = "AV" AND a.num_doc != a.aplica_a) AND a.status_t IS NULL IF valor_ctrl1 is null THEN LET valor_ctrl1 = 0 END IF LET aplica_wd[idx].pendiente = aplica_wd[idx].pendiente - valor_ctrl1 END IF LET existe = "S" IF aplica_wd[idx].pendiente != 0 THEN LET idx = idx + 1 END IF END FOREACH IF existe = "N" and idx = 1 THEN LET numero_msg = 127 CALL msg(numero_msg) GOTO salir END IF CALL set_count(idx-1) DISPLAY ARRAY aplica_wd TO consart.* LET INT_FLAG = false LET curr1 = arr_curr() LET arr_recibo[curr].aplica_a = aplica_wd[curr1].aplica_a LET arr_recibo[curr].valor_pen = aplica_wd[curr1].pendiente LABEL salir: CLOSE WINDOW busqueda1 END FUNCTION FUNCTION repetir() DEFINE ant_art RECORD num_nc INTEGER, aplica_a INTEGER, valor_pag DECIMAL(12,2) END RECORD LET ant_art.num_nc = arr_recibo[curr].num_nc LET ant_art.aplica_a = arr_recibo[curr].aplica_a LET ant_art.valor_pag = arr_recibo[curr].valor_pag FOR idx = 1 to arr_count() IF idx != curr THEN IF arr_recibo[idx].aplica_a IS NOT NULL AND arr_recibo[idx].valor_pag IS NOT NULL THEN IF arr_recibo[idx].num_nc = ant_art.num_nc AND arr_recibo[idx].aplica_a = ant_art.aplica_a AND arr_recibo[idx].valor_pag = ant_art.valor_pag THEN LET numero_msg = 21 CALL msg(numero_msg) LET bandera = 1 ELSE IF bandera != 1 THEN LET bandera = 0 END IF END IF END IF END IF END FOR END FUNCTION { FUNCTION consulta_clientes() OPEN WINDOW busqueda AT 7,12 WITH FORM "vefmwd002" ATTRIBUTE (BORDER,FORM LINE FIRST + 2,COMMENT LINE LAST,MESSAGE LINE LAST) LET int_flag = false CONSTRUCT criterio ON a.nombre FROM nombre IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) GO TO salir_consulta_c END IF LET selec2 = "SELECT a.tipo_cliente, a.sec_cliente, a.nombre ", "FROM vetb00004 a ", "WHERE a.status_t is null AND ",criterio clipped," ORDER BY 1,2 " PREPARE busca_clientes FROM selec2 DECLARE buscar_clientes CURSOR FOR busca_clientes LET idx = 1 FOREACH buscar_clientes INTO arr_clientes[idx].* IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT FOREACH END IF LET idx = idx + 1 END FOREACH CALL set_count(idx-1) MESSAGE " Selecciona Cliente donde esta el cursor" DISPLAY ARRAY arr_clientes TO s_clientes.* LET curr1 = arr_curr() LET cliente_dir.tipo_cliente = arr_clientes[curr1].tipo_cliente LET cliente_dir.sec_cliente = arr_clientes[curr1].sec_cliente LET descrip1 = arr_clientes[curr1].nombre LABEL salir_consulta_c: CLOSE WINDOW busqueda END FUNCTION } { FUNCTION anular() OPEN WINDOW anula AT 7,5 WITH FORM "vefmwd006" ATTRIBUTE (BORDER, COMMENT LINE LAST - 1,PROMPT LINE LAST,FORM LINE FIRST + 1) LABEL vuelve: INPUT BY NAME p_fact_no AFTER FIELD p_fact_no SELECT UNIQUE fecha_factura,orden,tipo_cliente,sec_cliente,neto INTO fact_gral.fecha_factura,fact_gral.orden,fact_gral.tipo_cliente, fact_gral.sec_cliente,fact_gral.total_fact FROM vetb00002 WHERE factura = p_fact_no AND status_t IS NULL AND fech_crea > datetime (1994-03-31 08:00) year to minute IF STATUS = NOTFOUND THEN LET numero_msg = 102 CALL msg(numero_msg) NEXT FIELD p_fact_no END IF SELECT a.nombre INTO fact_gral.nombre FROM vetb00004 a WHERE a.tipo_cliente = fact_gral.tipo_cliente AND a.sec_cliente = fact_gral.sec_cliente DISPLAY BY NAME fact_gral.tipo_cliente,fact_gral.sec_cliente, fact_gral.total_fact,fact_gral.nombre ATTRIBUTE(blue) IF fact_gral.fecha_factura < "310394" THEN LET numero_msg = 58 CALL msg(numero_msg) GOTO salir END IF LET p_fechas = fact_gral.fecha_factura IF fact_gral.fecha_factura != TODAY THEN ERROR "NO PUEDE ANULAR FACTURA QUE NO SEAN DEL DIA DE HOY" RETURN END IF CALL prd() IF bandera =1 THEN SLEEP 2 EXIT INPUT END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT INPUT END IF EXIT INPUT END INPUT IF bandera = 1 THEN LET bandera = 0 GOTO salir END IF # Este Int_flag es porque tuve que salir del input con el int_flag verdadero # y asi poder salir del window sin problemas IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false GOTO salir END IF LABEL atras: PROMPT "Esta seguro de Anular Esta Factura? (S/N)" FOR CHAR opt3 LET opt3 = UPSHIFT(opt3) IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false GOTO salir END IF IF opt3 != "S" AND opt3 != "N" THEN LET numero_msg = -1301 CALL msg(numero_msg) GOTO atras END IF IF opt3 = "N" THEN GOTO salir END IF IF opt3 = "S" THEN UPDATE vetb00002 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE factura = p_fact_no AND fech_crea > datetime (1994-03-31 08:00) year to minute UPDATE iptb00006 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE num_doc = p_fact_no AND cod_mov IN (30,31,32) AND fech_crea > datetime (1994-03-31 08:00) year to minute UPDATE vetb00003 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE factura = p_fact_no AND fech_crea > datetime (1994-03-31 08:00) year to minute UPDATE cctb00001 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE num_doc = p_fact_no AND (tipo_doc = "FT" or tipo_doc = "FE") AND fech_crea > datetime (1994-03-31 08:00) year to minute UPDATE cctb00001 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE aplica_a = p_fact_no AND tipo_doc = "PC" # ANULACION DE LAS SERIES IF fact_gral.ventas = "1" THEN LET p_codigo = 30 ELSE LET p_codigo = 31 END IF UPDATE vetb00042 set status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE factura = p_fact_no AND cod_mov = p_codigo LET numero_msg = 82 CALL msg(numero_msg) END IF LABEL salir: LET fact_gral.fecha_factura = TODAY #CLOSE FORM vefmwd006 CLOSE WINDOW anula END FUNCTION } REPORT cctb01(p_tipo_cliente,p_sec_cliente,p_fecha_orig, p_num_doc,p_cod_emp_sec,p_tipo_doc, p_cuenta_no,p_banco,p_aplica_a, p_monto_desc,p_valor,p_nombre, p_nomb_emp,p_nombre_cta,p_comentario) DEFINE p_tipo_cliente LIKE cctb00001.tipo_cliente, p_sec_cliente LIKE cctb00001.sec_cliente, p_fecha_orig LIKE cctb00001.fecha_orig, p_num_doc LIKE cctb00001.num_doc, p_cod_emp_sec LIKE cctb00001.cod_emp_sec, p_tipo_doc LIKE cctb00001.tipo_doc, p_cuenta_no LIKE cctb00001.cuenta_no, p_banco LIKE cctb00001.banco, p_aplica_a LIKE cctb00001.aplica_a, p_monto_desc LIKE cctb00001.monto_desc, p_valor LIKE cctb00001.valor, p_nomb_emp CHAR(40), p_nombre_cta CHAR(30), p_cod_cia LIKE cctb00001.cod_cia, pitbis DEC(12,2) define hora char(5), l smallint, p_nombre LIKE vetb00004.nombre, p_comentario,tipo_documento CHAR(120), #LIKE cctb00011.comentario, ditbis,total_doc,total_desc DEC(12,2) ORDER BY p_sec_cliente,p_num_doc format page header LET hora = time IF p_tipo_doc = 'PG' THEN LET tipo_documento = 'RECIBO INGRESOS' ELSE LET tipo_documento = 'DOCUMENTOS' END IF PRINTX p_companias.nombre, p_num_doc,p_companias.rnc,p_companias.direccion,p_fecha_orig,hora, tipo_documento BEFORE GROUP OF p_sec_cliente PRINTX nombre_sucursal,p_cuenta_no,p_nombre_cta, p_banco,p_nombre,p_tipo_cliente, p_sec_cliente,p_cod_emp_sec ,p_nomb_emp,p_tipo_doc ,p_nombre_tipo on every row printx p_aplica_a, p_monto_desc,p_valor , p_valor AFTER GROUP OF p_sec_cliente LET total_doc =GROUP SUM(p_valor) LET total_desc = GROUP SUM(p_monto_desc) on last row PRINT COLUMN 2, "COMENTARIOS : " PRINT COLUMN 5, p_comentario[1,60] CLIPPED PRINT COLUMN 5, p_comentario[61,120] CLIPPED PAGE TRAILER SKIP 1 LINE PRINT COLUMN 10, "____________________________________", COLUMN 60, "____________________________________" PRINT COLUMN 10, " Preparado Por ", COLUMN 60, " Autorizado Por " print normal END REPORT REPORT cctb01b(p_tipo_cliente,p_sec_cliente,p_fecha_orig, p_num_doc,p_cod_emp_sec,p_tipo_doc, p_cuenta_no,p_banco,p_aplica_a, p_monto_desc,p_valor,p_nombre, p_nomb_emp,p_nombre_cta,p_comentario) DEFINE p_tipo_cliente LIKE cctb00001.tipo_cliente, p_sec_cliente LIKE cctb00001.sec_cliente, p_fecha_orig LIKE cctb00001.fecha_orig, p_num_doc LIKE cctb00001.num_doc, p_cod_emp_sec LIKE cctb00001.cod_emp_sec, p_tipo_doc LIKE cctb00001.tipo_doc, p_cuenta_no LIKE cctb00001.cuenta_no, p_banco LIKE cctb00001.banco, p_aplica_a LIKE cctb00001.aplica_a, p_monto_desc LIKE cctb00001.monto_desc, p_valor LIKE cctb00001.valor, p_nomb_emp CHAR(40), p_nombre_cta CHAR(30), pitbis DEC(12,2), labelcliente STRING define hora char(5), p_nombre LIKE vetb00004.nombre, p_comentario CHAR(120), #LIKE cctb00011.comentario, descuento,total_monto,ditbis DEC(12,2), tipodocumento VARCHAR(50) ORDER BY p_sec_cliente format page header LET hora = time IF p_tipo_doc = 'PG' THEN LET tipodocumento = 'RECIBO DE INGRESOS' LET labelcliente = "HEMOS RECIBIDO DE " ELSE LET tipodocumento = 'DOCUMENTO CUENTAS POR COBRAR' LET labelcliente = "CLIENTE: " END IF BEFORE GROUP OF p_sec_cliente SELECT a.itbi INTO pitbis FROM vetb00019 a WHERE a.disponible = "S" IF pitbis IS NULL THEN LET pitbis = 0 END IF PRINTX nombre_sucursal,p_cuenta_no,p_nombre_cta, p_banco,p_nombre,p_tipo_cliente, p_sec_cliente, p_cod_emp_sec,p_nomb_emp,p_tipo_doc, p_nombre_tipo,tipodocumento,hora,p_companias.nombre, p_num_doc,p_companias.rnc,p_companias.direccion,p_fecha_orig,p_companias.telefono, p_companias.fax,fecha_proximo,labelcliente,condicionPago,xdireccion on every row printx p_aplica_a, p_monto_desc, p_valor, ditbis , p_valor AFTER GROUP OF p_sec_cliente # BUSCA TIPO DE VENTAS SELECT a.simbolo,a.descripcion_moneda INTO psimbolo,pmoneda FROM vetb00061 a,vetb00060 b WHERE a.ventas = b.ventas AND b.tipo_cliente = p_tipo_cliente LET descuento = GROUP SUM(p_monto_desc) LET total_monto = GROUP SUM(p_valor) LET valor_orig = total_monto LET valor_letras = NULL CALL convierte() PRINTX descuento,total_monto,valor_letras,psimbolo on last row PRINTX p_comentario END REPORT FUNCTION busca_avance() DEFINE ravances DYNAMIC ARRAY OF RECORD fecha DATE, aplica_a INT, pcotizacion INT, nombre_proyecto VARCHAR(100), pendiente DEC(12,2) END RECORD, pnombre_proyecto VARCHAR(100) OPEN WINDOW busqueda1 AT 10,10 WITH FORM "ccfmwd005" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, comment line last) CALL ui.Interface.LoadStyles("mbsStyle") DECLARE avances CURSOR FOR SELECT a.num_doc,a.banco,SUM(a.valor+a.monto_desc) FROM cctb00001 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.status_t is null AND a.tipo_Doc IN ('AV','AP') GROUP BY a.num_doc,a.banco HAVING SUM(a.valor+a.monto_desc) <> 0 ORDER BY a.num_doc LET existe = "N" LET idx = 1 FOREACH avances INTO ravances[idx].aplica_a,ravances[idx].pcotizacion,ravances[idx].pendiente IF status = NOTFOUND THEN LET existe = "N" EXIT FOREACH END IF # busca nombre del proyecto LET pnombre_proyecto = NULL SELECT a.nombre_proyecto INTO pnombre_proyecto FROM vetb00050 a WHERE a.cotizacion_no = ravances[idx].pcotizacion LET ravances[idx].nombre_proyecto = pnombre_proyecto LET ravances[idx].nombre_proyecto=pnombre_proyecto SELECT DISTINCT CONVERT(CHAR(10),a.fecha_orig,103) INTO ravances[idx].fecha FROM cctb00001 a WHERE a.tipo_doc ='AV' AND a.num_doc = ravances[idx].aplica_a AND a.num_doc = a.aplica_a AND a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente LET existe = "S" IF ravances[idx].pendiente != 0 THEN LET idx = idx + 1 ELSE CONTINUE FOREACH END IF END FOREACH IF existe="S" THEN DISPLAY ARRAY ravances TO savance.* END IF IF INT_FLAG THEN LET INT_FLAG = FALSE END IF LET curr1= arr_curr() CLOSE WINDOW busqueda1 RETURN ravances[curr1].aplica_a, ravances[curr1].pendiente,ravances[curr1].pcotizacion END FUNCTION FUNCTION datos_doc() CASE WHEN recibo.tipo_doc = "PG" LET nombre_tipo = "PAGOS A FACTURAS" EXIT CASE WHEN recibo.tipo_doc = "OC" LET nombre_tipo = "OTROS CREDITOS" EXIT CASE WHEN recibo.tipo_doc = "NC" LET nombre_tipo = "NOTA CREDITO" EXIT CASE WHEN recibo.tipo_doc = "ND" LET nombre_tipo = "NOTA DEBITO" EXIT CASE WHEN recibo.tipo_doc = "PI" LET nombre_tipo = "PAGO INTER." EXIT CASE WHEN recibo.tipo_doc = "DV" LET nombre_tipo = "DEVOLUCION DINERO" EXIT CASE END CASE LET p_nombre_tipo = nombre_tipo IF recibo.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.tipo_doc = "PG" AND a.num_doc = recibo.num_doc AND a.cod_emp_sec = recibo.cod_emp_sec AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.tipo_doc = recibo.tipo_doc AND a.num_cheque = recibo.num_doc AND a.cod_emp_sec = recibo.cod_emp_sec AND a.status_t IS NULL END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo.tipo_doc = "ND" OR recibo.tipo_doc = "OD" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF SELECT b.nombre,ISNULL(c.calle,' ')+ISNULL(c.casa_num,' ')+ISNULL(c.urbanizacion,' ') +ISNULL(c.barrio,' ') INTO nom_cli,xdireccion FROM vetb00004 b LEFT OUTER JOIN vetb00005 c ON b.tipo_cliente = c.tipo_cliente AND b.sec_cliente = c.sec_cliente WHERE b.tipo_cliente = recibo.tipo_cliente and b.sec_cliente = recibo.sec_cliente SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped { SELECT descripcion INTO nombre_cta FROM cgtb00001 WHERE cuenta_no = recibo.cuenta_no } DISPLAY BY NAME recibo.*,nom_cli,nombre_emp,valor_ctrl,nombre_cta IF recibo.tipo_doc = "PG" THEN LET selec = "SELECT a.num_doc,a.documento_ref,a.tipo_doc_aplica,a.aplica_a,a.valor,a.monto_desc,a.valor ", "FROM cctb00001 a ", "WHERE ((a.tipo_doc = ? OR a.tipo_doc = 'AV') AND ", " a.num_cheque = ?) AND (a.tipo_cliente = ? AND ", " a.sec_cliente = ?) ORDER BY 2,1 " ELSE LET selec = "SELECT a.num_doc,a.documento_ref,a.tipo_doc_aplica,aplica_a,valor,monto_desc,valor FROM cctb00001 a ", "WHERE (a.tipo_doc=? AND a.num_cheque=?)AND (a.tipo_cliente = ? AND ", " a.sec_cliente = ?) ORDER BY a.banco,a.num_Doc " END IF PREPARE comando FROM selec DECLARE buscar1 CURSOR FOR comando OPEN buscar1 USING recibo.tipo_doc,recibo.num_doc,recibo.tipo_cliente, recibo.sec_cliente LET idx = 1 WHILE STATUS != NOTFOUND FETCH buscar1 INTO arr_recibo[idx].* IF STATUS = NOTFOUND THEN EXIT WHILE END IF IF arr_recibo[idx].num_nc = recibo.num_doc THEN LET arr_recibo[idx].num_nc = null END IF IF recibo.tipo_doc != "ND" AND recibo.tipo_doc != "OD" THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen * -1 ELSE IF arr_recibo[idx].valor_pen < 0 THEN LET arr_recibo[idx].valor_pen = arr_recibo[idx].valor_pen *-1 END IF END IF LET arr_recibo[idx].valor_pag = arr_recibo[idx].valor_pen LET arr_recibo[idx].valor_pen = 0 LET arr_recibo[idx].desc_p = arr_recibo[idx].desc_p * -1 SELECT sum(valor) INTO valor2 FROM cctb00001 WHERE tipo_cliente = recibo.tipo_cliente and sec_cliente = recibo.sec_cliente and aplica_a = arr_recibo[idx].aplica_a and status_t is null AND num_cheque = recibo.num_doc LET arr_recibo[idx].valor_pen = valor2 LET idx = idx + 1 END WHILE DISPLAY ARRAY arr_recibo TO s_recibo.* ON ACTION imprimir { CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia START REPORT cctb01 TO archivo FOR idx = 1 TO arr_recibo.getLength() IF arr_recibo[idx].num_nc IS NULL THEN OUTPUT TO REPORT cctb01(recibo.tipo_cliente, recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, recibo.cod_emp_sec,recibo.tipo_doc,null,null, arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, nom_cli,nombre_emp,nombre_cta,recibo.comentario) END IF END FOR FINISH REPORT cctb01 RUN imprime} LET r_filename = "ccprmt001a.4rp" LET r_output = "SVG" LET preview = 1 -- configure report engine; the functions prefixed fgl that are called here are part of the GRW API IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default IF preview = 0 THEN CALL fgl_report_selectPreview(1) -- changing default # CALL fgl_report_configureSVGPreview("PrintOnDefaultPrinter") ELSE CALL fgl_report_selectPreview(preview) END if LET handler = fgl_report_commitCurrentSettings() -- commit changes ELSE EXIT PROGRAM END IF --run the report IF handler IS NOT NULL THEN -- report engine was configured ok START REPORT cctb01b TO XML HANDLER HANDLER FOR idx = 1 TO arr_recibo.getLength() IF arr_recibo[idx].num_nc IS NULL THEN IF arr_recibo[idx].valor_pag IS NOT NULL THEN OUTPUT TO REPORT cctb01b(recibo.tipo_cliente, recibo.sec_cliente,recibo.fecha_orig,recibo.num_doc, recibo.cod_emp_sec,recibo.tipo_doc,null,null, arr_recibo[idx].aplica_a,arr_recibo[idx].desc_p,arr_recibo[idx].valor_pag, nom_cli,nombre_emp,nombre_cta,recibo.comentario) END IF END IF END FOR FINISH REPORT cctb01b END IF AFTER DISPLAY EXIT DISPLAY END DISPLAY END FUNCTION FUNCTION aplica_mas_antiguas() DEFINE balance,valor_aplicando DEC(12,2), j int, pventas char(1) DECLARE busca_antiguas CURSOR FOR SELECT a.aplica_a,SUM(a.valor+a.monto_desc),b.ventas,b.fecha_factura FROM cctb00001 a,vetb00002 b WHERE (a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.tipo_cliente = b.tipo_cliente AND a.sec_cliente = b.sec_cliente) AND (a.tipo_doc NOT IN ('AV','AP') AND a.aplica_a=b.factura) AND a.status_t is null GROUP BY a.aplica_a,b.fecha_factura,b.ventas HAVING SUM(a.valor+a.monto_desc) > 0 ORDER BY b.fecha_factura LET idx = 1 LET j = 1 LET valor_aplicando=0 LET balance=valor_ctrl FOREACH busca_antiguas INTO aplica_wd[idx].aplica_a,aplica_wd[idx].pendiente,pventas LET balance = balance -aplica_wd[idx].pendiente IF balance < 0 THEN IF valor_aplicando < valor_ctrl THEN IF pventas = '1' THEN LET arr_recibo[j].tipo_doc_aplica = 'FT' ELSE LET arr_recibo[j].tipo_doc_aplica = 'FE' END IF LET arr_recibo[j].aplica_a = aplica_wd[idx].aplica_a LET arr_recibo[j].valor_pen=aplica_wd[idx].pendiente LET arr_recibo[j].valor_pag =valor_ctrl-valor_aplicando DISPLAY "DATA2 ", arr_recibo[j].aplica_a," V ",arr_recibo[j].valor_pag END IF EXIT FOREACH ELSE IF pventas = '1' THEN LET arr_recibo[j].tipo_doc_aplica = 'FT' ELSE LET arr_recibo[j].tipo_doc_aplica = 'FE' END IF LET arr_recibo[j].aplica_a = aplica_wd[idx].aplica_a LET arr_recibo[j].valor_pen =aplica_wd[idx].pendiente IF balance > aplica_wd[idx].pendiente THEN LET valor_aplicando = valor_aplicando + aplica_wd[idx].pendiente LET arr_recibo[j].valor_pag =aplica_wd[idx].pendiente END IF DISPLAY "DATA ", arr_recibo[j].aplica_a," V ",arr_recibo[j].valor_pag LET j = j +1 END IF LET idx = idx + 1 END FOREACH END FUNCTION FUNCTION convierte() DEFINE consegui CHAR(1) DEFINE p,miles,m,k,a,b,d,c,entero,unidades_mi,unidades_m,unidad,mil,millon, unid_c,u INTEGER DEFINE cheles DECIMAL (7,2) CALL letras() LET valor_letras = null LET consegui = "N" LET entero = valor_orig LET cheles = (valor_orig - entero) * 100 LET unidad = entero / 100 LET unidad = entero - (unidad * 100) LET a = entero / 1000 LET a = entero - (a * 1000) LET d = entero - 19 IF d >= 82 THEN LET c = entero / 100 # Para Controlar los miles y los cientos IF c <= 9 THEN LET valor_letras = valor_letras clipped," ",centenas[c] clipped ELSE LET c = entero / 1000 LET b = entero / 1000000 END IF IF d > 19 THEN LET d = unidad - 19 END IF IF unidad > 0 and unidad < 20 THEN LET d = unidad LET valor_letras = valor_letras clipped," ",unidades1[d] clipped LET consegui = "S" END IF ELSE IF d > 0 AND d <= 81 THEN LET valor_letras = valor_letras clipped," ",decenas[d] clipped LET consegui = "S" END IF END IF # Para controlar los miles IF entero > 999 THEN LET unidades_m = a / 100 LET unidades_m = a - (unidades_m * 100) LET valor_letras = null IF c = 1 THEN LET valor_letras = "MIL" END IF IF c > 1 and c <= 19 THEN LET valor_letras = valor_letras clipped," ",unidades1[c] clipped," ","MIL" END IF IF c >= 20 and c <= 999 THEN IF c < 82 THEN LET c = c - 19 LET valor_letras = valor_letras clipped," ",decenas[c] clipped ELSE LET k = c / 100 IF k > 0 AND k < 10 THEN LET unid_c = c - (k * 100) # AQUI FUE IF k > 1 THEN LET valor_letras = valor_letras clipped," ",centenas[k] clipped ELSE IF k = 1 then IF unid_c > 0 THEN LET valor_letras = valor_letras clipped," ",centenas[k] clipped ELSE LET valor_letras = valor_letras clipped," ",decenas[81] clipped END IF end if END IF END IF LET unid_c = c - (k * 100) IF unid_c >0 and unid_c < 20 THEN LET valor_letras = valor_letras clipped," ",unidades1[unid_c] clipped ELSE LET unid_c = unid_c -19 IF unid_c >0 and unid_c <=81 then LET valor_letras = valor_letras clipped," ",decenas[unid_c] clipped LET consegui = "S" end if END IF IF c > 82 and c < 100 and consegui <> "S" THEN LET c = c-19 LET valor_letras = valor_letras CLIPPED," ",decenas[c] CLIPPED END IF IF c > 100 AND consegui <> "S" THEN LET c = c -119 IF c > 0 and c <= 81 THEN LET valor_letras = valor_letras CLIPPED," ",decenas[c] CLIPPED LET consegui = "N" END IF END IF END IF LET valor_letras = valor_letras clipped," ","MIL" END IF LET c = a IF c > 100 THEN LET c = c / 100 LET valor_letras = valor_letras clipped," ",centenas[c] clipped END IF IF c = 100 THEN LET valor_letras = valor_letras clipped," ",decenas[81] clipped END IF IF unidades_m > 0 and unidades_m-19 <= 81 THEN LET a = unidades_m -19 IF a > 0 and a<= 81 THEN LET valor_letras = valor_letras clipped, " ",decenas[a] clipped LET consegui="S" ELSE LET valor_letras = valor_letras clipped, " ",unidades1[unidades_m] clipped END IF END IF END IF #======================================================================================== # Para Controlar cantidades en millones IF entero > 999999 THEN LET c = 0 LET miles = entero - 1000000 LET m = miles / 1000 LET p = miles - (m * 1000) LET u = m / 100 LET u = m - (u * 100) LET unidades_mi = p LET unidades_mi = unidades_mi / 100 LET unidades_mi = p - (unidades_mi * 100) LET valor_letras = null IF b = 1 THEN LET valor_letras = "UN MILLON" END IF IF b > 1 and b <= 19 THEN LET valor_letras = valor_letras clipped," ",unidades1[b] clipped," ", "MILLONES" END IF IF b >= 20 and b <= 999999 THEN IF b < 82 THEN LET b = b - 19 LET valor_letras = valor_letras clipped," ",decenas[b] clipped," ", "MILLONES" ELSE LET k = b / 100 LET valor_letras = valor_letras clipped," ",centenas[k] clipped," ", "MILLONES" END IF END IF LET b = m /100 IF b >0 and b <=9 THEN if b = 1 then LET valor_letras = valor_letras clipped," CIEN " else LET valor_letras = valor_letras clipped," ",centenas[b] clipped end if IF u > 0 and u <= 19 THEN IF u = 1 THEN LET unidades1[1] = "UN" END IF LET valor_letras = valor_letras clipped," ",unidades1[u] clipped END IF let u = u - 19 # IF u > 0 and u <= 19 THEN # IF u = 1 THEN # LET unidades1[1] = "UN" # END IF # LET valor_letras = valor_letras clipped," ",unidades1[u] clipped # END IF IF u >=1 and u < 82 THEN # LET u = u - 19 # adicione este 13/5/2011 La quite el 30/5/2011 LET valor_letras = valor_letras clipped," ",decenas[u] clipped END IF LET valor_letras = valor_letras clipped," ","MIL" END IF IF p > 100 THEN LET p = p / 100 LET valor_letras = valor_letras clipped," ",centenas[p] clipped END IF LET unidades_mi = unidades_mi-19 IF unidades_mi > 0 and unidades_mi <= 81 THEN LET m = unidades_mi LET valor_letras = valor_letras clipped, " ",decenas[m] clipped END IF END IF IF unidad > 0 and unidad < 20 AND consegui = "N" THEN LET d = unidad LET valor_letras = valor_letras clipped," ",unidades1[d] clipped END IF IF unidad >= 20 AND d <= 81 AND consegui = "N" THEN LET valor_letras = valor_letras clipped," ",decenas[d] clipped END IF LET valor_letras = valor_letras clipped," ",pmoneda CLIPPED," CON"," ", cheles using "&&", "/100" END FUNCTION FUNCTION letras() LET unidades1[1] = "UNO" LET unidades1[2] = "DOS" LET unidades1[3] = "TRES" LET unidades1[4] = "CUATRO" LET unidades1[5] = "CINCO" LET unidades1[6] = "SEIS" LET unidades1[7] = "SIETE" LET unidades1[8] = "OCHO" LET unidades1[9] = "NUEVE" LET unidades1[10] = "DIEZ" LET unidades1[11] = "ONCE" LET unidades1[12] = "DOCE" LET unidades1[13] = "TRECE" LET unidades1[14] = "CATORCE" LET unidades1[15] = "QUINCE" LET unidades1[16] = "DIECISEIS" LET unidades1[17] = "DIECISIETE" LET unidades1[18] = "DIECIOCHO" LET unidades1[19] = "DIECINUEVE" LET decenas[1] = "VEINTE" LET decenas[2] = "VEINTE Y UNO" LET decenas[3] = "VEINTE Y DOS" LET decenas[4] = "VEINTE Y TRES" LET decenas[5] = "VEINTE Y CUATRO" LET decenas[6] = "VEINTE Y CINCO" LET decenas[7] = "VEINTE Y SEIS" LET decenas[8] = "VEINTE Y SIETE" LET decenas[9] = "VEINTE Y OCHO" LET decenas[10] = "VEINTE Y NUEVE" LET decenas[11] = "TREINTA" LET decenas[12] = "TREINTA Y UNO" LET decenas[13] = "TREINTA Y DOS" LET decenas[14] = "TREINTA Y TRES" LET decenas[15] = "TREINTA Y CUATRO" LET decenas[16] = "TREINTA Y CINCO" LET decenas[17] = "TREINTA Y SEIS" LET decenas[18] = "TREINTA Y SIETE" LET decenas[19] = "TREINTA Y OCHO" LET decenas[20] = "TREINTA Y NUEVE" LET decenas[21] = "CUARENTA" LET decenas[22] = "CUARENTA Y UNO" LET decenas[23] = "CUARENTA Y DOS" LET decenas[24] = "CUARENTA Y TRES" LET decenas[25] = "CUARENTA Y CUATRO" LET decenas[26] = "CUARENTA Y CINCO" LET decenas[27] = "CUARENTA Y SEIS" LET decenas[28] = "CUARENTA Y SIETE" LET decenas[29] = "CUARENTA Y OCHO" LET decenas[30] = "CUARENTA Y NUEVE" LET decenas[31] = "CINCUENTA" LET decenas[32] = "CINCUENTA Y UNO" LET decenas[33] = "CINCUENTA Y DOS" LET decenas[34] = "CINCUENTA Y TRES" LET decenas[35] = "CINCUENTA Y CUATRO" LET decenas[36] = "CINCUENTA Y CINCO" LET decenas[37] = "CINCUENTA Y SEIS" LET decenas[38] = "CINCUENTA Y SIETE" LET decenas[39] = "CINCUENTA Y OCHO" LET decenas[40] = "CINCUENTA Y NUEVE" LET decenas[41] = "SESENTA" LET decenas[42] = "SESENTA Y UNO" LET decenas[43] = "SESENTA Y DOS" LET decenas[44] = "SESENTA Y TRES" LET decenas[45] = "SESENTA Y CUATRO" LET decenas[46] = "SESENTA Y CINCO" LET decenas[47] = "SESENTA Y SEIS" LET decenas[48] = "SESENTA Y SIETE" LET decenas[49] = "SESENTA Y OCHO" LET decenas[50] = "SESENTA Y NUEVE" LET decenas[51] = "SETENTA" LET decenas[52] = "SETENTA Y UNO" LET decenas[53] = "SETENTA Y DOS" LET decenas[54] = "SETENTA Y TRES" LET decenas[55] = "SETENTA Y CUATRO" LET decenas[56] = "SETENTA Y CINCO" LET decenas[57] = "SETENTA Y SEIS" LET decenas[58] = "SETENTA Y SIETE" LET decenas[59] = "SETENTA Y OCHO" LET decenas[60] = "SETENTA Y NUEVE" LET decenas[61] = "OCHENTA" LET decenas[62] = "OCHENTA Y UNO" LET decenas[63] = "OCHENTA Y DOS" LET decenas[64] = "OCHENTA Y TRES" LET decenas[65] = "OCHENTA Y CUATRO" LET decenas[66] = "OCHENTA Y CINCO" LET decenas[67] = "OCHENTA Y SEIS" LET decenas[68] = "OCHENTA Y SIETE" LET decenas[69] = "OCHENTA Y OCHO" LET decenas[70] = "OCHENTA Y NUEVE" LET decenas[71] = "NOVENTA" LET decenas[72] = "NOVENTA Y UNO" LET decenas[73] = "NOVENTA Y DOS" LET decenas[74] = "NOVENTA Y TRES" LET decenas[75] = "NOVENTA Y CUATRO" LET decenas[76] = "NOVENTA Y CINCO" LET decenas[77] = "NOVENTA Y SEIS" LET decenas[78] = "NOVENTA Y SIETE" LET decenas[79] = "NOVENTA Y OCHO" LET decenas[80] = "NOVENTA Y NUEVE" LET decenas[81] = "CIEN" LET centenas[1] = "CIENTO" LET centenas[2] = "DOCIENTOS" LET centenas[3] = "TRESCIENTOS" LET centenas[4] = "CUATROCIENTOS" LET centenas[5] = "QUINIENTOS" LET centenas[6] = "SEISCIENTOS" LET centenas[7] = "SETECIENTOS" LET centenas[8] = "OCHOCIENTOS" LET centenas[9] = "NOVECIENTOS" END FUNCTION