CALCULO DE FERIAS DO TRABALHADOR

 Tópico anterior Próximo tópico Novo tópico

CALCULO DE FERIAS DO TRABALHADOR

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#399328 - 08/04/2012 18:05:32

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 08/04/2012 18:08:03 por PROGRAMADORVB6

 Anexos estao visíveis somente para usuários registrados

Olá boa tarde.
Estou a tentar fazer uma rotina que me indique a data limite em que um colaborador pode gozar férias, com base na indicação dos dias atribuidos.

Para cáculo de Feriados usei este módulo :


Module Calculo_Feriados
    'Dias Feriados
    Public Function DiaFeriado(ByVal Data As Date) As Boolean
        Dim Dia As Integer = Data.Day
        Dim Mes As Integer = Data.Month
        Dim Ano As Integer = Data.Year

        'Festas moveis
        If Data.Date = Carnaval(Ano).Date Then Return True '"Entrudo/Carnaval"
        If Data.Date = SextaFeiraSanta(Ano).Date Then Return True ' "Sexta-Feira Santa"
        If Data.Date = Pascoa(Ano).Date Then Return True '"Páscoa"
        If Data.Date = CorpoDeDeus(Ano).Date Then Return True '"Corpo de Deus"

        'Feriados e dias Santos Fixos
        If Dia = 1 And Mes = 1 Then Return True '"Ano Novo"
        If Dia = 25 And Mes = 4 Then Return True '"Dia da Liberdade"
        If Dia = 1 And Mes = 5 Then Return True '"Dia do Trabalhador"
        If Dia = 10 And Mes = 6 Then Return True '"Dia de Portugal"
        If Dia = 15 And Mes = 8 Then Return True '"Assunção de Maria"
        If Dia = 5 And Mes = 10 Then Return True '"Implantação da República"
        If Dia = 1 And Mes = 11 Then Return True '"Todos os Santos"
        If Dia = 1 And Mes = 12 Then Return True '"Restauração da Independência"
        If Dia = 8 And Mes = 12 Then Return True '"Imaculada Conceição"
        If Dia = 25 And Mes = 12 Then Return True '"Natal"

        'Feriados Locais
        'If Dia = 1 And Mes = 7 Then Return "R" '"Feriado Regional(Madeira)"
        'If Dia = 21 And Mes = 8 Then Return "M" '"Feriado Municipal(Funchal)"
        'etc...

        Return False '"Dia Util"
    End Function

    'Festas Moveis
    Public Function Carnaval(ByVal Ano As Integer) As Date
        Dim D As Date = Pascoa(Ano)
        Return DateSerial(Ano, D.Month, D.Day - 47)
    End Function

    Public Function SextaFeiraSanta(ByVal Ano As Integer) As Date
        Dim D As Date = Pascoa(Ano)
        Return DateSerial(Ano, D.Month, D.Day - 2)
    End Function

    Public Function Pascoa(ByVal Ano As Integer) As Date

        Dim A As Integer = Ano Mod 19
        Dim B As Integer = Int(Ano / 100)
        Dim C As Integer = Ano Mod 100
        Dim D As Integer = Int(B / 4)
        Dim E As Integer = B Mod 4
        Dim F As Integer = Int((B + 8) / 25)
        Dim G As Integer = Int((B - F + 1) / 3)
        Dim H As Integer = (19 * A + B - D - G + 15) Mod 30
        Dim I As Integer = Int(C / 4)
        Dim J As Integer = C Mod 4
        Dim L As Integer = (32 + 2 * E + 2 * I - H - J) Mod 7
        Dim M As Integer = Int((A + 11 + H + 22 * L) / 451)

        Dim Mes As Integer = Int((H + L - 7 * M + 114) / 31)
        Dim Dia As Integer = 1 + ((H + L - 7 * M + 114) Mod 31)

        Return DateSerial(Ano, Mes, Dia)
    End Function

    Public Function CorpoDeDeus(ByVal Ano As Integer) As Date
        Dim D As Date = Pascoa(Ano)
        Return DateSerial(Ano, D.Month, D.Day + 60)
    End Function

End Module  


No Form fiz assim :
Public Class Form1
    Private Function AdicionaTempo(pDataInicial As DateTime, pDias As Integer) As DateTime
        Dim resultado As DateTime = pDataInicial


        While pDias > -1
            'Se é sábado=2 (ando dois dias para a frente), domingo ou feriado=1 (ando um dia para frente)

            If resultado.DayOfWeek = DayOfWeek.Saturday Then
                resultado = resultado.AddDays(2)
            ElseIf resultado.DayOfWeek = DayOfWeek.Sunday Then
                resultado = resultado.AddDays(1)
            ElseIf DiaFeriado(resultado).Equals(True) And Not resultado.DayOfWeek = DayOfWeek.Saturday Or resultado.DayOfWeek = DayOfWeek.Sunday Then
                resultado = resultado.AddDays(1)
                'Ou se quiser adicionar um dia útil (X horas trabalhadas = 1 dia útil)
            ElseIf pDias > 0 Then
                resultado = resultado.AddDays(1)
                pDias -= 1
                'Se a data final for no fim de semana ou feriado
            ElseIf pDias = 0 Then
                While resultado.DayOfWeek = DayOfWeek.Saturday OrElse resultado.DayOfWeek = DayOfWeek.Sunday OrElse DiaFeriado(resultado).Equals(True)
                    MsgBox("")
                    'Se é sábado=2 (ando dois dias para a frente), domingo ou feriado=1 (ando um dia para frente)
                    If resultado.DayOfWeek = DayOfWeek.Saturday Then
                        resultado = resultado.AddDays(2)
                    ElseIf resultado.DayOfWeek = DayOfWeek.Sunday Then
                        resultado = resultado.AddDays(1)
                    ElseIf DiaFeriado(resultado).Equals(True) And Not resultado.DayOfWeek = DayOfWeek.Saturday Or resultado.DayOfWeek = DayOfWeek.Sunday Then
                        resultado = resultado.AddDays(1)

                    End If
                End While
                pDias = -1
            End If
        End While
        Return resultado
    End Function
    '=================================================================================================
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'Acréscimo de 13 dias a serem gozados pelo trabalhador.        
  MsgBox(AdicionaTempo("27/04/2012", 13))
    End Sub

End Class


========== || ========
Acrescentei 13 dias para serem gozados pelo trabalhador, começando no dia 27/04/2012 ; com a indicação de + 13 dias (úteis) irá terminar as suas Férias no dia 16/05/2012 (Já com o Feriado do dia 01/05/2012 descontado e também os dias não úteis)
O problema é que ele não indica a data certa.

Grato desde já pela vossa atenção.
Atentamente
ProgramadorVB6
Deixo também

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#399406 - 09/04/2012 20:56:56

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 09/04/2012 21:07:24 por PROGRAMADORVB6

Olá boas noite.
Finalmente consegui com que os dados batessem certo, só que me deparei com o problema da rapidez de cáculo, que demora alguns segundos.
Existe alguma maneira de 'Limpar' um pouco + esta minha função para que fique mais rápida?
Deixo aqui a função:

  Public Function Total_Dias(Data_Inicial As Date, Data_Final As Date) As Integer

        Dim Calculo_TimeSpan As TimeSpan
        Dim Numero_de_dias As Integer = 0
        Dim Conta_Fins_de_Semana As Integer = 0
        Dim Conta_Feriados As Integer = 0
        Dim Faz_Soma_Total As String

        'Calcula o periodo de dias entre uma data a outra.
        Calculo_TimeSpan = Data_Final.Subtract(Data_Inicial)
        'Variável que retém esse periodo
        Numero_de_dias = Calculo_TimeSpan.Days

        For i As Integer = 1 To Numero_de_dias ' Ciclo que percorre o inicio da data indicada até ao seu término.
            Data_Inicial = Data_Inicial.AddDays(1) 'Incrementa (1) dia ao anterior.
            'Conta apenas Fims de semana.
            If Data_Inicial.DayOfWeek = DayOfWeek.Sunday Or Data_Inicial.DayOfWeek = DayOfWeek.Saturday Then
                Conta_Fins_de_Semana += 1
            End If
            'Conta apenas Feriados, com a condição de não se enquadrarem em Fims de semana.
            If Data_Inicial.DayOfWeek <> DayOfWeek.Sunday AndAlso Data_Inicial.DayOfWeek <> DayOfWeek.Saturday Then
                If DiaFeriado(Data_Inicial).Equals(True) Then 'Pesquisa se o dia é um Feriado (Função do módulo em cima )
                    Conta_Feriados += 1
                End If
            End If
        Next
        'Faz o cálculo, Subtraindo ao Total_de_dias; o nº total de Fims de semana + Feriados.
        Faz_Soma_Total = Val(Numero_de_dias + 1) - Val(Conta_Fins_de_Semana + Conta_Feriados)

        Return Faz_Soma_Total 'Total_Dias
    End Function  


Grato desde já pela vossa atenção.
Atenciosamente
Programadorvb6

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#399416 - 09/04/2012 22:52:12

LVFIOROT
SERRA
Cadast. em:Março/2012


coloquei esses parametros e retornou em menos de 1 seg
        MsgBox(Total_Dias(CDate("01/01/1900"), CDate("01/01/2013")))
quais parametros vc usou?



#399422 - 10/04/2012 05:07:00

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 10/04/2012 05:16:02 por PROGRAMADORVB6

Olá LVFIOROT
Eu coloquei assim :
MsgBox("Total de dias => [ 01/01/1900 ] até [ 01/01/2013 ] = " & Total_Dias("01/01/1900", "01/01/2013")  


Mas isto é só para 1 empregado, acontece que eu tenho que fazer o cálculo para cerca de 2000 empregados (Siemens) que o cliente tem a seu cargo em poucos segundos.
Resumindo : A função  terá que  ser  bastante robusta, daí eu pedir ajuda pelo menos para se tentar limpar um pouco + o código .
Grato desde já pela sua atenção e colaboração.
Atentamente.
Programadorvb6

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PROGRAMADORVB6 em 14/04/2012 06:55:28