Imports System
Imports System.Data
Imports System.IO
Imports System.Xml
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 ETOZ_frmVacunacionAntirrabica2026
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"
    Public oRutinas As New ClsRutinas
    Public oPropiedad As New RepVacunacion
    Private ds As New DataTable
#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
        ' Inicializa estructura de tabla en sesión si no existe
        If Session("dt") Is Nothing Then
            Dim objActa As New RepVacunacion()
            Session("dt") = objActa.Estructura()
        End If

        If Not IsPostBack Then
            ' Manejo de argumentos de eventos específicos
            If Request("__EVENTTARGET") = "SetEntidadBuscarEmpleado" Then
                Session("IdEntidadBuscarEmpleado") = Request("__EVENTARGUMENT")
            End If
            Me.DataBind()

            ' Carga inicial de listas desplegables
            cargarPuntoFijo()
            cargarDatosVacuna()
            CargarLocalidades()
            CargarLocalidadesFinal()
            CargarUPZ()
            CargarUPZFinal()
            CargarBarrio()
            CargarBarrioFinal()

            ' Configuración inicial de roles (ocultar campos 'Otro y Ubicacion')
            InicializarCamposRol()
            InicializarDireccionInicio()
            BloquearUbicacionFinal()
        End If
    End Sub

 Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
        ' Solo limpiar si no es postback
        If Not IsPostBack Then
            Session.Remove("PaginaAbierta")
        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
        Me.hddIdEntidad.Value = Session("IdEntidad")
        Dim sMode As String = Request.QueryString("opcion")
        Ese_Load() ' Carga nombre de la entidad/ESE
        Select Case sMode
            Case "Edit"
                ProcesarEditActa()
            Case "New"
                ProcesarNuevaActa()
            Case "View"
                ProcesarVisualizar()
        End Select

    End Sub

    ''' <summary>
    ''' Manejo de PostBacks específicos del Grid de Telerik.
    ''' </summary>
    Protected Overrides Sub RaisePostBackEvent(ByVal sourceControl As IPostBackEventHandler, ByVal eventArgument As String)
        MyBase.RaisePostBackEvent(sourceControl, eventArgument)

        If TypeOf sourceControl Is RadGrid Then
            Dim grid = CType(sourceControl, RadGrid)
            Select Case grid.ID
                Case "RGDatos"
                    Select Case eventArgument
                        Case "Rebind"
                            RGDatos.MasterTableView.SortExpressions.Clear()
                            RGDatos.MasterTableView.GroupByExpressions.Clear()
                            RGDatos.Rebind()
                        Case "RebindAndNavigate"
                            RGDatos.MasterTableView.SortExpressions.Clear()
                            RGDatos.MasterTableView.GroupByExpressions.Clear()
                            RGDatos.MasterTableView.CurrentPageIndex = RGDatos.MasterTableView.PageCount - 1
                            RGDatos.Rebind()
                    End Select
            End Select
        End If
    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()
        Session("idTblEntidades") = Session("IdEntidad")
        LimpiarFormularioNuevoRegistro()
        If Session("dt") Is Nothing Then
            Dim objActa As New RepVacunacion()
            Session("dt") = objActa.Estructura()
        End If
        Me.RGDatos.Rebind()
        Me.txtObservacion.Links.Clear()
        Me.txtESE.Enabled = False
        Ese_Load()
        Me.btnActualizar.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarEditActa()
        If Request.QueryString("IdtblRepVacAnt") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerReporteVacunacionPorId(Request.QueryString("IdtblRepVacAnt"))
            If drRep IsNot Nothing Then
                Dim objRep As New RepVacunacion
                Session("objRep") = objRep
                Ese_Load()
                Try
                    Me.txtNumActa.Enabled = False
                    CargarDatosFormulario(drRep)
                    Session("dt") = objRep.Estructura()
                    CargarDatosEnSession(Convert.ToInt32(Request.QueryString("IdtblRepVacAnt")))
                    RGDatos.DataSource = Session("dt")
                    RGDatos.Rebind()
                    Me.btnInsertar.Visible = False
                Catch ex As Exception
                    RadAjaxManager1.Alert("Se presentó un error al cargar para editar." & ex.Message)
                End Try
            Else
                ' Manejar caso de registro no encontrado si es necesario
            End If
        End If
    End Sub

    ''' <summary>
    ''' Carga los datos en modo solo lectura.
    ''' </summary>
    Private Sub ProcesarVisualizar()
        If Request.QueryString("IdtblRepVacAnt") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerReporteVacunacionPorId(Request.QueryString("IdtblRepVacAnt"))
            If drRep IsNot Nothing Then
                Dim objRep As New RepVacunacion
                Session("objRep") = objRep
                Ese_Load()
                Try
                    CargarDatosFormulario(drRep)

                    ' Bloqueo de controles para evitar edición
                    BloquearControles(Me)
                    RGDatos.Enabled = False
                    RGDatos.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.None
                    Me.txtObservacion.EditModes = Telerik.Web.UI.EditModes.Preview

                    Session("dt") = objRep.Estructura()
                    CargarDatosEnSession(Convert.ToInt32(Request.QueryString("IdtblRepVacAnt")))

                    RGDatos.DataSource = Session("dt")
                    RGDatos.Rebind()

                    Me.btnInsertar.Visible = False
                    Me.btnActualizar.Visible = False

                Catch ex As Exception
                    RadAjaxManager1.Alert("Error al cargar la visualización: " & ex.Message)
                End Try
            Else
                RadAjaxManager1.Alert("No se encontraron datos para el ID proporcionado.")
            End If
        End If
    End Sub

    Private Sub LimpiarFormularioNuevoRegistro()
        Dim objActa As New RepVacunacion()
        Session("dt") = objActa.Estructura()
        RGDatos.DataSource = Session("dt")
        RGDatos.Rebind()
    End Sub

    Private Sub ActualizarVisibilidadOtro()
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol1.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol1.Visible = mostrarOtro
        txtOtroRolCol1.Enabled = mostrarOtro
    End Sub

    Private Sub ActualizarVisibilidadOtro2()
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol2.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol2.Visible = mostrarOtro
        txtOtroRolCol2.Enabled = mostrarOtro
    End Sub

    Private Sub ActualizarVisibilidadOtro3()
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol3.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol3.Visible = mostrarOtro
        txtOtroRolCol3.Enabled = mostrarOtro
    End Sub

    Private Sub ActualizarVisibilidadOtro4()
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol4.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol4.Visible = mostrarOtro
        txtOtroRolCol4.Enabled = mostrarOtro
    End Sub

    Protected Sub Ese_Load()
        Dim coleccionParametros As New Collection
        Dim prmt_IdUsuario As New CmdParametro("@IdTblUsuarios", Session("IdUsuario"), Data.SqlDbType.Int, True)
        coleccionParametros.Add(prmt_IdUsuario)
        Dim nombreEntidad As String = clsBitacora.GetEscalar("SPIVCSeleccionarNombreInstitucionPorUsuario", coleccionParametros, Session, 1000015, False)
        txtESE.Text = nombreEntidad
    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()
        rcbLocalidad.Items.Clear()
        rcbUpz.Items.Clear()
        rcbBarrio.Items.Clear()
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

#End Region

#Region "Carga de Datos y Mapeo"

    ''' <summary>
    ''' Mapea los datos de un DataRow a los controles del formulario.
    ''' </summary>
    Private Sub CargarDatosFormulario(drRep As DataRow)
        Me.txtNumActa.Text = drRep("ActaNumero")
        Me.chkZoonosis.Checked = drRep("Zoonosis")
        Me.txtFechaVacuna.SelectedDate = CDate(drRep("FechaVacuna"))
        Me.hddIdEntidad.Value = drRep("IdEntidad")
        Me.txtESE.Text = drRep("ESE")
        Me.txtHoraInicio.SelectedTime = drRep("HoraInicio")
        Me.txtHoraFinal.SelectedTime = drRep("HoraFinal")
        Me.chkIntramural.Checked = drRep("EsIntramural")
        Me.chkPuntoFijo.Checked = drRep("EsPuntoFijo")
        Me.rcbPuntoFijo.SelectedValue = drRep("IdPuntoFijo")
        Me.chkExtramural.Checked = drRep("EsExtramural")
        Me.chkJorExtramural.Checked = drRep("EsJorExtramural")
        Me.chkBarrido.Checked = drRep("EsBarrido")
        Me.rcbMarcaVacuna.SelectedValue = drRep("IdMarcaVacuna")
        Me.txtLoteVacuna.Text = drRep("LoteVacuna")
        Me.dateFechaVence.SelectedDate = drRep("FechaVence")
        Me.chkAreaRuralInicio.Checked = drRep("AreaRuralInicio")
        Me.txtDireccionInicio.Text = drRep("DireccionInicio")
        Me.rcbLocalidad.SelectedValue = drRep("IdLocalidad")
        Me.rcbUpz.SelectedValue = drRep("IdUpz")
        Me.rcbBarrio.SelectedValue = drRep("IdBarrio")
        Me.txtBarrioDigitado.Text = drRep("BarrioDigitado")
        Me.chkAreaRuralFin.Checked = drRep("AreaRuralFin")
        Me.txtDireccionFinal.Text = drRep("DireccionFinal")
        Me.rcbLocalidadfinal.SelectedValue = drRep("IdLocalidadFinal")
        Me.rcbUpzfinal.SelectedValue = drRep("IdUpzFinal")
        Me.rcbBarriofinal.SelectedValue = drRep("IdBarrioFinal")
        Me.txtBarrioDigitadofinal.Text = drRep("BarrioDigitadoFinal")
        Me.txtObservacion.Content = drRep("Observacion").ToString()

        ' Asignación de valores a la tabla de resumen especie
        lblCaninoH.Text = drRep("CaninoH").ToString()
        lblCaninoM.Text = drRep("CaninoM").ToString()
        lblCaninoT.Text = drRep("CaninoT").ToString()

        lblFelinoH.Text = drRep("FelinoH").ToString()
        lblFelinoM.Text = drRep("FelinoM").ToString()
        lblFelinoT.Text = drRep("FelinoT").ToString()

        ' Totales generales
        lblTotalH.Text = drRep("TotalH").ToString()
        lblTotalM.Text = drRep("TotalM").ToString()
        lblTotalT.Text = drRep("TotalT").ToString()

        ' Asignación de valores a la tabla de resumen grupo etario
        lbl1MC.Text = drRep("Canino1M").ToString()
        lbl1MF.Text = drRep("Felino1M").ToString()
        lbl1MT.Text = drRep("Total1M").ToString()

        lbl1A5C.Text = drRep("Canino1A5").ToString()
        lbl1A5F.Text = drRep("Felino1A5").ToString()
        lbl1A5T.Text = drRep("Total1A5").ToString()

        lbl6A10C.Text = drRep("Canino6A10").ToString()
        lbl6A10F.Text = drRep("Felino6A10").ToString()
        lbl6A10T.Text = drRep("Total6A10").ToString()

        lbl10MC.Text = drRep("Canino10M").ToString()
        lbl10MF.Text = drRep("Felino10M").ToString()
        lbl10MT.Text = drRep("Total10M").ToString()

        ' Totales generales
        lblTotalC.Text = drRep("TotalC").ToString()
        lblTotalF.Text = drRep("TotalF").ToString()
        lblTotalGral.Text = drRep("TotalGral").ToString()

        ' Colaborador 1
        Me.hddIdFuncionario1.Value = drRep("IdFuncionario1")
        Me.txtNombreColaborador1.Text = drRep("NombreColaborador1")
        Me.txtProfesionCol1.Text = drRep("ProfesionCol1")
        Dim idsGuardados As String = drRep("IdRolCol1").ToString()
        If Not String.IsNullOrEmpty(idsGuardados) Then
            Dim listaIds As String() = idsGuardados.Split(","c)
            rcbRolCol1.ClearSelection()
            For Each id As String In listaIds
                Dim item As RadComboBoxItem = rcbRolCol1.FindItemByValue(id.Trim())
                If item IsNot Nothing Then
                    item.Checked = True
                End If
            Next
        End If
        ActualizarVisibilidadOtro()
        Me.txtOtroRolCol1.Text = drRep("OtroRolCol1")

        ' Colaborador 2
        Me.hddIdFuncionario2.Value = drRep("IdFuncionario2")
        Me.txtNombreColaborador2.Text = ValorSeguro(drRep, "NombreColaborador2")
        Me.txtProfesionCol2.Text = ValorSeguro(drRep, "ProfesionCol2")
        Dim idsGuardados1 As String = String.Empty
        If Not IsDBNull(drRep("IdRolCol2")) Then
            idsGuardados1 = drRep("IdRolCol2").ToString()
        End If
        If Not String.IsNullOrEmpty(idsGuardados1) Then
            Dim listaIds As String() = idsGuardados1.Split(","c)
            rcbRolCol2.ClearSelection()

            For Each id As String In listaIds
                Dim item As RadComboBoxItem = rcbRolCol2.FindItemByValue(id.Trim())
                If item IsNot Nothing Then
                    item.Checked = True
                End If
            Next
        End If
        ActualizarVisibilidadOtro2()
        Me.txtOtroRolCol2.Text = ValorSeguro(drRep, "OtroRolCol2")

        ' Colaborador 3
        Me.hddIdFuncionario3.Value = drRep("IdFuncionario3")
        Me.txtNombreColaborador3.Text = ValorSeguro(drRep, "NombreColaborador3")
        Me.txtProfesionCol3.Text = ValorSeguro(drRep, "ProfesionCol3")
        Dim idsGuardados3 As String = String.Empty
        If Not IsDBNull(drRep("IdRolCol3")) Then
            idsGuardados3 = drRep("IdRolCol3").ToString()
        End If
        If Not String.IsNullOrEmpty(idsGuardados3) Then
            Dim listaIds As String() = idsGuardados3.Split(","c)
            rcbRolCol3.ClearSelection()
            For Each id As String In listaIds
                Dim item As RadComboBoxItem = rcbRolCol3.FindItemByValue(id.Trim())
                If item IsNot Nothing Then
                    item.Checked = True
                End If
            Next
        End If
        ActualizarVisibilidadOtro3()
        Me.txtOtroRolCol3.Text = ValorSeguro(drRep, "OtroRolCol3")

        '' Colaborador 4
        Me.hddIdFuncionario4.Value = drRep("IdFuncionario4")
        Me.txtNombreColaborador4.Text = ValorSeguro(drRep, "NombreColaborador4")
        Me.txtProfesionCol4.Text = ValorSeguro(drRep, "ProfesionCol4")
        Dim idsGuardados4 As String = String.Empty
        If Not IsDBNull(drRep("IdRolCol4")) Then
            idsGuardados4 = drRep("IdRolCol4").ToString()
        End If
        If Not String.IsNullOrEmpty(idsGuardados4) Then
            Dim listaIds As String() = idsGuardados4.Split(","c)
            rcbRolCol4.ClearSelection()
            For Each id As String In listaIds
                Dim item As RadComboBoxItem = rcbRolCol4.FindItemByValue(id.Trim())
                If item IsNot Nothing Then
                    item.Checked = True
                End If
            Next
        End If
        ActualizarVisibilidadOtro4()
        Me.txtOtroRolCol4.Text = ValorSeguro(drRep, "OtroRolCol4")

        ' Veterinario
        Me.hddIdFuncionario5.Value = drRep("IdFuncionario5")
        Me.txtNombreMedVet.Text = drRep("NombreMedVet")
        Me.txtTarjetaMedVet.Text = drRep("TarjetaMedVet")
    End Sub

    Private Function ObtenerReporteVacunacionPorId(ByVal pIdRepJorVac As Integer) As DataRow
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@IdtblRepVacAnt", pIdRepJorVac, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer = 1204
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIVCSeleccionarRepJornadaVacunaPorId", ObjParametros, HttpContext.Current.Session, evento, False).Tables(0)
        If dt.Rows.Count > 0 Then
            Return dt.Rows(0)
        Else
            Return Nothing
        End If
    End Function

    Private Sub CargarDatosEnSession(ByVal pId As Integer)
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@Id", pId, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer = 5000138
        Dim ds As DataSet = clsBitacora.GetSelect("app.spIVCSeleccionarDatosVacunas", ObjParametros, HttpContext.Current.Session, evento, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            Dim datos As DataTable = ds.Tables(0)
            Dim dtSession As DataTable = DirectCast(Session("dt"), DataTable)
            dtSession.Merge(datos)
            Session("dt") = dtSession
        End If
    End Sub

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

#End Region

#Region "Carga de Listas Desplegables (Combos)"

    Private Sub cargarPuntoFijo()
        rcbPuntoFijo.Items.Clear()
        Dim parametros As New Collection
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpListarPuntoFijo", parametros, Session, evento, False)
        Dim dt As DataTable = ds.Tables(0)
        If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
            For Each row As DataRow In dt.Rows
                Dim item As New RadComboBoxItem()
                item.Text = row("NombrePuntoFijo").ToString()
                item.Value = row("IdTblPuntosFijosVacunacion").ToString()
                rcbPuntoFijo.Items.Add(item)
            Next
        End If
        ' Eliminar item especifico si existe
        Dim itemEliminar As RadComboBoxItem = rcbPuntoFijo.FindItemByValue("9999")
        If itemEliminar IsNot Nothing Then itemEliminar.Remove()
    End Sub

    Private Sub cargarDatosVacuna()
        rcbMarcaVacuna.Items.Clear()
        Dim parametros As New Collection
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpListarMarcaBiologico", parametros, Session, evento, False)
        Dim dt As DataTable = ds.Tables(0)
        If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
            For Each row As DataRow In dt.Rows
                Dim item As New RadComboBoxItem()
                item.Text = row("MarcaBiologico").ToString()
                item.Value = row("IdBiologicoVacuna").ToString()
                rcbMarcaVacuna.Items.Add(item)
            Next
        End If
        Dim itemEliminar As RadComboBoxItem = rcbMarcaVacuna.FindItemByValue("9999")
        If itemEliminar IsNot Nothing Then itemEliminar.Remove()
    End Sub

    Sub BindVacuna()
        If Me.rcbMarcaVacuna.SelectedValue <> "" Then
            Dim idBiologico As Integer = CInt(Me.rcbMarcaVacuna.SelectedValue)
            CargarLoteYFecha(idBiologico)
        Else
            txtLoteVacuna.Text = ""
            dateFechaVence.Clear()
        End If
    End Sub

    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 CargarLocalidadesFinal()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblLocalidades", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbLocalidadfinal.DataValueField = "idTblLocalidades"
        Me.rcbLocalidadfinal.DataTextField = "nombreLocalidad"
        Me.rcbLocalidadfinal.DataSource = dt
        Me.rcbLocalidadfinal.DataBind()
        Me.rcbLocalidadfinal.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 CargarUPZFinal()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblUpz", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbUpzfinal.DataValueField = "IdTblUpz"
        Me.rcbUpzfinal.DataTextField = "NombreUPZ"
        Me.rcbUpzfinal.DataSource = dt
        Me.rcbUpzfinal.DataBind()
        Me.rcbUpzfinal.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

    Private Sub CargarBarrioFinal()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblBarrio", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbBarriofinal.DataValueField = "IdTblBarrios"
        Me.rcbBarriofinal.DataTextField = "NombreBarrio"
        Me.rcbBarriofinal.DataSource = dt
        Me.rcbBarriofinal.DataBind()
        Me.rcbBarriofinal.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

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

    ''' <summary>
    ''' Inicializa los controles de Roles para colaboradores (ocultando 'Otro').
    ''' </summary>
    Private Sub InicializarCamposRol()
        txtOtroRolCol1.Enabled = False : txtOtroRolCol1.Visible = False : CargarRolCol1()
        txtOtroRolCol2.Enabled = False : txtOtroRolCol2.Visible = False : CargarRolCol2()
        txtOtroRolCol3.Enabled = False : txtOtroRolCol3.Visible = False : CargarRolCol3()
        txtOtroRolCol4.Enabled = False : txtOtroRolCol4.Visible = False : CargarRolCol4()
    End Sub

    ' Método genérico para cargar Roles (Para simplificar, mantengo tus funciones separadas pero agrupadas)
    Private Sub CargarRolCol1()
        CargarListaRol(rcbRolCol1)
    End Sub
    Private Sub CargarRolCol2()
        CargarListaRol(rcbRolCol2)
    End Sub
    Private Sub CargarRolCol3()
        CargarListaRol(rcbRolCol3)
    End Sub
    Private Sub CargarRolCol4()
        CargarListaRol(rcbRolCol4)
    End Sub

    ''' <summary>
    ''' Método auxiliar reutilizable para cargar roles.
    ''' </summary>
    Private Sub CargarListaRol(ByRef rcb As RadComboBox)
        Try
            Dim ds As DataSet
            Dim prmtIdTblListas As New CmdParametro("@IdTblListas", 5000185, 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("SpIvcSeleccionarListadoOpcionesRepVac", 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

#End Region

#Region "Eventos de Controles UI"

    Protected Sub rcbPuntoFijo_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs) Handles rcbPuntoFijo.SelectedIndexChanged

        Dim idPunto As Integer
        If Not Integer.TryParse(rcbPuntoFijo.SelectedValue, idPunto) Then Exit Sub
        Dim parametros As New Collection
        Dim ParamPunFijo As New CmdParametro("@IdTblPuntosFijosVacunacion", idPunto, SqlDbType.Int, False)
        parametros.Add(ParamPunFijo)
        Dim evento As Integer = 1206
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpSeleccionarPuntoFijoPorId", parametros, Session, evento, False)

        If ds.Tables.Count > 0 AndAlso ds.Tables(0).Rows.Count > 0 Then
            Dim dr As DataRow = ds.Tables(0).Rows(0)
            If Not IsDBNull(dr("Direccion")) Then
                txtDireccionInicio.Text = dr("Direccion").ToString()
            End If
            If Not IsDBNull(dr("AreaRural")) Then
                chkAreaRuralInicio.Checked = Convert.ToBoolean(dr("AreaRural"))
            End If
            If Not IsDBNull(dr("IdTblLocalidad")) Then
                rcbLocalidad.SelectedValue = dr("IdTblLocalidad").ToString()
                rcbLocalidad_SelectedIndexChanged(Nothing, Nothing)
            End If
            If Not IsDBNull(dr("IdTblUpz")) Then
                rcbUpz.SelectedValue = dr("IdTblUpz").ToString()
            End If
            If Not IsDBNull(dr("IdTblBarrio")) Then
                rcbBarrio.SelectedValue = dr("IdTblBarrio").ToString()
            End If
            If Not IsDBNull(dr("BarrioDigitado")) Then
                txtBarrioDigitado.Text = dr("BarrioDigitado").ToString()
            End If
        End If

    End Sub

    Protected Sub rcbMarcaVacuna_SelectedIndexChanged(sender As Object, e As EventArgs) Handles rcbMarcaVacuna.SelectedIndexChanged
        BindVacuna()
    End Sub

    Private Sub CargarLoteYFecha(ByVal idBiologico As Integer)
        Dim dt As New DataTable
        Dim prmtIdBiologico As New CmdParametro("@IdBiologicoVacuna", idBiologico, SqlDbType.Int, False)
        Dim coleccionParametros As New Collection
        coleccionParametros.Add(prmtIdBiologico)
        dt = clsBitacora.GetSelect("app.SpObtenerLoteYFechaVacuna", coleccionParametros, Session, 1206, False).Tables(0)
        If dt Is Nothing OrElse dt.Rows.Count = 0 Then
            txtLoteVacuna.Text = ""
            dateFechaVence.Clear()
            Exit Sub
        End If
        Dim row As DataRow = dt.Rows(0)
        txtLoteVacuna.Text = row("LoteVacuna").ToString()
        If Not IsDBNull(row("FechaVacuna")) Then
            dateFechaVence.SelectedDate = CDate(row("FechaVacuna"))
        Else
            dateFechaVence.Clear()
        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

    Protected Sub rcbLocalidadfin_SelectedIndexChanged(sender As Object, e As EventArgs)
        BindUpzFinal()
        Me.rcbBarriofinal.DataSource = CargarBarriosLocalidad(Me.rcbLocalidadfinal.SelectedValue)
        Me.rcbBarriofinal.DataBind()
        Me.rcbBarriofinal.Items.Insert(0, "Seleccione...")
    End Sub

    Protected Sub txtDireccionfin_TextChanged(sender As Object, e As EventArgs)
        If Me.txtDireccionFinal.Text.Trim.Length = 0 Then Exit Sub
        Dim oDir As New clsDireccion(Me.txtDireccionFinal.Text.Trim)
        If oDir.CodError <> 0 Then
            RadAjaxManager1.Alert(oDir.MsgError)
            Exit Sub
        End If
        CargarLocalidadesFinal()
        If Me.rcbLocalidadfinal.Items.FindItemByValue(oDir.IdLocalidad) IsNot Nothing Then
            Me.rcbLocalidadfinal.SelectedValue = oDir.IdLocalidad
        End If
        BindUpzFinal()
        If Me.rcbUpzfinal.Items.FindItemByValue(oDir.IdUpz) IsNot Nothing Then
            Me.rcbUpzfinal.SelectedValue = oDir.IdUpz
        End If
        Me.rcbBarriofinal.DataSource = CargarBarriosLocalidad(oDir.IdLocalidad)
        Me.rcbBarriofinal.DataBind()
        Me.rcbBarriofinal.Items.Insert(0, "Seleccione...")
        If Me.rcbBarriofinal.Items.FindItemByValue(oDir.IdBarrio) IsNot Nothing Then
            Me.rcbBarriofinal.SelectedValue = oDir.IdBarrio
        End If
        RadAjaxManager1.ResponseScripts.Add("habilitarCombosFinal();")
    End Sub

    ' --- Eventos de CheckBoxes (Intramural/barrido/extramural/Rural) ---
    Protected Sub chkIntramural_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim intramuralMarcado As Boolean = chkIntramural.Checked
        chkPuntoFijo.Enabled = intramuralMarcado
        rcbPuntoFijo.Enabled = intramuralMarcado
        chkExtramural.Enabled = False
        If Not intramuralMarcado Then
            chkPuntoFijo.Checked = False
            rcbPuntoFijo.ClearSelection()
            chkExtramural.Checked = False
            chkExtramural.Enabled = True
            LimpiarDireccion()
        End If
    End Sub

    Protected Sub chkExtramural_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim extramuralMarcado As Boolean = chkExtramural.Checked
        chkJorExtramural.Enabled = extramuralMarcado
        chkBarrido.Enabled = extramuralMarcado
        chkIntramural.Enabled = False
        If Not extramuralMarcado Then
            chkJorExtramural.Checked = False
            chkBarrido.Checked = False
            chkIntramural.Checked = False
            chkIntramural.Enabled = True
            BloquearUbicacionFinal()
        End If
    End Sub

    Protected Sub chkJorExtramural_CheckedChanged(sender As Object, e As EventArgs)
        chkBarrido.Checked = False
        chkBarrido.Enabled = Not chkJorExtramural.Checked
    End Sub

    Protected Sub chkBarrido_CheckedChanged(sender As Object, e As EventArgs)
        chkJorExtramural.Checked = False
        chkJorExtramural.Enabled = Not chkBarrido.Checked
        If chkBarrido.Checked Then
            HabilitarUbicacionFinal()
        Else
            BloquearUbicacionFinal()
        End If
    End Sub

    Protected Sub chkAreaRuralInicio_CheckedChanged(sender As Object, e As EventArgs) _
        Handles chkAreaRuralInicio.CheckedChanged
        Dim esRural As Boolean = chkAreaRuralInicio.Checked
        txtDireccionInicio.Enabled = esRural
        rcbLocalidad.Enabled = esRural
        rcbUpz.Enabled = esRural
        rcbBarrio.Enabled = esRural
        aIngresarDireccionInicio.Style("display") = If(esRural, "none", "inline")
        If esRural Then
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
        End If
    End Sub

    Protected Sub chkAreaRuralFin_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkAreaRuralFin.CheckedChanged
        Dim esRural As Boolean = chkAreaRuralFin.Checked
        txtDireccionFinal.Enabled = esRural
        aIngresarDireccionFin.Style("visibility") = If(esRural, "hidden", "visible")
        If Not esRural Then txtDireccionFinal.Text = String.Empty
    End Sub

    ' --- Eventos de selección de Roles (Mostrar/Ocultar 'Otro') ---
    Protected Sub rcbRolCol1_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol1.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol1.Visible = mostrarOtro
        txtOtroRolCol1.Enabled = mostrarOtro
        If mostrarOtro Then
            txtOtroRolCol1.Focus()
        Else
            txtOtroRolCol1.Text = ""
        End If
    End Sub

    Protected Sub rcbRolCol2_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol2.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol2.Visible = mostrarOtro
        txtOtroRolCol2.Enabled = mostrarOtro
        If mostrarOtro Then
            txtOtroRolCol2.Focus()
        Else
            txtOtroRolCol2.Text = ""
        End If
    End Sub

    Protected Sub rcbRolCol3_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol3.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol3.Visible = mostrarOtro
        txtOtroRolCol3.Enabled = mostrarOtro
        If mostrarOtro Then
            txtOtroRolCol3.Focus()
        Else
            txtOtroRolCol3.Text = ""
        End If
    End Sub

    Protected Sub rcbRolCol4_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbRolCol4.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtroRolCol4.Visible = mostrarOtro
        txtOtroRolCol4.Enabled = mostrarOtro
        If mostrarOtro Then
            txtOtroRolCol4.Focus()
        Else
            txtOtroRolCol4.Text = ""
        End If
    End Sub

    Protected Sub chkZoonosis_CheckedChanged(sender As Object, e As EventArgs)
        If chkZoonosis.Checked Then
            txtNumActa.Text = GenerarNumeroZoonosis()
            txtNumActa.Enabled = False
        Else
            txtNumActa.Text = ""
            txtNumActa.Enabled = True
        End If
    End Sub

#End Region

#Region "Lógica del Grid (RadGrid)"

    Protected Sub RGDatos_ItemCreated(ByVal sender As Object, ByVal e As Telerik.Web.UI.GridItemEventArgs) Handles RGDatos.ItemCreated
        If TypeOf e.Item Is GridDataItem Then
            Dim btnEdit As LinkButton = DirectCast(e.Item.FindControl("BtnEdit"), LinkButton)
            If btnEdit IsNot Nothing Then
                Dim idVacuna As String = e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("IdtblDatosVacuna").ToString()
                Dim index As String = e.Item.ItemIndex.ToString()
                ' Configuramos JS para abrir popup de edición
                btnEdit.Attributes("onclick") = String.Format("return ShowEditForm('{0}','{1}');", idVacuna, index)
            End If
        End If
    End Sub

    Protected Sub RGDatos_NeedDataSource(ByVal source As Object, ByVal e As Telerik.Web.UI.GridNeedDataSourceEventArgs) Handles RGDatos.NeedDataSource
        Dim dt As DataTable
        If Session("dt") IsNot Nothing Then
            dt = CType(Session("dt"), DataTable)
        Else
            Dim objActa As New RepVacunacion()
            dt = objActa.Estructura()
        End If
        RGDatos.DataSource = dt

        ' Actualizar resumenes estadísticos
        If dt IsNot Nothing Then
            CalcularResumenEspecie(dt)
            UPResumen.Update()
            UPResumen2.Update()
            CalcularResumenGrupoEtario(dt)
        End If
    End Sub

    Protected Sub RGDatos_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles RGDatos.ItemDataBound
        If TypeOf e.Item Is Telerik.Web.UI.GridDataItem Then
            Dim item As Telerik.Web.UI.GridDataItem = CType(e.Item, Telerik.Web.UI.GridDataItem)
            Dim btnEdit As LinkButton = CType(item.FindControl("BtnEdit"), LinkButton)
            Dim btnDelete As LinkButton = CType(item.FindControl("BtnDelete"), LinkButton)
            If btnEdit IsNot Nothing AndAlso Request.QueryString("opcion") = "View" Then
                btnEdit.Visible = False
                btnDelete.Visible = False
            End If
        End If
    End Sub

    Protected Sub RGDatos_DeleteCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RGDatos.DeleteCommand
        If Not IsNothing(Session("dt")) Then
            ds = Session("dt")
            ds.Rows(e.Item.ItemIndex).Delete()
            ds.AcceptChanges()
            Session("dt") = ds
        End If
    End Sub

#End Region

#Region "Cálculos y Resúmenes Estadísticos"

    Private Sub CalcularResumenEspecie(ByVal dt As DataTable)
        Dim canH As Integer = 0, canM As Integer = 0
        Dim felH As Integer = 0, felM As Integer = 0

        For Each row As DataRow In dt.Rows
            Dim especie As String = row("Especie").ToString().Trim().ToUpper()
            Dim sexo As String = row("SexoAnimal").ToString().Trim().ToUpper()

            If especie.Contains("1-CANINO") Then
                If sexo.Contains("1-HEMBRA") Then canH += 1 Else If sexo.Contains("2-MACHO") Then canM += 1
            ElseIf especie.Contains("2-FELINO") Then
                If sexo.Contains("1-HEMBRA") Then felH += 1 Else If sexo.Contains("2-MACHO") Then felM += 1
            End If
        Next

        lblCaninoH.Text = canH.ToString()
        lblCaninoM.Text = canM.ToString()
        lblCaninoT.Text = (canH + canM).ToString()
        lblFelinoH.Text = felH.ToString()
        lblFelinoM.Text = felM.ToString()
        lblFelinoT.Text = (felH + felM).ToString()
        lblTotalH.Text = (canH + felH).ToString()
        lblTotalM.Text = (canM + felM).ToString()
        lblTotalT.Text = (canH + felH + canM + felM).ToString()
    End Sub

    Private Sub CalcularResumenGrupoEtario(ByVal dt As DataTable)
        Dim c1M As Integer = 0, c1A5 As Integer = 0, c6A10 As Integer = 0, c10M As Integer = 0
        Dim f1M As Integer = 0, f1A5 As Integer = 0, f6A10 As Integer = 0, f10M As Integer = 0

        If dt IsNot Nothing Then
            For Each row As DataRow In dt.Rows
                Dim especie As String = row("Especie").ToString().Trim().ToUpper()
                Dim edad As Integer = 0
                Integer.TryParse(row("EdadAnios").ToString(), edad)

                If especie.Contains("1-CANINO") Then
                    If edad < 1 Then
                        c1M += 1
                    ElseIf edad >= 1 And edad <= 5 Then
                        c1A5 += 1
                    ElseIf edad >= 6 And edad <= 10 Then
                        c6A10 += 1
                    ElseIf edad > 10 Then
                        c10M += 1
                    End If
                ElseIf especie.Contains("2-FELINO") Then
                    If edad < 1 Then
                        f1M += 1
                    ElseIf edad >= 1 And edad <= 5 Then
                        f1A5 += 1
                    ElseIf edad >= 6 And edad <= 10 Then
                        f6A10 += 1
                    ElseIf edad > 10 Then
                        f10M += 1
                    End If
                End If
            Next
        End If

        ' --- ASIGNACIÓN AL HTML (CANINOS) ---
        lbl1MC.Text = c1M.ToString()
        lbl1A5C.Text = c1A5.ToString()
        lbl6A10C.Text = c6A10.ToString()
        lbl10MC.Text = c10M.ToString()
        lblTotalC.Text = (c1M + c1A5 + c6A10 + c10M).ToString()

        ' --- ASIGNACIÓN AL HTML (FELINOS) ---
        lbl1MF.Text = f1M.ToString()
        lbl1A5F.Text = f1A5.ToString()
        lbl6A10F.Text = f6A10.ToString()
        lbl10MF.Text = f10M.ToString()
        lblTotalF.Text = (f1M + f1A5 + f6A10 + f10M).ToString()

        ' --- TOTALES POR RANGO (HORIZONTALES) ---
        lbl1MT.Text = (c1M + f1M).ToString()
        lbl1A5T.Text = (c1A5 + f1A5).ToString()
        lbl6A10T.Text = (c6A10 + f6A10).ToString()
        lbl10MT.Text = (c10M + f10M).ToString()

        ' --- TOTAL GENERAL (ESQUINA INFERIOR DERECHA) ---
        lblTotalGral.Text = (c1M + c1A5 + c6A10 + c10M + f1M + f1A5 + f6A10 + f10M).ToString()

        UPResumen2.Update()
    End Sub

#End Region

#Region "Funciones Auxiliares y Seguridad"

    ''' <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

    ''' <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
        aIngresarDireccionFin.Visible = False
        btnLookupFuncionario1.Visible = False
        btnLookupFuncionario2.Visible = False
        btnClearFuncionario2.Visible = False
        btnLookupFuncionario3.Visible = False
        btnClearFuncionario3.Visible = False
        btnLookupFuncionario4.Visible = False
        btnClearFuncionario4.Visible = False
        btnLookupFuncionario5.Visible = False
    End Sub

    Private Sub HabilitarUbicacionFinal()
        chkAreaRuralFin.Enabled = True
        txtDireccionFinal.Enabled = True
        rcbLocalidadfinal.Enabled = True
        rcbUpzfinal.Enabled = True
        rcbBarriofinal.Enabled = True
        txtBarrioDigitadofinal.Enabled = True
        aIngresarDireccionFin.Attributes("onclick") = "IngresarDireccionFin();"
        aIngresarDireccionFin.Style("pointer-events") = "auto"
        aIngresarDireccionFin.Style("color") = ""
    End Sub

    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 BloquearUbicacionFinal()
        chkAreaRuralFin.Checked = False
        chkAreaRuralFin.Enabled = False
        txtDireccionFinal.Text = String.Empty
        txtDireccionFinal.Enabled = False
        rcbLocalidadfinal.ClearSelection()
        rcbLocalidadfinal.Enabled = False
        rcbUpzfinal.Items.Clear()
        rcbUpzfinal.Enabled = False
        rcbBarriofinal.Items.Clear()
        rcbBarriofinal.Text = "Listado sin cargar..."
        rcbBarriofinal.Enabled = False
        txtBarrioDigitadofinal.Text = String.Empty
        txtBarrioDigitadofinal.Enabled = False
        aIngresarDireccionFin.Attributes.Remove("onclick")
        aIngresarDireccionFin.Style("pointer-events") = "none"
        aIngresarDireccionFin.Style("color") = "#999"
    End Sub

    Function ValorSeguro(dr As DataRow, columna As String) As String
        If IsDBNull(dr(columna)) Then
            Return String.Empty
        End If
        Return dr(columna).ToString()
    End Function

#End Region

#Region "Validaciones"

    ' VALIDACIÓN GENERAL
    Private Function ValidarFormulario() As Boolean
        If Not ValidarActa() Then Return False
        If Not ValidarFechaVacuna() Then Return False
        If Not ValidarHoras() Then Return False
        If Not ValidarVacuna() Then Return False
        If Not ValidarColaboradores() Then Return False
        If Not ValidarMedicoVeterinario() Then Return False
        If Not ValidarDireccion() Then Return False

        Return True
    End Function

    ' VALIDACIÓN ACTA
    Private Function ValidarActa() As Boolean
        Dim numActa As String = txtNumActa.Text.Trim()
        If chkZoonosis.Checked Then
            If String.IsNullOrEmpty(numActa) OrElse Not IsNumeric(numActa) Then
                RadAjaxManager1.Alert("Número de acta zoonosis inválido")
                Return False
            End If
            Return True
        End If
        If String.IsNullOrEmpty(numActa) Then
            RadAjaxManager1.Alert("Debe ingresar el número del acta")
            Return False
        End If

        If Not ValidarNumeroActa(numActa) Then
            RadAjaxManager1.Alert("El número de acta no es válido")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN FORMATO ACTA
    Private Function ValidarNumeroActa(ByVal numeroActa As String) As Boolean
        Dim patron As String = "^EZ21[CSNE]\d{6}$"
        Return Regex.IsMatch(numeroActa, patron)
    End Function

    ' VALIDACIÓN EXISTENCIA ACTA
    Private Function ExisteActaNumero(ByVal actaNumero As String) As Boolean
        Dim existe As Boolean = False
        Dim ObjParametros As New Collection
        ObjParametros.Add(New CmdParametro("@ActaNumero", actaNumero, SqlDbType.VarChar, False, 50))
        Dim ds As DataSet = clsBitacora.GetSelect("[app].[SpIVCExisteActaNumero]", ObjParametros, Session, 96, True)
        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

    ' VALIDACIÓN FECHA VACUNA
    Private Function ValidarFechaVacuna() As Boolean
        If Not txtFechaVacuna.SelectedDate.HasValue Then
            RadAjaxManager1.Alert("Debe ingresar la fecha de aplicación de la vacuna")
            Return False
        End If
        If txtFechaVacuna.SelectedDate.Value.Date > Date.Today Then
            RadAjaxManager1.Alert("La fecha de aplicación no puede ser superior a hoy")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN HORAS
    Private Function ValidarHoras() As Boolean
        If txtHoraInicio.SelectedDate Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la hora de inicio")
            Return False
        End If
        If txtHoraFinal.SelectedDate Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la hora final")
            Return False
        End If
        Dim horaInicio As DateTime = txtHoraInicio.SelectedDate.Value
        Dim horaFinal As DateTime = txtHoraFinal.SelectedDate.Value
        If horaFinal <= horaInicio Then
            RadAjaxManager1.Alert("La hora final debe ser mayor que la hora de inicio")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN VACUNA
    Private Function ValidarVacuna() As Boolean
        If String.IsNullOrEmpty(rcbMarcaVacuna.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar la marca del biológico")
            Return False
        End If
        If String.IsNullOrEmpty(txtLoteVacuna.Text) Then
            RadAjaxManager1.Alert("Debe ingresar el lote de la vacuna")
            Return False
        End If
        If Not dateFechaVence.SelectedDate.HasValue Then
            RadAjaxManager1.Alert("Debe ingresar la fecha de vencimiento de la vacuna")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN COLABORADORES
    Private Function ValidarColaboradores() As Boolean
        If String.IsNullOrEmpty(txtNombreColaborador1.Text) Then
            RadAjaxManager1.Alert("Debe seleccionar un colaborador (Nombre completo)")
            Return False
        End If
        If String.IsNullOrEmpty(txtProfesionCol1.Text) Then
            RadAjaxManager1.Alert("La profesión del colaborador es obligatoria")
            Return False
        End If

        Return True
    End Function

    ' VALIDACIÓN MÉDICO VETERINARIO
    Private Function ValidarMedicoVeterinario() As Boolean
        If String.IsNullOrEmpty(txtNombreMedVet.Text) Then
            RadAjaxManager1.Alert("El nombre completo del médico veterinario es obligatorio")
            Return False
        End If
        Dim valorTarjeta As String = txtTarjetaMedVet.Text.Trim()
        Dim patron As String = "^[A-Za-z0-9-]{1,20}$"
        If String.IsNullOrEmpty(valorTarjeta) Then
            RadAjaxManager1.Alert("Debe ingresar la tarjeta profesional del Médico Veterinario")
            Return False
        End If
        If Not Regex.IsMatch(valorTarjeta, patron) Then
            RadAjaxManager1.Alert("La tarjeta profesional solo permite letras, números y guiones (máx. 20 caracteres)")
            Return False
        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 del punto de vacunación")
            Return False
        End If
        Return True
    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 = txtNumActa.Text.Trim()
        If ExisteActaNumero(numActa) Then
            RadAjaxManager1.Alert("El número de acta ya se encuentra registrado")
            Return
        End If
        Dim ObjRep As New RepVacunacion
        Try
            ' Mapeo de controles a objeto de negocio
            If Session("IdUsuario") IsNot Nothing Then
                ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
            End If
            ObjRep.ActaNum = Me.txtNumActa.Text
            ObjRep.Zoonosis = Me.chkZoonosis.Checked
            ObjRep.FechaVacuna = Me.txtFechaVacuna.SelectedDate
            ObjRep.IdEntidad = Me.hddIdEntidad.Value
            ObjRep.ESE = Me.txtESE.Text
            ObjRep.HoraInicio = Me.txtHoraInicio.SelectedTime
            ObjRep.HoraFinal = Me.txtHoraFinal.SelectedTime
            ObjRep.EsIntramural = Me.chkIntramural.Checked
            ObjRep.EsPuntoFijo = Me.chkPuntoFijo.Checked
            ObjRep.IdPuntoFijo = If(String.IsNullOrEmpty(Me.rcbPuntoFijo.SelectedValue), 0, CInt(Me.rcbPuntoFijo.SelectedValue))
            ObjRep.EsExtramural = Me.chkExtramural.Checked
            ObjRep.EsJorExtramural = Me.chkJorExtramural.Checked
            ObjRep.EsBarrido = Me.chkBarrido.Checked
            ObjRep.IdMarcaVacuna = Me.rcbMarcaVacuna.SelectedValue
            ObjRep.LoteVacuna = Me.txtLoteVacuna.Text
            ObjRep.FechaVence = Me.dateFechaVence.SelectedDate
            ObjRep.AreaRuralInicio = Me.chkAreaRuralInicio.Checked
            ObjRep.DireccionInicio = Me.txtDireccionInicio.Text
            ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
            ObjRep.IdUpz = Me.rcbUpz.SelectedValue
            ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
            ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
            ObjRep.AreaRuralFin = Me.chkAreaRuralFin.Checked
            ObjRep.DireccionFinal = Me.txtDireccionFinal.Text
            If Not String.IsNullOrEmpty(rcbLocalidadfinal.SelectedValue) Then
                ObjRep.IdLocalidadFinal = CInt(rcbLocalidadfinal.SelectedValue)
            Else
                ObjRep.IdLocalidadFinal = 0
            End If
            If Not String.IsNullOrEmpty(rcbUpzfinal.SelectedValue) Then
                ObjRep.IdUpzFinal = CInt(rcbUpzfinal.SelectedValue)
            Else
                ObjRep.IdUpzFinal = 0
            End If
            If Not String.IsNullOrEmpty(rcbBarriofinal.SelectedValue) Then
                ObjRep.IdBarrioFinal = CInt(rcbBarriofinal.SelectedValue)
            Else
                ObjRep.IdBarrioFinal = 0
            End If
            ObjRep.BarrioDigitadoFinal = Me.txtBarrioDigitadofinal.Text
            ObjRep.Observacion = Me.txtObservacion.Text

            ' Funcionarios
            ObjRep.IdFuncionario1 = Me.hddIdFuncionario1.Value
            ObjRep.NombreColaborador1 = Me.txtNombreColaborador1.Text
            ObjRep.ProfesionCol1 = Me.txtProfesionCol1.Text
            Dim listaRoles As New List(Of String)
            For Each item As RadComboBoxItem In rcbRolCol1.CheckedItems
                listaRoles.Add(item.Value)
            Next
            Dim rolesConcatenados As String = String.Join(",", listaRoles.ToArray())
            ObjRep.IdRolCol1 = rolesConcatenados
            ObjRep.OtroRolCol1 = Me.txtOtroRolCol1.Text

            ' COLABORADOR 2
            If hddIdFuncionario2.Value <> "0" AndAlso rcbRolCol2.CheckedItems.Count > 0 Then
                ObjRep.IdFuncionario2 = Me.hddIdFuncionario2.Value
                ObjRep.NombreColaborador2 = Me.txtNombreColaborador2.Text
                ObjRep.ProfesionCol2 = Me.txtProfesionCol2.Text
                Dim listaRoles2 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol2.CheckedItems
                    listaRoles2.Add(item.Value)
                Next
                ObjRep.IdRolCol2 = String.Join(",", listaRoles2.ToArray())
                ObjRep.OtroRolCol2 = Me.txtOtroRolCol2.Text
            Else
                ObjRep.IdFuncionario2 = 0
                ObjRep.NombreColaborador2 = Nothing
                ObjRep.ProfesionCol2 = Nothing
                ObjRep.IdRolCol2 = Nothing
                ObjRep.OtroRolCol2 = Nothing
            End If

            ' COLABORADOR 3
            If hddIdFuncionario3.Value <> "0" AndAlso rcbRolCol3.CheckedItems.Count > 0 Then
                ObjRep.IdFuncionario3 = Me.hddIdFuncionario3.Value
                ObjRep.NombreColaborador3 = Me.txtNombreColaborador3.Text
                ObjRep.ProfesionCol3 = Me.txtProfesionCol3.Text
                Dim listaRoles3 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol3.CheckedItems
                    listaRoles3.Add(item.Value)
                Next
                ObjRep.IdRolCol3 = String.Join(",", listaRoles3.ToArray())
                ObjRep.OtroRolCol3 = Me.txtOtroRolCol3.Text
            Else
                ObjRep.IdFuncionario3 = 0
                ObjRep.NombreColaborador3 = Nothing
                ObjRep.ProfesionCol3 = Nothing
                ObjRep.IdRolCol3 = Nothing
                ObjRep.OtroRolCol3 = Nothing
            End If

            ' COLABORADOR 4
            If hddIdFuncionario4.Value <> "0" AndAlso rcbRolCol4.CheckedItems.Count > 0 Then
                ObjRep.IdFuncionario4 = Me.hddIdFuncionario4.Value
                ObjRep.NombreColaborador4 = Me.txtNombreColaborador4.Text
                ObjRep.ProfesionCol4 = Me.txtProfesionCol4.Text
                Dim listaRoles4 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol4.CheckedItems
                    listaRoles4.Add(item.Value)
                Next
                ObjRep.IdRolCol4 = String.Join(",", listaRoles4.ToArray())
                ObjRep.OtroRolCol4 = Me.txtOtroRolCol4.Text
            Else
                ObjRep.IdFuncionario4 = 0
                ObjRep.NombreColaborador4 = Nothing
                ObjRep.ProfesionCol4 = Nothing
                ObjRep.IdRolCol4 = Nothing
                ObjRep.OtroRolCol4 = Nothing
            End If

            ObjRep.IdFuncionario5 = Me.hddIdFuncionario5.Value
            ObjRep.NombreMedVet = Me.txtNombreMedVet.Text
            ObjRep.TarjetaMedVet = Me.txtTarjetaMedVet.Text

            ' Totales y Resúmenes
            ObjRep.CaninoH = Me.lblCaninoH.Text : ObjRep.CaninoM = Me.lblCaninoM.Text : ObjRep.CaninoT = Me.lblCaninoT.Text
            ObjRep.FelinoH = Me.lblFelinoH.Text : ObjRep.FelinoM = Me.lblFelinoM.Text : ObjRep.FelinoT = Me.lblFelinoT.Text
            ObjRep.TotalH = Me.lblTotalH.Text : ObjRep.TotalM = Me.lblTotalM.Text : ObjRep.TotalT = Me.lblTotalT.Text

            ObjRep.Canino1M = Me.lbl1MC.Text : ObjRep.Felino1M = Me.lbl1MF.Text : ObjRep.Total1M = Me.lbl1MT.Text
            ObjRep.Canino1A5 = Me.lbl1A5C.Text : ObjRep.Felino1A5 = Me.lbl1A5F.Text : ObjRep.Total1A5 = Me.lbl1A5T.Text
            ObjRep.Canino6A10 = Me.lbl6A10C.Text : ObjRep.Felino6A10 = Me.lbl6A10F.Text : ObjRep.Total6A10 = Me.lbl6A10T.Text
            ObjRep.Canino10M = Me.lbl10MC.Text : ObjRep.Felino10M = Me.lbl10MF.Text : ObjRep.Total10M = Me.lbl10MT.Text
            ObjRep.TotalC = Me.lblTotalC.Text : ObjRep.TotalF = Me.lblTotalF.Text : ObjRep.TotalGral = Me.lblTotalGral.Text

            ObjRep.DatosVacunas = Session("dt")

            ' Acción Insertar
            If Request.QueryString("opcion") = "New" Then
                Dim idRegistro As Integer = ObjRep.Insertar()
                If idRegistro > 0 Then
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindInsert(" & idRegistro & ");")
                    RadAjaxManager1.Alert("Formulario ingresado correctamente")
                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 btnActualizar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnActualizar.Click

        If Not ValidarFormulario() Then Exit Sub
        Dim ObjRep As New RepVacunacion
        Try
            If Request.QueryString("IdtblRepVacAnt") IsNot Nothing Then
                Dim idAEditar As Integer = Convert.ToInt32(Request.QueryString("IdtblRepVacAnt"))
                ObjRep.IdtblRepVacAnt = CInt(Request.QueryString("IdtblRepVacAnt")) ' Ajusta según cómo guardes tu ID
                ObjRep.ActaNum = Me.txtNumActa.Text
                ObjRep.Zoonosis = Me.chkZoonosis.Checked
                ObjRep.FechaVacuna = Me.txtFechaVacuna.SelectedDate
                ObjRep.IdEntidad = Me.hddIdEntidad.Value
                ObjRep.ESE = Me.txtESE.Text
                ObjRep.HoraInicio = Me.txtHoraInicio.SelectedTime
                ObjRep.HoraFinal = Me.txtHoraFinal.SelectedTime
                ObjRep.EsIntramural = Me.chkIntramural.Checked
                ObjRep.EsPuntoFijo = Me.chkPuntoFijo.Checked
                ObjRep.IdPuntoFijo = If(String.IsNullOrEmpty(Me.rcbPuntoFijo.SelectedValue), 0, CInt(Me.rcbPuntoFijo.SelectedValue))
                ObjRep.EsExtramural = Me.chkExtramural.Checked
                ObjRep.EsJorExtramural = Me.chkJorExtramural.Checked
                ObjRep.EsBarrido = Me.chkBarrido.Checked
                ObjRep.IdMarcaVacuna = Me.rcbMarcaVacuna.SelectedValue
                ObjRep.LoteVacuna = Me.txtLoteVacuna.Text
                ObjRep.FechaVence = Me.dateFechaVence.SelectedDate
                ObjRep.AreaRuralInicio = Me.chkAreaRuralInicio.Checked
                ObjRep.DireccionInicio = Me.txtDireccionInicio.Text
                ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
                ObjRep.IdUpz = Me.rcbUpz.SelectedValue
                ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
                ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text

                ' Lógica de combos finales (con validación de nulos)
                ObjRep.AreaRuralFin = Me.chkAreaRuralFin.Checked
                ObjRep.DireccionFinal = Me.txtDireccionFinal.Text
                ObjRep.IdLocalidadFinal = If(Not String.IsNullOrEmpty(rcbLocalidadfinal.SelectedValue), CInt(rcbLocalidadfinal.SelectedValue), 0)
                ObjRep.IdUpzFinal = If(Not String.IsNullOrEmpty(rcbUpzfinal.SelectedValue), CInt(rcbUpzfinal.SelectedValue), 0)
                ObjRep.IdBarrioFinal = If(Not String.IsNullOrEmpty(rcbBarriofinal.SelectedValue), CInt(rcbBarriofinal.SelectedValue), 0)
                ObjRep.BarrioDigitadoFinal = Me.txtBarrioDigitadofinal.Text
                ObjRep.Observacion = Me.txtObservacion.Text

                ' Funcionarios y Roles
                ObjRep.IdFuncionario1 = Me.hddIdFuncionario1.Value
                ObjRep.NombreColaborador1 = Me.txtNombreColaborador1.Text
                ObjRep.ProfesionCol1 = Me.txtProfesionCol1.Text
                Dim listaRoles As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol1.CheckedItems
                    listaRoles.Add(item.Value)
                Next
                Dim rolesConcatenados As String = String.Join(",", listaRoles.ToArray())
                ObjRep.IdRolCol1 = rolesConcatenados
                ObjRep.OtroRolCol1 = Me.txtOtroRolCol1.Text

                ObjRep.IdFuncionario2 = Me.hddIdFuncionario2.Value
                ObjRep.NombreColaborador2 = Me.txtNombreColaborador2.Text
                ObjRep.ProfesionCol2 = Me.txtProfesionCol2.Text
                Dim listaRoles2 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol2.CheckedItems
                    listaRoles2.Add(item.Value)
                Next
                Dim rolesConcatenados2 As String = String.Join(",", listaRoles2.ToArray())
                ObjRep.IdRolCol2 = rolesConcatenados2
                ObjRep.OtroRolCol2 = Me.txtOtroRolCol2.Text

                ObjRep.IdFuncionario3 = Me.hddIdFuncionario3.Value
                ObjRep.NombreColaborador3 = Me.txtNombreColaborador3.Text
                ObjRep.ProfesionCol3 = Me.txtProfesionCol3.Text
                Dim listaRoles3 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol3.CheckedItems
                    listaRoles3.Add(item.Value)
                Next
                Dim rolesConcatenados3 As String = String.Join(",", listaRoles3.ToArray())
                ObjRep.IdRolCol3 = rolesConcatenados3
                ObjRep.OtroRolCol3 = Me.txtOtroRolCol3.Text

                ObjRep.IdFuncionario4 = Me.hddIdFuncionario4.Value
                ObjRep.NombreColaborador4 = Me.txtNombreColaborador4.Text
                ObjRep.ProfesionCol4 = Me.txtProfesionCol4.Text
                Dim listaRoles4 As New List(Of String)
                For Each item As RadComboBoxItem In rcbRolCol4.CheckedItems
                    listaRoles4.Add(item.Value)
                Next
                Dim rolesConcatenados4 As String = String.Join(",", listaRoles4.ToArray())
                ObjRep.IdRolCol4 = rolesConcatenados4
                ObjRep.OtroRolCol4 = Me.txtOtroRolCol4.Text

                ObjRep.IdFuncionario5 = Me.hddIdFuncionario5.Value
                ObjRep.NombreMedVet = Me.txtNombreMedVet.Text
                ObjRep.TarjetaMedVet = Me.txtTarjetaMedVet.Text

                ' Totales y Resúmenes
                ObjRep.CaninoH = Me.lblCaninoH.Text : ObjRep.CaninoM = Me.lblCaninoM.Text : ObjRep.CaninoT = Me.lblCaninoT.Text
                ObjRep.FelinoH = Me.lblFelinoH.Text : ObjRep.FelinoM = Me.lblFelinoM.Text : ObjRep.FelinoT = Me.lblFelinoT.Text
                ObjRep.TotalH = Me.lblTotalH.Text : ObjRep.TotalM = Me.lblTotalM.Text : ObjRep.TotalT = Me.lblTotalT.Text

                ObjRep.Canino1M = Me.lbl1MC.Text : ObjRep.Felino1M = Me.lbl1MF.Text : ObjRep.Total1M = Me.lbl1MT.Text
                ObjRep.Canino1A5 = Me.lbl1A5C.Text : ObjRep.Felino1A5 = Me.lbl1A5F.Text : ObjRep.Total1A5 = Me.lbl1A5T.Text
                ObjRep.Canino6A10 = Me.lbl6A10C.Text : ObjRep.Felino6A10 = Me.lbl6A10F.Text : ObjRep.Total6A10 = Me.lbl6A10T.Text
                ObjRep.Canino10M = Me.lbl10MC.Text : ObjRep.Felino10M = Me.lbl10MF.Text : ObjRep.Total10M = Me.lbl10MT.Text
                ObjRep.TotalC = Me.lblTotalC.Text : ObjRep.TotalF = Me.lblTotalF.Text : ObjRep.TotalGral = Me.lblTotalGral.Text

                If Session("IdUsuario") IsNot Nothing Then
                    ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
                End If

                ' Datos de la Grilla/Detalle
                ObjRep.DatosVacunas = Session("dt")
                Dim exito As Boolean = ObjRep.Actualizar()
                If exito Then
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindUpdate();")
                    RadAjaxManager1.Alert("Registro actualizado correctamente")
                Else
                    RadAjaxManager1.Alert("Error interno al actualizar en la base de datos.")
                End If
            Else
                RadAjaxManager1.Alert("No se encontró un ID válido para actualizar.")
            End If
            Return
        Catch ex As Exception
            RadAjaxManager1.Alert("Error al actualizar: " & ex.Message)
            Return
        End Try
    End Sub

#End Region

End Class