360 lines
18 KiB
Plaintext
360 lines
18 KiB
Plaintext
@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="tablaTabLateral">
|
|
<input type="button" value="Nueva Incidencia" @onclick="@(() => abrirPopupModificacion(new INCIDENCIAS(), true))" class="mb-2 btnOAAFBlack" />
|
|
<Accordion>
|
|
@foreach (var año in annos.Take(annos.Count))
|
|
{
|
|
// 1) Filtramos todas las incidencias de ese año
|
|
var listadoAño = itmList
|
|
.Where(x => x.AÑONOMINA == año)
|
|
.ToList();
|
|
|
|
// 2) Sacamos los meses distintos, ordenados desc.
|
|
var meses = listadoAño
|
|
.Where(x => x.MESNOMINA.HasValue)
|
|
.Select(x => x.MESNOMINA.Value)
|
|
.Distinct()
|
|
.OrderByDescending(m => m)
|
|
.ToList();
|
|
var titulo = "Año Nómina: " + @año;
|
|
<AccordionItem Title="@titulo">
|
|
<Content>
|
|
<Accordion>
|
|
@foreach (var mes in meses)
|
|
{
|
|
// Listado filtrado por mes y año
|
|
var listadoMes = listadoAño
|
|
.Where(x => x.MESNOMINA == mes)
|
|
.ToList();
|
|
var nombreMes = nombMeses[mes - 1];
|
|
var tituloMes = $"{mes}-{nombreMes}";
|
|
|
|
<AccordionItem Title="@tituloMes">
|
|
<Content>
|
|
<div style="overflow-x:auto;" class="tablaDesk">
|
|
<Grid TItem="INCIDENCIAS"
|
|
Class="table tablaRegPers"
|
|
Data="listadoMes"
|
|
AllowFiltering="false"
|
|
PageSize="10"
|
|
AllowPaging="true"
|
|
AllowSorting="true"
|
|
EmptyText="No se han encontrado datos"
|
|
Height="100"
|
|
PageSizeSelectorVisible="false"
|
|
PageSizeSelectorItems="@(new int[] { 5, 10, 20, 50 })"
|
|
Responsive="true"
|
|
PaginationItemsTextFormat="{0} - {1} de {2} elementos">
|
|
|
|
<GridColumns>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="">
|
|
<button @onclick="@(() => abrirPopupModificacion(context, false))" class="btnOAAFAzul">Editar</button>
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Nómina">
|
|
|
|
@if (context.IDNOMINANavigation != null){
|
|
@context.IDNOMINANavigation.DESCRIPCION
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Concepto">
|
|
|
|
@if (context.IDCONCEPTONOMINANavigation != null){
|
|
@context.IDCONCEPTONOMINANavigation.DESCRIPCION
|
|
}
|
|
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Sustituye Concepto">
|
|
@if (context.SUSTITUYECONCEPTO)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Cotiza Seguridad Social">
|
|
@if (context.COTIZASEGURIDADSOCIAL)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Texto">
|
|
@context.TEXTO
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Cantidad">
|
|
@context.CANTIDAD
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Importe">
|
|
@context.IMPORTE
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="IRPF">
|
|
@context.IRPF
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="IRPF Ficha">
|
|
@if (context.IRPFFICHA)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="No para IRPF">
|
|
@if (context.NOPARAIRPF)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Nómina Normal">
|
|
@if (context.NOMINANORMAL)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Nómina Seguridad Social">
|
|
@if (context.NOMINASEGURIDADSOCIAL)
|
|
{
|
|
<i class="fa-regular fa-square-check"></i>
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Nómina Origen">
|
|
@if (context.IDNOMINANavigation != null){
|
|
@context.IDNOMINANavigation.DESCRIPCION
|
|
}
|
|
</GridColumn>
|
|
<GridColumn TItem="INCIDENCIAS" HeaderText="Apl. Presupuestaria">
|
|
@context.APLICACIONPRESUPUESTARIA
|
|
</GridColumn>
|
|
</GridColumns>
|
|
</Grid>
|
|
</div>
|
|
</Content>
|
|
</AccordionItem>
|
|
}
|
|
</Accordion>
|
|
</Content>
|
|
</AccordionItem>
|
|
}
|
|
</Accordion>
|
|
|
|
<Modal @ref="popupGestionDatos" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
|
|
<BodyTemplate>
|
|
<div class="row">
|
|
<div class="col-md-12 mb-2">
|
|
<input list="listNom" id="selNomina" @bind-value="@itmNomina" type="text" style="width:100%" class="form-control" placeholder="Nomina" />
|
|
<datalist id="listNom">
|
|
@foreach(NOMINAS nom in lNom)
|
|
{
|
|
<option data-value="@nom.IDNOMINAS">@nom.DESCRIPCION</option>
|
|
}
|
|
</datalist>
|
|
</div>
|
|
<div class="col-md-12 mb-2">
|
|
<input list="listCon" id="selCon" @bind-value="@itmConcepto" type="text" style="width:100%" class="form-control" placeholder="Concepto" />
|
|
<datalist id="listCon">
|
|
@foreach (CONCEPTOSGENERALES con in lConceptos)
|
|
{
|
|
<option data-value="@con.IDCONCEPTOSGENERALES">@con.DESCRIPCION</option>
|
|
}
|
|
</datalist>
|
|
</div>
|
|
<div class="col-md-12 mb-2">
|
|
<label class="fw-bold">Mes y año nomina</label>
|
|
<input class="form-control" type="month" @bind-value="FECHANOM" />
|
|
</div>
|
|
<div class="col-md-12" style="display:flex; justify-content:space-between">
|
|
|
|
<label for="txtEDesc" class="fw-bold">Sustituye concepto: </label>
|
|
<input class="" type="checkbox" id="chbSusConcepto" checked="@ItemEnEdicion.SUSTITUYECONCEPTO" />
|
|
<label for="txtEDesc" class="fw-bold">Cotiza seguridad social: </label>
|
|
<input class="" type="checkbox" id="chbCotizaSS" checked="@ItemEnEdicion.COTIZASEGURIDADSOCIAL" />
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label for="txtEDesc" class="fw-bold">Texto: </label>
|
|
<input class="form-control" type="text" @bind-value="@ItemEnEdicion.TEXTO" />
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label for="txtEDesc" class="fw-bold">Cantidad: </label>
|
|
<input class="form-control" type="number" @bind-value="@ItemEnEdicion.CANTIDAD" />
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label for="txtEDesc" class="fw-bold">Importe: </label>
|
|
<input class="form-control" type="number" @bind-value="@ItemEnEdicion.IMPORTE" />
|
|
</div>
|
|
<div class="col-md-12" style="display:flex; justify-content:space-between">
|
|
<label for="txtEDesc" class="fw-bold">IRPF: </label>
|
|
<input class="" type="checkbox" id="chbIRPF" checked="@ItemEnEdicion.IRPF" />
|
|
|
|
<label for="txtEDesc" class="fw-bold">IRPF Ficha: </label>
|
|
<input class="" type="checkbox" id="chbIRPFficha" checked="@ItemEnEdicion.IRPFFICHA" />
|
|
|
|
<label for="txtEDesc" class="fw-bold">No para IRPF: </label>
|
|
<input class="" type="checkbox" id="chbNominaIRPF" checked="@ItemEnEdicion.NOPARAIRPF" />
|
|
</div>
|
|
<div class="col-md-12" style="display:flex; justify-content:space-between">
|
|
<label for="txtEDesc" class="fw-bold">Nómina normal: </label>
|
|
<input class="" type="checkbox" id="chbNominaNormal" checked="@ItemEnEdicion.NOMINANORMAL" />
|
|
<label for="txtEDesc" class="fw-bold">Nómina seguridad social: </label>
|
|
<input class="" type="checkbox" id="chbNominaSS" checked="@ItemEnEdicion.NOMINASEGURIDADSOCIAL" />
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label for="txtEDesc" class="fw-bold">Apl. Presupuestaria: </label>
|
|
<input class="form-control" type="text" @bind-value="@ItemEnEdicion.APLICACIONPRESUPUESTARIA" />
|
|
</div>
|
|
|
|
</div>
|
|
</BodyTemplate>
|
|
<FooterTemplate>
|
|
<Button Color="ButtonColor.Secondary" @onclick="cerrarPopupModificacion">Cerrar</Button>
|
|
@if(ItemEnEdicion.IDINCIDENCIA != 0){
|
|
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary" @onclick="@(() =>GestionarDatos(false))">Modificar</Button>
|
|
}
|
|
else
|
|
{
|
|
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary" @onclick="@(() => GestionarDatos(true))">Crear</Button>
|
|
}
|
|
</FooterTemplate>
|
|
</Modal>
|
|
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter]
|
|
public PERSONAS Persona { get; set; } = new PERSONAS();
|
|
private Modal popupGestionDatos = default;
|
|
public int? idNom { get; set; }
|
|
private DateTime FECHANOM { get; set; }
|
|
private string titulo { get; set; }
|
|
private string itmNomina { get; set; }
|
|
private string itmConcepto { get; set; }
|
|
private HttpClient cliente = new HttpClient();
|
|
[Parameter]
|
|
public EventCallback OnPersonaActualizada { get; set; }
|
|
private List<int?> annos = new List<int?>();
|
|
// private List<int?> meses = new List<int?>();
|
|
private List<INCIDENCIAS> itmList = new List<INCIDENCIAS>();
|
|
private List<String> nombMeses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
|
|
private List<NOMINAS> lNom = new List<NOMINAS>();
|
|
private List<CONCEPTOSGENERALES> lConceptos = new List<CONCEPTOSGENERALES>();
|
|
private INCIDENCIAS ItemEnEdicion { get; set; } = new INCIDENCIAS();
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
|
|
CargarListas();
|
|
}
|
|
private async Task abrirPopupModificacion(INCIDENCIAS objeto, bool esNuevo)
|
|
{
|
|
ItemEnEdicion = objeto;
|
|
if(objeto.IDINCIDENCIA != 0)
|
|
{
|
|
itmNomina = objeto.IDNOMINANavigation.DESCRIPCION;
|
|
itmConcepto = objeto.IDCONCEPTONOMINANavigation.DESCRIPCION;
|
|
FECHANOM = DateTime.ParseExact( objeto.AÑONOMINA.ToString() + "-" + objeto.MESNOMINA.ToString() + "-01 00:00:00,000", "yyyy-MM-dd HH:mm:ss,fff",
|
|
System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
else
|
|
{
|
|
itmNomina = "";
|
|
itmConcepto = "";
|
|
FECHANOM = DateTime.ParseExact( "0001-01-01 00:00:00,000", "yyyy-MM-dd HH:mm:ss,fff",
|
|
System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
await popupGestionDatos.ShowAsync();
|
|
}
|
|
private async Task cerrarPopupModificacion()
|
|
{
|
|
await popupGestionDatos.HideAsync();
|
|
}
|
|
private async Task CargarListas()
|
|
{
|
|
try
|
|
{
|
|
itmList.Clear();
|
|
annos.Clear();
|
|
var listnom = Persona.INCIDENCIAS.Where(x => x.ESDELIQUIDACION == false).ToList();
|
|
var nominaIncidenciadelcarajo = listnom.FirstOrDefault(x => x.IDINCIDENCIA == 56543);
|
|
foreach (INCIDENCIAS i in listnom){ itmList.Add(i); }
|
|
for (var i = 0; i < itmList.Count; i++)
|
|
{
|
|
int? year = itmList[i].AÑONOMINA;
|
|
if (year.HasValue)
|
|
{
|
|
if (annos.Contains(year) == false)
|
|
{
|
|
annos.Add(year);
|
|
}
|
|
}
|
|
}
|
|
annos = annos.OrderDescending().ToList();
|
|
var lNomi = await Utilidades.ObtenerObjeto<List<NOMINAS>>(cliente, "/api/NOMINAS");
|
|
lNom = lNomi.OrderBy(x => x.FECHAINICIO).ToList();
|
|
lConceptos = await Utilidades.ObtenerObjeto<List<CONCEPTOSGENERALES>>(cliente, "/api/CONCEPTOSGENERALES/");
|
|
// Task.Delay(1);
|
|
StateHasChanged();
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine($"Error al obtener los datos: {e.Message}");
|
|
}
|
|
}
|
|
// GUARDAR
|
|
private async Task GestionarDatos(bool tipo)
|
|
{
|
|
|
|
var inci = ItemEnEdicion;
|
|
if (tipo == true)
|
|
{
|
|
inci.IDINCIDENCIA = 0;
|
|
}
|
|
inci.IDPERSONA = Persona.IDPERSONA;
|
|
inci.MESNOMINA = FECHANOM.Month;
|
|
inci.AÑONOMINA = FECHANOM.Year;
|
|
|
|
var nomSelect = lNom.FirstOrDefault(x => x.DESCRIPCION == itmNomina);
|
|
var concSelect = lConceptos.FirstOrDefault(x => x.DESCRIPCION == itmConcepto);
|
|
inci.IDNOMINA = nomSelect.IDNOMINAS;
|
|
inci.IDCONCEPTONOMINA = concSelect.IDCONCEPTOSGENERALES;
|
|
string chbSusConcepto = "chbSusConcepto";
|
|
inci.SUSTITUYECONCEPTO = await JS.InvokeAsync<bool>("obtenerCheck", chbSusConcepto);
|
|
string chbCotizaSS = "chbCotizaSS";
|
|
inci.COTIZASEGURIDADSOCIAL = await JS.InvokeAsync<bool>("obtenerCheck", chbCotizaSS);
|
|
string chbIRPFficha = "chbIRPFficha";
|
|
inci.IRPFFICHA= await JS.InvokeAsync<bool>("obtenerCheck", chbIRPFficha);
|
|
string chbNominaIRPF = "chbNominaIRPF";
|
|
inci.NOPARAIRPF = await JS.InvokeAsync<bool>("obtenerCheck", chbNominaIRPF);
|
|
string chbNominaNormal = "chbNominaNormal";
|
|
inci.NOMINANORMAL = await JS.InvokeAsync<bool>("obtenerCheck", chbNominaNormal);
|
|
string chbNominaSS = "chbNominaSS";
|
|
inci.NOMINASEGURIDADSOCIAL = await JS.InvokeAsync<bool>("obtenerCheck", chbNominaSS);
|
|
|
|
if(inci.IDINCIDENCIA != 0){
|
|
var response = await Utilidades.ActualizarObjeto(cliente, "/api/INCIDENCIAS/" + inci.IDINCIDENCIA, inci);
|
|
}
|
|
else
|
|
{
|
|
var response = await Utilidades.NuevoObjeto(cliente, "/api/INCIDENCIAS/", inci);
|
|
}
|
|
await cerrarPopupModificacion();
|
|
var response1 = await cliente.GetAsync($"/api/PERSONAS/PersonaNominaNif/{Persona.NIF}");
|
|
if (!response1.IsSuccessStatusCode)
|
|
{
|
|
throw new Exception($"Error al obtener los datos de la persona. Código: {response1.StatusCode}");
|
|
}
|
|
|
|
var resultContent = await response1.Content.ReadAsStringAsync();
|
|
Persona = JsonConvert.DeserializeObject<PERSONAS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
|
|
await CargarListas();
|
|
|
|
}
|
|
}
|