Compare commits

...

2 Commits

Author SHA1 Message Date
95fa241611 arreglo infopersonas 2026-04-16 09:40:55 +02:00
cfe2984494 avance gestionPersonalWeb 2026-04-14 10:54:45 +02:00
16 changed files with 960 additions and 243 deletions

View File

@@ -47,7 +47,7 @@
<Collapse Id="CollapseFich" Class="show" @ref="collapse1" Horizontal="true">
<Card Style="width:100%;">
<CardBody Style="flex-direction: column;display: flex;text-align: center;padding:0;">
<a class="btnGrisNav" href="/FicherosMaestros/Adscripciones">Trabajadores</a>
<a class="btnGrisNav" href="/">Trabajadores</a>
<a class="btnGrisNav" href="/FicherosMaestros/CausasAlta">Generar Nóminas</a>
<a class="btnGrisNav" href="/FicherosMaestros/CausasBaja">Nóminas</a>
</CardBody>
@@ -110,14 +110,14 @@
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" style="font-family:'Satoshi'; color:white" href="#" id="tabFichMaestros" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">FICHEROS MAESTROS</a>
<div class="dropdown-menu" id="dropFicherosMaestros" style="font-family: 'Satoshi';" aria-labelledby="dropFicherosMaestros">
<a class="dropdown-item" href="/trabajadores">Tipos puestos trabajo</a>
<a class="dropdown-item" href="/trabajadores">Conceptos generales</a>
<a class="dropdown-item" href="/trabajadores">Fiestas</a>
<a class="dropdown-item" href="/trabajadores">Bancos</a>
<a class="dropdown-item" href="/trabajadores">Concratos</a>
<a class="dropdown-item" href="/trabajadores">Tipos tramos SILTRA</a>
<a class="dropdown-item" href="/trabajadores">Cuentas cotización</a>
<a class="dropdown-item" href="/trabajadores">Valores nómina</a>
<a class="dropdown-item" href="/TiposPuestosTrabajo">Tipos puestos trabajo</a>
<a class="dropdown-item" href="/ConceptosGenerales">Conceptos generales</a>
<a class="dropdown-item" href="/Fiestas">Fiestas</a>
<a class="dropdown-item" href="/Bancos">Bancos</a>
<a class="dropdown-item" href="/Contratos">Concratos</a>
<a class="dropdown-item" href="/TiposTramosSiltra">Tipos tramos SILTRA</a>
<a class="dropdown-item" href="/CuentasCotizacion">Cuentas cotización</a>
<a class="dropdown-item" href="/ValoresNomina">Valores nómina</a>
</div>
</li>

View File

@@ -0,0 +1,262 @@
@page "/Bancos"
@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
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Bancos</b></small></h6>
</div>
@if (lPuestos == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lPuestos.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="BANCOS"
Class="table tablaRegPers"
Data="@lPuestos"
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="BANCOS" HeaderText="Código" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.CODIGO">
@context.CODIGO
</GridColumn>
<GridColumn TItem="BANCOS" HeaderText="Nombre" PropertyName="NOMBRE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.NOMBRE">
@context.NOMBRE
</GridColumn>
<GridColumn TItem="BANCOS" HeaderText="BIC" PropertyName="BIC" FilterButtonCSSClass="hidden" SortKeySelector="item => item.BIC">
@context.BIC
</GridColumn>
<GridColumn TItem="BANCOS" HeaderText="Obsoleto" PropertyName="OBSOLETO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.OBSOLETO">
@if (context.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
</GridColumn>
<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">
@if (context.FECHABAJA != null)
{
@context.FECHABAJA
}
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
<div class="tablaMov">
@foreach (var itm in lPuestos)
{
var collapseId = $"collapse{itm.IDBANCO}";
<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.NOMBRE</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">Nombre</dt>
<dd class="col-sm-9">@itm.NOMBRE</dd>
<dt class="col-sm-3">BIC</dt>
<dd class="col-sm-9">@itm.BIC</dd>
<dt class="col-sm-3">Obsoleto</dt>
<dd class="col-sm-9">
@if(@itm.OBSOLETO)
{
<i class="fa-regular fa-square-check"></i>
}
</dd>
</dl>
</div>
</div>
</div>
}
</div>
}
</div>
@code {
private List<BANCOS> lPuestos = new List<BANCOS>();
private List<BANCOS> Puestos = new List<BANCOS>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lPuestos = Puestos.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) ||
Utilidades.RemoveDiacritics(per.BIC.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).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;
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("/BANCOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
}
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/BANCOS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
}
Puestos = Puestos
.OrderBy(x => x.CODIGO)
.ToList();
lPuestos = Puestos;
UserState.CurrentPage = 1;
Filter = "";
}
protected override async Task OnInitializedAsync()
{
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 resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
?? new List<BANCOS>();
Puestos = Puestos.OrderBy(x => x.CODIGO)
.ToList();
lPuestos = Puestos;
}
}

View File

@@ -0,0 +1,188 @@
@page "/ConceptosGenerales"
@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
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b> Conceptos Generales</b></small></h6>
</div>
@if (lConceptos == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lConceptos.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="CONCEPTOSGENERALES"
Class="table tablaRegPers"
Data="@lConceptos"
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="CONCEPTOSGENERALES" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
<NavLink class="btn btn-link" href="@HashRed(context.IDCONCEPTOSGENERALES.ToString())">@context.DESCRIPCION</NavLink>
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
@* <div class="tablaMov">
@foreach (var itm in lPuestos)
{
var collapseId = $"collapse{itm.IDTIPOPUESTO}";
<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">Descripción</dt>
<dd class="col-sm-9"><a href="@HashRed(itm.IDTIPOPUESTO.ToString())">@itm.DESCRIPCION</a></dd>
</dl>
</div>
</div>
</div>
}
</div> *@
}
</div>
@code {
private List<CONCEPTOSGENERALES> lConceptos = new List<CONCEPTOSGENERALES>();
private List<CONCEPTOSGENERALES> Conceptos = new List<CONCEPTOSGENERALES>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lConceptos = Conceptos.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).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;
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("/CONCEPTOSGENERALES");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Conceptos = JsonConvert.DeserializeObject<List<CONCEPTOSGENERALES>>(resultContent)
?? new List<CONCEPTOSGENERALES>();
}
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/CONCEPTOSGENERALES");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Conceptos = JsonConvert.DeserializeObject<List<CONCEPTOSGENERALES>>(resultContent)
?? new List<CONCEPTOSGENERALES>();
}
Conceptos = Conceptos
.OrderBy(x => x.DESCRIPCION)
.ToList();
lConceptos = Conceptos;
UserState.CurrentPage = 1;
Filter = "";
}
protected override async Task OnInitializedAsync()
{
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/CONCEPTOSGENERALES");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Conceptos = JsonConvert.DeserializeObject<List<CONCEPTOSGENERALES>>(resultContent)
?? new List<CONCEPTOSGENERALES>();
Conceptos = Conceptos
.OrderBy(x => x.DESCRIPCION)
.ToList();
lConceptos = Conceptos;
}
}

View File

@@ -0,0 +1,5 @@
<h3>Contratos</h3>
@code {
}

View File

@@ -0,0 +1,5 @@
<h3>CuentasCotizacion</h3>
@code {
}

View File

@@ -0,0 +1,173 @@
@page "/fiestas"
@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
<div class="pagina">
<div class="Cabecera">
<h6><small><i class="fas fa-user"></i><b>Fiestas</b></small></h6>
</div>
@if (lFiestas == null)
{
<div id="cargando" class="loadingFrame">
<div class="loadingImg"></div>
</div>
}
else if (!lFiestas.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="FIESTAS"
Class="table tablaRegPers"
Data="@lFiestas"
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="FIESTAS" Style="width:10%" HeaderText="Fecha" PropertyName="FECHA" FilterTextboxWidth="50" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHA">
@context.FECHA.Value.ToString().Substring(0,10)
</GridColumn>
<GridColumn TItem="FIESTAS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
@context.DESCRIPCION
</GridColumn>
</GridColumns>
</Grid>
</div>
<!-- Vista móvil -->
}
</div>
@code {
private List<FIESTAS> lFiestas = new List<FIESTAS>();
private List<FIESTAS> fiestas = new List<FIESTAS>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lFiestas = fiestas.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).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;
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("/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
?? new List<FIESTAS>();
}
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/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
?? new List<FIESTAS>();
}
fiestas = fiestas
.OrderByDescending(x => x.FECHA)
.ToList();
lFiestas = fiestas;
UserState.CurrentPage = 1;
Filter = "";
}
protected override async Task OnInitializedAsync()
{
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/FIESTAS");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
?? new List<FIESTAS>();
fiestas = fiestas
.OrderByDescending(x => x.FECHA)
.ToList();
lFiestas = fiestas;
}
}

View File

@@ -34,19 +34,6 @@
else
{
<div class="botonera col-12 gap-1" style="display:flex;" role="group">
@* <button type="button" class="btnOAAFBlack" id="btnNuevaPers" title="Añadir nueva persona" @onclick="NuevaPersona">
<i class="fa-solid fa-user-plus"></i>
</button> *@
@* <button type="button" class="btnOAAFBlack" @onclick="btnExportarExcel" id="btnExportarExcel" title="Exportar excel">
<i class="fa-solid fa-file-export"></i>
</button>
<!-- Botón "Ver Todos" con toggle: se asigna btnOAAFAzul cuando está activo -->
<button type="button" id="btnVerTodos" @onclick="ToggleVerTodos" title="alternar entre ver Puestos activas y todas" class="@(verTodosActive ? "btnOAAFAzul" : "btnOAAFBlack")">
<i class="fa-solid fa-eye"></i> Ver Todos
</button> *@
@* <button type="button" class="btnOAAFBlack" title="listado de Puestos que cumplen trienio" id="btnCumplimientoTrienios" onclick="window.location.href='/cumplimientoTrienios'">
<i class="fa-solid fa-hourglass-end"></i> Cumplimiento Trienios
</button> *@
</div>
<div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
<div class="form-group mt-4 mb-4">
@@ -54,7 +41,6 @@
@bind-value="Filter" @bind-value:event="oninput" />
</div>
<!-- Grid con paginación manual: se muestran los datos de la página actual -->
<div style="overflow-x:auto;" class="tablaDesk">
<Grid TItem="TIPOSPUESTOSTRABAJO"
Class="table tablaRegPers"
@@ -80,8 +66,8 @@
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Grupo tarifa" PropertyName="GRUPOTARIFA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.GRUPOTARIFA">
@context.GRUPOTARIFA
</GridColumn>
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Tipo" PropertyName="CONCEPTOSTIPOSPUESTOSTRABAJO" FilterButtonCSSClass="hidden">
@context.CONCEPTOSTIPOSPUESTOSTRABAJO
<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">
@if(context.FECHABAJA != null){
@@ -115,7 +101,7 @@
<dt class="col-sm-3">Grupo tarifa</dt>
<dd class="col-sm-9">@itm.GRUPOTARIFA</dd>
<dt class="col-sm-3">Tipo</dt>
<dd class="col-sm-9">@itm.CONCEPTOSTIPOSPUESTOSTRABAJO</dd>
<dd class="col-sm-9">@itm.IDTIPOPERSONANavigation.DESCRIPCION</dd>
<dt class="col-sm-3">Fecha baja</dt>
<dd class="col-sm-9">@itm.FECHABAJA</dd>
</dl>
@@ -124,86 +110,6 @@
</div>
}
</div>
<!-- Controles de paginación + texto de elementos en la misma fila -->
@* <div class="d-flex justify-content-between mt-2 align-items-center">
<!-- Paginación a la izquierda -->
<div class="custom-pagination">
<ul>
<!-- Botón para ir a la primera página -->
<li>
<button class="page-button page-link"
@onclick="PrimeraPagina"
disabled="@(UserState.CurrentPage == 1)">
<i id="AR1LR16N3BVAJ" class="bi bi-chevron-double-left"></i>
</button>
</li>
<!-- Botón para ir a la página anterior -->
<li>
<button class="page-button page-link"
@onclick="PaginaAnterior"
disabled="@(UserState.CurrentPage == 1)">
<i id="AR1LR16N3BVAK" class="bi bi-chevron-left"></i>
</button>
</li>
<!-- Si el primer número a mostrar es mayor que 1, se muestra "1" y puntos -->
@if (PageNumbersToDisplay().Any() && PageNumbersToDisplay().First() > 1)
{
<li>
<button class="page-button" @onclick="() => UserState.CurrentPage = 1">
1
</button>
</li>
<li><span class="ellipsis">...</span></li>
}
<!-- Botones de página dinámica -->
@foreach (var pageNum in PageNumbersToDisplay())
{
<li>
<button class="page-button page-link @(pageNum == UserState.CurrentPage ? "active" : null)"
@onclick="() => UserState.CurrentPage = pageNum">
@pageNum
</button>
</li>
}
<!-- Si el último número mostrado es menor que TotalPaginas, se muestran puntos y la última página -->
@if (PageNumbersToDisplay().Any() && PageNumbersToDisplay().Last() < TotalPaginas)
{
<li><button class="page-button page-link" disabled>...</button></li>
<li>
<button class="page-button" @onclick="() => UserState.CurrentPage = TotalPaginas">
@TotalPaginas
</button>
</li>
}
<!-- Botón para ir a la página siguiente -->
<li>
<button class="page-button page-link"
@onclick="PaginaSiguiente"
disabled="@(UserState.CurrentPage == TotalPaginas)">
<i id="AR1LR16N3BVAM" class="bi bi-chevron-right"></i>
</button>
</li>
<!-- Botón para ir a la última página -->
<li>
<button class="page-button page-link"
@onclick="UltimaPagina"
disabled="@(UserState.CurrentPage == TotalPaginas)">
<i id="AR1LR16N3BVAN" class="bi bi-chevron-double-right"></i>
</button>
</li>
</ul>
</div>
<!-- Texto de elementos a la derecha -->
<div style="margin-right: 20px;">
@FromElement - @ToElement de @lPuestos.Count elementos
</div>
</div> *@
}
</div>
@@ -219,11 +125,23 @@
if (_filter != value)
{
_filter = value;
// AplicarFiltros();
AplicarFiltros();
}
}
}
private void AplicarFiltros()
{
lPuestos = Puestos.Where(per =>
string.IsNullOrEmpty(Filter) ||
Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.NIVEL.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.EPIGRAFE.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.GRUPOTARIFA).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.IDTIPOPERSONANavigation.DESCRIPCION.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
Utilidades.RemoveDiacritics(per.FECHABAJA.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
).ToList();
UserState.CurrentPage = 1;
}
// Tamaño de página
// private int pageSize = 6;
@@ -277,9 +195,7 @@
}
// Bandera que indica si se está en modo "Ver Todos"
private bool verTodosActive = false;
/// <summary>
/// Método toggle que cambia entre mostrar todos los registros y solo activos.
/// </summary>
private async Task ToggleVerTodos()
{
if (!verTodosActive)
@@ -320,50 +236,7 @@
UserState.CurrentPage = 1;
Filter = "";
}
// private void AplicarFiltros()
// {
// lPuestos = Puestos.Where(per =>
// string.IsNullOrEmpty(Filter) ||
// Utilidades.RemoveDiacritics(per.NIF).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
// Utilidades.RemoveDiacritics(per.APELLIDOS).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
// Utilidades.RemoveDiacritics(per.NOMBRE).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
// ).ToList();
// UserState.CurrentPage = 1;
// }
/// <summary>
/// Retorna un subconjunto de páginas alrededor de la página actual (±2 páginas).
/// </summary>
// private IEnumerable<int> PageNumbersToDisplay()
// {
// int range = 2;
// int startPage = Math.Max(1, UserState.CurrentPage - range);
// int endPage = Math.Min(TotalPaginas, UserState.CurrentPage + range);
// for (int i = startPage; i <= endPage; i++)
// {
// yield return i;
// }
// }
/// <summary>
/// Formatea el nombre de la persona insertando un salto de línea después de la segunda palabra.
/// </summary>
/// <param name="nombre">Nombre a formatear</param>
/// <returns>MarkupString con el nombre formateado</returns>
private MarkupString FormatearNombre(string nombre)
{
if (string.IsNullOrEmpty(nombre))
{
return new MarkupString(string.Empty);
}
var palabras = nombre.Split(' ');
if (palabras.Length > 2)
{
string primeraParte = string.Join(" ", palabras.Take(2));
string resto = string.Join(" ", palabras.Skip(2));
return new MarkupString($"{primeraParte}<br/>{resto}");
}
return new MarkupString(nombre);
}
protected override async Task OnInitializedAsync()
{
verTodosActive = false;
@@ -385,81 +258,6 @@
lPuestos = Puestos;
}
// private async Task btnExportarPDF()
// {
// var itm = lPuestos
// .Select(f => new
// {
// NIF = f.NIF,
// Apellidos = f.APELLIDOS,
// Nombre = f.NOMBRE,
// Correo_Electrónico = f.CORREOELECTRONICO,
// Cuerpo = f.IDCUERPORPTNavigation.DESCRIPCION,
// Nivel_Puesto = f.IDNIVELRPTNavigation.DESCRIPCION,
// Caracter_Ocupación = f.CARGOULTIMOPUESTO,
// Departamento = f.DEPARTAMENTOACTUAL,
// Puesto_Actual = f.PUESTOACTUAL,
// Situación = f.IDSITUACIONENRPTNavigation.DESCRIPCION
// })
// .ToList();
// var logoBytes = await File.ReadAllBytesAsync("wwwroot/Content/imagenes/1oaaflogo.png");
// // Color de cabecera para PDF
// var pdfHeaderColor = new MigraDocCore.DocumentObjectModel.Color(0, 85, 135);
// await Utilidades.ExportarPdfEnBrowser(
// JS,
// itm,
// logoBytes,
// pdfHeaderColor,
// $"Personas.pdf");
// }
// private async Task btnExportarExcel()
// {
// var itm = lPuestos
// .Select(f => new
// {
// NIF = f.NIF,
// Apellidos = f.APELLIDOS,
// Nombre = f.NOMBRE,
// Correo_Electrónico = f.CORREOELECTRONICO,
// Cuerpo = f.IDCUERPORPTNavigation.DESCRIPCION,
// Nivel_Puesto = f.IDNIVELRPTNavigation.DESCRIPCION,
// Caracter_Ocupación = f.CARGOULTIMOPUESTO,
// Departamento = f.DEPARTAMENTOACTUAL,
// Puesto_Actual = f.PUESTOACTUAL,
// Situación = f.IDSITUACIONENRPTNavigation.DESCRIPCION
// })
// .ToList();
// // 2) Carga tu logo (por ejemplo desde wwwroot/images/logo.png)
// var logoBytes = await File.ReadAllBytesAsync("wwwroot/Content/imagenes/1oaaflogo.png");
// // 3) Define el color de cabecera para Excel
// var excelHeaderColor = ClosedXML.Excel.XLColor.FromArgb(0, 85, 135);
// // 4) Llama a tu helper pasando logo y color
// await Utilidades.ExportarExcelEnBrowser(
// JS,
// itm,
// logoBytes,
// excelHeaderColor,
// $"Personas.xlsx");
// // await Utilidades.ExportarExcelEnBrowser(JS, itm, $"Puestos_{Persona.APELLIDOS}_{Persona.NOMBRE}.xlsx");
// }
}
@* Helper para descargar archivos desde base64 *@
<script>
window.saveAsFile = (filename, bytesBase64) => {
const link = document.createElement('a');
link.download = filename;
link.href = 'data:application/octet-stream;base64,' + bytesBase64;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
</script>

View File

@@ -0,0 +1,5 @@
<h3>TiposTramosSILTRA</h3>
@code {
}

View File

@@ -0,0 +1,5 @@
<h3>ValoresNomina</h3>
@code {
}

View File

@@ -255,10 +255,19 @@
}
else
{
var html = "";
html += "Revise los errores antes de guardar:";
foreach (string m in editContext.GetValidationMessages())
{
html += "\n" + m + ". ";
}
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = $"Revise los errores antes de guardar.",
Message = html,
});
}

View File

@@ -22,7 +22,7 @@
<!-- Primera fila con 4 columnas -->
<div class="row ">
<div class="col-md-3">
<label class="lblInput" for="fecha-alta">Fecha alta Oficina:</label>
<label class="lblInput" for="fecha-alta">Fecha alta Oficina: *</label>
<input type="date" class="form-control @GetCssClass(nameof(Persona.FECHAALTA))"
id="fecha-alta"
@bind-value="Persona.FECHAALTA"

View File

@@ -0,0 +1,69 @@
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Serialize.Linq.Serializers;
using System.Linq.Expressions;
using SwaggerAntifraude.Controllers;
namespace SwaggerAntifraude.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class BANCOSController : GenericoController<BANCOS, int>
{
public BANCOSController()
: base()
{
}
[HttpGet]
public override async Task<IActionResult> GetAll()
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
var entities = await context.BANCOS
.AsNoTracking()
.ToListAsync();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
[Authorize(Policy = "LecturaPolicy")]
[HttpGet("{id}")]
public override IActionResult GetById(int id)
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
//var dbSet = context.Set<VIDA_ADMINISTRATIVA>();
var entities = context.BANCOS
.AsNoTracking()
.FirstOrDefault(v => v.IDBANCO == id);
if (entities == null)
return NotFound();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
}
}

View File

@@ -0,0 +1,70 @@
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Serialize.Linq.Serializers;
using System.Linq.Expressions;
using SwaggerAntifraude.Controllers;
namespace SwaggerAntifraude.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CONCEPTOSGENERALESController: GenericoController<CONCEPTOSGENERALES, int>
{
public CONCEPTOSGENERALESController()
: base()
{
}
[HttpGet]
public override async Task<IActionResult> GetAll()
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
var entities = await context.CONCEPTOSGENERALES
//.Include(x => x.IDTIPOPERSONANavigation)
.AsNoTracking()
.ToListAsync();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
[Authorize(Policy = "LecturaPolicy")]
[HttpGet("{id}")]
public override IActionResult GetById(int id)
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
//var dbSet = context.Set<VIDA_ADMINISTRATIVA>();
var entities = context.CONCEPTOSGENERALES
.AsNoTracking()
.FirstOrDefault(v => v.IDCONCEPTOSGENERALES == id);
if (entities == null)
return NotFound();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
}
}

View File

@@ -0,0 +1,69 @@
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Serialize.Linq.Serializers;
using System.Linq.Expressions;
using SwaggerAntifraude.Controllers;
namespace SwaggerAntifraude.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class FIESTASController : GenericoController<FIESTAS, int>
{
public FIESTASController()
: base()
{
}
[HttpGet]
public override async Task<IActionResult> GetAll()
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
var entities = await context.FIESTAS
.AsNoTracking()
.ToListAsync();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
[Authorize(Policy = "LecturaPolicy")]
[HttpGet("{id}")]
public override IActionResult GetById(int id)
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
//var dbSet = context.Set<VIDA_ADMINISTRATIVA>();
var entities = context.FIESTAS
.AsNoTracking()
.FirstOrDefault(v => v.IDFIESTA == id);
if (entities == null)
return NotFound();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
}
}

View File

@@ -1,5 +1,11 @@
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Serialize.Linq.Serializers;
using System.Linq.Expressions;
using SwaggerAntifraude.Controllers;
namespace SwaggerAntifraude.Controllers
{
@@ -11,5 +17,58 @@ 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.TIPOSPUESTOSTRABAJO
.Include(x => x.IDTIPOPERSONANavigation)
.AsNoTracking()
.ToListAsync();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
[Authorize(Policy = "LecturaPolicy")]
[HttpGet("{id}")]
public override IActionResult GetById(int id)
{
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
//var dbSet = context.Set<VIDA_ADMINISTRATIVA>();
var entities = context.NOMINAS
.Include(x => x.IDTIPONavigation)
.Include(x => x.IDSITUACIONNOMINANavigation)
//.Include(x => x.NOMINATRABAJADORCABECERA)
//.ThenInclude(pr => pr.IDPERSONANavigation)
.AsNoTracking()
.FirstOrDefault(v => v.IDNOMINAS == id);
if (entities == null)
return NotFound();
return Ok(entities);
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error interno del servidor: {ex.Message}");
}
}
}
}

View File

@@ -5,15 +5,15 @@
"Audience": "TuDominio.com",
"ExpiresInMinutes": 60
},
"ConnectionStrings": {
"WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO",
"ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO"
},
//PRODUCCION
//"ConnectionStrings": {
// "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE",
// "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE"
// "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO",
// "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO"
//},
//PRODUCCION
"ConnectionStrings": {
"WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE",
"ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE"
},
"Logging": {
"LogLevel": {
"Default": "Information",