DEFINE vacacion RECORD fecha_sal DATE, fecha_ent DATE, pano SMALLINT, num_nomi INT, dias_tomados DEC(12,2), dias_vac INTEGER, cod_mov1 SMALLINT, cod_mov2 SMALLINT, cod_mov3 SMALLINT, # num_nomi_no SMALLINT, valor_vacaciones DEC(12,2), descrip_mov1 CHAR(50), descrip_mov2 CHAR(50), descrip_mov3 CHAR(50) END RECORD, vacac,xcod_mov,xcod_mov2,xcod_mov3 SMALLINT DEFINE xbusca RECORD departamento INT, num_emp INT, nombre varchar(255), cod_puesto INT, fecha_ingreso varchar(255), fecha_Salida DATE, fecha_entrada date, sueldo float, tipo_sueldo char(20) END RECORD, xtipo VARCHAR(30) MAIN CALL busca_empleados() END MAIN FUNCTION busca_empleados() SELECT a.cod_mov,a.cod_mov2,a.cod_mov3,a.tipo_mov INTO xcod_mov,xcod_mov2,xcod_mov3,xtipo FROM adtb00009 a WHERE a.cod_mto = acc_per.cod_mto DECLARE busca CURSOR FOR SELECT * INTO xbusca.* FROM tmpvacaciones ORDER BY num_emp FOREACH busca LET vacacion.num_nomi=2005 LET vacacion.cod_mov1=36 CALL vacaciones("A",xbusca.tipo_sueldo) END FOREACH END FUNCTION FUNCTION vacaciones(operacion,tipo_sueldo) DEFINE fecha_nom CHAR(10), dias_tomados_real,balance_dias,psueldo,salario DEC(12,2), pfecha,fecha_entrada_emp DATE, dias_sueldo SMALLINT, sale,operacion VARCHAR(1), tipo_sueldo VARCHAR(20) LET int_flag = FALSE DISPLAY "TIPO SUELDO ",tipo_sueldo IF operacion ='A' THEN LET vacacion.cod_mov1=xcod_mov LET vacacion.cod_mov2 = NULL LET vacacion.cod_mov3=xcod_mov3 LET vacacion.descrip_mov1=NULL LET vacacion.descrip_mov2=NULL LET vacacion.descrip_mov3=NULL SELECT a.descrip_mov INTO vacacion.descrip_mov1 FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov1 SELECT a.descrip_mov INTO vacacion.descrip_mov2 FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov2 SELECT a.descrip_mov INTO vacacion.descrip_mov3 FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov3 LET vacacion.pano = YEAR(xbusca.fecha_ingreso) LET vacac = xbusca.fecha_Salida - xbusca.fecha_ingreso LET vacacion.fecha_ent = vacacion.fecha_sal + 14 DISPLAY BY NAME vacacion.fecha_ent AFTER FIELD fecha_ent IF vacacion.fecha_ent IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_ent END IF IF vacacion.fecha_ent - vacacion.fecha_sal > 20 THEN CALL fgl_winmessage("INFO","FECHA EXCEDE AL LIMITE DISFRUTE","INFO") NEXT FIELD fecha_sal END IF ####### CALCULO DE LOS DIAS VACACIONADOS ########### LET vacacion.dias_tomados = vacacion.fecha_ent - vacacion.fecha_sal LET dias_tomados_real=0 LET pfecha = vacacion.fecha_sal FOR idx= 1 TO (vacacion.dias_tomados+1) IF WEEKDAY(pfecha) <> 6 THEN IF WEEKDAY(pfecha) <> 0 THEN LET dias_tomados_real = dias_tomados_real + 1 END IF END IF IF WEEKDAY(pfecha) = 0 THEN LET dias_tomados_real =dias_tomados_real + .5 END IF LET pfecha = pfecha+1 END FOR LET vacacion.dias_vac = dias_tomados_real DISPLAY BY NAME vacacion.dias_vac AFTER FIELD pano IF vacacion.pano IS NOT NULL THEN SELECT SUM(a.num_dia) INTO vacacion.dias_tomados FROM adtb00032 a WHERE a.periodo = vacacion.pano AND a.num_emp = acc_per.num_emp AND a.status_t IS NULL IF vacacion.dias_tomados IS NULL THEN LET vacacion.dias_tomados=0 END IF LET balance_dias = vacacion.dias_vac - vacacion.dias_tomados DISPLAY BY NAME vacacion.dias_tomados,balance_Dias END IF AFTER FIELD num_nomi IF vacacion.num_nomi IS NOT NULL THEN SELECT CONVERT(CHAR(10),a.fecha_al,103) INTO fecha_nom FROM notb00010 a WHERE a.tipo_emp = acc_per.nomina AND a.num_nomi = vacacion.num_nomi IF STATUS = NOTFOUND THEN CALL fgl_winmessage("INFO","NOMINA NO EXISTE","INFO") NEXT FIELD num_nomi END IF # SELECT MIN(a.num_nomi) INTO vacacion.num_nomi_no # FROM notb00010 a # WHERE a.num_nomi > vacacion.num_nomi AND a.tipo_emp = acc_per.nomina IF vacac < 1825 THEN LET dias2=14 ELSE LET dias2=18 END IF IF vacacion.cod_mov1 = 36 THEN LET salario = 0 SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario FROM adtb00003 a WHERE a.num_emp = acc_per.num_emp LET salario_quincenal = salario /2 LET dias_sueldo = fecha_nom - fecha_entrada_emp IF dias_sueldo > 30 AND tipo_sueldo = "VARIABLE" THEN CALL calcula_salarios(acc_per.nomina,acc_per.num_emp,fecha_nom) RETURNING psueldo ELSE DISPLAY acc_per.sueldo_ac LET psueldo = acc_per.sueldo_ac/23.83 #DISPLAY "sueldo ",acc_per.sueldo_ac," dias ",dias2 END IF DISPLAY "DATA ",psueldo," dias ",dias2," salario q ",salario_quincenal LET proporcion_vacaciones=0 LET vacacion.valor_vacaciones = psueldo*dias2 LET proporcion_vacaciones = vacacion.valor_vacaciones - salario_quincenal DISPLAY BY NAME fecha_nom,vacacion.valor_vacaciones,proporcion_vacaciones, salario,salario_quincenal END IF END IF { AFTER FIELD num_nomi_no IF vacacion.num_nomi_no IS NOT NULL THEN SELECT CONVERT(CHAR(10),a.fecha_al,103) FROM notb00010 a WHERE a.tipo_emp = acc_per.nomina AND a.num_nomi = vacacion.num_nomi_no IF STATUS = NOTFOUND THEN CALL fgl_winmessage("INFO","NOMINA NO EXISTE","INFO") NEXT FIELD num_nomi END IF END IF } AFTER INPUT ## VERIFICA QUE LA FECHA DE REGRESO DE VACACIONES NO SEA MENOR QUE LA FECHA ## DE INICIO DE LAS VACACIONES IF INT_FLAG THEN INITIALIZE vacacion.* TO NULL EXIT INPUT END IF IF vacacion.fecha_ent < vacacion.fecha_sal THEN LET numero_msg = 51 CALL msg(numero_msg) NEXT FIELD fecha_ent END IF IF vacacion.cod_mov1 IS NOT NULL THEN ############## PROCESO PARA CALCULAR LOS DIAS QUE DEBE VACACIONAR ####### IF vacac < 1825 THEN LET dias2=14 ELSE LET dias2=18 END IF DISPLAY BY NAME vacacion.dias_tomados END IF LET opt = fgl_Winquestion("INFO","TODA LA INFORMACION ESTA CORRECTA?","NO","YES|NO","QUESTION",0) IF opt = 'NO' THEN CONTINUE INPUT END IF END INPUT ELSE LET salario = 0 SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario FROM adtb00003 a WHERE a.num_emp = acc_per.num_emp LET salario_quincenal = salario /2 DISPLAY BY NAME proporcion_vacaciones,fecha_nom,tipo_sueldo,salario,salario_quincenal INPUT BY NAME vacacion.*,dias2 WITHOUT DEFAULTS END IF END FUNCTION