proteger para que toque el pedro

This commit is contained in:
2026-04-06 17:05:22 +02:00
parent 6d4d14194d
commit ec76b9a8ae
5 changed files with 524 additions and 33 deletions

View File

@@ -43,6 +43,7 @@
<div class="menuMovil" style="height: 100vh;background-color:#000000c2;" id="navMov"> <div class="menuMovil" style="height: 100vh;background-color:#000000c2;" id="navMov">
<a Class="btnNavMov" onclick="openCollapse()">Personal</a> <a Class="btnNavMov" onclick="openCollapse()">Personal</a>
<a Class="btnNavMov" onclick="openCollapse()">FicherosMaestros</a>
<Collapse Id="CollapseFich" Class="show" @ref="collapse1" Horizontal="true"> <Collapse Id="CollapseFich" Class="show" @ref="collapse1" Horizontal="true">
<Card Style="width:100%;"> <Card Style="width:100%;">
<CardBody Style="flex-direction: column;display: flex;text-align: center;padding:0;"> <CardBody Style="flex-direction: column;display: flex;text-align: center;padding:0;">
@@ -52,6 +53,15 @@
</CardBody> </CardBody>
</Card> </Card>
</Collapse> </Collapse>
<Collapse Id="CollapseFich" Class="show" @ref="collapse2" 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="/FicherosMaestros/CausasAlta">Generar Nóminas</a>
<a class="btnGrisNav" href="/FicherosMaestros/CausasBaja">Nóminas</a>
</CardBody>
</Card>
</Collapse>
@* <a Class="btnNavMov" href="/RPT">RPT</a> @* <a Class="btnNavMov" href="/RPT">RPT</a>
<a class="btnNavMov" onclick="openCollapse()">Ficheros Maestros</a> *@ <a class="btnNavMov" onclick="openCollapse()">Ficheros Maestros</a> *@
@@ -90,35 +100,27 @@
<div> <div>
<ul id="pa-main-menu" class="navbar-nav align-self-end"> <ul id="pa-main-menu" class="navbar-nav align-self-end">
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" style="font-family:'Satoshi'; color:white" href="#" id="navbarDropdownMenuLink" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">PERSONAL</a> <a class="nav-link dropdown-toggle" style="font-family:'Satoshi'; color:white" href="#" id="tabPersonal" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">PERSONAL</a>
<div class="dropdown-menu" id="dropdownNavegador" style="font-family: 'Satoshi';" aria-labelledby="navbarDropdownMenuLink"> <div class="dropdown-menu" id="dropPersonal" style="font-family: 'Satoshi';" aria-labelledby="dropPersonal">
<a class="dropdown-item" href="/trabajadores">Trabajadores</a> <a class="dropdown-item" href="/trabajadores">Trabajadores</a>
<a class="dropdown-item" href="/GenNominas">Generar Nóminas</a> <a class="dropdown-item" href="/GenNominas">Generar Nóminas</a>
<a class="dropdown-item" href="/Nominas">Nóminas</a> <a class="dropdown-item" href="/Nominas">Nóminas</a>
</div> </div>
</li> </li>
@* <li class="nav-item active">
<a class="nav-link" style="font-family:'Satoshi'; color:black" href="/RPT">RPT</a>
</li>
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" style="font-family:'Satoshi'; color:black" href="#" id="navbarDropdownMenuLink" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Ficheros maestros</a> <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="dropdownNavegador" style="font-family: 'Satoshi';" aria-labelledby="navbarDropdownMenuLink"> <div class="dropdown-menu" id="dropFicherosMaestros" style="font-family: 'Satoshi';" aria-labelledby="dropFicherosMaestros">
<a class="dropdown-item" href="/FicherosMaestros/Adscripciones">Adscripciones</a> <a class="dropdown-item" href="/trabajadores">Tipos puestos trabajo</a>
<a class="dropdown-item" href="/FicherosMaestros/CausasAlta">Causas de alta</a> <a class="dropdown-item" href="/trabajadores">Conceptos generales</a>
<a class="dropdown-item" href="/FicherosMaestros/CausasBaja">Causas de baja</a> <a class="dropdown-item" href="/trabajadores">Fiestas</a>
<a class="dropdown-item" href="/FicherosMaestros/ClasesPersonal">Clases de personal</a> <a class="dropdown-item" href="/trabajadores">Bancos</a>
<a class="dropdown-item" href="/FicherosMaestros/Cuerpos">Cuerpos</a> <a class="dropdown-item" href="/trabajadores">Concratos</a>
<a class="dropdown-item" href="/FicherosMaestros/Departamentos">Departamentos</a> <a class="dropdown-item" href="/trabajadores">Tipos tramos SILTRA</a>
<a class="dropdown-item" href="/FicherosMaestros/Dotacion">Dotación</a> <a class="dropdown-item" href="/trabajadores">Cuentas cotización</a>
<a class="dropdown-item" href="/FicherosMaestros/Grupos">Grupos</a> <a class="dropdown-item" href="/trabajadores">Valores nómina</a>
<a class="dropdown-item" href="/FicherosMaestros/MotivosAdministrativos">Motivos administrativos</a>
<a class="dropdown-item" href="/FicherosMaestros/Nivel">Nivel</a>
<a class="dropdown-item" href="/FicherosMaestros/Ocupacion">Ocupación</a>
<a class="dropdown-item" href="/FicherosMaestros/Provision">Provisión</a>
<a class="dropdown-item" href="/FicherosMaestros/TiposAptosAdministrativos">Tipos de actos administrativos</a>
<a class="dropdown-item" href="/FicherosMaestros/TiposDocencia">Tipos de docencia</a>
</div> </div>
</li> *@ </li>
</ul> </ul>
</div> </div>
@@ -175,15 +177,18 @@
navegador.css("display", "none") navegador.css("display", "none")
} }
} }
function openCollapse() { function openCollapse(num) {
$("#CollapseFich")[0].classList.toggle("show")
$("#CollapseFich"+ num)[0].classList.toggle("show")
} }
</script> </script>
@code { @code {
private bool MNM { get; set; } = false; private bool MNM { get; set; } = false;
Collapse collapse1 = default!; Collapse collapse1 = default!;
Collapse collapse2 = default!;
private async Task ToggleContentAsync() => await collapse1.ToggleAsync(); private async Task ToggleContentAsync() => await collapse1.ToggleAsync();
private async Task ToggleContentAsync2() => await collapse2.ToggleAsync();
public void MostrarNavMob() public void MostrarNavMob()
{ {

View File

@@ -0,0 +1,465 @@
@page "/TiposPuestosTrabajo"
@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> Tipos puesto de trabajo</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">
@* <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">
<input class="form-control" type="text" placeholder="Filtrar..."
@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"
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="TIPOSPUESTOSTRABAJO" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
<NavLink class="btn btn-link" href="@HashRed(context.IDTIPOPUESTO.ToString())">@context.DESCRIPCION</NavLink>
</GridColumn>
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Nivel" PropertyName="NIVEL" FilterButtonCSSClass="hidden" SortKeySelector="item => item.NIVEL">
@context.NIVEL
</GridColumn>
<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Epigrafe" PropertyName="EPIGRAFE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.EPIGRAFE">
@context.EPIGRAFE
</GridColumn>
<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>
<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.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>
<dt class="col-sm-3">Nivel</dt>
<dd class="col-sm-9">@itm.NIVEL</dd>
<dt class="col-sm-3">Epigrafe</dt>
<dd class="col-sm-9">@itm.EPIGRAFE</dd>
<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>
<dt class="col-sm-3">Fecha baja</dt>
<dd class="col-sm-9">@itm.FECHABAJA</dd>
</dl>
</div>
</div>
</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>
@code {
private List<TIPOSPUESTOSTRABAJO> lPuestos = new List<TIPOSPUESTOSTRABAJO>();
private List<TIPOSPUESTOSTRABAJO> Puestos = new List<TIPOSPUESTOSTRABAJO>();
private string _filter = "";
public string Filter
{
get => _filter;
set
{
if (_filter != value)
{
_filter = value;
// AplicarFiltros();
}
}
}
// 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;
/// <summary>
/// Método toggle que cambia entre mostrar todos los registros y solo activos.
/// </summary>
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("/TIPOSPUESTOSTRABAJO");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<TIPOSPUESTOSTRABAJO>>(resultContent)
?? new List<TIPOSPUESTOSTRABAJO>();
}
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/TIPOSPUESTOSTRABAJO");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<TIPOSPUESTOSTRABAJO>>(resultContent)
?? new List<TIPOSPUESTOSTRABAJO>();
}
Puestos = Puestos.Where(x => x.FECHABAJA == null)
.OrderBy(x => x.DESCRIPCION)
.ThenByDescending(x => x.FECHABAJA)
.ToList();
lPuestos = Puestos;
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;
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/TIPOSPUESTOSTRABAJO");
var resultContent = await resultPersonas.Content.ReadAsStringAsync();
Puestos = JsonConvert.DeserializeObject<List<TIPOSPUESTOSTRABAJO>>(resultContent)
?? new List<TIPOSPUESTOSTRABAJO>();
Puestos = Puestos.Where(x => x.FECHABAJA == null)
.OrderBy(x => x.DESCRIPCION)
.ThenByDescending(x => x.FECHABAJA)
.ToList();
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

@@ -137,10 +137,16 @@
PaginationItemsTextFormat="{0} - {1} de {2} elementos"> PaginationItemsTextFormat="{0} - {1} de {2} elementos">
<GridColumns> <GridColumns>
<GridColumn TItem="TRAMOSSILTRA" HeaderText="Tipo tramo" PropertyName="IDTIPOTRAMONavigation?.DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDTIPOTRAMONavigation.DESCRIPCION"> <GridColumn TItem="TRAMOSSILTRA" HeaderText="Tipo tramo" PropertyName="IDTIPOTRAMONavigation?.DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDTIPOTRAMONavigation.DESCRIPCION">
@if (lTraSil.Any(x => x.IDTIPOTRAMO == context.IDTIPOTRAMONavigation?.IDCODIGOTRAMOACUMULA)){
@if (context.IDTIPOTRAMONavigation.MODIFICABLE == false && context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == false)
{
<p style="color:red; font-weight:bold"> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p> <p style="color:red; font-weight:bold"> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
} }
else @if (context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == true && context.IDTIPOTRAMONavigation.MODIFICABLE == true)
{
<p style="color:blue; font-weight:bold"> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
}
@if (context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == false && context.IDTIPOTRAMONavigation.MODIFICABLE == true)
{ {
<p> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p> <p> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
} }

View File

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

View File

@@ -5,15 +5,15 @@
"Audience": "TuDominio.com", "Audience": "TuDominio.com",
"ExpiresInMinutes": 60 "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": { "ConnectionStrings": {
"WriteConnection": "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=ANTIFRAUDE" "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": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Information",