Files
DECOMARMOL/PROYECTO/cpdir/cpprmt001.4gl
T

1937 lines
60 KiB
Plaintext

{
-----------------------------------------------------------------------------
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
-----------------------------------------------------------------------------
}
IMPORT os
GLOBALS "cpprgb000.4gl"
DEFINE debito1,credito1,credito2 decimal(12,2),ent_num CHAR(150)
DEFINE valor_pr DECIMAL(12,2)
DEFINE term_sp SMALLINT
DEFINE fecha_control date
DEFINE dias SMALLINT
DEFINE puser char(80)
DEFINE itbis DECIMAL(16,2)
DEFINE hoy,fecha1,fecha2 DATE
DEFINE debe_ir CHAR(1)
DEFINE cuenta,cuenta_sp 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,ultimo SMALLINT
DEFINE nombre,apellido CHAR(14)
DEFINE tipo_emp CHAR(1)
DEFINE cuadradatrx BOOLEAN
DEFINE tiempo,pano CHAR(4),entrada_no CHAR(14), numero_ent CHAR(2),
foto CHAR(200),nombre_file_foto CHAR(100),imagefac,d_tipos, f_tipos, mensaje,filepath,filedestino STRING
,pimagen BYTE
DEFINE cuenta_itibis,cuenta_mayor CHAR(8),
cod_mon INTEGER,
credito decimal(12,2)
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 valor3 DECIMAL(12,2)
DEFINE datos_usu RECORD
status_t CHAR(1),
us_crea CHAR(9),
fech_crea CHAR(16),
us_mod CHAR(9),
fech_mod CHAR(16)
END RECORD
DEFINE supl DYNAMIC ARRAY 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(13),
debito DECIMAL(12,2),
credito DECIMAL(12,2)
END RECORD
DEFINE descripcion CHAR(30)
DEFINE arrfac DYNAMIC ARRAY OF RECORD
tipo CHAR(1),
aplica_a CHAR(11),
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(11),
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(13),
valor_fac DECIMAL(12,2),
detalle CHAR(30),
tipo CHAR(1),
aplica_a CHAR(11),
valor DECIMAL(12,2)
END RECORD
DEFINE ordenes DYNAMIC ARRAY OF RECORD
orden_no LIKE cptb00001.orden_no,
tipo LIKE cptb00001.tipo
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
#LET usuarios ="lsoto"
#LET clave ="1234"
CONNECT to "decomarmol" 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
ON ACTION nuevo
# LET filedestino='tmpfoto.jpg'
LOCATE pimagen IN MEMORY
CLEAR FORM
CALL cppcad000()
ON ACTION buscar
CALL cppcmd000()
ON ACTION salir
EXIT MENU
END MENU
END FUNCTION
##funcion par los gastos
{
FUNCTION cgastos()
DEFINE codigo_gasto SMALLINT, des_gasto CHAR(30)
DECLARE bgastos CURSOR FOR
SELECT a.codigo_fiscal, a.descripcion FROM cgtb00074 a
CALL cgastos.clear()
FOREACH bgastos INTO codigo_gasto,des_gasto
CALL cgastos.additem(kventas,dventas)
END FOREACH
}
####### Proceso para Insertar Una Factura ###########
FUNCTION cppcad000()
DEFINE porc_p DECIMAL(10,2)
DEFINE emp SMALLINT
LET hoy = null
LET fecha1 = TODAY
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
LET tipo_ncf=NULL
LET descripcion_ncf=NULL
LET itbis =NULL
LET ncf = NULL
CALL e41_reset() -- compra electronica 41 (cpprmt001_ecf.4gl)
INPUT BY NAME factura.*,ITBIS,TIPO_NCF,cod_mon,NCF WITHOUT DEFAULTS
ON ACTION busca_foto ATTRIBUTE(TEXT="Foto",IMAGE="upload")
LET d_tipos="Images"
LET f_tipos="*.jpg *.png *.gif"
LET mensaje=%"Elige Imagen"
LET imagefac = "*.jpg"
CALL ui.interface.frontcall("standard","openfile",[imagefac,d_tipos,f_tipos,mensaje],filepath)
DISPLAY filepath
IF nombre_file_foto IS NULL THEN
LET nombre_file_foto =factura.num_doc USING "<<<<<<",".jpg"
END IF
IF filepath IS NOT NULL THEN
IF fgl_getenv("WINDIR") IS NULL THEN
LET filedestino = FGL_GETENV("IMAGENfactura"),"/IMAGENFACTURA/",nombre_file_foto CLIPPED
DISPLAY "1",filedestino
ELSE
LET filedestino = FGL_GETENV("IMAGENfactura"),"\\IMAGENFACTURA\\",nombre_file_foto CLIPPED
# LET filedestino = "D:\\genero fuentes\\DECOMARMOL320\\decomarmol\\IMAGENFACTURA\\",nombre_file_foto CLIPPED
DISPLAY "2",filedestino
END IF
LOCATE pimagen IN MEMORY
# CALL FGL_WINMESSAGE("W",filedestino,"stop")
CALL fgl_getfile(filepath,filedestino)
CALL pimagen.readFile(filedestino)
DISPLAY filedestino TO foto
LET foto = filedestino
END IF
ON ACTION compra_e41 ATTRIBUTE(TEXT="Compra Electronica",IMAGE="new")
-- e-CF 41: trae el proximo e-NCF y calcula montos desde el neto
IF factura.cod_sp IS NULL OR factura.cod_sp_sec IS NULL THEN
CALL fgl_winmessage("COMPRA ELECTRONICA","Primero elija el suplidor.","exclamation")
NEXT FIELD cod_sp
END IF
IF e41_captura(factura.cod_sp, factura.cod_sp_sec) THEN
LET tipo_ncf = 41
SELECT a.descripcion INTO descripcion_ncf FROM cgtb00074 a
WHERE a.codigo_fiscal = 41
LET ncf = e41_ncf()
LET factura.num_doc = e41_ncf()
LET factura.valor_fac = e41_neto() -- CxP queda por el neto
LET itbis = e41_itbis()
DISPLAY BY NAME factura.num_doc, factura.valor_fac, itbis, tipo_ncf, ncf, descripcion_ncf
-- lo llena el sistema: no se digita
CALL DIALOG.setFieldActive("num_doc", FALSE)
CALL DIALOG.setFieldActive("valor_fac", FALSE)
CALL DIALOG.setFieldActive("itbis", FALSE)
CALL DIALOG.setFieldActive("tipo_ncf", FALSE)
CALL DIALOG.setFieldActive("ncf", FALSE)
END IF
AFTER FIELD itbis
IF itbis IS NULL THEN
CALL msg(16)
NEXT FIELD itbis
END IF
ON KEY (control-p)
NEXT FIELD cod_sp
BEFORE FIELD cod_mon
CALL busca_monedas()
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 tipo_ncf
IF tipo_ncf IS NOT NULL THEN
SELECT a.descripcion INTO descripcion_ncf FROM cgtb00074 a
WHERE a.codigo_fiscal=tipo_ncf
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD tipo_ncf
END IF
display BY NAME descripcion_ncf
END IF
{AFTER FIELD cod_mon
IF cod_mon IS NOT NULL THEN
SELECT a.ncf INTO chncf FROM cotb00031 a
WHERE a.cod_mon = cod_mon
IF chncf = 'NO' THEN
EXIT INPUT
END IF
END IF}
AFTER FIELD ncf
IF NCF IS NOT NULL THEN
if Length(ncf CLIPPED ) <> 19 THEN
call fgl_winmessage('mensaje','La longitud no es valida debe tener 19 posiciones',1)
NEXT FIELD ncf
ELSE
LET conteo=0
SELECT count(*) INTO conteo FROM cptb00004 a
WHERE cod_sp=factura.cod_sp and cod_sp_sec=factura.cod_sp_sec and a.ncf=ncf
IF conteo > 0 THEN
call fgl_winmessage('mensaje','Este NCF ya esta registrado',1)
NEXT FIELD ncf
END IF
END IF
END IF
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
SELECT cuenta_no INTO cuenta FROM cotb00001
WHERE cod_sp=factura.cod_sp AND cod_sp_sec=factura.cod_sp_sec
If cuenta IS NULL THEN
LET numero_msg = 393
CALL msg(numero_msg)
NEXT FIELD cod_sp_sec
END IF
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
SELECT b.term_sp INTO term_sp FROM cotb00001 b
WHERE b.cod_sp=factura.cod_sp AND
b.cod_sp_sec=factura.cod_sp_sec
SELECT a.dias INTO dias FROM cotb00024 a
WHERE a.term_sp=term_sp
LET fecha_control = factura.fecha_orig
LET factura.fecha_proc = fecha_control + dias
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
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 NOT null THEN
SELECT UNIQUE a.cod_sp,a.cod_sp_sec INTo factura.cod_sp,factura.cod_sp_sec 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
DISPLAY BY NAME factura.cod_sp,factura.cod_sp_sec
#LET numero_msg = 16
#CALL msg(numero_msg)
# NEXT FIELD orden_no
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
CALL contab()
IF int_flag THEN
LET int_flag = false
RETURN
END IF
LET debito1 = debito1 + cuentas[curr1].debito
LET credito1 = cuentas[curr1].credito + credito1
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:
CALL arr_fac1.clear()
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
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,a.codigo_fiscal,a.ncf
FROM cod_sp,cod_sp_sec,num_doc,fecha_orig,fecha_proc,
valor,detalle,tipo_ncf,ncf
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 b.cod_sp,b.cod_sp_sec,b.num_doc,CONVERT(CHAR(10),b.fecha_orig,103), ",
"CONVERT(CHAR(10),b.fecha_proc,103),b.valor,b.tipo,b.orden_no,b.detalle,b.status_t,b.us_crea, ",
"CAST(b.fech_crea AS CHAR(16)),b.us_mod,CAST(b.fech_mod AS CHAR(16)),a.codigo_fiscal, ",
" a.ncf,(a.monto_itbi),foto_producto,nombre_file_foto",
" FROM cptb00001 b LEFT OUTER join cptb00004 a ON b.num_doc = a.num_doc and ",
" b.cod_sp = a.cod_sp AND b.cod_sp_sec = a.cod_sp_sec ",
" WHERE ",
" b.status_t is null AND b.tipo_doc = 'FT' And ",
criterio clipped," ORDER BY b.fecha_orig,b.num_doc "
PREPARE busca FROM selec
DECLARE datos SCROLL CURSOR FOR busca
OPEN datos
#### Buscando el primer registro
FETCH FIRST datos INTO factura.*,datos_usu.*,tipo_ncf,ncf,itbis,foto,nombre_file_foto
IF status = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
RETURN
END IF
CALL suplidor(factura.cod_sp,factura.cod_sp_sec,tipo_ncf) RETURNING nom_sup,descripcion_ncf,cuenta_mayor
DISPLAY BY NAME factura.*,nom_sup,descripcion_ncf,tipo_ncf,ncf,itbis,foto,nombre_file_foto ATTRIBUTE(BLUE)
MENU "OPCION"
COMMAND "Siguiente"
"Presenta en pantalla el proximo registro encontrado"
FETCH NEXT datos INTO factura.*,datos_usu.*,tipo_ncf,ncf,itbis,foto,nombre_file_foto
DISPLAY foto
IF status = NOTFOUND THEN
LET numero_msg = 4
CALL msg(numero_msg)
END IF
CALL suplidor(factura.cod_sp,factura.cod_sp_sec,tipo_ncf) RETURNING nom_sup,descripcion_ncf,cuenta_mayor
DISPLAY BY NAME factura.*,nom_sup,descripcion_ncf,tipo_ncf,ncf,itbis ATTRIBUTE(BLUE)
COMMAND "Anterior"
"Presenta en pantalla el registro anterior encontrado"
FETCH PREVIOUS datos INTO factura.*,datos_usu.*,tipo_ncf,ncf,itbis,foto,nombre_file_foto
IF status = NOTFOUND THEN
LET numero_msg = 5
CALL msg(numero_msg)
END IF
CALL suplidor(factura.cod_sp,factura.cod_sp_sec,tipo_ncf) RETURNING nom_sup,descripcion_ncf,cuenta_mayor
DISPLAY BY NAME factura.*,nom_sup,descripcion_ncf,tipo_ncf,ncf,itbis ATTRIBUTE(BLUE)
COMMAND "Primero"
"Presenta en pantalla el primer registro encontrado"
FETCH FIRST datos INTO factura.*,datos_usu.*,tipo_ncf,ncf,itbis,foto,nombre_file_foto
IF status = NOTFOUND THEN
LET numero_msg = 5
CALL msg(numero_msg)
END IF
CALL suplidor(factura.cod_sp,factura.cod_sp_sec,tipo_ncf) RETURNING nom_sup,descripcion_ncf,cuenta_mayor
DISPLAY BY NAME factura.*,nom_sup,descripcion_ncf,tipo_ncf,ncf,itbis ATTRIBUTE(BLUE)
COMMAND "Ultimo"
"Presenta en pantalla el ultimo registro encontrado"
FETCH LAST datos INTO factura.*,datos_usu.*,tipo_ncf,ncf,itbis,foto,nombre_file_foto
IF status = NOTFOUND THEN
LET numero_msg = 4
CALL msg(numero_msg)
END IF
CALL suplidor(factura.cod_sp,factura.cod_sp_sec,tipo_ncf) RETURNING nom_sup,descripcion_ncf,cuenta_mayor
DISPLAY BY NAME factura.*,nom_sup,descripcion_ncf,tipo_ncf,ncf,itbis ATTRIBUTE(BLUE)
###### Escoger registro para modificar
COMMAND "Escoger"
"<Esc>Actualiza Registro <Delete>Cancela Operacion <Ctrl-P> 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
SELECT a.descripcion INTO descripcion_ncf FROM cgtb00074 a
WHERE a.codigo_fiscal=tipo_ncf
SELECT a.codigo_fiscal,a.ncf,a.monto_itbi
INTO tipo_ncf, ncf,itbis FROM cptb00004 a
WHERE a.cod_sp=factura.cod_sp AND a.cod_sp_sec=factura.cod_sp_sec
AND a.num_doc=factura.num_doc
DISPLAY BY NAME tipo_ncf, ncf,itbis,descripcion_ncf
IF debe_ir = "N" THEN
INPUT BY NAME factura.fecha_orig,factura.fecha_proc,factura.valor_fac,itbis,
factura.tipo_oc,factura.orden_no,tipo_ncf,cod_mon,ncf,
factura.detalle WITHOUT DEFAULTS
AFTER FIELD itbis
IF itbis IS NULL THEN
CALL msg(16)
NEXT FIELD itbis
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 cod_mon
CALL busca_monedas()
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
############## TERMINA INPUT ARRAY#####################################
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
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,detalle,
us_mod,fech_mod,valor) =
(factura.fecha_orig,factura.fecha_proc,
factura.orden_no,factura.tipo_oc,
factura.detalle,
usuarios,GETDATE(),factura.valor_fac)
WHERE @num_doc = factura.num_doc
AND @cod_sp = factura.cod_sp AND
@cod_sp_sec = factura.cod_sp_sec AND
@tipo_doc = "FT"
BEGIN work
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(),filedestino,pimagen,nombre_file_foto)
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
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"
##para buscar las cuentas contables
SELECT cuenta_no INTO cuenta FROM cotb00001
WHERE cod_sp=factura.cod_sp AND cod_sp_sec=factura.cod_sp_sec
LET credito=factura.valor_fac
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,NULL,NUll,SUSER_SNAME(),GETDATE())
IF cuenta_itibis IS NOT NULL AND itbis > 0 THEN
INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp,
factura.cod_sp_sec,factura.num_doc,cuenta_itibis,null,null,null,null,null,
0,itbis,NULL,SUSER_SNAME(),GETDATE(),NULL,NUll)
END IF
FOR idx = 1 TO cuentas.getLength()
IF cuentas[idx].cuenta_no IS NOT NULL THEN
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,NULL,NUll,SUSER_SNAME(),GETDATE())
END IF
END IF
END FOR
CALL cuadrada(factura.cod_sp,factura.cod_sp_sec,factura.num_doc) RETURNING cuadradatrx
IF cuadradatrx THEN
COMMIT WORK
ELSE
ROLLBACK WORK
CALL fgl_winmessage("MENSAJE","HUBO UN ERROR EN EL CUADRE DE LAS CUENTAS","STOP")
END IF
LET numero_msg = 13
CALL msg(numero_msg)
IF debe_ir = "S" THEN
LET handler = configureOutput("SVG")
START REPORT apl_fact TO XML HANDLER handler
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
INSERT INTO cptb00006
(tipo_doc, num_doc, cod_sp, cod_sp_sec, fecha_orig, fecha_proc, orden_no, tipo,
aplica_a, cta_ctble, valor, detalle, status_t, us_crea, fech_crea, us_mod, fech_mod)
select z.tipo_doc, z.num_doc, z.cod_sp, z.cod_sp_sec, z.fecha_orig, z.fecha_proc, z.orden_no, z.tipo,
z.aplica_a, z.cta_ctble, z.valor, z.detalle, z.status_t, z.us_crea, z.fech_crea, z.us_mod, z.fech_mod
from cptb00001 z
WHERE z.tipo_doc = 'FT' AND
z.cod_sp = factura.cod_sp AND
z.cod_sp_sec = factura.cod_sp_sec AND
z.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
#--------------------------------------------------------------------------
SELECT UNIQUE a.ref INTO ent_num FROM cgtb00004 a
where a.cod_sp = factura.cod_sp AND
a.cod_sp_sec = factura.cod_sp_sec AND
a.factura = factura.num_doc
DELETE FROM cgtb00004 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"
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].cod_sp,supl[idx].cod_sp_sec,supl[idx].nom_sp
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()
DEFINE tdebito,tcredito,diferencia DEC(12,2),
isr_ctas DEC(12,2),
ncf41 VARCHAR(13)
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,cotb00001 b
WHERE a.cod_sp = factura.cod_sp AND
a.cod_sp_sec = factura.cod_sp_sec AND
a.cod_sp = b.cod_sp AND
a.cod_sp_Sec = b.cod_sp_Sec AND
a.factura = factura.num_doc AND
a.cuenta_no <> b.cuenta_no
LET idx2 = 1
LET tdebito = 0
LET tcredito = 0
FOREACH busca_ctas INTO cuentas[idx2].*
LET tdebito = tdebito + cuentas[idx2].debito
LET tcredito = tcredito + cuentas[idx2].credito
LET idx2 = idx2 + 1
END FOREACH
CALL SET_COUNT(idx2 - 1)
DISPLAY BY NAME tdebito,tcredito
LABEL arreglo1:
LET int_flag = FALSE
INPUT ARRAY cuentas WITHOUT DEFAULTS FROM cuentas1.*
BEFORE ROW
LET curr = ARR_CURR()
LET curr1 = SCR_LINE()
ON KEY (control-W)
LET curr1 = arr_curr()
LET scr_l = scr_line()
CASE
WHEN INFIELD (cuenta_no)
CALL busca_cuenta()
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
NEXT FIELD cuenta_no
END IF
IF status = NOTFOUND THEN
LET numero_msg = 159
CALL msg(numero_msg)
NEXT FIELD num_emp
END IF
LET descripcion = cuentas1[curr1].descripcion
LET cuentas[curr].cuenta_no = cuentas1[curr1].cuenta_no
DISPLAY BY NAME cuentas[curr].cuenta_no,descripcion
END CASE
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)
-- compra electronica 41: cuenta marcada como retencion -> ISR retenido
IF e41_activo() THEN
IF e41_cuenta_isr(cuentas[curr].cuenta_no) THEN
IF NVL(cuentas[curr].debito,0) = 0 AND NVL(cuentas[curr].credito,0) = 0 THEN
LET cuentas[curr].credito = e41_isr()
DISPLAY cuentas[curr].credito TO cuentas1[curr1].credito
END IF
END IF
END IF
IF cuentas[curr].cuenta_no = cuenta_mayor THEN
CALL msg(192)
NEXT FIELD cuenta_no
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
END IF
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
AFTER INPUT
LET tdebito =0
LET tcredito=0
FOR idx = 1 TO cuentas.getLength()
IF cuentas[idx].cuenta_no IS NOT NULL THEN
LET tdebito = tdebito + cuentas[idx].debito
LET tcredito = tcredito + cuentas[idx].credito
END IF
END FOR
DISPLAY BY NAME tdebito,tcredito
LET tdebito = 0
LET tcredito = 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 tdebito = tdebito + cuentas[idx].debito
LET tcredito = cuentas[idx].credito + tcredito
END FOR
LET tcredito = tcredito + factura.valor_fac
LET diferencia = tdebito-tcredito
DISPLAY BY NAME diferencia,tdebito,tcredito
IF diferencia <> 0 THEN
CALL msg(174)
NEXT FIELD cuenta_no
END IF
-- compra electronica 41: el ISR de las cuentas de retencion debe ser el calculado
IF e41_activo() THEN
LET isr_ctas = 0
FOR idx = 1 TO arr_count()
IF cuentas[idx].cuenta_no IS NOT NULL THEN
IF e41_cuenta_isr(cuentas[idx].cuenta_no) THEN
LET isr_ctas = isr_ctas + NVL(cuentas[idx].credito,0) - NVL(cuentas[idx].debito,0)
END IF
END IF
END FOR
IF isr_ctas <> e41_isr() THEN
CALL fgl_winmessage("COMPRA ELECTRONICA",
"La retencion de ISR en las cuentas ("||isr_ctas||") no es igual a la calculada ("||e41_isr()||").\n"||
"Use una cuenta marcada como retencion en el catalogo.","stop")
NEXT FIELD cuenta_no
END IF
END IF
BEGIN WORK
-- compra electronica 41: se reserva el e-NCF ahora (si se cancela no se pierde)
IF e41_activo() THEN
LET ncf41 = e41_reserva_ncf()
IF ncf41 IS NULL THEN
ROLLBACK WORK
NEXT FIELD cuenta_no
END IF
LET factura.num_doc = ncf41
LET ncf = ncf41
END IF
###### Insertando registros en la Maestra de cuentas por Pagar ####
LET cod_sp1 = factura.cod_sp
SELECT * FROM cptb00001
WHERE num_doc=factura.num_doc AND cod_sp=factura.cod_sp AND cod_sp_sec=factura.cod_sp_sec AND tipo_doc="FT"
IF status = NOTFOUND THEN
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,usuarios,
GETDATE(),null,NULL,filedestino,pimagen,nombre_file_foto)
END IF
IF ncf IS NOT NULL THEN
SELECT a.cod_sp FROM cptb00004 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_Sec = factura.cod_sp_sec AND
a.num_doc = factura.num_doc
DISPLAY "update "
IF STATUS = NOTFOUND THEN
DISPLAY "update 2"
INSERT INTO cptb00004 (cod_sp, cod_sp_sec, num_doc,codigo_fiscal, ncf,
monto_itbi, US_CREA, FECH_CREA,cod_moneda)
values(factura.cod_sp,factura.cod_sp_sec,factura.num_doc, tipo_ncf,ncf,itbis,suser_sname(),getdate(),
cod_mon)
ELSE
UPDATE cptb00004 SET codigo_fiscal = tipo_ncf,
ncf = ncf,
monto_itbi = itbis,
us_crea =suser_sname(),
fech_crea =getdate()
WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec AND
num_doc = factura.num_doc
END IF
END IF
{ IF ncf IS NOT NULL THEN
INSERT INTO cptb00004 (cod_sp, cod_sp_sec, num_doc,codigo_fiscal, ncf,
monto_itbi, US_CREA, FECH_CREA,cod_moneda)
values(factura.cod_sp,factura.cod_sp_sec,factura.num_doc, tipo_ncf,ncf,itbis,suser_sname(),getdate(),
cod_mon)
END IF
}
FOR idx = 1 TO arr_fac1.getLength()
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,filedestino,pimagen,nombre_file_foto)
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
LET ent_num=null
SELECT UNIQUE a.ref INTO ent_num FROM cgtb00004 a
where a.cod_sp = factura.cod_sp AND
a.cod_sp_sec = factura.cod_sp_sec AND
a.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"
DELETE FROM cgtb00004 WHERE @cod_sp = factura.cod_sp AND
@cod_sp_sec = factura.cod_sp_sec AND
@factura = factura.num_doc
{
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
}
##para buscar las cuentas contables
SELECT cuenta_no INTO cuenta FROM cotb00001
WHERE cod_sp=factura.cod_sp AND cod_sp_sec=factura.cod_sp_sec
LET credito=factura.valor_fac
FOR idx = 1 TO cuentas.getLength()
IF cuentas[idx].cuenta_no IS NOT NULL THEN
IF idx = 1 THEN
IF cuenta IS NOT NULL 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,credito,NULL,SUSER_SNAME(),GETDATE(),NULL,NULL)
IF ent_num IS NULL THEN
LET numero_ent = 18
LET pano = YEAR(factura.fecha_orig)
LET tiempo = MONTH(factura.fecha_orig) using "&&",pano[3,4]
SELECT MAX(a.ref[7,9]) INTO ultimo FROM cgtb00004 a
WHERE a.ref[4,5] = numero_ent and a.ref[11,14] = tiempo
IF ultimo is null THEN
LET ultimo = 0
END IF
LET ultimo = ultimo + 1
LET entrada_no = "ED.18-",ultimo USING "&&&","/",tiempo
ELSE
LET entrada_no=ent_num
END IF
INSERT INTO cgtb00004
VALUES(factura.fecha_orig,1,entrada_no,cuenta,null,null,null,null,NULL,NULL,NULL,0,factura.valor_fac,NULL,suser_sname(),getdate(),NULL,NULL,
factura.cod_sp,factura.cod_sp_sec,factura.num_doc)
END IF
IF cuenta_itibis IS NOT NULL THEN
INSERT INTO cptb00003 VALUES (factura.fecha_orig,factura.cod_sp,
factura.cod_sp_sec,factura.num_doc,cuenta_itibis,null,null,null,null,null,
0,itbis,NULL,SUSER_SNAME(),GETDATE(),NULL,NUll)
END IF
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)
INSERT INTO cgtb00004
VALUES(factura.fecha_orig,1,entrada_no,cuentas[idx].cuenta_no,null,null,null,null,NULL,NULL,NULL,cuentas[idx].debito,cuentas[idx].credito,NULL,suser_sname(),getdate(),NULL,NULL,
factura.cod_sp,factura.cod_sp_sec,factura.num_doc)
END IF
END IF
END FOR
CALL cuadrada(factura.cod_sp,factura.cod_sp_sec,factura.num_doc) RETURNING cuadradatrx
IF cuadradatrx AND e41_activo() THEN
IF NOT e41_guarda(factura.cod_sp,factura.cod_sp_sec,factura.num_doc,factura.fecha_orig) THEN
LET cuadradatrx = FALSE
END IF
END IF
IF cuadradatrx THEN
COMMIT WORK
-- compra electronica 41: envio a la DGII
IF e41_activo() THEN
CALL e41_envia(factura.cod_sp,factura.cod_sp_sec,factura.num_doc,
factura.fecha_orig,factura.fecha_proc,factura.detalle)
END IF
ELSE
ROLLBACK WORK
CALL fgl_winmessage("MENSAJE","HUBO UN ERROR EN EL CUADRE DE LAS CUENTAS","STOP")
NEXT FIELD CUENTA_NO
END IF
END INPUT
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(13),
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
FUNCTION busca_monedas()
DEFINE pmoneda ui.combobox,
kmoneda SMALLINT,kdescripcion CHAR(30)
DECLARE moneda CURSOR FOR
SELECT a.cod_mon,a.simbolo FROM cotb00031 a
WHERE a.status_t is null
ORDER BY a.descrip_mon
LET pmoneda = ui.combobox.forname("formonly.cod_mon")
CALL pmoneda.clear()
FOREACH moneda INTO kmoneda,kdescripcion
CALL pmoneda.additem(kmoneda,kdescripcion)
END FOREACH
END FUNCTION
FUNCTION busca_cuenta()
OPEN WINDOW cons_cuenta AT 10,5 WITH FORM "cgfmwd004" ATTRIBUTE
(BORDER,FORM LINE FIRST + 1,COMMENT LINE LAST)
CONSTRUCT BY NAME criterio ON cuenta_no,descripcion
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET selec =
"SELECT cuenta_no,descripcion,nivel FROM cgtb00001 ",
"WHERE ",criterio clipped," and nivel=3 AND status_t is null ORDER BY 1"
PREPARE comando FROM selec
DECLARE busca5 CURSOR FOR comando
OPEN busca5
LET idx = 1
WHILE STATUS != NOTFOUND
FETCH busca5 INTO cuentas1[idx].*
IF status = notfound THEN
EXIT WHILE
END IF
LET idx = idx + 1
END WHILE
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
CALL set_count (idx - 1)
DISPLAY ARRAY cuentas1 TO s_cuentas.*
LET curr1 = arr_curr()
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
CLOSE WINDOW cons_cuenta
END FUNCTION
FUNCTION cuadrada(pcodsp,pcodspsec,pfactura)
DEFINE pcodsp,pcodspsec INT,
pfactura VARCHAR(25),
pvalor DEC(12,2)
SELECT ISNULL(SUM(a.DEBITO-a.CREDITO),0) INTO pvalor FROM cptb00003 a
WHERE a.cod_sp = pcodsp AND a.cod_sp_Sec = pcodspsec AND a.factura =pfactura
IF pvalor = 0 THEN
RETURN TRUE
ELSE
RETURN FALSE
END IF
END FUNCTION