{ ----------------------------------------------------------------------------- PROGRAMA : CPPRMT001 OBJETIVO : Mantenimiento de Factura Proveedor REALIZADO POR : Tadeo A. Ferreras FECHA : Junio 17, 1993 MODIFICADO POR : Juan F. Soto FECHA : Enero 16, 1996 DESCRIPCION : Buscar conjuntamente con los pre-pagos las NOTAS DE DEBITO ----------------------------------------------------------------------------- } GLOBALS "cpprgb000.4gl" DEFINE hoy,fecha1,fecha2 DATE DEFINE debe_ir CHAR(1) DEFINE cuenta CHAR(8) DEFINE total1,valor_cxp,valor,valor_f DECIMAL(12,2) DEFINE cat,dpto,refe,tiene_cta,chequea,ctrl_cxp CHAR(1) DEFINE ctrl_reg,orden_ant,aplicar INTEGER DEFINE p,l,niv,cod1_sp,cod1_sp_sec SMALLINT DEFINE idx2,p_orden INTEGER DEFINE pbase,flete,gasto,pvalor,tvalor DECIMAL(16,2) DEFINE val_pen,valor_fac1,valor2 DECIMAL(13,2) DEFINE nom_tipo CHAR(15) DEFINE idx1 SMALLINT DEFINE nombre,apellido CHAR(14) DEFINE tipo_emp CHAR(1) DEFINE buscar_oc RECORD orden_no INTEGER, fecha_orig DATE, cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30) END RECORD DEFINE cod_sp1,cod_sp2 SMALLINT DEFINE total_v DECIMAL(12,2) DEFINE valor3 DECIMAL(12,2) DEFINE datos_usu RECORD status_t CHAR(1), us_crea CHAR(9), fech_crea LIKE cptb00001.fech_crea, us_mod CHAR(9), fech_mod LIKE cptb00001.fech_mod END RECORD DEFINE supl ARRAY[200] OF RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sp CHAR(30) END RECORD DEFINE cuentas ARRAY[200] OF RECORD cuenta_no CHAR(8), departamento SMALLINT, cod_aux SMALLINT, sec_aux SMALLINT, num_doc CHAR(10), debito DECIMAL(12,2), credito DECIMAL(12,2) END RECORD DEFINE descripcion CHAR(30) DEFINE arrfac1 DYNAMIC ARRAY OF RECORD tipo CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12,2), valor DECIMAL(12,2) END RECORD DEFINE arrfac DYNAMIC ARRAY OF RECORD tipo CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12,2), valor DECIMAL(12,2) END RECORD DEFINE arr_fac1 DYNAMIC ARRAY OF RECORD tipo CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12,2), valor DECIMAL(12,2) END RECORD DEFINE j RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30), num_doc CHAR(10), valor_fac DECIMAL(12,2), detalle CHAR(30), tipo CHAR(1), aplica_a CHAR(10), valor DECIMAL(12,2) END RECORD DEFINE ordenes DYNAMIC ARRAY OF RECORD orden_no LIKE cptb00001.orden_no, tipo LIKE cptb00001.tipo END RECORD DEFINE i INTEGER MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT to "smarmotech" user usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL cpprmt001() END MAIN FUNCTION cpprmt001() OPTIONS FORM LINE 8, ERROR LINE 24, COMMENT LINE 22, PROMPT LINE 23 OPEN FORM cpfmmt001 FROM "cpfmmt001" DISPLAY FORM cpfmmt001 DISPLAY "cpprmt001" AT 4,3 DISPLAY "Registro de Facturas" AT 6,29 MENU "OPCION" COMMAND "Adicionar" "Adiciona Registro Cancela Operacion Codigo del Suplidor" CALL cppcad000() COMMAND "Consultar-modificar" " Busca Registro Cancela Operacion" CALL cppcmd000() COMMAND "Salir" EXIT MENU END MENU END FUNCTION ####### Proceso para Insertar Una Factura ########### FUNCTION cppcad000() DEFINE porc_p DECIMAL(10,2) DEFINE emp SMALLINT LET hoy = null LABEL volver: INITIALIZE factura TO NULL LET factura.cod_sp = cod_sp1 LET factura.cod_sp_sec = cod_sp2 LET factura.fecha_orig = fecha1 LET factura.fecha_proc = fecha2 INPUT BY NAME factura.* WITHOUT DEFAULTS ON KEY (control-p) NEXT FIELD cod_sp ON KEY (control-w) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() LET int_flag = FALSE IF factura.cod_sp_sec IS NULL OR factura.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME factura.cod_sp,factura.cod_sp_sec,nom_sup NEXT FIELD num_doc END IF EXIT CASE WHEN INFIELD(cod_sp_sec) CALL busca_suplidor() LET int_flag = FALSE IF factura.cod_sp_sec IS NULL OR factura.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME factura.cod_sp,factura.cod_sp_sec,nom_sup ATTRIBUTE(BLUE) NEXT FIELD num_doc END IF EXIT CASE END CASE AFTER FIELD cod_sp ### Codigo Suplidor If factura.cod_sp IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp END IF AFTER FIELD cod_sp_sec ### Secuencia Suplidor IF factura.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF SELECT a.nom_sp INTO nom_sup FROM cotb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF LET cod_sp1 = factura.cod_sp LET cod_sp2 = factura.cod_sp_sec DISPLAY BY NAME nom_sup ATTRIBUTE (BLUE)#### Nombre del suplidor BEFORE FIELD num_doc LET factura.num_doc = NULL DISPLAY BY NAME factura.num_doc AFTER FIELD num_doc #### Numero del documento o factura IF factura.num_doc IS NULL OR factura.num_doc[1] = " " THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT UNIQUE a.num_doc,a.status_t INTO factura.num_doc,datos_usu.status_t FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.num_doc = factura.num_doc AND a.tipo_doc = "FT" ##### Proceso para evitar se digite el mismo numero de factura ##### Para el mismo suplidor IF datos_usu.status_t = "E" THEN LET numero_msg = 36 CALL msg(numero_msg) NEXT FIELD num_doc END IF IF status != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_doc END IF BEFORE FIELD fecha_orig IF fecha1 IS NULL OR fecha1 > TODAY THEN LET fecha1 = today END IF LET factura.fecha_orig = fecha1 DISPLAY BY NAME factura.fecha_orig AFTER FIELD fecha_orig IF factura.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF IF factura.fecha_orig > TODAY THEN LET numero_msg = 189 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET fecha1 = factura.fecha_orig LET p_fechas = factura.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF BEFORE FIELD fecha_proc IF factura.cod_sp = 23 THEN LET factura.fecha_proc = factura.fecha_orig DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) NEXT FIELD valor_fac END IF DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) {AFTER FIELD fecha_proc IF factura.cod_sp = 23 THEN LET factura.fecha_proc = factura.fecha_orig DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) END IF IF factura.fecha_proc IS NULL OR factura.fecha_proc > TODAY THEN LET factura.fecha_proc = today END IF DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) LET fecha2 = factura.fecha_proc } AFTER FIELD valor_fac IF factura.valor_fac IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_fac END IF IF factura.valor_fac < 0 THEN LET valor = 0 NEXT FIELD valor_fac END IF IF factura.cod_sp = 21 OR factura.cod_sp = 22 THEN NEXT FIELD tipo_oc ELSE NEXT FIELD detalle END IF AFTER FIELD tipo_oc IF factura.tipo_oc is null THEN LET numero_msg = 16 CALL msg(numero_msg) #NEXT FIELD tipo_oc END IF AFTER FIELD orden_no IF factura.orden_no is null THEN LET numero_msg = 16 CALL msg(numero_msg) #NEXT FIELD tipo_oc END IF SELECT UNIQUE a.tipo,a.num_oc FROM cotb00014 a WHERE a.tipo = factura.tipo_oc AND a.num_oc = factura.orden_no AND a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.status_t is null IF status = notfound THEN LET numero_msg = 358 CALL msg(numero_msg) # NEXT FIELD tipo_oc END IF BEFORE FIELD detalle LET factura.detalle = NULL DISPLAY BY NAME factura.detalle ATTRIBUTE(BLUE) AFTER INPUT EXIT INPUT END INPUT ##### Proceso Para abortar OPERACION ###### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF CALL contab() IF int_flag THEN LET int_flag = false RETURN END IF DECLARE buscar4 CURSOR FOR SELECT UNIQUE "N",a.num_doc,a.tipo_doc,a.valor *-1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a =a.num_doc AND a.tipo_doc IN ("ND") AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 LET idx = 1 FOREACH buscar4 INTO arrfac[idx].* LET arr_fac1[idx].tipo = "N" LET arr_fac1[idx].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx].valor = arrfac[idx].valor_prep LET idx = idx + 1 END FOREACH DECLARE buscar CURSOR FOR SELECT UNIQUE "N",a.num_doc,a.tipo_doc,SUM(a.valor*-1) FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a is null AND a.tipo_doc IN ("CP") AND a.status_t IS NULL GROUP BY a.num_doc,a.tipo_doc ORDER BY a.num_doc LET idx1 = idx FOREACH buscar INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc = "CP" AND a.status_t IS NULL IF valor1 IS NULL THEN LET valor1 = 0 END IF LET arrfac[idx].valor_prep = arrfac[idx].valor_prep + valor1 LET arrfac[idx].valor = arrfac[idx].valor_prep IF arrfac[idx].valor > 0 THEN LET arr_fac1[idx1].tipo = "N" LET arr_fac1[idx1].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx1].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx1].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx1].valor = arrfac[idx].valor LET idx1 = idx1 + 1 END IF LET idx = idx + 1 END FOREACH LET l = 1 FOR p = 1 TO idx IF arr_fac1[p].aplica_a is not null THEN IF arr_fac1[l].valor_prep > 0 THEN LET arr_fac1[l].tipo = "N" LET arr_fac1[l].aplica_a = arrfac[p].aplica_a LET arr_fac1[l].tipo_doc = arrfac[p].tipo_doc LET arr_fac1[l].valor_prep = arrfac[p].valor_prep LET arr_fac1[l].valor = arrfac[p].valor_prep LET l = l + 1 END IF END IF END FOR CALL SET_COUNT(l - 1) LABEL volver1: INPUT ARRAY arr_fac1 WITHOUT DEFAULTS FROM factura1.* BEFORE ROW LET curr = arr_curr() LET fila = scr_line() AFTER FIELD valor ##### Valor del documento o factura IF arr_fac1[curr].valor IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor END IF IF arr_fac1[curr].valor > arr_fac1[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET total1 = 0 FOR k = 1 TO arr_curr() IF arr_fac1[k].tipo = "S" THEN LET total1 = total1 + arr_fac1[k].valor END IF END FOR IF total1 > factura.valor_fac THEN LET numero_msg = 162 CALL msg(numero_msg) GOTO volver1 END IF ###### Insertando registros en la Maestra de cuentas por Pagar #### LET cod_sp1 = factura.cod_sp BEGIN WORK INSERT INTO cptb00001 values ("FT",factura.num_doc,factura.cod_sp, factura.cod_sp_sec,factura.fecha_orig,factura.fecha_proc, factura.orden_no,factura.tipo_oc, factura.num_doc,null,factura.valor_fac,factura.detalle,null,SUSER_SNAME(), GETDATE(),null,null) FOR idx = 1 TO ARR_COUNT() IF arr_fac1[idx].tipo = "S" AND arr_fac1[idx].valor > 0 THEN IF arr_fac1[idx].tipo_doc = "CP" THEN LET arrfac[idx].valor = arrfac[idx].valor * -1 INSERT INTO cptb00001 values (arr_fac1[idx].tipo_doc, arr_fac1[idx].aplica_a, factura.cod_sp,factura.cod_sp_sec,factura.fecha_orig, factura.fecha_proc,ordenes[idx].*,factura.num_doc, null,arr_fac1[idx].valor,null,null,SUSER_SNAME(),GETDATE(),null,null) ELSE UPDATE cptb00001 set aplica_a = factura.num_doc WHERE num_doc = arr_fac1[idx].aplica_a and tipo_doc = "ND" AND tipo = "ND" END IF END IF END FOR DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc AND fecha > "01/01/2008" IF factura.cod_sp = 22 THEN LET cuenta = "2114" END IF IF factura.cod_sp = 23 THEN LET cuenta = "2113" END IF IF factura.cod_sp = 24 THEN LET cuenta = "2116" END IF FOR idx = 1 TO ctrl_reg IF cuentas[idx].cuenta_no IS NOT NULL THEN IF idx = 1 THEN INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp, factura.cod_sp_sec,factura.num_doc,cuenta,null,null,null,null,null, 0,factura.valor_fac,NULL,SUSER_SNAME(),GETDATE(),NULL,NUll) END IF IF cuentas[idx].debito <> 0 OR cuentas[idx].credito <> 0 THEN IF cuentas[idx].debito IS NULL THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito IS NULL THEN LET cuentas[idx].credito = 0 END IF INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp, factura.cod_sp_sec,factura.num_doc,cuentas[idx].cuenta_no, cuentas[idx].departamento,cuentas[idx].num_doc,cuentas[idx].cod_aux, cuentas[idx].sec_aux,factura.detalle,cuentas[idx].debito,cuentas[idx].credito, NULL,SUSER_SNAME(),GETDATE(),NULL,NUll) END IF END IF END FOR COMMIT WORK LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM GOTO volver END FUNCTION ###### Proceso de Modificacion de registros FUNCTION cppcmd000() ##### Criterio de Busqueda de informacion a consultar y/o modificar CONSTRUCT CRITERIO ON b.cod_sp,b.cod_sp_sec,b.num_doc,b.fecha_orig, b.fecha_proc,b.valor,b.detalle FROM cod_sp,cod_sp_sec,num_doc,fecha_orig,fecha_proc, valor,detalle IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF ##### Busquedas de los datos generales LET selec = "SELECT UNIQUE b.cod_sp,b.cod_sp_sec,b.num_doc,b.fecha_orig, ", " b.fecha_proc,b.valor,b.detalle,b.status_t,b.us_crea, ", " b.fech_crea,b.us_mod,b.fech_mod ", "FROM cptb00001 b ", "WHERE b.status_t is null AND b.tipo_doc = 'FT' AND ", criterio clipped," ORDER BY 1,2" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos #### Buscando el primer registro FETCH FIRST datos INTO factura.*,datos_usu.* IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME factura.*,nom_sup ATTRIBUTE(BLUE) MENU "OPCION" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO factura.*,datos_usu.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME factura.*,nom_sup ATTRIBUTE(BLUE) COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO factura.*,datos_usu.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME factura.*,nom_sup ATTRIBUTE(BLUE) COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO factura.*,datos_usu.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME factura.*,nom_sup ATTRIBUTE(BLUE) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO factura.*,datos_usu.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME factura.*,nom_sup ATTRIBUTE(BLUE) ###### Escoger registro para modificar COMMAND "Escoger" "Actualiza Registro Cancela Operacion Codigo Suplidor" LET p_fechas = factura.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera LET debe_ir = "N" IF bandera = 1 THEN LET bandera = 0 LET debe_ir = "S" RETURN END IF IF debe_ir = "N" THEN INPUT BY NAME factura.fecha_orig,factura.fecha_proc,factura.valor_fac, factura.tipo_oc,factura.orden_no, factura.detalle WITHOUT DEFAULTS { AFTER FIELD tipo_oc IF factura.tipo_oc is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF AFTER FIELD orden_no IF factura.orden_no is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF SELECT UNIQUE a.tipo,a.num_oc FROM cotb00014 a WHERE a.tipo = factura.tipo_oc AND a.num_oc = factura.orden_no AND a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.status_t is null IF status = notfound THEN LET numero_msg = 358 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF } AFTER FIELD fecha_orig IF factura.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = factura.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF AFTER FIELD fecha_proc IF factura.fecha_proc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_proc END IF DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) AFTER FIELD valor_fac IF factura.valor_fac IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_fac END IF { IF factura.cod_sp = 21 OR factura.cod_sp = 22 THEN NEXT FIELD tipo_oc ELSE NEXT FIELD detalle END IF } AFTER INPUT EXIT INPUT END INPUT ##### Proceso Para abortar OPERACION ###### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF END IF LET debe_ir = "N" CALL contab() DECLARE busca2 CURSOR FOR SELECT "S",a.num_doc,a.tipo_doc,a.valor * -1,a.valor * -1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = factura.num_doc AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 LET idx = 1 FOREACH busca2 INTO arrfac[idx].* LET idx = idx + 1 END FOREACH DECLARE busca3 CURSOR FOR SELECT "N",a.num_doc,a.tipo_doc,a.valor * -1,a.valor * -1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = a.num_doc AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 FOREACH busca3 INTO arrfac[idx].* LET idx = idx + 1 END FOREACH DECLARE buscar1 CURSOR FOR SELECT "S",a.num_doc,a.tipo_doc,a.valor * -1,a.valor * -1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = factura.num_doc AND a.tipo_doc in ("CP") AND a.status_t IS NULL ORDER BY 2 FOREACH buscar1 INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor2 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc in ("CP") AND a.status_t IS NULL SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc in ("CP") AND a.status_t IS NULL AND a.aplica_a != arrfac[idx].aplica_a IF valor1 IS NULL THEN LET valor1 = 0 END IF IF valor2 IS NULL THEN LET valor2 = 0 END IF LET arrfac[idx].valor = arrfac[idx].valor_prep LET arrfac[idx].valor_prep = valor2 - valor1 LET idx = idx + 1 END FOREACH DECLARE buscar20 CURSOR FOR SELECT UNIQUE "N",a.num_doc,a.tipo_doc,SUM(a.valor*-1) FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a is null AND a.tipo_doc IN ("CP") AND a.status_t IS NULL GROUP BY a.num_doc,a.tipo_doc ORDER BY a.num_doc LET idx1 = idx FOREACH buscar20 INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc = "CP" AND a.status_t IS NULL IF valor1 IS NULL THEN LET valor1 = 0 END IF LET arrfac[idx].valor_prep = arrfac[idx].valor_prep + valor1 LET arrfac[idx].valor = arrfac[idx].valor_prep IF arrfac[idx].valor > 0 THEN LET arr_fac1[idx1].tipo = "N" LET arr_fac1[idx1].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx1].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx1].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx1].valor = arrfac[idx].valor LET idx1 = idx1 + 1 END IF LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) LABEL volver2: INPUT ARRAY arrfac WITHOUT DEFAULTS FROM factura1.* BEFORE ROW LET curr = arr_curr() LET fila = scr_line() AFTER FIELD aplica_a IF arrfac[curr].tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo END IF IF arrfac[curr].aplica_a IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arrfac[curr].tipo_doc = "CP" THEN SELECT SUM(a.valor) INTO valor3 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.tipo_doc = "CP" AND a.num_doc = arrfac[curr].aplica_a AND a.aplica_a IS NOT NULL AND a.num_doc != arrfac[curr].aplica_a AND a.status_t IS NULL SELECT SUM(a.valor * -1) INTO valor2 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.tipo_doc = "CP" AND a.num_doc = arrfac[curr].aplica_a AND a.aplica_a IS NULL AND a.status_t IS NULL IF valor2 IS NULL THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF valor2 IS NULL THEN LET valor2 = 0 END IF IF valor3 IS NULL THEN LET valor3 = 0 END IF LET arrfac[curr].valor_prep = valor2 + valor3 IF arrfac[curr].valor IS NULL THEN LET arrfac[curr].valor = arrfac[curr].valor_prep END IF IF arrfac[curr].valor > arrfac[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF ELSE SELECT unique valor*-1 INTO valor2 FROM cptb00001 WHERE num_doc = arrfac[curr].aplica_a and tipo_doc = "ND" and cod_sp = factura.cod_sp and cod_sp_sec = factura.cod_sp_sec IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD aplica_a END IF END IF DISPLAY arrfac[curr].aplica_a,arrfac[curr].tipo_doc,arrfac[curr].valor_prep, arrfac[curr].valor TO factura1[fila].aplica_a,factura1[fila].tipo_doc,factura1[fila].valor_prep, factura1[fila].valor AFTER FIELD valor ##### Valor del documento o factura IF arrfac[curr].valor IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor END IF IF arrfac[curr].valor > arrfac[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET total1 = 0 FOR k = 1 TO arr_curr() IF arrfac[k].tipo = "S" THEN LET total1 = total1 + arrfac[k].valor END IF END FOR IF total1 > factura.valor_fac THEN LET numero_msg = 162 CALL msg(numero_msg) GOTO volver2 END IF ###### Insertando registros en la Maestra de cuentas por Pagar #### LET cod_sp1 = factura.cod_sp BEGIN WORK DELETE FROM cptb00001 WHERE @aplica_a = factura.num_doc AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @tipo_doc = "CP" AND fecha_orig > "01/01/2008" UPDATE cptb00001 set (fecha_orig,fecha_proc,orden_no,tipo,valor,detalle, us_mod,fech_mod) = (factura.fecha_orig,factura.fecha_proc, factura.orden_no,factura.tipo_oc, factura.valor_fac,factura.detalle, SUSER_SNAME(),GETDATE()) WHERE @num_doc = factura.num_doc AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @tipo_doc = "FT" LET k = 0 FOR idx = 1 to ARR_COUNT() LET k = k + 1 IF arrfac[idx].tipo = "S" AND arrfac[idx].valor > 0 THEN LET arrfac[idx].valor = arrfac[idx].valor * -1 IF arrfac[idx].tipo_doc = "CP" THEN INSERT INTO cptb00001 values (arrfac[idx].tipo_doc, arrfac[idx].aplica_a, factura.cod_sp,factura.cod_sp_sec,factura.fecha_orig, factura.fecha_proc,ordenes[idx].*,factura.num_doc, null,arrfac[idx].valor,null,null,SUSER_SNAME(),GETDATE(),SUSER_SNAME(), GETDATE()) ELSE UPDATE cptb00001 SET aplica_a = factura.num_doc WHERE num_doc = arr_fac1[idx].aplica_a and tipo_doc = "ND" AND tipo = "ND" END IF END IF IF arrfac[idx].tipo = "N" THEN UPDATE cptb00001 SET aplica_a = num_doc WHERE num_doc = arrfac[idx].aplica_a and tipo_doc = "ND" AND tipo = "ND" END IF END FOR IF k IS NULL OR k = 0 THEN LET k = 1 END IF IF debe_ir = "N" THEN DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc AND fecha > "01/01/2008" IF factura.cod_sp = 22 THEN LET cuenta = "2114" END IF IF factura.cod_sp = 23 THEN LET cuenta = "2113" END IF IF factura.cod_sp = 24 THEN LET cuenta = "2116" END IF FOR idx = 1 TO ctrl_reg IF cuentas[idx].cuenta_no IS NOT NULL THEN IF idx = 1 THEN INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp, factura.cod_sp_sec,factura.num_doc,cuenta,null,null,null,null,null, 0,factura.valor_fac,NULL,SUSER_SNAME(),GETDATE(),NULL,NUll) END IF IF cuentas[idx].debito <> 0 OR cuentas[idx].credito <> 0 THEN IF cuentas[idx].debito IS NULL THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito IS NULL THEN LET cuentas[idx].credito = 0 END IF INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp, factura.cod_sp_sec,factura.num_doc,cuentas[idx].cuenta_no, cuentas[idx].departamento,cuentas[idx].num_doc,cuentas[idx].cod_aux, cuentas[idx].sec_aux,factura.detalle,cuentas[idx].debito,cuentas[idx].credito, NULL,SUSER_SNAME(),GETDATE(),NULL,NUll) END IF END IF END FOR END IF COMMIT WORK LET numero_msg = 13 CALL msg(numero_msg) IF debe_ir = "S" THEN START REPORT apl_fact TO "%USHOME%\\archivo" FOR idx = 1 TO k IF arrfac[idx].tipo IS NOT NULL THEN LET j.cod_sp = factura.cod_sp LET j.cod_sp_sec = factura.cod_sp_sec LET j.nom_sup = nom_sup LET j.num_doc = factura.num_doc LET j.valor_fac = factura.valor_fac LET j.detalle = factura.detalle LET j.tipo = arrfac[idx].tipo LET j.aplica_a = arrfac[idx].aplica_a LET j.valor = arrfac[idx].valor OUTPUT TO REPORT apl_fact(j.*) END IF END FOR FINISH REPORT apl_fact ##### Proceso Para Anular una Factura END IF COMMAND KEY ("L") "eLiminar" LET bandera = 0 LET p_fechas = factura.fecha_orig { CALL prd(p_fechas) IF bandera = 1 THEN LET bandera = 0 RETURN END IF } # Inserta en la tabla Historica Registros Eliminados BEGIN WORK INSERT INTO cptb00006 select *from cptb00001 WHERE @tipo_doc = "FT" AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @aplica_a = factura.num_doc UPDATE cptb00006 set us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @tipo_doc = "FT" AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @aplica_a = factura.num_doc #------------------------------------------------------------------------- DELETE FROM cptb00001 WHERE @tipo_doc = "FT" AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @aplica_a = factura.num_doc and fecha_orig > "01/01/2008" # Inserta en la tabla Historica Registros Eliminados INSERT INTO cptb00005 select *from cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc UPDATE cptb00005 set us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc #-------------------------------------------------------------------------- DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc and fecha > "01/01/2008" COMMIT WORK LET numero_msg = 82 CALL msg(numero_msg) COMMAND "Retornar" CLEAR FORM EXIT MENU END MENU END FUNCTION #### Busqueda de datos generales referente a un suplidor FUNCTION busca_suplidor() LET int_flag = FALSE OPEN WINDOW busca_sp AT 10,3 WITH FORM "cpfmwd001" ATTRIBUTE(BORDER,FORM LINE FIRST + 2,COMMENT LINE LAST) CONSTRUCT criterio ON a.nom_sp FROM nom_sp IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLOSE WINDOW busca_sp RETURN END IF LET selec = "SELECT a.cod_sp,a.cod_sp_sec,a.nom_sp FROM cotb00001 a ", "WHERE a.status_t IS NULL AND ",criterio CLIPPED," ORDER BY 3 " PREPARE comando1 FROM selec DECLARE busc CURSOR FOR comando1 LET idx = 1 FOREACH busc INTO supl[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx -1) DISPLAY ARRAY supl TO s_suplid.* LET curr = ARR_CURR() LET factura.cod_sp = supl[curr].cod_sp LET factura.cod_sp_sec = supl[curr].cod_sp_sec LET nom_sup = supl[curr].nom_sp CLOSE WINDOW busca_sp END FUNCTION FUNCTION contab() LET int_flag = FALSE OPEN WINDOW cpfmwd007 AT 10,3 WITH FORM "cpfmwd007" ATTRIBUTE(BORDER,FORM LINE FIRST + 2,COMMENT LINE LAST) DECLARE busca_ctas CURSOR FOR SELECT a.cuenta_no,a.departamento,a.cod_aux,a.cod_sec,a.num_doc, a.debito,a.credito FROM cptb00003 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.factura = factura.num_doc AND a.cuenta_no NOT IN ("21-03","21-02") LET idx2 = 1 FOREACH busca_ctas INTO cuentas[idx2].* LET idx2 = idx2 + 1 END FOREACH CALL SET_COUNT(idx2 - 1) LABEL arreglo1: LET int_flag = FALSE INPUT ARRAY cuentas WITHOUT DEFAULTS FROM cuentas1.* BEFORE ROW LET curr = ARR_CURR() LET curr1 = SCR_LINE() AFTER FIELD cuenta_no IF cuentas[curr].cuenta_no IS NOT NULL THEN SELECT a.descripcion,a.cata,a.depto,a.nivel,a.ref INTO descripcion,cat,dpto,niv,refe FROM cgtb00001 a WHERE a.status_t IS NULL AND a.cuenta_no = cuentas[curr].cuenta_no AND a.nivel = 3 IF STATUS = NOTFOUND OR descripcion IS NULL THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF DISPLAY BY NAME descripcion ATTRIBUTE(BLUE) IF cuentas[curr].cuenta_no = "21-02" or cuentas[curr].cuenta_no = "21-03" THEN LET numero_msg = 192 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF IF cat = "S" THEN IF cuentas[curr].cod_aux IS NULL THEN LET cuentas[curr].cod_aux = factura.cod_sp END IF IF cuentas[curr].sec_aux IS NULL THEN LET cuentas[curr].sec_aux = factura.cod_sp_sec END IF END IF IF refe = "S" THEN IF cuentas[curr].num_doc IS NULL THEN LET cuentas[curr].num_doc = factura.orden_no END IF END IF DISPLAY cuentas[curr].cod_aux,cuentas[curr].sec_aux,cuentas[curr].num_doc TO cuentas1[curr1].cod_aux,cuentas1[curr1].sec_aux,cuentas1[curr1].num_doc BEFORE FIELD departamento IF dpto = "N" OR dpto IS NULL THEN LET cuentas[curr].departamento = NULL NEXT FIELD cod_aux END IF AFTER FIELD departamento IF cuentas[curr].departamento IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD departamento END IF SELECT UNIQUE a.departamento FROM adtb00001 a WHERE a.status_t IS NULL AND a.departamento = cuentas[curr].departamento IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD departamento END IF BEFORE FIELD cod_aux IF cat = "N" OR cat IS NULL THEN LET cuentas[curr].cod_aux = NULL LET cuentas[curr].sec_aux = NULL NEXT FIELD num_doc END IF AFTER FIELD cod_aux IF cat = "N" OR cat IS NULL THEN LET cuentas[curr].cod_aux = NULL LET cuentas[curr].sec_aux = NULL NEXT FIELD num_doc END IF BEFORE FIELD num_doc IF refe = "N" OR refe IS NULL THEN LET cuentas[curr].num_doc = NULL NEXT FIELD debito END IF AFTER FIELD num_doc IF refe = "N" OR refe IS NULL THEN LET cuentas[curr].num_doc = NULL NEXT FIELD debito END IF AFTER ROW IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT INPUT END IF IF cuentas[curr].cuenta_no is not null THEN IF cuentas[curr].debito = 0 and cuentas[curr].credito = 0 THEN LET numero_msg = 207 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF END INPUT IF int_flag THEN GOTO sale END IF FOR idx = 1 TO arr_count() IF cuentas[idx].cuenta_no is not null THEN IF cuentas[idx].cuenta_no = "21-02" or cuentas[idx].cuenta_no = "21-03" THEN LET chequea = "S" LET valor_cxp = valor_cxp + cuentas[idx].debito END IF END IF END FOR IF chequea = "S" THEN IF valor_f != valor_cxp THEN LET numero_msg = 206 CALL msg(numero_msg) SLEEP 2 RETURN #NEXT FIELD debito END IF END IF # Controla las cuentas por pagar si se digito una cuenta perteneciente # a las cuentas por pagar y no se le dice al programa que no afecta # las cuentas por pagar LET tiene_cta = "N" FOR idx = 1 TO arr_count() IF cuentas[idx].cuenta_no is not null THEN LET tiene_cta = "S" END IF END FOR IF tiene_cta = "N" THEN LET numero_msg = 84 CALL msg(numero_msg) GOTO arreglo1 #RETURN END IF LET valor = 0 LET monto = 0 #LET ctrl_reg = 0 FOR idx = 1 TO arr_count() IF cuentas[idx].debito is null THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito is null THEN LET cuentas[idx].credito = 0 END IF LET valor = valor + cuentas[idx].debito LET monto = cuentas[idx].credito + monto LET ctrl_reg = idx END FOR LET valor = valor - monto IF valor != factura.valor_fac THEN LET numero_msg = 213 CALL msg(numero_msg) CLEAR FORM GOTO arreglo1 END IF LABEL sale: CLOSE WINDOW cpfmwd007 END FUNCTION REPORT apl_fact(x) DEFINE x RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30), num_doc CHAR(10), valor_fac DECIMAL(12,2), detalle CHAR(30), tipo CHAR(1), aplica_a CHAR(10), valor DECIMAL(12,2) END RECORD DEFINE cod1,dias SMALLINT DEFINE direccion,p_descrip CHAR(30) DEFINE p_casa,p_zona,p_numero CHAR(10) 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 tipo CHAR(2) DEFINE imp_cli CHAR(1) DEFINE credito, debito, tcredito, tdebito, tbalance,t_valor1,t_valor2, limite,b_balance,v1_30,v31_45,v46_60,vm_60,p_valor,t_valor3 DECIMAL(12,2) OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 PAGE LENGTH 66 FORMAT PAGE HEADER LET doble_on = ASCII 14 LET doble_off = ASCII 20 LET negrillas_on = ASCII 027, ASCII 098 LET negrillas_off = ASCII 027, ASCII 099 LET comp_on = ASCII 31 LET comp_off = ASCII 30 LET comprimido = ASCII 031 LET doce = ASCII 27, ASCII 77 LET normal = ASCII 27, ASCII 80 LET normall = ASCII 030 LET hora = time LET lj = (86 - LENGTH(p_companias.nombre CLIPPED))/2 PRINT COLUMN 1, comp_off,negrillas_on PRINT COLUMN 1, "cpprmt001", COLUMN lj, p_companias.nombre CLIPPED, COLUMN 79, "Pag. ",pageno using "###" PRINT COLUMN 16, " Sistema de Cuentas por Pagar", COLUMN 79, today using "dd/mm/yyyy" PRINT COLUMN 16, " Modificacion de Factura", COLUMN 82, hora SKIP 1 LINE LET b_balance = 0 PRINT COLUMN 1, "Factura No. : ",x.num_doc PRINT COLUMN 1, "Suplidor : ",x.cod_sp using "&&","-", x.cod_sp_sec using "&&&&", " ", x.nom_sup clipped PRINT COLUMN 1, "Fecha Aplic.: ", today USING "dd/mm/yyyy" PRINT COLUMN 1, "Valor Fact. : ", x.valor_fac USING "###,###,###.##" PRINT COLUMN 1, "Observacion : ", x.detalle CLIPPED SKIP 1 LINE PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------" PRINT COLUMN 1, "Tipo", COLUMN 20, "Aplica", COLUMN 65, "Monto " PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------" PRINT COLUMN 1, negrillas_off LET debito = 0 ON EVERY ROW LET debito = debito + x.valor PRINT COLUMN 1, x.tipo, COLUMN 20, x.aplica_a, COLUMN 60, x.valor USING "###,###,###.##" ON LAST ROW PRINT comp_off END REPORT