Files
Antifraude.Net/Antifraude.Net/RegistroPersonalAN/Components/Pages/InfoPuestosDeTrabajo.razor
2026-06-17 08:09:39 +02:00

1212 lines
49 KiB
Plaintext

@page "/InfoPuestosDeTrabajo"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Layout
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using System.Text
@using RegistroPersonalAN.Components.ViewsModels
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using System.Globalization
@using Microsoft.JSInterop
@inject IJSRuntime JSRuntime
@rendermode InteractiveServer
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject NavigationManager Navigation
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="messages" Placement="ToastsPlacement.BottomCenter" />
<Modal @ref="popupNewPuesto" Class="modal-lg" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="true">
<BodyTemplate>
<div class="popupRPCard row">
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Código:</p>
<InputText @bind-Value="puestoSelect.CODIGO" class="inputRP"></InputText>
</div>
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Estado:</p>
<InputText required @bind-Value="puestoSelect.ESTADO" class="inputRP"></InputText>
</div>
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Dotación:</p>
<InputSelect style="width:100%" @bind-Value="puestoSelect.IDDOTACION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(puestoSelect.IDDOTACION))">
<option value="">-- Seleccione una dotación -- </option>
@foreach (var dotacion in listadoDotacion)
{
<option value="@dotacion.IDDOTACION">@dotacion.DESCRIPCION</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(puestoSelect.IDDOTACION))</div>
</div>
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Ocupación:</p>
<InputSelect style="width:100%" @bind-Value="puestoSelect.IDOCUPACION" class="inputForm">
<option value=""> </option>
@foreach (var ocupa in listadoOcupacion)
{
<option value="@ocupa.IDOCUPACION">@ocupa.DESCRIPCION</option>
}
</InputSelect>
</div>
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Persona:</p>
@* <InputSelect style="width:100%" @bind-Value="puestoSelect.IDPERSONAL" class="inputForm">
<option value=""> </option> *@
<div class="row col-12">
<div class="col-11">
<input @bind="filterText" @bind:event="oninput" @onfocus="() =>ShowDropdown(0)" @onblur="() =>HideDropdownAfterDelay(1)"
placeholder="Seleccione una persona" class="inputForm col-12" style="height:41px;" />
@if (showDropdown)
{
<div class="dropdown-list" style="z-index: 10; border: solid; max-height: 400px; display: block; background: white; position: absolute; width: auto; overflow-x: hidden; margin-top:10px;">
@foreach (PERSONAS per in FiltrarPersonas(listadoPersonas, filterText))
{
<div class="dropdown-item" style="cursor:default" @onclick="() => SelectPersona(per)">
@per.APELLIDOS , @per.NOMBRE
</div>
}
</div>
}
</div>
<div class="col-1 p-0"><Button Class="btnOAAFAzul" @onclick="vaciarPersona">X</Button></div>
</div>
</div>
<div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Titular:</p>
<div class="row col-12">
<div class="col-11">
<input @bind="filterTextTit" @bind:event="oninput" @onfocus="() =>ShowDropdown(1)" @onblur="() =>HideDropdownAfterDelay(1)"
placeholder="Seleccione un titular" class="inputForm col-12" style="height:41px;" />
@if (showDropdowntit)
{
<div class="dropdown-list" style="z-index: 10; border: solid; max-height: 400px; display: block; background: white; position: absolute; width: auto; overflow-x: hidden; margin-top:10px;">
@foreach (PERSONAS per in FiltrarTitular(listadoPersonas, filterTextTit))
{
<div class="dropdown-item" style="cursor:default" @onclick="() => SelectTitular(per)">
@per.APELLIDOS , @per.NOMBRE
</div>
}
</div>
}
</div>
<div class="col-1 p-0"><Button Class="btnOAAFAzul" @onclick="vaciarTitular">X</Button></div>
</div>
</div>
@* <div class="col-md-6" style="flex-direction:column">
<p class="lblinputRP">Adscripción:</p>
<InputSelect style="width:100%" @bind-Value="puestoSelect.IDSERVICIOADSCRITO" class="inputForm">
<option value=""> </option>
@foreach (var servicio in listadoServicios)
{
<option value="@servicio.IDSERVICIO">@servicio.DESCRIPCION</option>
}
</InputSelect>
</div> *@
</div>
</BodyTemplate>
<FooterTemplate>
<Button Color="ButtonColor.Secondary" @onclick="cerrarPopupPuesto">Cerrar</Button>
@if (puestoSelect.IDPUESTO != 0)
{
<Button @onclick="@(() => manejarPuestos("update"))" Color="ButtonColor.Primary">Modificar</Button>
}
else
{
<Button @onclick="@(() => manejarPuestos("create"))" Color="ButtonColor.Primary">Añadir</Button>
}
</FooterTemplate>
</Modal>
<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 Class="btnOAAFBlack" @onclick="cerrarPopupConfirmacion">Cerrar</Button>
@if (borrarPuesto)
{
<Button @onclick="@(() => manejarPuestos("delete"))" Color="ButtonColor.Danger">Eliminar</Button>
}
else
{
<Button @onclick="@(() => borrarRPTDes())" Color="ButtonColor.Danger">Eliminar</Button>
}
</FooterTemplate>
</Modal>
@if (cl != null && idRPT == "")
{
<p>Cargando datos...</p>
}
else
{
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-briefcase"></i><b>Puestos de Trabajo (<a href="@HashRed()" id="lblNombre"> @lblNombre</a> )</b></small></h6>
</div>
<EditForm FormName="FormDesgloseRPT" EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" class="formDtosAdmin">
<DataAnnotationsValidator />
<div class="botonera col-12" style="display:flex; gap:5px">
<Button Class="btnOAAFAzul" @onclick="volver"><Icon CustomIconName="fas fa-long-arrow-alt-left"></Icon> </Button>
<Button Class="btnOAAFAzul" Type="ButtonType.Submit"> <Icon CustomIconName="fas fa-save"></Icon> </Button>
<Button Class="btnOAAFAzul" hidden=@ocultarBtnBrr @onclick="abrirPopupConfirmacionRPTDesc"> <Icon CustomIconName="fas fa-trash"></Icon> </Button>
</div>
<Tabs Style="padding-top:50px; width:100%;" EnableFadeEffect="true">
<Tab Title="DATOS RPT" Active="true">
<Content>
<div class="camposficha row">
<div class="col-1 formatoCampos">
<label class="tituloLbl">Código:</label>
<InputText disabled contenteditable="false" @bind-Value="Model!.CODIGO" class="inputForm"></InputText>
</div>
<div class="col-1 formatoCampos">
<label class="tituloLbl">Plazas: *</label>
<input class="form-control @GetCssClass(nameof(Model.PLAZAS))"
type="number"
disabled="@desactivarPlaza"
value="@Model.PLAZAS"
placeholder="@GetPlaceholder(nameof(Model.PLAZAS))"
@oninput="e => ValidarYActualizar(e, nameof(Model.PLAZAS))" />
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.PLAZAS))</div>
</div>
<div class="col-4 formatoCampos">
<label class="tituloLbl">Denominación: *</label>
<input class="form-control @GetCssClass(nameof(Model.DENOMINACION))"
value="@Model!.DENOMINACION"
placeholder="@GetPlaceholder(nameof(Model.DENOMINACION))"
maxlength="190"
@oninput="e => ValidarYActualizar(e, nameof(Model.DENOMINACION))" />
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.DENOMINACION))</div>
</div>
<div class="col-3 formatoCampos">
<label class="tituloLbl">Características Esenciales: </label>
<InputText @bind-Value="Model!.CARACTERISTICAS" class="inputForm"></InputText>
</div>
<div class="col-3 formatoCampos">
<label class="tituloLbl">Requisitos para el desempeño:</label>
<InputText @bind-Value="Model!.REQUISITOS" class="inputForm"></InputText>
</div>
</div>
<div class="camposficha row">
<div class="col-2 formatoCampos">
<label class="tituloLbl">Departamentos: *</label>
<InputSelect @bind-Value="Model!.IDDEPARTAMENTO" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.IDDEPARTAMENTO))">
<option value="0">-- Seleccione un departamento -- </option>
@foreach (var depart in listadoDepartamento)
{
<option value="@depart.IDENUMERACION">@depart.VALORALFABETICOLARGO</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.IDDEPARTAMENTO))</div>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Adscripción: *</label>
<InputSelect @bind-Value="Model!.ADSCRIPCION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.ADSCRIPCION))">
<option value="0">-- Seleccione una adscripción -- </option>
@foreach (var adscrip in listadoAdscri)
{
<option value="@adscrip.IDADSCRIPCION">@adscrip.DESCRIPCION</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.ADSCRIPCION))</div>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Grupo 1: *</label>
@if (np == null)
{
if (Model!.GRUPO1Navigation != null)
{
<InputText disabled @bind-Value="Model!.GRUPO1Navigation!.GRUPO1" class="inputForm"></InputText>
}
}
else
{
<InputSelect @bind-Value="Model!.GRUPO1" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.GRUPO1))">
<option value="0">-- Seleccione un grupo -- </option>
@foreach (var grupo in listadoGrupo)
{
<option value="@grupo.IDGRUPO">@grupo.GRUPO1</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.GRUPO1))</div>
}
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Grupo 2: </label>
<InputSelect @bind-Value="Model!.GRUPO2" class="inputForm">
<option value=""></option>
@foreach (var grupo in listadoGrupo)
{
<option value="@grupo.IDGRUPO">@grupo.GRUPO1</option>
}
</InputSelect>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Específico: *</label>
<div class="d-flex" style="border:solid 1px black;"><input type="number" step="0.01" class="inputForm" @bind-value="Model!.ESPECIFICO" style="text-align:right;border:none; width:100%" /><span style="margin-right:10px;line-height:44px">€</span></div>
@* <CurrencyInput TValue="decimal?" Locale="es-ES" @bind-Value="Model!.ESPECIFICO" Style="text-align:right;" class="inputForm"></CurrencyInput> *@ <div class="validation-message">@GetExternalValidationMessage(nameof(Model.ESPECIFICO))</div>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Nivel: *</label>
<InputSelect @bind-Value="Model!.IDNIVEL_RPT" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.IDNIVEL_RPT))">
<option value="0">-- Seleccione un nivel -- </option>
@foreach (var nivel in listadoNvl)
{
<option value="@nivel.IDNIVEL">@nivel.DESCRIPCION</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.IDNIVEL_RPT))</div>
</div>
</div>
<div class="camposficha row">
<div class="col-2 formatoCampos">
<label class="tituloLbl">Provisión: *</label>
<InputSelect @bind-Value="Model!.PROVISION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.PROVISION))">
<option value="0">-- Seleccione una provisión -- </option>
@foreach (var provisi in listadoProvisi)
{
<option value="@provisi.IDPROVISION">@provisi.DESCRIPCION</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.PROVISION))</div>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Cuerpo 1: *</label>
<InputSelect @bind-Value="Model!.CUERPO1" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.CUERPO1))">
<option value="0">-- Seleccione un cuerpo -- </option>
@foreach (var cuerpo in listadoCuerpo)
{
<option value="@cuerpo.IDCUERPO">@cuerpo.DESCRIPCION</option>
}
</InputSelect>
<div class="validation-message">@GetExternalValidationMessage(nameof(Model.CUERPO1))</div>
</div>
<div class="col-2 formatoCampos">
<label class="tituloLbl">Cuerpo 2:</label>
<InputSelect @bind-Value="Model!.CUERPO2" class="inputForm">
<option value=""></option>
@foreach (var cuerpo in listadoCuerpo)
{
<option value="@cuerpo.IDCUERPO">@cuerpo.DESCRIPCION</option>
}
</InputSelect>
</div>
<div class="col-auto formatoCampos">
<label class="tituloLbl">Art.66.2 DTO 2/2002</label>
<InputCheckbox @bind-Value="Model!.VIRTUAL" class="inputRP"></InputCheckbox>
</div>
<div class="col-auto formatoCampos">
<label class="tituloLbl">Art. 7.1.A RD.365/1995</label>
<InputCheckbox @bind-Value="Model.VIRTUALAC" class="inputForm"></InputCheckbox>
</div>
<div class="col-auto formatoCampos">
<label class="tituloLbl">Art. 7.1.b)RD 365/1995</label>
<InputCheckbox @bind-Value="Model!.VIRTUALAC2" class="inputForm"></InputCheckbox>
</div>
</div>
</Content>
</Tab>
</Tabs>
</EditForm>
@if (!string.IsNullOrEmpty(idRPTDes))
{
<Tabs Style="padding-top:50px; width:100%;" EnableFadeEffect="true">
<Tab Title="Descripción RPT" Active="true">
<Content>
<div style="display:block;gap:10px; margin-bottom:20px;" class="mt-4">
<Button class="btnOAAFAzul" @onclick="@(() => abrirPopupPuestos(new PUESTOS()))"> Nuevo puesto </Button>
<Grid TItem="bdAntifraude.db.PUESTOS"
Class="table tablaRegPers"
Data="listadoPuestos"
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="bdAntifraude.db.PUESTOS" HeaderText="Código" Class="col-1" PropertyName="CODIGO" SortKeySelector="item => item.CODIGO">
@context.CODIGO
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Estado" Class="col-1" PropertyName="ESTADO" SortKeySelector="item => item.ESTADO">
@context.ESTADO
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Dotación" PropertyName="IDDOTACIONNavigation">
@context.IDDOTACIONNavigation?.DESCRIPCION
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Persona" PropertyName="IDPERSONALNavigation">
@context.IDPERSONALNavigation?.NOMBRE @context.IDPERSONALNavigation?.APELLIDOS
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Ocupación" PropertyName="IDOCUPACIONNavigation">
@context.IDOCUPACIONNavigation?.DESCRIPCION
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Titular" PropertyName="TITULARNavigation">
@context.TITULARNavigation?.NOMBRE @context.TITULARNavigation?.APELLIDOS
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Adscripción al servicio" PropertyName="IDRPTNavigation?.IDSITUACIONNavigation">
@context.IDSERVICIOADSCRITONavigation?.DESCRIPCION
</GridColumn>
<GridColumn TItem="bdAntifraude.db.PUESTOS" Class="col-1" HeaderText="">
<span @onclick="@(() => abrirPopupPuestos(@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>
}
</div>
}
@code {
/// ATRIBUTOS
[Parameter]
public string? cl { get; set; } = "";
[Parameter]
public string? np { get; set; } = "";
public bool ocultarBtnBrr { get; set; }
private bool desactivarPlaza { get; set; }
public string idRPTDes { get; set; } = "";
public string idRPT { get; set; } = "";
List<ToastMessage> messages = new List<ToastMessage>();
[SupplyParameterFromForm]
private RPT_DESCRIP Model { get; set; } = new RPT_DESCRIP();
private PUESTOS puestoSelect = new PUESTOS();
private PUESTOS puestoOriginal = new PUESTOS();
private string tituloPopup = "";
private Modal popupNewPuesto = default!;
private Modal popupConfirmacion = default!;
private string lblNombre = "";
public bool borrarPuesto { get; set; }
// LISTADOS PARA COMBOBOX
private List<ENUMERACIONES> listadoDepartamento = new List<ENUMERACIONES>();
private List<ADSCRIPCION> listadoAdscri = new List<ADSCRIPCION>();
private List<GRUPO> listadoGrupo = new List<GRUPO>();
private List<NIVEL> listadoNvl = new List<NIVEL>();
private List<PROVISION> listadoProvisi = new List<PROVISION>();
private List<CUERPO> listadoCuerpo = new List<CUERPO>();
private List<OCUPACION> listadoOcupacion = new List<OCUPACION>();
private List<SERVICIOS> listadoServicios = new List<SERVICIOS>();
private List<DOTACION> listadoDotacion = new List<DOTACION>();
private List<PERSONAS> listadoPersonas = new List<PERSONAS>();
private List<string> listadoGruposRPT = new List<string>();
private bool showDropdown { get; set; }
private bool showDropdowntit { get; set; }
private string filterText { get; set; } = "";
private string filterTextTit { get; set; } = "";
private string linkVolver { get; set; } = "";
//LIST GRID PUESTOS
private List<PUESTOS> listadoPuestos = new List<PUESTOS>();
private HttpClient cliente = new HttpClient();
private EditContext? editContext;
private ValidationMessageStore? messageStore;
private void ShowDropdown(int dropdown)
{
if (dropdown == 0)
{
showDropdown = true;
}
if (dropdown == 1)
{
showDropdowntit = true;
}
}
private async void HideDropdownAfterDelay(int dropdown)
{
// Pequeño delay para no cerrar el dropdown antes de poder hacer clic
// (opcional, puedes eliminarlo si no es necesario)
if (dropdown == 0)
{
await Task.Delay(200);
showDropdown = false;
StateHasChanged();
}
if (dropdown == 1)
{
await Task.Delay(200);
showDropdowntit = false;
StateHasChanged();
}
}
private IEnumerable<PERSONAS> FiltrarPersonas(IEnumerable<PERSONAS> pers, string text)
{
if (string.IsNullOrWhiteSpace(text))
{
// Sin texto: muestra todos
return pers.OrderBy(p => p.APELLIDOS);
}
else
{
// Con texto: filtramos
return pers
.Where(p => p.NOMBRE.Contains(text, StringComparison.OrdinalIgnoreCase) || p.APELLIDOS.Contains(text, StringComparison.OrdinalIgnoreCase))
.OrderBy(p => p.APELLIDOS);
}
}
private void SelectPersona(PERSONAS pers)
{
filterText = pers.NOMBRE + " " + pers.APELLIDOS;
puestoSelect.IDPERSONAL = pers.IDPERSONA;
showDropdown = false;
}
private void vaciarPersona()
{
filterText = "";
puestoSelect.IDPERSONAL = null;
showDropdown = false;
}
private IEnumerable<PERSONAS> FiltrarTitular(IEnumerable<PERSONAS> pers, string text)
{
if (string.IsNullOrWhiteSpace(text))
{
// Sin texto: muestra todos
return pers.OrderBy(p => p.APELLIDOS);
}
else
{
// Con texto: filtramos
return pers
.Where(p => p.NOMBRE.Contains(text, StringComparison.OrdinalIgnoreCase) || p.APELLIDOS.Contains(text, StringComparison.OrdinalIgnoreCase))
.OrderBy(p => p.APELLIDOS);
}
}
private void SelectTitular(PERSONAS pers)
{
filterTextTit = pers.NOMBRE + " " + pers.APELLIDOS;
puestoSelect.TITULAR = pers.IDPERSONA;
showDropdowntit = false;
}
private void vaciarTitular()
{
filterTextTit = "";
puestoSelect.TITULAR = null;
showDropdown = false;
}
protected void volver() { Navigation.NavigateTo(linkVolver, 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;
}
if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("np", out var clValueNp))
{
np = clValueNp;
idRPT = tsUtilidades.crypt.FEncS(np, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
}
idRPTDes = tsUtilidades.crypt.FEncS(cl, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (string.IsNullOrEmpty(idRPTDes))
{
ocultarBtnBrr = true;
await rellenarListados();
await rellenarLitadoDepartamentos();
await rellenarLitadoServicios();
await rellanarListPersonas();
desactivarPlaza = false;
}
else
{
ocultarBtnBrr = false;
desactivarPlaza = true;
Model = await Utilidades.ObtenerObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP/" + idRPTDes);
lblNombre = Model?.IDRPTNavigation?.DESCRIPCION ?? "";
idRPT = Model?.IDRPT.ToString()!;
await rellenarListados();
await rellenarLitadoDepartamentos();
await rellenarLitadoServicios();
await rellanarListPersonas();
await gridPuestos();
var culture = new CultureInfo("es-ES");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
}
linkVolver = "/DesgloseRPT?cl=" + tsUtilidades.crypt.FEncS(idRPT, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
}
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);
switch (fieldName)
{
case nameof(Model.GRUPO1):
if (!string.IsNullOrEmpty(value))
{
Model.GRUPO1 = int.Parse(value);
}
else
{
Model.GRUPO1 = 0;
}
break;
case nameof(Model.PLAZAS):
if (!string.IsNullOrEmpty(value))
{
Model.PLAZAS = int.Parse(value);
}
else
{
Model.PLAZAS = 0;
}
break;
case nameof(Model.DENOMINACION): Model.DENOMINACION = value; break;
case nameof(Model.IDDEPARTAMENTO):
if (!string.IsNullOrEmpty(value))
{
Model.IDDEPARTAMENTO = int.Parse(value);
}
else
{
Model.IDDEPARTAMENTO = 0;
}
break;
case nameof(Model.ADSCRIPCION):
if (!string.IsNullOrEmpty(value))
{
Model.ADSCRIPCION = int.Parse(value);
}
else
{
Model.ADSCRIPCION = 0;
}
break;
case nameof(Model.IDNIVEL_RPT):
if (!string.IsNullOrEmpty(value))
{
Model.IDNIVEL_RPT = int.Parse(value);
}
else
{
Model.IDNIVEL_RPT = 0;
}
break;
case nameof(Model.PROVISION):
if (!string.IsNullOrEmpty(value))
{
Model.PROVISION = int.Parse(value);
}
else
{
Model.PROVISION = 0;
}
break;
case nameof(Model.ESPECIFICO):
if (!string.IsNullOrEmpty(value))
{
string valueString = value.Replace("€", "").Replace(" ", "").Replace(".", "");
Model.ESPECIFICO = decimal.Parse(valueString);
}
else
{
Model.ESPECIFICO = 0;
}
break;
case nameof(Model.CUERPO1):
if (!string.IsNullOrEmpty(value))
{
Model.CUERPO1 = int.Parse(value);
}
else
{
Model.CUERPO1 = 0;
}
break;
case nameof(puestoSelect.IDDOTACION):
if (!string.IsNullOrEmpty(value))
{
puestoSelect.IDDOTACION = int.Parse(value);
}
else
{
puestoSelect.IDDOTACION = 0;
}
break;
}
messageStore?.Clear(field);
if (fieldName == nameof(puestoSelect.IDDOTACION) && puestoSelect.IDDOTACION == 0)
{
messageStore?.Add(field, "Seleccione una dotación.");
}
if (fieldName == nameof(Model.GRUPO1) && Model.GRUPO1 == 0)
{
messageStore?.Add(field, "Seleccione un grupo.");
}
if (fieldName == nameof(Model.IDDEPARTAMENTO) && Model.IDDEPARTAMENTO == 0)
{
messageStore?.Add(field, "Seleccione un departamento.");
}
if (fieldName == nameof(Model.ADSCRIPCION) && Model.ADSCRIPCION == 0)
{
messageStore?.Add(field, "Seleccione una adscripción.");
}
if (fieldName == nameof(Model.IDNIVEL_RPT) && Model.IDNIVEL_RPT == 0)
{
messageStore?.Add(field, "Seleccione un nivel.");
}
if (fieldName == nameof(Model.PROVISION) && Model.PROVISION == 0)
{
messageStore?.Add(field, "Seleccione una provisión.");
}
if (fieldName == nameof(Model.CUERPO1) && Model.CUERPO1 == 0)
{
messageStore?.Add(field, "Seleccione un cuerpo.");
}
if (fieldName == nameof(Model.PLAZAS) && Model.PLAZAS <= 0)
{
messageStore?.Add(field, "El número de plazas debe ser mayor que 0.");
}
if (fieldName == nameof(Model.ESPECIFICO) && Model.ESPECIFICO <= 0)
{
messageStore?.Add(field, "El número específico debe ser mayor que 0.");
}
if (fieldName == nameof(Model.DENOMINACION) && string.IsNullOrEmpty(Model.DENOMINACION))
{
messageStore?.Add(field, "La denominación es obligatoria.");
}
else if (fieldName == nameof(Model.DENOMINACION) && Model!.DENOMINACION!.Length > 100)
{
messageStore?.Add(field, "La denominación no puede tener más de 100 caracteres.");
}
editContext?.NotifyValidationStateChanged();
}
private void ValidarTodo()
{
ValidarYActualizar(new ChangeEventArgs { Value = Model.GRUPO1 }, nameof(Model.GRUPO1));
ValidarYActualizar(new ChangeEventArgs { Value = Model.PLAZAS }, nameof(Model.PLAZAS));
ValidarYActualizar(new ChangeEventArgs { Value = Model.DENOMINACION }, nameof(Model.DENOMINACION));
ValidarYActualizar(new ChangeEventArgs { Value = Model.IDDEPARTAMENTO }, nameof(Model.IDDEPARTAMENTO));
ValidarYActualizar(new ChangeEventArgs { Value = Model.ADSCRIPCION }, nameof(Model.ADSCRIPCION));
ValidarYActualizar(new ChangeEventArgs { Value = Model.IDNIVEL_RPT }, nameof(Model.IDNIVEL_RPT));
ValidarYActualizar(new ChangeEventArgs { Value = Model.PROVISION }, nameof(Model.PROVISION));
ValidarYActualizar(new ChangeEventArgs { Value = Model.CUERPO1 }, nameof(Model.CUERPO1));
ValidarYActualizar(new ChangeEventArgs { Value = Model.ESPECIFICO }, nameof(Model.ESPECIFICO));
}
private void ValidarPuesto()
{
ValidarYActualizar(new ChangeEventArgs { Value = puestoSelect.IDDOTACION }, nameof(puestoSelect.IDDOTACION));
}
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.GRUPO1), nameof(Model.PLAZAS) })
{
ValidarYActualizar(new ChangeEventArgs { Value = typeof(DesgloseRPTVM).GetProperty(field)?.GetValue(Model) }, field);
}
}
private async Task ObtenerDotacionPorId(int idDotacion)
{
try
{
Expression<Func<DOTACION, bool>> filtro = x => x.IDDOTACION == idDotacion;
puestoSelect.IDDOTACIONNavigation = await Utilidades.ObtenerObjeto<DOTACION>(cliente, "/api/DOTACION/filtrar-entidad", filtro);
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
throw new Exception("Mensaje.", e);
}
}
// RELLENAR GRID PUESTOS
private async Task gridPuestos()
{
try
{
Expression<Func<PUESTOS, bool>> filtro = x => x.IDRPTDES == int.Parse(idRPTDes);
listadoPuestos = await Utilidades.ObtenerObjeto<List<PUESTOS>>(cliente, "/api/PUESTOS/GetWithIncludes/" + idRPTDes);
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
private async Task rellanarListPersonas()
{
try
{
Expression<Func<PERSONAS, bool>> filtro = x => x.FECHABAJA.HasValue == false;
listadoPersonas = await Utilidades.ObtenerObjeto<List<PERSONAS>>(cliente, "/api/PERSONAS/filtrar", filtro);
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
throw new Exception("Mensaje.", e);
}
}
// RELLENAR LISTAS
private async Task rellenarListados()
{
try
{
List<string> listadosAEncontrar = new List<string>()
{
"UNIDADADMINISTRATIVA", "ADSCRIPCION", "GRUPO", "NIVEL", "PROVISION", "CUERPO", "OCUPACION","DOTACION"
};
foreach (string listado in listadosAEncontrar)
{
var response = await cliente.GetAsync("/api/" + listado + "/");
if (response.IsSuccessStatusCode)
{
var resultContent = await response.Content.ReadAsStringAsync();
switch (listado)
{
case "ADSCRIPCION":
listadoAdscri = JsonConvert.DeserializeObject<List<ADSCRIPCION>>(resultContent) ?? new List<ADSCRIPCION>();
break;
case "GRUPO":
listadoGrupo = JsonConvert.DeserializeObject<List<GRUPO>>(resultContent) ?? new List<GRUPO>();
break;
case "NIVEL":
listadoNvl = JsonConvert.DeserializeObject<List<NIVEL>>(resultContent) ?? new List<NIVEL>();
break;
case "PROVISION":
listadoProvisi = JsonConvert.DeserializeObject<List<PROVISION>>(resultContent) ?? new List<PROVISION>();
break;
case "CUERPO":
listadoCuerpo = JsonConvert.DeserializeObject<List<CUERPO>>(resultContent) ?? new List<CUERPO>();
break;
case "OCUPACION":
listadoOcupacion = JsonConvert.DeserializeObject<List<OCUPACION>>(resultContent) ?? new List<OCUPACION>();
break;
case "DOTACION":
listadoDotacion = JsonConvert.DeserializeObject<List<DOTACION>>(resultContent) ?? new List<DOTACION>();
break;
}
}
else
{
Console.WriteLine($"Error al obtener los datos: {response.StatusCode}");
}
}
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
private async Task rellenarLitadoServicios()
{
try
{
listadoServicios = await Utilidades.ObtenerObjeto<List<SERVICIOS>>(cliente, "/api/SERVICIOS");
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
private async Task rellenarLitadoDepartamentos()
{
try
{
Expression<Func<ENUMERACIONES, bool>> filtro = x => x.IDGRUPOENUMERACIONNavigation!.GRUPO! == "DEP";
List<ENUMERACIONES> enumsEncontrado = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/filtrar", filtro);
listadoDepartamento = enumsEncontrado;
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
// MANEJAR GRIDS
private async Task manejarPuestos(string accion)
{
try
{
switch (accion)
{
case "update":
ValidarPuesto();
if (!editContext.GetValidationMessages().Any())
{
// if (puestoSelect.PERSONAQUEOCUPA == "" || puestoSelect.PERSONAQUEOCUPA == "N/A") { puestoSelect.IDPERSONAL = null; }
// if (puestoSelect.PERSONAQUETITULAR== "" || puestoSelect.PERSONAQUETITULAR== "N/A") { puestoSelect.TITULAR= null; }
await Utilidades.ActualizarObjeto<PUESTOS>(cliente, "/api/PUESTOS/" + puestoSelect.IDPUESTO, puestoSelect);
await gridPuestos();
await cerrarPopupPuesto();
}
break;
case "create":
ValidarPuesto();
if (!editContext.GetValidationMessages().Any())
{
puestoSelect.IDRPTDES = int.Parse(idRPTDes);
puestoSelect.IDRPT = Model!.IDRPT;
await Utilidades.NuevoObjeto<PUESTOS>(cliente, "/api/PUESTOS", puestoSelect);
await gridPuestos();
await cerrarPopupPuesto();
}
break;
case "delete":
var responsed = await cliente.DeleteAsync("/api/PUESTOS/" + puestoSelect.IDPUESTO);
await gridPuestos();
await cerrarPopupConfirmacion();
break;
}
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
//POPUPS
private async Task abrirPopupPuestos(PUESTOS puesto)
{
puestoSelect = puesto;
if (puesto.IDPUESTO != 0)
{
// puestoOriginal = puesto;
filterText = puestoSelect.PERSONAQUEOCUPA;
filterTextTit = puestoSelect.PERSONAQUETITULAR;
tituloPopup = "Modificar puesto";
}
else
{
filterText = null;
filterTextTit = null;
tituloPopup = "Nuevo puesto";
}
await popupNewPuesto.ShowAsync();
}
private async Task cerrarPopupPuesto()
{
await popupNewPuesto.HideAsync();
}
private async Task cerrarPopupConfirmacion()
{
await popupConfirmacion.HideAsync();
}
// GUARDAR
private async Task guardarFormulario()
{
try
{
ValidarTodo();
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(idRPTDes))
{
var a = await Utilidades.ActualizarObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP/" + Model!.IDRPTDES, Model);
Navigation.NavigateTo(Navigation.Uri, true);
}
else
{
Model!.IDRPT = int.Parse(idRPT);
await ObtenerCodigo();
var rptDesAgregado = await Utilidades.NuevoObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP", Model);
await GenerarPlazas(rptDesAgregado);
string link = "/InfoPuestosDeTrabajo?cl=" + tsUtilidades.crypt.FEncS(rptDesAgregado.IDRPTDES.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
Navigation.NavigateTo(link, forceLoad: true);
}
}
catch (Exception e)
{
Console.WriteLine($"Error al obtener los datos: {e.Message}");
}
}
private async Task ObtenerCodigo()
{
GRUPO grupoSeleccionado = await Utilidades.ObtenerObjeto<GRUPO>(cliente, "/api/GRUPO/" + Model!.GRUPO1.ToString());
listadoGruposRPT = await Utilidades.ObtenerObjeto<List<string>>(cliente, "/api/RPT_DESCRIP/GetAtributo/" + idRPT + "/" + Model!.GRUPO1.ToString());
int ultimoPues = 0;
if (listadoGruposRPT.Count() > 0)
{
ultimoPues = int.Parse(listadoGruposRPT.Last().Split('.')[1]);
}
Model!.CODIGO = grupoSeleccionado?.GRUPO1?.Trim() + "." + (ultimoPues + 1).ToString();
}
private async Task GenerarPlazas(RPT_DESCRIP rptDes)
{
Expression<Func<DOTACION, bool>> filtro = x => x.DOTACION1 == "ND";
DOTACION dotaci = await Utilidades.ObtenerObjeto<DOTACION>(cliente, "/api/DOTACION/filtrar-entidad", filtro);
for (int i = 0; i < rptDes.PLAZAS; i++)
{
PUESTOS pues = new PUESTOS();
pues.CODIGO = rptDes.CODIGO + "." + (i + 1).ToString();
pues.ESTADO = "L";
pues.IDDOTACION = dotaci.IDDOTACION;
pues.ORDEN = i + 1;
pues.IDRPT = rptDes.IDRPT;
pues.IDRPTDES = rptDes.IDRPTDES;
await Utilidades.NuevoObjeto<PUESTOS>(cliente, "/api/PUESTOS", pues);
}
}
// ELIMINAR
private async Task borrarRPTDes()
{
var responsed = await cliente.DeleteAsync("/api/RPT_DESCRIP/" + idRPTDes);
await cerrarPopupConfirmacion();
string idRPTEncriptado = tsUtilidades.crypt.FEncS(idRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
Navigation.NavigateTo("/DesgloseRPT?cl=" + idRPTEncriptado, forceLoad: true);
}
private async Task abrirPopupConfirmacion(PUESTOS puestoBorrar)
{
borrarPuesto = true;
puestoSelect = puestoBorrar;
await popupConfirmacion.ShowAsync();
}
private async Task abrirPopupConfirmacionRPTDesc()
{
borrarPuesto = false;
await popupConfirmacion.ShowAsync();
}
private string HashRed()
{
string link = "/DesgloseRPT?cl=" + tsUtilidades.crypt.FEncS(idRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
return link;
}
}