@page "/InfoVidaAdministrativa"

@* @page "/InfoVidaAdministrativa/{viAd:string}/{usuVida:string}" *@

@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Layout
@using Microsoft.AspNetCore
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using bdAntifraude.clases
@rendermode InteractiveServer
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject NavigationManager Navigation


@if (mostrar)
{
    <div id="cargando" class="loadingFrame">
        <div class="loadingImg"></div>
    </div>
}
@if (mostrarMensajeCuerpo == true)
{
    <div class="loadingFrame">
        <div class="popupRPCard row">
            <p>No es posible editar vidas administrativas si la persona no tiene un cuerpo asignado</p>
            <input type="button" value="Continuar" @onclick="OcultarMenCuer" />
        </div>
    </div>
}
@if (mostrarMensajeEliminar == true)
{
    <div class="loadingFrame">
        <div class="popupRPCard row">
            <p>¿Esta seguro de eliminar esta vida administrativa?</p>
            <div class="col-12 d-flex gap-2 justify-content-end">
                <input type="button" class="btnGris" value="Continuar" @onclick="BorrarVida" />
                <input type="button" class="btnOAAFAzul" value="Cancelar" @onclick="OcultarMenElim" />
            </div>
        </div>
    </div>
}
@if (mostrarAnadirLineaVida == true)
{
    <div class="loadingFrame">
        <div class="popupRPCard row">
            <div class="col-12  formatoCampos">  <label class="tituloLbl">Descripción:</label><InputText @bind-Value="DESCRIPCIONLINEAVIDA" class="inputForm" /></div>
            <div class="col-6  formatoCampos">
                <label class="tituloLbl">Tipo de documento:</label>
                <InputSelect class="inputForm" @bind-Value="IDTIPODOCU">
                    @foreach (ENUMERACIONES tipoDocu in listTipoDocu)
                    {
                        <option value="@tipoDocu.IDENUMERACION">@tipoDocu.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>
            <div class="col-6  formatoCampos">
                <InputFile class="inputForm" OnChange="LoadFile"></InputFile>
            </div>
            <div class="col-12 d-flex mt-2 justify-content-end gap-2">
                <input type="button" class="btnOAAFAzul" value="Continuar" @onclick="AnadirLineaVida" />
                <input type="button" class="btnGris" value="Cancelar" @onclick="cerrarAnadirLineaVida" />
            </div>
        </div>
    </div>
}
@if (mostrarEditarLineaVida == true)
{
    <div class="loadingFrame">
        <div class="popupRPCard row">
            <div class="col-12  formatoCampos">  <label class="tituloLbl">Descripción:</label><InputText @bind-Value="DESCRIPCIONLINEAVIDAED" class="inputForm" /></div>
            <div class="col-6  formatoCampos">
                <label class="tituloLbl">Tipo de documento:</label>
                <InputSelect class="inputForm" @bind-Value="IDTIPODOCUED" disabled>
                    @foreach (ENUMERACIONES tipoDocu in listTipoDocu)
                    {
                        <option value="@tipoDocu.IDENUMERACION">@tipoDocu.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>
            <div class="col-6  formatoCampos">
                <InputFile class="inputForm" OnChange="LoadFile1">Seleccione un archivo para sobreescribir el anterior</InputFile>
            </div>
            <div class="col-12 d-flex mt-2 justify-content-end gap-2">
               <input type="button" class="btnOAAFAzul" value="Continuar" @onclick="EditarLineaVida" /> 
                <input type="button" class="btnGris" value="Cancelar" @onclick="cerrarEditarLineaVida" />
            </div>
        </div>
    </div>
}
<div class="pagina">
    <div class="popupRP" style="display:none;" id="popupConfirmar">
        <div id="confirmarCard" class="popupRPCard row">
        </div>
    </div>
    <div class="popupRP" style="display:none;" id="popupMensaje">
        <div class="popupRPCard row">
            <p id="lblMensaje"></p>
            <input type="button" class="btnGris" value="Continuar" onclick="$('#popupMensaje').css('display','none'); location.reload()" />
        </div>
    </div>
    <div class="popupRP" style="display: none;" id="popupCuerpo">
        <div class="popupRPCard row">
            <p id="lblMensajeCu"></p>
            <input type="button" class="btnGris" value="Continuar" onclick="$('#popupCuerpo').css('display','none');" />
        </div>
    </div>
    <div class="popupRP" style="display: none;" id="popupVidaAdmin">
        <div class="popupRPCard row">
            <div class="col-md-12" style="flex-direction: column">
                <p class="lblinputRP">Descripción:</p>
                <input class="inputRP" type="text" id="DescripVA" />
            </div>
            <div class="col-md-6" style="flex-direction: column">
                <p class="lblinputRP">Tipo de documento:</p>
                <select ID="TipoCB">
                </select>
            </div>

            <div class="col-md-6" style="flex-direction: column">
                <p class="lblinputRP">Fichero:</p>
                <input class="inputRP" type="file" onchange="archivo('fileForm')" id="fileForm" />
            </div>
            <div class="col-md-12 justify-content-end" style="display: flex; justify-content: end; gap: 10px">
                <input type="button" class="btnOAAFAzul" value="Añadir" id="anadirForm" onclick="nuevaFormacion()" />
                <input type="button" class="btnOAAFAzul" value="Modificar" style="display: none" id="modForm" onclick="ModificarForm()" />
                <input type="button" class="btnGris" value="Cancelar" />

            </div>
        </div>
    </div>
    <div class="Cabecera">
        <h6><small><i class="fas fa-handshake"></i><b>Vida administrativa (<a id="lblNombre" href="@LINKPERSONA">@usuarioVida</a> )</b></small></h6>
    </div>
    <div>
        <EditForm Model="Model" FormName="FormInfoViAd" class="formDtosAdmin">
            <DataAnnotationsValidator />
            <ValidationSummary />

            <div class="botonera col-12 gap-1" style="display:flex;">
                <button class="btnOAAFAzul" @onclick="volver" title="Volver"><i class="fas fa-long-arrow-alt-left"></i></button>
                <button class="btnOAAFAzul" @onclick="guardarFormulario" title="Guardar"><i class="fas fa-save"></i></button>
                <button class="btnOAAFAzul" hidden=@ocultarBtnBorr @onclick="mostrarAvisoEliminar" title="Eliminar"><i class="fas fa-trash"></i></button>             
            </div>

            <div class="areaMenu m-0">
                <div class="camposficha row">
                    @if (nueva == true)
                    {
                        <div class="col-4 formatoCampos">
                            <label class="tituloLbl">Acto Administrativo<span style="color:red">*</span>:</label>
                            <InputSelect id="cbActosAdministrativos" class="inputForm"
                                         @bind-Value="IDAPTOACTUAL" @bind-Value:after="CargarMotivos" @oninput="e => ValidarYActualizar(e, nameof(IDAPTOACTUAL))">
                                @foreach (TIPOAPTOSADMINISTRATIVOS Actos in TiposActos)
                                {
                                    @if ((Actos.DESCRIPCION == "TOMA POSESION" || Actos.DESCRIPCION == "TOMA POSESIÓN ORGANIZATIVA") && IDPUESTOACTUAL != 0) { }
                                    else
                                    {
                                        <option value="@Actos.IDTIPO">@Actos.DESCRIPCION</option>
                                    }
                                }
                            </InputSelect>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDAPTOACTUAL))</div>
                        </div>
                    }
                    else if (IDAPTOACTUAL != 0)
                    {
                        <div class="col-4 formatoCampos">
                            <label class="tituloLbl">Acto Administrativo:</label>
                            <p class="inputForm falsoImput">@TiposActos?.FirstOrDefault(x => x.IDTIPO == IDAPTOACTUAL)?.DESCRIPCION </p>
                        </div>
                    }
                    <div class="col-4 formatoCampos">
                        <label class="tituloLbl">Causa<span style="color:red">*</span>:</label>
                        <InputSelect @bind-Value="IDMOTIVOACTUAL" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(IDMOTIVOACTUAL))">
                          @foreach (var solicitud in listMotivos.Where(x => x.ACTIVOB == true))
                            {
                                <option value="@solicitud.IDMOTIVO">@solicitud.DESCRIPCION</option>
                            }
                        </InputSelect>
                        <div class="validation-message">@GetExternalValidationMessage(nameof(IDMOTIVOACTUAL))</div>
                    </div>
                    <div class="col-2 formatoCampos">
                        <label class="tituloLbl">Fecha de Efecto<span style="color:red">*</span>:</label>
                        <InputDate @bind-Value="Model.FECHA" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.FECHA))"></InputDate>
                        <div class="validation-message">@GetExternalValidationMessage(nameof(Model.FECHA))</div>
                    </div>
                    <div class="col-2 formatoCampos">
                        <label class="tituloLbl">Fecha de Resolución:</label>
                        <InputDate @bind-Value="Model.FECHARESOLUCION" class="inputForm"></InputDate>
                    </div>
                    @if (mostrarNRP == true)
                    {
                        <div class="col-3 formatoCampos">
                            <label class="tituloLbl">NRP:</label>
                            <p class="inputForm falsoImput">@Model.NRP</p>
                        </div>
                    }
                    @if (Model.IDPUESTONavigation != null && mostrarPuesto == true)
                    {
                        <div class="col-4 formatoCampos">
                            <label class="tituloLbl">Puesto:</label>
                            <p class="inputForm falsoImput">@Model.IDPUESTONavigation.DESPUESCOM</p>
                        </div>
                    }
                    @if (mostrarTramo == true)
                    {
                        <div class="col-2 formatoCampos">
                            <label class="tituloLbl">Tramo<span style="color:red">*</span>:</label>
                            <InputSelect @bind-Value="IDTRAMOACTUAL" class="inputForm">

                                @foreach (var solicitud in TramosComp)
                                {
                                    <option value="@solicitud.IDENUMERACION">@solicitud.DESCRIPCION</option>
                                }
                            </InputSelect>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDTRAMOACTUAL))</div>
                        </div>
                    }
                    @if (mostrarTipPer == true)
                    {
                        <div class="col-2 formatoCampos">
                            <label class="tituloLbl">Clase Personal<span style="color:red">*</span>:</label>
                            <InputSelect @bind-Value="IDTIPOPERSONALACT" class="inputForm">
                                @foreach (var solicitud in TiposPersonal)
                                {
                                    <option value="@solicitud.IDTIPO">@solicitud.DESCRIPCION</option>
                                }
                            </InputSelect>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDTIPOPERSONALACT))</div>
                        </div>
                    }
                    @if (mostrarNivel == true)
                    {
                        <div class="col-2 formatoCampos">
                            <label class="tituloLbl">Nivel<span style="color:red">*</span>:</label>
                            <InputSelect @bind-Value="NIVELACTUAL" class="inputForm">
                                @foreach (var solicitud in Niveles)
                                {
                                    <option value="@solicitud.IDNIVEL">@solicitud.DESCRIPCION</option>
                                }
                            </InputSelect>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(NIVELACTUAL))</div>
                        </div>
                    }
                    @if (mostrarPuestosDisp == true)
                    {
                        <div class="col-8 formatoCampos">
                            <label class="tituloLbl">Puestos Libres<span style="color:red">*</span>:</label>

                            <style>
                                .dropdown-list {
                                    position: absolute;
                                    width: 100%; /* Se ajusta al ancho del contenedor */
                                    max-height: 300px; /* Altura máxima con scroll si hay muchos elementos */
                                    overflow-y: auto; /* Muestra barra de scroll vertical */
                                    background: #fff;
                                    border: 1px solid #ccc;
                                    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);
                                    margin-top: 10px;
                                    z-index: 10;
                                }

                                .dropdown-item {
                                    padding: 8px 12px;
                                    cursor: pointer;
                                    white-space: normal; /* Permite que el texto se ajuste */
                                    border-bottom: 1px solid #ccc; /* Línea de separación */
                                }

                                    .dropdown-item:last-child {
                                        border-bottom: none; /* Quita la línea de separación en el último elemento */
                                    }

                                    .dropdown-item:hover {
                                        background-color: dodgerblue;
                                        color: #fff;
                                    }
                            </style>

                            <div class="col-12">
                                <input @bind="filterText" @bind:event="oninput" @onfocus="ShowDropdown" @onblur="HideDropdownAfterDelay"
                                       placeholder="Seleccione un puesto" class="inputForm col-12" />

                                @if (showDropdown)
                                {
                                    <div class="dropdown-list">
                                        @foreach (var puesto in FiltrarPuestos(PuestoDisp, filterText))
                                        {
                                            <div class="dropdown-item" @onclick="() => SelectPuesto(puesto)">
                                                @((MarkupString)puesto.DESPUESCOM
                                                    .Replace("Código:", "<strong>Código:</strong>")
                                                    .Replace(" Departamento:", "<span style='margin-left:20px;'><strong>Departamento:</strong></span>")
                                                    .Replace(" Puesto:", "<span style='margin-left:20px;'><strong>Puesto:</strong></span>"))
                                            </div>

                                        }
                                    </div>
                                }


                            </div>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDPUESTOACTUAL))</div>

                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDPUESTOACTUAL))</div>
                        </div>
                    }
                    @if (mostrarCaracter == true)
                    {
                        <div class="col-2 formatoCampos">
                            <label class="tituloLbl">Carácter Ocupación<span style="color:red">*</span>:</label>
                            <InputSelect @bind-Value="IDOCUPACIONACTUAL" class="inputForm">
                                @foreach (var solicitud in Ocupaciones)
                                {
                                    <option value="@solicitud.IDOCUPACION">@solicitud.DESCRIPCION</option>
                                }
                            </InputSelect>
                            <div class="validation-message">@GetExternalValidationMessage(nameof(IDOCUPACIONACTUAL))</div>
                        </div>
                    }
                 
                    <div class="col-4 formatoCampos">
                        <label class="tituloLbl">Observaciones:</label>
                        <InputText @bind-Value="Model.OBSERVACIONES" class="inputForm"></InputText>
                    </div>
                </div>

            </div>
        </EditForm>
        @if (nueva == false)
        {
            <div class="mt-2">
                <input type="button" class="btnOAAFAzul" value="Nueva linea de vida administrativa" @onclick="abrirAnadirLineaVida" />
            </div>
        }
        @if (listLineasVida.Count > 0)
        {
            <Grid TItem="LINEASVIDAADMINISTRATIVA"
                  Class="table tablaRegPers"
                  Data="listLineasVida"
                  AllowFiltering="false"
                  PageSize="10"
                  AllowPaging="true"
                  AllowSorting="true"
                  EmptyText="No se han encontrado datos"
                  Height="100"
                  PageSizeSelectorVisible="false"
                  PageSizeSelectorItems="@(new int[] { 5,10,20,50 })"
                  Responsive="true"
                  PaginationItemsTextFormat="{0} - {1} de {2} elementos">

                <GridColumns>
                    <GridColumn TItem="LINEASVIDAADMINISTRATIVA" HeaderText="Código" PropertyName="IDLINEAVIDAADMIN">
                        @context.IDLINEAVIDAADMIN
                    </GridColumn>
                    <GridColumn TItem="LINEASVIDAADMINISTRATIVA" HeaderText="Descripción" PropertyName="DESCRIPCION">

                        <a href="@urlFich(context.IDLINEAVIDAADMIN)" target="_blank"> @context.DESCRIPCION</a>

                    </GridColumn>
                    <GridColumn TItem="LINEASVIDAADMINISTRATIVA" HeaderText="Tipo Documento" PropertyName="IDTIPONavigation.DESCRIPCION">
                        @if (context?.IDTIPONavigation != null)
                        {
                            @context.IDTIPONavigation.DESCRIPCION
                        }
                        else
                        {
                            <em>No disponible</em>
                        }
                    </GridColumn>
                @*     <GridColumn TItem="LINEASVIDAADMINISTRATIVA" HeaderText="Fecha" PropertyName="FECHASUBIDA">
                        @context.FECHASUBIDA?.ToString("dd/MM/yyyy")
                    </GridColumn> *@
                           
                    <GridColumn TItem="LINEASVIDAADMINISTRATIVA" HeaderText="">
                        <span @onclick="@(() => abrirEditarLineaVida(context))" style="cursor: pointer;">
                <Icon CustomIconName="fas fa-edit"></Icon>
                </span>
               @*  <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" style="cursor: pointer;">
                <Icon CustomIconName="fas fa-trash"></Icon>
                </span> *@
                </GridColumn>
                </GridColumns>


            </Grid>
        }
    </div>
</div>
@code {
    private bool showDropdown { get; set; }
    private string filterText { get; set; } = "";
    private AutoComplete<PUESTOS> autoCompleteRef { get; set; } = new AutoComplete<PUESTOS>();
    [Parameter]
    public bool mostrar { get; set; } = true;
    public int va { get; set; }
    public string uv { get; set; } = "";
    public string inicializarAuto = "";
    private bool nueva = false;
    private bool mostrarMensajeCuerpo = false;
    private bool mostrarMensajeEliminar = false;
    private bool mostrarAnadirLineaVida = false;
    private bool mostrarEditarLineaVida = false;
    private string usuarioVida { get; set; } = "";
    private string DESCRIPCIONLINEAVIDA { get; set; } = "";
    private string DESCRIPCIONLINEAVIDAED { get; set; } = "";
    private string LINKPERSONA { get; set; } = "";
    private int? IDTIPODOCU { get; set; }
    private int? IDTIPODOCUED { get; set; }
    private int? EsExterno { get; set; }
    private int idVidaActual { get; set; }
    private int idUsuActual { get; set; }

    private bool mostrarNRP = true;
    private bool mostrarPuesto = true;
    private bool mostrarAdscripcion = true;

    private bool mostrarTramo = false;
    private bool mostrarNivel = false;
    private bool mostrarPuestosDisp = false;
    private bool mostrarCaracter = false;
    private bool mostrarTipPer = false;

    public LINEASVIDAADMINISTRATIVA lineaEditada { get; set; } = new LINEASVIDAADMINISTRATIVA();
    public VIDA_ADMINISTRATIVA Model = new VIDA_ADMINISTRATIVA();
    public bdAntifraude.db.PUESTOS Puesto = new PUESTOS();
    public bdAntifraude.db.PUESTOS puestoElegido { get; set; }

    private List<PUESTOS> PuestoDisp = new List<PUESTOS>();
    // private List<PUESTOS> PuestoVac = new List<PUESTOS>();
    private List<OCUPACION> Ocupaciones = new List<OCUPACION>();
    private List<TIPOAPTOSADMINISTRATIVOS> TiposActos = new List<TIPOAPTOSADMINISTRATIVOS>();
    private List<NIVEL> Niveles = new List<NIVEL>();
    private List<ENUMERACIONES> TramosComp = new List<ENUMERACIONES>();
    private List<TIPOS_PERSONAL> TiposPersonal = new List<TIPOS_PERSONAL>();
    private List<MOTIVOS_ADMINISTRATIVOS> listMotivos = new List<MOTIVOS_ADMINISTRATIVOS>();
    private List<ENUMERACIONES> listTramos = new List<ENUMERACIONES>();
    private List<SERVICIOS> listServicios = new List<SERVICIOS>();
    private List<UNIDADADMINISTRATIVA> listUnidadAdministrativa = new List<UNIDADADMINISTRATIVA>();
    private List<LINEASVIDAADMINISTRATIVA> listLineasVida = new List<LINEASVIDAADMINISTRATIVA>();
    private List<DOTACION> listDotacion = new List<DOTACION>();
    private List<ENUMERACIONES> listTipoDocu = new List<ENUMERACIONES>();
    private List<bdAntifraude.db.PUESTOS> puestosdelapersona = new List<bdAntifraude.db.PUESTOS>();

    private string Base64File { get; set; } = ""; // Para almacenar el archivo convertido
    private string Base64FileEd { get; set; } = ""; // Para almacenar el archivo convertido
    private string FileName { get; set; } = ""; // Para almacenar el nombre del archivo

    private bdAntifraude.db.RPT RPTACTUAL { get; set; } = new bdAntifraude.db.RPT();
    private bdAntifraude.db.PERSONAS Persona { get; set; } = new PERSONAS();
    private int IDAPTOACTUAL { get; set; }
    private int IDTIPOPERSONALACT { get; set; }
    private int IDMOTIVOACTUAL { get; set; }
    private int IDTRAMOACTUAL { get; set; }
    private int IDOCUPACIONACTUAL { get; set; }
    private int NIVELACTUAL { get; set; }
    private int IDSERVICIOACTUAL { get; set; }
    private int IDUNIDADADMINISTRATIVAACTUAL { get; set; }
    private int IDPERSONASLINK { get; set; }
    private int IDPUESTOACTUAL { get; set; }
    private int IDPUESTODISACTUAL { get; set; }
    private string DESMOTIVOACTUAL { get; set; } = "";
    private bool OcupacionDefinitiva { get; set; }
    private bool ocultarBtnBorr { get; set; } = false;
    private HttpClient client { get; set; } = new HttpClient();
    private ExpressionSerializer? serializer { get; set; }
    private ValidationMessageStore? messageStore;
    private EditContext? editContext;

    private int idPuestoSelect { get; set; }

    protected override async Task OnInitializedAsync()
    {
        try
        {
            var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("iv", out var ivValue))
            {
                idVidaActual = Int32.Parse(tsUtilidades.crypt.FEncS(ivValue, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649));

            }
            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("uv", out var uvValue))
            {
                idUsuActual = Int32.Parse(tsUtilidades.crypt.FEncS(uvValue, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649));
            }

            if(idVidaActual != 0){
                ocultarBtnBorr = false;
            }else{
                ocultarBtnBorr = true;
            }

            editContext = new EditContext(Model);
            messageStore = new ValidationMessageStore(editContext);

            // idUsuActual = Int32.Parse(tsUtilidades.crypt.FEncS(usuVida, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649));
            // idVidaActual = Int32.Parse(tsUtilidades.crypt.FEncS(viAd, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649));
            var token = UserState.Token;
            if (string.IsNullOrEmpty(token))
            {
                Console.WriteLine("Token no encontrado en las cookies.");
                return;
            }
            client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger());
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());

            /*TRAMOS*/

            Expression<Func<ENUMERACIONES, bool>> filtro = x =>
            x.IDGRUPOENUMERACIONNavigation!.GRUPO == "TRAMCOMCARR";
            var serializedExpression = serializer.SerializeText(filtro);
            var tramosjsonContent = JsonConvert.SerializeObject(new { Expression = serializedExpression });
            var tramoscontent = new StringContent(tramosjsonContent, Encoding.UTF8, "application/json");
            var tramosresponse = await client.PostAsync("/api/ENUMERACIONES/filtrar", tramoscontent);
            var tramCont = await tramosresponse.Content.ReadAsStringAsync();
            TramosComp = JsonConvert.DeserializeObject<List<ENUMERACIONES>>(tramCont) ?? new List<ENUMERACIONES>();
            TramosComp = TramosComp.OrderBy(x => x.ORDEN).ToList() ?? new List<ENUMERACIONES>();

            /*TIPOS DOCUMENTO*/

            Expression<Func<ENUMERACIONES, bool>> filtroTD = x =>
            x.CODIGO!.Contains("TFVA.");
            var TDExpression = serializer.SerializeText(filtroTD);
            var TDjsonContent = JsonConvert.SerializeObject(new { Expression = TDExpression });
            var TDcontent = new StringContent(TDjsonContent, Encoding.UTF8, "application/json");
            var TDresponse = await client.PostAsync("/api/ENUMERACIONES/filtrar", TDcontent);
            var TDCont = await TDresponse.Content.ReadAsStringAsync();
            listTipoDocu = JsonConvert.DeserializeObject<List<ENUMERACIONES>>(TDCont) ?? new List<ENUMERACIONES>();
            listTipoDocu = listTipoDocu.OrderBy(x => x.ORDEN).ToList() ?? new List<ENUMERACIONES>();

            /*ACTOS ADMINISTRATIVOS*/

            var TiApAd = await client.GetAsync("/api/TIPOAPTOSADMINISTRATIVOS");
            var TiApAdContent = await TiApAd.Content.ReadAsStringAsync();
            if (TiApAd.IsSuccessStatusCode) { TiposActos = JsonConvert.DeserializeObject<List<TIPOAPTOSADMINISTRATIVOS>>(TiApAdContent) ?? new List<TIPOAPTOSADMINISTRATIVOS>(); }
            TiposActos = TiposActos.OrderBy(x => x.DESCRIPCION).ToList() ?? new List<TIPOAPTOSADMINISTRATIVOS>();

            /*NIVELES*/

            var niv = await client.GetAsync("/api/NIVEL");
            var nivContent = await niv.Content.ReadAsStringAsync();
            if (niv.IsSuccessStatusCode) { Niveles = JsonConvert.DeserializeObject<List<NIVEL>>(nivContent) ?? new List<NIVEL>(); }
            Niveles = Niveles.OrderBy(x => x.DESCRIPCION).ToList();

            /*DOTACION*/

            var dot = await client.GetAsync("/api/DOTACION");
            var dotContent = await dot.Content.ReadAsStringAsync();
            if (dot.IsSuccessStatusCode) { listDotacion = JsonConvert.DeserializeObject<List<DOTACION>>(dotContent) ?? new List<DOTACION>(); }
            listDotacion = listDotacion.OrderBy(x => x.DOTACION1).ToList() ?? new List<DOTACION>();

            /*OCUPACIONES*/

            var ocu = await client.GetAsync("/api/OCUPACION");
            var ocuContent = await ocu.Content.ReadAsStringAsync();
            if (ocu.IsSuccessStatusCode) { Ocupaciones = JsonConvert.DeserializeObject<List<OCUPACION>>(ocuContent) ?? new List<OCUPACION>(); }
            Ocupaciones = Ocupaciones.OrderBy(x => x.DESCRIPCION).ToList() ?? new List<OCUPACION>();

            /*TIPOS PERSONAS*/

            var tiPe = await client.GetAsync("/api/TIPOS_PERSONAL");
            var tiPeContent = await tiPe.Content.ReadAsStringAsync();
            if (tiPe.IsSuccessStatusCode) { TiposPersonal = JsonConvert.DeserializeObject<List<TIPOS_PERSONAL>>(tiPeContent) ?? new List<TIPOS_PERSONAL>(); }
            TiposPersonal = TiposPersonal.OrderBy(x => x.DESCRIPCION).ToList() ?? new List<TIPOS_PERSONAL>();

            /*UNIDAD ADMINISTRATIVA*/

            var UniAdm = await client.GetAsync("/api/UNIDADADMINISTRATIVA");
            var UniAdmContent = await UniAdm.Content.ReadAsStringAsync();
            if (UniAdm.IsSuccessStatusCode) { listUnidadAdministrativa = JsonConvert.DeserializeObject<List<UNIDADADMINISTRATIVA>>(UniAdmContent) ?? new List<UNIDADADMINISTRATIVA>(); }
            listUnidadAdministrativa = listUnidadAdministrativa.OrderBy(x => x.ORDEN).ToList() ?? new List<UNIDADADMINISTRATIVA>();

            /*SERVICIOS*/

            var serv = await client.GetAsync("/api/SERVICIOS");
            var servContent = await serv.Content.ReadAsStringAsync();
            if (serv.IsSuccessStatusCode) { listServicios = JsonConvert.DeserializeObject<List<SERVICIOS>>(servContent) ?? new List<SERVICIOS>(); }
            listServicios = listServicios.OrderBy(x => x.ORDEN).ToList() ?? new List<SERVICIOS>();

            /**/
            /*SITUACION ACTUAL*/

            Expression<Func<ENUMERACIONES, bool>> filtroSitu = x =>
                  x.CODIGO == "SITRPTMAESTRO.ACT";
            var SituExpression = serializer.SerializeText(filtroSitu);
            var SitujsonContent = JsonConvert.SerializeObject(new { Expression = SituExpression });
            var Situcontent = new StringContent(SitujsonContent, Encoding.UTF8, "application/json");
            var Situresponse = await client.PostAsync("/api/ENUMERACIONES/filtrar", Situcontent);
            var SituCont = await Situresponse.Content.ReadAsStringAsync();
            List<ENUMERACIONES> situacionActual = JsonConvert.DeserializeObject<List<ENUMERACIONES>>(SituCont) ?? new List<ENUMERACIONES>();
            int idSituAct = situacionActual.First().IDENUMERACION;

            /*RPT ACTUAL*/

            Expression<Func<bdAntifraude.db.RPT, bool>> filtroRPT = x =>
                 x.IDSITUACIONNavigation!.IDENUMERACION == idSituAct;

            var RPTExpression = serializer.SerializeText(filtroRPT);
            var RPTjsonContent = JsonConvert.SerializeObject(new { Expression = RPTExpression });
            var RPTcontent = new StringContent(RPTjsonContent, Encoding.UTF8, "application/json");
            var RPTresponse = await client.PostAsync("/api/RPT/filtrar", RPTcontent);
            var RPTCont = await RPTresponse.Content.ReadAsStringAsync();
            RPTACTUAL = JsonConvert.DeserializeObject<List<bdAntifraude.db.RPT>>(RPTCont)?.First() ?? new bdAntifraude.db.RPT();

            /*PUESTOS DISPONIBLES*/

            int IDRPT1 = RPTACTUAL.IDRPT;
            Expression<Func<PUESTOS, bool>> filtroPue = x => x.IDRPTNavigation != null && x.IDRPTNavigation.IDRPT == IDRPT1 && x.IDPERSONAL == null;
            var PueExpression = serializer.SerializeText(filtroPue);
            var PuejsonContent = JsonConvert.SerializeObject(new { Expression = PueExpression });
            var Puecontent = new StringContent(PuejsonContent, Encoding.UTF8, "application/json");
            var Pueresponse = await client.PostAsync("/api/PUESTOS/getActivos", Puecontent);
            var PueCont = await Pueresponse.Content.ReadAsStringAsync();
            if (!Pueresponse.IsSuccessStatusCode)
            {
                Console.WriteLine($"Error al obtener PUESTOS: {Pueresponse.StatusCode}, {PueCont}");
                return;
            }
            PuestoDisp = JsonConvert.DeserializeObject<List<PUESTOS>>(PueCont) ?? new List<PUESTOS>();
            PuestoDisp = PuestoDisp.OrderBy(x => x.ORDEN).ToList();
            // puestosdelapersona = PuestoDisp.Where(x => x.IDPERSONALNavigation?.IDPERSONA == idUsuActual).ToList();



            if (idVidaActual != 0)
            {

                mostrarPuesto = true;
                mostrarPuestosDisp = false;
                var response = await client.GetAsync("/api/VIDA_ADMINISTRATIVA/" + idVidaActual.ToString());
                var ResponseContent = await response.Content.ReadAsStringAsync();
                if (response.IsSuccessStatusCode)
                {
                    Model = JsonConvert.DeserializeObject<VIDA_ADMINISTRATIVA>(ResponseContent) ?? new VIDA_ADMINISTRATIVA();
                    IDAPTOACTUAL = Model.IDMOTIVONavigation!.IDTIPOAPTOSNavigation!.IDTIPO;
                    IDMOTIVOACTUAL = Model.IDMOTIVONavigation.IDMOTIVO;
                    DESMOTIVOACTUAL = Model.IDMOTIVONavigation!.DESCRIPCION!;

                    if (Model.IDTIPOPERSONALNavigation is not null) { IDTIPOPERSONALACT = Model.IDTIPOPERSONALNavigation.IDTIPO; }
                    if (Model.NIVEL_OLDNavigation is not null) { NIVELACTUAL = Model!.NIVEL_OLDNavigation.IDNIVEL; }
                    IDSERVICIOACTUAL = Model!.IDSERVICIOADSCRITONavigation is null ? 0 : Model!.IDSERVICIOADSCRITONavigation.IDSERVICIO;
                    IDUNIDADADMINISTRATIVAACTUAL = Model!.IDUNIDADADMINISTRATIVANavigation is null ? 0 : Model!.IDUNIDADADMINISTRATIVANavigation.IDUNIDADADMINISTRATIVA;
                    // PUESTOACTUAL = Model.IDPUESTONavigation
                    if (Model.IDTRAMOCARRERAHORIZONTALNavigation is null) { IDTRAMOACTUAL = 0; }
                    else { IDTRAMOACTUAL = Model.IDTRAMOCARRERAHORIZONTALNavigation.IDENUMERACION; }
                    usuarioVida = Model.IDPERSONALNavigation!.APELLIDOS + "," + Model.IDPERSONALNavigation.NOMBRE;
                    IDPERSONASLINK = Model.IDPERSONALNavigation.IDPERSONA;
                    usuarioVida = Model.IDPERSONALNavigation.APELLIDOS + ", " + Model.IDPERSONALNavigation.NOMBRE;
                    Persona = Model.IDPERSONALNavigation;
                    LINKPERSONA = "/infoPersonas?cl=" + tsUtilidades.crypt.FEncS(Persona.NIF, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
                }


                /*MOTIVOS*/

                var idApto = IDAPTOACTUAL;
                Expression<Func<MOTIVOS_ADMINISTRATIVOS, bool>> filtroMot = x =>
                x.IDTIPOAPTOSNavigation!.IDTIPO == idApto;
                var MotExpression = serializer.SerializeText(filtroMot);
                var MotjsonContent = JsonConvert.SerializeObject(new { Expression = MotExpression });
                var Motivoscontent = new StringContent(MotjsonContent, Encoding.UTF8, "application/json");
                var Motivosresponse = await client.PostAsync("/api/MOTIVOS_ADMINISTRATIVOS/filtrar", Motivoscontent);
                var MotCont = await Motivosresponse.Content.ReadAsStringAsync();
                listMotivos = JsonConvert.DeserializeObject<List<MOTIVOS_ADMINISTRATIVOS>>(MotCont) ?? new List<MOTIVOS_ADMINISTRATIVOS>();
                listMotivos = listMotivos.OrderBy(x => x.DESCRIPCION).ToList();


                cargarGridLineas();

            }
            else
            {
                if (usuarioVida != null)
                {
                    nueva = true;
                    /*PERSONA*/
                    var usu = idUsuActual;
                    Expression<Func<PERSONAS, bool>> filtroPer = x =>
                    x.IDPERSONA == usu;
                    var PerExpression = serializer.SerializeText(filtroPer);
                    var PerjsonContent = JsonConvert.SerializeObject(new { Expression = PerExpression });
                    var Percontent = new StringContent(PerjsonContent, Encoding.UTF8, "application/json");
                    var Perresponse = await client.PostAsync("/api/PERSONAS/getPersonaVidaAdm", Percontent);
                    var PerCont = await Perresponse.Content.ReadAsStringAsync();
                    Persona = JsonConvert.DeserializeObject<bdAntifraude.db.PERSONAS>(PerCont) ?? new PERSONAS();
                    LINKPERSONA = "/infoPersonas?cl=" + tsUtilidades.crypt.FEncS(Persona.NIF, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
                    IDPERSONASLINK = Persona.IDPERSONA;
                    Model.NIVEL_OLD = Persona.IDNIVELRPT;
                    /*se tiene que vincular el navigation*/
                    if (Persona.IDGRADOPERSONALCONSOLIDADONavigation != null) { Model.NIVEL_OLD = Persona.IDGRADOPERSONALCONSOLIDADO; }
                    // Model.NRP = Persona.NRP;
                    Model.IDPERSONAL = Persona.IDPERSONA;
                    usuarioVida = Persona.APELLIDOS + ", " + Persona.NOMBRE;
                    IDPERSONASLINK = Persona.IDPERSONA;
                    mostrarPuesto = false;
                    mostrarNRP = false;
                    EsExterno = Persona.EXTERNO;
                    Expression<Func<PUESTOS, bool>> filP = x => x.IDPERSONAL == Persona.IDPERSONA;
                    var PEx = serializer.SerializeText(filP);
                    var Pjson = JsonConvert.SerializeObject(new { Expression = PEx });
                    var Pcontent = new StringContent(Pjson, Encoding.UTF8, "application/json");
                    var Presponse = await client.PostAsync("/api/PUESTOS/getActivos", Pcontent);
                    var PCont = await Presponse.Content.ReadAsStringAsync();
                    List<bdAntifraude.db.PUESTOS> lpue = JsonConvert.DeserializeObject<List<PUESTOS>>(PCont) ?? new List<PUESTOS>();
                    if (lpue.Count > 0)
                    {
                        IDPUESTOACTUAL = lpue.First().IDPUESTO;
                    }
                    else
                    {
                        IDPUESTOACTUAL = 0;
                    }



                    /*Meter extension en PERSONAS CAROACTUAL*/

                }
                else
                {
                    Navigation.NavigateTo("/Home");
                }
            }

            /*PUESTO DE LA PERSONA*/

            Expression<Func<PUESTOS, bool>> filtroPuePer = x => x.IDRPTNavigation != null && x.IDRPTNavigation.IDRPT == IDRPT1 && (x.IDPERSONAL == Persona.IDPERSONA || x.TITULAR == Persona.IDPERSONA);
            var PuePerExpression = serializer.SerializeText(filtroPuePer);
            var PuePerjsonContent = JsonConvert.SerializeObject(new { Expression = PuePerExpression });
            var PuePercontent = new StringContent(PuePerjsonContent, Encoding.UTF8, "application/json");
            var PuePerresponse = await client.PostAsync("/api/PUESTOS/Filtrar", PuePercontent);
            var PuePerCont = await PuePerresponse.Content.ReadAsStringAsync();
            if (!PuePerresponse.IsSuccessStatusCode)
            {
                Console.WriteLine($"Error al obtener PUESTOS: {PuePerresponse.StatusCode}, {PuePerCont}");
                return;
            }
            puestosdelapersona = JsonConvert.DeserializeObject<List<PUESTOS>>(PuePerCont) ?? new List<PUESTOS>();
            mostrar = false;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");

        }

    }
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(Model, fieldName);

        messageStore?.Clear(field);

        if (fieldName == nameof(IDAPTOACTUAL) && value == "0")
        {
            messageStore?.Add(field, "Seleccione un acto administrativo.");
        }
        if (fieldName == nameof(IDMOTIVOACTUAL) && value == "0")
        {
            messageStore?.Add(field, "Seleccione una causa.");
        }
        if (fieldName == nameof(Model.FECHA) && value == null)
        {
            messageStore?.Add(field, "Se debe introducir una fecha de efecto.");
        }
        if (fieldName == nameof(IDPUESTODISACTUAL) && value == "0")
        {
            messageStore?.Add(field, "Selecciones un puesto disponible");
        }
        if (fieldName == nameof(IDTRAMOACTUAL) && value == "0")
        {
            messageStore?.Add(field, "Selecciones un tramo");
        }
        if (fieldName == nameof(IDTIPOPERSONALACT) && value == "0")
        {
            messageStore?.Add(field, "Selecciones un tipo de personal");
        }
        if (fieldName == nameof(IDOCUPACIONACTUAL) && value == "0")
        {
            messageStore?.Add(field, "Selecciones un caracter de ocupacion");
        }
        editContext?.NotifyValidationStateChanged();
    }
    private void guardarFormulario()
    {
        try
        {
            ValidarTodo();

            if (!editContext!.GetValidationMessages().Any())
            {
                GuardarVida();

                // messages.Add(new ToastMessage
                //     {
                //         Type = ToastType.Primary,
                //         Message = $"Guardado correctamente.",
                //     });
            }
            else
            {
                // messages.Add(new ToastMessage
                //     {
                //         Type = ToastType.Warning,
                //         Message = $"Debe rellenar los campos obligatorios.",
                //     });
            }

        }
        catch (Exception)
        {
            // messages.Add(new ToastMessage
            //     {
            //         Type = ToastType.Danger,
            //         Message = $"Error al guardar.",
            //     });
        }

    }
    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = IDAPTOACTUAL }, nameof(IDAPTOACTUAL));
        ValidarYActualizar(new ChangeEventArgs { Value = IDMOTIVOACTUAL }, nameof(IDMOTIVOACTUAL));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.FECHA }, nameof(Model.FECHA));
        if (mostrarPuestosDisp == true)
        {
            ValidarYActualizar(new ChangeEventArgs { Value = IDPUESTODISACTUAL }, nameof(IDPUESTODISACTUAL));
        }
        if (mostrarTramo == true)
        {
            ValidarYActualizar(new ChangeEventArgs { Value = IDTRAMOACTUAL }, nameof(IDTRAMOACTUAL));
        }
        if (mostrarTipPer == true)
        {
            ValidarYActualizar(new ChangeEventArgs { Value = IDTIPOPERSONALACT }, nameof(IDTIPOPERSONALACT));
        }
        if (mostrarCaracter == true)
        {
            ValidarYActualizar(new ChangeEventArgs { Value = IDOCUPACIONACTUAL }, nameof(IDOCUPACIONACTUAL));
        }

    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field]?.FirstOrDefault() ?? string.Empty;
    }
    protected void OcultarMenCuer() { mostrarMensajeCuerpo = false; }
    protected void OcultarMenElim() { mostrarMensajeEliminar = false; }
    protected void mostrarAvisoEliminar() { mostrarMensajeEliminar = true; }
    protected void abrirAnadirLineaVida() { mostrarAnadirLineaVida = true; }
    protected void abrirEditarLineaVida(LINEASVIDAADMINISTRATIVA linea) { mostrarEditarLineaVida = true; lineaEditada = linea; DESCRIPCIONLINEAVIDAED = linea.DESCRIPCION; IDTIPODOCUED = linea.IDTIPO; }
    protected void cerrarAnadirLineaVida() { mostrarAnadirLineaVida = false; }
    protected void cerrarEditarLineaVida() { mostrarEditarLineaVida = false; }
    protected void volver() { Navigation.NavigateTo(LINKPERSONA, forceLoad: true); }
    protected string urlFich(int id)
    {
        return "/Ficheros?tip=VerLVA&id=" + id.ToString();
    }
    protected async Task<AutoCompleteDataProviderResult<bdAntifraude.db.PUESTOS>> CargarPuestos(AutoCompleteDataProviderRequest<bdAntifraude.db.PUESTOS> request)
    {

        var token = UserState.Token;
        var client = HttpClientFactory.CreateClient();
        client.BaseAddress = new Uri(Utilidades.urlSwagger());
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
        int IDRPT1 = RPTACTUAL.IDRPT;
        Expression<Func<PUESTOS, bool>> filtroPue = x => x.IDRPTNavigation != null && x.IDRPTNavigation.IDRPT == IDRPT1;
        var PueExpression = serializer.SerializeText(filtroPue);
        var PuejsonContent = JsonConvert.SerializeObject(new { Expression = PueExpression });
        var Puecontent = new StringContent(PuejsonContent, Encoding.UTF8, "application/json");
        var Pueresponse = await client.PostAsync("/api/PUESTOS/getActivos", Puecontent);
        var PueCont = await Pueresponse.Content.ReadAsStringAsync();

        PuestoDisp = JsonConvert.DeserializeObject<List<PUESTOS>>(PueCont) ?? new List<PUESTOS>();

        return await Task.FromResult(request.ApplyTo(PuestoDisp));

    }
    protected async void CargarMotivos()
    {
        var idApto = IDAPTOACTUAL;
        TIPOAPTOSADMINISTRATIVOS actoActual = TiposActos.FirstOrDefault(x => x.IDTIPO == IDAPTOACTUAL) ?? new TIPOAPTOSADMINISTRATIVOS();
        var token = UserState.Token;
        var client = HttpClientFactory.CreateClient();
        client.BaseAddress = new Uri(Utilidades.urlSwagger());
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        Expression<Func<MOTIVOS_ADMINISTRATIVOS, bool>> filtro = x =>
                  x.IDTIPOAPTOSNavigation!.IDTIPO == idApto;

        var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());

        var serializedExpression = serializer.SerializeText(filtro);
        var tramosjsonContent = JsonConvert.SerializeObject(new { Expression = serializedExpression });
        var Motivoscontent = new StringContent(tramosjsonContent, Encoding.UTF8, "application/json");
        var Motivosresponse = await client.PostAsync("/api/MOTIVOS_ADMINISTRATIVOS/filtrar", Motivoscontent);
        var MotCont = await Motivosresponse.Content.ReadAsStringAsync();
        listMotivos = JsonConvert.DeserializeObject<List<MOTIVOS_ADMINISTRATIVOS>>(MotCont) ?? new List<MOTIVOS_ADMINISTRATIVOS>();
        listMotivos = listMotivos.OrderBy(x => x.DESCRIPCION).ToList();

        if (actoActual.DESCRIPCION == "CONSOLIDACIÓN DE GRADO") { mostrarNivel = true; } else { mostrarNivel = false; }
        if (actoActual.DESCRIPCION == "RECONOCIMIENTO TRAMO CARRERA HORIZONTAL") { mostrarTramo = true; } else { mostrarTramo = false; }
        if (actoActual.DESCRIPCION == "TOMA POSESION") { mostrarCaracter = true; mostrarTipPer = true; mostrarPuestosDisp = true; } else { mostrarCaracter = false; mostrarTipPer = false; mostrarPuestosDisp = false; }

        if (listMotivos.Count > 0)
        {
            IDMOTIVOACTUAL = listMotivos.First().IDMOTIVO;
        }
        StateHasChanged();

    }
    protected async void AnadirLineaVida()
    {
        LINEASVIDAADMINISTRATIVA VA = new LINEASVIDAADMINISTRATIVA();
        VA.IDTIPO = IDTIPODOCU;
        VA.FECHASUBIDA = DateTime.Now;
        VA.DESCRIPCION = DESCRIPCIONLINEAVIDA;
        VA.IDVIDAADMIN = idVidaActual;
        var VACreada = await Utilidades.NuevoObjeto<LINEASVIDAADMINISTRATIVA>(client, "/api/LINEASVIDAADMINISTRATIVA", VA);

        if (Base64File is not null)
        {
            var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
            string ruta = "lineaVidaAdministrativa/" + VACreada.IDLINEAVIDAADMIN.ToString() + ".pdf";
            var fichTrans = new AlmacenaFicheroAtransmitir();
            fichTrans.IdRegistro = VACreada.IDLINEAVIDAADMIN;
            fichTrans.Tabla = "LINEAVIDAADMINISTRATIVA";
            fichTrans.Fichero = Base64File;
            var jsonConsulta = JsonConvert.SerializeObject(fichTrans);
            var content = new StringContent(jsonConsulta, Encoding.UTF8, "application/json");
            var ficherotrans = await client.PostAsync("/api/Almacenamiento/almacenar-fichero", content);
            var fichContent = await ficherotrans.Content.ReadAsStringAsync();
            VACreada.RUTA = ruta;
            VACreada = await Utilidades.ActualizarObjeto<LINEASVIDAADMINISTRATIVA>(client, "/api/LINEASVIDAADMINISTRATIVA/" + VACreada.IDLINEAVIDAADMIN, VACreada);
        }

        ENUMERACIONES tipoDocu = listTipoDocu.FirstOrDefault(x => x.IDENUMERACION == IDTIPODOCU) ?? new ENUMERACIONES();
        if (tipoDocu.DESCRIPCION == "RECONOCIMIENTO DE TRIENIOS/ANTIGÜEDAD") /* && (Persona.EXTERNO is not null && Persona.EXTERNO == 0) || (Persona.EXTERNO == 1 && Persona.CAROCUACTUAL.ToUpper().Contains("DEFINITIVO"))) */
        {
            if (Persona.FECHACUMPLIMIENTOPROXTRIENIO is not null) { Persona.FECHACUMPLIMIENTOPROXTRIENIO = Persona.FECHACUMPLIMIENTOPROXTRIENIO.Value.AddYears(3); }
            else { Persona.FECHACUMPLIMIENTOPROXTRIENIO = Model.FECHA!.Value.AddYears(3); }

            if (Persona?.IDADSCRIPCIONRPTNavigation?.DESCRIPCION?.ToUpper() == "LABORAL")
            {
                switch (Persona?.IDGRUPOFUNCIONARIONavigation?.DESCRIPCION)
                {
                    case "A1":
                        Model.GRUPOTNavigation!.GRUPO1 = "I";
                        break;
                    case "A2":
                        Model.GRUPOTNavigation!.GRUPO1 = "II";
                        break;
                    case "C1":
                        Model.GRUPOTNavigation!.GRUPO1 = "III";
                        break;
                    case "C2":
                        Model.GRUPOTNavigation!.GRUPO1 = "IV";
                        break;
                    case "E":
                        Model.GRUPOTNavigation!.GRUPO1 = "V";
                        break;
                }
            }
            Expression<Func<TRIENIOS, bool>> filtro = x =>
              x.IDPERSONAL == Persona!.IDPERSONA && x.GRUPO == Model.GRUPOTNavigation!.GRUPO1;
            ;
            List<TRIENIOS> qtry = await Utilidades.ObtenerObjeto<List<TRIENIOS>>(client, "/api/TRIENIOS/filtrar", filtro);

            if (qtry.Count > 0)
            {
                TRIENIOS trienio = qtry.First();
                trienio.TC = trienio.TC + 1;
                var actualizarTrienio = await Utilidades.ActualizarObjeto<TRIENIOS>(client, "/api/TRIENIOS/" + trienio.IDTRIENIO, trienio);
            }
            else
            {
                TRIENIOS trienio = new TRIENIOS();
                trienio.IDPERSONAL = Model.IDPERSONAL;
                trienio.IDGRUPO = Model.GRUPOT;
                trienio.TC = 1;
                var actualizarTrienio = await Utilidades.NuevoObjeto<TRIENIOS>(client, "/api/TRIENIOS", trienio);
            }
            var actualizarPer = await Utilidades.ActualizarObjeto<PERSONAS>(client, "/api/PERSONAS/" + Persona?.IDPERSONA, Persona!);
        }
        if (tipoDocu?.DESCRIPCION?.Trim() == "PROPUESTA DE RECONOCIMIENTO DE GRADO" || tipoDocu?.DESCRIPCION?.Trim() == "RECONOCIMIENTO DE GRADO")
        {
            if (Persona?.FECHACONSOLIDACIONGRADO < Model.FECHA)
            {
                Persona!.IDGRADOPERSONALCONSOLIDADO = Model.NIVELC;
                Persona.FECHACONSOLIDACIONGRADO = Model.FECHA;
            }

            CONSOLIDACION_GRADO ComGra = new CONSOLIDACION_GRADO();
            ComGra.NIVEL = int.Parse(Model.NIVEL_OLDNavigation!.NIVEL1!);
            ComGra.IDNIVEL = Model.NIVELC;
            ComGra.IDPERSONAL = Model.IDPERSONAL;
            ComGra.FECHA_EFECTO = Model.FECHA;
            ComGra.FECHA_RESOLUCION = Model.FECHARESOLUCION;
            var actualizarPer = await Utilidades.ActualizarObjeto<PERSONAS>(client, "/api/PERSONAS/" + Persona.IDPERSONA, Persona);
            var crearComGra = await Utilidades.NuevoObjeto<CONSOLIDACION_GRADO>(client, "/api/CONSOLIDACION_GRADO", ComGra);
        }
        if (tipoDocu?.DESCRIPCION == "RECONOCIMIENTO DE TRAMO COMPLEMENTO DE CARRERA")
        {
            Expression<Func<COMPLEMENTOSCARRERA, bool>> filtroComCar = x =>
            x.IDPERSONA == Persona!.IDPERSONA;
            List<COMPLEMENTOSCARRERA> TraComCarr = await Utilidades.ObtenerObjeto<List<COMPLEMENTOSCARRERA>>(client, "/api/COMPLEMENTOSCARRERA/filtrar", filtroComCar);
            TraComCarr = TraComCarr.OrderByDescending(x => x.FECHAINICIO).ToList();
            if (TraComCarr.Count > 0)
            {
                COMPLEMENTOSCARRERA comCarAct = TraComCarr.Where(x => x.FECHAFIN is null).First();
                comCarAct.FECHAFIN = Model.FECHA!.Value.AddDays(-1);
                var actualizarComCarAct = await Utilidades.ActualizarObjeto<COMPLEMENTOSCARRERA>(client, "/api/COMPLEMENTOSCARRERA/" + comCarAct.IDCOMCARR, comCarAct);
            }
            COMPLEMENTOSCARRERA ComCarr = new COMPLEMENTOSCARRERA();
            ComCarr.IDPERSONA = Model.IDPERSONAL;
            ComCarr.IDGRUPO = Model.GRUPOT;
            ComCarr.IDTRAMO = Model.IDTRAMOCARRERAHORIZONTAL;
            ComCarr.FECHAINICIO = Model.FECHA;
            var actualizarComCar = await Utilidades.NuevoObjeto<COMPLEMENTOSCARRERA>(client, "/api/COMPLEMENTOSCARRERA", ComCarr);
        }
        if (tipoDocu?.DESCRIPCION == "TOMA DE POSESION")
        {
            Expression<Func<VIDA_ADMINISTRATIVA, bool>> filtroPrimTomaPos = x =>
            x.IDMOTIVONavigation!.IDTIPOAPTOSNavigation!.IDTIPO == Model.IDMOTIVONavigation!.IDTIPOAPTOSNavigation!.IDTIPO && x.IDPERSONAL == Persona!.IDPERSONA;
            List<VIDA_ADMINISTRATIVA> PrimeraTomaPosesion = await Utilidades.ObtenerObjeto<List<VIDA_ADMINISTRATIVA>>(client, "/api/VIDA_ADMINISTRATIVA/filtrar", filtroPrimTomaPos);
            if (PrimeraTomaPosesion.Count == 1)
            {
                Persona!.FECHAALTA = Model.FECHA;
                Persona.FECHAALTAPAR = Model.FECHA;
                var actualizarPer = await Utilidades.ActualizarObjeto<PERSONAS>(client, "/api/PERSONAS/" + Persona.IDPERSONA, Persona);
            }
        }
        if (tipoDocu?.DESCRIPCION.Contains("CESE") == true)
        {
            Expression<Func<PUESTOS, bool>> filtroPuesto = x =>
           x.IDRPT == RPTACTUAL.IDRPT && x.IDPERSONAL == Model.IDPERSONAL;
            List<PUESTOS> listPuestoPers = await Utilidades.ObtenerObjeto<List<PUESTOS>>(client, "/api/PUESTOS/filtrar", filtroPuesto);
            if (listPuestoPers.Count == 1)
            {
                PUESTOS pue = listPuestoPers.First();
                pue.IDPERSONAL = null;
                if ((pue.IDOCUPACIONNavigation?.OCUPACION1 == "DEF" || pue.IDOCUPACIONNavigation?.OCUPACION1 == "FIJO") && Model.CAUSA.Contains("CON RESERVA") == false && Model.CAUSA.Contains("COMISIÓN DE SERVICIOS OTRA INSTITUCIÓN") == false) { pue.TITULAR = null; }
                pue.ESTADO = "L";
                if ((Model.CAUSA.Contains("CON RESERVA") || Model.CAUSA.Trim() == "COMISIÓN DE SERVICIOS OTRA INSTITUCIÓN") && pue.TITULAR is not null && pue.IDPERSONAL == pue.TITULAR) { pue.ESTADO = "V"; }
                // if (pue.IDRPTDESNavigation!.VIRTUAL)
                // {
                //     pue.ESTADO = "P";
                //     Expression<Func<DOTACION, bool>> filtroDot = x =>
                //     x.DOTACION1 == "ND";
                //     List<DOTACION> IDNODOTADAL = await Utilidades.ObtenerObjeto<List<DOTACION>>(client, "/api/DOTACION/filtrar", filtroDot);
                //     pue.IDDOTACION = IDNODOTADAL.First().IDDOTACION;
                // }
                pue.IDOCUPACION = null;
                var actualizarPue = await Utilidades.ActualizarObjeto<PUESTOS>(client, "/api/PUESTOS/" + pue.IDPUESTO, pue);
            }
        }

        cargarGridLineas();
        cerrarAnadirLineaVida();
        StateHasChanged();

    }
    protected async void EditarLineaVida()
    {
        LINEASVIDAADMINISTRATIVA VA = lineaEditada;
        // VA.IDTIPO = IDTIPODOCUED;
        // VA.FECHASUBIDA = DateTime.Now;
        VA.DESCRIPCION = DESCRIPCIONLINEAVIDAED;
        VA.IDVIDAADMIN = idVidaActual;
        var VACreada = await Utilidades.ActualizarObjeto<LINEASVIDAADMINISTRATIVA>(client, "/api/LINEASVIDAADMINISTRATIVA/"+lineaEditada.IDLINEAVIDAADMIN.ToString(), VA);

        if (Base64FileEd is not null && Base64FileEd != "")
        {
            var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
            string ruta = "lineaVidaAdministrativa/" + lineaEditada.IDLINEAVIDAADMIN.ToString() + ".pdf";
            var fichTrans = new AlmacenaFicheroAtransmitir();
            fichTrans.IdRegistro = lineaEditada.IDLINEAVIDAADMIN;
            fichTrans.Tabla = "LINEAVIDAADMINISTRATIVA";
            fichTrans.Fichero = Base64FileEd;
            var jsonConsulta = JsonConvert.SerializeObject(fichTrans);
            var content = new StringContent(jsonConsulta, Encoding.UTF8, "application/json");
            var ficherotrans = await client.PostAsync("/api/Almacenamiento/almacenar-fichero", content);
            var fichContent = await ficherotrans.Content.ReadAsStringAsync();
        }
        cerrarEditarLineaVida();
        StateHasChanged();       

    }
    protected async void modActoAdministrativo()
    {
        var token = UserState.Token;
        var client = HttpClientFactory.CreateClient();
        client.BaseAddress = new Uri(Utilidades.urlSwagger());
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());

        var descripcion = TiposActos?.FirstOrDefault(x => x.IDTIPO == IDAPTOACTUAL)?.DESCRIPCION ?? "";
        if (descripcion == "TOMA POSESION" && nueva == true)
        {
            int IDRPT1 = RPTACTUAL.IDRPT;
            Expression<Func<PUESTOS, bool>> filtroPue = x => x.IDRPTNavigation != null && x.IDRPTNavigation.IDRPT == IDRPT1 && x.ESTADO != null && (x.ESTADO.Trim() == "L" && x.IDPERSONAL != null) || x.ESTADO == "V";
            var PueExpression = serializer.SerializeText(filtroPue);
            var PuejsonContent = JsonConvert.SerializeObject(new { Expression = PueExpression });
            var Puecontent = new StringContent(PuejsonContent, Encoding.UTF8, "application/json");
            var Pueresponse = await client.PostAsync("/api/PUESTOS/getActivos", Puecontent);
            var PueCont = await Pueresponse.Content.ReadAsStringAsync();
            if (!Pueresponse.IsSuccessStatusCode)
            {
                Console.WriteLine($"Error al obtener PUESTOS: {Pueresponse.StatusCode}, {PueCont}");
                return;
            }
            PuestoDisp = JsonConvert.DeserializeObject<List<PUESTOS>>(PueCont) ?? new List<PUESTOS>();
            mostrarPuestosDisp = true;
            mostrarCaracter = true;
            mostrarTipPer = true;
        }
        if (descripcion == "RECONOCIMIENTO TRAMO CARRERA HORIZONTAL" && nueva == true)
        {
            mostrarTramo = true;
        }
        if (descripcion == "CONSOLIDACIÓN DE GRADO" && nueva == true)
        {
            mostrarNivel = true;
        }
    }
    protected async void cargarGridLineas()
    {
        var token = UserState.Token;
        var client = HttpClientFactory.CreateClient();
        client.BaseAddress = new Uri(Utilidades.urlSwagger());
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
        int IDVIDA = Model.IDVIDA;
        Expression<Func<LINEASVIDAADMINISTRATIVA, bool>> filtroPue = x => x.IDVIDAADMIN == IDVIDA;
        var PueExpression = serializer.SerializeText(filtroPue);
        var PuejsonContent = JsonConvert.SerializeObject(new { Expression = PueExpression });
        var Puecontent = new StringContent(PuejsonContent, Encoding.UTF8, "application/json");
        var Pueresponse = await client.PostAsync("/api/LINEASVIDAADMINISTRATIVA/LineasVidaAdminGrid", Puecontent);
        var PueCont = await Pueresponse.Content.ReadAsStringAsync();
        if (!Pueresponse.IsSuccessStatusCode)
        {
            Console.WriteLine($"Error al obtener LINEASVIDAADMINISTRATIVA: {Pueresponse.StatusCode}, {PueCont}");
            return;
        }
        listLineasVida = JsonConvert.DeserializeObject<List<LINEASVIDAADMINISTRATIVA>>(PueCont) ?? new List<LINEASVIDAADMINISTRATIVA>();
        listLineasVida = listLineasVida.OrderBy(x => x.FECHASUBIDA).ToList();
        StateHasChanged();
    }
    protected async void GuardarVida()
    {

        MOTIVOS_ADMINISTRATIVOS motivo = listMotivos.FirstOrDefault(x => x.IDMOTIVO == IDMOTIVOACTUAL) ?? new MOTIVOS_ADMINISTRATIVOS();
        TIPOAPTOSADMINISTRATIVOS actoActual = TiposActos.FirstOrDefault(x => x.IDTIPO == IDAPTOACTUAL) ?? new TIPOAPTOSADMINISTRATIVOS();
        NIVEL Nivel = Niveles.FirstOrDefault(x => x.IDNIVEL == NIVELACTUAL) ?? new NIVEL();
        Model.IDMOTIVO = IDMOTIVOACTUAL;

        if (Persona.IDCUERPORPT is null)
        {
            mostrarMensajeCuerpo = true;
            return;
            /*mostrar Mensaje cuerpo*/
        }
        Model.IDSERVICIOADSCRITO =null;
        Model.IDUNIDADADMINISTRATIVA =null;
        // Model.IDSERVICIOADSCRITO = IDSERVICIOACTUAL;
        Model.NRP = Persona.NRP;

        if (actoActual.DESCRIPCION == "TOMA POSESION" && nueva == true)
        {
            puestoElegido = PuestoDisp.FirstOrDefault(x => x.IDPUESTO == IDPUESTODISACTUAL) ?? new PUESTOS();
            OCUPACION ocuElegida = Ocupaciones.FirstOrDefault(x => x.IDOCUPACION == IDOCUPACIONACTUAL) ?? new OCUPACION();

            puestoElegido.IDPERSONAL = IDPERSONASLINK;
            puestoElegido.IDOCUPACION = IDOCUPACIONACTUAL;
            puestoElegido.ESTADO = "O";
            if (ocuElegida.DESCRIPCION!.Contains("PRO")) { puestoElegido.ESTADO = "L"; };
            Model.OCUPACION_OLD = IDOCUPACIONACTUAL;
            if (ocuElegida.DESCRIPCION.ToUpper() == "DEFINITIVA" || ocuElegida.DESCRIPCION.ToUpper() == "DEFINITIVO") { puestoElegido.TITULAR = IDPERSONASLINK; };
            if (puestoElegido.IDRPTDESNavigation?.VIRTUAL == true)
            {
                DOTACION dotacionVir = listDotacion.FirstOrDefault(x => x.DOTACION1 == "DO") ?? new DOTACION();
                puestoElegido.IDDOTACION = dotacionVir!.IDDOTACION;
            }
            /*guardar puesto*/
            var respuestaGuardarPuesto = await Utilidades.ActualizarObjeto<bdAntifraude.db.PUESTOS>(client, "/api/PUESTOS/" + IDPUESTODISACTUAL, puestoElegido);
            var Pueresponse = await client.GetAsync("/api/PUESTOS/" + IDPUESTODISACTUAL);
            var PueCont = await Pueresponse.Content.ReadAsStringAsync();
            puestoElegido = JsonConvert.DeserializeObject<PUESTOS>(PueCont) ?? new PUESTOS();

            if ((Persona.IDADSCRIPCIONRPTNavigation?.IDTIPO != IDTIPOPERSONALACT || puestoElegido.IDRPTDESNavigation?.CUERPO1Navigation?.IDCUERPO != Persona.IDCUERPORPTNavigation?.IDCUERPO) && Persona.EXTERNO == 0)
            {
                string Ads = TiposPersonal?.FirstOrDefault(x => x.IDTIPO == IDTIPOPERSONALACT)?.TIPO_PERSONAL?.Trim() ?? "";
                string DNI = Persona?.NIF?.Substring(0, Persona.NIF.Length - 1)?.PadLeft(9, '0') ?? "";
                string NRPCal = DNI;//+ "C0" + Ads.Trim() + puestoElegido?.IDRPTDESNavigation?.CUERPO1Navigation?.CUERPO1?.Trim();
                Persona!.NRP_OLD = Persona.NRP;
                Persona.NRP = NRPCal;
                Persona.IDADSCRIPCIONRPT = IDTIPOPERSONALACT;
                // Persona.IDCUERPORPT = puestoElegido?.IDRPTDESNavigation?.CUERPO1Navigation?.IDCUERPO;
                Model.NRP = Persona.NRP;
                /*guardar persona*/
                var respuestaGuardarPersona = await Utilidades.ActualizarObjeto<bdAntifraude.db.PERSONAS>(client, "/api/PERSONAS/" + IDPERSONASLINK, Persona);


                var usu = idUsuActual;
                Expression<Func<PERSONAS, bool>> filtroPer = x =>
                x.IDPERSONA == usu;
                var PerExpression = serializer?.SerializeText(filtroPer);
                var PerjsonContent = JsonConvert.SerializeObject(new { Expression = PerExpression });
                var Percontent = new StringContent(PerjsonContent, Encoding.UTF8, "application/json");
                var Perresponse = await client.PostAsync("/api/PERSONAS/getPersonaVidaAdm", Percontent);
                var PerCont = await Perresponse.Content.ReadAsStringAsync();
                Persona = JsonConvert.DeserializeObject<PERSONAS>(PerCont) ?? new PERSONAS();
                // Persona = await Utilidades.ObtenerObjeto<PERSONAS>(client, "/api/PERSONA/" + Persona.IDPERSONA);
            }
        }
        else if (actoActual.DESCRIPCION == "CESE" && nueva == true)
        {
            var Puerespons = await client.GetAsync("/api/PUESTOS/" + IDPUESTOACTUAL);
            var PueCon = await Puerespons.Content.ReadAsStringAsync();
            bdAntifraude.db.PUESTOS puestoElegido = JsonConvert.DeserializeObject<PUESTOS>(PueCon) ?? new PUESTOS();
            OCUPACION ocuElegida = Ocupaciones.FirstOrDefault(x => x.IDOCUPACION == puestoElegido.IDOCUPACION) ?? new OCUPACION();
            puestoElegido.ESTADO = "L";
            puestoElegido.IDOCUPACION = null;
            puestoElegido.IDOCUPACION = null;
            if (ocuElegida.DESCRIPCION!.Contains("PRO"))
            {
                puestoElegido.IDPERSONAL = null;
            }
            if (ocuElegida.DESCRIPCION.ToUpper() == "DEFINITIVA" || ocuElegida.DESCRIPCION.ToUpper() == "DEFINITIVO")
            {
                puestoElegido.IDPERSONAL = null;
                puestoElegido.TITULAR = null;
            }
            if (puestoElegido.IDRPTDESNavigation?.VIRTUAL == true)
            {
                DOTACION idnodotada = listDotacion.FirstOrDefault(x => x.DOTACION1?.Trim() == "DO") ?? new DOTACION();
                puestoElegido.IDDOTACION = idnodotada.IDDOTACION;
            }
            var respuestaGuardarPuesto = await Utilidades.ActualizarObjeto<bdAntifraude.db.PUESTOS>(client, "/api/PUESTOS/" + IDPUESTOACTUAL, puestoElegido);
            var Pueresponse = await client.GetAsync("/api/PUESTOS/" + IDPUESTOACTUAL);
            var PueCont = await Pueresponse.Content.ReadAsStringAsync();
            puestoElegido = JsonConvert.DeserializeObject<PUESTOS>(PueCont) ?? new PUESTOS();

        }
        if (nueva == true)
        {
            GRUPO Grupo = await Utilidades.ObtenerObjeto<GRUPO>(client, "/api/GRUPO/" + Persona.IDCUERPORPTNavigation.IDGRUPO);
            Model.IDTIPOPERSONAL = IDTIPOPERSONALACT;
            if (Model.IDTIPOPERSONAL == 0){ Model.IDTIPOPERSONAL = null; };

            if (puestosdelapersona.Count == 1 && puestoElegido == null)
            {
                Puesto = puestosdelapersona.First();
            }
            else 
            {
                if (puestosdelapersona.Count != 0 && puestoElegido == null)
                {
                    Puesto = puestosdelapersona.Last();
                    Expression<Func<bdAntifraude.db.PUESTOS, bool>> filtro = x =>
                        x.IDPUESTO == puestosdelapersona.First().IDPUESTO;
                    List<bdAntifraude.db.PUESTOS> listpuestoanterior = await Utilidades.ObtenerObjeto<List<bdAntifraude.db.PUESTOS>>(client, "/api/PUESTOS/filtrar", filtro);
                    bdAntifraude.db.PUESTOS puestoanterior = listpuestoanterior.First();
                    puestoanterior.ESTADO = "L";
                    puestoanterior.IDPERSONALNavigation!.IDPERSONA = 0;
                    puestoanterior.TITULARNavigation!.IDPERSONA = 0;
                    /*actualizar puestoanterior*/
                    var respuestaGuardarPuestoAnterior = await Utilidades.ActualizarObjeto<bdAntifraude.db.PUESTOS>(client, "/api/PUESTOS/" + puestoanterior.IDPUESTO, puestoanterior);
                }
                else
                {
                    Puesto = puestoElegido;
                }
            }

            if (actoActual.DESCRIPCION == "RECONOCIMIENTO TRAMO CARRERA HORIZONTAL" && nueva == true)
            {
                Model.OBSERVACIONES = "Reconocimiento de " + TramosComp?.FirstOrDefault(x => x.IDENUMERACION == IDTRAMOACTUAL)?.DESCRIPCION;
                Model.IDTRAMOCARRERAHORIZONTAL = IDTRAMOACTUAL;
            }
            if (Puesto is not null) { Model.DENOMINACION_OLD = Puesto.IDRPTDESNavigation?.DENOMINACION; }
            if (Puesto is not null && actoActual.DESCRIPCION != "CONSOLIDACIÓN DE GRADO")
            {
                Model.NIVELC = Puesto.IDRPTDESNavigation?.IDNIVEL_RPT;
                Model.NIVEL_OLD = Puesto.IDRPTDESNavigation?.IDNIVEL_RPT;
            }
            else if (NIVELACTUAL != 0)
            {
                Model.NIVELC = Nivel.IDNIVEL;
                Model.NIVEL_OLD = Nivel.IDNIVEL;
            }
            else
            {
                Model.NIVELC = Persona.IDNIVELRPT;
                Model.NIVEL_OLD = Persona.IDNIVELRPT;
            }
            if (Grupo is not null) { Model.GRUPOT = Grupo.IDGRUPO; };
            if (Puesto is not null)
            {
                if (Puesto.IDOCUPACION is not null) { Model.OCUPACION_OLD = Puesto.IDOCUPACION; Model.IDPUESTO = Puesto.IDPUESTO; };
            }
            /*Guardar vida administrativa*/
            var respuestaGuardarNuevaVida = await Utilidades.NuevoObjeto<VIDA_ADMINISTRATIVA>(client, "/api/VIDA_ADMINISTRATIVA", Model);

            Navigation.NavigateTo(LINKPERSONA, forceLoad: true);
        }
        else
        {
            /*Guardar vida administrativa*/
            var respuestaGuardarVida = await Utilidades.ActualizarObjeto<VIDA_ADMINISTRATIVA>(client, "/api/VIDA_ADMINISTRATIVA/" + Model.IDVIDA, Model);
            Navigation.NavigateTo(LINKPERSONA, forceLoad: true);
            // var JsonModVida = JsonConvert.SerializeObject(Model);
            // var serv = await client.PostAsync("/api/SERVICIOS/" +Model.IDVIDA.ToString(),JsonModVida);
            // var servContent = await serv.Content.ReadAsStringAsync();
            // if (serv.IsSuccessStatusCode) { listServicios = JsonConvert.DeserializeObject<List<SERVICIOS>>(servContent); }
            // listServicios.OrderBy(x => x.ORDEN);
        }
    }
    protected async void BorrarVida()
    {
        var dot = await client.DeleteAsync("/api/VIDA_ADMINISTRATIVA/" + idVidaActual);
        var dotContent = await dot.Content.ReadAsStringAsync();
        if (dot.IsSuccessStatusCode) { Navigation.NavigateTo(LINKPERSONA, forceLoad: true); }

    }
    private void abrirPopupGestionLinea(LINEASVIDAADMINISTRATIVA objeto)
    {
        DESCRIPCIONLINEAVIDAED = objeto.DESCRIPCION!;
        IDTIPODOCUED = objeto.IDTIPO;
        lineaEditada = objeto;
    }    
    private async Task LoadFile(InputFileChangeEventArgs e)
    {
        try
        {
            var file = e.File;

            // Validación del tamaño del archivo (10 MB máximo)
            const long maxFileSize = 10 * 1024 * 1024; // 10 MB
            if (file.Size > maxFileSize)
            {
                Console.WriteLine("El archivo es demasiado grande. Tamaño máximo permitido: 10 MB.");
                return;
            }

            // Leer el archivo en un stream
            using var stream = file.OpenReadStream(maxFileSize);
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);

            // Obtener los bytes del archivo
            var fileBytes = memoryStream.ToArray();

            // Convertir los bytes a Base64
            Base64File = Convert.ToBase64String(fileBytes);

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar el archivo: {ex.Message}");
        }
    }
    private async Task LoadFile1(InputFileChangeEventArgs e)
    {
        try
        {
            var file = e.File;

            // Validación del tamaño del archivo (10 MB máximo)
            const long maxFileSize = 10 * 1024 * 1024; // 10 MB
            if (file.Size > maxFileSize)
            {
                Console.WriteLine("El archivo es demasiado grande. Tamaño máximo permitido: 10 MB.");
                return;
            }

            // Leer el archivo en un stream
            using var stream = file.OpenReadStream(maxFileSize);
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);

            // Obtener los bytes del archivo
            var fileBytes = memoryStream.ToArray();

            // Convertir los bytes a Base64
            Base64FileEd = Convert.ToBase64String(fileBytes);

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar el archivo: {ex.Message}");
        }
    }
    private void ShowDropdown()
    {
        showDropdown = true;
    }
    private async void HideDropdownAfterDelay()
    {
        // Pequeño delay para no cerrar el dropdown antes de poder hacer clic
        // (opcional, puedes eliminarlo si no es necesario)
        await Task.Delay(200);
        showDropdown = false;
        StateHasChanged();
    }
    private IEnumerable<PUESTOS> FiltrarPuestos(IEnumerable<PUESTOS> puestos, string text)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            // Sin texto: muestra todos
            return puestos.OrderBy(p => p.DESPUESCOM);
        }
        else
        {
            // Con texto: filtramos
            return puestos
            .Where(p => p.DESPUESCOM.Contains(text, StringComparison.OrdinalIgnoreCase))
            .OrderBy(p => p.DESPUESCOM);
        }
    }
    private void SelectPuesto(PUESTOS puesto)
    {
        filterText = puesto.DESPUESCOM;
        IDPUESTODISACTUAL = puesto.IDPUESTO;
        showDropdown = false;
    }
}