Ok, Segue as formulas e as consultas SQL.
Formula: 1 - NÚMEROS DE DIAS DE DIREITO DE FÉRIAS
SE EXECSQL('99.02') = 1 ENTAO
SE RESULTSQL('99.02','CHAPA') <> CHAPA ENTAO
REPITA
PROXREGSQL('99.02')
ATE RESULTSQL('99.02','CHAPA') = CHAPA
FIMSE
FIMSE;
SE RESULTSQL('99.02','MES') = 2 ENTAO
SE RESULTSQL('99.02','ANO')%4 = 0 ENTAO
SE RESULTSQL('99.02','DIA') > 15 ENTAO
ARRED(RESULTSQL('99.02','RESUL') - 2.5)
SENAO
ARRED(RESULTSQL('99.02','RESUL'))
FIMSE
SENAO
SE RESULTSQL('99.02','DIA') > 14 ENTAO
ARRED(RESULTSQL('99.02','RESUL') - 2.5)
SENAO
ARRED(RESULTSQL('99.02','RESUL'))
FIMSE
FIMSE
FIMSE;
SE RESULTSQL('99.02','MES') = 4 OU RESULTSQL('99.02','MES') = 6 OU RESULTSQL('99.02','MES') = 9 OU RESULTSQL('99.02','MES') = 11 ENTAO
SE RESULTSQL('99.02','DIA') > 16 ENTAO
ARRED(RESULTSQL('99.02','RESUL') - 2.5)
SENAO
ARRED(RESULTSQL('99.02','RESUL'))
FIMSE
SENAO
SE RESULTSQL('99.02','DIA') > 17 ENTAO
ARRED(RESULTSQL('99.02','RESUL') - 2.5)
SENAO
ARRED(RESULTSQL('99.02','RESUL'))
FIMSE
FIMSE
SQL: 99.02 - Dias total de férias
SELECT
CHAPA,
DATEPART ( DAY , DTINIPERAQUIS ) AS DIA,
DATEPART ( MONTH , DTINIPERAQUIS ) AS MES,
DATEPART ( YEAR , DTINIPERAQUIS ) AS ANO,
DATEDIFF(MONTH,DTINIPERAQUIS,GETDATE())* 2.5 AS RESUL
FROM PFHSTFER
WHERE DTINIGOZO IS NULL
Formula: 4 - DIAS DE FÉRIAS X FALTAS
SE FOR ('0.0.03') <= 5 ENTAO
FOR ('0.0.01')
SENAO
SE FOR ('0.0.03') >= 6 E FOR ('0.0.03') <= 14 ENTAO
FOR ('0.0.01') - 6
SENAO
SE FOR ('0.0.03') >= 15 E FOR ('0.0.03') <= 23 ENTAO
FOR ('0.0.01') - 12
SENAO
SE FOR ('0.0.03') >= 24 E FOR ('0.0.03') <= 32 ENTAO
FOR ('0.0.01') - 18
SENAO
SE FOR ('0.0.03') > 32 ENTAO
CHR (48)
FIMSE
FIMSE
FIMSE
FIMSE
FIMSE
Formula: 3 – Números de Falta
DECL CT;
DECL CT1;
SETVAR(CT, 0);
SETVAR(CT1, 0);
SE FOR ('0.0.02')%9 = 0 ENTAO
FOR ('0.0.02')/9
SENAO
REPITA
SETVAR(CT,CT+8);
SETVAR(CT1,CT1+1)
ATE (FOR ('0.0.02')-CT)%9=0;
((FOR ('0.0.02')-CT)/9)+CT1
FIMSE
Formula: 2 - Qtde de horas faltadas
SE EXECSQL('99.01') = 1 ENTAO
SE RESULTSQL('99.01','CHAPA') = CHAPA ENTAO
RESULTSQL('99.01','HORAS')
SENAO
REPITA
PROXREGSQL('99.01')
ATE RESULTSQL('99.01','CHAPA') = CHAPA;
RESULTSQL('99.01','HORAS')
FIMSE
FIMSE
SQL: 99.01 - Horas de Faltas durante o periodo de férias
;WITH
UNIAO AS ( SELECT DISTINCT CHAPA FROM PFHSTFER
UNION SELECT DISTINCT CHAPA FROM PFUNC),
CHAFUNC AS (SELECT PFUNC.CHAPA FROM PFUNC),
CHAPHOR AS (
SELECT
PFFINANC.CHAPA,
TOTAL = SUM(REF)
FROM
PEVENTO INNER JOIN
PFFINANC ON
PEVENTO.CODIGO = PFFINANC.CODEVENTO INNER JOIN
PFHSTFER ON
PFFINANC.CHAPA = PFHSTFER.CHAPA
WHERE
(PEVENTO.CODIGOCALCULO = '8') AND
(PFFINANC.CODCOLIGADA = '1') AND
(PFHSTFER.DTINIGOZO IS NULL) AND
(PFHSTFER.DTFIMGOZO IS NULL) AND
(PFFINANC.DTPAGTO BETWEEN DATEADD(MONTH,1,PFHSTFER.DTINIPERAQUIS) AND DATEADD(MONTH,1,PFHSTFER.DTFIMPERAQUIS))
GROUP BY PFFINANC.CHAPA
)
SELECT
A.CHAPA,
ISNULL(C.TOTAL,0) AS HORAS
FROM UNIAO A LEFT JOIN CHAFUNC B ON (A.CHAPA = B.CHAPA)
LEFT JOIN CHAPHOR C ON (A.CHAPA = C.CHAPA)
Considerações:
Formulas:
- NÚMEROS DE DIAS DE DIREITO DE FÉRIAS: Mostra quantos dias o funcionário tem direito as férias, se no mês de admissão o funcionário tiver trabalhado mais que 15 dias, ele tem direito as férias no mês que entrou caso contrário não, a formula também calcula o anos bixesto.
- Qtde de horas faltadas: Pega a quantidade de horas faltadas através da consulta SQL 99.01
- Números de Falta: Acha o número de faltas para uma carga horaria de seg a qui 9 horas trabalhadas e de sexta 8h.
- DIAS DE FÉRIAS X FALTAS: Pega a quantidade de dias que faltou e tira do direito das férias.
SQL:
99.01 - Horas de Faltas durante o período de férias: Retorna quantas horas o funcionário faltou, caso o funcionário não teve faltas retorna 0.
99.02 - Dias total de férias: Retorna os dias totais de férias.