Partial Class PlazaBusinessObject

#Region "Contructores"
    ' Definir en esta region los constructores personalizados para el BusinessObject

#End Region

#Region "Metodos Generales"
    ' Definir en esta region los metodos no estaticos,
    ' estos metodos comunmente utilizan como parametros de proceso valores tomados de la propiedad entity
    Public Overrides Function SaveChanges() As MSG
        Dim MSG As New MSG("SaveChanges")
        ' pones toda tu logica de validacion previo a el guardado

        Try
            Transaction.Begin()

            If Me._IsNew Then
                ' Es nuevo registro, se va realizar insert

                '******************    PRIMER METODO DE VERIFICAR EL PROCESO ACTIVO     **************************

                'Dim ListProcesoEvaluacion As EntityList(Of ProcesoEvaluacion) = ProcesoEvaluacionBusinessObject.GetListProcesoEvaluacion

                'If ListProcesoEvaluacion.Count > 0 Then
                '    Dim ProcesoEvaluacionActivo = From procesoEvaluacion As ProcesoEvaluacion In ListProcesoEvaluacion Where procesoEvaluacion.estado = True Select procesoEvaluacion

                '    If ProcesoEvaluacionActivo.Count = 1 Then
                '        ' Correcto
                '        Me.Entity.idProcesoEvaluacion = ProcesoEvaluacionActivo(0).idProcesoEvalacion
                '    ElseIf ProcesoEvaluacionActivo.Count > 0 Then
                '        ' error
                '        MSG.FriendlyMessage = "Se encontro más de un ProcesoEvaluacion activo"
                '        MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                '        Return MSG
                '    ElseIf ProcesoEvaluacionActivo.Count = 0 Then
                '        MSG.FriendlyMessage = "No se encontró ProcesoEvaluacion activo"
                '        MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                '        Return MSG
                '        ' error
                '    End If
                'Else
                '    MSG.FriendlyMessage = "No se pudo recupara la información correspondiente al ProcesoEvaluacion"
                '    MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                '    Return MSG
                'End If


                '*****************     SEGUNDO METODO de verificar el proceso Activo      ***************************

                Dim ProcesoEvaluacionActivo As ProcesoEvaluacion = ProcesoEvaluacionBusinessObject.GetProcesoEvaluacionActivo

                If ProcesoEvaluacionActivo Is Nothing Then
                    Transaction.RollBack()
                    MSG.FriendlyMessage = "No se pudo recupara la información correspondiente al ProcesoEvaluacion"
                    MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                    Return MSG
                End If

                Me.Entity.idProcesoEvaluacion = ProcesoEvaluacionActivo.idProcesoEvalacion

                MSG = MyBase.SaveChanges

                If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                    Transaction.RollBack()
                    Return MSG
                End If

                Dim oHistorial As New HistorialEstadoPlazaBusinessObject()
                oHistorial.Entity.idPlaza = Me.Entity.idPlaza
                oHistorial.Entity.fecha = Now
                oHistorial.Entity.idEstado = Me.Entity.idEstadoPlaza
                oHistorial.Entity.usuario = Me.Entity.usuarioModificacion
                MSG = oHistorial.SaveChanges
                If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                    Transaction.RollBack()
                    Return MSG
                End If

                Dim oContrato As ContratosBusinessObject
                For cont As Integer = 1 To Me.Entity.vacantes
                    oContrato = New ContratosBusinessObject()
                    oContrato.Entity.idPlaza = Me.Entity.idPlaza
                    MSG = oContrato.SaveChanges
                    If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                        Transaction.RollBack()
                        Return MSG
                    End If
                Next


                '*******  PROCESO PARA INSERTAR PUNTAJES POR DEFAULT   ****************
                If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Success Then

                    'Solo las del idProceso
                    Dim ListFactor As EntityList(Of Factor) = FactorBusinessObject.GetListFactorByidProcesoEvaluacion(Me.Entity.idProcesoEvaluacion)

                    For Each Factor As Factor In ListFactor
                        Dim oFactorPuntaje As New FactorPuntajeBusinessObject()
                        oFactorPuntaje.Entity.idFactor = Factor.idFactor
                        oFactorPuntaje.Entity.idPlaza = Me.Entity.idPlaza
                        oFactorPuntaje.Entity.FactorPuntajeMinimo = 0
                        oFactorPuntaje.Entity.FactorPuntajeMaximo = 0

                        MSG = oFactorPuntaje.SaveChanges()
                        If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                            Transaction.RollBack()
                            MSG.FriendlyMessage = "error al crear los puntajes base"
                            Return MSG
                        End If
                    Next
                    'Dim Factores = From factor As Factor In ListFactor


                End If
            Else
                'SI EL CONCURSO NO ES NUEVO Y SE TRATA DE MODIFICAR

                'If Me.Entity.idEstadoPlazaOld = 4 Then
                '    MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                '    MSG.FriendlyMessage = "El concurso (plaza) se encuentra Finalizado. NO SE PUEDE MODIFICAR."
                '    Transaction.RollBack()
                '    Return MSG
                'End If

                If Me.Entity.idEstadoPlazaOld = 2 Then
                    MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                    MSG.FriendlyMessage = "El concurso (plaza) ya ha sido Publicado y No se puede modificar."
                    Transaction.RollBack()
                    Return MSG
                End If


                '*********** QUITAR          ****************
                'If Me.Entity.idEstadoPlaza = 2 Then
                '    If String.Compare(Me.Entity.vacantesOld, Me.Entity.vacantes) <> 0 Then
                '        MSG = ContratosBusinessObject.EliminarContratos(Me.Entity.idPlaza)
                '        If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                '            Transaction.RollBack()
                '            Return MSG
                '        End If

                '        Dim oContrato As ContratosBusinessObject
                '        For cont As Integer = 1 To Me.Entity.vacantes
                '            oContrato = New ContratosBusinessObject()
                '            oContrato.Entity.idPlaza = Me.Entity.idPlaza
                '            MSG = oContrato.SaveChanges
                '            If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                '                Transaction.RollBack()
                '                Return MSG
                '            End If
                '        Next
                '    End If
                'End If

                If String.Compare(Me.Entity.COD_INSPTO, Me.Entity.COD_INSPTOOld) <> 0 Then
                    If Me.Entity.ubicacionPuesto = False Then
                        MSG = ExecuteCopiaPuestoFuncional(Me.Entity.idPlaza, Me.Entity.COD_INSPTO)

                    Else
                        MSG = ExecuteCopiaPuestoDesdeDotacion(Me.Entity.idPlaza, Me.Entity.COD_INSPTO)

                    End If
                    MSG.FriendlyMessage = "Asociación del Puesto Funcional a la Plaza fue exitoso."

                End If

                MSG = MyBase.SaveChanges

                If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                    Transaction.RollBack()
                    Return MSG
                End If

                If Me.Entity.idEstadoPlaza = 2 Then
                    Dim errores As String = "<ul>"
                    Dim existeError As Boolean = False
                    If String.IsNullOrEmpty(Me.Entity.COD_INSPTO) Then
                        existeError = True
                        errores = "<li>No existe Puesto Funcional asociado.</li>"
                    End If

                    If Date.Parse(Me.Entity.fechaInicioInscripcion) < Now.Date Then
                        existeError = True
                        errores = "<li>La fecha de inscripción no puede ser menor a la fecha de hoy.</li>"
                    End If

                    If Date.Parse(Me.Entity.fechaCierreInscripcion) < Now.Date Then
                        existeError = True
                        errores = "<li>La fecha de cierre no puede ser menor a la fecha de hoy.</li>"
                    End If


                    If Date.Parse(Me.Entity.fechaCierreInscripcion) <= Date.Parse(Me.Entity.fechaInicioInscripcion) Then
                        existeError = True
                        errores = "<li>La fecha de cierre no puede ser menor o igual que la fecha de Inscripción.</li>"
                    End If

                    If Not ExisteIndispensable(Me.Entity.idPlaza) Then
                        existeError = True
                        errores = "<li>No existe un grado académico INDISPENSABLE para publicar la plaza.</li>"
                    End If


                    Dim ListaGrado As EntityList(Of GOES_Grado) = GOES_GradoBusinessObject.GetListGOES_GradoByPlaza(Me.Entity.idPlaza)
                    If ListaGrado.Count = 0 Then
                        existeError = True
                        errores = "<li>No existe Grado Académico asociado en este puesto.</li>"
                    End If


                    Dim ListaCompetencias As EntityList(Of GOES_CompTecnica) = GOES_CompTecnicaBusinessObject.GetListGOES_CompTecnicaByPlaza(Me.Entity.idPlaza)
                    If ListaCompetencias.Count = 0 Then
                        existeError = True
                        errores = "<li>No existen Competencias Técnicas en este puesto.</li>"
                    End If

                    Dim ListaFactorPuntaje As EntityList(Of FactorPuntaje) = FactorPuntajeBusinessObject.GetListFactorPuntajeByPlaza(Me.Entity.idPlaza)
                    Dim oFactor As FactorBusinessObject
                    For Each oFactorPuntaje As FactorPuntaje In ListaFactorPuntaje
                        Dim ListaArea As EntityList(Of Area) = AreaBusinessObject.GetListAreaByFactorPuntaje(oFactorPuntaje.idFactorPuntaje)
                        If ListaArea.Count = 0 AndAlso oFactorPuntaje.FactorPuntajeMaximo <> 0 Then
                            existeError = True
                            oFactor = New FactorBusinessObject(oFactorPuntaje.idFactor)
                            errores = String.Format("{0}<li>No existen áreas temáticas asociadas al factor: <b>{1}</b>. El Puntaje Máximo difiere de Cero.</li>", errores, oFactor.Entity.nombreFactor)
                        End If
                        If ListaArea.Count > 0 AndAlso oFactorPuntaje.FactorPuntajeMaximo = 0 Then
                            existeError = True
                            oFactor = New FactorBusinessObject(oFactorPuntaje.idFactor)
                            errores = String.Format("{0}<li>El factor: <b>{1}</b> contiene áreas temáticas asociadas, pero No se ha ingresado Puntaje Máximo.</li>", errores, oFactor.Entity.nombreFactor)
                        End If
                    Next


                    If existeError Then
                        MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors
                        MSG.FriendlyMessage = errores & "</ul>"
                        Transaction.RollBack()
                        Return MSG
                    End If
                End If

                If String.Compare(Me.Entity.idEstadoPlaza, Me.Entity.idEstadoPlazaOld) <> 0 Then


                    Dim oHistorial As New HistorialEstadoPlazaBusinessObject()
                    oHistorial.Entity.idPlaza = Me.Entity.idPlaza
                    oHistorial.Entity.fecha = Now
                    oHistorial.Entity.idEstado = Me.Entity.idEstadoPlaza
                    oHistorial.Entity.usuario = Me.Entity.usuarioModificacion
                    MSG = oHistorial.SaveChanges
                    If MSG.EventType = dGen.Library.Entity.MSG.MsgType.Errors Then
                        Transaction.RollBack()
                        Return MSG
                    End If
                End If


            End If

            ' '' se verifica si se ha seteado COD_INSPTO
            ''If Not String.IsNullOrEmpty(Me.Entity.COD_INSPTO) AndAlso String.IsNullOrEmpty(Me.Entity.COD_INSPTOOld) Then
            ''    ' se llama procedimiento almacenado de creacion
            ''    MSG = SetPuestoFuncional(Me.Entity.idPlaza, Me.Entity.COD_INSPTO)
            ''ElseIf String.Compare(Me.Entity.COD_INSPTO, Me.Entity.COD_INSPTOOld) <> 0 Then
            ''    ' si se ha cambiado el puesto asociado a la plaza, se debe eliminar los factoreas asociados previamente, y se registran los nuevos
            ''    MSG = SetPuestoFuncional(Me.Entity.idPlaza, Me.Entity.COD_INSPTO)
            ''End If



            ' Guardas
            ' Sin usar el MSG
            ' Return MyBase.SaveChanges

            Transaction.Commit()
            Return MSG
        Catch ex As Exception
            Transaction.RollBack()
            MSG.FriendlyMessage = "No fue posible guardar la informacion de la plaza"
            MSG.TechnicalMessage = ex.Message
            Return MSG
        End Try
    End Function
#End Region

#Region "Metodos Estaticos"
    ' Definir en esta region metodos estaticos
    Public Shared Function ExecuteCopiaPuestoFuncional(idPlaza As Integer, COD_INSPTO As String) As MSG
        Return GetDdHelperInstance.ExecuteCopiaPuestoFuncional(idPlaza, COD_INSPTO)
    End Function

    Public Shared Function ExecuteCopiaPuestoDesdeDotacion(idPlaza As Integer, COD_INSPTO As String) As MSG
        Return GetDdHelperInstance.ExecuteCopiaPuestoDesdeDotacion(idPlaza, COD_INSPTO)
    End Function

    Public Shared Function ExecuteCreacionConfiguracion(idPlaza As Integer, idUsuario As Integer) As MSG
        Return GetDdHelperInstance.ExecuteCreacionConfiguracion(idPlaza, idUsuario)
    End Function

    Public Shared Function ExecuteCreacionRegistrosConfiguracion(idPlaza As Integer, idUsuario As Integer) As MSG
        Return GetDdHelperInstance.ExecuteCreacionRegistrosConfiguracion(idPlaza, idUsuario)
    End Function

    Public Shared Function ExecuteCrearConcursoPostulanteMuestra(idPlaza As Integer, idUsuario As Integer) As MSG
        Return GetDdHelperInstance.ExecuteCrearConcursoPostulanteMuestra(idPlaza, idUsuario)
    End Function

    Public Shared Function GetTotalEmpleosActuales() As Integer
        Return GetDdHelperInstance.GetTotalEmpleosActuales()
    End Function

    Public Shared Function GetTotalVacantesActuales() As Integer
        Return GetDdHelperInstance.GetTotalVacantesActuales()
    End Function

    Public Shared Function GetTotalConcursos() As Integer
        Return GetDdHelperInstance.GetTotalConcursos()
    End Function
    Public Shared Function GetTotalSalario() As Double
        Return GetDdHelperInstance.GetTotalSalario()
    End Function

    Public Shared Function GetAnalytics() As Integer
        Return GetDdHelperInstance.GetAnalytics
    End Function

    Public Shared Function ExecuteEstadoConcursos(idInstitucion As String) As String
        Return GetDdHelperInstance.ExecuteEstadoConcursos(idInstitucion)
    End Function

    Public Shared Function ExisteIndispensable(idPlaza As Integer) As Boolean
        Return GetDdHelperInstance.ExisteIndispensable(idPlaza)
    End Function

#End Region


#Region "Metodos Privados"
    ' Definir en esta region metodos privados

#End Region

#Region "Metodos Reportes"
    ' Definir en esta region metodos utilizados para reportes que comunmente devulven DataSets

#End Region
End Class
