Public Class CalculosTablaDiasFecha
    Private Operaciones As New Operaciones
    function AgregarFechaIngresos(ByRef dgvIngresos As DataGridView, ByRef dtpFechaLiquidacion As DateTimePicker,
                             ByRef NombreCampoFecha As String, ByRef TipoBase As Integer, ByRef Periodicidad As String,
                             ByRef TipoCalculoFecha As String, ByRef Index As Integer)

        Dim Fecha As Date = Date.Now.Date
        Dim IndexAnterior As Integer = Index - 1
        Dim FechaAnterior As Date = Date.Today.Date
        Dim FechaActual As Date = Date.Today.Date
        Dim FechaLiquidacion As Date = dtpFechaLiquidacion.Value
        Dim DiaFijo As Integer = FechaLiquidacion.Day
        If Index > 0 Then
            FechaAnterior = Operaciones.ConvertirFecha(dgvIngresos.Rows(IndexAnterior).Cells(NombreCampoFecha).Value)
            FechaActual = CalcularFecha(FechaAnterior, DiaFijo, TipoCalculoFecha, Periodicidad, TipoBase)
            Fecha = Format((FechaActual), "dd/MM/yyyy").ToString

        Else

            FechaActual = CalcularFecha(Operaciones.ConvertirFecha(FechaLiquidacion), DiaFijo, TipoCalculoFecha, Periodicidad, TipoBase)
            Fecha = Format(FechaActual, "dd/MM/yyyy").ToString
        End If
        Return Fecha
    End function






    Private Function CalcularFecha(ByVal FechaInicial As Date, ByVal DiaFijo As Integer, ByRef FormaCalcularFechas As String,
                           ByRef Periodicidad As String, ByRef TipoBase As Integer)
        'Declaracion de Variables'
        Dim BaseDias As Integer = 0
        Dim FechaFinal As Date = Date.Today.Date






        If (TipoBase = 0 Or TipoBase = 2) Then

            BaseDias = 360


            If FormaCalcularFechas = "FinMes" Then
                FechaFinal = Operaciones.FechaFinMes(FechaInicial, Periodicidad, BaseDias)

            ElseIf FormaCalcularFechas = "Mensual" Then

                FechaFinal = Operaciones.FechaMensual(FechaInicial, Periodicidad, FormaCalcularFechas, 0, DiaFijo, BaseDias)
            End If


        ElseIf TipoBase = 1 Or TipoBase = 3 Then
            BaseDias = 365

            If FormaCalcularFechas = "FinMes" Then
                FechaFinal = Operaciones.FechaFinMes(FechaInicial, Periodicidad, BaseDias)

            ElseIf FormaCalcularFechas = "Mensual" Then

                FechaFinal = Operaciones.FechaMensual(FechaInicial, Periodicidad, FormaCalcularFechas, 0, DiaFijo, BaseDias)
            End If
        End If
        Return FechaFinal
    End Function





    Function AgregarCorrelativo(ByRef dgvTabla As DataGridView, ByRef PosicionIndex As Integer)
        Dim Cantidad As Integer = PosicionIndex
        Dim Index As Integer = 0
        Dim Correlativo As Integer = 0
        While Index <= Cantidad
            Correlativo = Index + 1

            Index += 1
        End While
        Return Correlativo
    End Function







    Function AgregarDias(ByRef dgvTabla As DataGridView, ByRef dtpFechaLiquidacion As DateTimePicker, ByRef TipoBase As Integer,
                    ByRef Periodicidad As String, ByRef FormaCalcularFechas As String, ByRef NombreCampoFecha As String,
                    ByRef NombreCampoDias As String, ByRef Index As Integer)

        Dim IndexAnterior As Integer = Index - 1
        Dim FechaAnterior As String = String.Empty
        Dim FechaActual As String = String.Empty
        Dim FechaLiquidacion As Date = Format(dtpFechaLiquidacion.Value, "dd/MM/yyyy")
        Dim BaseCalculo As Integer = 0
        Dim Meses As Integer = 0
        Dim DiasFinales As Integer = 0
        Dim CantidadDiasNormal360 As Integer = 0
        Dim CantidadDias360 As Integer = 0
        If Periodicidad = "M" Then
            Meses = 1
        ElseIf Periodicidad = "T" Then
            Meses = 3
        ElseIf Periodicidad = "S" Then
            Meses = 6
        ElseIf Periodicidad = "A" Then
            Meses = 12
        End If

        CantidadDiasNormal360 = Meses * 30
        If TipoBase = 0 Or TipoBase = 2 Then
            BaseCalculo = 360

        ElseIf TipoBase = 1 Or TipoBase = 3 Then
            BaseCalculo = 365
        End If



        If Index > 0 Then
            FechaAnterior = Operaciones.ConvertirFecha(dgvTabla.Rows(IndexAnterior).Cells(NombreCampoFecha).Value)
            FechaActual = Operaciones.ConvertirFecha(dgvTabla.Rows(Index).Cells(NombreCampoFecha).Value)


            If BaseCalculo = 360 Then
                If FormaCalcularFechas = "FinMes" Then
                    DiasFinales = Operaciones.Base360(FechaAnterior, FechaActual)
                ElseIf FormaCalcularFechas = "Mensual" Then
                    DiasFinales = CantidadDiasNormal360

                End If

            ElseIf BaseCalculo = 365 Then
                DiasFinales = Operaciones.Base365(FechaAnterior, FechaActual)


            End If



        Else
            'Primera Fecha'



            FechaActual = Operaciones.ConvertirFecha(dgvTabla.Rows(Index).Cells(NombreCampoFecha).Value)


            If BaseCalculo = 360 Then
                If FormaCalcularFechas = "FinMes" Then
                    DiasFinales = Operaciones.Base360(FechaLiquidacion, FechaActual)
                ElseIf FormaCalcularFechas = "Mensual" Then
                    DiasFinales = CantidadDiasNormal360

                End If

            ElseIf BaseCalculo = 365 Then
                DiasFinales = Operaciones.Base365(FechaLiquidacion, FechaActual)


            End If



        End If
        Return DiasFinales
    End Function








    Function CalcularFormulasDiasBase(ByVal dtpFechaLiquidacion As Date, ByVal dtpFechaVencimiento As Date,
                                      ByRef TipoBase As Integer)
        Dim ListaDiasBase As New Dictionary(Of String, String)

        Dim Dias1 As Double = 0
        Dim Dias2 As Double = 0

        Dim Dias360 As Double = Operaciones.Base360(dtpFechaLiquidacion, dtpFechaVencimiento)
        Dim Dias365 As Double = Operaciones.Base365(dtpFechaLiquidacion, dtpFechaVencimiento)



        If (TipoBase = 0) Then
            ListaDiasBase.Add("DiasNormales", Dias360)
            ListaDiasBase.Add("DiasEspeciales", 0)
            ListaDiasBase.Add("TipoBase", "360")



        ElseIf (TipoBase = 1) Then


            Dim FechaInicial = dtpFechaLiquidacion
            Dim FechaFinal = dtpFechaVencimiento



            Dim CambioDeFecha As Integer = Operaciones.CambioBase(FechaInicial, FechaFinal)

            Dim PrimeraFechaUltima = Operaciones.PrimeraFechaCambioBase(FechaInicial)
            Dim UltimaFechaPrimero = Operaciones.FinalFechaCambioBase(FechaFinal)
            Dim DiasPrimeraFecha = 0, DiasSegundaFecha = 0


            If (Not CambioDeFecha = 0) Then


                If CambioDeFecha = 1 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha366(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha365(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasSegundaFecha
                    Dias2 = DiasPrimeraFecha


                ElseIf CambioDeFecha = 2 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha365(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha366(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasPrimeraFecha
                    Dias2 = DiasSegundaFecha
                End If




                ListaDiasBase.Add("DiasNormales", Dias1)
                ListaDiasBase.Add("DiasEspeciales", Dias2)
                ListaDiasBase.Add("TipoBase", "365")

            Else

                If (Operaciones.AñoBisiesto(FechaInicial) + 1 = 365) Then


                    ListaDiasBase.Add("DiasNormales", Dias365)
                    ListaDiasBase.Add("DiasEspeciales", 0)
                    ListaDiasBase.Add("TipoBase", "365")

                End If

                If (Operaciones.AñoBisiesto(FechaInicial) + 1 = 366) Then
                    ListaDiasBase.Add("DiasNormales", 0)
                    ListaDiasBase.Add("DiasEspeciales", Dias365)
                    ListaDiasBase.Add("TipoBase", "365")
                End If

            End If


        ElseIf (TipoBase = 2) Then
            ''''''''''''''''
            Dim FechaInicial = dtpFechaLiquidacion
            Dim FechaFinal = dtpFechaVencimiento



            Dim CambioDeFecha As Integer = Operaciones.CambioBase(FechaInicial, FechaFinal)

            Dim PrimeraFechaUltima = Operaciones.PrimeraFechaCambioBase360(FechaInicial)
            Dim UltimaFechaPrimero = Operaciones.FinalFechaCambioBase360(FechaFinal)
            Dim DiasPrimeraFecha = 0, DiasSegundaFecha = 0


            If (Not CambioDeFecha = 0) Then


                If CambioDeFecha = 1 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha360(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha360(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasSegundaFecha
                    Dias2 = DiasPrimeraFecha


                ElseIf CambioDeFecha = 2 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha360(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha360(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasPrimeraFecha
                    Dias2 = DiasSegundaFecha
                End If

                ListaDiasBase.Add("DiasNormales", Dias1)
                ListaDiasBase.Add("DiasEspeciales", Dias2)
                ListaDiasBase.Add("TipoBase", "360/365")

            Else

                If (Operaciones.AñoBisiesto(FechaInicial) + 1 = 365) Then


                    ListaDiasBase.Add("DiasNormales", Dias360)
                    ListaDiasBase.Add("DiasEspeciales", 0)
                    ListaDiasBase.Add("TipoBase", "360/365")

                End If

                If (Operaciones.AñoBisiesto(FechaInicial) + 1 = 366) Then


                    ListaDiasBase.Add("DiasNormales", 0)
                    ListaDiasBase.Add("DiasEspeciales", Dias360)
                    ListaDiasBase.Add("TipoBase", "360/365")
                End If

            End If



        Else














            Dim FechaInicial = dtpFechaLiquidacion
            Dim FechaFinal = dtpFechaVencimiento



            Dim CambioDeFecha As Integer = Operaciones.CambioBase(FechaInicial, FechaFinal)

            Dim PrimeraFechaUltima = Operaciones.PrimeraFechaCambioBase(FechaInicial)
            Dim UltimaFechaPrimero = Operaciones.FinalFechaCambioBase(FechaFinal)
            Dim DiasPrimeraFecha = 0, DiasSegundaFecha = 0


            If (Not CambioDeFecha = 0) Then


                If CambioDeFecha = 1 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha366(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha365(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasSegundaFecha

                    Dias2 = DiasPrimeraFecha


                ElseIf CambioDeFecha = 2 Then
                    DiasPrimeraFecha = Operaciones.DiasDespuesCambioPrimeraFecha365(FechaInicial, PrimeraFechaUltima, CambioDeFecha)
                    DiasSegundaFecha = Operaciones.DiasDespuesCambioPrimeraFecha366(UltimaFechaPrimero, FechaFinal, CambioDeFecha)
                    Dias1 = DiasPrimeraFecha
                    Dias2 = DiasSegundaFecha
                End If

                ListaDiasBase.Add("DiasNormales", Dias1)
                ListaDiasBase.Add("DiasEspeciales", Dias2)
                ListaDiasBase.Add("TipoBase", "365/360")

            Else



                ListaDiasBase.Add("DiasNormales", Dias365)
                ListaDiasBase.Add("DiasEspeciales", 0)
                ListaDiasBase.Add("TipoBase", "365/360")


            End If

        End If


        Return ListaDiasBase

    End Function


    Sub AgregarValoresCamposdgvVacios(ByRef dgvTabla As DataGridView, ByVal index As Integer, ByVal NombreCampo As String, ByVal ValorAgregar As String)
        Dim value As String = dgvTabla.Rows(index).Cells(NombreCampo).Value
        If String.IsNullOrEmpty(value) Then
            dgvTabla.Rows(index).Cells(NombreCampo).Value = ValorAgregar
        End If

    End Sub



    Function EmpaquetarTablaBaseDatos(ByRef dgvTabla As DataGridView)

        Dim ColumnasRegistro As New Dictionary(Of Integer, Collection)


        Dim IndexFilas As Integer = dgvTabla.Rows.Count - 1
        Dim IndexColumnas As Integer = dgvTabla.Columns.GetColumnCount(DataGridViewElementStates.Visible) - 1

        Dim IndexVertical As Integer = 0
        Dim IndexHorizontal As Integer = 0

        While IndexFilas >= IndexVertical
            Dim FilasRegistros As New Collection
            IndexHorizontal = 0

            While IndexColumnas >= IndexHorizontal
                FilasRegistros.Add(dgvTabla.Rows(IndexVertical).Cells(IndexHorizontal).Value)

                IndexHorizontal += 1
            End While
            ColumnasRegistro.Add(IndexVertical, FilasRegistros)
            IndexVertical += 1
        End While
        Return ColumnasRegistro
    End Function

End Class
