using MSAdminUsuarios.Context; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Transactions; using Microsoft.EntityFrameworkCore.Storage; namespace MSAdminUsuarios.Controllers { [ApiController] [Route("[controller]")] public class PerfilesPorUsuarioController : ControllerBase { private readonly ModelContext _context; //public PerfilesPorUsuarioController() //{ //} public PerfilesPorUsuarioController(ModelContext context) { _context = context; } [HttpGet] public async Task GetPerfilesPorUsuario() { try { var consulta = from dm in _context.PERFILESPORUSUARIOs where dm.BL_ESTADO_PFLXUSU > 0 select dm; return Ok(consulta); } catch (Exception ex) { return BadRequest(ex); } } [HttpPost] public async Task GuardarPerfilesPorUsuario(PERFILPORUSUARIO[] guardar) { using var dbContextTransaction = _context.Database.BeginTransaction(); List error = new(); //Inicializamos variable para guardar errores try { //var error = await GuardarPerfiles(guardar, _context); var count = 0; // Se cambia a estado 0 todos los perfiles por usuario existentes var existe_plfxusu = _context.PERFILESPORUSUARIOs.Where(x => x.BL_ESTADO_PFLXUSU == 1 && x.TX_FKDOC_USUMS == guardar[0].TX_FKDOC_USUMS).ToList(); foreach (var cu in existe_plfxusu) { cu.BL_ESTADO_PFLXUSU = 0; _context.PERFILESPORUSUARIOs.Update(cu); await _context.SaveChangesAsync(); } foreach (var pxu in guardar) { count++; //Se comprueba existencia de cada pxu en base de datos var existe_pxu = (from dm in _context.PERFILESPORUSUARIOs where dm.NU_FK_PFL == pxu.NU_FK_PFL && dm.TX_FKDOC_USUMS == pxu.TX_FKDOC_USUMS select dm).ToList(); if (existe_pxu.Count() > 0) { //Si existe activamos estado 1 del perfil existe_pxu[0].BL_ESTADO_PFLXUSU = 1; _context.Update(existe_pxu[0]); await _context.SaveChangesAsync(); continue; } else { if (pxu == null) { error.Add($"Perfil por usuario #{count} sin valores"); continue; } pxu.BL_ESTADO_PFLXUSU = 1; _context.PERFILESPORUSUARIOs.Add(pxu); await _context.SaveChangesAsync(); } } dbContextTransaction.Commit(); List all = new List(); all.Add($"Total registros: {guardar.Count().ToString()}"); all.Add($"Exitosos: {(guardar.Count() - error.Count()).ToString()}"); all.Add($"Erroneos: {error.Count().ToString()}"); var flag_r = 0; foreach (var r in error) { flag_r++; all.Add($"Error #{flag_r}: {r}"); } if (error.Count() > 0) { return Conflict(all.ToList()); } return Ok(); } catch (Exception ex) { //hacemos rollback si hay excepción dbContextTransaction.Rollback(); return BadRequest(ex.Message); } } // Eliminado 19/03/23, RabbitMQ lo controla //[ApiExplorerSettings(IgnoreApi = true)] //[NonAction] //public async Task> GuardarPerfiles(PERFILPORUSUARIO[] guardar, ModelContext context) //{ // //using var transactionScope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(60)); // try // { // List error = new(); //Inicializamos variable para guardar errores // var count = 0; // // Se cambia a estado 0 todos los perfiles por usuario existentes // var existe_plfxusu = context.PERFILESPORUSUARIOs.Where(x => x.BL_ESTADO_PFLXUSU == 1 && x.TX_FKDOC_USUMS == guardar[0].TX_FKDOC_USUMS).ToList(); // foreach (var cu in existe_plfxusu) // { // cu.BL_ESTADO_PFLXUSU = 0; // context.PERFILESPORUSUARIOs.Update(cu); // await context.SaveChangesAsync(); // } // foreach (var pxu in guardar) // { // count++; // //Se comprueba existencia de cada pxu en base de datos // var existe_pxu = (from dm in context.PERFILESPORUSUARIOs // where dm.NU_FK_PFL == pxu.NU_FK_PFL // && dm.TX_FKDOC_USUMS == pxu.TX_FKDOC_USUMS // select dm).ToList(); // if (existe_pxu.Count() > 0) // { // //Si existe activamos estado 1 del perfil // existe_pxu[0].BL_ESTADO_PFLXUSU = 1; // context.Update(existe_pxu[0]); // await context.SaveChangesAsync(); // continue; // } // else // { // if (pxu == null) // { // error.Add($"Perfil por usuario #{count} sin valores"); // continue; // } // pxu.BL_ESTADO_PFLXUSU = 1; // context.PERFILESPORUSUARIOs.Add(pxu); // await context.SaveChangesAsync(); // } // } // //transactionScope.Complete(); // return error; // } // catch (Exception) // { // //transactionScope.Dispose(); // throw; // } //} } }