Files

376 lines
9.3 KiB
Plaintext

{
--------------------------------------------------------------------------
PROGRAMA : PRD00000
OBJETIVO : Este programa da mantenimiento a los periodos contables;
Agrega, Modifica periodos de un ano especifico.
REALIZADO POR : Ing. Juan Fco. Soto.
FECHA : Noviembre 3, 1992.
MODIFICADO POR: Tadeo A. Ferreras
FECHA : Noviembre 25, 1993.
OBJETIVO : Incluir dias de gracias para cada periodo mensual.
--------------------------------------------------------------------------
}
IMPORT util
SCHEMA smarmotech
GLOBALS
DEFINE CONTROL,genero CHAR(2)
DEFINE fecha date
DEFINE hore CHAR(5)
DEFINE p_mes,p_act,s_act,numero_msg,bandera ,idx smallint
DEFINE descripcion CHAR(60)
DEFINE mes1 ARRAY[12] OF CHAR(10)
DEFINE peri DYNAMIC ARRAY OF RECORD
descrip_mes CHAR(10),
fecha_inicio DATE,
fecha_corte DATE,
dias_habiles SMALLINT,
dias_gracia SMALLINT
END RECORD
DEFINE usuarios RECORD
us_crea LIKE prdtable.us_crea,
fech_crea LIKE prdtable.fech_crea,
us_mod LIKE prdtable.us_mod,
fech_mod LIKE prdtable.fech_mod
END RECORD
DEFINE p_ano LIKE prdtable.ano,
usuario,clave CHAR(80)
END GLOBALS
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuario
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuario USING clave
CALL prd00000()
END MAIN
FUNCTION prd00000()
OPTIONS
FORM LINE 8,
ERROR LINE 24,
COMMENT LINE 22
OPEN FORM prdfm FROM "prdfm"
DISPLAY FORM prdfm
MENU
ON ACTION nuevo
CALL prdadd()
ON ACTION buscar
CLEAR FORM
CALL prdmod()
ON ACTION Salir
EXIT MENU
END MENU
END FUNCTION
FUNCTION prdadd()
#WHENEVER ERROR CONTINUE
SELECT count(*) FROM prdtable
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
LABEL vuelve:
LET p_ano = year(today)
INPUT BY NAME p_ano,genero WITHOUT DEFAULTS
AFTER FIELD p_ano
IF p_ano is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD p_ano
END IF
SELECT UNIQUE ano FROM prdtable WHERE ano = p_ano
IF status != notfound THEN
LET numero_msg = 12
CALL msg(numero_msg)
NEXT FIELD p_ano
END IF
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
CLEAR FORM
LET int_flag = false
RETURN
END IF
IF genero = "SI" THEN
DISPLAY "g ",genero
CALL generaperiodos(p_ano)
ELSE
FOR idx = 1 to 12
CALL meses()
LET peri[idx].descrip_mes = mes1[idx]
LET peri[idx].fecha_inicio = MDY(idx,1,p_ano)
LET peri[idx].fecha_corte = NULL
END FOR
END IF
EXIT INPUT
END INPUT
CALL set_count(idx-1)
INPUT ARRAY peri WITHOUT DEFAULTS FROM s_peri.*
BEFORE ROW
LET p_act = arr_curr()
LET s_act = scr_line()
AFTER FIELD fecha_inicio
IF peri[p_act].fecha_inicio is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fecha_inicio
END IF
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
FOR idx = 1 to 12
INSERT INTO prdtable VALUES (p_ano,idx,peri[idx].fecha_inicio,
peri[idx].fecha_corte,peri[idx].dias_habiles,
peri[idx].dias_gracia,usuario,GETDATE(),null,null)
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
END FOR
LET numero_msg = 1
CALL msg(numero_msg)
CLEAR FORM
GOTO vuelve
END FUNCTION
FUNCTION prdmod()
#WHENEVER ERROR CONTINUE
SELECT count(*) FROM prdtable
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
LABEL vuelve:
LET p_ano = year(today)
INPUT BY NAME p_ano WITHOUT DEFAULTS
AFTER FIELD p_ano
IF p_ano is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD p_ano
END IF
SELECT UNIQUE ano FROM prdtable WHERE ano = p_ano
IF status = notfound THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD p_ano
END IF
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
{DECLARE datos CURSOR FOR
SELECT mes,fecha_inicio,fecha_corte,dias_habiles,dias_gracia,us_crea,
fech_crea,us_mod,fech_mod
FROM prdtable where ano = p_ano
ORDER BY 2
LET idx = 1
FOREACH datos INTO p_mes,peri[idx].fecha_inicio,peri[idx].fecha_corte,
peri[idx].dias_habiles,peri[idx].dias_gracia,usuarios.*
CALL meses()
LET peri[idx].descrip_mes = mes1[idx]
LET idx = idx + 1
END FOREACH}
FOR idx = 1 to 12
CALL meses()
LET peri[idx].descrip_mes = mes1[idx]
SELECT UNIQUE a.fecha_inicio,a.fecha_corte,a.dias_habiles,a.dias_gracia,
a.us_crea,a.fech_crea,a.us_mod,a.fech_mod
INTO peri[idx].fecha_inicio,peri[idx].fecha_corte,
peri[idx].dias_habiles,peri[idx].dias_gracia,usuarios.*
FROM prdtable a
WHERE a.ano = p_ano AND a.mes = idx
#LET peri[idx].fecha_corte = null
END FOR
SELECT max(a.us_crea),max(a.fech_crea),max(a.us_mod),max(a.fech_mod)
INTO usuarios.*
FROM prdtable a
WHERE a.ano = p_ano AND a.us_crea IS NOT NULL
DISPLAY BY NAME usuarios.*
CALL set_count(idx)
INPUT ARRAY peri WITHOUT DEFAULTS FROM s_peri.*
BEFORE ROW
LET p_act = arr_curr()
LET s_act = scr_line()
{AFTER FIELD fecha_corte
LET control = month(peri[p_act].fecha_corte)
IF p_act != control THEN
LET numero_msg = 56
CALL msg(numero_msg)
NEXT FIELD fecha_corte
END IF}
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
CLEAR FORM
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
BEGIN WORK
DELETE FROM prdtable WHERE @ano = p_ano
FOR idx = 1 to 12
IF peri[idx].fecha_inicio IS NOT NULL THEN
INSERT INTO prdtable VALUES (p_ano,idx,peri[idx].fecha_inicio,
peri[idx].fecha_corte,peri[idx].dias_habiles,
peri[idx].dias_gracia,usuario,GETDATE(),usuario,getdate())
END IF
END FOR
COMMIT WORK
LET numero_msg = 13
CALL msg(numero_msg)
END FUNCTION
FUNCTION integridad()
IF sqlca.sqlcode < 0 THEN
LET numero_msg = sqlca.sqlcode
CALL msg(numero_msg)
DISPLAY numero_msg AT 23,70
LET bandera = 1
SLEEP 2
RETURN
END IF
END FUNCTION
FUNCTION msg(numero_msg)
DEFINE numero_msg SMALLINT
DEFINE descripcion CHAR (60)
SELECT desc_msg INTO descripcion FROM msgtable
WHERE cod_msg = numero_msg
IF status = NOTFOUND THEN
LET numero_msg = 22
SELECT desc_msg INTO descripcion FROM msgtable
WHERE cod_msg = numero_msg
ERROR descripcion
ELSE
ERROR descripcion
LET numero_msg = 0
END IF
END FUNCTION
FUNCTION meses()
LET mes1[1] = "Enero"
LET mes1[2] = "Febrero"
LET mes1[3] = "Marzo"
LET mes1[4] = "Abril"
LET mes1[5] = "Mayo"
LET mes1[6] = "Junio"
LET mes1[7] = "Julio"
LET mes1[8] = "Agosto"
LET mes1[9] = "Septiembre"
LET mes1[10] = "Octubre"
LET mes1[11] = "Noviembre"
LET mes1[12] = "Diciembre"
END FUNCTION
FUNCTION pantalla()
DEFINE fecha CHAR(8),
hora char(5) ,
p_compania RECORD LIKE companias.*,
l SMALLINT
SELECT * INTO p_compania.*
FROM companias
LET l = (80 - LENGTH(p_compania.nombre))/2
LET fecha = today USING "dd/mm/yy"
LET hora = time
DISPLAY p_compania.nombre CLIPPED AT 4,l
ATTRIBUTE (REVERSE,YELLOW)
DISPLAY "prd00000" AT 4,3 ATTRIBUTE (BOLD)
DISPLAY fecha AT 4,70 ATTRIBUTE (YELLOW)
LET l = (80 - LENGTH("Mantenimento Fechas de corte Mensuales"))/2
DISPLAY "Mantinimento Fechas de corte Mensuales" AT 5,l
DISPLAY hora AT 6,73 ATTRIBUTE(YELLOW)
CALL fgl_drawbox(5,79,3,1)
CALL fgl_drawbox(1,79,22,1)
END FUNCTION
FUNCTION generaperiodos(pano)
DEFINE dia_fin,dia_inicio DATE
DEFINE pano SMALLINT
FOR idx = 1 to 12
CALL meses()
CALL calc_ult_dia_mes(pano,idx) RETURNING dia_fin
LET dia_inicio = MDY(idx,1,pano)
LET peri[idx].descrip_mes = mes1[idx]
LET peri[idx].fecha_inicio = dia_inicio
LET peri[idx].fecha_corte = dia_fin
END FOR
END FUNCTION
FUNCTION calc_ult_dia_mes(anio,mes)
DEFINE dia_fin DATE
DEFINE mes,anio SMALLINT
# calcula el mes siguiente
IF mes=12 THEN
LET mes=1
LET anio=anio+1
ELSE
LET mes=mes+1
END IF
# calcula el primer dia del mes siguiente
LET dia_fin=MDY(mes,1,anio)
# calcula el ultimo dia del mes actual
LET dia_fin=dia_fin-1 UNITS DAY
RETURN dia_fin
END FUNCTION