Imports System
Imports System.Data
Imports System.IO
Imports System.Xml
Imports System.Linq
Imports System.String
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Microsoft.VisualBasic
Imports Telerik.QuickStart
Imports Telerik.Web.UI
Imports Quasar.Vigia.Ivc.Bll
Imports System.Text.RegularExpressions

Partial Class Quimica_frmAutoAsisTec
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"
    Public oRutinas As New ClsRutinas
    Public oPropiedad As New ClsAsisTec
#End Region

#Region "Ciclo de Vida de la Página"

    ''' <summary>
    ''' Evento inicial de carga de la página. Inicializa la sesión y carga listas básicas.
    ''' </summary>
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim opcion As String = Request.QueryString("opcion")
        Dim idURL As String = Request.QueryString("IdTblAutoAsisTec") ' Aquí llega "AT000006"
        If Not IsPostBack Then
            Me.txtNumInsc.Text = GenerarNumeroInscripcion()
            CargarPais()
            CargarTipDoc()
            CargarLocalidades()
            CargarUPZ()
            CargarBarrio()
            InicializarDireccionInicio()
            CargarProfUniv()
            CargarNivelFor()
            CargarEsGrado()
            CargarTituloExt()
            CargarVerificacion1()
            CargarVerificacion2()
            CargarVerificacion3()
            CargarVerificacion4()
            CargarVerificacion5()
            CargarVerificacion6()
            CargarVerificacion7()
            CargarVerificacion8()
            If Not String.IsNullOrEmpty(idURL) Then
                ' =========================
                ' FLUJO SDS (INTERNO)
                ' =========================
                If opcion = "VerificarSDS" Then
                    Dim id As Integer
                    If Integer.TryParse(Request.QueryString("IdTblAutoAsisTec"), id) Then
                        hfIdTblAutoAsisTec.Value = id.ToString()
                    End If
                    If Not String.IsNullOrEmpty(hfIdTblAutoAsisTec.Value) Then
                        CargarDatosSDS(CInt(hfIdTblAutoAsisTec.Value))
                        CargarIdsDocumentos(CInt(hfIdTblAutoAsisTec.Value))
                    End If
                    ConsultarDocumentosById(idURL)
                    BloquearControles(Me)
                    DesbloquearControlesVerificacion()

                ElseIf opcion = "EditSDS" Then
                    Dim id As Integer
                    If Integer.TryParse(Request.QueryString("IdTblAutoAsisTec"), id) Then
                        hfIdTblAutoAsisTec.Value = id.ToString()
                    End If
                    If Not String.IsNullOrEmpty(hfIdTblAutoAsisTec.Value) Then
                        CargarDatosSDS(CInt(hfIdTblAutoAsisTec.Value))
                        CargarIdsDocumentos(CInt(hfIdTblAutoAsisTec.Value))
                        CargarVerificacionesGuardadas(CInt(hfIdTblAutoAsisTec.Value))
                    End If
                    ConsultarDocumentosById(idURL)
                    BloquearControles(Me)
                    DesbloquearControlesVerificacion()

                ElseIf opcion = "ViewSDS" Then
                    Dim id As Integer
                    If Integer.TryParse(Request.QueryString("IdTblAutoAsisTec"), id) Then
                        hfIdTblAutoAsisTec.Value = id.ToString()
                    End If
                    If Not String.IsNullOrEmpty(hfIdTblAutoAsisTec.Value) Then
                        CargarDatosSDS(CInt(hfIdTblAutoAsisTec.Value))
                        CargarIdsDocumentos(CInt(hfIdTblAutoAsisTec.Value))
                        CargarVerificacionesGuardadas(CInt(hfIdTblAutoAsisTec.Value))
                    End If
                    ConsultarDocumentosById(idURL)
                    BloquearControles(Me)
                    DesbloquearControlesVerificacion()
                    If opcion = "ViewSDS" Then
                        BloquearControles(Me)
                    End If
                    ' =========================
                    ' FLUJO EXTERNO (NO TOCAR)
                    ' =========================
                ElseIf opcion = "Edit" OrElse opcion = "View" Then
                    Dim row As DataRow = ClsAsisTec.ObtenerIdPorInscripcion(idURL)
                    If Not row Is Nothing Then
                        hfIdTblAutoAsisTec.Value = row("IdTblAutoAsisTec").ToString()
                    End If
                    CargarDatos(idURL)
                    ConsultarDocumentos(idURL)
                    If opcion = "View" Then
                        BloquearControles(Me)
                    End If
                End If
            End If
        End If
    End Sub

    ''' <summary>
    ''' Se ejecuta al completar la carga. Maneja la lógica según el modo (Edit, New, View).
    ''' </summary>
    Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete

        If IsPostBack Then Exit Sub
        Dim sMode As String = Request.QueryString("opcion")
        Select Case sMode
            Case "Edit"
                ProcesarEditActa()
            Case "New"
                ProcesarNuevaActa()
            Case "View"
                ProcesarVisualizar()
            Case "VerificarSDS"
                ProcesarVerificarSDSActa()
            Case "EditSDS"
                ProcesarEditSDSActa()
            Case "ViewSDS"
                ProcesarVisualizarSDS()
        End Select

    End Sub

#End Region
#Region "Lógica de Inicialización y Modos (New/Edit/View)"

    ''' <summary>
    ''' Prepara el formulario para un nuevo registro.
    ''' </summary>
    Private Sub ProcesarNuevaActa()
        Me.DivbtnVerDocum1.Visible = False
        Me.DivbtnDescargarDocum1.Visible = False
        Me.DivtxtVerificacionDocum1.Visible = False
        Me.DivrcbVerificacionDocum1.Visible = False
        Me.DivbtnVerDocum2.Visible = False
        Me.DivbtnDescargarDocum2.Visible = False
        Me.DivtxtVerificacionDocum2.Visible = False
        Me.DivrcbVerificacionDocum2.Visible = False
        Me.DivbtnVerDocum3.Visible = False
        Me.DivbtnDescargarDocum3.Visible = False
        Me.DivtxtVerificacionDocum3.Visible = False
        Me.DivrcbVerificacionDocum3.Visible = False
        Me.DivbtnVerDocum4.Visible = False
        Me.DivbtnDescargarDocum4.Visible = False
        Me.DivtxtVerificacionDocum4.Visible = False
        Me.DivrcbVerificacionDocum4.Visible = False
        Me.DivbtnVerDocum5.Visible = False
        Me.DivbtnDescargarDocum5.Visible = False
        Me.DivtxtVerificacionDocum5.Visible = False
        Me.DivrcbVerificacionDocum5.Visible = False
        Me.DivbtnVerDocum6.Visible = False
        Me.DivbtnDescargarDocum6.Visible = False
        Me.DivtxtVerificacionDocum6.Visible = False
        Me.DivrcbVerificacionDocum6.Visible = False
        Me.DivbtnVerDocum7.Visible = False
        Me.DivbtnDescargarDocum7.Visible = False
        Me.DivtxtVerificacionDocum7.Visible = False
        Me.DivrcbVerificacionDocum7.Visible = False
        Me.DivbtnVerDocum8.Visible = False
        Me.DivbtnDescargarDocum8.Visible = False
        Me.DivtxtVerificacionDocum8.Visible = False
        Me.DivrcbVerificacionDocum8.Visible = False
        Me.btnActualizar.Visible = False
        Me.btnActualizarSDS.Visible = False
        Me.btnVerificar.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarEditActa()
        Me.DivbtnDescargarDocum1.Visible = False
        Me.DivtxtVerificacionDocum1.Visible = False
        Me.DivrcbVerificacionDocum1.Visible = False
        Me.DivbtnDescargarDocum2.Visible = False
        Me.DivtxtVerificacionDocum2.Visible = False
        Me.DivrcbVerificacionDocum2.Visible = False
        Me.DivbtnDescargarDocum3.Visible = False
        Me.DivtxtVerificacionDocum3.Visible = False
        Me.DivrcbVerificacionDocum3.Visible = False
        Me.DivbtnDescargarDocum4.Visible = False
        Me.DivtxtVerificacionDocum4.Visible = False
        Me.DivrcbVerificacionDocum4.Visible = False
        Me.DivbtnDescargarDocum5.Visible = False
        Me.DivtxtVerificacionDocum5.Visible = False
        Me.DivrcbVerificacionDocum5.Visible = False
        Me.DivbtnDescargarDocum6.Visible = False
        Me.DivtxtVerificacionDocum6.Visible = False
        Me.DivrcbVerificacionDocum6.Visible = False
        Me.DivbtnDescargarDocum7.Visible = False
        Me.DivtxtVerificacionDocum7.Visible = False
        Me.DivrcbVerificacionDocum7.Visible = False
        Me.DivbtnDescargarDocum8.Visible = False
        Me.DivtxtVerificacionDocum8.Visible = False
        Me.DivrcbVerificacionDocum8.Visible = False
        Me.btnInsertar.Visible = False
        Me.btnVerificar.Visible = False
        Me.btnActualizarSDS.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos en modo solo lectura.
    ''' </summary>
    Private Sub ProcesarVisualizar()
        Me.filDocumento1.Visible = False
        Me.DivbtnCargarDocum1Cargar.Visible = False
        Me.DivbtnDescargarDocum1.Visible = False
        Me.DivtxtVerificacionDocum1.Visible = False
        Me.DivrcbVerificacionDocum1.Visible = False
        Me.filDocumento2.Visible = False
        Me.DivbtnCargarDocum2Cargar.Visible = False
        Me.DivbtnDescargarDocum2.Visible = False
        Me.DivtxtVerificacionDocum2.Visible = False
        Me.DivrcbVerificacionDocum2.Visible = False
        Me.filDocumento3.Visible = False
        Me.DivbtnCargarDocum3Cargar.Visible = False
        Me.DivbtnDescargarDocum3.Visible = False
        Me.DivtxtVerificacionDocum3.Visible = False
        Me.DivrcbVerificacionDocum3.Visible = False
        Me.filDocumento4.Visible = False
        Me.DivbtnCargarDocum4Cargar.Visible = False
        Me.DivbtnDescargarDocum4.Visible = False
        Me.DivtxtVerificacionDocum4.Visible = False
        Me.DivrcbVerificacionDocum4.Visible = False
        Me.filDocumento5.Visible = False
        Me.DivbtnCargarDocum5Cargar.Visible = False
        Me.DivbtnDescargarDocum5.Visible = False
        Me.DivtxtVerificacionDocum5.Visible = False
        Me.DivrcbVerificacionDocum5.Visible = False
        Me.filDocumento6.Visible = False
        Me.DivbtnCargarDocum6Cargar.Visible = False
        Me.DivbtnDescargarDocum6.Visible = False
        Me.DivtxtVerificacionDocum6.Visible = False
        Me.DivrcbVerificacionDocum6.Visible = False
        Me.filDocumento7.Visible = False
        Me.DivbtnCargarDocum7Cargar.Visible = False
        Me.DivbtnDescargarDocum7.Visible = False
        Me.DivtxtVerificacionDocum7.Visible = False
        Me.DivrcbVerificacionDocum7.Visible = False
        Me.filDocumento8.Visible = False
        Me.DivbtnCargarDocum8Cargar.Visible = False
        Me.DivbtnDescargarDocum8.Visible = False
        Me.DivtxtVerificacionDocum8.Visible = False
        Me.DivrcbVerificacionDocum8.Visible = False
        Me.btnInsertar.Visible = False
        Me.btnActualizar.Visible = False
        Me.btnVerificar.Visible = False
        Me.btnActualizarSDS.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarVerificarSDSActa()
        Me.filDocumento1.Visible = False
        Me.DivbtnCargarDocum1Cargar.Visible = False
        Me.DivbtnVerDocum1.Visible = False
        Me.filDocumento2.Visible = False
        Me.DivbtnCargarDocum2Cargar.Visible = False
        Me.DivbtnVerDocum2.Visible = False
        Me.filDocumento3.Visible = False
        Me.DivbtnCargarDocum3Cargar.Visible = False
        Me.DivbtnVerDocum3.Visible = False
        Me.filDocumento4.Visible = False
        Me.DivbtnCargarDocum4Cargar.Visible = False
        Me.DivbtnVerDocum4.Visible = False
        Me.filDocumento5.Visible = False
        Me.DivbtnCargarDocum5Cargar.Visible = False
        Me.DivbtnVerDocum5.Visible = False
        Me.filDocumento6.Visible = False
        Me.DivbtnCargarDocum6Cargar.Visible = False
        Me.DivbtnVerDocum6.Visible = False
        Me.filDocumento7.Visible = False
        Me.DivbtnCargarDocum7Cargar.Visible = False
        Me.DivbtnVerDocum7.Visible = False
        Me.filDocumento8.Visible = False
        Me.DivbtnCargarDocum8Cargar.Visible = False
        Me.DivbtnVerDocum8.Visible = False
        Me.btnInsertar.Visible = False
        Me.btnActualizar.Visible = False
        Me.btnActualizarSDS.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarEditSDSActa()
        Me.filDocumento1.Visible = False
        Me.DivbtnCargarDocum1Cargar.Visible = False
        Me.DivbtnVerDocum1.Visible = False
        Me.filDocumento2.Visible = False
        Me.DivbtnCargarDocum2Cargar.Visible = False
        Me.DivbtnVerDocum2.Visible = False
        Me.filDocumento3.Visible = False
        Me.DivbtnCargarDocum3Cargar.Visible = False
        Me.DivbtnVerDocum3.Visible = False
        Me.filDocumento4.Visible = False
        Me.DivbtnCargarDocum4Cargar.Visible = False
        Me.DivbtnVerDocum4.Visible = False
        Me.filDocumento5.Visible = False
        Me.DivbtnCargarDocum5Cargar.Visible = False
        Me.DivbtnVerDocum5.Visible = False
        Me.filDocumento6.Visible = False
        Me.DivbtnCargarDocum6Cargar.Visible = False
        Me.DivbtnVerDocum6.Visible = False
        Me.filDocumento7.Visible = False
        Me.DivbtnCargarDocum7Cargar.Visible = False
        Me.DivbtnVerDocum7.Visible = False
        Me.filDocumento8.Visible = False
        Me.DivbtnCargarDocum8Cargar.Visible = False
        Me.DivbtnVerDocum8.Visible = False
        Me.btnInsertar.Visible = False
        Me.btnActualizar.Visible = False
        Me.btnVerificar.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos en modo solo lectura.
    ''' </summary>
    Private Sub ProcesarVisualizarSDS()
        Me.filDocumento1.Visible = False
        Me.DivbtnCargarDocum1Cargar.Visible = False
        Me.DivbtnDescargarDocum1.Visible = False
        Me.filDocumento2.Visible = False
        Me.DivbtnCargarDocum2Cargar.Visible = False
        Me.DivbtnDescargarDocum2.Visible = False
        Me.filDocumento3.Visible = False
        Me.DivbtnCargarDocum3Cargar.Visible = False
        Me.DivbtnDescargarDocum3.Visible = False
        Me.filDocumento4.Visible = False
        Me.DivbtnCargarDocum4Cargar.Visible = False
        Me.DivbtnDescargarDocum4.Visible = False
        Me.filDocumento5.Visible = False
        Me.DivbtnCargarDocum5Cargar.Visible = False
        Me.DivbtnDescargarDocum5.Visible = False
        Me.filDocumento6.Visible = False
        Me.DivbtnCargarDocum6Cargar.Visible = False
        Me.DivbtnDescargarDocum6.Visible = False
        Me.filDocumento7.Visible = False
        Me.DivbtnCargarDocum7Cargar.Visible = False
        Me.DivbtnDescargarDocum7.Visible = False
        Me.filDocumento8.Visible = False
        Me.DivbtnCargarDocum8Cargar.Visible = False
        Me.DivbtnDescargarDocum8.Visible = False
        Me.btnInsertar.Visible = False
        Me.btnActualizar.Visible = False
        Me.btnActualizarSDS.Visible = False
        Me.btnVerificar.Visible = False
    End Sub

    Private Sub InicializarCascadaDireccion()
        txtDireccionInicio.Text = ""

        ' Localidades
        rcbLocalidad.ClearSelection()
        rcbLocalidad.Items.Clear()
        CargarLocalidades()

        ' UPZ
        rcbUPZ.ClearSelection()
        rcbUPZ.Items.Clear()
        rcbUPZ.Items.Insert(0, "Seleccione...")

        ' Barrio
        rcbBarrio.ClearSelection()
        rcbBarrio.Items.Clear()
        rcbBarrio.Items.Insert(0, "Seleccione...")
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

    Private Sub LimpiarDireccion()
        txtDireccionInicio.Text = ""
        rcbLocalidad.ClearSelection()
        rcbUPZ.ClearSelection()
        rcbBarrio.ClearSelection()
        rcbLocalidad.SelectedIndex = -1
        rcbUPZ.SelectedIndex = -1
        rcbBarrio.SelectedIndex = -1
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

#End Region
#Region "Carga de Datos y Mapeo"

    Private Sub CargarDatos(ByVal inscripcion As String)
        Dim fila As DataRow = ClsAsisTec.ObtenerDatosNumInscripcion(inscripcion)
        If fila IsNot Nothing Then
            txtNumInsc.Text = fila("NumInscripcion").ToString()
            txtPrimerNom.Text = fila("PrimerNombre").ToString()
            txtSegundoNom.Text = fila("SegundoNombre").ToString()
            txtPrimerApe.Text = fila("PrimerApellido").ToString()
            txtSegundoApe.Text = fila("SegundoApellido").ToString()
            rcbPaisNac.SelectedValue = fila("IdPaisNacimiento").ToString()
            rcbTipIdent.SelectedValue = fila("IdTipoIdentificacion").ToString()
            txtNumDoc.Text = fila("NumeroDocumento").ToString()
            chkAreaRuralInicio.Checked = fila("AreaRural").ToString()
            txtDireccionInicio.Text = fila("Direccion").ToString()
            rcbLocalidad.SelectedValue = fila("IdLocalidad").ToString()
            rcbUPZ.SelectedValue = fila("IdUPZ").ToString()
            rcbBarrio.SelectedValue = fila("IdBarrio").ToString()
            txtBarrioDigitado.Text = fila("BarrioDigitado").ToString()
            txtTelContac.Text = fila("TelefonoContacto").ToString()
            txtCorreoElec.Text = fila("CorreoElectronico").ToString()
            SeleccionarSiNo(rcbProfUniv, fila("IdProfUniversidad"))
            txtNombreProg.Text = fila("NombrePrograma").ToString()
            txtNombreIns.Text = fila("NombreInstitucion").ToString()
            txtFechaTer.SelectedDate = fila("FechaTerminacionEstudios").ToString()
            rcbNivelForm.SelectedValue = fila("IdNivelFormacion").ToString()
            txtNombreProgPost.Text = fila("NombreProgramaPost").ToString()
            SeleccionarSiNo(rcbGraduado, fila("Graduado"))
            SeleccionarSiNo(rcbTituloExtran, fila("TituloExtranjero"))
            rcbPaisExp.SelectedValue = fila("IdPaisExpedicion").ToString()
            chkTratDatos.Checked = fila("AutorizacionDatos").ToString()
        End If

    End Sub

    Private Sub CargarDatosSDS(ByVal id As Integer)
        Dim fila As DataRow = ClsAsisTec.ObtenerDatosIdAutAsisTec(id)
        If fila IsNot Nothing Then
            txtNumInsc.Text = fila("NumInscripcion").ToString()
            txtPrimerNom.Text = fila("PrimerNombre").ToString()
            txtSegundoNom.Text = fila("SegundoNombre").ToString()
            txtPrimerApe.Text = fila("PrimerApellido").ToString()
            txtSegundoApe.Text = fila("SegundoApellido").ToString()
            rcbPaisNac.SelectedValue = fila("IdPaisNacimiento").ToString()
            rcbTipIdent.SelectedValue = fila("IdTipoIdentificacion").ToString()
            txtNumDoc.Text = fila("NumeroDocumento").ToString()
            chkAreaRuralInicio.Checked = fila("AreaRural").ToString()
            txtDireccionInicio.Text = fila("Direccion").ToString()
            rcbLocalidad.SelectedValue = fila("IdLocalidad").ToString()
            rcbUPZ.SelectedValue = fila("IdUPZ").ToString()
            rcbBarrio.SelectedValue = fila("IdBarrio").ToString()
            txtBarrioDigitado.Text = fila("BarrioDigitado").ToString()
            txtTelContac.Text = fila("TelefonoContacto").ToString()
            txtCorreoElec.Text = fila("CorreoElectronico").ToString()
            SeleccionarSiNo(rcbProfUniv, fila("IdProfUniversidad"))
            txtNombreProg.Text = fila("NombrePrograma").ToString()
            txtNombreIns.Text = fila("NombreInstitucion").ToString()
            txtFechaTer.SelectedDate = fila("FechaTerminacionEstudios").ToString()
            rcbNivelForm.SelectedValue = fila("IdNivelFormacion").ToString()
            txtNombreProgPost.Text = fila("NombreProgramaPost").ToString()
            SeleccionarSiNo(rcbGraduado, fila("Graduado"))
            SeleccionarSiNo(rcbTituloExtran, fila("TituloExtranjero"))
            rcbPaisExp.SelectedValue = fila("IdPaisExpedicion").ToString()
            chkTratDatos.Checked = fila("AutorizacionDatos").ToString()
        End If

    End Sub

    Private Function GenerarNumeroInscripcion() As String
        Dim ObjParametros As New Collection
        Dim evento As Integer = 1205 ' Evento nuevo para bitácora
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpIVCObtenerSiguienteNumeroInscripcion", ObjParametros, HttpContext.Current.Session, evento, False)
        Dim dt As DataTable = ds.Tables(0)
        If dt.Rows.Count > 0 Then
            Return dt.Rows(0)("NumeroInscripcion").ToString()
        Else
            Return "AT000001"
        End If
    End Function

    Private Sub ConsultarDocumentos(ByVal inscripcion As String)
        Dim dt As DataTable = ClsAsisTec.ObtenerDocumentos(inscripcion)
        For Each fila As DataRow In dt.Rows
            Dim tipo As Integer = Convert.ToInt32(fila("IdTipoDocumento"))
            DocumentosGuardados(tipo, fila("RutaArchivo").ToString(), fila("NombreArchivo").ToString())
        Next
    End Sub

    Private Sub ConsultarDocumentosById(ByVal id As String)
        Dim dt As DataTable = ClsAsisTec.ObtenerDocumentosById(id)
        For Each fila As DataRow In dt.Rows
            Dim tipo As Integer = Convert.ToInt32(fila("IdTipoDocumento"))
            DocumentosGuardados(tipo, fila("RutaArchivo").ToString(), fila("NombreArchivo").ToString())
        Next
    End Sub

    Private Sub CargarIdsDocumentos(idAuto As Integer)
        Dim dt As DataTable = ClsAsisTec.ConsultarDocumentos(idAuto)

        For Each row As DataRow In dt.Rows
            Dim tipo As Integer = Convert.ToInt32(row("IdTipoDocumento"))
            Dim idDoc As String = row("IdDocumento").ToString()

            Select Case tipo
                Case 1 : hfIdDocumento1.Value = idDoc
                Case 2 : hfIdDocumento2.Value = idDoc
                Case 3 : hfIdDocumento3.Value = idDoc
                Case 4 : hfIdDocumento4.Value = idDoc
                Case 5 : hfIdDocumento5.Value = idDoc
                Case 6 : hfIdDocumento6.Value = idDoc
                Case 7 : hfIdDocumento7.Value = idDoc
                Case 8 : hfIdDocumento8.Value = idDoc
                    'Case 9 : hfIdDocumento9.Value = idDoc
            End Select
        Next
    End Sub

    Private Sub DocumentosGuardados(tipo As Integer, ruta As String, nombre As String)
        Dim hddRuta As HiddenField = Nothing
        Dim hddNombre As HiddenField = Nothing
        Dim lbl As Label = Nothing
        Dim img As Image = Nothing
        Dim divVer As Control = Nothing
        Dim divDescargar As Control = Nothing
        Select Case tipo
            Case 1
                hddRuta = hddRutaArchivoDocum1
                hddNombre = hddNombreArchivoDocum1
                lbl = lblfilDocumento1
                img = imgfilDocumento1
                divVer = DivbtnVerDocum1
                divDescargar = DivbtnDescargarDocum1
            Case 2
                hddRuta = hddRutaArchivoDocum2
                hddNombre = hddNombreArchivoDocum2
                lbl = lblfilDocumento2
                img = imgfilDocumento2
                divVer = DivbtnVerDocum2
                divDescargar = DivbtnDescargarDocum2
            Case 3
                hddRuta = hddRutaArchivoDocum3
                hddNombre = hddNombreArchivoDocum3
                lbl = lblfilDocumento3
                img = imgfilDocumento3
                divVer = DivbtnVerDocum3
                divDescargar = DivbtnDescargarDocum3
            Case 4
                hddRuta = hddRutaArchivoDocum4
                hddNombre = hddNombreArchivoDocum4
                lbl = lblfilDocumento4
                img = imgfilDocumento4
                divVer = DivbtnVerDocum4
                divDescargar = DivbtnDescargarDocum4
            Case 5
                hddRuta = hddRutaArchivoDocum5
                hddNombre = hddNombreArchivoDocum5
                lbl = lblfilDocumento5
                img = imgfilDocumento5
                divVer = DivbtnVerDocum5
                divDescargar = DivbtnDescargarDocum5
            Case 6
                hddRuta = hddRutaArchivoDocum6
                hddNombre = hddNombreArchivoDocum6
                lbl = lblfilDocumento6
                img = imgfilDocumento6
                divVer = DivbtnVerDocum6
                divDescargar = DivbtnDescargarDocum6
            Case 7
                hddRuta = hddRutaArchivoDocum7
                hddNombre = hddNombreArchivoDocum7
                lbl = lblfilDocumento7
                img = imgfilDocumento7
                divVer = DivbtnVerDocum7
                divDescargar = DivbtnDescargarDocum7
            Case 8
                hddRuta = hddRutaArchivoDocum8
                hddNombre = hddNombreArchivoDocum8
                lbl = lblfilDocumento8
                img = imgfilDocumento8
                divVer = DivbtnVerDocum8
                divDescargar = DivbtnDescargarDocum8
        End Select
        If hddRuta IsNot Nothing Then
            hddRuta.Value = ruta
            hddNombre.Value = nombre
            lbl.Text = nombre
            img.ImageUrl = "~/Imagenes/ball_green.gif"
            divVer.Visible = True
            divDescargar.Visible = True
        End If
    End Sub

    Private Sub CargarVerificacionesGuardadas(ByVal idTblAutoAsisTec As Integer)
        Try
            Dim ds As DataSet
            Dim coleccionParametros As New Collection
            Dim prmtId As New CmdParametro("@IdTblAutoAsisTec", idTblAutoAsisTec, SqlDbType.Int, False)
            coleccionParametros.Add(prmtId)
            ds = clsBitacora.GetSelect("SpObtenerVerificacionesAutoAsisTec", coleccionParametros, Session, 2000037, False)
            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 AndAlso ds.Tables(0).Rows.Count > 0 Then
                Dim dt As DataTable = ds.Tables(0)
                For Each row As DataRow In dt.Rows
                    Dim idDocumento As Integer = 0
                    Dim estado As String = ""
                    If Not IsDBNull(row("IdDocumento")) Then
                        idDocumento = Convert.ToInt32(row("IdDocumento"))
                    End If
                    If Not IsDBNull(row("EstadoVerificacion")) Then
                        estado = row("EstadoVerificacion").ToString().Trim()
                    End If
                    If idDocumento.ToString() = hfIdDocumento1.Value Then
                        CargarListaVerificar(rcbVerifica1, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento2.Value Then
                        CargarListaVerificar(rcbVerifica2, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento3.Value Then
                        CargarListaVerificar(rcbVerifica3, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento4.Value Then
                        CargarListaVerificar(rcbVerifica4, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento5.Value Then
                        CargarListaVerificar(rcbVerifica5, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento6.Value Then
                        CargarListaVerificar(rcbVerifica6, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento7.Value Then
                        CargarListaVerificar(rcbVerifica7, estado)

                    ElseIf idDocumento.ToString() = hfIdDocumento8.Value Then
                        CargarListaVerificar(rcbVerifica8, estado)
                    End If
                Next
            Else
                CargarListaVerificar(rcbVerifica1)
                CargarListaVerificar(rcbVerifica2)
                CargarListaVerificar(rcbVerifica3)
                CargarListaVerificar(rcbVerifica4)
                CargarListaVerificar(rcbVerifica5)
                CargarListaVerificar(rcbVerifica6)
                CargarListaVerificar(rcbVerifica7)
                CargarListaVerificar(rcbVerifica8)
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("Error al cargar verificaciones: " & ex.Message)
        End Try
    End Sub

#End Region
#Region "Carga de Listas Desplegables (Combos)"

    Private Sub CargarLocalidades()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblLocalidades", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbLocalidad.DataValueField = "idTblLocalidades"
        Me.rcbLocalidad.DataTextField = "nombreLocalidad"
        Me.rcbLocalidad.DataSource = dt
        Me.rcbLocalidad.DataBind()
        Me.rcbLocalidad.Items.Insert(0, "Seleccione...")
    End Sub

    Private Sub CargarUPZ()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblUpz", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbUPZ.DataValueField = "IdTblUpz"
        Me.rcbUPZ.DataTextField = "NombreUPZ"
        Me.rcbUPZ.DataSource = dt
        Me.rcbUPZ.DataBind()
        Me.rcbUPZ.Items.Insert(0, "Seleccione...")
    End Sub

    Private Sub CargarBarrio()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblBarrio", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbBarrio.DataValueField = "IdTblBarrios"
        Me.rcbBarrio.DataTextField = "NombreBarrio"
        Me.rcbBarrio.DataSource = dt
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
    End Sub

    Sub BindUpz()
        Dim listaUpz As New Data.DataTable
        If Me.rcbLocalidad.SelectedValue <> "" Then
            listaUpz = getUPZ(Me.rcbLocalidad.SelectedValue)
            Me.rcbUPZ.DataValueField = "IdTblUpz"
            Me.rcbUPZ.DataTextField = "NombreUPZ"
            Me.rcbUPZ.DataSource = numerarOpciones(listaUpz)
            Me.rcbUPZ.DataBind()
            Me.rcbUPZ.Items.Insert(0, "Seleccione...")
        End If
    End Sub

    Private Sub ConfigurarAreaRural(esRural As Boolean)

        txtDireccionInicio.Enabled = esRural
        rcbLocalidad.Enabled = esRural
        rcbUPZ.Enabled = esRural
        rcbBarrio.Enabled = esRural

        aIngresarDireccionInicio.Style("display") = If(esRural, "none", "inline")

    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar roles.
    ''' </summary>
    Private Sub CargarListaTipDoc(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 2000005, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)

            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim lopciones As DataTable = numerarOpciones(listadoOpciones)
                rcb.ClearSelection()
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' Manejo de error silencioso o log
        End Try
    End Sub

    Private Sub CargarPais()
        Dim dt As DataTable = CargarPaises()

        'Combo País de Nacimiento
        rcbPaisNac.DataSource = dt
        rcbPaisNac.DataTextField = "NombrePais"
        rcbPaisNac.DataValueField = "IdTblPaises"
        rcbPaisNac.DataBind()

        'Combo País de Expedición
        rcbPaisExp.DataSource = dt
        rcbPaisExp.DataTextField = "NombrePais"
        rcbPaisExp.DataValueField = "IdTblPaises"
        rcbPaisExp.DataBind()
    End Sub

    Private Function CargarPaises() As DataTable
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("app.spGetPaises", coleccionParametros, Session, 35, False).Tables(0)
        Return dt
    End Function

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar si/no.
    ''' </summary>
    Private Sub CargarProfUniversidad(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5000119, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)

            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim lopciones As DataTable = numerarOpciones(listadoOpciones)
                rcb.ClearSelection()
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' Manejo de error silencioso o log
        End Try
    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar nivel de formacion.
    ''' </summary>
    Private Sub CargarListaNivFor(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)
            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim ids As Integer() = {4017, 4018, 4019}
                Dim filasFiltradas = listadoOpciones.AsEnumerable().Where(Function(row) ids.Contains(Convert.ToInt32(row("idTblOpciones"))))
                Dim lopciones As DataTable
                If filasFiltradas.Any() Then
                    lopciones = filasFiltradas.CopyToDataTable()
                Else
                    lopciones = listadoOpciones.Clone() ' tabla vacía con estructura
                End If
                Dim ordenadas = lopciones.AsEnumerable().OrderBy(Function(r) Array.IndexOf(ids, Convert.ToInt32(r("idTblOpciones"))))
                If ordenadas.Any() Then
                    lopciones = ordenadas.CopyToDataTable()
                End If
                rcb.ClearSelection()
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' Aquí puedes loguear el error si lo necesitas
        End Try
    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar si/no.
    ''' </summary>
    Private Sub CargarListaGrado(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5000119, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)

            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim lopciones As DataTable = numerarOpciones(listadoOpciones)
                rcb.ClearSelection()
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' Manejo de error silencioso o log
        End Try
    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar roles.
    ''' </summary>
    Private Sub CargarListaTitulo(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5000119, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)

            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim lopciones As DataTable = numerarOpciones(listadoOpciones)
                rcb.ClearSelection()
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' Manejo de error silencioso o log
        End Try
    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar roles.
    ''' </summary>
    Private Sub CargarListaVerificar(ByRef rcb As RadComboBox, Optional ByVal valorSeleccionado As String = "")
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5000148, SqlDbType.Int, False)
            Dim prmtTraerTextoOpcion As New CmdParametro("@TraerTextoOpcion", True, SqlDbType.Bit, False)
            Dim coleccionParametros As New Collection
            coleccionParametros.Add(prmtIdTblListas)
            coleccionParametros.Add(prmtTraerTextoOpcion)
            ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesNew2026", coleccionParametros, Session, 2000037, False)
            If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
                Dim listadoOpciones As DataTable = ds.Tables(0)
                Dim lopciones As DataTable = numerarOpciones(listadoOpciones)
                rcb.Items.Clear()
                rcb.DataSource = lopciones
                rcb.DataValueField = "idTblOpciones"
                rcb.DataTextField = "NombreOpcion"
                rcb.DataBind()
                If Not String.IsNullOrEmpty(valorSeleccionado) Then
                    If Not String.IsNullOrEmpty(valorSeleccionado) Then
                        Dim valor As String = CInt(valorSeleccionado).ToString()

                        If rcb.Items.FindItemByValue(valor) IsNot Nothing Then
                            rcb.SelectedValue = valor
                        End If
                    End If
                End If
            Else
                rcb.Items.Clear()
                rcb.Text = "No se encontraron opciones disponibles"
            End If
        Catch ex As Exception
            ' log opcional
        End Try
    End Sub

    ''' <summary>
    ''' Arma el mensaje del email
    ''' </summary>
    ''' <param name="nroInscrip">Número de inscripción</param>
    ''' <returns>Cuerpo del mensaje a enviar</returns>
    ''' <remarks></remarks>
    Private Function ArmarMensajeMailAutAsisTec(ByVal nroInscrip As String, ByVal NombEstab As String, ByVal Direccion As String, ByVal idMensaje As Integer) As String
        Dim fechaTexto As String = FormatDateTime(DateTime.Now, vbLongDate)
        fechaTexto = Mid(fechaTexto, InStr(fechaTexto, ",") + 2, Len(fechaTexto))
        Dim strMensaje As String = oRutinas.ObtenerTextoEnvioEmail(idMensaje)
        Dim cuerpoMensaje As String = Server.HtmlDecode(String.Format(strMensaje, nroInscrip, NombEstab, Direccion))
        Return cuerpoMensaje

    End Function

#End Region
#Region "Eventos de Controles UI"

    Protected Sub chkAreaRuralInicio_CheckedChanged(sender As Object, e As EventArgs) Handles chkAreaRuralInicio.CheckedChanged
        ConfigurarAreaRural(chkAreaRuralInicio.Checked)

        If chkAreaRuralInicio.Checked Then
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
        End If
    End Sub

    Protected Sub rcbLocalidad_SelectedIndexChanged(sender As Object, e As EventArgs)
        BindUpz()
        Me.rcbBarrio.DataSource = CargarBarriosLocalidad(Me.rcbLocalidad.SelectedValue)
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
    End Sub

    Protected Sub txtDireccion_TextChanged(sender As Object, e As EventArgs)
        If Me.txtDireccionInicio.Text.Trim.Length = 0 Then Exit Sub
        Dim oDir As New clsDireccion(Me.txtDireccionInicio.Text.Trim)
        If oDir.CodError <> 0 Then
            RadAjaxManager1.Alert(oDir.MsgError)
            Exit Sub
        End If
        CargarLocalidades()
        If Me.rcbLocalidad.Items.FindItemByValue(oDir.IdLocalidad) IsNot Nothing Then
            Me.rcbLocalidad.SelectedValue = oDir.IdLocalidad
        End If
        BindUpz()
        If Me.rcbUpz.Items.FindItemByValue(oDir.IdUpz) IsNot Nothing Then
            Me.rcbUpz.SelectedValue = oDir.IdUpz
        End If
        Me.rcbBarrio.DataSource = CargarBarriosLocalidad(oDir.IdLocalidad)
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
        If Me.rcbBarrio.Items.FindItemByValue(oDir.IdBarrio) IsNot Nothing Then
            Me.rcbBarrio.SelectedValue = oDir.IdBarrio
        End If
        RadAjaxManager1.ResponseScripts.Add("habilitarCombos();")
    End Sub

    Private Sub CargarTipDoc()
        CargarListaTipDoc(rcbTipIdent)
    End Sub

    Private Sub CargarProfUniv()
        CargarProfUniversidad(rcbProfUniv)
    End Sub

    Private Sub CargarNivelFor()
        CargarListaNivFor(rcbNivelForm)
    End Sub

    Private Sub CargarEsGrado()
        CargarListaGrado(rcbGraduado)
    End Sub

    Private Sub CargarTituloExt()
        CargarListaTitulo(rcbTituloExtran)
    End Sub

    Private Sub CargarVerificacion1()
        CargarListaVerificar(rcbVerifica1)
    End Sub

    Private Sub CargarVerificacion2()
        CargarListaVerificar(rcbVerifica2)
    End Sub

    Private Sub CargarVerificacion3()
        CargarListaVerificar(rcbVerifica3)
    End Sub

    Private Sub CargarVerificacion4()
        CargarListaVerificar(rcbVerifica4)
    End Sub

    Private Sub CargarVerificacion5()
        CargarListaVerificar(rcbVerifica5)
    End Sub

    Private Sub CargarVerificacion6()
        CargarListaVerificar(rcbVerifica6)
    End Sub

    Private Sub CargarVerificacion7()
        CargarListaVerificar(rcbVerifica7)
    End Sub

    Private Sub CargarVerificacion8()
        CargarListaVerificar(rcbVerifica8)
    End Sub

    Protected Sub btnCargarDocum1_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento1, lblfilDocumento1, imgfilDocumento1, hddRutaArchivoDocum1, hddNombreArchivoDocum1, "HOJA_VIDA")
    End Sub

    Protected Sub btnVerDocum1_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum1, hddNombreArchivoDocum1)
    End Sub

    Protected Sub btnDescargaDocum1_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum1, hddNombreArchivoDocum1)
    End Sub

    Protected Sub btnCargarDocum2_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento2, lblfilDocumento2, imgfilDocumento2, hddRutaArchivoDocum2, hddNombreArchivoDocum2, "DOCUMENTO_IDENTIDAD")
    End Sub

    Protected Sub btnVerDocum2_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum2, hddNombreArchivoDocum2)
    End Sub

    Protected Sub btnDescargaDocum2_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum2, hddNombreArchivoDocum2)
    End Sub

    Protected Sub btnCargarDocum3_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento3, lblfilDocumento3, imgfilDocumento3, hddRutaArchivoDocum3, hddNombreArchivoDocum3, "TITULO_PROFESIONAL")
    End Sub

    Protected Sub btnVerDocum3_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum3, hddNombreArchivoDocum3)
    End Sub

    Protected Sub btnDescargaDocum3_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum3, hddNombreArchivoDocum3)
    End Sub

    Protected Sub btnCargarDocum4_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento4, lblfilDocumento4, imgfilDocumento4, hddRutaArchivoDocum4, hddNombreArchivoDocum4, "MATRICULA_PROFESIONAL")
    End Sub

    Protected Sub btnVerDocum4_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum4, hddNombreArchivoDocum4)
    End Sub

    Protected Sub btnDescargaDocum4_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum4, hddNombreArchivoDocum4)
    End Sub

    Protected Sub btnCargarDocum5_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento5, lblfilDocumento5, imgfilDocumento5, hddRutaArchivoDocum5, hddNombreArchivoDocum5, "CERTIFICACION_CAPACITACION")
    End Sub

    Protected Sub btnVerDocum5_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum5, hddNombreArchivoDocum5)
    End Sub

    Protected Sub btnDescargaDocum5_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum5, hddNombreArchivoDocum5)
    End Sub

    Protected Sub btnCargarDocum6_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento6, lblfilDocumento6, imgfilDocumento6, hddRutaArchivoDocum6, hddNombreArchivoDocum6, "CONSTANCIAS_LABORALES_PLAGAS_URBANAS")
    End Sub

    Protected Sub btnVerDocum6_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum6, hddNombreArchivoDocum6)
    End Sub

    Protected Sub btnDescargaDocum6_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum6, hddNombreArchivoDocum6)
    End Sub

    Protected Sub btnCargarDocum7_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento7, lblfilDocumento7, imgfilDocumento7, hddRutaArchivoDocum7, hddNombreArchivoDocum7, "CONSTANCIAS_LABORALES_EXPERIENCIA")
    End Sub

    Protected Sub btnVerDocum7_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum7, hddNombreArchivoDocum7)
    End Sub

    Protected Sub btnDescargaDocum7_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum7, hddNombreArchivoDocum7)
    End Sub

    Protected Sub btnCargarDocum8_ServerClick(sender As Object, e As EventArgs)
        CargarDocumento(filDocumento8, lblfilDocumento8, imgfilDocumento8, hddRutaArchivoDocum8, hddNombreArchivoDocum8, "CERTIFICACION_CAPACITACION_ADICIONAL")
    End Sub

    Protected Sub btnVerDocum8_ServerClick(sender As Object, e As EventArgs)
        VerDocumento(hddRutaArchivoDocum8, hddNombreArchivoDocum8)
    End Sub

    Protected Sub btnDescargaDocum8_ServerClick(sender As Object, e As EventArgs)
        DescargarDocumento(hddRutaArchivoDocum8, hddNombreArchivoDocum8)
    End Sub

#End Region
#Region "Lógica del Grid (RadGrid)"
#End Region
#Region "Cálculos y Resúmenes Estadísticos"
#End Region
#Region "Funciones Auxiliares y Seguridad"

    Private Sub SeleccionarSiNo(rcb As RadComboBox, valor As Object)
        If valor IsNot DBNull.Value Then
            Dim valInt As Integer = Convert.ToInt32(valor)

            For Each item As RadComboBoxItem In rcb.Items
                If valInt = 2005881 AndAlso item.Text.ToUpper().Contains("SI") Then
                    item.Selected = True
                    Exit For
                ElseIf valInt = 2005882 AndAlso item.Text.ToUpper().Contains("NO") Then
                    item.Selected = True
                    Exit For
                End If
            Next
        End If
    End Sub

    ''' <summary>
    ''' Bloquea recursivamente todos los controles de entrada del formulario.
    ''' </summary>
    Private Sub BloquearControles(ByVal contenedor As Control)
        For Each ctrl As Control In contenedor.Controls
            ' 1. CheckBox estándar
            If TypeOf ctrl Is CheckBox Then
                DirectCast(ctrl, CheckBox).Enabled = False
            End If

            ' 2. TextBox estándar
            If TypeOf ctrl Is TextBox Then
                DirectCast(ctrl, TextBox).ReadOnly = True
            End If

            ' 3. Controles Telerik (por reflexión para cubrir varios tipos)
            If ctrl.ID IsNot Nothing Then
                If ctrl.ID.StartsWith("rcb") Or ctrl.ID.StartsWith("txt") Or ctrl.ID.StartsWith("date") Or ctrl.ID.StartsWith("chk") Then
                    Try
                        If ctrl.GetType().GetProperty("ReadOnly") IsNot Nothing Then
                            ctrl.GetType().GetProperty("ReadOnly").SetValue(ctrl, True, Nothing)
                        End If
                        If ctrl.GetType().GetProperty("Enabled") IsNot Nothing Then
                            ctrl.GetType().GetProperty("Enabled").SetValue(ctrl, False, Nothing)
                        End If
                    Catch
                    End Try
                End If
            End If

            ' 4. Recursividad para contenedores hijos
            If ctrl.HasControls() Then
                BloquearControles(ctrl)
            End If
        Next

        ' Ocultar botones de acción específicos
        aIngresarDireccionInicio.Visible = False
    End Sub

    Private Sub DesbloquearControlesVerificacion()
        Me.rcbVerifica1.Enabled = True
        Me.rcbVerifica2.Enabled = True
        Me.rcbVerifica3.Enabled = True
        Me.rcbVerifica4.Enabled = True
        Me.rcbVerifica5.Enabled = True
        Me.rcbVerifica6.Enabled = True
        Me.rcbVerifica7.Enabled = True
        Me.rcbVerifica8.Enabled = True
    End Sub

    ''' <summary>
    ''' Agrega un índice numérico al principio del texto de las opciones.
    ''' </summary>
    Protected Function numerarOpciones(ByVal tablaANumerar As Data.DataTable) As Data.DataTable
        Dim i As Integer = 0
        For Each fila As Data.DataRow In tablaANumerar.Rows
            i += 1
            fila.Item(1) = i & "-" & fila.Item(1).Trim
        Next
        Return tablaANumerar
    End Function

    ''' <summary>
    ''' Obtener lista de UPZ's por Localidad dada.
    ''' </summary>
    Function getUPZ(ByVal pIdLocalidad As Integer) As DataTable
        Dim dt As New DataTable
        Dim prmtIdEstab As New CmdParametro("@idLocalidad", pIdLocalidad, Data.SqlDbType.Int, False)
        Dim coleccionParametros As New Collection
        coleccionParametros.Add(prmtIdEstab)
        dt = clsBitacora.GetSelect("SpIVCSeleccionarUpzPorLocalidad", coleccionParametros, Session, 96, False).Tables(0)
        Return dt
    End Function

    ''' <summary>
    ''' Obtener lista de Barrios por Localidad.
    ''' </summary>
    Function CargarBarriosLocalidad(pIdLocalidad As Integer) As DataTable
        Dim dt As New DataTable
        Dim prmtIdEstab As New CmdParametro("@IdTblLocalidad", pIdLocalidad, Data.SqlDbType.Int, False)
        Dim coleccionParametros As New Collection
        coleccionParametros.Add(prmtIdEstab)
        dt = clsBitacora.GetSelect("spGetBarriosLocalidades", coleccionParametros, Session, 96, False).Tables(0)
        Dim Dr As DataRow = dt.NewRow
        Dr("idTblBarrios") = "9998"
        Dr("NombreBarrio") = "Otro barrio no estandar"
        dt.Rows.Add(Dr)
        Return dt
    End Function

    Private Sub InicializarDireccionInicio()
        ' Bloquear controles al iniciar
        txtDireccionInicio.Enabled = False
        rcbLocalidad.Enabled = False
        rcbUPZ.Enabled = False
        rcbBarrio.Enabled = False

        aIngresarDireccionInicio.Style("visibility") = "visible"
        chkAreaRuralInicio.Checked = False
    End Sub

    Private Sub CargarDocumento(fileUpload As FileUpload, lbl As Label, img As Image, hddRuta As HiddenField, hddNombre As HiddenField, nombreDoc As String)
        Try
            If Not fileUpload.HasFile Then
                RadAjaxManager1.Alert("Debe seleccionar un archivo")
                Exit Sub
            End If
            Dim path As String = Server.MapPath("~/Documentos/AsistenteTecnico/")
            Dim extension As String = System.IO.Path.GetExtension(fileUpload.FileName).ToLower()
            Dim allowedExtensions As String() = {".pdf", ".jpg", ".jpeg", ".gif"}
            If Not allowedExtensions.Contains(extension) Then
                RadAjaxManager1.Alert("El tipo de archivo no es aceptado.")
                Exit Sub
            End If
            Dim drPrm As DataRow = oRutinas.getParametro(75, Session)
            Dim maxKb As Integer = drPrm("ValorEntero")
            Dim fileSizeKb As Integer = fileUpload.PostedFile.ContentLength / 25000
            If fileSizeKb > maxKb Then
                RadAjaxManager1.Alert("El tamaño del archivo excede el permitido!")
                Exit Sub
            End If
            Dim nombreArchivo As String = txtNumInsc.Text & "_" & nombreDoc & "_" & DateTime.Now.ToString("dd_MM_yyyy_HHmmss") & extension
            Dim rutaArchivo As String = System.IO.Path.Combine(path, nombreArchivo)
            fileUpload.SaveAs(rutaArchivo)
            lbl.Text = nombreArchivo
            img.ImageUrl = "~/Imagenes/ball_green.gif"
            Dim rutaRelativa As String = "~/Documentos/AsistenteTecnico/" & nombreArchivo
            hddRuta.Value = rutaRelativa
            hddNombre.Value = nombreArchivo
            RadAjaxManager1.Alert("Archivo cargado correctamente")
        Catch ex As Exception
            RadAjaxManager1.Alert("El archivo no pudo ser cargado.")
            img.ImageUrl = "~/Imagenes/Clear.gif"
        End Try
    End Sub

    Private Sub VerDocumento(hddRuta As HiddenField, hddNombre As HiddenField)
        If String.IsNullOrEmpty(hddNombre.Value) Then
            Me.RadAjaxManager1.Alert("No hay archivo para visualizar")
            Exit Sub
        End If
        Dim rutaVirtual As String = hddRuta.Value
        Dim filePath As String = Server.MapPath(rutaVirtual)
        If Not File.Exists(filePath) Then
            Me.RadAjaxManager1.Alert("No se encontró el archivo seleccionado")
            Exit Sub
        End If
        Try
            Dim sFileExt As String = Path.GetExtension(hddNombre.Value).TrimStart(".")
            Response.Clear()
            Response.ContentType = tipoarchivo(sFileExt)
            Response.AddHeader("Content-Disposition", "inline; filename=" & hddNombre.Value)
            Response.TransmitFile(filePath)
            Response.Flush()
            Response.End()
        Catch ex As Exception
            Me.RadAjaxManager1.Alert("Error al visualizar: " & ex.Message)
        End Try
    End Sub

    Private Sub DescargarDocumento(ruta As HiddenField, nombre As HiddenField)
        If String.IsNullOrEmpty(ruta.Value) Then
            RadAjaxManager1.Alert("No hay archivo para descargar")
            Exit Sub
        End If
        Dim filePath As String = Server.MapPath(ruta.Value)
        If Not File.Exists(filePath) Then
            RadAjaxManager1.Alert("No se encontró el archivo")
            Exit Sub
        End If
        Response.Clear()
        Response.ContentType = "application/octet-stream"
        Response.AddHeader("Content-Disposition", "attachment; filename=" & nombre.Value)
        Response.TransmitFile(filePath)
        Response.Flush()
        Response.End()
    End Sub

    ''' <summary>
    ''' tipoarchivo
    ''' </summary>
    ''' <param name="exte">extensión como string</param>
    ''' <returns>tipo de archivo como string</returns>
    ''' <remarks>Función para seleccionar el tipo de archivo que se esta descargando</remarks>
    Function tipoarchivo(ByVal exte As String) As String
        Dim cadena As String
        cadena = "application/oda"
        Select Case exte
            Case "ez"
                cadena = "application/andrew-inset"
                Exit Select
            Case "hqx"
                cadena = "application/mac-binhex40"
                Exit Select
            Case "cpt"
                cadena = "application/mac-compactpro"
                Exit Select
            Case "mathml"
                cadena = "application/mathml+xml"
                Exit Select
            Case "doc"
                cadena = "application/msword"
                Exit Select
            Case "octet"
                cadena = "application/octet-stream exit select"
            Case "lha"
                cadena = "application/octet-stream exit select"
            Case "lzh"
                cadena = "application/octet-stream exit select"
            Case "exe"
                cadena = "application/octet-stream exit select"
            Case "class"
                cadena = "application/octet-stream exit select"
            Case "s"
                cadena = "application/octet-stream exit select"
            Case "dll"
                cadena = "application/octet-stream exit select"
                Exit Select
            Case "bin"
                cadena = "application/oda"
            Case "dms"
                cadena = "application/oda"
            Case "oda"
                cadena = "application/oda"
                Exit Select
            Case "ogg"
                cadena = "application/ogg"
                Exit Select
            Case "pdf"
                cadena = "application/pdf"
                Exit Select
            Case "xpdf"
                cadena = "application/pdf"
                Exit Select
            Case "ai"
                cadena = "application/postscript"
            Case "eps"
                cadena = "application/postscript"
            Case "ps"
                cadena = "application/postscript"
                Exit Select
            Case "rdf"
                cadena = "application/rdf+xml"
                Exit Select
            Case "smi"
                cadena = "application/smil"
            Case "smil"
                cadena = "application/smil"
                Exit Select
            Case "gram"
                cadena = "application/srgs"
                Exit Select
            Case "grxml"
                cadena = "application/srgs+xml"
                Exit Select
            Case "mif"
                cadena = "application/vnd.mif"
                Exit Select
            Case "xul"
                cadena = "application/vnd.mozilla.xul+xml"
                Exit Select
            Case "xls"
                cadena = "application/vnd.ms-excel"
                Exit Select
            Case "ppt"
                cadena = "application/vnd.ms-powerpoint"
            Case "pps"
                cadena = "application/vnd.ms-powerpoint"
                Exit Select
            Case "wbxml"
                cadena = "application/vnd.wap.wbxml"
                Exit Select
            Case ".wmlc"
                cadena = "application/vnd.wap.wmlc"
            Case "wmlc"
                cadena = "application/vnd.wap.wmlc"
                Exit Select
            Case ".wmlsc"
                cadena = "application/vnd.wap.wmlscriptc"
            Case "wmlsc"
                cadena = "application/vnd.wap.wmlscriptc"
                Exit Select
            Case "vxml"
                cadena = "application/voicexml+xml"
                Exit Select
            Case "bcpio"
                cadena = "application/x-bcpio"
                Exit Select
            Case "vcd"
                cadena = "application/x-cdlink"
                Exit Select
            Case "pgn"
                cadena = "application/x-chess-pgn"
                Exit Select
            Case "cpio"
                cadena = "application/x-cpio"
                Exit Select
            Case "csh"
                cadena = "application/x-csh"
                Exit Select
            Case "dcr"
                cadena = "application/x-director"
            Case "dir"
                cadena = "application/x-director"
                Exit Select
            Case "dxr"
                cadena = "application/x-director"
                Exit Select
            Case "dvi"
                cadena = "application/x-dvi"
                Exit Select
            Case "spl"
                cadena = "application/x-futuresplash"
                Exit Select
            Case "gtar"
                cadena = "application/x-gtar"
                Exit Select
            Case "hdf"
                cadena = "application/x-hdf"
                Exit Select
            Case ".php"
                cadena = "application/x-httpd-php"
            Case ".php4"
                cadena = "application/x-httpd-php"
            Case ".php3"
                cadena = "application/x-httpd-php"
            Case ".phtml"
                cadena = "application/x-httpd-php"
                Exit Select
            Case ".phps"
                cadena = "application/x-httpd-php-source"
                Exit Select
            Case "js"
                cadena = "application/x-javascript"
                Exit Select
            Case "skp"
                cadena = "application/x-koan"
            Case "skd"
                cadena = "application/x-koan"
            Case "skt"
                cadena = "application/x-koan"
            Case "skm"
                cadena = "application/x-koan"
                Exit Select
            Case "latex"
                cadena = "application/x-latex"
                Exit Select
            Case "nc"
                cadena = "application/x-netcdf"
            Case "cdf"
                cadena = "application/x-netcdf"
                Exit Select
            Case ".crl"
                cadena = "application/x-pkcs7-crl"
                Exit Select
            Case "sh"
                cadena = "application/x-sh"
                Exit Select
            Case "shar"
                cadena = "application/x-shar"
                Exit Select
            Case "swf"
                cadena = "application/x-shockwave-flash"
                Exit Select
            Case "sit"
                cadena = "application/x-stuffit"
                Exit Select
            Case "sv4cpio"
                cadena = "application/x-sv4cpio"
                Exit Select
            Case "sv4crc"
                cadena = "application/x-sv4crc"
                Exit Select
            Case ".tgz"
                cadena = "application/x-tar"
            Case "tar"
                cadena = "application/x-tar"
                Exit Select
            Case "tcl"
                cadena = "application/x-tcl"
                Exit Select
            Case "tex"
                cadena = "application/x-tex"
                Exit Select
            Case "texinfo"
                cadena = "application/x-texinfo"
            Case "texi"
                cadena = "application/x-texinfo"
                Exit Select
            Case "t"
                cadena = "application/x-troff"
            Case "tr"
                cadena = "application/x-troff"
            Case "roff"
                cadena = "application/x-troff"
                Exit Select
            Case "man"
                cadena = "application/x-troff-man"
                Exit Select
            Case "me"
                cadena = "application/x-troff-me"
                Exit Select
            Case "ms"
                cadena = "application/x-troff-ms"
                Exit Select
            Case "ustar"
                cadena = "application/x-ustar"
                Exit Select
            Case "src"
                cadena = "application/x-wais-source"
                Exit Select
            Case ".crt"
                cadena = "application/x-x509-ca-cert"
                Exit Select
            Case "xhtml"
                cadena = "application/xhtml+xml"
            Case "xht"
                cadena = "application/xhtml+xml"
                Exit Select
            Case "xml"
                cadena = "application/xml"
            Case "xsl"
                cadena = "application/xml"
                Exit Select
            Case "dtd"
                cadena = "application/xml-dtd"
                Exit Select
            Case "xslt"
                cadena = "application/xslt+xml"
                Exit Select
            Case "zip"
                cadena = "application/zip"
                Exit Select
            Case "rar"
                cadena = "application/rar"
                Exit Select
            Case "au"
                cadena = "audio/basic"
            Case "snd"
                cadena = "audio/basic"
                Exit Select
            Case "mid"
                cadena = "audio/midi"
            Case "midi"
                cadena = "audio/midi"
            Case "kar"
                cadena = "audio/midi"
                Exit Select
            Case "mpga"
                cadena = "audio/mpeg"
            Case "mp2"
                cadena = "audio/mpeg"
            Case "mp3"
                cadena = "audio/mpeg"
                Exit Select
            Case "aif"
                cadena = "audio/x-aiff"
            Case "aiff"
                cadena = "audio/x-aiff"
            Case "aifc"
                cadena = "audio/x-aiff"
                Exit Select
            Case "m3u"
                cadena = "audio/x-mpegurl"
                Exit Select
            Case "ram"
                cadena = "audio/x-pn-realaudio"
            Case "rm"
                cadena = "audio/x-pn-realaudio"
                Exit Select
            Case "rpm"
                cadena = "audio/x-pn-realaudio-plugin"
                Exit Select
            Case "ra"
                cadena = "audio/x-realaudio"
                Exit Select
            Case "wav"
                cadena = "audio/x-wav"
                Exit Select
            Case "pdb"
                cadena = "chemical/x-pdb"
                Exit Select
            Case "xyz"
                cadena = "chemical/x-xyz"
                Exit Select
            Case "bmp"
                cadena = "image/bmp"
                Exit Select
            Case "cgm"
                cadena = "image/cgm"
                Exit Select
            Case "gif"
                cadena = "image/gif"
                Exit Select
            Case "ief"
                cadena = "image/ief"
                Exit Select
            Case "jpeg"
                cadena = "image/jpeg"
                Exit Select
            Case "jpg"
                cadena = "image/jpeg"
                Exit Select
            Case "jpe"
                cadena = "image/jpeg"
                Exit Select
            Case "png"
                cadena = "image/png"
                Exit Select
            Case "svg"
                cadena = "image/svg+xml"
                Exit Select
            Case "tiff"
                cadena = "image/tiff"
                Exit Select
            Case "tif"
                cadena = "image/tiff"
                Exit Select
            Case "djvu"
                cadena = "image/vnd.djvu"
                Exit Select
            Case "djv"
                cadena = "image/vnd.djvu"
                Exit Select
            Case ".wbmp"
                cadena = "image/vnd.wap.wbmp"
                Exit Select
            Case "wbmp"
                cadena = "image/vnd.wap.wbmp"
                Exit Select
            Case "ras"
                cadena = "image/x-cmu-raster"
                Exit Select
            Case "ico"
                cadena = "image/x-icon"
                Exit Select
            Case "pnm"
                cadena = "image/x-portable-anymap"
                Exit Select
            Case "pbm"
                cadena = "image/x-portable-bitmap"
                Exit Select
            Case "pgm"
                cadena = "image/x-portable-graymap"
                Exit Select
            Case "ppm"
                cadena = "image/x-portable-pixmap"
                Exit Select
            Case "rgb"
                cadena = "image/x-rgb"
                Exit Select
            Case "xbm"
                cadena = "image/x-xbitmap"
                Exit Select
            Case "xpm"
                cadena = "image/x-xpixmap"
                Exit Select
            Case "xwd"
                cadena = "image/x-xwindowdump"
                Exit Select
            Case "igs"
                cadena = "model/iges"
                Exit Select
            Case "iges"
                cadena = "model/iges"
                Exit Select
            Case "msh"
                cadena = "model/mesh"
                Exit Select
            Case "mesh"
                cadena = "model/mesh"
                Exit Select
            Case "silo"
                cadena = "model/mesh"
                Exit Select
            Case "wrl"
                cadena = "model/vrml"
                Exit Select
            Case "vrml"
                cadena = "model/vrml"
                Exit Select
            Case "ics"
                cadena = "text/calendar"
                Exit Select
            Case "ifb"
                cadena = "text/calendar"
                Exit Select
            Case "css"
                cadena = "text/css"
                Exit Select
            Case ".shtml"
                cadena = "text/html"
                Exit Select
            Case "html"
                cadena = "text/html"
                Exit Select
            Case "htm"
                cadena = "text/html"
                Exit Select
            Case "asc"
                cadena = "text/plain"
                Exit Select
            Case "txt"
                cadena = "text/plain"
                Exit Select
            Case "rtx"
                cadena = "text/richtext"
                Exit Select
            Case "rtf"
                cadena = "text/rtf"
                Exit Select
            Case "sgml"
                cadena = "text/sgml"
                Exit Select
            Case "sgm"
                cadena = "text/sgml"
                Exit Select
            Case "tsv"
                cadena = "text/tab-separated-values"
                Exit Select
            Case ".wml"
                cadena = "text/vnd.wap.wml"
                Exit Select
            Case "wml"
                cadena = "text/vnd.wap.wml"
                Exit Select
            Case ".wmls"
                cadena = "text/vnd.wap.wmlscript"
                Exit Select
            Case "wmls"
                cadena = "text/vnd.wap.wmlscript"
                Exit Select
            Case "etx"
                cadena = "text/x-setext"
                Exit Select
            Case "mpeg"
                cadena = "video/mpeg"
                Exit Select
            Case "mpg"
                cadena = "video/mpeg"
                Exit Select
            Case "mpe"
                cadena = "video/mpeg"
                Exit Select
            Case "qt"
                cadena = "video/quicktime"
                Exit Select
            Case "mov"
                cadena = "video/quicktime"
                Exit Select
            Case "mxu"
                cadena = "video/vnd.mpegurl"
                Exit Select
            Case "avi"
                cadena = "video/x-msvideo"
                Exit Select
            Case "movie"
                cadena = "video/x-sgi-movie"
                Exit Select
            Case "ice"
                cadena = "x-conference/x-cooltalk"
                Exit Select
        End Select
        tipoarchivo = cadena
    End Function

#End Region
#Region "Validaciones"

    ' VALIDACIÓN GENERAL
    Private Function ValidarFormulario() As Boolean
        If Not ValidarTextos() Then Return False
        If Not ValidarDesplegables() Then Return False
        If Not ValidarCheck() Then Return False
        If Not ValidarDate() Then Return False
        If Not ValidarDireccion() Then Return False

        'Dim opcion As String = Request.QueryString("opcion")
        'If opcion <> "Edit" Then
        '    If Not ValidarDocumentos() Then Return False
        'End If
        'Return True
    End Function

    ' VALIDACIÓN TEXTOS
    Private Function ValidarTextos() As Boolean
        If String.IsNullOrEmpty(txtPrimerNom.Text) Then
            RadAjaxManager1.Alert("Debe ingresar el primer nombre")
            Return False
        End If

        If String.IsNullOrEmpty(txtPrimerApe.Text) Then
            RadAjaxManager1.Alert("Debe ingresar el primer apellido")
            Return False
        End If

        ' VALIDACIÓN NÚMERO DE DOCUMENTO
        If String.IsNullOrEmpty(txtNumDoc.Text.Trim()) Then
            RadAjaxManager1.Alert("Debe ingresar el número de documento")
            Return False
        End If
        If txtNumDoc.Text.Length > 20 Then
            RadAjaxManager1.Alert("El número de documento no puede superar los 20 caracteres")
            Return False
        End If
        If Not Regex.IsMatch(txtNumDoc.Text, "^[a-zA-Z0-9]+$") Then
            RadAjaxManager1.Alert("El número de documento solo puede contener caracteres alfanuméricos")
            Return False
        End If

        ' VALIDACIÓN TELÉFONO
        If String.IsNullOrEmpty(txtTelContac.Text.Trim()) Then
            RadAjaxManager1.Alert("Debe ingresar el número de teléfono o celular")
            Return False
        End If
        If txtTelContac.Text.Length <> 10 Then
            RadAjaxManager1.Alert("El número de teléfono debe contener exactamente 10 números")
            Return False
        End If
        If Not System.Text.RegularExpressions.Regex.IsMatch(txtTelContac.Text, "^[0-9]{10}$") Then
            RadAjaxManager1.Alert("El número de teléfono solo debe contener números")
            Return False
        End If

        ' VALIDACIÓN CORREO ELECTRÓNICO
        If String.IsNullOrEmpty(txtCorreoElec.Text.Trim()) Then
            RadAjaxManager1.Alert("Debe ingresar el correo electrónico")
            Return False
        End If
        If Not Regex.IsMatch(txtCorreoElec.Text, "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$") Then
            RadAjaxManager1.Alert("Debe ingresar un correo electrónico válido")
            Return False
        End If

        Return True
    End Function

    ' VALIDACIÓN DESPLEGABLES
    Private Function ValidarDesplegables() As Boolean
        If String.IsNullOrEmpty(rcbPaisNac.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar el País de nacimiento")
            Return False
        End If
        If String.IsNullOrEmpty(rcbTipIdent.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar Tipo de identificación")
            Return False
        End If
        If String.IsNullOrEmpty(rcbNivelForm.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar Nivel de Educación")
            Return False
        End If
        If String.IsNullOrEmpty(rcbGraduado.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar SI/NO es Graduado")
            Return False
        End If
        If String.IsNullOrEmpty(rcbTituloExtran.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar SI/NO es Título del Extranjero")
            Return False
        End If
        If String.IsNullOrEmpty(rcbPaisExp.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar el País de Expedición del Título")
            Return False
        End If
        Return True
    End Function

    Private Function ValidarCheck() As Boolean
        If Not chkTratDatos.Checked Then
            RadAjaxManager1.Alert("Debe autorizar el tratamiento de datos personales para continuar")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN DATE
    Private Function ValidarDate() As Boolean
        If Not txtFechaTer.SelectedDate.HasValue Then
            RadAjaxManager1.Alert("Debe ingresar la fecha de terminación de estudios")
            Return False
        End If
        If txtFechaTer.SelectedDate.HasValue Then
            If txtFechaTer.SelectedDate.Value > DateTime.Today Then
                RadAjaxManager1.Alert("La fecha no puede ser mayor a hoy")
                Return False
            End If
        End If
        Return True
    End Function

    ' VALIDACIÓN DIRECCIÓN
    Private Function ValidarDireccion() As Boolean
        If String.IsNullOrEmpty(txtDireccionInicio.Text) Then
            RadAjaxManager1.Alert("Debe existir dirección de ubicación")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN DOCUMENTOS
    Private Function ValidarDocumentos() As Boolean

        If Not filDocumento1.HasFile Then
            RadAjaxManager1.Alert("Debe cargar la Hoja de Vida con foto")
            Return False
        End If
        If filDocumento1.HasFile Then
            If Path.GetExtension(filDocumento1.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("La Hoja de Vida debe estar en formato PDF")
                Return False
            End If
            If filDocumento1.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("La Hoja de Vida no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento2.HasFile Then
            RadAjaxManager1.Alert("Debe cargar la Fotocopia del documento de identificación")
            Return False
        End If
        If filDocumento2.HasFile Then
            If Path.GetExtension(filDocumento2.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("La Fotocopia del documento de identificación debe estar en formato PDF")
                Return False
            End If
            If filDocumento2.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("La Fotocopia del documento de identificación no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento3.HasFile Then
            RadAjaxManager1.Alert("Debe cargar el Título Profesional y Acta de Grado")
            Return False
        End If
        If filDocumento3.HasFile Then
            If Path.GetExtension(filDocumento3.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("El Título Profesional y Acta de Grado debe estar en formato PDF")
                Return False
            End If
            If filDocumento3.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("El Título Profesional y Acta de Grado no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento4.HasFile Then
            RadAjaxManager1.Alert("Debe cargar la Tarjeta o matrícula profesional")
            Return False
        End If
        If filDocumento4.HasFile Then
            If Path.GetExtension(filDocumento4.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("La Tarjeta o matrícula profesional debe estar en formato PDF")
                Return False
            End If
            If filDocumento4.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("La Tarjeta o matrícula profesional no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento5.HasFile Then
            RadAjaxManager1.Alert("Debe cargar la Certificación de capacitación en plaguicidas")
            Return False
        End If
        If filDocumento5.HasFile Then
            If Path.GetExtension(filDocumento5.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("La Certificación de capacitación en plaguicidas debe estar en formato PDF")
                Return False
            End If
            If filDocumento5.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("La Certificación de capacitación en plaguicidas no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento6.HasFile Then
            RadAjaxManager1.Alert("Debe cargar las Constancias laborales en Manejo Integrado de Plagas")
            Return False
        End If
        If filDocumento6.HasFile Then
            If Path.GetExtension(filDocumento6.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("Las Constancias laborales en Manejo Integrado de Plagas debe estar en formato PDF")
                Return False
            End If
            If filDocumento6.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("Las Constancias laborales en Manejo Integrado de Plagas no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento7.HasFile Then
            RadAjaxManager1.Alert("Debe cargar las Constancias laborales en manejo de plaguicidas o vectores")
            Return False
        End If
        If filDocumento7.HasFile Then
            If Path.GetExtension(filDocumento7.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("Las Constancias laborales en manejo de plaguicidas o vectores debe estar en formato PDF")
                Return False
            End If
            If filDocumento7.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("Las Constancias laborales en manejo de plaguicidas o vectores no puede superar 25 MB")
                Return False
            End If
        End If

        If Not filDocumento8.HasFile Then
            RadAjaxManager1.Alert("Debe cargar las constancias de capacitación adicional en plaguicidas")
            Return False
        End If
        If filDocumento8.HasFile Then
            If Path.GetExtension(filDocumento8.FileName).ToLower() <> ".pdf" Then
                RadAjaxManager1.Alert("Las Constancias de capacitación adicional en plaguicidas debe estar en formato PDF")
                Return False
            End If
            If filDocumento8.PostedFile.ContentLength > 26214400 Then
                RadAjaxManager1.Alert("Las Constancias de capacitación adicional en plaguicidas no puede superar 25 MB")
                Return False
            End If
        End If

        Return True

    End Function

    ' VALIDACIÓN EXISTENCIA DE REGISTRO EN BD
    Private Function ExisteNumeroInscripcion(ByVal numInscipcion As String) As Boolean
        Dim existe As Boolean = False
        Dim ObjParametros As New Collection
        ObjParametros.Add(New CmdParametro("@NumInscripcion", numInscipcion, SqlDbType.VarChar, False, 50))
        Dim ds As DataSet = clsBitacora.GetSelect("[app].[SpIVCExisteNumeroInscripcion]", ObjParametros, Session, 0, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 AndAlso ds.Tables(0).Rows.Count > 0 Then
            If Not IsDBNull(ds.Tables(0).Rows(0)(0)) Then
                existe = CInt(ds.Tables(0).Rows(0)(0)) > 0
            End If
        End If
        Return existe
    End Function

#End Region
#Region "Persistencia de Datos (CRUD)"

    Protected Sub btnInsertar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnInsertar.Click
        'If Not ValidarFormulario() Then Exit Sub
        Dim numActa As String = txtNumInsc.Text.Trim()
        If ExisteNumeroInscripcion(numActa) Then
            RadAjaxManager1.Alert("El número de inscripción ya se encuentra registrado")
            Return
        End If
        Dim ObjRep As New ClsAsisTec
        Try
            ObjRep.NumInscripcion = Me.txtNumInsc.Text
            ObjRep.PrimerNombre = Me.txtPrimerNom.Text
            ObjRep.SegundoNombre = Me.txtSegundoNom.Text
            ObjRep.PrimerApellido = Me.txtPrimerApe.Text
            ObjRep.SegundoApellido = Me.txtSegundoApe.Text
            ObjRep.IdPaisNacimiento = Me.rcbPaisNac.SelectedValue
            ObjRep.IdTipoIdentificacion = Me.rcbTipIdent.SelectedValue
            ObjRep.NumeroDocumento = Me.txtNumDoc.Text
            ObjRep.AreaRural = Me.chkAreaRuralInicio.Checked
            ObjRep.Direccion = Me.txtDireccionInicio.Text
            ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
            ObjRep.IdUPZ = Me.rcbUPZ.SelectedValue
            ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
            ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
            ObjRep.TelefonoContacto = Me.txtTelContac.Text
            ObjRep.CorreoElectronico = Me.txtCorreoElec.Text
            ObjRep.IdProfUniversidad = Me.rcbProfUniv.SelectedValue
            ObjRep.NombrePrograma = Me.txtNombreProg.Text
            ObjRep.NombreInstitucion = Me.txtNombreIns.Text
            ObjRep.FechaTerminacionEstudios = Me.txtFechaTer.SelectedDate
            ObjRep.IdNivelFormacion = Me.rcbNivelForm.SelectedValue
            ObjRep.NombreProgramaPost = Me.txtNombreProgPost.Text
            ObjRep.Graduado = Me.rcbGraduado.SelectedValue
            ObjRep.TituloExtranjero = Me.rcbTituloExtran.SelectedValue
            ObjRep.IdPaisExpedicion = Me.rcbPaisExp.SelectedValue
            ObjRep.AutorizacionDatos = Me.chkTratDatos.Checked
            Dim listaDocs As New List(Of ClsAsisTec)
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 1, .NombreArchivo = hddNombreArchivoDocum1.Value, .RutaArchivo = hddRutaArchivoDocum1.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 2, .NombreArchivo = hddNombreArchivoDocum2.Value, .RutaArchivo = hddRutaArchivoDocum2.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 3, .NombreArchivo = hddNombreArchivoDocum3.Value, .RutaArchivo = hddRutaArchivoDocum3.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 4, .NombreArchivo = hddNombreArchivoDocum4.Value, .RutaArchivo = hddRutaArchivoDocum4.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 5, .NombreArchivo = hddNombreArchivoDocum5.Value, .RutaArchivo = hddRutaArchivoDocum5.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 6, .NombreArchivo = hddNombreArchivoDocum6.Value, .RutaArchivo = hddRutaArchivoDocum6.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 7, .NombreArchivo = hddNombreArchivoDocum7.Value, .RutaArchivo = hddRutaArchivoDocum7.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 8, .NombreArchivo = hddNombreArchivoDocum8.Value, .RutaArchivo = hddRutaArchivoDocum8.Value})
            If Request.QueryString("opcion") = "New" Then
                Dim idRegistro As Integer = ObjRep.Insertar()
                If idRegistro > 0 Then
                    ObjRep.GuardarDocumentos(idRegistro, listaDocs)
                    Dim mensajeBase As String = "Formulario ingresado correctamente. Número de Inscripción: " & Me.txtNumInsc.Text
                    If Me.chkTratDatos.Checked Then
                        Dim TextoCorreo As String = "Notificación de Inscripción en Autorización de Asistentes Técnicos"
                        Dim correoRemitente As DataRow = ClsAsisTec.ObtenerCorreoRemitente()
                        If correoRemitente IsNot Nothing Then
                            Dim msg As String = oRutinas.EnvioMailAutoAsisTec(Session, TextoCorreo, Me.txtCorreoElec.Text, correoRemitente("NombreCorreo").ToString(), correoRemitente("Contrasena").ToString(), _
                                ArmarMensajeMailAutAsisTec(Me.txtNumInsc.Text, Me.txtPrimerNom.Text, Me.txtCorreoElec.Text, 8))
                        Else
                            mensajeBase &= "No se pudo obtener el correo remitente."
                        End If
                    End If
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindInsert(" & idRegistro & ");")
                    RadAjaxManager1.Alert(mensajeBase)
                End If
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("Se presento un error al guardar." & ex.Message)
        End Try
    End Sub

    Protected Sub btnActualizar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnActualizar.Click
        'If Not ValidarFormulario() Then Exit Sub
        Try
            Dim valorRaw As String = hfIdTblAutoAsisTec.Value
            If String.IsNullOrEmpty(valorRaw) Then
                RadAjaxManager1.Alert("Error en el proceso de búsuqueda del Número de inscripción.")
                Exit Sub
            Else
                'RadAjaxManager1.Alert("DEBUG: Valor en HiddenField es: [" & valorRaw & "]")
            End If
            Dim idReal As Integer
            If Not Integer.TryParse(valorRaw.Trim(), idReal) Then
                RadAjaxManager1.Alert("ERROR DE FORMATO: No se puede convertir '" & valorRaw & "' a un número entero. " & _
                                     "Asegúrate de que el HF guarde el ID y no el Número de Inscripción.")
                Exit Sub
            End If
            Dim ObjRep As New ClsAsisTec
            ObjRep.idTblAutoAsisTec = idReal
            ObjRep.NumInscripcion = Me.txtNumInsc.Text.Trim()
            ObjRep.PrimerNombre = Me.txtPrimerNom.Text.Trim()
            ObjRep.SegundoNombre = Me.txtSegundoNom.Text
            ObjRep.PrimerApellido = Me.txtPrimerApe.Text
            ObjRep.SegundoApellido = Me.txtSegundoApe.Text
            ObjRep.IdPaisNacimiento = Me.rcbPaisNac.SelectedValue
            ObjRep.IdTipoIdentificacion = Me.rcbTipIdent.SelectedValue
            ObjRep.NumeroDocumento = Me.txtNumDoc.Text
            ObjRep.AreaRural = Me.chkAreaRuralInicio.Checked
            ObjRep.Direccion = Me.txtDireccionInicio.Text
            ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
            ObjRep.IdUPZ = Me.rcbUPZ.SelectedValue
            ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
            ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
            ObjRep.TelefonoContacto = Me.txtTelContac.Text
            ObjRep.CorreoElectronico = Me.txtCorreoElec.Text
            ObjRep.IdProfUniversidad = Me.rcbProfUniv.SelectedValue
            ObjRep.NombrePrograma = Me.txtNombreProg.Text
            ObjRep.NombreInstitucion = Me.txtNombreIns.Text
            ObjRep.FechaTerminacionEstudios = Me.txtFechaTer.SelectedDate
            ObjRep.IdNivelFormacion = Me.rcbNivelForm.SelectedValue
            ObjRep.NombreProgramaPost = Me.txtNombreProgPost.Text
            ObjRep.Graduado = Me.rcbGraduado.SelectedValue
            ObjRep.TituloExtranjero = Me.rcbTituloExtran.SelectedValue
            ObjRep.IdPaisExpedicion = Me.rcbPaisExp.SelectedValue
            ObjRep.AutorizacionDatos = Me.chkTratDatos.Checked
            Dim listaDocs As New List(Of ClsAsisTec)
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 1, .NombreArchivo = hddNombreArchivoDocum1.Value, .RutaArchivo = hddRutaArchivoDocum1.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 2, .NombreArchivo = hddNombreArchivoDocum2.Value, .RutaArchivo = hddRutaArchivoDocum2.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 3, .NombreArchivo = hddNombreArchivoDocum3.Value, .RutaArchivo = hddRutaArchivoDocum3.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 4, .NombreArchivo = hddNombreArchivoDocum4.Value, .RutaArchivo = hddRutaArchivoDocum4.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 5, .NombreArchivo = hddNombreArchivoDocum5.Value, .RutaArchivo = hddRutaArchivoDocum5.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 6, .NombreArchivo = hddNombreArchivoDocum6.Value, .RutaArchivo = hddRutaArchivoDocum6.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 7, .NombreArchivo = hddNombreArchivoDocum7.Value, .RutaArchivo = hddRutaArchivoDocum7.Value})
            listaDocs.Add(New ClsAsisTec With {.IdTipoDocumento = 8, .NombreArchivo = hddNombreArchivoDocum8.Value, .RutaArchivo = hddRutaArchivoDocum8.Value})
            Dim idParaDocumentos As Integer = idReal
            Dim idRegistro As Integer = ObjRep.Actualizar()
            If idRegistro > 0 OrElse idRegistro = -1 Then
                RadAjaxManager1.Alert("ADVERTENCIA: El proceso terminó pero NO se actualizó ningún registro. ")
            ElseIf idRegistro = 0 Then
                ObjRep.GuardarDocumentos(idParaDocumentos, listaDocs)
                Dim mensajeBase As String = "Formulario actualizado correctamente. Número de Inscripción: " & Me.txtNumInsc.Text
                If Me.chkTratDatos.Checked Then
                    Dim TextoCorreo As String = "Notificación de Inscripción en Autorización de Asistentes Técnicos"
                    Dim correoRemitente As DataRow = ClsAsisTec.ObtenerCorreoRemitente()
                    If correoRemitente IsNot Nothing Then
                        Dim msg As String = oRutinas.EnvioMailAutoAsisTec(Session, TextoCorreo, Me.txtCorreoElec.Text, correoRemitente("NombreCorreo").ToString(), correoRemitente("Contrasena").ToString(), _
                            ArmarMensajeMailAutAsisTec(Me.txtNumInsc.Text, Me.txtPrimerNom.Text, Me.txtCorreoElec.Text, 8))
                    Else
                        mensajeBase &= "No se pudo obtener el correo remitente."
                    End If
                End If
                RadAjaxManager1.ResponseScripts.Add("CloseAndRebindUpdate(" & idRegistro & ");")
                RadAjaxManager1.Alert(mensajeBase)
            Else
                RadAjaxManager1.Alert("Se produjo un error al actualizar.")
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("EXCEPCIÓN CAPTURADA: " & ex.Message.Replace("'", ""))
        End Try
    End Sub

    Protected Sub btnVerificar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnVerificar.Click
        Dim ObjRep As New ClsAsisTec
        Try
            Dim idUsuario As Integer = Convert.ToInt32(Session("IdUsuario"))
            Dim listaVerifica As New List(Of ClsAsisTec)
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento1.Value), .EstadoVerificacion = Me.rcbVerifica1.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento2.Value), .EstadoVerificacion = Me.rcbVerifica2.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento3.Value), .EstadoVerificacion = Me.rcbVerifica3.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento4.Value), .EstadoVerificacion = Me.rcbVerifica4.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento5.Value), .EstadoVerificacion = Me.rcbVerifica5.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento6.Value), .EstadoVerificacion = Me.rcbVerifica6.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento7.Value), .EstadoVerificacion = Me.rcbVerifica7.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento8.Value), .EstadoVerificacion = Me.rcbVerifica8.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            ' Acción Insertar
            If Request.QueryString("opcion") = "VerificarSDS" Then
                Dim idRegistro As Integer = Convert.ToInt32(hfIdTblAutoAsisTec.Value)
                Dim resultado As Integer = ObjRep.GuardarVerificacion(idRegistro, listaVerifica)
                If resultado > 0 Then
                    Dim mensajeBase As String = "Formulario verificado correctamente. Número de Inscripción: " & Me.txtNumInsc.Text
                    If Me.chkTratDatos.Checked Then
                        Dim TextoCorreo As String = "Notificación de Inscripción en Autorización de Asistentes Técnicos"
                        Dim correoRemitente As DataRow = ClsAsisTec.ObtenerCorreoRemitente()
                        If correoRemitente IsNot Nothing Then
                            Dim msg As String = oRutinas.EnvioMailAutoAsisTec(Session, TextoCorreo, Me.txtCorreoElec.Text, correoRemitente("NombreCorreo").ToString(), correoRemitente("Contrasena").ToString(), _
                                ArmarMensajeMailAutAsisTec(Me.txtNumInsc.Text, Me.txtPrimerNom.Text, Me.txtCorreoElec.Text, 8))
                        Else
                            mensajeBase &= "No se pudo obtener el correo remitente."
                        End If
                    End If
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindInsert(" & resultado & ");")
                    RadAjaxManager1.Alert(mensajeBase)
                Else
                    Me.RadAjaxManager1.Alert("Se produjo un error al guardar.")
                End If
            Else
                ' Lógica de actualización (Si se habilita en el futuro)
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("Se presento un error al guardar." & ex.Message)
        End Try
    End Sub

    Protected Sub btnActualizarSDS_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnActualizarSDS.Click
        Dim ObjRep As New ClsAsisTec
        Try
            Dim idUsuario As Integer = Convert.ToInt32(Session("IdUsuario"))
            Dim listaVerifica As New List(Of ClsAsisTec)
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento1.Value), .EstadoVerificacion = Me.rcbVerifica1.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento2.Value), .EstadoVerificacion = Me.rcbVerifica2.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento3.Value), .EstadoVerificacion = Me.rcbVerifica3.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento4.Value), .EstadoVerificacion = Me.rcbVerifica4.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento5.Value), .EstadoVerificacion = Me.rcbVerifica5.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento6.Value), .EstadoVerificacion = Me.rcbVerifica6.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento7.Value), .EstadoVerificacion = Me.rcbVerifica7.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            listaVerifica.Add(New ClsAsisTec With {.IdDocumento = Convert.ToInt32(hfIdDocumento8.Value), .EstadoVerificacion = Me.rcbVerifica8.SelectedValue, .FechaVerificacion = DateTime.Now, .IdUsuarioVerifica = idUsuario})
            Dim idRegistro As Integer = Convert.ToInt32(hfIdTblAutoAsisTec.Value)
            Dim resultado As Integer = ObjRep.ActualizarVerificacion(idRegistro, listaVerifica)
            If resultado > 0 Then
                Dim mensajeBase As String = "Formulario de verificación actualizado correctamente. Número de Inscripción: " & Me.txtNumInsc.Text
                If Me.chkTratDatos.Checked Then
                    Dim TextoCorreo As String = "Notificación de Inscripción en Autorización de Asistentes Técnicos"
                    Dim correoRemitente As DataRow = ClsAsisTec.ObtenerCorreoRemitente()
                    If correoRemitente IsNot Nothing Then
                        Dim msg As String = oRutinas.EnvioMailAutoAsisTec(Session, TextoCorreo, Me.txtCorreoElec.Text, correoRemitente("NombreCorreo").ToString(), correoRemitente("Contrasena").ToString(), _
                            ArmarMensajeMailAutAsisTec(Me.txtNumInsc.Text, Me.txtPrimerNom.Text, Me.txtCorreoElec.Text, 8))
                    Else
                        mensajeBase &= "No se pudo obtener el correo remitente."
                    End If

                End If
                RadAjaxManager1.ResponseScripts.Add("CloseAndRebindInsert(" & resultado & ");")
                RadAjaxManager1.Alert(mensajeBase)
            Else
                RadAjaxManager1.Alert("No se pudo actualizar la verificación")
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("Error al actualizar: " & ex.Message)
        End Try
    End Sub

#End Region

End Class
