Compare commits

..

2 Commits

13 changed files with 2546 additions and 116 deletions

View File

@@ -8,26 +8,26 @@
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Bancos</b></small></h6>
<button @onclick="@(() => abrirPopupModificacion(new BANCOS(), true))" class="btnOAAFAzul">Nuevo </button>
</div>
@if (lPuestos == null)
@if (lBancos == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lPuestos.Any())
else if (!lBancos.Any())
{
<p>No se encontraron datos para mostrar.</p>
}
@@ -44,7 +44,7 @@
<div style="overflow-x:auto;" class="tablaDesk">
<Grid TItem="BANCOS"
Class="table tablaRegPers"
Data="@lPuestos"
Data="@lBancos"
AllowFiltering="false"
AllowPaging="false"
AllowSorting="true"
@@ -54,6 +54,9 @@
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="BANCOS" HeaderText="">
<button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
</GridColumn>
<GridColumn TItem="BANCOS" HeaderText="Código" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.CODIGO">
@context.CODIGO
</GridColumn>
@@ -69,16 +72,16 @@
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Tipo" PropertyName="IDTIPOPERSONANavigation.DESCRIPCION" FilterButtonCSSClass="hidden">
@*<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Tipo" PropertyName="IDTIPOPERSONANavigation.DESCRIPCION" FilterButtonCSSClass="hidden">
@context.IDTIPOPERSONANavigation.DESCRIPCION
</GridColumn>
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Fecha baja" PropertyName="FECHABAJA" TextNoWrap="true" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHABAJA">
<GridColumn TItem="BANCOS" HeaderText="Fecha baja" PropertyName="FECHABAJA" TextNoWrap="true" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHABAJA">
@if (context.FECHABAJA != null)
{
@context.FECHABAJA
}
</GridColumn>
</GridColumn> *@
</GridColumns>
</Grid>
@@ -86,7 +89,7 @@
<!-- Vista móvil -->
<div class="tablaMov">
@foreach (var itm in lPuestos)
@foreach (var itm in lBancos)
{
var collapseId = $"collapse{itm.IDBANCO}";
<div class="card collapse-card Aceptada">
@@ -104,10 +107,19 @@
<dd class="col-sm-9">@itm.BIC</dd>
<dt class="col-sm-3">Obsoleto</dt>
<dd class="col-sm-9">
@if(@itm.OBSOLETO)
@itm.OBSOLETO
@* @if(itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
else
{
<i class="fa-regular fa-square-uncheck"></i>
} *@
</dd>
<dd class="col-sm-12">
<button @onclick="@(() => abrirPopupModificacion(@itm, true))" class="btnOAAFAzul">Editar </button>
</dd>
</dl>
</div>
@@ -117,10 +129,48 @@
</div>
}
</div>
<EditForm EditContext="@editContext" OnValidSubmit="GuardarCambiosPopup" OnInvalidSubmit="@MostrarErroresPopup" FormName="costeIndiForm">
<DataAnnotationsValidator></DataAnnotationsValidator>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
<BodyTemplate>
<div class="row">
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Codigo: </label>
<input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.CODIGO" />
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Nombre: </label>
<input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.NOMBRE" />
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">BIC: </label>
<input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.BIC" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Obsoleto: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.OBSOLETO" @bind-value="@ItemEnEdicion.OBSOLETO" />
</div>
</div>
</BodyTemplate>
<FooterTemplate>
<Button Color="ButtonColor.Secondary" @onclick="cerrarPopupModificacion">Cerrar</Button>
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(EsItemNuevo ? "Añadir" : "Modificar")</Button>
</FooterTemplate>
</Modal>
</EditForm>
@code {
private List<BANCOS> lPuestos = new List<BANCOS>();
private List<BANCOS> Puestos = new List<BANCOS>();
private List<BANCOS> lBancos = new List<BANCOS>();
private List<BANCOS> banco = new List<BANCOS>();
private string tituloPopup = "";
private Modal popupGestionDatos = default;
private bool EsItemNuevo = false;
private BANCOS ItemEnEdicion { get; set; } = new BANCOS();
List<ToastMessage> mensajes = new List<ToastMessage>();
private EditContext? editContext;
private string _filter = "";
public string Filter
{
@@ -136,7 +186,7 @@
}
private void AplicarFiltros()
{
lPuestos = Puestos.Where(per =>
lBancos = banco.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.CODIGO).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.NOMBRE.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
@@ -144,57 +194,6 @@
).ToList();
UserState.CurrentPage = 1;
}
// Tamaño de página
// private int pageSize = 6;
// Calcula el total de páginas basado en la lista filtrada
// private int TotalPaginas => (int)Math.Ceiling((double)lPuestos.Count / pageSize);
// Índice inicial y final de elementos para la página actual
// private int FromElement => lPuestos.Count == 0 ? 0 : (UserState.CurrentPage - 1) * pageSize + 1;
// private int ToElement
// {
// get
// {
// if (lPuestos.Count == 0)
// {
// return 0;
// }
// int last = FromElement + pageSize - 1;
// return last > lPuestos.Count ? lPuestos.Count : last;
// }
// }
// Sublista de datos para la página actual basada en la lista filtrada
// private List<TIPOSPUESTOSTRABAJO> lPuestosPaginada =>
// lPuestos.Skip((UserState.CurrentPage - 1) * pageSize).Take(pageSize).ToList();
// private void PaginaAnterior()
// {
// if (UserState.CurrentPage > 1)
// {
// UserState.CurrentPage--;
// }
// }
// private void PaginaSiguiente()
// {
// if (UserState.CurrentPage < TotalPaginas)
// {
// UserState.CurrentPage++;
// }
// }
// private void PrimeraPagina() => UserState.CurrentPage = 1;
// private void UltimaPagina() => UserState.CurrentPage = TotalPaginas;
// private void NuevaPersona()
// {
// NavigationManager.NavigateTo("/InfoPersonas", forceLoad: true);
// }
private string HashRed(string id)
{
string link = "/infoPers?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
875421649);
return link;
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
@@ -211,7 +210,7 @@
var resultPersonas = await client.GetAsync("/BANCOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
banco = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
}
else
@@ -225,15 +224,15 @@
var resultPersonas = await client.GetAsync("/api/BANCOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
banco = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
}
Puestos = Puestos
banco = banco
.OrderBy(x => x.CODIGO)
.ToList();
lPuestos = Puestos;
lBancos = banco;
UserState.CurrentPage = 1;
Filter = "";
}
@@ -242,21 +241,111 @@
{
verTodosActive = false;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var resultPersonas = await client.GetAsync("/api/BANCOS");
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
editContext = new EditContext(lBancos);
var resultPersonas = await cliente.GetAsync("/api/BANCOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
banco = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
Puestos = Puestos.OrderBy(x => x.CODIGO)
banco = banco.OrderBy(x => x.CODIGO)
.ToList();
lPuestos = Puestos;
lBancos = banco;
}
private async Task abrirPopupModificacion(BANCOS objeto, bool esNuevo)
{
ItemEnEdicion = Utilidades.ClonarObjeto(objeto);
EsItemNuevo = esNuevo;
if (!EsItemNuevo)
{
tituloPopup = "Modificando Banco";
}
else
{
tituloPopup = "Nuevo Banco";
}
await popupGestionDatos.ShowAsync();
}
private async Task cerrarPopupModificacion()
{
await popupGestionDatos.HideAsync();
}
// GUARDAR
private async Task GuardarCambiosPopup()
{
try
{
ValidarDatos();
if (!editContext!.GetValidationMessages().Any())
{
string accion = EsItemNuevo ? "create" : "update";
await GestionarDatos(accion);
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Warning,
Message = $"Debe rellenar los campos obligatorios.",
});
}
}
catch (Exception)
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = $"Error al guardar.",
});
}
}
private async Task GestionarDatos(string accion)
{
var copia = new List<BANCOS>(lBancos);
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
switch (accion)
{
case "update":
int indice = copia.FindIndex(x => x.IDBANCO == ItemEnEdicion.IDBANCO);
if (indice > -1)
{
copia[indice] = ItemEnEdicion;
}
var response = await Utilidades.ActualizarObjeto(cliente, "/api/BANCOS/" + ItemEnEdicion.IDBANCO, ItemEnEdicion, mensajes);
break;
case "create":
copia.Add(ItemEnEdicion);
var responsec = await Utilidades.NuevoObjeto(cliente, "/api/BANCOS/", ItemEnEdicion, mensajes);
break;
case "delete":
break;
}
cerrarPopupModificacion();
lBancos = copia.OrderBy(x => x.CODIGO).ToList();
await InvokeAsync(StateHasChanged);
}
private void ValidarDatos()
{
}
private void MostrarErroresPopup()
{
// messageStore?.Clear();
// foreach (var field in new[] { nameof(descripcionItem) })
// {
// ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
// }
}
}

View File

@@ -0,0 +1,291 @@
@page "/ConceptoGeneral"
@page "/ConceptoGeneral/{cl}"
@using BlazorBootstrap
@using GestionPersonalWeb.Components.Pages.FicherosMaestros.TipoPuestoTrabajoComponents
@using Newtonsoft.Json
@using GestionPersonalWeb.Components.Layout
@using Microsoft.AspNetCore.WebUtilities
@using GestionPersonalWeb.Components.Pages.InfoPersComponents
@using GestionPersonalWeb.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation
@* <div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Tipo puesto de trabajo: @puestoTrabajo.DESCRIPCION </b></small></h6>
</div> *@
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="datos-personales-container mt-3">
<div>
<div>
<div><input type="button" class="btnOAAFAzul mb-2" value="Guardar Concepto General" @onclick="GuardarPuestoTrabajo" /></div>
<div class="" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Concepto </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Nombre: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.NOMBRE" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.DESCRIPCION" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="" class="fw-bold">Interviene en pago directo: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.INTERVIENEENPAGODIRECTO" @bind-value="@Concepto.INTERVIENEENPAGODIRECTO" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Retribuciones: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.RETRIBUCIONES" @bind-value="@Concepto.RETRIBUCIONES" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Concepto de Nomina: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.PERTENECENOMINA" @bind-value="@Concepto.PERTENECENOMINA" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="" class="fw-bold">Cotiza Seguridad Social: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.COTIZASEGURIDADSOCIAL" @bind-value="@Concepto.COTIZASEGURIDADSOCIAL" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Deducciones: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.DEDUCCIONES" @bind-value="@Concepto.DEDUCCIONES" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Concepto de Liquidación: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.PERTENECELIQUIDACIONES" @bind-value="@Concepto.PERTENECELIQUIDACIONES" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="" class="fw-bold">Cotiza IRPF: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.COTIZAIRPF" @bind-value="@Concepto.COTIZAIRPF" />
</div>
<div class="col-md-4">
<label for="" class="fw-bold">Extra: </label>
<input type="checkbox" class="form-check" id="chkERetribuciones" checked="@Concepto.EXTRA" @bind-value="@Concepto.EXTRA" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Aplicaciones Presupuestarias </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Nombre: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.CONCEPTOAPLPRES" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Eventual: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESEVENTUAL" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Altos Cargos: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESALTOSCARGOS" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Laboral: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESLABORAL" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Funcionario </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOA1" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOA2" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOB" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOC1" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOC2" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.APLPRESFUNCIONARIOE" />
</div>
</div>
</div>
</div>
<div class="mt-3 mb-5" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Varios </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Tipo: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.TIPO" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Orden: </label>
<input class="form-control" id="txtdni" @bind-value="@Concepto.ORDEN" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter]
public string? cl { get; set; } = "";
private static bdAntifraude.db.CONCEPTOSGENERALES Concepto = new CONCEPTOSGENERALES();
private EditContext editContext = new EditContext(Concepto);
private HttpClient cliente = new HttpClient();
private ValidationMessageStore? messageStore;
private string errorMessage = "";
List<ToastMessage> mensajes = new List<ToastMessage>();
public bool mostrar { get; set; } = true;
public bool mostrarBtn { get; set; } = false;
protected override async Task OnInitializedAsync()
{
try
{
var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
{
cl = clValue;
}
if (string.IsNullOrEmpty(cl))
{
Concepto = new CONCEPTOSGENERALES();
mostrarBtn = true;
}
else
{
// ListaSexos = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/SEXO");
string idDesencriptado = Utilidades.Desencriptar(cl);
int id = int.Parse(idDesencriptado);
var response = await cliente.GetAsync($"/api/CONCEPTOSGENERALES/{id}");
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Error al obtener los datos del Tipo de Trabajo. Código: {response.StatusCode}");
}
var resultContent = await response.Content.ReadAsStringAsync();
Concepto = JsonConvert.DeserializeObject<CONCEPTOSGENERALES>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
}
editContext = new EditContext(Concepto);
messageStore = new ValidationMessageStore(editContext);
mostrar = false;
}
catch (Exception ex)
{
errorMessage = ex.Message;
Console.WriteLine($"Error durante la inicialización: {ex.Message}");
mostrar = false;
}
finally
{
mostrar = false;
}
}
private async Task GuardarPuestoTrabajo()
{
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (!editContext.GetValidationMessages().Any())
{
if (Concepto.IDCONCEPTOSGENERALES == 0)//Nuevo
{
var response = await Utilidades.NuevoObjeto(cliente, "/api/CONCEPTOSGENERALES", Concepto, mensajes);
if (response != null)
{
Concepto = response;
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Success,
Message = $"Guardado Correctamente.",
});
}
await InvokeAsync(StateHasChanged);
}
else//Guardar
{
var response = await Utilidades.ActualizarObjeto(cliente, "/api/CONCEPTOSGENERALES/" + Concepto.IDCONCEPTOSGENERALES, Concepto, mensajes);
}
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = Utilidades.ListaErroresHtml(editContext.GetValidationMessages()),
});
}
}
}

View File

@@ -17,8 +17,13 @@
@inject UserState UserState
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Conceptos Generales</b></small></h6>
<div class="d-flex">
<div class="cabecera">
<h6 style="padding-top: 13px;padding-right: 15px;">
<b>Conceptos Generales</b>
</h6>
</div>
<a href="/ConceptoGeneral" class="btnOAAFAzul" style="text-decoration:none">Nuevo </a>
</div>
@if (lConceptos == null)
@@ -113,7 +118,7 @@
private string HashRed(string id)
{
string link = "/infoPers?cl=" + tsUtilidades.crypt.FEncS(
string link = "/ConceptoGeneral?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",

View File

@@ -0,0 +1,304 @@
@page "/Contrato"
@page "/Contrato/{cl}"
@using BlazorBootstrap
@using GestionPersonalWeb.Components.Pages.FicherosMaestros.TipoPuestoTrabajoComponents
@using Newtonsoft.Json
@using GestionPersonalWeb.Components.Layout
@using Microsoft.AspNetCore.WebUtilities
@using GestionPersonalWeb.Components.Pages.InfoPersComponents
@using GestionPersonalWeb.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation
@* <div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Tipo puesto de trabajo: @puestoTrabajo.DESCRIPCION </b></small></h6>
</div> *@
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="datos-personales-container mt-3">
<div>
<div>
<div><input type="button" class="btnOAAFAzul mb-2" value="Guardar Contrato" @onclick="GuardarPuestoTrabajo" /></div>
<div class="" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Contrato </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Codigo: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iContrato.CODIGO" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtDescripcion" @bind-value="@iContrato.DESCRIPCION" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Contigencias Comunes </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.CONTCOMUNPORCENTEMPR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.CONTCOMUNIMPORTEEMPR" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.CONTCOMUNPORCENTTRAB" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.CONTCOMUNIMPORTEEMPR" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Formación Profesional </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FORMACIONPROFPORCENTEMPR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FORMACIONPROFIMPORTEEMPR" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FORMACIONPROFPORCENTTRAB" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FORMACIONPROFIMPORTETRAB" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Desempleo </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.DESEMPLEOPORCENTAJEEMPRESA" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.DESEMPLEOIMPORTEEMPRESA" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.DESEMPLEOPORCENTAJETRABAJADOR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.DESEMPLEOIMPORTETRABAJADOR" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> FOGASA </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FOGASAPORCENTAJEEMPRESA" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FOGASAIMPORTEEMPRESA" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FOGASAPORCENTAJETRABAJADOR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.FOGASAIMPORTETRABAJADOR" />
</div>
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> MEI </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.MEIPORCENTAJEEMPRESA" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.MEIIMPORTEEMPRESA" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">% Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.MEIPORCENTAJETRABAJADOR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Importe Empresa: </label>
<input class="form-control" id="txtdni" @bind-value="@iContrato.MEIIMPORTETRABAJADOR" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter]
public string? cl { get; set; } = "";
private static bdAntifraude.db.CONTRATOS iContrato = new CONTRATOS();
private EditContext editContext = new EditContext(iContrato);
private HttpClient cliente = new HttpClient();
private ValidationMessageStore? messageStore;
private string errorMessage = "";
List<ToastMessage> mensajes = new List<ToastMessage>();
public bool mostrar { get; set; } = true;
public bool mostrarBtn { get; set; } = false;
protected override async Task OnInitializedAsync()
{
try
{
var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
{
cl = clValue;
}
if (string.IsNullOrEmpty(cl))
{
iContrato = new CONTRATOS();
mostrarBtn = true;
}
else
{
string idDesencriptado = Utilidades.Desencriptar(cl);
int id = int.Parse(idDesencriptado);
var response = await cliente.GetAsync($"/api/CONTRATOS/{id}");
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Error al obtener los datos del Contrato. Código: {response.StatusCode}");
}
var resultContent = await response.Content.ReadAsStringAsync();
iContrato = JsonConvert.DeserializeObject<CONTRATOS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
}
editContext = new EditContext(iContrato);
messageStore = new ValidationMessageStore(editContext);
mostrar = false;
}
catch (Exception ex)
{
errorMessage = ex.Message;
Console.WriteLine($"Error durante la inicialización: {ex.Message}");
mostrar = false;
}
finally
{
mostrar = false;
}
}
private async Task GuardarPuestoTrabajo()
{
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (!editContext.GetValidationMessages().Any())
{
if (iContrato.IDCONTRATO == 0)//Nuevo
{
var response = await Utilidades.NuevoObjeto(cliente, "/api/CONTRATOS", iContrato, mensajes);
if (response != null)
{
iContrato = response;
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Success,
Message = $"Guardado Correctamente.",
});
}
await InvokeAsync(StateHasChanged);
}
else//Guardar
{
var response = await Utilidades.ActualizarObjeto(cliente, "/api/CONTRATOS/" + iContrato.IDCONTRATO, iContrato, mensajes);
}
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = Utilidades.ListaErroresHtml(editContext.GetValidationMessages()),
});
}
}
}

View File

@@ -1,5 +1,233 @@
<h3>Contratos</h3>
@page "/Contratos"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="d-flex">
<div class="cabecera">
<h6 style="padding-top: 13px;padding-right: 15px;">
<b>Contratos</b>
</h6>
</div>
<a href="/Contrato" class="btnOAAFAzul" style="text-decoration:none">Nuevo </a>
</div>
@if (lContratos == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lContratos.Any())
{
<p>No se encontraron datos para mostrar.</p>
}
else
{
<div class="botonera col-12 gap-1" style="display:flex;" role="group">
</div>
<div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
<div class="form-group mt-4 mb-4">
<input class="form-control" type="text" placeholder="Filtrar..."
@bind-value="Filter" @bind-value:event="oninput" />
</div>
<div style="overflow-x:auto;" class="">
<Grid TItem="CONTRATOS"
Class="table tablaRegPers"
Data="@lContratos"
AllowFiltering="false"
AllowPaging="false"
AllowSorting="true"
EmptyText="No se han encontrado datos"
Height="80"
PageSizeSelectorVisible="false"
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="CONTRATOS" HeaderText="Descripción" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
<NavLink class="btn btn-link" href="@HashRed(context.IDCONTRATO.ToString())">@context.CODIGO</NavLink>
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESCRIPCION
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Contigencias Comunes Empresa" PropertyName="CONTCOMUNPORCENTEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.CONTCOMUNPORCENTEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Contigencias Comunes Trabajador" PropertyName="CONTCOMUNPORCENTTRAB" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.CONTCOMUNPORCENTTRAB
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Contigencias Comunes Empresa" PropertyName="CONTCOMUNIMPORTEEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.CONTCOMUNIMPORTEEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Contigencias Comunes Trabajador" PropertyName="CONTCOMUNIMPORTETRAB" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.CONTCOMUNIMPORTETRAB
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Formación Profesional Empresa" PropertyName="FORMACIONPROFPORCENTEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FORMACIONPROFPORCENTEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Formación Profesional Trabajador" PropertyName="FORMACIONPROFPORCENTTRAB" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FORMACIONPROFPORCENTTRAB
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Formación Profesional Empresa" PropertyName="FORMACIONPROFIMPORTEEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FORMACIONPROFIMPORTEEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Formacion Profesional Trabajador" PropertyName="FORMACIONPROFIMPORTETRAB" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FORMACIONPROFIMPORTETRAB
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Accidentes IT-IMS CNAE Empresa" PropertyName="ACCITIMSCNAEPORCENTEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.ACCITIMSCNAEPORCENTEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Accidentes IT-IMS CNAE Trabajador" PropertyName="ACCITIMSCNAEPORCENTTRAB" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.ACCITIMSCNAEPORCENTTRAB
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Accidentes IT-IMS CNAE Empresa" PropertyName="ACCITIMSCNAEIMPORTEEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.ACCITIMSCNAEIMPORTEEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Accidentes IT-IMS CNAE Trabajador" PropertyName="ACCITIMSCNAEIMPORTEEMPR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.ACCITIMSCNAEIMPORTEEMPR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Desempleo Empresa" PropertyName="DESEMPLEOPORCENTAJEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESEMPLEOPORCENTAJEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% Desempleo Trabajador" PropertyName="DESEMPLEOPORCENTAJETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESEMPLEOPORCENTAJETRABAJADOR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Desempleo Empresa" PropertyName="DESEMPLEOIMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESEMPLEOIMPORTEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe Desempleo Trabajador" PropertyName="DESEMPLEOIMPORTETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESEMPLEOIMPORTETRABAJADOR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% FOGASA Empresa" PropertyName="FOGASAPORCENTAJEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FOGASAPORCENTAJEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% FOGASA Trabajador" PropertyName="FOGASAPORCENTAJETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FOGASAPORCENTAJETRABAJADOR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe FOGASA Empresa" PropertyName="FOGASAIMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FOGASAIMPORTEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe FOGASA Trabajador" PropertyName="FOGASAIMPORTETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.FOGASAIMPORTETRABAJADOR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% MEI Empresa" PropertyName="MEIPORCENTAJEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.MEIPORCENTAJEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="% MEI Trabajador" PropertyName="MEIPORCENTAJETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.MEIPORCENTAJETRABAJADOR
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe MEI Empresa" PropertyName="MEIIMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.MEIIMPORTEEMPRESA
</GridColumn>
<GridColumn TItem="CONTRATOS" HeaderText="Importe MEI Trabajador" PropertyName="MEIIMPORTETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.MEIIMPORTETRABAJADOR
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
}
</div>
@code {
List<CONTRATOS> lContratos = new List<CONTRATOS>();
private List<CONTRATOS> contratos = new List<CONTRATOS>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lContratos = contratos.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).ToList();
UserState.CurrentPage = 1;
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
List<ToastMessage> mensajes = new List<ToastMessage>();
private async Task ToggleVerTodos()
{
if (!verTodosActive)
{
verTodosActive = true;
var token = UserState.Token;
var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await client.GetAsync("/CONTRATOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
contratos = JsonConvert.DeserializeObject<List<CONTRATOS>>(resultContent)
?? new List<CONTRATOS>();
}
else
{
verTodosActive = false;
var token = UserState.Token;
var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await client.GetAsync("/api/CONTRATOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
contratos = JsonConvert.DeserializeObject<List<CONTRATOS>>(resultContent)
?? new List<CONTRATOS>();
}
contratos = contratos.ToList();
lContratos = contratos;
UserState.CurrentPage = 1;
Filter = "";
}
protected override async Task OnInitializedAsync()
{
verTodosActive = false;
var token = UserState.Token;
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await cliente.GetAsync("/api/CONTRATOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
contratos = JsonConvert.DeserializeObject<List<CONTRATOS>>(resultContent) ?? new List<CONTRATOS>();
contratos = contratos.ToList();
lContratos = contratos;
}
private string HashRed(string id)
{
string link = "/Contrato?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
875421649);
return link;
}
}

View File

@@ -0,0 +1,297 @@
@page "/CuentaCotizacion"
@page "/CuentaCotizacion/{cl}"
@using BlazorBootstrap
@using GestionPersonalWeb.Components.Pages.FicherosMaestros.TipoPuestoTrabajoComponents
@using Newtonsoft.Json
@using GestionPersonalWeb.Components.Layout
@using Microsoft.AspNetCore.WebUtilities
@using GestionPersonalWeb.Components.Pages.InfoPersComponents
@using GestionPersonalWeb.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation
@* <div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Tipo puesto de trabajo: @puestoTrabajo.DESCRIPCION </b></small></h6>
</div> *@
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="datos-personales-container mt-3">
<div>
<div>
<div><input type="button" class="btnOAAFAzul mb-2" value="Guardar Cuenta Cotización" @onclick="GuardarPuestoTrabajo" /></div>
<div class="" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Cuenta Cotizacion Patronal</b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Codigo: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.CODIGO" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtDescripcion" @bind-value="@iCuentaContizacion.REGIMEN" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtDescripcion" @bind-value="@iCuentaContizacion.AUTORIZADO" />
</div>
</div>
<div class="row mb-3">
<div class="col-md-2">
<label for="" class="fw-bold">Funcionario: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.FUNCIONARIO" @bind-value="@iCuentaContizacion.FUNCIONARIO" />
</div>
<div class="col-md-2">
<label for="" class="fw-bold">Laboral: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.LABORAL" @bind-value="@iCuentaContizacion.LABORAL" />
</div>
<div class="col-md-2">
<label for="" class="fw-bold">Obsoleto: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.EVENTUAL" @bind-value="@iCuentaContizacion.EVENTUAL" />
</div>
<div class="col-md-2">
<label for="" class="fw-bold">Interino: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.INTERINO" @bind-value="@iCuentaContizacion.INTERINO" />
</div>
<div class="col-md-2">
<label for="" class="fw-bold">Alto Cargo: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.ALTOCARGO" @bind-value="@iCuentaContizacion.ALTOCARGO" />
</div>
<div class="col-md-2">
<label for="" class="fw-bold">Diputado en asignación: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@iCuentaContizacion.DIPUTADOSENASIGNACION" @bind-value="@iCuentaContizacion.DIPUTADOSENASIGNACION" />
</div>
</div>
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Nombre: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.NOMBRE" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.DESCRIPCION" />
</div>
</div>
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Entidad y ATyEP: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.ENTIDAD" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">IPF: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.IPF" />
</div>
</div>
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">IBAN Liquidaciones Deudoras: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.IBANLIQUIDACIONESDEUDORAS" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">IBAN Liquidaciones Acreedoras: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.IBANLIQUIDACIONESACREEDORAS" />
</div>
</div>
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Letra Identificación Fichero: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.LETRAIDENTIFICACIONFICHERO" />
</div>
</div>
</div>
<div class="mt-3" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Coeficientes Reductores, Contigencias Excluidas </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Coeficiente Reductor Empresa: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.COEFICIENTEREDUCTOREMPRESA" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Coeficiente Reductor Trabajador: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.COEFICIENTEREDUCTORTRABAJADOR" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Coeficiente Reductor Total: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.COEFICIENTEREDUCTORTOTAL" />
</div>
</div>
</div>
</div>
</div>
<div class="mt-3 mb-5" style=" padding: 20px;border:solid 1px grey">
<div class="col-md-12 mb-3">
<h6><b> Datos del titular </b></h6>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Tipo IPF: </label>
<InputSelect @bind-Value="@iCuentaContizacion.IDTITULARTIPOIPF" class="form-select">
<option value="">Seleccionar</option>
@if (lTipoIPF != null)
{
@foreach (var enumera in lTipoIPF)
{
<option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
}
}
</InputSelect>
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">IPF: </label>
<input class="form-control" id="txtCodigo" @bind-value="@iCuentaContizacion.IPF" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Nombre: </label>
<input class="form-control" id="txtdni" @bind-value="@iCuentaContizacion.TITULARNOMBRE" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Fecha Alta: </label>
<input type="date" class="form-control" id="txtEFecha" @bind-value="@iCuentaContizacion.FECHAALTA" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Fecha Baja: </label>
<input type="date" class="form-control" id="txtEFecha" @bind-value="@iCuentaContizacion.FECHABAJA" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter]
public string? cl { get; set; } = "";
private static bdAntifraude.db.CUENTASCOTIZACIONPATRONAL iCuentaContizacion = new CUENTASCOTIZACIONPATRONAL();
private EditContext editContext = new EditContext(iCuentaContizacion);
private HttpClient cliente = new HttpClient();
private ValidationMessageStore? messageStore;
private string errorMessage = "";
List<ToastMessage> mensajes = new List<ToastMessage>();
public bool mostrar { get; set; } = true;
public bool mostrarBtn { get; set; } = false;
private List<ENUMERACIONES> lTipoIPF = new List<ENUMERACIONES>();
protected override async Task OnInitializedAsync()
{
try
{
var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
{
cl = clValue;
}
if (string.IsNullOrEmpty(cl))
{
iCuentaContizacion = new CUENTASCOTIZACIONPATRONAL();
mostrarBtn = true;
}
else
{
string idDesencriptado = Utilidades.Desencriptar(cl);
int id = int.Parse(idDesencriptado);
var response = await cliente.GetAsync($"/api/CUENTASCOTIZACIONPATRONAL/{id}");
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Error al obtener los datos. Código: {response.StatusCode}");
}
var resultContent = await response.Content.ReadAsStringAsync();
iCuentaContizacion = JsonConvert.DeserializeObject<CUENTASCOTIZACIONPATRONAL>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
}
editContext = new EditContext(iCuentaContizacion);
messageStore = new ValidationMessageStore(editContext);
mostrar = false;
lTipoIPF = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPIPF");
}
catch (Exception ex)
{
errorMessage = ex.Message;
Console.WriteLine($"Error durante la inicialización: {ex.Message}");
mostrar = false;
}
finally
{
mostrar = false;
}
}
private async Task GuardarPuestoTrabajo()
{
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (!editContext.GetValidationMessages().Any())
{
if (iCuentaContizacion.IDCUENTACOTIZACIONPATRONAL == 0)//Nuevo
{
var response = await Utilidades.NuevoObjeto(cliente, "/api/CUENTASCOTIZACIONPATRONAL", iCuentaContizacion, mensajes);
if (response != null)
{
iCuentaContizacion = response;
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Success,
Message = $"Guardado Correctamente.",
});
}
await InvokeAsync(StateHasChanged);
}
else//Guardar
{
var response = await Utilidades.ActualizarObjeto(cliente, "/api/CUENTASCOTIZACIONPATRONAL/" + iCuentaContizacion.IDCUENTACOTIZACIONPATRONAL, iCuentaContizacion, mensajes);
}
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = Utilidades.ListaErroresHtml(editContext.GetValidationMessages()),
});
}
}
}

View File

@@ -1,5 +1,129 @@
<h3>CuentasCotizacion</h3>
@page "/CuentasCotizacion"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="d-flex">
<div class="cabecera">
<h6 style="padding-top: 13px;padding-right: 15px;">
<b>Cuentas Cotización</b>
</h6>
</div>
<a href="/CuentaCotizacion" class="btnOAAFAzul" style="text-decoration:none">Nuevo </a>
</div>
@if (lCuentasCotizacion == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lCuentasCotizacion.Any())
{
<p>No se encontraron datos para mostrar.</p>
}
else
{
<div class="botonera col-12 gap-1" style="display:flex;" role="group">
</div>
<div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
<div class="form-group mt-4 mb-4">
<input class="form-control" type="text" placeholder="Filtrar..."
@bind-value="Filter" @bind-value:event="oninput" />
</div>
<div style="overflow-x:auto;" class="">
<Grid TItem="CUENTASCOTIZACIONPATRONAL"
Class="table tablaRegPers"
Data="@lCuentasCotizacion"
AllowFiltering="false"
AllowPaging="false"
AllowSorting="true"
EmptyText="No se han encontrado datos"
Height="80"
PageSizeSelectorVisible="false"
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="CUENTASCOTIZACIONPATRONAL" HeaderText="Descripción" PropertyName="NOMBRE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
<NavLink class="btn btn-link" href="@HashRed(context.IDCUENTACOTIZACIONPATRONAL.ToString())">@context.NOMBRE</NavLink>
</GridColumn>
<GridColumn TItem="CUENTASCOTIZACIONPATRONAL" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESCRIPCION
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
}
</div>
@code {
List<CUENTASCOTIZACIONPATRONAL> lCuentasCotizacion = new List<CUENTASCOTIZACIONPATRONAL>();
private List<CUENTASCOTIZACIONPATRONAL> cuentasCoti = new List<CUENTASCOTIZACIONPATRONAL>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lCuentasCotizacion = cuentasCoti.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).ToList();
UserState.CurrentPage = 1;
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
List<ToastMessage> mensajes = new List<ToastMessage>();
protected override async Task OnInitializedAsync()
{
verTodosActive = false;
var token = UserState.Token;
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await cliente.GetAsync("/api/CUENTASCOTIZACIONPATRONAL");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
cuentasCoti = JsonConvert.DeserializeObject<List<CUENTASCOTIZACIONPATRONAL>>(resultContent) ?? new List<CUENTASCOTIZACIONPATRONAL>();
cuentasCoti = cuentasCoti.ToList();
lCuentasCotizacion = cuentasCoti;
}
private string HashRed(string id)
{
string link = "/CuentaCotizacion?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
875421649);
return link;
}
}

View File

@@ -8,7 +8,6 @@
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@@ -16,9 +15,15 @@
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b>Fiestas</b></small></h6>
<div class="d-flex">
<div class="cabecera">
<h6 style="padding-top: 13px;padding-right: 15px;">
<b>Fiestas</b>
</h6>
</div>
<button @onclick="@(() => abrirPopupModificacion(new FIESTAS(), true))" class="btnOAAFAzul">Nuevo </button>
</div>
@if (lFiestas == null)
@@ -54,6 +59,9 @@
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="FIESTAS" HeaderText="">
<button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
</GridColumn>
<GridColumn TItem="FIESTAS" Style="width:10%" HeaderText="Fecha" PropertyName="FECHA" FilterTextboxWidth="50" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHA">
@context.FECHA.Value.ToString().Substring(0,10)
</GridColumn>
@@ -70,11 +78,40 @@
}
</div>
<!--Popup de edicion-->
<EditForm EditContext="@editContext" OnValidSubmit="GuardarCambiosPopup" OnInvalidSubmit="@MostrarErroresPopup" FormName="fiestasForm">
<DataAnnotationsValidator></DataAnnotationsValidator>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
<BodyTemplate>
<div class="row">
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Fecha: </label>
<input type="date" class="form-control" id="txtEFecha" @bind-value="@ItemEnEdicion.FECHA" />
</div>
<div class="col-md-12">
<label for="txtEDescripcion" class="fw-bold">Descripcion: </label>
<input class="form-control" id="txtEDescripcion" @bind-value="@ItemEnEdicion.DESCRIPCION" />
</div>
</div>
</BodyTemplate>
<FooterTemplate>
<Button Color="ButtonColor.Secondary" @onclick="cerrarPopupModificacion">Cerrar</Button>
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(EsItemNuevo ? "Añadir" : "Modificar")</Button>
</FooterTemplate>
</Modal>
</EditForm>
@code {
private List<FIESTAS> lFiestas = new List<FIESTAS>();
List<FIESTAS> lFiestas = new List<FIESTAS>();
private List<FIESTAS> fiestas = new List<FIESTAS>();
private string _filter = "";
private string tituloPopup = "";
private Modal popupGestionDatos = default;
private bool EsItemNuevo = false;
private FIESTAS ItemEnEdicion { get; set; } = new FIESTAS();
private EditContext? editContext;
public string Filter
{
get => _filter;
@@ -95,18 +132,9 @@
).ToList();
UserState.CurrentPage = 1;
}
private string HashRed(string id)
{
string link = "/infoPers?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
875421649);
return link;
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
List<ToastMessage> mensajes = new List<ToastMessage>();
private async Task ToggleVerTodos()
{
@@ -114,10 +142,7 @@
{
verTodosActive = true;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await client.GetAsync("/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
@@ -128,10 +153,7 @@
{
verTodosActive = false;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await client.GetAsync("/api/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
@@ -152,12 +174,10 @@
{
verTodosActive = false;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
editContext = new EditContext(lFiestas);
var resultPersonas = await client.GetAsync("/api/FIESTAS");
var resultPersonas = await cliente.GetAsync("/api/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
?? new List<FIESTAS>();
@@ -169,5 +189,96 @@
lFiestas = fiestas;
}
private async Task abrirPopupModificacion(FIESTAS objeto, bool esNuevo)
{
ItemEnEdicion = Utilidades.ClonarObjeto(objeto);
EsItemNuevo = esNuevo;
if (!EsItemNuevo)
{
tituloPopup = "Modificando Fiesta";
}
else
{
tituloPopup = "Nueva Fiesta";
}
await popupGestionDatos.ShowAsync();
}
private async Task cerrarPopupModificacion()
{
await popupGestionDatos.HideAsync();
}
private async Task GuardarCambiosPopup()
{
try
{
ValidarDatos();
if (!editContext!.GetValidationMessages().Any())
{
string accion = EsItemNuevo ? "create" : "update";
await GestionarDatos(accion);
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Warning,
Message = $"Debe rellenar los campos obligatorios.",
});
}
}
catch (Exception)
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = $"Error al guardar.",
});
}
}
private async Task GestionarDatos(string accion)
{
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var copia = new List<FIESTAS>(lFiestas);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
switch (accion)
{
case "update":
int indice = copia.FindIndex(x => x.IDFIESTA == ItemEnEdicion.IDFIESTA);
if (indice > -1)
{
copia[indice] = ItemEnEdicion;
}
var response = await Utilidades.ActualizarObjeto(cliente, "/api/FIESTAS/" + ItemEnEdicion.IDFIESTA, ItemEnEdicion, mensajes);
break;
case "create":
copia.Add(ItemEnEdicion);
var responsec = await Utilidades.NuevoObjeto(cliente, "/api/FIESTAS/", ItemEnEdicion, mensajes);
break;
case "delete":
break;
}
cerrarPopupModificacion();
lFiestas = copia.ToList();
await InvokeAsync(StateHasChanged);
}
private void ValidarDatos()
{
}
private void MostrarErroresPopup()
{
// messageStore?.Clear();
// foreach (var field in new[] { nameof(descripcionItem) })
// {
// ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
// }
}
}

View File

@@ -0,0 +1,476 @@
@page "/TiposTramosSiltra"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Tipos tramos SILTRA</b></small></h6>
<button @onclick="@(() => abrirPopupModificacion(new TIPOSTRAMOS(), true))" class="btnOAAFAzul">Nuevo </button>
</div>
@if (lTiposTramoSiltra == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lTiposTramoSiltra.Any())
{
<p>No se encontraron datos para mostrar.</p>
}
else
{
<div class="botonera col-12 gap-1" style="display:flex;" role="group">
</div>
<div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
<div class="form-group mt-4 mb-4">
<input class="form-control" type="text" placeholder="Filtrar..."
@bind-value="Filter" @bind-value:event="oninput" />
</div>
<div style="overflow-x:auto;" class="tablaDesk">
<Grid TItem="TIPOSTRAMOS"
Class="table tablaRegPers"
Data="@lTiposTramoSiltra"
AllowFiltering="false"
AllowPaging="false"
AllowSorting="true"
EmptyText="No se han encontrado datos"
Height="80"
PageSizeSelectorVisible="false"
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="">
<button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Código" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.CODIGO">
@context.CODIGO
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESCRIPCION
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Código Tramo Acumulado" PropertyName="IDCODIGOTRAMOACUMULA" FilterButtonCSSClass="hidden">
@if (@context.IDCODIGOTRAMOACUMULA != null)
{
lTiposTramoSiltra.First(x => x.IDCODIGOTRAMOACUMULA == @context.IDCODIGOTRAMOACUMULA);
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="SOLICITADOALUSUARIO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.SOLICITADOALUSUARIO">
@if (context.SOLICITADOALUSUARIO)
{
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Regimen Aplicación" PropertyName="IDREGIMENAPLICACION" FilterButtonCSSClass="hidden" >
@if (@context.IDREGIMENAPLICACION != null)
{
lRegimenAplicacion.First(x => x.IDENUMERACION == @context.IDREGIMENAPLICACION);
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Tipo Fichero XML" PropertyName="IDTIPOTRAMOFICHEROXML" FilterButtonCSSClass="hidden">
@if (@context.IDTIPOTRAMOFICHEROXML != null)
{
lTipoFicheroXml.First(x => x.IDENUMERACION == @context.IDTIPOTRAMOFICHEROXML);
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="SEMANDAIMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.SEMANDAIMPORTEEMPRESA">
@if (context.SEMANDAIMPORTEEMPRESA)
{
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="MODIFICABLE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.MODIFICABLE">
@if (context.MODIFICABLE)
{
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
<GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="RESTAENACUMULADO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.RESTAENACUMULADO">
@if (context.RESTAENACUMULADO)
{
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
<div class="tablaMov">
@foreach (var itm in lTiposTramoSiltra)
{
var collapseId = $"collapse{itm.IDTIPOTRAMOS}";
<div class="card collapse-card Aceptada">
<div class="card-header mb-1" data-bs-toggle="collapse" data-bs-target="#@collapseId" aria-expanded="false" aria-controls="@collapseId">
<h5 class="mb-0">@itm.DESCRIPCION</h5>
</div>
<div id="@collapseId" class="collapse">
<div class="card-body">
<dl class="row">
<dt class="col-sm-3">Código</dt>
<dd class="col-sm-9">@itm.CODIGO</dd>
<dt class="col-sm-3">Descripcion</dt>
<dd class="col-sm-9">@itm.DESCRIPCION</dd>
<dt class="col-sm-3">Código Tramo Acumulado</dt>
<dd class="col-sm-9">
@if (@itm.IDCODIGOTRAMOACUMULANavigation != null)
{
@itm.IDCODIGOTRAMOACUMULANavigation.CODIGO
}
</dd>
<dt class="col-sm-3">Solicitado al usuario</dt>
<dd class="col-sm-9">
@itm.SOLICITADOALUSUARIO
@* @if(itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
else
{
<i class="fa-regular fa-square-uncheck"></i>
} *@
</dd>
<dt class="col-sm-3">Regimen Aplicación</dt>
<dd class="col-sm-9">@itm.IDREGIMENAPLICACIONNavigation</dd>
<dt class="col-sm-3">Tipo Fichero XML</dt>
<dd class="col-sm-9">
@if (@itm.IDTIPOTRAMOFICHEROXMLNavigation != null)
{
@itm.IDTIPOTRAMOFICHEROXMLNavigation.DESCRIPCION
}
</dd>
<dt class="col-sm-3">Se Manda Importe a Empresa</dt>
<dd class="col-sm-9">
@itm.SEMANDAIMPORTEEMPRESA
@* @if(itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
else
{
<i class="fa-regular fa-square-uncheck"></i>
} *@
</dd>
<dt class="col-sm-3">Modificable</dt>
<dd class="col-sm-9">
@itm.MODIFICABLE
@* @if(itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
else
{
<i class="fa-regular fa-square-uncheck"></i>
} *@
</dd>
<dt class="col-sm-3">Resta en Acumulado</dt>
<dd class="col-sm-9">
@itm.RESTAENACUMULADO
@* @if(itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
else
{
<i class="fa-regular fa-square-uncheck"></i>
} *@
</dd>
<dd class="col-sm-12">
<button @onclick="@(() => abrirPopupModificacion(@itm, true))" class="btnOAAFAzul">Editar </button>
</dd>
</dl>
</div>
</div>
</div>
}
</div>
}
</div>
<EditForm EditContext="@editContext" OnValidSubmit="GuardarCambiosPopup" OnInvalidSubmit="@MostrarErroresPopup" FormName="TiposTramoSiltraForm">
<DataAnnotationsValidator></DataAnnotationsValidator>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
<BodyTemplate>
<div class="row">
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Codigo: </label>
<input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.CODIGO" />
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Descripción: </label>
<input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.DESCRIPCION" />
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Codigo Tramo Acumulado: </label>
<InputSelect @bind-Value="@ItemEnEdicion.IDCODIGOTRAMOACUMULA" class="form-select">
<option value="">Seleccionar</option>
@if (lTiposTramoSiltra != null)
{
@foreach (var enumera in lTiposTramoSiltra)
{
<option value="@enumera.IDTIPOTRAMOS">@enumera.DESCRIPCION</option>
}
}
</InputSelect>
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Regimen Aplicación: </label>
<InputSelect @bind-Value="ItemEnEdicion.IDREGIMENAPLICACION" class="form-select">
<option value="">Seleccionar</option>
@if (lRegimenAplicacion != null)
{
@foreach (var enumera in lRegimenAplicacion)
{
<option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
}
}
</InputSelect>
</div>
<div class="col-md-12">
<label for="txtEDesc" class="fw-bold">Tipo Fichero XML: </label>
<InputSelect @bind-Value="ItemEnEdicion.IDTIPOTRAMOFICHEROXML" class="form-select">
<option value="">Seleccionar</option>
@if (lTipoFicheroXml != null)
{
@foreach (var enumera in lTipoFicheroXml)
{
<option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
}
}
</InputSelect>
</div>
<div class="col-md-6">
<label for="" class="fw-bold">Se Manda Importe a Empresa: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.SEMANDAIMPORTEEMPRESA" @bind-value="@ItemEnEdicion.SEMANDAIMPORTEEMPRESA" />
</div>
<div class="col-md-6">
<label for="" class="fw-bold">Modificable: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.MODIFICABLE" @bind-value="@ItemEnEdicion.MODIFICABLE" />
</div>
<div class="col-md-6">
<label for="" class="fw-bold">Resta en Acumulado: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.RESTAENACUMULADO" @bind-value="@ItemEnEdicion.RESTAENACUMULADO" />
</div>
<div class="col-md-6">
<label for="" class="fw-bold">Solicitado Al Usuario: </label>
<input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.SOLICITADOALUSUARIO" @bind-value="@ItemEnEdicion.SOLICITADOALUSUARIO" />
</div>
</div>
</BodyTemplate>
<FooterTemplate>
<Button Color="ButtonColor.Secondary" @onclick="cerrarPopupModificacion">Cerrar</Button>
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(EsItemNuevo ? "Añadir" : "Modificar")</Button>
</FooterTemplate>
</Modal>
</EditForm>
@code {
private List<TIPOSTRAMOS> lTiposTramoSiltra = new List<TIPOSTRAMOS>();
private List<TIPOSTRAMOS> banco = new List<TIPOSTRAMOS>();
private string tituloPopup = "";
private Modal popupGestionDatos = default;
private bool EsItemNuevo = false;
private TIPOSTRAMOS ItemEnEdicion { get; set; } = new TIPOSTRAMOS();
List<ToastMessage> mensajes = new List<ToastMessage>();
private EditContext? editContext;
private List<ENUMERACIONES> lTipoFicheroXml = new List<ENUMERACIONES>();
private List<ENUMERACIONES> lRegimenAplicacion = new List<ENUMERACIONES>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lTiposTramoSiltra = banco.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.CODIGO).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).ToList();
UserState.CurrentPage = 1;
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
private async Task ToggleVerTodos()
{
if (!verTodosActive)
{
verTodosActive = true;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var resultPersonas = await client.GetAsync("/TIPOSTRAMOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
banco = JsonConvert.DeserializeObject<List<TIPOSTRAMOS>>(resultContent)
?? new List<TIPOSTRAMOS>();
}
else
{
verTodosActive = false;
var token = UserState.Token;
var client = HttpClientFactory.CreateClient();
client.BaseAddress = new Uri(Utilidades.urlSwagger());
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var resultPersonas = await client.GetAsync("/api/TIPOSTRAMOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
banco = JsonConvert.DeserializeObject<List<TIPOSTRAMOS>>(resultContent)
?? new List<TIPOSTRAMOS>();
}
banco = banco
.OrderBy(x => x.CODIGO)
.ToList();
lTiposTramoSiltra = banco;
UserState.CurrentPage = 1;
Filter = "";
}
protected override async Task OnInitializedAsync()
{
verTodosActive = false;
var token = UserState.Token;
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
editContext = new EditContext(lTiposTramoSiltra);
var resultPersonas = await cliente.GetAsync("/api/TIPOSTRAMOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
banco = JsonConvert.DeserializeObject<List<TIPOSTRAMOS>>(resultContent)
?? new List<TIPOSTRAMOS>();
banco = banco.OrderBy(x => x.CODIGO)
.ToList();
lTiposTramoSiltra = banco;
lTipoFicheroXml = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPTRAXML");
lRegimenAplicacion = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/REGAPL");
}
private async Task abrirPopupModificacion(TIPOSTRAMOS objeto, bool esNuevo)
{
ItemEnEdicion = Utilidades.ClonarObjeto(objeto);
EsItemNuevo = esNuevo;
if (!EsItemNuevo)
{
tituloPopup = "Modificando Tipo Tramo Siltra";
}
else
{
tituloPopup = "Nuevo Tipo Tramo Siltra";
}
await popupGestionDatos.ShowAsync();
}
private async Task cerrarPopupModificacion()
{
await popupGestionDatos.HideAsync();
}
// GUARDAR
private async Task GuardarCambiosPopup()
{
try
{
ValidarDatos();
if (!editContext!.GetValidationMessages().Any())
{
string accion = EsItemNuevo ? "create" : "update";
await GestionarDatos(accion);
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Warning,
Message = $"Debe rellenar los campos obligatorios.",
});
}
}
catch (Exception)
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = $"Error al guardar.",
});
}
}
private async Task GestionarDatos(string accion)
{
var copia = new List<TIPOSTRAMOS>(lTiposTramoSiltra);
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
switch (accion)
{
case "update":
int indice = copia.FindIndex(x => x.IDTIPOTRAMOS == ItemEnEdicion.IDTIPOTRAMOS);
if (indice > -1)
{
copia[indice] = ItemEnEdicion;
}
var response = await Utilidades.ActualizarObjeto(cliente, "/api/TIPOSTRAMOS/" + ItemEnEdicion.IDTIPOTRAMOS, ItemEnEdicion, mensajes);
break;
case "create":
copia.Add(ItemEnEdicion);
var responsec = await Utilidades.NuevoObjeto(cliente, "/api/TIPOSTRAMOS/", ItemEnEdicion, mensajes);
break;
case "delete":
break;
}
cerrarPopupModificacion();
lTiposTramoSiltra = copia.OrderBy(x => x.CODIGO).ToList();
await InvokeAsync(StateHasChanged);
}
private void ValidarDatos()
{
}
private void MostrarErroresPopup()
{
// messageStore?.Clear();
// foreach (var field in new[] { nameof(descripcionItem) })
// {
// ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
// }
}
}

View File

@@ -0,0 +1,363 @@
@page "/ValorNomina"
@page "/ValorNomina/{cl}"
@using BlazorBootstrap
@using GestionPersonalWeb.Components.Pages.FicherosMaestros.TipoPuestoTrabajoComponents
@using Newtonsoft.Json
@using GestionPersonalWeb.Components.Layout
@using Microsoft.AspNetCore.WebUtilities
@using GestionPersonalWeb.Components.Pages.InfoPersComponents
@using GestionPersonalWeb.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation
@* <div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Tipo puesto de trabajo: @puestoTrabajo.DESCRIPCION </b></small></h6>
</div> *@
<style>
.caj {
padding: 20px;
border: solid 1px grey
}
.caja {
padding: 20px;
border: solid 1px grey;
margin:5px;
}
</style>
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="datos-personales-container mt-3">
<div>
<div>
<div><input type="button" class="btnOAAFAzul mb-2" value="Guardar" @onclick="GuardarPuestoTrabajo" /></div>
<div class="caj">
<div class="col-md-12">
<div class="row mb-3">
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Fecha Inicio: </label>
<input class="form-control" type="date" id="txtdni" @bind-value="@oValorNomina.FECHAINCIO" />
</div>
<div class="col-md-4">
<label for="txtdni" class="fw-bold">Fecha Fin: </label>
<input class="form-control" type="date" id="txtdni" @bind-value="@oValorNomina.FECHAFIN" />
</div>
</div>
</div>
</div>
<div class="mt-3 mb-5" style="">
<div class="col-md-12 mb-3">
<h6><b> Valor Nomina </b></h6>
</div>
<div class="row">
<div class="col-md-2">
<div class="caja">
<h6><b> Sueldos </b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOA1" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOA2" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOB" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOC1" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOC2" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOE" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Sueldos Extra</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOA1X" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOA2X" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOBX" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOC1X" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOC2X" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.SUELDOEX" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Trienio Administración</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMA1" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMA2" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMB" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMC1" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMC2" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADME" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Trienio Administración Extra</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMA1X" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMA2X" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMBX" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMC1X" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMC2X" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIADMEX" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Trienio Oficina Antifraude</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARA1" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARA2" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARB" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARC1" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARC2" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARE" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Trienio Oficina Antifraude Extra</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARA1X" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARA2X" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARBX" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARC1X" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPARC2X" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.TRIPAREX" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Complemento Carrera Tramo I</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA1" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA2" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRB" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC1" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC2" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRE" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Complemento Carrera Tramo II</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA1II" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA2II" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRBII" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC1II" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC2II" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARREII" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Complemento Carrera Tramo III</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA1III" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA2III" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRBIII" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC1III" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC2III" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARREIII" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Complemento Carrera Tramo IV</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA1IV" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA2IV" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRBIV" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC1IV" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC2IV" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARREIV" />
</div>
</div>
<div class="col-md-2">
<div class="caja">
<h6><b>Complemento Carrera Tramo V</b></h6>
<label for="txtdni" class="fw-bold">A1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA1V" />
<label for="txtdni" class="fw-bold">A2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRA2V" />
<label for="txtdni" class="fw-bold">B: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRBV" />
<label for="txtdni" class="fw-bold">C1: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC1V" />
<label for="txtdni" class="fw-bold">C2: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARRC2V" />
<label for="txtdni" class="fw-bold">E: </label>
<input class="form-control" id="txtdni" @bind-value="@oValorNomina.COMCARREV" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter]
public string? cl { get; set; } = "";
private static bdAntifraude.db.VALORESNOMINA oValorNomina = new VALORESNOMINA();
private EditContext editContext = new EditContext(oValorNomina);
private HttpClient cliente = new HttpClient();
private ValidationMessageStore? messageStore;
private string errorMessage = "";
List<ToastMessage> mensajes = new List<ToastMessage>();
public bool mostrar { get; set; } = true;
public bool mostrarBtn { get; set; } = false;
protected override async Task OnInitializedAsync()
{
try
{
var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
{
cl = clValue;
}
if (string.IsNullOrEmpty(cl))
{
oValorNomina = new VALORESNOMINA();
mostrarBtn = true;
}
else
{
// ListaSexos = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/SEXO");
string idDesencriptado = Utilidades.Desencriptar(cl);
int id = int.Parse(idDesencriptado);
var response = await cliente.GetAsync($"/api/VALORESNOMINA/{id}");
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Error al obtener los datos del Tipo de Trabajo. Código: {response.StatusCode}");
}
var resultContent = await response.Content.ReadAsStringAsync();
oValorNomina = JsonConvert.DeserializeObject<VALORESNOMINA>(resultContent) ?? throw new Exception("Error al deserializar los datos.");
}
editContext = new EditContext(oValorNomina);
messageStore = new ValidationMessageStore(editContext);
mostrar = false;
}
catch (Exception ex)
{
errorMessage = ex.Message;
Console.WriteLine($"Error durante la inicialización: {ex.Message}");
mostrar = false;
}
finally
{
mostrar = false;
}
}
private async Task GuardarPuestoTrabajo()
{
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
if (!editContext.GetValidationMessages().Any())
{
if (oValorNomina.IDVALNOMINA == 0)//Nuevo
{
var response = await Utilidades.NuevoObjeto(cliente, "/api/VALORESNOMINA", oValorNomina, mensajes);
if (response != null)
{
oValorNomina = response;
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Success,
Message = $"Guardado Correctamente.",
});
}
await InvokeAsync(StateHasChanged);
}
else//Guardar
{
var response = await Utilidades.ActualizarObjeto(cliente, "/api/VALORESNOMINA/" + oValorNomina.IDVALNOMINA, oValorNomina, mensajes);
}
}
else
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = Utilidades.ListaErroresHtml(editContext.GetValidationMessages()),
});
}
}
}

View File

@@ -1,5 +1,104 @@
<h3>ValoresNomina</h3>
@page "/ValoresNomina"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
<div class="d-flex">
<div class="cabecera">
<h6 style="padding-top: 13px;padding-right: 15px;">
<b>Valores Nomina</b>
</h6>
</div>
<a href="/ValorNomina" class="btnOAAFAzul" style="text-decoration:none">Nuevo </a>
</div>
@if (lValoresNomina == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lValoresNomina.Any())
{
<p>No se encontraron datos para mostrar.</p>
}
else
{
<div class="botonera col-12 gap-1" style="display:flex;" role="group">
</div>
<div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
<div style="overflow-x:auto;" class="">
<Grid TItem="VALORESNOMINA"
Class="table tablaRegPers"
Data="@lValoresNomina"
AllowFiltering="false"
AllowPaging="false"
AllowSorting="true"
EmptyText="No se han encontrado datos"
Height="80"
PageSizeSelectorVisible="false"
Responsive="true"
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns>
<GridColumn TItem="VALORESNOMINA" HeaderText="Fecha Inicio" PropertyName="FECHAINCIO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHAINCIO">
<NavLink class="btn btn-link" href="@HashRed(context.IDVALNOMINA.ToString())">@context.FECHAINCIO</NavLink>
</GridColumn>
<GridColumn TItem="VALORESNOMINA" HeaderText="Fecha Fin" PropertyName="FECHAFIN" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHAFIN">
@context.FECHAFIN
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
}
</div>
@code {
List<VALORESNOMINA> lValoresNomina = new List<VALORESNOMINA>();
private List<VALORESNOMINA> cuentasCoti = new List<VALORESNOMINA>();
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
List<ToastMessage> mensajes = new List<ToastMessage>();
protected override async Task OnInitializedAsync()
{
verTodosActive = false;
var token = UserState.Token;
var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
var resultPersonas = await cliente.GetAsync("/api/VALORESNOMINA");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
cuentasCoti = JsonConvert.DeserializeObject<List<VALORESNOMINA>>(resultContent) ?? new List<VALORESNOMINA>();
cuentasCoti = cuentasCoti.ToList();
lValoresNomina = cuentasCoti;
}
private string HashRed(string id)
{
string link = "/ValorNomina?cl=" + tsUtilidades.crypt.FEncS(
id,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
875421649);
return link;
}
}

View File

@@ -1,5 +1,8 @@
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace SwaggerAntifraude.Controllers
{
@@ -11,5 +14,30 @@ namespace SwaggerAntifraude.Controllers
: base()
{
}
[HttpGet]
public override async Task<IActionResult> GetAll()
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
var entities = await context.TIPOSTRAMOS
.Include(x => x.IDTIPOTRAMOFICHEROXMLNavigation)
.Include(x => x.IDCODIGOTRAMOACUMULANavigation)
.Include(x => x.IDREGIMENAPLICACIONNavigation)
.AsNoTracking()
.ToListAsync();
//.Include(v => v.IDSERVICIOADSCRITONavigation)
//.Include(v => v.IDUNIDADADMINISTRATIVANavigation)
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
}
}

View File

@@ -0,0 +1,15 @@
using bdAntifraude.db;
using Microsoft.AspNetCore.Mvc;
namespace SwaggerAntifraude.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class VALORESNOMINAController : GenericoController<VALORESNOMINA, int>
{
public VALORESNOMINAController()
: base()
{
}
}
}