@page "/DesgloseRPT"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Layout
@using Microsoft.AspNetCore.Mvc
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using System.Text
@using RegistroPersonalAN.Components.ViewsModels
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using System.Reflection
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Globalization
@using Microsoft.JSInterop
@inject IJSRuntime JSRuntime
@rendermode InteractiveServer
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject NavigationManager Navigation
@inject IJSRuntime JS
@inject UserState UserState

@if (Model == null || Cargando == true)
{
    <div id="cargando" class="loadingFrame">
        <div class="loadingImg"></div>
    </div>
}
else
{
    <Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="messages" Placement="ToastsPlacement.BottomCenter" />


    <EditForm Model="Model" class="formDtosAdmin" Context="poupCompRPT">
        <DataAnnotationsValidator />
        <Modal @ref="popupComparar" title="Comparar RPT" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
            <BodyTemplate>
                <InputSelect @bind-Value="idRPTComparar" class="inputForm">
                    @foreach (var rptselect in listRPTCopia)
                    {
                        <option value="@rptselect.IDRPT">@rptselect.DESCRIPCION</option>
                    }
                </InputSelect>
            </BodyTemplate>
            <FooterTemplate>
                <Button @onclick="@cerrarComp" Color="ButtonColor.Secondary">Cancelar</Button>
                <Button @onclick="@(() => ImprimeRPT("ComRpt"))" Color="ButtonColor.Primary">Comparar</Button>
            </FooterTemplate>

        </Modal>
    </EditForm>


    <EditForm Model="Model" class="formDtosAdmin" Context="poupPlaPre">
        <DataAnnotationsValidator />
        <Modal @ref="popupPlaPre" title="Plantilla Presupuest aria" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
            <BodyTemplate>
                <div style="display:flex; gap:5px;">
                    <p>Introduzca Productividad</p>
                    <InputNumber @bind-Value="txtProductividad" class="inputForm" />
                </div>
            </BodyTemplate>
            <FooterTemplate>
                <Button @onclick="@cerrarPlaPre" Color="ButtonColor.Secondary">Cancelar</Button>
                <Button @onclick="@(() => ImprimeRPT("PlaPre"))" Color="ButtonColor.Primary">Generar</Button>
            </FooterTemplate>

        </Modal>
    </EditForm>


    <Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="messages" Placement="ToastsPlacement.BottomCenter" />


    <EditForm Model="Model" class="formDtosAdmin" Context="poupCompNVl">
        <DataAnnotationsValidator />
        <Modal @ref="popupNewCompleNvl" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
            <BodyTemplate>
                <div class="col-12 formatoCampos">
                    <label class="tituloLbl">Nivel:</label>
                    <InputSelect @bind-Value="Model!.compleNvlSelect.IDNIVEL" class="inputForm" @onblur="e => ValidarYActualizar(nameof(Model.compleNvlSelect.IDNIVEL))">
                        <option value="0">-- Seleccione un nivel -- </option>

                        @foreach (var nvl in listNivel)
                        {
                            <option value="@nvl.IDNIVEL">@nvl.DESCRIPCION</option>
                        }
                    </InputSelect>

                    <div class="validation-message">@GetExternalValidationMessage(nameof(Model.compleNvlSelect.IDNIVEL))</div>
                </div>
                <div class="row">
                    <div class="col-6 formatoCampos">
                        <label class="tituloLbl">Importe Mensual:</label>
                        <CurrencyInput TValue="decimal?" Locale="es-ES" @bind-Value="Model!.compleNvlSelect.IMPORTEMENSUAL" class="inputForm"></CurrencyInput>
                    </div>
                </div>
            </BodyTemplate>
            <FooterTemplate>
                <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupCompNvl">Cerrar</Button>
                @if (Model!.compleNvlSelect.IDCOMPLEMENTONIVEL != 0)
                {
                    <Button  @onclick="@(() => manejarComplementoNvl("update", poupCompNVl))" Color="ButtonColor.Primary">Modificar</Button>
                }
                else
                {
                    <Button @onclick="@(() => manejarComplementoNvl("create",poupCompNVl))" Color="ButtonColor.Primary">Añadir</Button>
                }
            </FooterTemplate>

        </Modal>
    </EditForm>

    <Modal @ref="popupConfirmacion" title="" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="col-12 formatoCampos">
                ¿Estás seguro que desea eliminarlo?
            </div>

        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupConfirmacion">Cerrar</Button>

            @if (borrarComple)
            {
                <Button @onclick="@(() => manejarComplementoNvl("delete", null))" Color="ButtonColor.Danger">Eliminar</Button>
            }
            else
            {
                <Button @onclick="@(() => borrarRPT())" Color="ButtonColor.Danger">Eliminar</Button>
            }
        </FooterTemplate>
    </Modal>


    <Modal @ref="popupConfirmacionGuardar" Title="Confirmar Guardar RPT" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <p>Se van a dar de alta o modificar datos de la RPT seleccionada ¿desea continuar?</p>
        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="CerrarConfirmacionGuardar">Cancelar</Button>

            <Button @onclick="() => llamarGuardar()" Color="ButtonColor.Primary">Aceptar</Button>

        </FooterTemplate>
    </Modal>
    //OnValidSubmit="@guardarFormulario" OnInvalidSubmit="@MostrarErrores"
    <div class="mb-1 col-12" style="display:flex; gap:5px;padding-top: 20px;">
            <button class="btnOAAFAzul" @onclick="volver" autofocus="false" title="Volver"><i class="fas fa-long-arrow-alt-left"></i></button>
            <button class="btnOAAFAzul" type="button" hidden=@ocultarBtnMod @onclick="irNuevoPuesto"> <i class="fas fa-plus"></i> </button>
            <button class="btnOAAFAzul" type="button" @onclick="abrirPopupConfirmacionGuardar"> <i class="fas fa-save"></i> </button>
            <button class="btnOAAFAzul" type="button" hidden=@ocultarBtnMod @onclick="abrirPopupConfirmacionRPT"> <i class="fas fa-trash"></i> </button>
            <button class="btnOAAFAzul" type="button" hidden=@ocultarBtnNew @onclick="limpiarModel"> <i class="fas fa-eraser"></i> </button>

            <input type="button" hidden=@ocultarBtnMod class="btnOAAFAzul btn-md" id="btnListadoProce" data-bs-toggle="collapse" data-bs-target="#barraBotones" aria-expanded="false" aria-controls="barraBotones" value="Listados y procesos" />
        </div>

        <div id="barraBotones" class="collapse multi-collapse mt-4">
            <div style="display:flex; gap:15px"></div>
            <input type="button" Class="btnOAAFAzul" @onclick="@(() => ImprimeRPT("ImpRpt"))" value="Imprimir RPT" />
            <input type="button" class="btnOAAFAzul" @onclick="@abrirComp" id="btnCompRPT" value="Comparar RPT" />
            <input type="button" class="btnOAAFAzul" @onclick="@abrirPlaPre" id="btnImpPlaPre" value="Imprimir plantilla presupuestaria" />
            <input type="button" Class="btnOAAFAzul" @onclick="@(() => ImprimeRPT("LiPuPeTi"))" value="Listado Puestos ocupados y/o con Titular" />

        </div>
    <EditForm Model="Model" FormName="FormDesgloseRPT" Context="rptFormContext" class="formDtosAdmin" >
        <DataAnnotationsValidator />

       

        <div class="areaMenu m-0">
            <div class="camposficha row">
                <div class="col-6 formatoCampos">
                    <label class="tituloLbl">Descripción:</label>

                    <input class="form-control @GetCssClass(nameof(Model.FormRPT.DESCRIPCION))"
                           maxlength="100"
                           @bind-value="@Model.FormRPT.DESCRIPCION"
                           placeholder="@GetPlaceholder(nameof(Model.FormRPT.DESCRIPCION))"
                           @onblur="e => ValidarYActualizar(nameof(Model.FormRPT.DESCRIPCION))" />
                    <div class="validation-message">@GetExternalValidationMessage(nameof(Model.FormRPT.DESCRIPCION))</div>
                </div>

                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Ejercicio:</label>
                    <NumberInput @bind-Value="Model.FormRPT.EJERCICIO" class="inputForm" @onblur="e => ValidarYActualizar( nameof(Model.FormRPT.EJERCICIO))"></NumberInput>
                    <div class="validation-message">@GetExternalValidationMessage(nameof(Model.FormRPT.EJERCICIO))</div>
                </div>

                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Situación: *</label>
                    <InputSelect @bind-Value="Model.FormRPT.IDSITUACION" class="inputForm" @onblur="e => ValidarYActualizar( nameof(Model.FormRPT.IDSITUACION))">

                        <option value="0">-- Seleccione una situación -- </option>

                        @foreach (var solicitud in listadoSolicitudes)
                        {
                            <option value="@solicitud.IDENUMERACION">@solicitud.DESCRIPCION</option>
                        }
                    </InputSelect>
                    <div class="validation-message">@GetExternalValidationMessage(nameof(Model.FormRPT.IDSITUACION))</div>

                </div>
            </div>
            <div class="camposficha row">
                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Fecha Mesa Parlamento:</label>
                    <InputDate @bind-Value="Model.FormRPT.F_PLENO" class="inputForm"></InputDate>
                </div>

                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Fecha Oficina:</label>
                    <InputDate @bind-Value="Model.FormRPT.F_PARLAMENTO" class="inputForm"></InputDate>
                </div>

                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Fecha Inicio:</label>
                    <InputDate @bind-Value="Model.FormRPT.FECHAINICIO" class="inputForm"></InputDate>
                </div>

                <div class="col-3 formatoCampos">
                    <label class="tituloLbl">Fecha Fin:</label>
                    <InputDate @bind-Value="Model.FormRPT.FECHAFIN" class="inputForm"></InputDate>
                </div>
            </div>

            @if (string.IsNullOrEmpty(idRPT))
            {
                <div class="camposficha row">
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Copiar Datos de:</label>
                        <InputSelect @bind-Value="Model.idRPTCopia" class="inputForm">

                            <option value="">-- Seleccione un RPT -- </option>

                            @foreach (var solicitud in listRPTCopia)
                            {
                                <option value="@solicitud.IDRPT">@solicitud.DESCRIPCION</option>
                            }
                        </InputSelect>
                    </div>

                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Porcentaje Incremento Especifico:</label>
                        <InputNumber @bind-Value="Model.Porcentaje" class="inputForm"></InputNumber>
                    </div>
                </div>
            }
        </div>



    </EditForm>

    if (!string.IsNullOrEmpty(idRPT))
    {
        <Tabs Style="padding-top:50px; width:100%;" EnableFadeEffect="true">
            <Tab Title="RPT" Active="true">
                <Content>
                    @if (listRPTDescripc == null)
                    {
                        <p>Cargando datos...</p>
                    }
                    else if (!listRPTDescripc.Any())
                    {
                        <p>No se encontraron datos para mostrar.</p>
                    }
                    else
                    {

                        <div class="form-group mt-4">
                            <input class="form-control" type="text" placeholder="Filtrar..."
                                   @bind-value="Filter" @bind-value:event="oninput"  />
                        </div>
                        <Grid TItem="bdAntifraude.db.RPT_DESCRIP"
                              Class="table tablaRegPers"
                              Data="listRPTDescripcFiltro"
                              AllowFiltering="false"
                              PageSize="10"
                              AllowPaging="true"
                              EmptyText="No se han encontrado datos"
                              AllowSorting="true"
                              Height="100"
                              PageSizeSelectorVisible="false"
                              PageSizeSelectorItems="@(new int[] { 5,10,20,50 })"
                              Responsive="true"
                              PaginationItemsTextFormat="{0} - {1} de {2} elementos">

                            <GridColumns>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Código" PropertyName="CODIGO" SortKeySelector="item => item.CODIGO">
                                    <a href="@HashRed(context.IDRPTDES)">@context.CODIGO</a>
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Plazas" PropertyName="Plazas" SortKeySelector="item => item.PLAZAS">
                                    @context.PLAZAS
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Denominación" PropertyName="DENOMINACION" SortKeySelector="item => item.DENOMINACION">
                                    @context.DENOMINACION
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Requisitos para el desempeño" PropertyName="REQUISITOS" SortKeySelector="item => item.REQUISITOS">
                                    @context.REQUISITOS
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Departamento" PropertyName="IDDEPARTAMENTONavigation" SortKeySelector="item => item.IDDEPARTAMENTONavigation.VALORALFABETICOLARGO">
                                    @context.IDDEPARTAMENTONavigation?.VALORALFABETICOLARGO
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Grupo 1" PropertyName="GRUPO1Navigation" SortKeySelector="item => item.GRUPO1Navigation.GRUPO1">
                                    @context.GRUPO1Navigation?.GRUPO1
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Grupo 2" PropertyName="GRUPO2Navigation" SortKeySelector="item => item.GRUPO2Navigation.GRUPO1">
                                    @context.GRUPO2Navigation?.GRUPO1
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Provisión" PropertyName="PROVISIONNavigation" SortKeySelector="item => item.PROVISIONNavigation.DESCRIPCION">
                                    @context.PROVISIONNavigation?.DESCRIPCION
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Adscripcion" PropertyName="ADSCRIPCIONNavigation" SortKeySelector="item => item.ADSCRIPCIONNavigation.DESCRIPCION">
                                    @context.ADSCRIPCIONNavigation?.DESCRIPCION
                                </GridColumn>
                                <GridColumn TItem="bdAntifraude.db.RPT_DESCRIP" HeaderText="Específico" Class="text-truncate" PropertyName="ESPECIFICO" SortKeySelector="item => item.ESPECIFICO">
                                    @context.ESPECIFICO?.ToString("C", CultureInfo.CurrentCulture)
                                </GridColumn>

                            </GridColumns>

                        </Grid>
                    }
                </Content>
            </Tab>
            <Tab Title="Retribución Básica">
                <Content>
                    <div style="display:flex; justify-content:center; gap:70px;padding-top:50px;">

                        <div class="card estiloCard">
                            <p class="container tituloCard">Sueldos</p>
                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOA1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOA2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOB></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOC1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOC2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; text-align: right;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOE></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Sueldos Extra</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOA1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOA2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOBX></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOC1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOC2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.SUELDOEX></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Trienio Administración</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMA1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMA2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMB></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMC1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMC2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADME></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Trienio Administración Extra</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMA1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMA2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMBX></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMC1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMC2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRIADMEX></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Trienio Oficina</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMA1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMA2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMB></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMC1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMC2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAME></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard" style="margin-right:15px;">
                            <p class="container tituloCard">Trienio Oficina Extra</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMA1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMA2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMBX></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMC1X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMC2X></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.TRICAMEX></CurrencyInput>
                            </div>
                        </div>

                    </div>

                </Content>
            </Tab>
            <Tab Title="Complemento Carrera">
                <Content>
                    <div style="display:flex; justify-content:center; gap:70px;padding-top:50px;">

                        <div class="card estiloCard">
                            <p class="container tituloCard">Complemento Carrera Tramo I</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA1T1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA2T1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRBT1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC1T1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC2T1></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRET1></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Complemento Carrera Tramo II</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA1T2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA2T2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRBT2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC1T2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC2T2></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRET2></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Complemento Carrera Tramo III</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA1T3></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA2T3></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRBT3></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC1T3></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC2T3></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRET3></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Complemento Carrera Tramo IV</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA1T4></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA2T4></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRBT4></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC1T4></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC2T4></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRET4></CurrencyInput>
                            </div>
                        </div>

                        <div class="card estiloCard">
                            <p class="container tituloCard">Complemento Carrera Tramo V</p>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px; margin-top: 5px;">
                                <label style="margin-bottom: 5px;"><b>A1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA1T5></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>A2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRA2T5></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>B:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRBT5></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C1:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC1T5></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>C2:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRC2T5></CurrencyInput>
                            </div>

                            <div class="formatoCampos" style="margin-inline: 15px; margin-bottom: 5px;">
                                <label style="margin-bottom: 5px;"><b>E:</b></label>
                                <CurrencyInput TValue="decimal" Locale="es-ES" style="text-align: right;" @bind-Value=Model!.RetriBasica!.COMCARRET5></CurrencyInput>
                            </div>
                        </div>

                    </div>

                </Content>
            </Tab>
            <Tab Title="Complemento Nivel">
                <Content>
                    <div style="display:block;gap:10px; margin-bottom:20px;" class="mt-4">
                        <button @onclick="@(() => abrirPopupCompNvl(new COMPLEMENTONIVEL()))" class="btnOAAFAzul" >  Nuevo complemento nivel  </button>
                        @if (listCompleNvl == null)
                        {
                            <p>Cargando datos...</p>
                        }
                        else if (!listCompleNvl.Any())
                        {
                            <p>No se encontraron datos para mostrar.</p>
                        }
                        else
                        {
                            <Grid TItem="bdAntifraude.db.COMPLEMENTONIVEL"
                                  Class="table tablaRegPers"
                                  Data="listCompleNvl"
                                  AllowFiltering="false"
                                  PageSize="10"
                                  AllowPaging="true"
                                  EmptyText="No se han encontrado datos"
                                  AllowSorting="true"
                                  Height="100"
                                  PageSizeSelectorVisible="false"
                                  PageSizeSelectorItems="@(new int[] { 5,10,20,50 })"
                                  Responsive="true"
                                  PaginationItemsTextFormat="{0} - {1} de {2} elementos">

                                <GridColumns>
                                    <GridColumn TItem="bdAntifraude.db.COMPLEMENTONIVEL" HeaderText="Nivel" PropertyName="IDNIVEL">
                                        @context.IDNIVELNavigation?.NIVEL1 
                                    </GridColumn>
                                    <GridColumn TItem="bdAntifraude.db.COMPLEMENTONIVEL" HeaderText="Importe Mensual" PropertyName="IMPORTEMENSUAL">
                                        @{
                                            var importeMensual = string.Format(new CultureInfo("es-ES"), "{0:C2}", @context.IMPORTEMENSUAL);
                                            @importeMensual
                                        }
                                    </GridColumn>
                                    <GridColumn TItem="bdAntifraude.db.COMPLEMENTONIVEL" HeaderText="Importe Anual" PropertyName="IMPORTEANUAL">
                                        @{
                                            var importeAnual = string.Format(new CultureInfo("es-ES"), "{0:C2}", @context.IMPORTEANUAL);
                                            @importeAnual
                                        }
                                    </GridColumn>
                                    <GridColumn TItem="bdAntifraude.db.COMPLEMENTONIVEL" HeaderText="">
                                        <span @onclick="@(() => abrirPopupCompNvl(@context))" style="cursor: pointer;">
                                            <Icon CustomIconName="fas fa-edit"></Icon>
                                        </span>
                                        <span @onclick="@(() => abrirPopupConfirmacion(@context))" style="cursor: pointer;">
                                            <Icon CustomIconName="fas fa-trash"></Icon>
                                        </span>
                                    </GridColumn>
                                </GridColumns>
                            </Grid>
                        }
                    </div>
                </Content>
            </Tab>
        </Tabs>

    }
}
@code {
    // ATRIBUTOS
    List<ToastMessage> messages = new List<ToastMessage>();
    public bool Cargando { get; set; }
    public bool ocultarBtnNew { get; set; }
    public bool ocultarBtnMod { get; set; }
    public bool borrarComple { get; set; }

    [Parameter]
    public string? cl { get; set; } = "";

    public string idRPT { get; set; } = "";

    public double txtProductividad { get; set; } = 0.00;
    public string idRPTComparar { get; set; } = "";
    public string RPTEnlazado { get; set; } = "";

    [SupplyParameterFromForm]
    private DesgloseRPTVM Model { get; set; } = new DesgloseRPTVM();
    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private List<RPT_DESCRIP> listRPTDescripc = new List<RPT_DESCRIP>();
    private List<RPT_DESCRIP> listRPTDescripcFiltro = new List<RPT_DESCRIP>();
    private List<COMPLEMENTONIVEL> listCompleNvl = new List<COMPLEMENTONIVEL>();
    private List<NIVEL> listNivel = new List<NIVEL>();
    private List<ENUMERACIONES> listadoSolicitudes = new List<ENUMERACIONES>();
    private List<bdAntifraude.db.RPT> listRPTCopia = new List<bdAntifraude.db.RPT>();
    private List<bdAntifraude.db.RPT> listRPTComp= new List<bdAntifraude.db.RPT>();

    private Modal popupNewCompleNvl = default!;
    private Modal popupConfirmacion = default!;
    private Modal popupConfirmacionGuardar = default!;
    private Modal popupComparar = default!;
    private Modal popupPlaPre = default!;
    private COMPLEMENTONIVEL compleNvlOriginal = new COMPLEMENTONIVEL();
    private string tituloPopup = "";

    private HttpClient cliente = new HttpClient();
    private EditContext? editContext;
    private ValidationMessageStore? messageStore;

    protected void volver() { Navigation.NavigateTo("/RPT", forceLoad: true); }
    protected override async Task OnInitializedAsync()
    {
        try
        {
            editContext = new EditContext(Model);
            messageStore = new ValidationMessageStore(editContext);

            var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("cl", out var clValue))
            {
                cl = clValue;
            }

            idRPT = tsUtilidades.crypt.FEncS(cl, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);

            cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
            await rellenarLitadoRPTCopias();

            if (string.IsNullOrEmpty(idRPT))
            {
                ocultarBtnNew = false;
                ocultarBtnMod = true;

                await rellenarLitadoSolicitudes();
                await rellenarLitadoRPTCopias();
            }
            else
            {
                ocultarBtnNew = true;
                ocultarBtnMod = false;

                await rellenarLitadoSolicitudes();

                listRPTDescripc = await gridRPTDescrip(idRPT);
                listRPTDescripcFiltro = listRPTDescripc.OrderBy(x => x.IDDEPARTAMENTONavigation?.VALORALFABETICOLARGO).ThenBy(x => x.CODIGO).ToList();

                Model!.RetriBasica = await rellenarFormComplementos(idRPT);

                // Comprobación para que este objeto no esté nulo, porque todos los datos son no nullable y peta. Así que se inicializa a un objeto vacío.
                if (Model!.RetriBasica == null)
                {
                    Model!.RetriBasica = new RETRIBUCIONBASICA();
                }

                listCompleNvl = await gridComplementoNvl(idRPT);

                Model!.FormRPT = await Utilidades.ObtenerObjeto<bdAntifraude.db.RPT>(cliente, "/api/RPT/" + idRPT);

                RPTEnlazado = idRPT;

                var culture = new CultureInfo("es-ES");
                CultureInfo.DefaultThreadCurrentCulture = culture;
                CultureInfo.DefaultThreadCurrentUICulture = culture;
                await JSRuntime.InvokeVoidAsync("BlazorCulture.set", "es-ES");
            }



        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    public void obtenerListRPT()
    {

    }
    public bool IsVisible(bdAntifraude.db.RPT_DESCRIP rptDescriFilt)
    {
        if (string.IsNullOrEmpty(Filter))
            return true;

        if (rptDescriFilt.CODIGO != null)
        {
            if (rptDescriFilt.CODIGO.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }

        if (rptDescriFilt.DENOMINACION != null)
        {
            if (rptDescriFilt.DENOMINACION.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }

        if (rptDescriFilt.CARACTERISTICAS != null)
        {
            if (rptDescriFilt.CARACTERISTICAS.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }

        if (rptDescriFilt.REQUISITOS != null)
        {
            if (rptDescriFilt.REQUISITOS.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }

        if (rptDescriFilt.IDUNIDADADMINISTRATIVANavigation != null)
        {
            if (rptDescriFilt.IDUNIDADADMINISTRATIVANavigation.LITERAL_DEPARTAMENTO!.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }

        if (rptDescriFilt.CUERPO1Navigation != null)
        {
            if (rptDescriFilt.CUERPO1Navigation.DESCRIPCION!.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }


        if (rptDescriFilt.PROVISIONNavigation != null)
        {
            if (rptDescriFilt.PROVISIONNavigation.DESCRIPCION!.Contains(Filter, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }
        return false;
    }
    private void AplicarFiltros()
    {
        // Filtra la lista en función de los criterios ingresados
        listRPTDescripcFiltro = new List<bdAntifraude.db.RPT_DESCRIP>();
        foreach (bdAntifraude.db.RPT_DESCRIP rptDescr in listRPTDescripc)
        {
            if (IsVisible(rptDescr) == true)
            {
                listRPTDescripcFiltro.Add(rptDescr);
            }
        }
    }

    //POPUPS
    private async Task abrirPopupCompNvl(COMPLEMENTONIVEL compleNvl)
    {
        Model!.compleNvlSelect = compleNvl;

        if (compleNvl.IDCOMPLEMENTONIVEL != 0)
        {
            compleNvlOriginal = compleNvl;
            tituloPopup = "Modificar Complemento Nivel";
        }
        else
        {
            tituloPopup = "Nuevo Complemento Nivel";
        }

        await rellenarLitadoNivel();
        await popupNewCompleNvl.ShowAsync();
    }
    private async Task abrirPopupConfirmacion(COMPLEMENTONIVEL compleNvl)
    {
        borrarComple = true;
        Model!.compleNvlSelect = compleNvl;

        await popupConfirmacion.ShowAsync();
    }
    private async Task abrirPopupConfirmacionRPT()
    {
        borrarComple = false;
        await popupConfirmacion.ShowAsync();
    }
    private async Task abrirPopupConfirmacionGuardar()
    {
        ValidarTodos();
        if (!editContext!.GetValidationMessages().Any())
        {
            borrarComple = false;
            await popupConfirmacionGuardar.ShowAsync();
        }
    }
    private async Task abrirComp()
    {

        await popupComparar.ShowAsync();
    }
    private async Task abrirPlaPre()
    {

        await popupPlaPre.ShowAsync();
    }

    private async Task cerrarPopupCompNvl()
    {
        await popupNewCompleNvl.HideAsync();
    }
    private async Task cerrarPopupConfirmacion()
    {
        await popupConfirmacion.HideAsync();
    }
    private async Task CerrarConfirmacionGuardar()
    {
        await popupConfirmacionGuardar.HideAsync();
    }
    private async Task cerrarComp()
    {
        await popupComparar.HideAsync();
    }
    private async Task cerrarPlaPre()
    {
        await popupPlaPre.HideAsync();
    }
    private string HashRed(int id)
    {
        string link = "/InfoPuestosDeTrabajo?cl=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        return link;
    }
    private void ValidarTodos()
    {
        messageStore?.Clear();
        foreach (var field in Model.FormRPT.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            ValidarYActualizar(field.Name);
        }
        if (Model.FormRPT.IDRPT != null)
        {
            foreach (var field in Model.RetriBasica.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                ValidarYActualizar(field.Name);
            }
            foreach (var field in Model.compleNvlSelect.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                ValidarYActualizar(field.Name);
            }
        }

    }
    private void ValidarYActualizar(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);




        if (fieldName == nameof(Model.FormRPT.IDSITUACION) && (Model.FormRPT.IDSITUACION == 0 || Model.FormRPT.IDSITUACION == null ))
        {
            messageStore?.Add(field, "Seleccione una situación.");
        }

        if (fieldName == nameof(Model.compleNvlSelect.IDNIVEL) && Model.compleNvlSelect.IDNIVEL == 0)
        {
            messageStore?.Add(field, "Seleccione un nivel.");
        }

        if ((fieldName == nameof(Model.FormRPT.EJERCICIO)) && (Model.FormRPT.EJERCICIO > 2099 || Model.FormRPT.EJERCICIO < 2000))
        {
            messageStore?.Add(field, "El año debe estar en un rango entre 2000 y 2099.");
        }

        if (fieldName == nameof(Model.FormRPT.DESCRIPCION) && string.IsNullOrEmpty(Model.FormRPT.DESCRIPCION))
        {
            messageStore?.Add(field, "La descripción es obligatoria.");
        }
        else if (fieldName == nameof(Model.FormRPT.DESCRIPCION) && Model!.FormRPT!.DESCRIPCION!.Length > 100)
        {

            messageStore?.Add(field, "La descripción no puede tener más de 100 caracteres.");
        }


        editContext!.NotifyValidationStateChanged();
    }
    private string GetPlaceholder(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetCssClass(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore![field].Any() ? "is-invalid" : string.Empty;
    }
    private void MostrarErrores()
    {
        messageStore?.Clear();
        foreach (var field in new[] { nameof(Model.FormRPT.IDSITUACION), nameof(Model.compleNvlSelect.IDNIVEL), nameof(Model.FormRPT.DESCRIPCION) })
        {
            ValidarYActualizar(field);
        }
    }
    private void ValidarCompleNvl()
    {
        ValidarYActualizar(nameof(Model.compleNvlSelect.IDNIVEL));
    }

    // MANEJAR GRIDS
    private async Task manejarComplementoNvl(string accion, EditContext? poupCompNVl)
    {

        try
        {

            switch (accion)
            {
                case "update":
                    if (!editContext!.GetValidationMessages().Any())
                    {
                        Model!.compleNvlSelect.IMPORTEANUAL = Model!.compleNvlSelect.IMPORTEMENSUAL * 14;
                        await Utilidades.ActualizarObjeto<COMPLEMENTONIVEL>(cliente, "/api/COMPLEMENTONIVEL/" + Model!.compleNvlSelect.IDCOMPLEMENTONIVEL, Model!.compleNvlSelect);
                        // await gridComplementoNvl();
                        await cerrarPopupCompNvl();
                    }
                    else
                    {
                        return;
                    }
                    break;

                case "create":
                    ValidarCompleNvl();
                    if (!editContext!.GetValidationMessages().Any())
                    {
                        Model!.compleNvlSelect.IDRPT = int.Parse(idRPT);
                        Model!.compleNvlSelect.IMPORTEANUAL = Model!.compleNvlSelect.IMPORTEMENSUAL * 14;

                        await Utilidades.NuevoObjeto<COMPLEMENTONIVEL>(cliente, "/api/COMPLEMENTONIVEL", Model!.compleNvlSelect);

                        listCompleNvl = await gridComplementoNvl(idRPT);

                        await cerrarPopupCompNvl();
                    }
                    else
                    {
                        return;
                    }

                    break;

                case "delete":
                    var responsed = await cliente.DeleteAsync("/api/COMPLEMENTONIVEL/" + Model!.compleNvlSelect.IDCOMPLEMENTONIVEL);
                    // await gridComplementoNvl();
                    listCompleNvl = await gridComplementoNvl(idRPT);
                    await cerrarPopupConfirmacion();

                    break;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }

    }

    // RELLENAR GRIDS
    private async Task<List<RPT_DESCRIP>> gridRPTDescrip(string idRPTBuscar)
    {
        try
        {
            List<RPT_DESCRIP> rptDescrEncontrado = await Utilidades.ObtenerObjeto<List<RPT_DESCRIP>>(cliente, "/api/RPT_DESCRIP/GetWithIncludes/" + idRPTBuscar);

            return rptDescrEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }
    private async Task<List<COMPLEMENTONIVEL>> gridComplementoNvl(string idRPTComplNvl)
    {
        try
        {
            Expression<Func<COMPLEMENTONIVEL, bool>> filtro = x => x.IDRPT == int.Parse(idRPTComplNvl);

            List<COMPLEMENTONIVEL> ComplementoNvlEncontrado = await Utilidades.ObtenerObjeto<List<COMPLEMENTONIVEL>>(cliente, "/api/COMPLEMENTONIVEL/filtrar2", filtro);

            return ComplementoNvlEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }


    // RELLENAR LISTADOS Y FORM
    private async Task<RETRIBUCIONBASICA> rellenarFormComplementos(string idRPTComplementos)
    {
        try
        {
            Expression<Func<RETRIBUCIONBASICA, bool>> filtro = x => x.IDRPT == int.Parse(idRPTComplementos);

            RETRIBUCIONBASICA complementosEncontrado = await Utilidades.ObtenerObjeto<RETRIBUCIONBASICA>(cliente, "/api/RETRIBUCIONBASICA/filtrar-entidad", filtro);

            return complementosEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }
    private async Task rellenarLitadoSolicitudes()
    {
        try
        {
            Expression<Func<ENUMERACIONES, bool>> filtro = x => x.IDGRUPOENUMERACIONNavigation!.GRUPO! == "SITRPTMAESTRO";

            List<ENUMERACIONES> enumsEncontrado = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/filtrar", filtro);

            listadoSolicitudes = enumsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellenarLitadoRPTCopias()
    {
        try
        {
            List<bdAntifraude.db.RPT> rptCopiasEncontrado = await Utilidades.ObtenerObjeto<List<bdAntifraude.db.RPT>>(cliente, "/api/RPT");

            listRPTCopia = rptCopiasEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellenarLitadoNivel()
    {
        try
        {
            List<bdAntifraude.db.NIVEL> nvlsEncontrado = await Utilidades.ObtenerObjeto<List<bdAntifraude.db.NIVEL>>(cliente, "/api/NIVEL");
            listNivel = nvlsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task<List<PUESTOS>> rellenarLitadoPuestos(int idRPTDescPuesto)
    {
        try
        {

            Expression<Func<PUESTOS, bool>> filtro = x => x.IDRPTDES == idRPTDescPuesto && x.IDRPT == Model!.idRPTCopia;

            List<PUESTOS> puestosEncontrados = await Utilidades.ObtenerObjeto<List<PUESTOS>>(cliente, "/api/PUESTOS/filtrar", filtro);

            return puestosEncontrados;

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }

    // GUARDAR
    private async void llamarGuardar()
    {
        await guardarFormulario();
    }
    private async Task guardarFormulario()
    {
        try
        {

            if (!editContext!.GetValidationMessages().Any())
            {
                await guardarRPTForm();

                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 async Task guardarRPTForm()
    {
        try
        {

            if (!string.IsNullOrEmpty(idRPT))
            {
                await Utilidades.ActualizarObjeto<bdAntifraude.db.RPT>(cliente, "/api/RPT/" + Model!.FormRPT.IDRPT, Model!.FormRPT);

                if (Model!.RetriBasica.IDRETRIBUCION != 0)
                {
                    await guardarRetriBasicForm();

                }
                else
                {
                    await agregarRetriBasicForm(int.Parse(idRPT));

                }

            }
            else
            {
                var rptAgregado = await Utilidades.NuevoObjeto<bdAntifraude.db.RPT>(cliente, "/api/RPT", Model!.FormRPT);

                Model!.FormRPT.IDRPT = rptAgregado.IDRPT;

                if (Model!.idRPTCopia != 0)
                {
                    await copiarRPT(rptAgregado);
                }

                string link = "/DesgloseRPT?cl=" + tsUtilidades.crypt.FEncS(rptAgregado.IDRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

                Navigation.NavigateTo(link, forceLoad: true);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task guardarRetriBasicForm()
    {
        try
        {
            await Utilidades.ActualizarObjeto<bdAntifraude.db.RETRIBUCIONBASICA>(cliente, "/api/RETRIBUCIONBASICA/" + Model!.RetriBasica.IDRETRIBUCION, Model!.RetriBasica);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }

    // AGREGAR
    private async Task agregarRetriBasicForm(int idRPTAgreg)
    {
        try
        {
            Model!.RetriBasica.IDRPT = idRPTAgreg;

            await Utilidades.NuevoObjeto<RETRIBUCIONBASICA>(cliente, "/api/RETRIBUCIONBASICA", Model!.RetriBasica);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task<RPT_DESCRIP> agregarRPTDescripGrid(RPT_DESCRIP rptDescri)
    {
        try
        {
            RPT_DESCRIP restDesAgregado = await Utilidades.NuevoObjeto<RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP", rptDescri);

            return restDesAgregado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);

        }
    }
    private async Task agregarCompleNvlGrid(COMPLEMENTONIVEL compleNvl)
    {
        try
        {

            await Utilidades.NuevoObjeto<COMPLEMENTONIVEL>(cliente, "/api/COMPLEMENTONIVEL", compleNvl);

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task agregarPuestos(PUESTOS puesto)
    {
        try
        {
            await Utilidades.NuevoObjeto<PUESTOS>(cliente, "/api/PUESTOS", puesto);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }

    // ELIMINAR
    private async Task borrarRPT()
    {

        var responsed = await cliente.DeleteAsync("/api/RPT/" + idRPT);

        await cerrarPopupConfirmacion();

        Navigation.NavigateTo("/RPT", forceLoad: true);
    }

    //LIMPIAR MODEL
    private void limpiarModel()
    {
        Model = new DesgloseRPTVM();
    }
    private async Task copiarRPT(bdAntifraude.db.RPT rptGuardado)
    {
        List<RPT_DESCRIP> listadoPaCopiar = await gridRPTDescrip(Model!.idRPTCopia.ToString());

        foreach (RPT_DESCRIP rptDescrCopia in listadoPaCopiar)
        {

            RPT_DESCRIP rptDes = new RPT_DESCRIP();

            rptDes.DENOMINACION = rptDescrCopia.DENOMINACION;
            rptDes.CARACTERISTICAS = rptDescrCopia.CARACTERISTICAS;
            rptDes.REQUISITOS = rptDescrCopia.REQUISITOS;
            rptDes.PLAZAS = rptDescrCopia.PLAZAS;
            rptDes.CODIGO = rptDescrCopia.CODIGO;
            rptDes.ESPECIFICO = (decimal)Math.Round(double.Parse((((double)rptDescrCopia.ESPECIFICO! + ((double)rptDescrCopia.ESPECIFICO * Model!.Porcentaje) / 100) / 12).ToString()), 2, MidpointRounding.AwayFromZero) * 12;
            rptDes.EXPERIENCIA = rptDescrCopia.EXPERIENCIA;
            rptDes.TITULO_ESPECIF = rptDescrCopia.TITULO_ESPECIF;
            rptDes.VIRTUAL = rptDescrCopia.VIRTUAL;

            rptDes.IDRPT = rptGuardado.IDRPT;
            rptDes.ADSCRIPCION = rptDescrCopia.ADSCRIPCION;
            rptDes.GRUPO1 = rptDescrCopia.GRUPO1;
            rptDes.GRUPO2 = rptDescrCopia.GRUPO2;
            rptDes.CUERPO1 = rptDescrCopia.CUERPO1;
            rptDes.CUERPO2 = rptDescrCopia.CUERPO2;
            rptDes.IDNIVEL_RPT = rptDescrCopia.IDNIVEL_RPT;
            rptDes.PROVISION = rptDescrCopia.PROVISION;
            rptDes.IDDEPARTAMENTO = rptDescrCopia.IDDEPARTAMENTO;


            RPT_DESCRIP rpt_descriptAgregado = await agregarRPTDescripGrid(rptDes);


            List<PUESTOS> listPuestos = await rellenarLitadoPuestos(rptDescrCopia.IDRPTDES);


            List<PUESTOS> listadoPUESTOSCOPIAR = listPuestos;

            foreach (PUESTOS puestoCopia in listadoPUESTOSCOPIAR)
            {

                PUESTOS puesto = new PUESTOS();

                puesto.CODIGO = puestoCopia.CODIGO;
                puesto.ESTADO = puestoCopia.ESTADO;
                puesto.DOTACION = puestoCopia.DOTACION;
                puesto.ORDEN = puestoCopia.ORDEN;
                puesto.IDRPT = rptGuardado.IDRPT;
                puesto.IDRPTDES = rpt_descriptAgregado.IDRPTDES;
                if (puestoCopia.IDPERSONAL != null){puesto.IDPERSONAL = puestoCopia.IDPERSONAL;}
                puesto.IDOCUPACION = puestoCopia.IDOCUPACION;
                puesto.TITULAR = puestoCopia.TITULAR;
                if (puestoCopia.IDDOTACION != 0){puesto.IDDOTACION = puestoCopia.IDDOTACION;}
                await agregarPuestos(puesto);
                // List<bdAntifraude.db.PUESTOS> listPuestosanti = await Utilidades.ObtenerObjeto<List<PUESTOS>>(cliente, "/api/PUESTOS/GetWithIncludes/" + rptDescrCopia.IDRPTDES);

                // foreach (bdAntifraude.db.PUESTOS pue in listPuestosanti){}

            }

        }

        RETRIBUCIONBASICA retriBasciaCopia = await rellenarFormComplementos(Model!.idRPTCopia.ToString());

        if (retriBasciaCopia != null)
        {

            RETRIBUCIONBASICA nuevaRetriBasica = new RETRIBUCIONBASICA();

            foreach (PropertyInfo property in retriBasciaCopia.GetType().GetProperties())
            {
                var Key = property.Name;
                var Value = property.GetValue(retriBasciaCopia, null);

                var atributo = retriBasciaCopia.GetType().GetProperty(Key);

                if (!Key.Contains("IDR"))
                {

                    double valorADouble = Convert.ToDouble(Value);

                    var atributoTruncado = (decimal)Math.Round(double.Parse(((valorADouble + (valorADouble * Model!.Porcentaje) / 100)).ToString()), 2, MidpointRounding.AwayFromZero);

                    nuevaRetriBasica?.GetType()?.GetProperty(Key)?.SetValue(nuevaRetriBasica, atributoTruncado);

                }

            }

            Model!.RetriBasica = nuevaRetriBasica ?? new RETRIBUCIONBASICA();

            await agregarRetriBasicForm(rptGuardado.IDRPT);
        }

        List<COMPLEMENTONIVEL> listadoCompleNvl = await gridComplementoNvl(Model!.idRPTCopia.ToString());


        foreach (COMPLEMENTONIVEL compleNvlCopia in listadoCompleNvl)
        {

            COMPLEMENTONIVEL compleNvl = new COMPLEMENTONIVEL();

            compleNvl.IMPORTEMENSUAL = (decimal)Math.Round(double.Parse((((double)compleNvlCopia.IMPORTEANUAL! + ((double)compleNvlCopia.IMPORTEANUAL * Model!.Porcentaje) / 100) / 14).ToString()), 2, MidpointRounding.AwayFromZero);
            compleNvl.IMPORTEANUAL = compleNvl.IMPORTEMENSUAL * 14;


            compleNvl.IDNIVEL = compleNvlCopia.IDNIVEL;
            compleNvl.IDRPT = rptGuardado.IDRPT;

            await agregarCompleNvlGrid(compleNvl);
        }

    }
    private void irNuevoPuesto()
    {
        string link = "/InfoPuestosDeTrabajo?np=" + tsUtilidades.crypt.FEncS(idRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        Navigation.NavigateTo(link, forceLoad: true);
    }
    private async Task ImprimeRPT(string tipo)
    {

        try
        {

            Cargando = true;
            cerrarComp();
            ParFicExcel objetoConsulta = new ParFicExcel();

            var txt = "";
            var texto2 = "";
            if (tipo == "ComRpt")
            {
                txt = idRPTComparar;
            }
            else if (tipo == "PlaPre")
            {
                txt = txtProductividad.ToString();
                if (txt.Contains(","))
                {
                    if ((txt.IndexOf(",") + 3) < txt.Length){
                    txt = txt.Substring(0, txt.IndexOf(",") + 3);
                    }
                    txt = txt.PadLeft(txt.IndexOf(",") + 3, '0');
                    
                } 
                else
                {
                    txt = txt + ",00";
                }
            }


            if (txt == "")
            {
                texto2 = RPTEnlazado;
            }
            else
            {
                texto2 = txt;
            }

            objetoConsulta.texto1 = RPTEnlazado;
            objetoConsulta.texto2 = texto2;
            objetoConsulta.Fecha = DateTime.Now.ToString();
            objetoConsulta.ClaveExcel = tipo;

            var token = UserState.Token;
            var client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger2());
            // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response = await client.PostAsJsonAsync("/api/GenerarExcel", objetoConsulta);

            var content = await response.Content.ReadAsStringAsync();

            var ficheroObtenido = JsonConvert.DeserializeObject<ResultadoGenerarExcel>(content);
            if (ficheroObtenido.Resultado == 0)
            {
                string fichBase64 = Convert.ToBase64String(ficheroObtenido.FicheroExcel);
                if (tipo == "ImpRpt" || tipo == "ComRpt")
                {
                    await JS.InvokeVoidAsync("downloadFile", fichBase64, tipo + DateTime.Now.ToString("dd-MM-yyyy") + ".xls");
                }
                else
                {
                    await JS.InvokeVoidAsync("downloadFile", fichBase64, tipo + DateTime.Now.ToString("dd-MM-yyyy") + ".xlsx");
                }
            }
            Cargando = false;
        }
        catch (Exception e)
        {
            Cargando = false;

            Console.WriteLine($"Error al obtener los datos: {e.Message}");

        }
    }
}

<script>
    function downloadFile(base64Data, fileName) {
        const link = document.createElement("a");
        link.href = `data:application/vnd.ms-excel;base64,${base64Data}`;
        link.download = fileName;
        link.style.display = "none";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
</script>
