From 1784131456f11aa7351eef9061c1354519f67545 Mon Sep 17 00:00:00 2001 From: adalberto Date: Sun, 1 Feb 2026 14:28:17 -0600 Subject: [PATCH] add new --- RS_system/Controllers/ArticulosController.cs | 161 ++ RS_system/Controllers/CategoriasController.cs | 125 + .../Controllers/ColaboracionController.cs | 221 ++ .../Controllers/ContabilidadController.cs | 127 + .../ContabilidadGeneralController.cs | 319 +++ RS_system/Controllers/EstadosController.cs | 125 + .../MovimientosInventarioController.cs | 190 ++ .../Controllers/TipoColaboracionController.cs | 168 ++ .../Controllers/UbicacionesController.cs | 125 + ...123043655_AddMonthlyAccounting.Designer.cs | 1382 +++++++++++ .../20260123043655_AddMonthlyAccounting.cs | 96 + .../Migrations/AddPrestamosFunctionality.sql | 143 ++ .../ApplicationDbContextModelSnapshot.cs | 1379 +++++++++++ RS_system/Migrations/init_sql.sql | 0 RS_system/Migrations/sql_articulos.sql | 67 + RS_system/Migrations/sql_categorias.sql | 27 + RS_system/Migrations/sql_estados.sql | 28 + RS_system/Migrations/sql_miembros.sql | 52 + RS_system/Migrations/sql_movimientos.sql | 52 + RS_system/Migrations/sql_ofrendas.sql | 106 + RS_system/Migrations/sql_ubicaciones.sql | 28 + RS_system/Migrations/sql_upgrade_lotes.sql | 45 + RS_system/Models/Articulo.cs | 101 + RS_system/Models/Categoria.cs | 37 + RS_system/Models/CategoriaEgreso.cs | 30 + RS_system/Models/CategoriaIngreso.cs | 30 + RS_system/Models/Colaboracion.cs | 42 + RS_system/Models/ContabilidadRegistro.cs | 49 + RS_system/Models/DetalleColaboracion.cs | 44 + RS_system/Models/EstadoArticulo.cs | 41 + RS_system/Models/Existencia.cs | 31 + RS_system/Models/MovimientoGeneral.cs | 59 + RS_system/Models/MovimientoGeneralAdjunto.cs | 36 + RS_system/Models/MovimientoInventario.cs | 80 + RS_system/Models/Prestamo.cs | 89 + RS_system/Models/ReporteMensualContable.cs | 44 + RS_system/Models/ReporteMensualGeneral.cs | 36 + RS_system/Models/TipoColaboracion.cs | 39 + RS_system/Models/Ubicacion.cs | 41 + .../Models/ViewModels/ArticuloViewModel.cs | 68 + .../ViewModels/EstadoCuentaViewModel.cs | 41 + .../RegistrarColaboracionViewModel.cs | 87 + .../ReporteColaboracionesViewModel.cs | 28 + .../Models/ViewModels/UltimoPagoViewModel.cs | 39 + RS_system/Services/ArticuloService.cs | 276 +++ RS_system/Services/CategoriaService.cs | 103 + RS_system/Services/ColaboracionService.cs | 373 +++ .../Services/ContabilidadGeneralService.cs | 337 +++ RS_system/Services/ContabilidadService.cs | 169 ++ RS_system/Services/EstadoArticuloService.cs | 102 + RS_system/Services/IArticuloService.cs | 18 + RS_system/Services/ICategoriaService.cs | 13 + RS_system/Services/IColaboracionService.cs | 21 + .../Services/IContabilidadGeneralService.cs | 39 + RS_system/Services/IContabilidadService.cs | 18 + RS_system/Services/IEstadoArticuloService.cs | 13 + RS_system/Services/IMovimientoService.cs | 21 + RS_system/Services/IPrestamoService.cs | 13 + RS_system/Services/IUbicacionService.cs | 13 + RS_system/Services/MovimientoService.cs | 450 ++++ RS_system/Services/PrestamoService.cs | 226 ++ RS_system/Services/UbicacionService.cs | 102 + RS_system/Views/Articulos/Create.cshtml | 208 ++ RS_system/Views/Articulos/Details.cshtml | 128 + RS_system/Views/Articulos/Edit.cshtml | 215 ++ RS_system/Views/Articulos/Index.cshtml | 141 ++ RS_system/Views/Categorias/Create.cshtml | 53 + RS_system/Views/Categorias/Edit.cshtml | 54 + RS_system/Views/Categorias/Index.cshtml | 117 + RS_system/Views/Colaboracion/Create.cshtml | 453 ++++ RS_system/Views/Colaboracion/Details.cshtml | 130 + .../Views/Colaboracion/EstadoCuenta.cshtml | 133 ++ RS_system/Views/Colaboracion/Index.cshtml | 147 ++ RS_system/Views/Colaboracion/Reporte.cshtml | 150 ++ RS_system/Views/Colaboracion/Reportes.cshtml | 118 + RS_system/Views/Contabilidad/Create.cshtml | 64 + RS_system/Views/Contabilidad/Index.cshtml | 140 ++ .../Views/Contabilidad/RegistroMensual.cshtml | 261 ++ .../ContabilidadGeneral/Consolidado.cshtml | 164 ++ .../GestionCategorias.cshtml | 222 ++ .../Views/ContabilidadGeneral/Index.cshtml | 124 + .../RegistroMensual.cshtml | 479 ++++ RS_system/Views/Estados/Create.cshtml | 67 + RS_system/Views/Estados/Edit.cshtml | 68 + RS_system/Views/Estados/Index.cshtml | 121 + .../Views/MovimientosInventario/Create.cshtml | 298 +++ .../Views/MovimientosInventario/Index.cshtml | 128 + .../PrestamosActivos.cshtml | 156 ++ .../Views/TipoColaboracion/Create.cshtml | 63 + RS_system/Views/TipoColaboracion/Edit.cshtml | 65 + RS_system/Views/TipoColaboracion/Index.cshtml | 112 + RS_system/Views/Ubicaciones/Create.cshtml | 63 + RS_system/Views/Ubicaciones/Edit.cshtml | 64 + RS_system/Views/Ubicaciones/Index.cshtml | 131 + RS_system/sql_colaboraciones.sql | 103 + RS_system/sql_contabilidad_adjuntos.sql | 17 + RS_system/sql_contabilidad_general.sql | 171 ++ RS_system/sql_permisos_colaboraciones.sql | 97 + RS_system/wwwroot/Assets/apple-touch-icon.png | Bin 0 -> 18840 bytes RS_system/wwwroot/Assets/favicon-16x16.png | Bin 0 -> 892 bytes RS_system/wwwroot/Assets/favicon-32x32.png | Bin 0 -> 2320 bytes RS_system/wwwroot/Assets/favicon.ico | Bin 0 -> 15406 bytes RS_system/wwwroot/Assets/icon-192x192.png | Bin 0 -> 20995 bytes RS_system/wwwroot/Assets/icon-512x512.png | Bin 0 -> 70733 bytes RS_system/wwwroot/css/bootstrap-icons.css | 2106 ++++++++++++++++ RS_system/wwwroot/css/bootstrap-icons.json | 2080 ++++++++++++++++ RS_system/wwwroot/css/bootstrap-icons.scss | 2118 +++++++++++++++++ .../02958366-eb79-4433-859c-9eff0bfd8ccf.png | Bin 0 -> 9474 bytes .../2a6a6bb4-7785-4453-bfc7-fb2c099a5a57.jpg | Bin 0 -> 182730 bytes 109 files changed, 19894 insertions(+) create mode 100644 RS_system/Controllers/ArticulosController.cs create mode 100644 RS_system/Controllers/CategoriasController.cs create mode 100644 RS_system/Controllers/ColaboracionController.cs create mode 100644 RS_system/Controllers/ContabilidadController.cs create mode 100644 RS_system/Controllers/ContabilidadGeneralController.cs create mode 100644 RS_system/Controllers/EstadosController.cs create mode 100644 RS_system/Controllers/MovimientosInventarioController.cs create mode 100644 RS_system/Controllers/TipoColaboracionController.cs create mode 100644 RS_system/Controllers/UbicacionesController.cs create mode 100644 RS_system/Migrations/20260123043655_AddMonthlyAccounting.Designer.cs create mode 100644 RS_system/Migrations/20260123043655_AddMonthlyAccounting.cs create mode 100644 RS_system/Migrations/AddPrestamosFunctionality.sql create mode 100644 RS_system/Migrations/ApplicationDbContextModelSnapshot.cs create mode 100644 RS_system/Migrations/init_sql.sql create mode 100644 RS_system/Migrations/sql_articulos.sql create mode 100644 RS_system/Migrations/sql_categorias.sql create mode 100644 RS_system/Migrations/sql_estados.sql create mode 100644 RS_system/Migrations/sql_miembros.sql create mode 100644 RS_system/Migrations/sql_movimientos.sql create mode 100644 RS_system/Migrations/sql_ofrendas.sql create mode 100644 RS_system/Migrations/sql_ubicaciones.sql create mode 100644 RS_system/Migrations/sql_upgrade_lotes.sql create mode 100644 RS_system/Models/Articulo.cs create mode 100644 RS_system/Models/Categoria.cs create mode 100644 RS_system/Models/CategoriaEgreso.cs create mode 100644 RS_system/Models/CategoriaIngreso.cs create mode 100644 RS_system/Models/Colaboracion.cs create mode 100644 RS_system/Models/ContabilidadRegistro.cs create mode 100644 RS_system/Models/DetalleColaboracion.cs create mode 100644 RS_system/Models/EstadoArticulo.cs create mode 100644 RS_system/Models/Existencia.cs create mode 100644 RS_system/Models/MovimientoGeneral.cs create mode 100644 RS_system/Models/MovimientoGeneralAdjunto.cs create mode 100644 RS_system/Models/MovimientoInventario.cs create mode 100644 RS_system/Models/Prestamo.cs create mode 100644 RS_system/Models/ReporteMensualContable.cs create mode 100644 RS_system/Models/ReporteMensualGeneral.cs create mode 100644 RS_system/Models/TipoColaboracion.cs create mode 100644 RS_system/Models/Ubicacion.cs create mode 100644 RS_system/Models/ViewModels/ArticuloViewModel.cs create mode 100644 RS_system/Models/ViewModels/EstadoCuentaViewModel.cs create mode 100644 RS_system/Models/ViewModels/RegistrarColaboracionViewModel.cs create mode 100644 RS_system/Models/ViewModels/ReporteColaboracionesViewModel.cs create mode 100644 RS_system/Models/ViewModels/UltimoPagoViewModel.cs create mode 100644 RS_system/Services/ArticuloService.cs create mode 100644 RS_system/Services/CategoriaService.cs create mode 100644 RS_system/Services/ColaboracionService.cs create mode 100644 RS_system/Services/ContabilidadGeneralService.cs create mode 100644 RS_system/Services/ContabilidadService.cs create mode 100644 RS_system/Services/EstadoArticuloService.cs create mode 100644 RS_system/Services/IArticuloService.cs create mode 100644 RS_system/Services/ICategoriaService.cs create mode 100644 RS_system/Services/IColaboracionService.cs create mode 100644 RS_system/Services/IContabilidadGeneralService.cs create mode 100644 RS_system/Services/IContabilidadService.cs create mode 100644 RS_system/Services/IEstadoArticuloService.cs create mode 100644 RS_system/Services/IMovimientoService.cs create mode 100644 RS_system/Services/IPrestamoService.cs create mode 100644 RS_system/Services/IUbicacionService.cs create mode 100644 RS_system/Services/MovimientoService.cs create mode 100644 RS_system/Services/PrestamoService.cs create mode 100644 RS_system/Services/UbicacionService.cs create mode 100644 RS_system/Views/Articulos/Create.cshtml create mode 100644 RS_system/Views/Articulos/Details.cshtml create mode 100644 RS_system/Views/Articulos/Edit.cshtml create mode 100644 RS_system/Views/Articulos/Index.cshtml create mode 100644 RS_system/Views/Categorias/Create.cshtml create mode 100644 RS_system/Views/Categorias/Edit.cshtml create mode 100644 RS_system/Views/Categorias/Index.cshtml create mode 100644 RS_system/Views/Colaboracion/Create.cshtml create mode 100644 RS_system/Views/Colaboracion/Details.cshtml create mode 100644 RS_system/Views/Colaboracion/EstadoCuenta.cshtml create mode 100644 RS_system/Views/Colaboracion/Index.cshtml create mode 100644 RS_system/Views/Colaboracion/Reporte.cshtml create mode 100644 RS_system/Views/Colaboracion/Reportes.cshtml create mode 100644 RS_system/Views/Contabilidad/Create.cshtml create mode 100644 RS_system/Views/Contabilidad/Index.cshtml create mode 100644 RS_system/Views/Contabilidad/RegistroMensual.cshtml create mode 100644 RS_system/Views/ContabilidadGeneral/Consolidado.cshtml create mode 100644 RS_system/Views/ContabilidadGeneral/GestionCategorias.cshtml create mode 100644 RS_system/Views/ContabilidadGeneral/Index.cshtml create mode 100644 RS_system/Views/ContabilidadGeneral/RegistroMensual.cshtml create mode 100644 RS_system/Views/Estados/Create.cshtml create mode 100644 RS_system/Views/Estados/Edit.cshtml create mode 100644 RS_system/Views/Estados/Index.cshtml create mode 100644 RS_system/Views/MovimientosInventario/Create.cshtml create mode 100644 RS_system/Views/MovimientosInventario/Index.cshtml create mode 100644 RS_system/Views/MovimientosInventario/PrestamosActivos.cshtml create mode 100644 RS_system/Views/TipoColaboracion/Create.cshtml create mode 100644 RS_system/Views/TipoColaboracion/Edit.cshtml create mode 100644 RS_system/Views/TipoColaboracion/Index.cshtml create mode 100644 RS_system/Views/Ubicaciones/Create.cshtml create mode 100644 RS_system/Views/Ubicaciones/Edit.cshtml create mode 100644 RS_system/Views/Ubicaciones/Index.cshtml create mode 100644 RS_system/sql_colaboraciones.sql create mode 100644 RS_system/sql_contabilidad_adjuntos.sql create mode 100644 RS_system/sql_contabilidad_general.sql create mode 100644 RS_system/sql_permisos_colaboraciones.sql create mode 100644 RS_system/wwwroot/Assets/apple-touch-icon.png create mode 100644 RS_system/wwwroot/Assets/favicon-16x16.png create mode 100644 RS_system/wwwroot/Assets/favicon-32x32.png create mode 100644 RS_system/wwwroot/Assets/favicon.ico create mode 100644 RS_system/wwwroot/Assets/icon-192x192.png create mode 100644 RS_system/wwwroot/Assets/icon-512x512.png create mode 100644 RS_system/wwwroot/css/bootstrap-icons.css create mode 100644 RS_system/wwwroot/css/bootstrap-icons.json create mode 100644 RS_system/wwwroot/css/bootstrap-icons.scss create mode 100644 RS_system/wwwroot/uploads/miembros/02958366-eb79-4433-859c-9eff0bfd8ccf.png create mode 100644 RS_system/wwwroot/uploads/miembros/2a6a6bb4-7785-4453-bfc7-fb2c099a5a57.jpg diff --git a/RS_system/Controllers/ArticulosController.cs b/RS_system/Controllers/ArticulosController.cs new file mode 100644 index 0000000..ec9d6a0 --- /dev/null +++ b/RS_system/Controllers/ArticulosController.cs @@ -0,0 +1,161 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Rs_system.Models.ViewModels; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class ArticulosController : Controller +{ + private readonly IArticuloService _service; + + public ArticulosController(IArticuloService service) + { + _service = service; + } + + // GET: Articulos + public async Task Index(string? search, int? categoriaId, int? ubicacionId, int? estadoId) + { + // Load filter lists + var categorias = await _service.GetCategoriasAsync(); + ViewBag.Categorias = new SelectList(categorias.Select(c => new { c.Id, c.Nombre }), "Id", "Nombre", categoriaId); + + var ubicaciones = await _service.GetUbicacionesAsync(); + ViewBag.Ubicaciones = new SelectList(ubicaciones.Select(u => new { u.Id, u.Nombre }), "Id", "Nombre", ubicacionId); + + // Custom Estado SelectList + var estados = await _service.GetEstadosAsync(); + ViewBag.Estados = new SelectList(estados.Select(e => new { e.Id, e.Nombre }), "Id", "Nombre", estadoId); + + // Keep Search params + ViewBag.CurrentSearch = search ?? ""; + ViewBag.CurrentCategoria = categoriaId; + ViewBag.CurrentUbicacion = ubicacionId; + ViewBag.CurrentEstado = estadoId; + + var list = await _service.GetAllAsync(search, categoriaId, ubicacionId, estadoId); + return View(list); + } + + // GET: Articulos/Details/5 + public async Task Details(int? id) + { + if (id == null) return NotFound(); + + var articulo = await _service.GetByIdAsync(id.Value); + if (articulo == null) return NotFound(); + + return View(articulo); + } + + // GET: Articulos/Create + public async Task Create() + { + await LoadDropdownsAsync(); + return View(new ArticuloViewModel()); + } + + // POST: Articulos/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create(ArticuloViewModel viewModel) + { + if (ModelState.IsValid) + { + if (await _service.ExistsCodigoAsync(viewModel.Codigo)) + { + ModelState.AddModelError("Codigo", "Ya existe un artículo con este código."); + } + else + { + var createdBy = User.Identity?.Name ?? "Sistema"; + var result = await _service.CreateAsync(viewModel, createdBy); + + if (result) + { + TempData["SuccessMessage"] = "Artículo registrado exitosamente."; + return RedirectToAction(nameof(Index)); + } + ModelState.AddModelError("", "Ocurrió un error al guardar el artículo."); + } + } + + await LoadDropdownsAsync(); + return View(viewModel); + } + + // GET: Articulos/Edit/5 + public async Task Edit(int? id) + { + if (id == null) return NotFound(); + + var articulo = await _service.GetByIdAsync(id.Value); + if (articulo == null) return NotFound(); + + await LoadDropdownsAsync(); + return View(articulo); + } + + // POST: Articulos/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Edit(int id, ArticuloViewModel viewModel) + { + if (id != viewModel.Id) return NotFound(); + + if (ModelState.IsValid) + { + if (await _service.ExistsCodigoAsync(viewModel.Codigo, id)) + { + ModelState.AddModelError("Codigo", "Ya existe otro artículo con este código."); + } + else + { + var result = await _service.UpdateAsync(viewModel); + + if (result) + { + TempData["SuccessMessage"] = "Artículo actualizado exitosamente."; + return RedirectToAction(nameof(Index)); + } + ModelState.AddModelError("", "No se pudo actualizar el artículo."); + } + } + + await LoadDropdownsAsync(); + return View(viewModel); + } + + // POST: Articulos/Delete/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Delete(int id) + { + var result = await _service.DeleteAsync(id); + if (result) + { + TempData["SuccessMessage"] = "Artículo eliminado exitosamente."; + } + else + { + TempData["ErrorMessage"] = "No se pudo eliminado el artículo."; + } + + return RedirectToAction(nameof(Index)); + } + + private async Task LoadDropdownsAsync() + { + var categorias = await _service.GetCategoriasAsync(); + ViewBag.Categorias = new SelectList(categorias.Select(c => new { c.Id, c.Nombre }), "Id", "Nombre"); + + var ubicaciones = await _service.GetUbicacionesAsync(); + ViewBag.Ubicaciones = new SelectList(ubicaciones.Select(u => new { u.Id, u.Nombre }), "Id", "Nombre"); + + var estados = await _service.GetEstadosAsync(); + ViewBag.Estados = new SelectList(estados.Select(e => new { e.Id, e.Nombre }), "Id", "Nombre"); + } +} diff --git a/RS_system/Controllers/CategoriasController.cs b/RS_system/Controllers/CategoriasController.cs new file mode 100644 index 0000000..6fed1e8 --- /dev/null +++ b/RS_system/Controllers/CategoriasController.cs @@ -0,0 +1,125 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Rs_system.Models; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class CategoriasController : Controller +{ + private readonly ICategoriaService _service; + + public CategoriasController(ICategoriaService service) + { + _service = service; + } + + // GET: Categorias + public async Task Index() + { + var list = await _service.GetAllAsync(); + return View(list); + } + + // GET: Categorias/Create + public IActionResult Create() + { + return View(); + } + + // POST: Categorias/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create([Bind("Nombre,Descripcion,Activo")] Categoria categoria) + { + if (string.IsNullOrWhiteSpace(categoria.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(categoria.Nombre)) + { + ModelState.AddModelError("Nombre", "Ya existe una categoría con ese nombre."); + return View(categoria); + } + + categoria.CreadoPor = User.Identity?.Name ?? "Sistema"; + var result = await _service.CreateAsync(categoria); + + if (result) + { + TempData["SuccessMessage"] = "Categoría creada exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "Ocurrió un error al guardar los datos."); + } + return View(categoria); + } + + // GET: Categorias/Edit/5 + public async Task Edit(int? id) + { + if (id == null) return NotFound(); + + var categoria = await _service.GetByIdAsync(id.Value); + if (categoria == null) return NotFound(); + + return View(categoria); + } + + // POST: Categorias/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Edit(int id, [Bind("Id,Nombre,Descripcion,Activo")] Categoria categoria) + { + if (id != categoria.Id) return NotFound(); + + if (string.IsNullOrWhiteSpace(categoria.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(categoria.Nombre, id)) + { + ModelState.AddModelError("Nombre", "Ya existe otra categoría con ese nombre."); + return View(categoria); + } + + var result = await _service.UpdateAsync(categoria); + + if (result) + { + TempData["SuccessMessage"] = "Categoría actualizada exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "No se pudo actualizar la categoría o no fue encontrada."); + } + + return View(categoria); + } + + // POST: Categorias/Delete/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Delete(int id) + { + var result = await _service.DeleteAsync(id); + if (result) + { + TempData["SuccessMessage"] = "Categoría eliminada exitosamente."; + } + else + { + TempData["ErrorMessage"] = "No se pudo eliminar la categoría."; + } + + return RedirectToAction(nameof(Index)); + } +} diff --git a/RS_system/Controllers/ColaboracionController.cs b/RS_system/Controllers/ColaboracionController.cs new file mode 100644 index 0000000..154eb3c --- /dev/null +++ b/RS_system/Controllers/ColaboracionController.cs @@ -0,0 +1,221 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Rs_system.Models.ViewModels; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class ColaboracionController : Controller +{ + private readonly IColaboracionService _colaboracionService; + private readonly IMiembroService _miembroService; + + public ColaboracionController( + IColaboracionService colaboracionService, + IMiembroService miembroService) + { + _colaboracionService = colaboracionService; + _miembroService = miembroService; + } + + // GET: Colaboracion + public async Task Index() + { + try + { + var colaboraciones = await _colaboracionService.GetColaboracionesRecientesAsync(); + return View(colaboraciones); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al cargar colaboraciones: {ex.Message}"; + return View(new List()); + } + } + + // GET: Colaboracion/Create + public async Task Create() + { + try + { + var viewModel = new RegistrarColaboracionViewModel + { + MesInicial = DateTime.Now.Month, + AnioInicial = DateTime.Now.Year, + MesFinal = DateTime.Now.Month, + AnioFinal = DateTime.Now.Year, + MontoTotal = 0, + TiposDisponibles = await _colaboracionService.GetTiposActivosAsync() + }; + + await CargarMiembrosAsync(); + return View(viewModel); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al cargar formulario: {ex.Message}"; + return RedirectToAction(nameof(Index)); + } + } + + // POST: Colaboracion/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create(RegistrarColaboracionViewModel model) + { + if (ModelState.IsValid) + { + try + { + var registradoPor = User.Identity?.Name ?? "Sistema"; + await _colaboracionService.RegistrarColaboracionAsync(model, registradoPor); + + TempData["Success"] = "Colaboración registrada exitosamente"; + return RedirectToAction(nameof(Index)); + } + catch (Exception ex) + { + ModelState.AddModelError("", $"Error al registrar: {ex.Message}"); + } + } + + // Recargar datos para la vista + model.TiposDisponibles = await _colaboracionService.GetTiposActivosAsync(); + await CargarMiembrosAsync(); + return View(model); + } + + // GET: Colaboracion/Details/5 + public async Task Details(long id) + { + try + { + var colaboracion = await _colaboracionService.GetColaboracionByIdAsync(id); + if (colaboracion == null) + { + TempData["Error"] = "Colaboración no encontrada"; + return RedirectToAction(nameof(Index)); + } + + return View(colaboracion); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al cargar detalle: {ex.Message}"; + return RedirectToAction(nameof(Index)); + } + } + + // GET: Colaboracion/Reportes + public IActionResult Reportes() + { + ViewBag.FechaInicio = DateTime.Now.Date; + ViewBag.FechaFin = DateTime.Now.Date; + return View(); + } + + // POST: Colaboracion/GenerarReporte + [HttpPost] + [ValidateAntiForgeryToken] + public async Task GenerarReporte(DateTime fechaInicio, DateTime fechaFin) + { + try + { + // Ajustar fecha fin para incluir todo el día + var fechaFinAjustada = fechaFin.Date.AddDays(1).AddSeconds(-1); + + var reporte = await _colaboracionService.GenerarReportePorFechasAsync( + fechaInicio.Date, + fechaFinAjustada); + + return View("Reporte", reporte); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al generar reporte: {ex.Message}"; + return RedirectToAction(nameof(Reportes)); + } + } + + // GET: Colaboracion/EstadoCuenta/5 + public async Task EstadoCuenta(long id) + { + try + { + var estado = await _colaboracionService.GenerarEstadoCuentaAsync(id); + return View(estado); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al generar estado de cuenta: {ex.Message}"; + return RedirectToAction(nameof(Index)); + } + } + + // GET: Colaboracion/BuscarMiembros?termino=juan + [HttpGet] + public async Task BuscarMiembros(string termino) + { + if (string.IsNullOrWhiteSpace(termino) || termino.Length < 2) + { + return Json(new List()); + } + + try + { + var miembros = await _miembroService.GetAllAsync(); + + var resultados = miembros + .Where(m => + m.Nombres.Contains(termino, StringComparison.OrdinalIgnoreCase) || + m.Apellidos.Contains(termino, StringComparison.OrdinalIgnoreCase) || + $"{m.Nombres} {m.Apellidos}".Contains(termino, StringComparison.OrdinalIgnoreCase)) + .Take(10) + .Select(m => new + { + id = m.Id, + text = $"{m.Nombres} {m.Apellidos}", + telefono = m.Telefono + }) + .ToList(); + + return Json(resultados); + } + catch (Exception ex) + { + return Json(new List()); + } + } + + // GET: Colaboracion/ObtenerUltimosPagos?miembroId=5 + [HttpGet] + public async Task ObtenerUltimosPagos(long miembroId) + { + try + { + var ultimosPagos = await _colaboracionService.GetUltimosPagosPorMiembroAsync(miembroId); + return Json(ultimosPagos); + } + catch (Exception ex) + { + return Json(new List()); + } + } + + // Helper methods + private async Task CargarMiembrosAsync() + { + var miembros = await _miembroService.GetAllAsync(); + ViewBag.Miembros = new SelectList( + miembros.Select(m => new + { + Id = m.Id, + NombreCompleto = $"{m.Nombres} {m.Apellidos}" + }), + "Id", + "NombreCompleto" + ); + } +} diff --git a/RS_system/Controllers/ContabilidadController.cs b/RS_system/Controllers/ContabilidadController.cs new file mode 100644 index 0000000..2f62773 --- /dev/null +++ b/RS_system/Controllers/ContabilidadController.cs @@ -0,0 +1,127 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Rs_system.Models; +using Rs_system.Services; +using Rs_system.Data; +using Microsoft.EntityFrameworkCore; + +namespace Rs_system.Controllers; + +[Authorize] +public class ContabilidadController : Controller +{ + private readonly IContabilidadService _contabilidadService; + private readonly IMiembroService _miembroService; + private readonly ApplicationDbContext _context; + + public ContabilidadController(IContabilidadService contabilidadService, IMiembroService miembroService, ApplicationDbContext context) + { + _contabilidadService = contabilidadService; + _miembroService = miembroService; + _context = context; + } + + [HttpGet] + public async Task Index(long? grupoId) + { + var grupos = await _miembroService.GetGruposTrabajoAsync(); + ViewBag.Grupos = new SelectList(grupos.Select(g => new { g.Id, g.Nombre }), "Id", "Nombre", grupoId); + + List reportes = new(); + if (grupoId.HasValue) + { + reportes = await _contabilidadService.ListarReportesPorGrupoAsync(grupoId.Value); + } + + ViewBag.GrupoId = grupoId; + return View(reportes); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task AbrirMes(long grupoId, int mes, int anio) + { + try + { + var reporte = await _contabilidadService.ObtenerOCrearReporteMensualAsync(grupoId, mes, anio); + TempData["Success"] = $"Reporte de {reporte.NombreMes} {anio} abierto correctamente."; + return RedirectToAction(nameof(RegistroMensual), new { id = reporte.Id }); + } + catch (Exception ex) + { + TempData["Error"] = "Error al abrir el mes: " + ex.Message; + return RedirectToAction(nameof(Index), new { grupoId }); + } + } + + [HttpGet] + public async Task RegistroMensual(long id) + { + var reporte = await _context.ReportesMensualesContables + .Include(r => r.GrupoTrabajo) + .Include(r => r.Registros) + .FirstOrDefaultAsync(r => r.Id == id); + + if (reporte == null) return NotFound(); + + ViewBag.SaldoActual = await _contabilidadService.CalcularSaldoActualAsync(id); + return View(reporte); + } + + [HttpPost] + public async Task GuardarBulk([FromBody] BulkSaveRequest request) + { + if (request == null || request.ReporteId <= 0) return BadRequest("Solicitud inválida."); + + var registros = request.Registros.Select(r => new ContabilidadRegistro + { + Id = r.Id, + Tipo = r.Tipo, + Monto = r.Monto, + Fecha = DateTime.SpecifyKind(r.Fecha, DateTimeKind.Utc), + Descripcion = r.Descripcion ?? "" + }).ToList(); + + var success = await _contabilidadService.GuardarRegistrosBulkAsync(request.ReporteId, registros); + if (success) + { + var nuevoSaldo = await _contabilidadService.CalcularSaldoActualAsync(request.ReporteId); + return Json(new { success = true, saldo = nuevoSaldo }); + } + + return Json(new { success = false, message = "Error al guardar los registros. Verifique que el mes no esté cerrado." }); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task CerrarMes(long id) + { + var success = await _contabilidadService.CerrarReporteAsync(id); + if (success) + { + TempData["Success"] = "El reporte ha sido cerrado. Ya no se pueden realizar cambios."; + } + else + { + TempData["Error"] = "No se pudo cerrar el reporte."; + } + return RedirectToAction(nameof(RegistroMensual), new { id }); + } + + // Helper classes for AJAX + public class BulkSaveRequest + { + public long ReporteId { get; set; } + public List Registros { get; set; } = new(); + } + + public class RegistroInput + { + public long Id { get; set; } + public TipoMovimientoContable Tipo { get; set; } + public decimal Monto { get; set; } + public DateTime Fecha { get; set; } + public string? Descripcion { get; set; } + } +} diff --git a/RS_system/Controllers/ContabilidadGeneralController.cs b/RS_system/Controllers/ContabilidadGeneralController.cs new file mode 100644 index 0000000..0c3fcb9 --- /dev/null +++ b/RS_system/Controllers/ContabilidadGeneralController.cs @@ -0,0 +1,319 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Rs_system.Models; +using Rs_system.Services; +using Rs_system.Data; +using Microsoft.EntityFrameworkCore; + +namespace Rs_system.Controllers; + +[Authorize] +public class ContabilidadGeneralController : Controller +{ + private readonly IContabilidadGeneralService _contabilidadService; + private readonly ApplicationDbContext _context; + private readonly IFileStorageService _fileStorageService; + + public ContabilidadGeneralController(IContabilidadGeneralService contabilidadService, ApplicationDbContext context, IFileStorageService fileStorageService) + { + _contabilidadService = contabilidadService; + _context = context; + _fileStorageService = fileStorageService; + } + + // ==================== Vista Principal ==================== + + [HttpGet] + public async Task Index(int? anio) + { + var anioActual = anio ?? DateTime.Now.Year; + ViewBag.Anio = anioActual; + + // Generar lista de años disponibles + var anios = Enumerable.Range(DateTime.Now.Year - 5, 10).Reverse(); + ViewBag.Anios = new SelectList(anios); + + var reportes = await _contabilidadService.ListarReportesAsync(anioActual); + return View(reportes); + } + + // ==================== Abrir/Crear Reporte Mensual ==================== + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task AbrirMes(int mes, int anio) + { + try + { + var reporte = await _contabilidadService.ObtenerOCrearReporteMensualAsync(mes, anio); + TempData["Success"] = $"Reporte de {reporte.NombreMes} {anio} abierto correctamente."; + return RedirectToAction(nameof(RegistroMensual), new { id = reporte.Id }); + } + catch (Exception ex) + { + TempData["Error"] = "Error al abrir el mes: " + ex.Message; + return RedirectToAction(nameof(Index)); + } + } + + // ==================== Registro Mensual (Excel-like) ==================== + + [HttpGet] + public async Task RegistroMensual(long id) + { + var reporte = await _context.ReportesMensualesGenerales + .Include(r => r.Movimientos) + .ThenInclude(m => m.CategoriaIngreso) + .Include(r => r.Movimientos) + .ThenInclude(m => m.CategoriaEgreso) + .FirstOrDefaultAsync(r => r.Id == id); + + if (reporte == null) return NotFound(); + + ViewBag.SaldoActual = await _contabilidadService.CalcularSaldoActualAsync(id); + ViewBag.CategoriasIngreso = await _contabilidadService.ObtenerCategoriasIngresoAsync(); + ViewBag.CategoriasEgreso = await _contabilidadService.ObtenerCategoriasEgresoAsync(); + + return View(reporte); + } + + // ==================== Guardar Movimientos Bulk (AJAX) ==================== + + [HttpPost] + public async Task GuardarBulk([FromBody] BulkSaveRequest request) + { + if (request == null || request.ReporteId <= 0) + return BadRequest("Solicitud inválida."); + + var movimientos = request.Movimientos.Select(m => new MovimientoGeneral + { + Id = m.Id, + Tipo = m.Tipo, + CategoriaIngresoId = m.CategoriaIngresoId, + CategoriaEgresoId = m.CategoriaEgresoId, + Monto = m.Monto, + Fecha = DateTime.SpecifyKind(m.Fecha, DateTimeKind.Utc), + Descripcion = m.Descripcion ?? "", + NumeroComprobante = m.NumeroComprobante + }).ToList(); + + var success = await _contabilidadService.GuardarMovimientosBulkAsync(request.ReporteId, movimientos); + + if (success) + { + var nuevoSaldo = await _contabilidadService.CalcularSaldoActualAsync(request.ReporteId); + return Json(new { success = true, saldo = nuevoSaldo }); + } + + return Json(new { success = false, message = "Error al guardar los movimientos. Verifique que el mes no esté cerrado." }); + } + + // ==================== Cerrar Mes ==================== + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task CerrarMes(long id) + { + var success = await _contabilidadService.CerrarReporteAsync(id); + if (success) + { + TempData["Success"] = "El reporte ha sido cerrado. Ya no se pueden realizar cambios."; + } + else + { + TempData["Error"] = "No se pudo cerrar el reporte."; + } + return RedirectToAction(nameof(RegistroMensual), new { id }); + } + + // ==================== Consolidado Mensual ==================== + + [HttpGet] + public async Task Consolidado(long id) + { + var reporte = await _context.ReportesMensualesGenerales + .FirstOrDefaultAsync(r => r.Id == id); + + if (reporte == null) return NotFound(); + + ViewBag.ConsolidadoIngresos = await _contabilidadService.ObtenerConsolidadoIngresosAsync(id); + ViewBag.ConsolidadoEgresos = await _contabilidadService.ObtenerConsolidadoEgresosAsync(id); + ViewBag.SaldoActual = await _contabilidadService.CalcularSaldoActualAsync(id); + + return View(reporte); + } + + // ==================== Gestión de Categorías ==================== + + [HttpGet] + public async Task GestionCategorias() + { + var categoriasIngreso = await _context.CategoriasIngreso + .OrderBy(c => c.Nombre) + .ToListAsync(); + + var categoriasEgreso = await _context.CategoriasEgreso + .OrderBy(c => c.Nombre) + .ToListAsync(); + + ViewBag.CategoriasIngreso = categoriasIngreso; + ViewBag.CategoriasEgreso = categoriasEgreso; + + return View(); + } + + // ==================== CRUD Categorías Ingreso ==================== + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task CrearCategoriaIngreso(CategoriaIngreso categoria) + { + if (ModelState.IsValid) + { + await _contabilidadService.CrearCategoriaIngresoAsync(categoria); + TempData["Success"] = "Categoría de ingreso creada exitosamente."; + } + else + { + TempData["Error"] = "Error al crear la categoría."; + } + return RedirectToAction(nameof(GestionCategorias)); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task EditarCategoriaIngreso(CategoriaIngreso categoria) + { + if (ModelState.IsValid) + { + var success = await _contabilidadService.ActualizarCategoriaIngresoAsync(categoria); + TempData[success ? "Success" : "Error"] = success + ? "Categoría actualizada exitosamente." + : "Error al actualizar la categoría."; + } + return RedirectToAction(nameof(GestionCategorias)); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task EliminarCategoriaIngreso(long id) + { + var success = await _contabilidadService.EliminarCategoriaIngresoAsync(id); + TempData[success ? "Success" : "Error"] = success + ? "Categoría eliminada exitosamente." + : "Error al eliminar la categoría."; + return RedirectToAction(nameof(GestionCategorias)); + } + + // ==================== CRUD Categorías Egreso ==================== + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task CrearCategoriaEgreso(CategoriaEgreso categoria) + { + if (ModelState.IsValid) + { + await _contabilidadService.CrearCategoriaEgresoAsync(categoria); + TempData["Success"] = "Categoría de egreso creada exitosamente."; + } + else + { + TempData["Error"] = "Error al crear la categoría."; + } + return RedirectToAction(nameof(GestionCategorias)); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task EditarCategoriaEgreso(CategoriaEgreso categoria) + { + if (ModelState.IsValid) + { + var success = await _contabilidadService.ActualizarCategoriaEgresoAsync(categoria); + TempData[success ? "Success" : "Error"] = success + ? "Categoría actualizada exitosamente." + : "Error al actualizar la categoría."; + } + return RedirectToAction(nameof(GestionCategorias)); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task EliminarCategoriaEgreso(long id) + { + var success = await _contabilidadService.EliminarCategoriaEgresoAsync(id); + TempData[success ? "Success" : "Error"] = success + ? "Categoría eliminada exitosamente." + : "Error al eliminar la categoría."; + return RedirectToAction(nameof(GestionCategorias)); + } + + // ==================== Helper Classes for AJAX ==================== + + public class BulkSaveRequest + { + public long ReporteId { get; set; } + public List Movimientos { get; set; } = new(); + } + + public class MovimientoInput + { + public long Id { get; set; } + public int Tipo { get; set; } + public long? CategoriaIngresoId { get; set; } + public long? CategoriaEgresoId { get; set; } + public decimal Monto { get; set; } + public DateTime Fecha { get; set; } + public string? Descripcion { get; set; } + public string? NumeroComprobante { get; set; } + } + + // ==================== Adjuntos ==================== + + [HttpGet] + public async Task ObtenerAdjuntos(long movimientoId) + { + var adjuntos = await _contabilidadService.ObtenerAdjuntosMovimientoAsync(movimientoId); + return Json(adjuntos.Select(a => new { + id = a.Id, + nombre = a.NombreArchivo, + url = _fileStorageService.GetFileUrl(a.RutaArchivo), + tipo = a.TipoContenido, + fecha = a.FechaSubida.ToLocalTime().ToString("g") + })); + } + + [HttpPost] + public async Task SubirAdjunto(long movimientoId, List archivos) + { + if (movimientoId <= 0 || archivos == null || !archivos.Any()) + return BadRequest("Datos inválidos."); + + int count = 0; + foreach (var archivo in archivos) + { + if (archivo.Length > 0) + { + // El usuario solicitó guardar en uploads/miembros + var ruta = await _fileStorageService.SaveFileAsync(archivo, "miembros"); + if (!string.IsNullOrEmpty(ruta)) + { + await _contabilidadService.CrearAdjuntoAsync(movimientoId, archivo.FileName, ruta, archivo.ContentType); + count++; + } + } + } + + return Json(new { success = true, count = count, message = $"{count} archivos subidos correctamente." }); + } + + [HttpPost] + public async Task EliminarAdjunto(long id) + { + // Primero obtener para borrar el archivo físico si es necesario (opcional, aquí solo borramos registro BD) + // O idealmente el servicio se encarga. Por ahora solo borramos BD. + var success = await _contabilidadService.EliminarAdjuntoAsync(id); + return Json(new { success = success }); + } +} diff --git a/RS_system/Controllers/EstadosController.cs b/RS_system/Controllers/EstadosController.cs new file mode 100644 index 0000000..9d7eab7 --- /dev/null +++ b/RS_system/Controllers/EstadosController.cs @@ -0,0 +1,125 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Rs_system.Models; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class EstadosController : Controller +{ + private readonly IEstadoArticuloService _service; + + public EstadosController(IEstadoArticuloService service) + { + _service = service; + } + + // GET: Estados + public async Task Index() + { + var list = await _service.GetAllAsync(); + return View(list); + } + + // GET: Estados/Create + public IActionResult Create() + { + return View(); + } + + // POST: Estados/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create([Bind("Nombre,Descripcion,Color,Activo")] EstadoArticulo estado) + { + if (string.IsNullOrWhiteSpace(estado.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(estado.Nombre)) + { + ModelState.AddModelError("Nombre", "Ya existe un estado con ese nombre."); + return View(estado); + } + + estado.CreadoPor = User.Identity?.Name ?? "Sistema"; + var result = await _service.CreateAsync(estado); + + if (result) + { + TempData["SuccessMessage"] = "Estado creado exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "Ocurrió un error al guardar los datos."); + } + return View(estado); + } + + // GET: Estados/Edit/5 + public async Task Edit(int? id) + { + if (id == null) return NotFound(); + + var estado = await _service.GetByIdAsync(id.Value); + if (estado == null) return NotFound(); + + return View(estado); + } + + // POST: Estados/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Edit(int id, [Bind("Id,Nombre,Descripcion,Color,Activo")] EstadoArticulo estado) + { + if (id != estado.Id) return NotFound(); + + if (string.IsNullOrWhiteSpace(estado.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(estado.Nombre, id)) + { + ModelState.AddModelError("Nombre", "Ya existe otro estado con ese nombre."); + return View(estado); + } + + var result = await _service.UpdateAsync(estado); + + if (result) + { + TempData["SuccessMessage"] = "Estado actualizado exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "No se pudo actualizar el estado o no fue encontrado."); + } + + return View(estado); + } + + // POST: Estados/Delete/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Delete(int id) + { + var result = await _service.DeleteAsync(id); + if (result) + { + TempData["SuccessMessage"] = "Estado eliminado exitosamente."; + } + else + { + TempData["ErrorMessage"] = "No se pudo eliminar el estado."; + } + + return RedirectToAction(nameof(Index)); + } +} diff --git a/RS_system/Controllers/MovimientosInventarioController.cs b/RS_system/Controllers/MovimientosInventarioController.cs new file mode 100644 index 0000000..57114f9 --- /dev/null +++ b/RS_system/Controllers/MovimientosInventarioController.cs @@ -0,0 +1,190 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Rs_system.Models; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class MovimientosInventarioController : Controller +{ + private readonly IMovimientoService _movimientoService; + private readonly IArticuloService _articuloService; + private readonly IUbicacionService _ubicacionService; + private readonly IEstadoArticuloService _estadoService; + private readonly IPrestamoService _prestamoService; + + public MovimientosInventarioController( + IMovimientoService movimientoService, + IArticuloService articuloService, + IUbicacionService ubicacionService, + IEstadoArticuloService estadoService, + IPrestamoService prestamoService) + { + _movimientoService = movimientoService; + _articuloService = articuloService; + _ubicacionService = ubicacionService; + _estadoService = estadoService; + _prestamoService = prestamoService; + } + + // GET: MovimientosInventario + public async Task Index() + { + var historial = await _movimientoService.GetHistorialGeneralAsync(50); // Limit 50 for performance + return View(historial); + } + + // GET: MovimientosInventario/Create + // This is the "Wizard" or "Action Selector" + public async Task Create(int? articuloId) + { + if (articuloId.HasValue) + { + var articulo = await _articuloService.GetByIdAsync(articuloId.Value); + if (articulo == null) return NotFound(); + + ViewBag.ArticuloId = articulo.Id; + ViewBag.ArticuloNombre = $"{articulo.Codigo} - {articulo.Nombre}"; + ViewBag.UbicacionActual = articulo.UbicacionNombre; + ViewBag.EstadoActual = articulo.EstadoNombre; + ViewBag.TipoControl = articulo.TipoControl; // "UNITARIO" or "LOTE" + ViewBag.CantidadGlobal = articulo.CantidadGlobal; // For LOTE validation? + } + + ViewBag.Articulos = new SelectList((await _articuloService.GetAllAsync()).Select(x => new { x.Id, Nombre = $"{x.Codigo} - {x.Nombre}" }), "Id", "Nombre", articuloId); + ViewBag.Ubicaciones = new SelectList(await _ubicacionService.GetAllAsync(), "Id", "Nombre"); + ViewBag.Estados = new SelectList(await _estadoService.GetAllAsync(), "Id", "Nombre"); + + return View(); + } + + // POST: MovimientosInventario/RegistrarTraslado + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarTraslado(int articuloId, int nuevaUbicacionId, string observacion, int cantidad = 1) + { + var usuario = User.Identity?.Name ?? "Sistema"; + // Use the new Quantity-Aware method + var result = await _movimientoService.RegistrarTrasladoCantidadAsync(articuloId, nuevaUbicacionId, cantidad, observacion, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Traslado registrado correctamente."; + return RedirectToAction(nameof(Index)); + } + + TempData["ErrorMessage"] = "Error al registrar el traslado. Verifique stock o campos."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + // POST: MovimientosInventario/RegistrarBaja + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarBaja(int articuloId, string motivo, int cantidad = 1) + { + if (string.IsNullOrWhiteSpace(motivo)) + { + TempData["ErrorMessage"] = "Debe especificar un motivo para la baja."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + var usuario = User.Identity?.Name ?? "Sistema"; + var result = await _movimientoService.RegistrarBajaCantidadAsync(articuloId, cantidad, motivo, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Baja registrada correctamente."; + return RedirectToAction(nameof(Index)); + } + + TempData["ErrorMessage"] = "Error al registrar la baja."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + // POST: MovimientosInventario/RegistrarCambioEstado + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarCambioEstado(int articuloId, int nuevoEstadoId, string observacion) + { + var usuario = User.Identity?.Name ?? "Sistema"; + var result = await _movimientoService.RegistrarCambioEstadoAsync(articuloId, nuevoEstadoId, observacion, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Cambio de estado registrado correctamento."; + return RedirectToAction(nameof(Index)); + } + + TempData["ErrorMessage"] = "Error al registrar el cambio de estado. Verifique que el estado sea diferente al actual."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + // POST: MovimientosInventario/RegistrarPrestamo + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarPrestamo(int articuloId, int cantidad, string personaNombre, string personaIdentificacion, DateTime? fechaDevolucionEstimada, string observacion) + { + if (string.IsNullOrWhiteSpace(personaNombre)) + { + TempData["ErrorMessage"] = "Debe especificar el nombre de la persona a quien se presta el artículo."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + var usuario = User.Identity?.Name ?? "Sistema"; + var result = await _prestamoService.RegistrarPrestamoAsync(articuloId, cantidad, personaNombre, personaIdentificacion, fechaDevolucionEstimada, observacion, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Préstamo registrado correctamente."; + return RedirectToAction(nameof(Index)); + } + + TempData["ErrorMessage"] = "Error al registrar el préstamo. Verifique stock disponible."; + return RedirectToAction(nameof(Create), new { articuloId }); + } + + // GET: MovimientosInventario/PrestamosActivos + public async Task PrestamosActivos() + { + var prestamosActivos = await _prestamoService.GetPrestamosActivosAsync(); + return View(prestamosActivos); + } + + // POST: MovimientosInventario/RegistrarDevolucion + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarDevolucion(long prestamoId, string observacion) + { + var usuario = User.Identity?.Name ?? "Sistema"; + var result = await _prestamoService.RegistrarDevolucionAsync(prestamoId, observacion, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Devolución registrada correctamente."; + return RedirectToAction(nameof(PrestamosActivos)); + } + + TempData["ErrorMessage"] = "Error al registrar la devolución."; + return RedirectToAction(nameof(PrestamosActivos)); + } + + // POST: MovimientosInventario/RegistrarEntrada + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegistrarEntrada(int articuloId, int cantidad, string observacion) + { + var usuario = User.Identity?.Name ?? "Sistema"; + var result = await _movimientoService.RegistrarEntradaCantidadAsync(articuloId, cantidad, observacion, usuario); + + if (result) + { + TempData["SuccessMessage"] = "Entrada de inventario registrada correctamente."; + return RedirectToAction(nameof(Index)); + } + + TempData["ErrorMessage"] = "Error al registrar la entrada de inventario."; + return RedirectToAction(nameof(Create), new { articuloId }); + } +} diff --git a/RS_system/Controllers/TipoColaboracionController.cs b/RS_system/Controllers/TipoColaboracionController.cs new file mode 100644 index 0000000..a729d48 --- /dev/null +++ b/RS_system/Controllers/TipoColaboracionController.cs @@ -0,0 +1,168 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class TipoColaboracionController : Controller +{ + private readonly IColaboracionService _colaboracionService; + private readonly ApplicationDbContext _context; + + public TipoColaboracionController(IColaboracionService colaboracionService, ApplicationDbContext context) + { + _colaboracionService = colaboracionService; + _context = context; + } + + // GET: TipoColaboracion + public async Task Index() + { + try + { + var tipos = await _context.TiposColaboracion + .OrderBy(t => t.Orden) + .ToListAsync(); + return View(tipos); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al cargar tipos: {ex.Message}"; + return View(new List()); + } + } + + // GET: TipoColaboracion/Create + public IActionResult Create() + { + var model = new TipoColaboracion + { + MontoSugerido = 1.00m, + Activo = true + }; + return View(model); + } + + // POST: TipoColaboracion/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create(TipoColaboracion model) + { + if (ModelState.IsValid) + { + try + { + model.CreadoEn = DateTime.UtcNow; + model.ActualizadoEn = DateTime.UtcNow; + + _context.TiposColaboracion.Add(model); + await _context.SaveChangesAsync(); + + TempData["Success"] = "Tipo de colaboración creado exitosamente"; + return RedirectToAction(nameof(Index)); + } + catch (Exception ex) + { + ModelState.AddModelError("", $"Error al crear: {ex.Message}"); + } + } + + return View(model); + } + + // GET: TipoColaboracion/Edit/5 + public async Task Edit(long id) + { + try + { + var tipo = await _context.TiposColaboracion.FindAsync(id); + if (tipo == null) + { + TempData["Error"] = "Tipo de colaboración no encontrado"; + return RedirectToAction(nameof(Index)); + } + + return View(tipo); + } + catch (Exception ex) + { + TempData["Error"] = $"Error al cargar tipo: {ex.Message}"; + return RedirectToAction(nameof(Index)); + } + } + + // POST: TipoColaboracion/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Edit(long id, TipoColaboracion model) + { + if (id != model.Id) + { + return NotFound(); + } + + if (ModelState.IsValid) + { + try + { + var tipo = await _context.TiposColaboracion.FindAsync(id); + if (tipo == null) + { + TempData["Error"] = "Tipo de colaboración no encontrado"; + return RedirectToAction(nameof(Index)); + } + + tipo.Nombre = model.Nombre; + tipo.Descripcion = model.Descripcion; + tipo.MontoSugerido = model.MontoSugerido; + tipo.Activo = model.Activo; + tipo.Orden = model.Orden; + tipo.ActualizadoEn = DateTime.UtcNow; + _context.TiposColaboracion.Update(tipo); + await _context.SaveChangesAsync(); + + TempData["Success"] = "Tipo de colaboración actualizado exitosamente"; + return RedirectToAction(nameof(Index)); + } + catch (Exception ex) + { + ModelState.AddModelError("", $"Error al actualizar: {ex.Message}"); + } + } + + return View(model); + } + + // POST: TipoColaboracion/Delete/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Delete(long id) + { + try + { + var tipo = await _context.TiposColaboracion.FindAsync(id); + if (tipo == null) + { + TempData["Error"] = "Tipo de colaboración no encontrado"; + return RedirectToAction(nameof(Index)); + } + + // Soft delete - just deactivate + tipo.Activo = false; + tipo.ActualizadoEn = DateTime.UtcNow; + await _context.SaveChangesAsync(); + + TempData["Success"] = "Tipo de colaboración desactivado exitosamente"; + } + catch (Exception ex) + { + TempData["Error"] = $"Error al desactivar: {ex.Message}"; + } + + return RedirectToAction(nameof(Index)); + } +} diff --git a/RS_system/Controllers/UbicacionesController.cs b/RS_system/Controllers/UbicacionesController.cs new file mode 100644 index 0000000..ca35e88 --- /dev/null +++ b/RS_system/Controllers/UbicacionesController.cs @@ -0,0 +1,125 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Rs_system.Models; +using Rs_system.Services; + +namespace Rs_system.Controllers; + +[Authorize] +public class UbicacionesController : Controller +{ + private readonly IUbicacionService _service; + + public UbicacionesController(IUbicacionService service) + { + _service = service; + } + + // GET: Ubicaciones + public async Task Index() + { + var list = await _service.GetAllAsync(); + return View(list); + } + + // GET: Ubicaciones/Create + public IActionResult Create() + { + return View(); + } + + // POST: Ubicaciones/Create + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Create([Bind("Nombre,Descripcion,Responsable,Activo")] Ubicacion ubicacion) + { + if (string.IsNullOrWhiteSpace(ubicacion.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(ubicacion.Nombre)) + { + ModelState.AddModelError("Nombre", "Ya existe una ubicación con ese nombre."); + return View(ubicacion); + } + + ubicacion.CreadoPor = User.Identity?.Name ?? "Sistema"; + var result = await _service.CreateAsync(ubicacion); + + if (result) + { + TempData["SuccessMessage"] = "Ubicación creada exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "Ocurrió un error al guardar los datos."); + } + return View(ubicacion); + } + + // GET: Ubicaciones/Edit/5 + public async Task Edit(int? id) + { + if (id == null) return NotFound(); + + var ubicacion = await _service.GetByIdAsync(id.Value); + if (ubicacion == null) return NotFound(); + + return View(ubicacion); + } + + // POST: Ubicaciones/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Edit(int id, [Bind("Id,Nombre,Descripcion,Responsable,Activo")] Ubicacion ubicacion) + { + if (id != ubicacion.Id) return NotFound(); + + if (string.IsNullOrWhiteSpace(ubicacion.Nombre)) + { + ModelState.AddModelError("Nombre", "El nombre es obligatorio."); + } + + if (ModelState.IsValid) + { + if (await _service.ExistsAsync(ubicacion.Nombre, id)) + { + ModelState.AddModelError("Nombre", "Ya existe otra ubicación con ese nombre."); + return View(ubicacion); + } + + var result = await _service.UpdateAsync(ubicacion); + + if (result) + { + TempData["SuccessMessage"] = "Ubicación actualizada exitosamente."; + return RedirectToAction(nameof(Index)); + } + + ModelState.AddModelError("", "No se pudo actualizar la ubicación o no fue encontrada."); + } + + return View(ubicacion); + } + + // POST: Ubicaciones/Delete/5 + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Delete(int id) + { + var result = await _service.DeleteAsync(id); + if (result) + { + TempData["SuccessMessage"] = "Ubicación eliminada exitosamente."; + } + else + { + TempData["ErrorMessage"] = "No se pudo eliminar la ubicación."; + } + + return RedirectToAction(nameof(Index)); + } +} diff --git a/RS_system/Migrations/20260123043655_AddMonthlyAccounting.Designer.cs b/RS_system/Migrations/20260123043655_AddMonthlyAccounting.Designer.cs new file mode 100644 index 0000000..d1d38ff --- /dev/null +++ b/RS_system/Migrations/20260123043655_AddMonthlyAccounting.Designer.cs @@ -0,0 +1,1382 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Rs_system.Data; + +#nullable disable + +namespace RS_system.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20260123043655_AddMonthlyAccounting")] + partial class AddMonthlyAccounting + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Rs_system.Models.Articulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CantidadGlobal") + .HasColumnType("integer") + .HasColumnName("cantidad_global"); + + b.Property("CategoriaId") + .HasColumnType("integer") + .HasColumnName("categoria_id"); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("EstadoId") + .HasColumnType("integer") + .HasColumnName("estado_id"); + + b.Property("FechaAdquisicion") + .HasColumnType("date") + .HasColumnName("fecha_adquisicion"); + + b.Property("ImagenUrl") + .HasColumnType("text") + .HasColumnName("imagen_url"); + + b.Property("Marca") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("marca"); + + b.Property("Modelo") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("modelo"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("NumeroSerie") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("numero_serie"); + + b.Property("Precio") + .HasColumnType("numeric") + .HasColumnName("precio"); + + b.Property("TipoControl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tipo_control"); + + b.Property("UbicacionId") + .HasColumnType("integer") + .HasColumnName("ubicacion_id"); + + b.HasKey("Id"); + + b.HasIndex("CategoriaId"); + + b.HasIndex("EstadoId"); + + b.HasIndex("UbicacionId"); + + b.ToTable("articulos"); + }); + + modelBuilder.Entity("Rs_system.Models.AsistenciaCulto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("AdultosGeneral") + .HasColumnType("integer") + .HasColumnName("adultos_general"); + + b.Property("Amigos") + .HasColumnType("integer") + .HasColumnName("amigos"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasColumnType("text") + .HasColumnName("creado_por"); + + b.Property("EmbajadoresCristo") + .HasColumnType("integer") + .HasColumnName("embajadores_cristo"); + + b.Property("FechaHoraInicio") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha_hora_inicio"); + + b.Property("HermanasMisioneras") + .HasColumnType("integer") + .HasColumnName("hermanas_misioneras"); + + b.Property("HermanosFraternidad") + .HasColumnType("integer") + .HasColumnName("hermanos_fraternidad"); + + b.Property("Ninos") + .HasColumnType("integer") + .HasColumnName("ninos"); + + b.Property("Observaciones") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observaciones"); + + b.Property("TipoConteo") + .HasColumnType("integer") + .HasColumnName("tipo_conteo"); + + b.Property("TipoCulto") + .HasColumnType("integer") + .HasColumnName("tipo_culto"); + + b.Property("TotalManual") + .HasColumnType("integer") + .HasColumnName("total_manual"); + + b.Property("Visitas") + .HasColumnType("integer") + .HasColumnName("visitas"); + + b.HasKey("Id"); + + b.ToTable("asistencias_culto"); + }); + + modelBuilder.Entity("Rs_system.Models.Categoria", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("categorias"); + }); + + modelBuilder.Entity("Rs_system.Models.ConfiguracionSistema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Categoria") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("categoria"); + + b.Property("Clave") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("clave"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("EsEditable") + .HasColumnType("boolean") + .HasColumnName("es_editable"); + + b.Property("EsPublico") + .HasColumnType("boolean") + .HasColumnName("es_publico"); + + b.Property("Grupo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("grupo"); + + b.Property("Opciones") + .HasColumnType("jsonb") + .HasColumnName("opciones"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("TipoDato") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("tipo_dato"); + + b.Property("ValidacionRegex") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("validacion_regex"); + + b.Property("Valor") + .HasColumnType("text") + .HasColumnName("valor"); + + b.HasKey("Id"); + + b.ToTable("configuracion_sistema"); + }); + + modelBuilder.Entity("Rs_system.Models.ContabilidadRegistro", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Descripcion") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Fecha") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("Monto") + .HasColumnType("decimal(18,2)") + .HasColumnName("monto"); + + b.Property("ReporteMensualId") + .HasColumnType("bigint") + .HasColumnName("reporte_mensual_id"); + + b.Property("Tipo") + .HasColumnType("integer") + .HasColumnName("tipo"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.HasIndex("ReporteMensualId"); + + b.ToTable("contabilidad_registros"); + }); + + modelBuilder.Entity("Rs_system.Models.DescuentoOfrenda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Concepto") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("concepto"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Monto") + .HasColumnType("numeric") + .HasColumnName("monto"); + + b.Property("OfrendaId") + .HasColumnType("bigint") + .HasColumnName("ofrenda_id"); + + b.HasKey("Id"); + + b.HasIndex("OfrendaId"); + + b.ToTable("descuentos_ofrenda"); + }); + + modelBuilder.Entity("Rs_system.Models.EstadoArticulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Color") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("color"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("estados_articulos"); + }); + + modelBuilder.Entity("Rs_system.Models.Existencia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("ArticuloId") + .HasColumnType("integer") + .HasColumnName("articulo_id"); + + b.Property("Cantidad") + .HasColumnType("integer") + .HasColumnName("cantidad"); + + b.Property("UbicacionId") + .HasColumnType("integer") + .HasColumnName("ubicacion_id"); + + b.HasKey("Id"); + + b.HasIndex("ArticuloId"); + + b.HasIndex("UbicacionId"); + + b.ToTable("existencias"); + }); + + modelBuilder.Entity("Rs_system.Models.GrupoTrabajo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("grupos_trabajo"); + }); + + modelBuilder.Entity("Rs_system.Models.Miembro", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("BautizadoEspirituSanto") + .HasColumnType("boolean") + .HasColumnName("bautizado_espiritu_santo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("FechaIngresoCongregacion") + .HasColumnType("date") + .HasColumnName("fecha_ingreso_congregacion"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("PersonaId") + .HasColumnType("bigint") + .HasColumnName("persona_id"); + + b.Property("TelefonoEmergencia") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("telefono_emergencia"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.HasIndex("PersonaId"); + + b.ToTable("miembros"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Icono") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("icono"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("modulos"); + }); + + modelBuilder.Entity("Rs_system.Models.MovimientoInventario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArticuloId") + .HasColumnType("integer") + .HasColumnName("articulo_id"); + + b.Property("Cantidad") + .HasColumnType("integer") + .HasColumnName("cantidad"); + + b.Property("EstadoAnteriorId") + .HasColumnType("integer") + .HasColumnName("estado_anterior_id"); + + b.Property("EstadoNuevoId") + .HasColumnType("integer") + .HasColumnName("estado_nuevo_id"); + + b.Property("Fecha") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha"); + + b.Property("Observacion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observacion"); + + b.Property("TipoMovimiento") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tipo_movimiento"); + + b.Property("UbicacionDestinoId") + .HasColumnType("integer") + .HasColumnName("ubicacion_destino_id"); + + b.Property("UbicacionOrigenId") + .HasColumnType("integer") + .HasColumnName("ubicacion_origen_id"); + + b.Property("UsuarioId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("usuario_id"); + + b.HasKey("Id"); + + b.HasIndex("ArticuloId"); + + b.HasIndex("EstadoAnteriorId"); + + b.HasIndex("EstadoNuevoId"); + + b.HasIndex("UbicacionDestinoId"); + + b.HasIndex("UbicacionOrigenId"); + + b.ToTable("movimientos_inventario"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Concepto") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("concepto"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Monto") + .HasColumnType("numeric") + .HasColumnName("monto"); + + b.Property("RegistroCultoId") + .HasColumnType("bigint") + .HasColumnName("registro_culto_id"); + + b.HasKey("Id"); + + b.HasIndex("RegistroCultoId"); + + b.ToTable("ofrendas"); + }); + + modelBuilder.Entity("Rs_system.Models.Permiso", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("EsMenu") + .HasColumnType("boolean") + .HasColumnName("es_menu"); + + b.Property("Icono") + .HasColumnType("text") + .HasColumnName("icono"); + + b.Property("ModuloId") + .HasColumnType("integer") + .HasColumnName("modulo_id"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id"); + + b.HasIndex("ModuloId"); + + b.ToTable("permisos"); + }); + + modelBuilder.Entity("Rs_system.Models.Persona", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Apellidos") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("apellidos"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Direccion") + .HasColumnType("text") + .HasColumnName("direccion"); + + b.Property("Dui") + .HasMaxLength(12) + .HasColumnType("character varying(12)") + .HasColumnName("dui"); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email"); + + b.Property("FechaNacimiento") + .HasColumnType("date") + .HasColumnName("fecha_nacimiento"); + + b.Property("FotoUrl") + .HasColumnType("text") + .HasColumnName("foto_url"); + + b.Property("Genero") + .HasMaxLength(1) + .HasColumnType("character varying(1)") + .HasColumnName("genero"); + + b.Property("Nit") + .HasMaxLength(17) + .HasColumnType("character varying(17)") + .HasColumnName("nit"); + + b.Property("Nombres") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombres"); + + b.Property("Telefono") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("telefono"); + + b.HasKey("Id"); + + b.ToTable("personas"); + }); + + modelBuilder.Entity("Rs_system.Models.RegistroCulto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Fecha") + .HasColumnType("date") + .HasColumnName("fecha"); + + b.Property("Observaciones") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observaciones"); + + b.HasKey("Id"); + + b.ToTable("registros_culto"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Anio") + .HasColumnType("integer") + .HasColumnName("anio"); + + b.Property("Cerrado") + .HasColumnType("boolean") + .HasColumnName("cerrado"); + + b.Property("FechaCreacion") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha_creacion"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("Mes") + .HasColumnType("integer") + .HasColumnName("mes"); + + b.Property("SaldoInicial") + .HasColumnType("decimal(18,2)") + .HasColumnName("saldo_inicial"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.ToTable("reportes_mensuales_contables"); + }); + + modelBuilder.Entity("Rs_system.Models.RolPermiso", b => + { + b.Property("RolId") + .HasColumnType("integer") + .HasColumnName("rol_id"); + + b.Property("PermisoId") + .HasColumnType("integer") + .HasColumnName("permiso_id"); + + b.Property("AsignadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("asignado_en"); + + b.HasKey("RolId", "PermisoId"); + + b.HasIndex("PermisoId"); + + b.ToTable("roles_permisos"); + }); + + modelBuilder.Entity("Rs_system.Models.RolSistema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("roles_sistema"); + }); + + modelBuilder.Entity("Rs_system.Models.RolUsuario", b => + { + b.Property("UsuarioId") + .HasColumnType("bigint") + .HasColumnName("usuario_id"); + + b.Property("RolId") + .HasColumnType("integer") + .HasColumnName("rol_id"); + + b.Property("AsignadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("asignado_en"); + + b.HasKey("UsuarioId", "RolId"); + + b.HasIndex("RolId"); + + b.ToTable("roles_usuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Ubicacion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Responsable") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("responsable"); + + b.HasKey("Id"); + + b.ToTable("ubicaciones"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email"); + + b.Property("HashContrasena") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hash_contrasena"); + + b.Property("NombreUsuario") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("nombre_usuario"); + + b.Property("PersonaId") + .HasColumnType("bigint") + .HasColumnName("persona_id"); + + b.Property("UltimoLogin") + .HasColumnType("timestamp with time zone") + .HasColumnName("ultimo_login"); + + b.HasKey("Id"); + + b.HasIndex("PersonaId"); + + b.ToTable("usuarios"); + }); + + modelBuilder.Entity("Rs_system.Models.Articulo", b => + { + b.HasOne("Rs_system.Models.Categoria", "Categoria") + .WithMany() + .HasForeignKey("CategoriaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.EstadoArticulo", "Estado") + .WithMany() + .HasForeignKey("EstadoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Ubicacion", "Ubicacion") + .WithMany() + .HasForeignKey("UbicacionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Categoria"); + + b.Navigation("Estado"); + + b.Navigation("Ubicacion"); + }); + + modelBuilder.Entity("Rs_system.Models.ContabilidadRegistro", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany() + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Rs_system.Models.ReporteMensualContable", "ReporteMensual") + .WithMany("Registros") + .HasForeignKey("ReporteMensualId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("GrupoTrabajo"); + + b.Navigation("ReporteMensual"); + }); + + modelBuilder.Entity("Rs_system.Models.DescuentoOfrenda", b => + { + b.HasOne("Rs_system.Models.Ofrenda", "Ofrenda") + .WithMany("Descuentos") + .HasForeignKey("OfrendaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ofrenda"); + }); + + modelBuilder.Entity("Rs_system.Models.Existencia", b => + { + b.HasOne("Rs_system.Models.Articulo", "Articulo") + .WithMany() + .HasForeignKey("ArticuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Ubicacion", "Ubicacion") + .WithMany() + .HasForeignKey("UbicacionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Articulo"); + + b.Navigation("Ubicacion"); + }); + + modelBuilder.Entity("Rs_system.Models.Miembro", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany("Miembros") + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Rs_system.Models.Persona", "Persona") + .WithMany() + .HasForeignKey("PersonaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("GrupoTrabajo"); + + b.Navigation("Persona"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.HasOne("Rs_system.Models.Modulo", "Parent") + .WithMany("SubModulos") + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("Rs_system.Models.MovimientoInventario", b => + { + b.HasOne("Rs_system.Models.Articulo", "Articulo") + .WithMany() + .HasForeignKey("ArticuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.EstadoArticulo", "EstadoAnterior") + .WithMany() + .HasForeignKey("EstadoAnteriorId"); + + b.HasOne("Rs_system.Models.EstadoArticulo", "EstadoNuevo") + .WithMany() + .HasForeignKey("EstadoNuevoId"); + + b.HasOne("Rs_system.Models.Ubicacion", "UbicacionDestino") + .WithMany() + .HasForeignKey("UbicacionDestinoId"); + + b.HasOne("Rs_system.Models.Ubicacion", "UbicacionOrigen") + .WithMany() + .HasForeignKey("UbicacionOrigenId"); + + b.Navigation("Articulo"); + + b.Navigation("EstadoAnterior"); + + b.Navigation("EstadoNuevo"); + + b.Navigation("UbicacionDestino"); + + b.Navigation("UbicacionOrigen"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.HasOne("Rs_system.Models.RegistroCulto", "RegistroCulto") + .WithMany("Ofrendas") + .HasForeignKey("RegistroCultoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("RegistroCulto"); + }); + + modelBuilder.Entity("Rs_system.Models.Permiso", b => + { + b.HasOne("Rs_system.Models.Modulo", "Modulo") + .WithMany("Permisos") + .HasForeignKey("ModuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Modulo"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany() + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("GrupoTrabajo"); + }); + + modelBuilder.Entity("Rs_system.Models.RolPermiso", b => + { + b.HasOne("Rs_system.Models.Permiso", "Permiso") + .WithMany() + .HasForeignKey("PermisoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.RolSistema", "Rol") + .WithMany("RolesPermisos") + .HasForeignKey("RolId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permiso"); + + b.Navigation("Rol"); + }); + + modelBuilder.Entity("Rs_system.Models.RolUsuario", b => + { + b.HasOne("Rs_system.Models.RolSistema", "Rol") + .WithMany("RolesUsuario") + .HasForeignKey("RolId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Usuario", "Usuario") + .WithMany("RolesUsuario") + .HasForeignKey("UsuarioId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Rol"); + + b.Navigation("Usuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.HasOne("Rs_system.Models.Persona", "Persona") + .WithMany() + .HasForeignKey("PersonaId"); + + b.Navigation("Persona"); + }); + + modelBuilder.Entity("Rs_system.Models.GrupoTrabajo", b => + { + b.Navigation("Miembros"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.Navigation("Permisos"); + + b.Navigation("SubModulos"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.Navigation("Descuentos"); + }); + + modelBuilder.Entity("Rs_system.Models.RegistroCulto", b => + { + b.Navigation("Ofrendas"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.Navigation("Registros"); + }); + + modelBuilder.Entity("Rs_system.Models.RolSistema", b => + { + b.Navigation("RolesPermisos"); + + b.Navigation("RolesUsuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.Navigation("RolesUsuario"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/RS_system/Migrations/20260123043655_AddMonthlyAccounting.cs b/RS_system/Migrations/20260123043655_AddMonthlyAccounting.cs new file mode 100644 index 0000000..37308b5 --- /dev/null +++ b/RS_system/Migrations/20260123043655_AddMonthlyAccounting.cs @@ -0,0 +1,96 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace RS_system.Migrations +{ + /// + public partial class AddMonthlyAccounting : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "reportes_mensuales_contables", + columns: table => new + { + id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + grupo_trabajo_id = table.Column(type: "bigint", nullable: false), + mes = table.Column(type: "integer", nullable: false), + anio = table.Column(type: "integer", nullable: false), + saldo_inicial = table.Column(type: "numeric(18,2)", nullable: false), + fecha_creacion = table.Column(type: "timestamp with time zone", nullable: false), + cerrado = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_reportes_mensuales_contables", x => x.id); + table.ForeignKey( + name: "FK_reportes_mensuales_contables_grupos_trabajo_grupo_trabajo_id", + column: x => x.grupo_trabajo_id, + principalTable: "grupos_trabajo", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "contabilidad_registros", + columns: table => new + { + id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + reporte_mensual_id = table.Column(type: "bigint", nullable: true), + grupo_trabajo_id = table.Column(type: "bigint", nullable: false), + tipo = table.Column(type: "integer", nullable: false), + monto = table.Column(type: "numeric(18,2)", nullable: false), + fecha = table.Column(type: "timestamp with time zone", nullable: false), + descripcion = table.Column(type: "character varying(200)", maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_contabilidad_registros", x => x.id); + table.ForeignKey( + name: "FK_contabilidad_registros_grupos_trabajo_grupo_trabajo_id", + column: x => x.grupo_trabajo_id, + principalTable: "grupos_trabajo", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_contabilidad_registros_reportes_mensuales_contables_reporte_mensual_id", + column: x => x.reporte_mensual_id, + principalTable: "reportes_mensuales_contables", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_contabilidad_registros_grupo_trabajo_id", + table: "contabilidad_registros", + column: "grupo_trabajo_id"); + + migrationBuilder.CreateIndex( + name: "IX_contabilidad_registros_reporte_mensual_id", + table: "contabilidad_registros", + column: "reporte_mensual_id"); + + migrationBuilder.CreateIndex( + name: "IX_reportes_mensuales_contables_grupo_trabajo_id", + table: "reportes_mensuales_contables", + column: "grupo_trabajo_id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "contabilidad_registros"); + + migrationBuilder.DropTable( + name: "reportes_mensuales_contables"); + } + + } +} diff --git a/RS_system/Migrations/AddPrestamosFunctionality.sql b/RS_system/Migrations/AddPrestamosFunctionality.sql new file mode 100644 index 0000000..025d2a7 --- /dev/null +++ b/RS_system/Migrations/AddPrestamosFunctionality.sql @@ -0,0 +1,143 @@ +-- SQL para agregar funcionalidad de préstamos al sistema de inventario +-- PostgreSQL + +-- 1. Agregar el nuevo tipo de movimiento PRESTAMO al enum existente +-- Nota: PostgreSQL no tiene ALTER ENUM, así que necesitamos recrear el enum +-- Primero creamos el nuevo enum + +CREATE TYPE tipo_movimiento_new AS ENUM ( + 'ENTRADA', + 'SALIDA', + 'TRASLADO', + 'BAJA', + 'REPARACION', + 'AJUSTE', + 'CAMBIO_ESTADO', + 'PRESTAMO' +); + +-- Convertimos los datos existentes al nuevo enum +ALTER TABLE movimientos_inventario +ALTER COLUMN tipo_movimiento TYPE tipo_movimiento_new +USING tipo_movimiento::text::tipo_movimiento_new; + +-- Eliminamos el enum viejo y renombramos el nuevo +DROP TYPE tipo_movimiento; +ALTER TYPE tipo_movimiento_new RENAME TO tipo_movimiento; + +-- 2. Crear tabla de préstamos +CREATE TABLE prestamos ( + id BIGSERIAL PRIMARY KEY, + articulo_id INTEGER NOT NULL, + cantidad INTEGER NOT NULL, + persona_nombre VARCHAR(200) NOT NULL, + persona_identificacion VARCHAR(50), + fecha_prestamo TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + fecha_devolucion_estimada TIMESTAMP WITH TIME ZONE, + fecha_devolucion_real TIMESTAMP WITH TIME ZONE, + estado VARCHAR(20) NOT NULL DEFAULT 'ACTIVO', + observacion VARCHAR(500), + usuario_id VARCHAR(100), + CONSTRAINT fk_prestamos_articulos FOREIGN KEY (articulo_id) REFERENCES articulos(id) ON DELETE CASCADE +); + +-- 3. Crear tabla de detalles de préstamo (para códigos individuales) +CREATE TABLE prestamo_detalles ( + id BIGSERIAL PRIMARY KEY, + prestamo_id BIGINT NOT NULL, + codigo_articulo_individual VARCHAR(100) NOT NULL, + estado VARCHAR(20) NOT NULL DEFAULT 'PRESTADO', + fecha_devolucion TIMESTAMP WITH TIME ZONE, + observacion VARCHAR(300), + CONSTRAINT fk_prestamo_detalles_prestamo FOREIGN KEY (prestamo_id) REFERENCES prestamos(id) ON DELETE CASCADE +); + +-- 4. Crear índices para mejor rendimiento +CREATE INDEX idx_prestamos_articulo_id ON prestamos(articulo_id); +CREATE INDEX idx_prestamos_estado ON prestamos(estado); +CREATE INDEX idx_prestamos_fecha_prestamo ON prestamos(fecha_prestamo); +CREATE INDEX idx_prestamo_detalles_prestamo_id ON prestamo_detalles(prestamo_id); +CREATE INDEX idx_prestamo_detalles_codigo ON prestamo_detalles(codigo_articulo_individual); + +-- 5. Crear función para generar códigos individuales automáticamente +CREATE OR REPLACE FUNCTION generar_codigo_individual(p_codigo_base VARCHAR, p_secuencia INTEGER) +RETURNS VARCHAR AS $$ +BEGIN + RETURN p_codigo_base || '-' || LPAD(p_secuencia::TEXT, 3, '0'); +END; +$$ LANGUAGE plpgsql; + +-- 6. Crear trigger para actualizar estado de préstamo cuando todos los detalles están devueltos +CREATE OR REPLACE FUNCTION actualizar_estado_prestamo() +RETURNS TRIGGER AS $$ +BEGIN + -- Si se actualiza un detalle a DEVUELTO, verificar si todos están devueltos + IF NEW.estado = 'DEVUELTO' THEN + UPDATE prestamos + SET estado = CASE + WHEN NOT EXISTS ( + SELECT 1 FROM prestamo_detalles + WHERE prestamo_id = NEW.prestamo_id AND estado != 'DEVUELTO' + ) THEN 'DEVUELTO' + ELSE estado + END, + fecha_devolucion_real = CASE + WHEN NOT EXISTS ( + SELECT 1 FROM prestamo_detalles + WHERE prestamo_id = NEW.prestamo_id AND estado != 'DEVUELTO' + ) THEN CURRENT_TIMESTAMP + ELSE fecha_devolucion_real + END + WHERE id = NEW.prestamo_id; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- 7. Crear el trigger +CREATE TRIGGER trigger_actualizar_estado_prestamo + AFTER UPDATE ON prestamo_detalles + FOR EACH ROW + EXECUTE FUNCTION actualizar_estado_prestamo(); + +-- 8. Insertar datos de ejemplo (opcional) +-- INSERT INTO prestamos (articulo_id, cantidad, persona_nombre, persona_identificacion, fecha_devolucion_estimada, observacion, usuario_id) +-- VALUES (1, 2, 'Juan Pérez', '12345678', CURRENT_TIMESTAMP + INTERVAL '7 days', 'Préstamo para evento especial', 'admin'); + +-- Generar códigos individuales para el préstamo de ejemplo +-- INSERT INTO prestamo_detalles (prestamo_id, codigo_articulo_individual, estado) +-- VALUES +-- (1, generar_codigo_individual('sp-b20', 1), 'PRESTADO'), +-- (1, generar_codigo_individual('sp-b20', 2), 'PRESTADO'); + +-- 9. Crear vista para préstamos activos con detalles +CREATE OR REPLACE VIEW vista_prestamos_activos AS +SELECT + p.id, + p.articulo_id, + a.codigo as articulo_codigo, + a.nombre as articulo_nombre, + p.cantidad, + p.persona_nombre, + p.persona_identificacion, + p.fecha_prestamo, + p.fecha_devolucion_estimada, + p.estado, + p.observacion, + p.usuario_id, + COUNT(pd.id) as detalles_devueltos, + (p.cantidad - COUNT(pd.id)) as detalles_pendientes +FROM prestamos p +LEFT JOIN articulos a ON p.articulo_id = a.id +LEFT JOIN prestamo_detalles pd ON p.id = pd.prestamo_id AND pd.estado = 'DEVUELTO' +WHERE p.estado = 'ACTIVO' +GROUP BY p.id, p.articulo_id, a.codigo, a.nombre, p.cantidad, p.persona_nombre, p.persona_identificacion, p.fecha_prestamo, p.fecha_devolucion_estimada, p.estado, p.observacion, p.usuario_id; + +-- 10. Conceder permisos (ajustar según tu usuario de base de datos) +-- GRANT SELECT, INSERT, UPDATE, DELETE ON prestamos TO tu_usuario; +-- GRANT SELECT, INSERT, UPDATE, DELETE ON prestamo_detalles TO tu_usuario; +-- GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO tu_usuario; +-- GRANT EXECUTE ON FUNCTION generar_codigo_individual TO tu_usuario; +-- GRANT EXECUTE ON FUNCTION actualizar_estado_prestamo TO tu_usuario; +-- GRANT SELECT ON vista_prestamos_activos TO tu_usuario; \ No newline at end of file diff --git a/RS_system/Migrations/ApplicationDbContextModelSnapshot.cs b/RS_system/Migrations/ApplicationDbContextModelSnapshot.cs new file mode 100644 index 0000000..827e75e --- /dev/null +++ b/RS_system/Migrations/ApplicationDbContextModelSnapshot.cs @@ -0,0 +1,1379 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Rs_system.Data; + +#nullable disable + +namespace RS_system.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + partial class ApplicationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Rs_system.Models.Articulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CantidadGlobal") + .HasColumnType("integer") + .HasColumnName("cantidad_global"); + + b.Property("CategoriaId") + .HasColumnType("integer") + .HasColumnName("categoria_id"); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("EstadoId") + .HasColumnType("integer") + .HasColumnName("estado_id"); + + b.Property("FechaAdquisicion") + .HasColumnType("date") + .HasColumnName("fecha_adquisicion"); + + b.Property("ImagenUrl") + .HasColumnType("text") + .HasColumnName("imagen_url"); + + b.Property("Marca") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("marca"); + + b.Property("Modelo") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("modelo"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("NumeroSerie") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("numero_serie"); + + b.Property("Precio") + .HasColumnType("numeric") + .HasColumnName("precio"); + + b.Property("TipoControl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tipo_control"); + + b.Property("UbicacionId") + .HasColumnType("integer") + .HasColumnName("ubicacion_id"); + + b.HasKey("Id"); + + b.HasIndex("CategoriaId"); + + b.HasIndex("EstadoId"); + + b.HasIndex("UbicacionId"); + + b.ToTable("articulos"); + }); + + modelBuilder.Entity("Rs_system.Models.AsistenciaCulto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("AdultosGeneral") + .HasColumnType("integer") + .HasColumnName("adultos_general"); + + b.Property("Amigos") + .HasColumnType("integer") + .HasColumnName("amigos"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasColumnType("text") + .HasColumnName("creado_por"); + + b.Property("EmbajadoresCristo") + .HasColumnType("integer") + .HasColumnName("embajadores_cristo"); + + b.Property("FechaHoraInicio") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha_hora_inicio"); + + b.Property("HermanasMisioneras") + .HasColumnType("integer") + .HasColumnName("hermanas_misioneras"); + + b.Property("HermanosFraternidad") + .HasColumnType("integer") + .HasColumnName("hermanos_fraternidad"); + + b.Property("Ninos") + .HasColumnType("integer") + .HasColumnName("ninos"); + + b.Property("Observaciones") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observaciones"); + + b.Property("TipoConteo") + .HasColumnType("integer") + .HasColumnName("tipo_conteo"); + + b.Property("TipoCulto") + .HasColumnType("integer") + .HasColumnName("tipo_culto"); + + b.Property("TotalManual") + .HasColumnType("integer") + .HasColumnName("total_manual"); + + b.Property("Visitas") + .HasColumnType("integer") + .HasColumnName("visitas"); + + b.HasKey("Id"); + + b.ToTable("asistencias_culto"); + }); + + modelBuilder.Entity("Rs_system.Models.Categoria", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("categorias"); + }); + + modelBuilder.Entity("Rs_system.Models.ConfiguracionSistema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Categoria") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("categoria"); + + b.Property("Clave") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("clave"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("EsEditable") + .HasColumnType("boolean") + .HasColumnName("es_editable"); + + b.Property("EsPublico") + .HasColumnType("boolean") + .HasColumnName("es_publico"); + + b.Property("Grupo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("grupo"); + + b.Property("Opciones") + .HasColumnType("jsonb") + .HasColumnName("opciones"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("TipoDato") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("tipo_dato"); + + b.Property("ValidacionRegex") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("validacion_regex"); + + b.Property("Valor") + .HasColumnType("text") + .HasColumnName("valor"); + + b.HasKey("Id"); + + b.ToTable("configuracion_sistema"); + }); + + modelBuilder.Entity("Rs_system.Models.ContabilidadRegistro", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Descripcion") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Fecha") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("Monto") + .HasColumnType("decimal(18,2)") + .HasColumnName("monto"); + + b.Property("ReporteMensualId") + .HasColumnType("bigint") + .HasColumnName("reporte_mensual_id"); + + b.Property("Tipo") + .HasColumnType("integer") + .HasColumnName("tipo"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.HasIndex("ReporteMensualId"); + + b.ToTable("contabilidad_registros"); + }); + + modelBuilder.Entity("Rs_system.Models.DescuentoOfrenda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Concepto") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("concepto"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Monto") + .HasColumnType("numeric") + .HasColumnName("monto"); + + b.Property("OfrendaId") + .HasColumnType("bigint") + .HasColumnName("ofrenda_id"); + + b.HasKey("Id"); + + b.HasIndex("OfrendaId"); + + b.ToTable("descuentos_ofrenda"); + }); + + modelBuilder.Entity("Rs_system.Models.EstadoArticulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Color") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("color"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("estados_articulos"); + }); + + modelBuilder.Entity("Rs_system.Models.Existencia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("ArticuloId") + .HasColumnType("integer") + .HasColumnName("articulo_id"); + + b.Property("Cantidad") + .HasColumnType("integer") + .HasColumnName("cantidad"); + + b.Property("UbicacionId") + .HasColumnType("integer") + .HasColumnName("ubicacion_id"); + + b.HasKey("Id"); + + b.HasIndex("ArticuloId"); + + b.HasIndex("UbicacionId"); + + b.ToTable("existencias"); + }); + + modelBuilder.Entity("Rs_system.Models.GrupoTrabajo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("grupos_trabajo"); + }); + + modelBuilder.Entity("Rs_system.Models.Miembro", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("BautizadoEspirituSanto") + .HasColumnType("boolean") + .HasColumnName("bautizado_espiritu_santo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("FechaIngresoCongregacion") + .HasColumnType("date") + .HasColumnName("fecha_ingreso_congregacion"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("PersonaId") + .HasColumnType("bigint") + .HasColumnName("persona_id"); + + b.Property("TelefonoEmergencia") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("telefono_emergencia"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.HasIndex("PersonaId"); + + b.ToTable("miembros"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Icono") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("icono"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("modulos"); + }); + + modelBuilder.Entity("Rs_system.Models.MovimientoInventario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArticuloId") + .HasColumnType("integer") + .HasColumnName("articulo_id"); + + b.Property("Cantidad") + .HasColumnType("integer") + .HasColumnName("cantidad"); + + b.Property("EstadoAnteriorId") + .HasColumnType("integer") + .HasColumnName("estado_anterior_id"); + + b.Property("EstadoNuevoId") + .HasColumnType("integer") + .HasColumnName("estado_nuevo_id"); + + b.Property("Fecha") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha"); + + b.Property("Observacion") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observacion"); + + b.Property("TipoMovimiento") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tipo_movimiento"); + + b.Property("UbicacionDestinoId") + .HasColumnType("integer") + .HasColumnName("ubicacion_destino_id"); + + b.Property("UbicacionOrigenId") + .HasColumnType("integer") + .HasColumnName("ubicacion_origen_id"); + + b.Property("UsuarioId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("usuario_id"); + + b.HasKey("Id"); + + b.HasIndex("ArticuloId"); + + b.HasIndex("EstadoAnteriorId"); + + b.HasIndex("EstadoNuevoId"); + + b.HasIndex("UbicacionDestinoId"); + + b.HasIndex("UbicacionOrigenId"); + + b.ToTable("movimientos_inventario"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Concepto") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("concepto"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Monto") + .HasColumnType("numeric") + .HasColumnName("monto"); + + b.Property("RegistroCultoId") + .HasColumnType("bigint") + .HasColumnName("registro_culto_id"); + + b.HasKey("Id"); + + b.HasIndex("RegistroCultoId"); + + b.ToTable("ofrendas"); + }); + + modelBuilder.Entity("Rs_system.Models.Permiso", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("EsMenu") + .HasColumnType("boolean") + .HasColumnName("es_menu"); + + b.Property("Icono") + .HasColumnType("text") + .HasColumnName("icono"); + + b.Property("ModuloId") + .HasColumnType("integer") + .HasColumnName("modulo_id"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Orden") + .HasColumnType("integer") + .HasColumnName("orden"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id"); + + b.HasIndex("ModuloId"); + + b.ToTable("permisos"); + }); + + modelBuilder.Entity("Rs_system.Models.Persona", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("Apellidos") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("apellidos"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Direccion") + .HasColumnType("text") + .HasColumnName("direccion"); + + b.Property("Dui") + .HasMaxLength(12) + .HasColumnType("character varying(12)") + .HasColumnName("dui"); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email"); + + b.Property("FechaNacimiento") + .HasColumnType("date") + .HasColumnName("fecha_nacimiento"); + + b.Property("FotoUrl") + .HasColumnType("text") + .HasColumnName("foto_url"); + + b.Property("Genero") + .HasMaxLength(1) + .HasColumnType("character varying(1)") + .HasColumnName("genero"); + + b.Property("Nit") + .HasMaxLength(17) + .HasColumnType("character varying(17)") + .HasColumnName("nit"); + + b.Property("Nombres") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombres"); + + b.Property("Telefono") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("telefono"); + + b.HasKey("Id"); + + b.ToTable("personas"); + }); + + modelBuilder.Entity("Rs_system.Models.RegistroCulto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Fecha") + .HasColumnType("date") + .HasColumnName("fecha"); + + b.Property("Observaciones") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .HasColumnName("observaciones"); + + b.HasKey("Id"); + + b.ToTable("registros_culto"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Anio") + .HasColumnType("integer") + .HasColumnName("anio"); + + b.Property("Cerrado") + .HasColumnType("boolean") + .HasColumnName("cerrado"); + + b.Property("FechaCreacion") + .HasColumnType("timestamp with time zone") + .HasColumnName("fecha_creacion"); + + b.Property("GrupoTrabajoId") + .HasColumnType("bigint") + .HasColumnName("grupo_trabajo_id"); + + b.Property("Mes") + .HasColumnType("integer") + .HasColumnName("mes"); + + b.Property("SaldoInicial") + .HasColumnType("decimal(18,2)") + .HasColumnName("saldo_inicial"); + + b.HasKey("Id"); + + b.HasIndex("GrupoTrabajoId"); + + b.ToTable("reportes_mensuales_contables"); + }); + + modelBuilder.Entity("Rs_system.Models.RolPermiso", b => + { + b.Property("RolId") + .HasColumnType("integer") + .HasColumnName("rol_id"); + + b.Property("PermisoId") + .HasColumnType("integer") + .HasColumnName("permiso_id"); + + b.Property("AsignadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("asignado_en"); + + b.HasKey("RolId", "PermisoId"); + + b.HasIndex("PermisoId"); + + b.ToTable("roles_permisos"); + }); + + modelBuilder.Entity("Rs_system.Models.RolSistema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Codigo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("codigo"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Descripcion") + .HasColumnType("text") + .HasColumnName("descripcion"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.HasKey("Id"); + + b.ToTable("roles_sistema"); + }); + + modelBuilder.Entity("Rs_system.Models.RolUsuario", b => + { + b.Property("UsuarioId") + .HasColumnType("bigint") + .HasColumnName("usuario_id"); + + b.Property("RolId") + .HasColumnType("integer") + .HasColumnName("rol_id"); + + b.Property("AsignadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("asignado_en"); + + b.HasKey("UsuarioId", "RolId"); + + b.HasIndex("RolId"); + + b.ToTable("roles_usuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Ubicacion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("CreadoPor") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("creado_por"); + + b.Property("Descripcion") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("descripcion"); + + b.Property("Eliminado") + .HasColumnType("boolean") + .HasColumnName("eliminado"); + + b.Property("Nombre") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("nombre"); + + b.Property("Responsable") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("responsable"); + + b.HasKey("Id"); + + b.ToTable("ubicaciones"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Activo") + .HasColumnType("boolean") + .HasColumnName("activo"); + + b.Property("ActualizadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("actualizado_en"); + + b.Property("CreadoEn") + .HasColumnType("timestamp with time zone") + .HasColumnName("creado_en"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email"); + + b.Property("HashContrasena") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hash_contrasena"); + + b.Property("NombreUsuario") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("nombre_usuario"); + + b.Property("PersonaId") + .HasColumnType("bigint") + .HasColumnName("persona_id"); + + b.Property("UltimoLogin") + .HasColumnType("timestamp with time zone") + .HasColumnName("ultimo_login"); + + b.HasKey("Id"); + + b.HasIndex("PersonaId"); + + b.ToTable("usuarios"); + }); + + modelBuilder.Entity("Rs_system.Models.Articulo", b => + { + b.HasOne("Rs_system.Models.Categoria", "Categoria") + .WithMany() + .HasForeignKey("CategoriaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.EstadoArticulo", "Estado") + .WithMany() + .HasForeignKey("EstadoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Ubicacion", "Ubicacion") + .WithMany() + .HasForeignKey("UbicacionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Categoria"); + + b.Navigation("Estado"); + + b.Navigation("Ubicacion"); + }); + + modelBuilder.Entity("Rs_system.Models.ContabilidadRegistro", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany() + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Rs_system.Models.ReporteMensualContable", "ReporteMensual") + .WithMany("Registros") + .HasForeignKey("ReporteMensualId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("GrupoTrabajo"); + + b.Navigation("ReporteMensual"); + }); + + modelBuilder.Entity("Rs_system.Models.DescuentoOfrenda", b => + { + b.HasOne("Rs_system.Models.Ofrenda", "Ofrenda") + .WithMany("Descuentos") + .HasForeignKey("OfrendaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ofrenda"); + }); + + modelBuilder.Entity("Rs_system.Models.Existencia", b => + { + b.HasOne("Rs_system.Models.Articulo", "Articulo") + .WithMany() + .HasForeignKey("ArticuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Ubicacion", "Ubicacion") + .WithMany() + .HasForeignKey("UbicacionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Articulo"); + + b.Navigation("Ubicacion"); + }); + + modelBuilder.Entity("Rs_system.Models.Miembro", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany("Miembros") + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Rs_system.Models.Persona", "Persona") + .WithMany() + .HasForeignKey("PersonaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("GrupoTrabajo"); + + b.Navigation("Persona"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.HasOne("Rs_system.Models.Modulo", "Parent") + .WithMany("SubModulos") + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("Rs_system.Models.MovimientoInventario", b => + { + b.HasOne("Rs_system.Models.Articulo", "Articulo") + .WithMany() + .HasForeignKey("ArticuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.EstadoArticulo", "EstadoAnterior") + .WithMany() + .HasForeignKey("EstadoAnteriorId"); + + b.HasOne("Rs_system.Models.EstadoArticulo", "EstadoNuevo") + .WithMany() + .HasForeignKey("EstadoNuevoId"); + + b.HasOne("Rs_system.Models.Ubicacion", "UbicacionDestino") + .WithMany() + .HasForeignKey("UbicacionDestinoId"); + + b.HasOne("Rs_system.Models.Ubicacion", "UbicacionOrigen") + .WithMany() + .HasForeignKey("UbicacionOrigenId"); + + b.Navigation("Articulo"); + + b.Navigation("EstadoAnterior"); + + b.Navigation("EstadoNuevo"); + + b.Navigation("UbicacionDestino"); + + b.Navigation("UbicacionOrigen"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.HasOne("Rs_system.Models.RegistroCulto", "RegistroCulto") + .WithMany("Ofrendas") + .HasForeignKey("RegistroCultoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("RegistroCulto"); + }); + + modelBuilder.Entity("Rs_system.Models.Permiso", b => + { + b.HasOne("Rs_system.Models.Modulo", "Modulo") + .WithMany("Permisos") + .HasForeignKey("ModuloId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Modulo"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.HasOne("Rs_system.Models.GrupoTrabajo", "GrupoTrabajo") + .WithMany() + .HasForeignKey("GrupoTrabajoId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("GrupoTrabajo"); + }); + + modelBuilder.Entity("Rs_system.Models.RolPermiso", b => + { + b.HasOne("Rs_system.Models.Permiso", "Permiso") + .WithMany() + .HasForeignKey("PermisoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.RolSistema", "Rol") + .WithMany("RolesPermisos") + .HasForeignKey("RolId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permiso"); + + b.Navigation("Rol"); + }); + + modelBuilder.Entity("Rs_system.Models.RolUsuario", b => + { + b.HasOne("Rs_system.Models.RolSistema", "Rol") + .WithMany("RolesUsuario") + .HasForeignKey("RolId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Rs_system.Models.Usuario", "Usuario") + .WithMany("RolesUsuario") + .HasForeignKey("UsuarioId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Rol"); + + b.Navigation("Usuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.HasOne("Rs_system.Models.Persona", "Persona") + .WithMany() + .HasForeignKey("PersonaId"); + + b.Navigation("Persona"); + }); + + modelBuilder.Entity("Rs_system.Models.GrupoTrabajo", b => + { + b.Navigation("Miembros"); + }); + + modelBuilder.Entity("Rs_system.Models.Modulo", b => + { + b.Navigation("Permisos"); + + b.Navigation("SubModulos"); + }); + + modelBuilder.Entity("Rs_system.Models.Ofrenda", b => + { + b.Navigation("Descuentos"); + }); + + modelBuilder.Entity("Rs_system.Models.RegistroCulto", b => + { + b.Navigation("Ofrendas"); + }); + + modelBuilder.Entity("Rs_system.Models.ReporteMensualContable", b => + { + b.Navigation("Registros"); + }); + + modelBuilder.Entity("Rs_system.Models.RolSistema", b => + { + b.Navigation("RolesPermisos"); + + b.Navigation("RolesUsuario"); + }); + + modelBuilder.Entity("Rs_system.Models.Usuario", b => + { + b.Navigation("RolesUsuario"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/RS_system/Migrations/init_sql.sql b/RS_system/Migrations/init_sql.sql new file mode 100644 index 0000000..e69de29 diff --git a/RS_system/Migrations/sql_articulos.sql b/RS_system/Migrations/sql_articulos.sql new file mode 100644 index 0000000..a5acf61 --- /dev/null +++ b/RS_system/Migrations/sql_articulos.sql @@ -0,0 +1,67 @@ +-- Table: public.articulos + +CREATE TABLE IF NOT EXISTS public.articulos +( + id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), + codigo character varying(50) COLLATE pg_catalog."default" NOT NULL, + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(500) COLLATE pg_catalog."default", + marca character varying(100) COLLATE pg_catalog."default", + modelo character varying(100) COLLATE pg_catalog."default", + numero_serie character varying(100) COLLATE pg_catalog."default", + precio numeric(10,2) NOT NULL DEFAULT 0, + fecha_adquisicion date, + imagen_url text COLLATE pg_catalog."default", + categoria_id integer NOT NULL, + estado_id integer NOT NULL, + ubicacion_id integer NOT NULL, + activo boolean NOT NULL DEFAULT true, + eliminado boolean NOT NULL DEFAULT false, + creado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + actualizado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + creado_por character varying(100) COLLATE pg_catalog."default", + CONSTRAINT articulos_pkey PRIMARY KEY (id), + CONSTRAINT fk_articulos_categorias FOREIGN KEY (categoria_id) + REFERENCES public.categorias (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT, + CONSTRAINT fk_articulos_estados FOREIGN KEY (estado_id) + REFERENCES public.estados_articulos (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT, + CONSTRAINT fk_articulos_ubicaciones FOREIGN KEY (ubicacion_id) + REFERENCES public.ubicaciones (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.articulos + OWNER to postgres; + +-- Indexes + +CREATE UNIQUE INDEX IF NOT EXISTS ix_articulos_codigo + ON public.articulos USING btree + (codigo COLLATE pg_catalog."default" ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_articulos_nombre + ON public.articulos USING btree + (nombre COLLATE pg_catalog."default" ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_articulos_categoria_id + ON public.articulos USING btree + (categoria_id ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_articulos_estado_id + ON public.articulos USING btree + (estado_id ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_articulos_ubicacion_id + ON public.articulos USING btree + (ubicacion_id ASC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Migrations/sql_categorias.sql b/RS_system/Migrations/sql_categorias.sql new file mode 100644 index 0000000..867b70c --- /dev/null +++ b/RS_system/Migrations/sql_categorias.sql @@ -0,0 +1,27 @@ +-- Table: public.categorias + +CREATE TABLE IF NOT EXISTS public.categorias +( + id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(500) COLLATE pg_catalog."default", + activo boolean NOT NULL DEFAULT true, + eliminado boolean NOT NULL DEFAULT false, + creado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + actualizado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + creado_por character varying(100) COLLATE pg_catalog."default", + CONSTRAINT categorias_pkey PRIMARY KEY (id) +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.categorias + OWNER to postgres; + +-- Index: ix_categorias_nombre + +-- DROP INDEX IF EXISTS public.ix_categorias_nombre; + +CREATE INDEX IF NOT EXISTS ix_categorias_nombre + ON public.categorias USING btree + (nombre COLLATE pg_catalog."default" ASC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Migrations/sql_estados.sql b/RS_system/Migrations/sql_estados.sql new file mode 100644 index 0000000..dfa8678 --- /dev/null +++ b/RS_system/Migrations/sql_estados.sql @@ -0,0 +1,28 @@ +-- Table: public.estados_articulos + +CREATE TABLE IF NOT EXISTS public.estados_articulos +( + id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), + nombre character varying(50) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(200) COLLATE pg_catalog."default", + color character varying(20) COLLATE pg_catalog."default" DEFAULT 'secondary'::character varying, + activo boolean NOT NULL DEFAULT true, + eliminado boolean NOT NULL DEFAULT false, + creado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + actualizado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + creado_por character varying(100) COLLATE pg_catalog."default", + CONSTRAINT estados_articulos_pkey PRIMARY KEY (id) +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.estados_articulos + OWNER to postgres; + +-- Index: ix_estados_articulos_nombre + +-- DROP INDEX IF EXISTS public.ix_estados_articulos_nombre; + +CREATE INDEX IF NOT EXISTS ix_estados_articulos_nombre + ON public.estados_articulos USING btree + (nombre COLLATE pg_catalog."default" ASC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Migrations/sql_miembros.sql b/RS_system/Migrations/sql_miembros.sql new file mode 100644 index 0000000..f4042b3 --- /dev/null +++ b/RS_system/Migrations/sql_miembros.sql @@ -0,0 +1,52 @@ +-- ===================================================== +-- Script: Church Members Module Database Schema (Refactored) +-- Description: Creates tables for work groups and members linked to personas +-- ===================================================== + +-- Table: grupos_trabajo +CREATE TABLE IF NOT EXISTS public.grupos_trabajo +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + nombre character varying(100) NOT NULL, + descripcion text, + activo boolean NOT NULL DEFAULT true, + creado_en timestamp with time zone NOT NULL DEFAULT NOW(), + actualizado_en timestamp with time zone NOT NULL DEFAULT NOW(), + CONSTRAINT grupos_trabajo_pkey PRIMARY KEY (id) +); + +-- Table: miembros +-- Drop if exists to handle the schema change during development +DROP TABLE IF EXISTS public.miembros; + +CREATE TABLE IF NOT EXISTS public.miembros +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + persona_id bigint NOT NULL, + bautizado_espiritu_santo boolean NOT NULL DEFAULT false, + fecha_ingreso_congregacion date, + telefono_emergencia character varying(20), + grupo_trabajo_id bigint, + activo boolean NOT NULL DEFAULT true, + eliminado boolean NOT NULL DEFAULT false, + creado_en timestamp with time zone NOT NULL DEFAULT NOW(), + actualizado_en timestamp with time zone NOT NULL DEFAULT NOW(), + creado_por character varying(100), + CONSTRAINT miembros_pkey PRIMARY KEY (id), + CONSTRAINT fk_miembros_persona FOREIGN KEY (persona_id) + REFERENCES public.personas (id), + CONSTRAINT fk_miembros_grupo_trabajo FOREIGN KEY (grupo_trabajo_id) + REFERENCES public.grupos_trabajo (id) +); + +-- Indexes for performance +CREATE INDEX IF NOT EXISTS idx_miembros_persona ON public.miembros(persona_id); +CREATE INDEX IF NOT EXISTS idx_miembros_grupo_trabajo ON public.miembros(grupo_trabajo_id); +CREATE INDEX IF NOT EXISTS idx_miembros_activo ON public.miembros(activo, eliminado); + +-- Initial work groups data +INSERT INTO public.grupos_trabajo (nombre, descripcion) VALUES +('Concilio Misionero Femenil', 'Grupo de trabajo de mujeres misioneras'), +('Fraternidad de Varones', 'Grupo de trabajo de varones de la iglesia'), +('Embajadores de Cristo', 'Grupo de jóvenes embajadores') +ON CONFLICT DO NOTHING; diff --git a/RS_system/Migrations/sql_movimientos.sql b/RS_system/Migrations/sql_movimientos.sql new file mode 100644 index 0000000..8f29b44 --- /dev/null +++ b/RS_system/Migrations/sql_movimientos.sql @@ -0,0 +1,52 @@ +-- Table: public.movimientos_inventario + +CREATE TABLE IF NOT EXISTS public.movimientos_inventario +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), + articulo_id integer NOT NULL, + tipo_movimiento character varying(50) COLLATE pg_catalog."default" NOT NULL, + fecha timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + ubicacion_origen_id integer, + ubicacion_destino_id integer, + estado_anterior_id integer, + estado_nuevo_id integer, + observacion character varying(500) COLLATE pg_catalog."default", + usuario_id character varying(100) COLLATE pg_catalog."default", + CONSTRAINT movimientos_inventario_pkey PRIMARY KEY (id), + CONSTRAINT fk_movimientos_articulos FOREIGN KEY (articulo_id) + REFERENCES public.articulos (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE CASCADE, + CONSTRAINT fk_movimientos_origen FOREIGN KEY (ubicacion_origen_id) + REFERENCES public.ubicaciones (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE SET NULL, + CONSTRAINT fk_movimientos_destino FOREIGN KEY (ubicacion_destino_id) + REFERENCES public.ubicaciones (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE SET NULL, + CONSTRAINT fk_movimientos_estado_ant FOREIGN KEY (estado_anterior_id) + REFERENCES public.estados_articulos (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE SET NULL, + CONSTRAINT fk_movimientos_estado_new FOREIGN KEY (estado_nuevo_id) + REFERENCES public.estados_articulos (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE SET NULL +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.movimientos_inventario + OWNER to postgres; + +-- Indexes + +CREATE INDEX IF NOT EXISTS ix_movimientos_articulo_id + ON public.movimientos_inventario USING btree + (articulo_id ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_movimientos_fecha + ON public.movimientos_inventario USING btree + (fecha DESC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Migrations/sql_ofrendas.sql b/RS_system/Migrations/sql_ofrendas.sql new file mode 100644 index 0000000..98d7792 --- /dev/null +++ b/RS_system/Migrations/sql_ofrendas.sql @@ -0,0 +1,106 @@ +-- ============================================= +-- Módulo de Ofrendas - Script SQL +-- ============================================= + +-- Tabla: registros_culto +-- Almacena los registros de ofrendas por culto +CREATE TABLE IF NOT EXISTS public.registros_culto +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), + fecha date NOT NULL, + observaciones character varying(500) COLLATE pg_catalog."default", + creado_por character varying(100) COLLATE pg_catalog."default", + creado_en timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + actualizado_en timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + eliminado boolean NOT NULL DEFAULT false, + CONSTRAINT registros_culto_pkey PRIMARY KEY (id) +); + +COMMENT ON TABLE public.registros_culto IS 'Registros de ofrendas por culto'; + +-- Índice para búsqueda por fecha +CREATE INDEX IF NOT EXISTS idx_registros_culto_fecha ON public.registros_culto(fecha); +CREATE INDEX IF NOT EXISTS idx_registros_culto_eliminado ON public.registros_culto(eliminado); + +-- ============================================= + +-- Tabla: ofrendas +-- Almacena las ofrendas individuales de cada registro +CREATE TABLE IF NOT EXISTS public.ofrendas +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), + registro_culto_id bigint NOT NULL, + monto numeric(10,2) NOT NULL CHECK (monto > 0), + concepto character varying(200) COLLATE pg_catalog."default" NOT NULL, + eliminado boolean NOT NULL DEFAULT false, + CONSTRAINT ofrendas_pkey PRIMARY KEY (id), + CONSTRAINT fk_ofrendas_registro_culto FOREIGN KEY (registro_culto_id) + REFERENCES public.registros_culto (id) MATCH SIMPLE + ON UPDATE CASCADE + ON DELETE CASCADE +); + +COMMENT ON TABLE public.ofrendas IS 'Ofrendas individuales de cada registro de culto'; + +-- Índices +CREATE INDEX IF NOT EXISTS idx_ofrendas_registro_culto_id ON public.ofrendas(registro_culto_id); +CREATE INDEX IF NOT EXISTS idx_ofrendas_eliminado ON public.ofrendas(eliminado); + +-- ============================================= + +-- Tabla: descuentos_ofrenda +-- Almacena los descuentos aplicados a cada ofrenda +CREATE TABLE IF NOT EXISTS public.descuentos_ofrenda +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), + ofrenda_id bigint NOT NULL, + monto numeric(10,2) NOT NULL CHECK (monto > 0), + concepto character varying(200) COLLATE pg_catalog."default" NOT NULL, + eliminado boolean NOT NULL DEFAULT false, + CONSTRAINT descuentos_ofrenda_pkey PRIMARY KEY (id), + CONSTRAINT fk_descuentos_ofrenda_ofrenda FOREIGN KEY (ofrenda_id) + REFERENCES public.ofrendas (id) MATCH SIMPLE + ON UPDATE CASCADE + ON DELETE CASCADE +); + +COMMENT ON TABLE public.descuentos_ofrenda IS 'Descuentos aplicados a las ofrendas (diezmo, asignaciones, etc.)'; + +-- Índices +CREATE INDEX IF NOT EXISTS idx_descuentos_ofrenda_ofrenda_id ON public.descuentos_ofrenda(ofrenda_id); +CREATE INDEX IF NOT EXISTS idx_descuentos_ofrenda_eliminado ON public.descuentos_ofrenda(eliminado); + +-- ============================================= +-- Permisos para el módulo +-- ============================================= + +-- Primero crear el módulo si no existe +INSERT INTO public.modulos (nombre, descripcion, icono, orden, activo) +SELECT 'Secretaría', 'Módulo de secretaría de la iglesia', 'bi bi-journal-bookmark', 40, true +WHERE NOT EXISTS (SELECT 1 FROM public.modulos WHERE nombre = 'Secretaría'); + +-- Crear permisos para el controlador Ofrenda +INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo) +SELECT 'Ofrenda.Index', 'Ver Ofrendas', 'Permite ver el listado de registros de ofrendas', + (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true +WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Index'); + +INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo) +SELECT 'Ofrenda.Create', 'Crear Ofrenda', 'Permite crear nuevos registros de ofrendas', + (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true +WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Create'); + +INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo) +SELECT 'Ofrenda.Edit', 'Editar Ofrenda', 'Permite editar registros de ofrendas', + (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true +WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Edit'); + +INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo) +SELECT 'Ofrenda.Delete', 'Eliminar Ofrenda', 'Permite eliminar registros de ofrendas', + (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true +WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Delete'); + +INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo) +SELECT 'Ofrenda.Details', 'Ver Detalle Ofrenda', 'Permite ver el detalle de un registro de ofrendas', + (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true +WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Details'); diff --git a/RS_system/Migrations/sql_ubicaciones.sql b/RS_system/Migrations/sql_ubicaciones.sql new file mode 100644 index 0000000..870d4b9 --- /dev/null +++ b/RS_system/Migrations/sql_ubicaciones.sql @@ -0,0 +1,28 @@ +-- Table: public.ubicaciones + +CREATE TABLE IF NOT EXISTS public.ubicaciones +( + id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(200) COLLATE pg_catalog."default", + responsable character varying(100) COLLATE pg_catalog."default", + activo boolean NOT NULL DEFAULT true, + eliminado boolean NOT NULL DEFAULT false, + creado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + actualizado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + creado_por character varying(100) COLLATE pg_catalog."default", + CONSTRAINT ubicaciones_pkey PRIMARY KEY (id) +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.ubicaciones + OWNER to postgres; + +-- Index: ix_ubicaciones_nombre + +-- DROP INDEX IF EXISTS public.ix_ubicaciones_nombre; + +CREATE INDEX IF NOT EXISTS ix_ubicaciones_nombre + ON public.ubicaciones USING btree + (nombre COLLATE pg_catalog."default" ASC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Migrations/sql_upgrade_lotes.sql b/RS_system/Migrations/sql_upgrade_lotes.sql new file mode 100644 index 0000000..029d2c0 --- /dev/null +++ b/RS_system/Migrations/sql_upgrade_lotes.sql @@ -0,0 +1,45 @@ +-- Add columns to articulos +ALTER TABLE public.articulos + ADD COLUMN IF NOT EXISTS tipo_control character varying(50) NOT NULL DEFAULT 'UNITARIO'; + +ALTER TABLE public.articulos + ADD COLUMN IF NOT EXISTS cantidad_global integer NOT NULL DEFAULT 1; + +-- Add columns to movimientos_inventario +ALTER TABLE public.movimientos_inventario + ADD COLUMN IF NOT EXISTS cantidad integer NOT NULL DEFAULT 1; + +-- Create existencias table +CREATE TABLE IF NOT EXISTS public.existencias +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), + articulo_id integer NOT NULL, + ubicacion_id integer NOT NULL, + cantidad integer NOT NULL DEFAULT 0, + actualizado_en timestamp without time zone NOT NULL DEFAULT (now() AT TIME ZONE 'utc'::text), + CONSTRAINT existencias_pkey PRIMARY KEY (id), + CONSTRAINT fk_existencias_articulo FOREIGN KEY (articulo_id) + REFERENCES public.articulos (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE CASCADE, + CONSTRAINT fk_existencias_ubicacion FOREIGN KEY (ubicacion_id) + REFERENCES public.ubicaciones (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE CASCADE, + CONSTRAINT uq_existencias_articulo_ubicacion UNIQUE (articulo_id, ubicacion_id) +) +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public.existencias + OWNER to postgres; + +-- Index for existencias +CREATE INDEX IF NOT EXISTS ix_existencias_articulo_id + ON public.existencias USING btree + (articulo_id ASC NULLS LAST) + TABLESPACE pg_default; + +CREATE INDEX IF NOT EXISTS ix_existencias_ubicacion_id + ON public.existencias USING btree + (ubicacion_id ASC NULLS LAST) + TABLESPACE pg_default; diff --git a/RS_system/Models/Articulo.cs b/RS_system/Models/Articulo.cs new file mode 100644 index 0000000..f61199f --- /dev/null +++ b/RS_system/Models/Articulo.cs @@ -0,0 +1,101 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("articulos")] +public class Articulo +{ + public enum TipoControlInventario + { + UNITARIO, // 1 record = 1 physical item (Laptop, Projector) + LOTE // 1 record = N items (Chairs, Cables) + } + + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("tipo_control")] + [Required] + public string TipoControl { get; set; } = nameof(TipoControlInventario.UNITARIO); + + [Column("cantidad_global")] + public int CantidadGlobal { get; set; } = 1; // Cache/Total for LOTE. Always 1 for UNITARIO. + + [Column("codigo")] + [Required(ErrorMessage = "El código es obligatorio")] + [StringLength(50, ErrorMessage = "El código no puede exceder los 50 caracteres")] + public string Codigo { get; set; } = string.Empty; + + [Column("nombre")] + [Required(ErrorMessage = "El nombre es obligatorio")] + [StringLength(100, ErrorMessage = "El nombre no puede exceder los 100 caracteres")] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(500, ErrorMessage = "La descripción no puede exceder los 500 caracteres")] + public string? Descripcion { get; set; } + + [Column("marca")] + [StringLength(100)] + public string? Marca { get; set; } + + [Column("modelo")] + [StringLength(100)] + public string? Modelo { get; set; } + + [Column("numero_serie")] + [StringLength(100)] + public string? NumeroSerie { get; set; } + + [Column("precio")] + [Range(0, 99999999.99)] + public decimal Precio { get; set; } = 0; + + [Column("fecha_adquisicion")] + public DateOnly? FechaAdquisicion { get; set; } + + [Column("imagen_url")] + public string? ImagenUrl { get; set; } + + // Foreign Keys + + [Column("categoria_id")] + public int CategoriaId { get; set; } + + [Column("estado_id")] + public int EstadoId { get; set; } + + [Column("ubicacion_id")] + public int UbicacionId { get; set; } + + // Audit & Control + + [Column("activo")] + public bool Activo { get; set; } = true; + + [Column("eliminado")] + public bool Eliminado { get; set; } = false; + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + [Column("creado_por")] + [StringLength(100)] + public string? CreadoPor { get; set; } + + // Navigation Properties + + [ForeignKey("CategoriaId")] + public virtual Categoria? Categoria { get; set; } + + [ForeignKey("EstadoId")] + public virtual EstadoArticulo? Estado { get; set; } + + [ForeignKey("UbicacionId")] + public virtual Ubicacion? Ubicacion { get; set; } +} diff --git a/RS_system/Models/Categoria.cs b/RS_system/Models/Categoria.cs new file mode 100644 index 0000000..aa214b0 --- /dev/null +++ b/RS_system/Models/Categoria.cs @@ -0,0 +1,37 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("categorias")] +public class Categoria +{ + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("nombre")] + [Required(ErrorMessage = "El nombre es obligatorio")] + [StringLength(100, ErrorMessage = "El nombre no puede exceder los 100 caracteres")] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(500, ErrorMessage = "La descripción no puede exceder los 500 caracteres")] + public string? Descripcion { get; set; } + + [Column("activo")] + public bool Activo { get; set; } = true; + + [Column("eliminado")] + public bool Eliminado { get; set; } = false; + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + [Column("creado_por")] + [StringLength(100)] + public string? CreadoPor { get; set; } +} diff --git a/RS_system/Models/CategoriaEgreso.cs b/RS_system/Models/CategoriaEgreso.cs new file mode 100644 index 0000000..f013a67 --- /dev/null +++ b/RS_system/Models/CategoriaEgreso.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("categorias_egreso")] +public class CategoriaEgreso +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("nombre")] + [Required] + [StringLength(100)] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(255)] + public string? Descripcion { get; set; } + + [Column("activa")] + public bool Activa { get; set; } = true; + + [Column("fecha_creacion")] + public DateTime FechaCreacion { get; set; } = DateTime.UtcNow; + + // Navigation property + public virtual ICollection Movimientos { get; set; } = new List(); +} diff --git a/RS_system/Models/CategoriaIngreso.cs b/RS_system/Models/CategoriaIngreso.cs new file mode 100644 index 0000000..efd14f3 --- /dev/null +++ b/RS_system/Models/CategoriaIngreso.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("categorias_ingreso")] +public class CategoriaIngreso +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("nombre")] + [Required] + [StringLength(100)] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(255)] + public string? Descripcion { get; set; } + + [Column("activa")] + public bool Activa { get; set; } = true; + + [Column("fecha_creacion")] + public DateTime FechaCreacion { get; set; } = DateTime.UtcNow; + + // Navigation property + public virtual ICollection Movimientos { get; set; } = new List(); +} diff --git a/RS_system/Models/Colaboracion.cs b/RS_system/Models/Colaboracion.cs new file mode 100644 index 0000000..0fe8efd --- /dev/null +++ b/RS_system/Models/Colaboracion.cs @@ -0,0 +1,42 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("colaboraciones", Schema = "public")] +public class Colaboracion +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Required] + [Column("miembro_id")] + public long MiembroId { get; set; } + + [Column("fecha_registro")] + public DateTime FechaRegistro { get; set; } = DateTime.UtcNow; + + [Required] + [Column("monto_total")] + public decimal MontoTotal { get; set; } + + [Column("observaciones")] + public string? Observaciones { get; set; } + + [MaxLength(100)] + [Column("registrado_por")] + public string? RegistradoPor { get; set; } + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + // Navigation properties + [ForeignKey("MiembroId")] + public Miembro Miembro { get; set; } = null!; + + public ICollection Detalles { get; set; } = new List(); +} diff --git a/RS_system/Models/ContabilidadRegistro.cs b/RS_system/Models/ContabilidadRegistro.cs new file mode 100644 index 0000000..73ef9f5 --- /dev/null +++ b/RS_system/Models/ContabilidadRegistro.cs @@ -0,0 +1,49 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +public enum TipoMovimientoContable +{ + Ingreso, + Egreso +} + +[Table("contabilidad_registros")] +public class ContabilidadRegistro +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("reporte_mensual_id")] + public long? ReporteMensualId { get; set; } + + [ForeignKey("ReporteMensualId")] + public virtual ReporteMensualContable? ReporteMensual { get; set; } + + [Column("grupo_trabajo_id")] + [Required] + public long GrupoTrabajoId { get; set; } + + [ForeignKey("GrupoTrabajoId")] + public virtual GrupoTrabajo GrupoTrabajo { get; set; } + + [Column("tipo")] + [Required] + public TipoMovimientoContable Tipo { get; set; } + + [Column("monto", TypeName = "decimal(18,2)")] + [Required] + public decimal Monto { get; set; } + + + [Column("fecha")] + [Required] + public DateTime Fecha { get; set; } + + [Column("descripcion")] + [StringLength(200)] + public string Descripcion { get; set; } = string.Empty; +} + diff --git a/RS_system/Models/DetalleColaboracion.cs b/RS_system/Models/DetalleColaboracion.cs new file mode 100644 index 0000000..8837578 --- /dev/null +++ b/RS_system/Models/DetalleColaboracion.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("detalle_colaboraciones", Schema = "public")] +public class DetalleColaboracion +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Required] + [Column("colaboracion_id")] + public long ColaboracionId { get; set; } + + [Required] + [Column("tipo_colaboracion_id")] + public long TipoColaboracionId { get; set; } + + [Required] + [Range(1, 12)] + [Column("mes")] + public int Mes { get; set; } + + [Required] + [Range(2000, 2100)] + [Column("anio")] + public int Anio { get; set; } + + [Required] + [Column("monto")] + public decimal Monto { get; set; } + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + // Navigation properties + [ForeignKey("ColaboracionId")] + public Colaboracion Colaboracion { get; set; } = null!; + + [ForeignKey("TipoColaboracionId")] + public TipoColaboracion TipoColaboracion { get; set; } = null!; +} diff --git a/RS_system/Models/EstadoArticulo.cs b/RS_system/Models/EstadoArticulo.cs new file mode 100644 index 0000000..29f018a --- /dev/null +++ b/RS_system/Models/EstadoArticulo.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("estados_articulos")] +public class EstadoArticulo +{ + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("nombre")] + [Required(ErrorMessage = "El nombre es obligatorio")] + [StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres")] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(200, ErrorMessage = "La descripción no puede exceder los 200 caracteres")] + public string? Descripcion { get; set; } + + [Column("color")] + [StringLength(20)] + public string? Color { get; set; } = "secondary"; // success, warning, danger, info, primary, secondary + + [Column("activo")] + public bool Activo { get; set; } = true; + + [Column("eliminado")] + public bool Eliminado { get; set; } = false; + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + [Column("creado_por")] + [StringLength(100)] + public string? CreadoPor { get; set; } +} diff --git a/RS_system/Models/Existencia.cs b/RS_system/Models/Existencia.cs new file mode 100644 index 0000000..91a23e6 --- /dev/null +++ b/RS_system/Models/Existencia.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("existencias")] +public class Existencia +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("articulo_id")] + public int ArticuloId { get; set; } + + [Column("ubicacion_id")] + public int UbicacionId { get; set; } + + [Column("cantidad")] + public int Cantidad { get; set; } = 0; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + // Navigation + [ForeignKey("ArticuloId")] + public virtual Articulo? Articulo { get; set; } + + [ForeignKey("UbicacionId")] + public virtual Ubicacion? Ubicacion { get; set; } +} diff --git a/RS_system/Models/MovimientoGeneral.cs b/RS_system/Models/MovimientoGeneral.cs new file mode 100644 index 0000000..0c71730 --- /dev/null +++ b/RS_system/Models/MovimientoGeneral.cs @@ -0,0 +1,59 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +public enum TipoMovimientoGeneral +{ + Ingreso = 1, + Egreso = 2 +} + +[Table("movimientos_generales")] +public class MovimientoGeneral +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("reporte_mensual_general_id")] + public long? ReporteMensualGeneralId { get; set; } + + [ForeignKey("ReporteMensualGeneralId")] + public virtual ReporteMensualGeneral? ReporteMensualGeneral { get; set; } + + [Column("tipo")] + [Required] + public int Tipo { get; set; } + + [Column("categoria_ingreso_id")] + public long? CategoriaIngresoId { get; set; } + + [ForeignKey("CategoriaIngresoId")] + public virtual CategoriaIngreso? CategoriaIngreso { get; set; } + + [Column("categoria_egreso_id")] + public long? CategoriaEgresoId { get; set; } + + [ForeignKey("CategoriaEgresoId")] + public virtual CategoriaEgreso? CategoriaEgreso { get; set; } + + [Column("monto", TypeName = "decimal(18,2)")] + [Required] + public decimal Monto { get; set; } + + [Column("fecha")] + [Required] + public DateTime Fecha { get; set; } + + [Column("descripcion")] + [StringLength(200)] + public string Descripcion { get; set; } = string.Empty; + + [Column("numero_comprobante")] + [StringLength(50)] + public string? NumeroComprobante { get; set; } + + // Navigation property + public virtual ICollection Adjuntos { get; set; } = new List(); +} diff --git a/RS_system/Models/MovimientoGeneralAdjunto.cs b/RS_system/Models/MovimientoGeneralAdjunto.cs new file mode 100644 index 0000000..7ea46e2 --- /dev/null +++ b/RS_system/Models/MovimientoGeneralAdjunto.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("movimientos_generales_adjuntos")] +public class MovimientoGeneralAdjunto +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("movimiento_general_id")] + [Required] + public long MovimientoGeneralId { get; set; } + + [ForeignKey("MovimientoGeneralId")] + public virtual MovimientoGeneral MovimientoGeneral { get; set; } + + [Column("nombre_archivo")] + [Required] + [StringLength(255)] + public string NombreArchivo { get; set; } = string.Empty; + + [Column("ruta_archivo")] + [Required] + [StringLength(500)] + public string RutaArchivo { get; set; } = string.Empty; + + [Column("tipo_contenido")] + [StringLength(100)] + public string? TipoContenido { get; set; } + + [Column("fecha_subida")] + public DateTime FechaSubida { get; set; } = DateTime.UtcNow; +} diff --git a/RS_system/Models/MovimientoInventario.cs b/RS_system/Models/MovimientoInventario.cs new file mode 100644 index 0000000..3cd0b81 --- /dev/null +++ b/RS_system/Models/MovimientoInventario.cs @@ -0,0 +1,80 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +public enum TipoMovimiento +{ + ENTRADA, // Nueva adquisición (aunque se crea al crear art, podría usarse para reingresos) + SALIDA, // Salida temporal + TRASLADO, // Cambio de ubicación + BAJA, // Retiro permanente (daño, robo, venta) + REPARACION, // Envío a taller + AJUSTE, // Corrección de inventario + CAMBIO_ESTADO, // Cambio de condición física + PRESTAMO, // Préstamo a persona + DEVOLUCION +} + +[Table("movimientos_inventario")] +public class MovimientoInventario +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("articulo_id")] + [Required] + public int ArticuloId { get; set; } + + [Column("tipo_movimiento")] + [Required] + public string TipoMovimiento { get; set; } = string.Empty; + + [Column("cantidad")] + public int Cantidad { get; set; } = 1; // Default 1 for UNITARIO + + [Column("fecha")] + public DateTime Fecha { get; set; } = DateTime.UtcNow; + + // Ubicaciones + [Column("ubicacion_origen_id")] + public int? UbicacionOrigenId { get; set; } + + [Column("ubicacion_destino_id")] + public int? UbicacionDestinoId { get; set; } + + // Estados + [Column("estado_anterior_id")] + public int? EstadoAnteriorId { get; set; } + + [Column("estado_nuevo_id")] + public int? EstadoNuevoId { get; set; } + + [Column("TipMov")] + public int? TipMov { get; set; } + + [Column("observacion")] + [StringLength(500)] + public string? Observacion { get; set; } + + [Column("usuario_id")] + [StringLength(100)] + public string? UsuarioId { get; set; } // Username or User ID + + // Navigation Properties + [ForeignKey("ArticuloId")] + public virtual Articulo? Articulo { get; set; } + + [ForeignKey("UbicacionOrigenId")] + public virtual Ubicacion? UbicacionOrigen { get; set; } + + [ForeignKey("UbicacionDestinoId")] + public virtual Ubicacion? UbicacionDestino { get; set; } + + [ForeignKey("EstadoAnteriorId")] + public virtual EstadoArticulo? EstadoAnterior { get; set; } + + [ForeignKey("EstadoNuevoId")] + public virtual EstadoArticulo? EstadoNuevo { get; set; } +} diff --git a/RS_system/Models/Prestamo.cs b/RS_system/Models/Prestamo.cs new file mode 100644 index 0000000..7f569d2 --- /dev/null +++ b/RS_system/Models/Prestamo.cs @@ -0,0 +1,89 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("prestamos")] +public class Prestamo +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("articulo_id")] + [Required] + public int ArticuloId { get; set; } + + [Column("cantidad")] + [Required] + public int Cantidad { get; set; } + + [Column("persona_nombre")] + [Required] + [StringLength(200)] + public string PersonaNombre { get; set; } = string.Empty; + + [Column("persona_identificacion")] + [StringLength(50)] + public string? PersonaIdentificacion { get; set; } + + [Column("fecha_prestamo")] + public DateTime FechaPrestamo { get; set; } = DateTime.UtcNow; + + [Column("fecha_devolucion_estimada")] + public DateTime? FechaDevolucionEstimada { get; set; } + + [Column("fecha_devolucion_real")] + public DateTime? FechaDevolucionReal { get; set; } + + [Column("estado")] + [Required] + public string Estado { get; set; } = "ACTIVO"; // ACTIVO, DEVUELTO, ATRASADO + + [Column("observacion")] + [StringLength(500)] + public string? Observacion { get; set; } + + [Column("usuario_id")] + [StringLength(100)] + public string? UsuarioId { get; set; } + + // Navigation Properties + [ForeignKey("ArticuloId")] + public virtual Articulo? Articulo { get; set; } + + // Navigation Property for detailed items + public virtual ICollection Detalles { get; set; } = new List(); +} + +[Table("prestamo_detalles")] +public class PrestamoDetalle +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("prestamo_id")] + [Required] + public long PrestamoId { get; set; } + + [Column("codigo_articulo_individual")] + [Required] + [StringLength(100)] + public string CodigoArticuloIndividual { get; set; } = string.Empty; + + [Column("estado")] + [Required] + public string Estado { get; set; } = "PRESTADO"; // PRESTADO, DEVUELTO + + [Column("fecha_devolucion")] + public DateTime? FechaDevolucion { get; set; } + + [Column("observacion")] + [StringLength(300)] + public string? Observacion { get; set; } + + // Navigation Properties + [ForeignKey("PrestamoId")] + public virtual Prestamo? Prestamo { get; set; } +} \ No newline at end of file diff --git a/RS_system/Models/ReporteMensualContable.cs b/RS_system/Models/ReporteMensualContable.cs new file mode 100644 index 0000000..3d38885 --- /dev/null +++ b/RS_system/Models/ReporteMensualContable.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("reportes_mensuales_contables")] +public class ReporteMensualContable +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("grupo_trabajo_id")] + [Required] + public long GrupoTrabajoId { get; set; } + + [ForeignKey("GrupoTrabajoId")] + public virtual GrupoTrabajo GrupoTrabajo { get; set; } + + [Column("mes")] + [Required] + public int Mes { get; set; } + + [Column("anio")] + [Required] + public int Anio { get; set; } + + [Column("saldo_inicial", TypeName = "decimal(18,2)")] + public decimal SaldoInicial { get; set; } + + + [Column("fecha_creacion")] + public DateTime FechaCreacion { get; set; } = DateTime.UtcNow; + + [Column("cerrado")] + public bool Cerrado { get; set; } = false; + + // Navigation property for details + public virtual ICollection Registros { get; set; } = new List(); + + // Helper properties for display + [NotMapped] + public string NombreMes => new DateTime(Anio, Mes, 1).ToString("MMMM", new System.Globalization.CultureInfo("es-ES")); +} diff --git a/RS_system/Models/ReporteMensualGeneral.cs b/RS_system/Models/ReporteMensualGeneral.cs new file mode 100644 index 0000000..4aaa092 --- /dev/null +++ b/RS_system/Models/ReporteMensualGeneral.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("reportes_mensuales_generales")] +public class ReporteMensualGeneral +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Column("mes")] + [Required] + public int Mes { get; set; } + + [Column("anio")] + [Required] + public int Anio { get; set; } + + [Column("saldo_inicial", TypeName = "decimal(18,2)")] + public decimal SaldoInicial { get; set; } + + [Column("fecha_creacion")] + public DateTime FechaCreacion { get; set; } = DateTime.UtcNow; + + [Column("cerrado")] + public bool Cerrado { get; set; } = false; + + // Navigation property for details + public virtual ICollection Movimientos { get; set; } = new List(); + + // Helper properties for display + [NotMapped] + public string NombreMes => new DateTime(Anio, Mes, 1).ToString("MMMM", new System.Globalization.CultureInfo("es-ES")); +} diff --git a/RS_system/Models/TipoColaboracion.cs b/RS_system/Models/TipoColaboracion.cs new file mode 100644 index 0000000..83867d4 --- /dev/null +++ b/RS_system/Models/TipoColaboracion.cs @@ -0,0 +1,39 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("tipos_colaboracion", Schema = "public")] +public class TipoColaboracion +{ + [Key] + [Column("id")] + public long Id { get; set; } + + [Required] + [MaxLength(100)] + [Column("nombre")] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + public string? Descripcion { get; set; } + + [Column("monto_sugerido")] + [Required] + public decimal MontoSugerido { get; set; } + + [Column("activo")] + public bool Activo { get; set; } = true; + + [Column("orden")] + public int Orden { get; set; } + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + // Navigation properties + public ICollection Detalles { get; set; } = new List(); +} diff --git a/RS_system/Models/Ubicacion.cs b/RS_system/Models/Ubicacion.cs new file mode 100644 index 0000000..e062cea --- /dev/null +++ b/RS_system/Models/Ubicacion.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Rs_system.Models; + +[Table("ubicaciones")] +public class Ubicacion +{ + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("nombre")] + [Required(ErrorMessage = "El nombre es obligatorio")] + [StringLength(100, ErrorMessage = "El nombre no puede exceder los 100 caracteres")] + public string Nombre { get; set; } = string.Empty; + + [Column("descripcion")] + [StringLength(200, ErrorMessage = "La descripción no puede exceder los 200 caracteres")] + public string? Descripcion { get; set; } + + [Column("responsable")] + [StringLength(100, ErrorMessage = "El nombre del responsable no puede exceder los 100 caracteres")] + public string? Responsable { get; set; } + + [Column("activo")] + public bool Activo { get; set; } = true; + + [Column("eliminado")] + public bool Eliminado { get; set; } = false; + + [Column("creado_en")] + public DateTime CreadoEn { get; set; } = DateTime.UtcNow; + + [Column("actualizado_en")] + public DateTime ActualizadoEn { get; set; } = DateTime.UtcNow; + + [Column("creado_por")] + [StringLength(100)] + public string? CreadoPor { get; set; } +} diff --git a/RS_system/Models/ViewModels/ArticuloViewModel.cs b/RS_system/Models/ViewModels/ArticuloViewModel.cs new file mode 100644 index 0000000..f5745f9 --- /dev/null +++ b/RS_system/Models/ViewModels/ArticuloViewModel.cs @@ -0,0 +1,68 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Http; +using Rs_system.Models; + +namespace Rs_system.Models.ViewModels; + +public class ArticuloViewModel +{ + public int Id { get; set; } + + [Required(ErrorMessage = "El código es obligatorio")] + [StringLength(50, ErrorMessage = "El código no puede exceder los 50 caracteres")] + public string Codigo { get; set; } = string.Empty; + + [Required(ErrorMessage = "El nombre es obligatorio")] + [StringLength(100, ErrorMessage = "El nombre no puede exceder los 100 caracteres")] + public string Nombre { get; set; } = string.Empty; + + [StringLength(500, ErrorMessage = "La descripción no puede exceder los 500 caracteres")] + public string? Descripcion { get; set; } + + [StringLength(100)] + public string? Marca { get; set; } + + [StringLength(100)] + public string? Modelo { get; set; } + + [Display(Name = "Número de Serie")] + [StringLength(100)] + public string? NumeroSerie { get; set; } + + [Range(0, 99999999.99)] + public decimal Precio { get; set; } = 0; + + [Display(Name = "Fecha de Adquisición")] + public DateOnly? FechaAdquisicion { get; set; } + + public string? ImagenUrl { get; set; } + + [Display(Name = "Imagen")] + public IFormFile? ImagenFile { get; set; } + + [Display(Name = "Tipo de Control")] + public string? TipoControl { get; set; } = "UNITARIO"; // Default for View + + [Display(Name = "Cantidad Inicial")] + [Range(1, 100000)] + public int CantidadInicial { get; set; } = 1; + + public int CategoriaId { get; set; } + + [Display(Name = "Estado")] + [Required(ErrorMessage = "El estado es obligatorio")] + public int EstadoId { get; set; } + + [Display(Name = "Ubicación")] + [Required(ErrorMessage = "La ubicación es obligatoria")] + public int UbicacionId { get; set; } + + public bool Activo { get; set; } = true; + + // Display properties for lists/details + public string? CategoriaNombre { get; set; } + public string? EstadoNombre { get; set; } + public string? EstadoColor { get; set; } + public string? UbicacionNombre { get; set; } + public int CantidadGlobal { get; set; } +} diff --git a/RS_system/Models/ViewModels/EstadoCuentaViewModel.cs b/RS_system/Models/ViewModels/EstadoCuentaViewModel.cs new file mode 100644 index 0000000..9fa9d3c --- /dev/null +++ b/RS_system/Models/ViewModels/EstadoCuentaViewModel.cs @@ -0,0 +1,41 @@ +namespace Rs_system.Models.ViewModels; + +public class EstadoCuentaViewModel +{ + public long MiembroId { get; set; } + public string NombreMiembro { get; set; } = string.Empty; + public DateTime FechaConsulta { get; set; } + + public List HistorialPorTipos { get; set; } = new(); + public decimal TotalAportado { get; set; } +} + +public class HistorialPorTipo +{ + public string TipoNombre { get; set; } = string.Empty; + public List Registros { get; set; } = new(); + public decimal TotalTipo { get; set; } +} + +public class RegistroMensual +{ + public int Mes { get; set; } + public int Anio { get; set; } + public decimal Monto { get; set; } + public DateTime FechaRegistro { get; set; } + + public string MesTexto => ObtenerMesTexto(); + + private string ObtenerMesTexto() + { + try + { + var fecha = new DateTime(Anio, Mes, 1); + return fecha.ToString("MMMM yyyy", new System.Globalization.CultureInfo("es-ES")); + } + catch + { + return $"{Mes}/{Anio}"; + } + } +} diff --git a/RS_system/Models/ViewModels/RegistrarColaboracionViewModel.cs b/RS_system/Models/ViewModels/RegistrarColaboracionViewModel.cs new file mode 100644 index 0000000..29ab082 --- /dev/null +++ b/RS_system/Models/ViewModels/RegistrarColaboracionViewModel.cs @@ -0,0 +1,87 @@ +using System.ComponentModel.DataAnnotations; +using Rs_system.Models; + +namespace Rs_system.Models.ViewModels; + +public class RegistrarColaboracionViewModel +{ + [Required(ErrorMessage = "Debe seleccionar un miembro")] + public long MiembroId { get; set; } + + [Display(Name = "Mes Inicial")] + [Required(ErrorMessage = "Debe seleccionar el mes inicial")] + [Range(1, 12, ErrorMessage = "Mes debe estar entre 1 y 12")] + public int MesInicial { get; set; } + + [Display(Name = "Año Inicial")] + [Required(ErrorMessage = "Debe seleccionar el año inicial")] + [Range(2000, 2100, ErrorMessage = "Año debe estar entre 2000 y 2100")] + public int AnioInicial { get; set; } + + [Display(Name = "Mes Final")] + [Required(ErrorMessage = "Debe seleccionar el mes final")] + [Range(1, 12, ErrorMessage = "Mes debe estar entre 1 y 12")] + public int MesFinal { get; set; } + + [Display(Name = "Año Final")] + [Required(ErrorMessage = "Debe seleccionar el año final")] + [Range(2000, 2100, ErrorMessage = "Año debe estar entre 2000 y 2100")] + public int AnioFinal { get; set; } + + [Required(ErrorMessage = "Debe seleccionar al menos un tipo de colaboración")] + public List TiposSeleccionados { get; set; } = new(); + + [Required(ErrorMessage = "Debe ingresar el monto total")] + [Range(0.01, 999999.99, ErrorMessage = "El monto total debe ser mayor a 0")] + [Display(Name = "Monto Total Entregado")] + public decimal MontoTotal { get; set; } + + [Display(Name = "Tipo de Colaboración Prioritaria")] + public long? TipoPrioritario { get; set; } + + [MaxLength(500, ErrorMessage = "Las observaciones no pueden exceder 500 caracteres")] + [Display(Name = "Observaciones")] + public string? Observaciones { get; set; } + + // Para cargar en el formulario + public List TiposDisponibles { get; set; } = new(); + + // Propiedad calculada: Total de meses + public int TotalMeses + { + get + { + try + { + var fechaInicial = new DateTime(AnioInicial, MesInicial, 1); + var fechaFinal = new DateTime(AnioFinal, MesFinal, 1); + + if (fechaFinal < fechaInicial) + return 0; + + return ((AnioFinal - AnioInicial) * 12) + (MesFinal - MesInicial) + 1; + } + catch + { + return 0; + } + } + } + + // Propiedad calculada: Monto sugerido total basado en los tipos seleccionados + public decimal MontoSugeridoTotal + { + get + { + if (TiposDisponibles == null || !TiposSeleccionados.Any()) + return 0; + + var tiposSeleccionadosData = TiposDisponibles + .Where(t => TiposSeleccionados.Contains(t.Id)) + .ToList(); + + var montoSugeridoPorMes = tiposSeleccionadosData.Sum(t => t.MontoSugerido); + return montoSugeridoPorMes * TotalMeses; + } + } +} diff --git a/RS_system/Models/ViewModels/ReporteColaboracionesViewModel.cs b/RS_system/Models/ViewModels/ReporteColaboracionesViewModel.cs new file mode 100644 index 0000000..5dfae5e --- /dev/null +++ b/RS_system/Models/ViewModels/ReporteColaboracionesViewModel.cs @@ -0,0 +1,28 @@ +namespace Rs_system.Models.ViewModels; + +public class ReporteColaboracionesViewModel +{ + public DateTime FechaInicio { get; set; } + public DateTime FechaFin { get; set; } + public decimal TotalRecaudado { get; set; } + + public List DesglosePorTipos { get; set; } = new(); + public List Movimientos { get; set; } = new(); +} + +public class DesglosePorTipo +{ + public string TipoNombre { get; set; } = string.Empty; + public int CantidadMeses { get; set; } + public decimal TotalRecaudado { get; set; } +} + +public class DetalleMovimiento +{ + public long ColaboracionId { get; set; } + public DateTime Fecha { get; set; } + public string NombreMiembro { get; set; } = string.Empty; + public string TiposColaboracion { get; set; } = string.Empty; + public string PeriodoCubierto { get; set; } = string.Empty; + public decimal Monto { get; set; } +} diff --git a/RS_system/Models/ViewModels/UltimoPagoViewModel.cs b/RS_system/Models/ViewModels/UltimoPagoViewModel.cs new file mode 100644 index 0000000..09d2a85 --- /dev/null +++ b/RS_system/Models/ViewModels/UltimoPagoViewModel.cs @@ -0,0 +1,39 @@ +namespace Rs_system.Models.ViewModels; + +public class UltimoPagoViewModel +{ + public long TipoId { get; set; } + public string NombreTipo { get; set; } + public int UltimoMes { get; set; } + public int UltimoAnio { get; set; } + public DateTime FechaUltimoPago { get; set; } + + public string UltimoPeriodoTexto + { + get + { + if (UltimoMes == 0 || UltimoAnio == 0) return "Sin pagos registrados"; + return $"{ObtenerNombreMes(UltimoMes)} {UltimoAnio}"; + } + } + + private string ObtenerNombreMes(int mes) + { + return mes switch + { + 1 => "Enero", + 2 => "Febrero", + 3 => "Marzo", + 4 => "Abril", + 5 => "Mayo", + 6 => "Junio", + 7 => "Julio", + 8 => "Agosto", + 9 => "Septiembre", + 10 => "Octubre", + 11 => "Noviembre", + 12 => "Diciembre", + _ => "" + }; + } +} diff --git a/RS_system/Services/ArticuloService.cs b/RS_system/Services/ArticuloService.cs new file mode 100644 index 0000000..aa007c7 --- /dev/null +++ b/RS_system/Services/ArticuloService.cs @@ -0,0 +1,276 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; +using Rs_system.Models.ViewModels; + +namespace Rs_system.Services; + +public class ArticuloService : IArticuloService +{ + private readonly ApplicationDbContext _context; + private readonly IFileStorageService _fileStorageService; + + public ArticuloService(ApplicationDbContext context, IFileStorageService fileStorageService) + { + _context = context; + _fileStorageService = fileStorageService; + } + + public async Task> GetAllAsync(string? search = null, int? categoriaId = null, int? ubicacionId = null, int? estadoId = null) + { + var query = _context.Articulos + .Include(a => a.Categoria) + .Include(a => a.Estado) + .Include(a => a.Ubicacion) + .Where(a => !a.Eliminado) + .AsQueryable(); + + if (!string.IsNullOrWhiteSpace(search)) + { + var term = search.ToLower(); + query = query.Where(a => + a.Nombre.ToLower().Contains(term) || + a.Codigo.ToLower().Contains(term) || + a.Modelo.ToLower().Contains(term) || + a.Marca.ToLower().Contains(term) || + a.NumeroSerie.ToLower().Contains(term)); + } + + if (categoriaId.HasValue) + query = query.Where(a => a.CategoriaId == categoriaId); + + if (ubicacionId.HasValue) + query = query.Where(a => a.UbicacionId == ubicacionId); + + if (estadoId.HasValue) + query = query.Where(a => a.EstadoId == estadoId); + + return await query + .OrderByDescending(a => a.CreadoEn) + .Select(a => new ArticuloViewModel + { + Id = a.Id, + Codigo = a.Codigo, + Nombre = a.Nombre, + Descripcion = a.Descripcion, + Marca = a.Marca, + Modelo = a.Modelo, + NumeroSerie = a.NumeroSerie, + Precio = a.Precio, + FechaAdquisicion = a.FechaAdquisicion, + ImagenUrl = a.ImagenUrl, + CategoriaId = a.CategoriaId, + CategoriaNombre = a.Categoria.Nombre, + EstadoId = a.EstadoId, + EstadoNombre = a.Estado.Nombre, + EstadoColor = a.Estado.Color, + UbicacionId = a.UbicacionId, + UbicacionNombre = a.Ubicacion.Nombre, + Activo = a.Activo + }) + .ToListAsync(); + } + + public async Task GetByIdAsync(int id) + { + var a = await _context.Articulos + .Include(a => a.Categoria) + .Include(a => a.Estado) + .Include(a => a.Ubicacion) + .FirstOrDefaultAsync(x => x.Id == id && !x.Eliminado); + + if (a == null) return null; + + return new ArticuloViewModel + { + Id = a.Id, + Codigo = a.Codigo, + Nombre = a.Nombre, + Descripcion = a.Descripcion, + Marca = a.Marca, + Modelo = a.Modelo, + NumeroSerie = a.NumeroSerie, + Precio = a.Precio, + FechaAdquisicion = a.FechaAdquisicion, + ImagenUrl = a.ImagenUrl, + CategoriaId = a.CategoriaId, + CategoriaNombre = a.Categoria.Nombre, + EstadoId = a.EstadoId, + EstadoNombre = a.Estado.Nombre, + EstadoColor = a.Estado.Color, + UbicacionId = a.UbicacionId, + UbicacionNombre = a.Ubicacion.Nombre, + Activo = a.Activo, + CantidadGlobal = a.CantidadGlobal, + // New Fields + TipoControl = a.TipoControl, + CantidadInicial = a.CantidadGlobal // Map Global Qty to CantidadInicial for Display + }; + } + + public async Task CreateAsync(ArticuloViewModel viewModel, string createdBy) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + try + { + await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + + string? imagenUrl = null; + if (viewModel.ImagenFile != null) + { + imagenUrl = await _fileStorageService.SaveFileAsync(viewModel.ImagenFile, "articulos"); + } + + var articulo = new Articulo + { + Codigo = viewModel.Codigo, + Nombre = viewModel.Nombre, + Descripcion = viewModel.Descripcion, + Marca = viewModel.Marca, + Modelo = viewModel.Modelo, + NumeroSerie = viewModel.NumeroSerie, + Precio = viewModel.Precio, + FechaAdquisicion = viewModel.FechaAdquisicion, + ImagenUrl = imagenUrl, + CategoriaId = viewModel.CategoriaId, + EstadoId = viewModel.EstadoId, + UbicacionId = viewModel.UbicacionId, + Activo = viewModel.Activo, + Eliminado = false, + CreadoPor = createdBy, + CreadoEn = DateTime.UtcNow, + ActualizadoEn = DateTime.UtcNow, + // New Fields + TipoControl = viewModel.TipoControl ?? nameof(Articulo.TipoControlInventario.UNITARIO), + CantidadGlobal = (viewModel.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) ? viewModel.CantidadInicial : 1 + }; + + _context.Articulos.Add(articulo); + await _context.SaveChangesAsync(); + + // If LOTE, initialize Existencia + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + var existencia = new Existencia + { + ArticuloId = articulo.Id, + UbicacionId = articulo.UbicacionId, + Cantidad = articulo.CantidadGlobal, + ActualizadoEn = DateTime.UtcNow + }; + _context.Existencias.Add(existencia); + await _context.SaveChangesAsync(); + } + + await transaction.CommitAsync(); + }); + + return true; + } + catch + { + return false; + } + } + + public async Task UpdateAsync(ArticuloViewModel viewModel) + { + try + { + var articulo = await _context.Articulos.FindAsync(viewModel.Id); + if (articulo == null || articulo.Eliminado) return false; + + if (viewModel.ImagenFile != null) + { + if (!string.IsNullOrEmpty(articulo.ImagenUrl)) + { + await _fileStorageService.DeleteFileAsync(articulo.ImagenUrl); + } + articulo.ImagenUrl = await _fileStorageService.SaveFileAsync(viewModel.ImagenFile, "articulos"); + } + + articulo.Codigo = viewModel.Codigo; + articulo.Nombre = viewModel.Nombre; + articulo.Descripcion = viewModel.Descripcion; + articulo.Marca = viewModel.Marca; + articulo.Modelo = viewModel.Modelo; + articulo.NumeroSerie = viewModel.NumeroSerie; + articulo.Precio = viewModel.Precio; + articulo.FechaAdquisicion = viewModel.FechaAdquisicion; + articulo.CategoriaId = viewModel.CategoriaId; + articulo.EstadoId = viewModel.EstadoId; + articulo.UbicacionId = viewModel.UbicacionId; + articulo.Activo = viewModel.Activo; + articulo.ActualizadoEn = DateTime.UtcNow; + + _context.Articulos.Update(articulo); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task DeleteAsync(int id) + { + try + { + var articulo = await _context.Articulos.FindAsync(id); + if (articulo == null || articulo.Eliminado) return false; + + articulo.Eliminado = true; + articulo.ActualizadoEn = DateTime.UtcNow; + + _context.Articulos.Update(articulo); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task ExistsCodigoAsync(string codigo, int? excludeId = null) + { + var query = _context.Articulos.AsQueryable(); + if (excludeId.HasValue) + { + query = query.Where(a => a.Id != excludeId.Value); + } + return await query.AnyAsync(a => a.Codigo.ToLower() == codigo.ToLower() && !a.Eliminado); + } + + public async Task> GetCategoriasAsync() + { + return await _context.Categorias + .Where(x => x.Activo && !x.Eliminado) + .OrderBy(x => x.Nombre) + .Select(x => new ValueTuple(x.Id, x.Nombre)) + .ToListAsync(); + } + + public async Task> GetEstadosAsync() + { + return await _context.EstadosArticulos + .Where(x => x.Activo && !x.Eliminado) + .OrderBy(x => x.Nombre) + .Select(x => new ValueTuple(x.Id, x.Nombre, x.Color ?? "secondary")) + .ToListAsync(); + } + + public async Task> GetUbicacionesAsync() + { + return await _context.Ubicaciones + .Where(x => x.Activo && !x.Eliminado) + .OrderBy(x => x.Nombre) + .Select(x => new ValueTuple(x.Id, x.Nombre)) + .ToListAsync(); + } +} diff --git a/RS_system/Services/CategoriaService.cs b/RS_system/Services/CategoriaService.cs new file mode 100644 index 0000000..18cae82 --- /dev/null +++ b/RS_system/Services/CategoriaService.cs @@ -0,0 +1,103 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class CategoriaService : ICategoriaService +{ + private readonly ApplicationDbContext _context; + + public CategoriaService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetAllAsync() + { + return await _context.Categorias + .Where(c => !c.Eliminado) + .OrderBy(c => c.Nombre) + .ToListAsync(); + } + + public async Task GetByIdAsync(int id) + { + return await _context.Categorias + .FirstOrDefaultAsync(c => c.Id == id && !c.Eliminado); + } + + public async Task CreateAsync(Categoria categoria) + { + try + { + categoria.CreadoEn = DateTime.UtcNow; + categoria.ActualizadoEn = DateTime.UtcNow; + // Eliminado and Activo defaults are set in the model/DB, ensuring here just in case + categoria.Eliminado = false; + + _context.Categorias.Add(categoria); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task UpdateAsync(Categoria categoria) + { + try + { + var existing = await _context.Categorias.FindAsync(categoria.Id); + if (existing == null || existing.Eliminado) return false; + + existing.Nombre = categoria.Nombre; + existing.Descripcion = categoria.Descripcion; + existing.Activo = categoria.Activo; + existing.ActualizadoEn = DateTime.UtcNow; + // CreadoPor and CreadoEn should not change + + _context.Categorias.Update(existing); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task DeleteAsync(int id) + { + try + { + var categoria = await _context.Categorias.FindAsync(id); + if (categoria == null || categoria.Eliminado) return false; + + categoria.Eliminado = true; + categoria.ActualizadoEn = DateTime.UtcNow; + + _context.Categorias.Update(categoria); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task ExistsAsync(string nombre, int? excludeId = null) + { + var query = _context.Categorias.AsQueryable(); + + if (excludeId.HasValue) + { + query = query.Where(c => c.Id != excludeId.Value); + } + + return await query.AnyAsync(c => c.Nombre.ToLower() == nombre.ToLower() && !c.Eliminado); + } +} diff --git a/RS_system/Services/ColaboracionService.cs b/RS_system/Services/ColaboracionService.cs new file mode 100644 index 0000000..a2eeac4 --- /dev/null +++ b/RS_system/Services/ColaboracionService.cs @@ -0,0 +1,373 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; +using Rs_system.Models.ViewModels; +using System.Globalization; + +namespace Rs_system.Services; + +public class ColaboracionService : IColaboracionService +{ + private readonly ApplicationDbContext _context; + + public ColaboracionService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetTiposActivosAsync() + { + return await _context.TiposColaboracion + .Where(t => t.Activo) + .OrderBy(t => t.Orden) + .AsNoTracking() + .ToListAsync(); + } + + public async Task GetTipoByIdAsync(long id) + { + return await _context.TiposColaboracion + .AsNoTracking() + .FirstOrDefaultAsync(t => t.Id == id); + } + + public async Task RegistrarColaboracionAsync( + RegistrarColaboracionViewModel model, + string registradoPor) + { + // Validar que el rango de fechas sea válido + var fechaInicial = new DateTime(model.AnioInicial, model.MesInicial, 1); + var fechaFinal = new DateTime(model.AnioFinal, model.MesFinal, 1); + + if (fechaFinal < fechaInicial) + { + throw new ArgumentException("La fecha final no puede ser anterior a la fecha inicial"); + } + + // Obtener información de los tipos seleccionados + var tiposColaboracion = await _context.TiposColaboracion + .Where(t => model.TiposSeleccionados.Contains(t.Id)) + .ToListAsync(); + + // Generar todos los meses en el rango + var mesesAPagar = GenerarRangoMeses( + model.AnioInicial, model.MesInicial, + model.AnioFinal, model.MesFinal); + + // Crear colaboración principal + var colaboracion = new Colaboracion + { + MiembroId = model.MiembroId, + FechaRegistro = DateTime.UtcNow, + MontoTotal = model.MontoTotal, + Observaciones = model.Observaciones, + RegistradoPor = registradoPor, + CreadoEn = DateTime.UtcNow, + ActualizadoEn = DateTime.UtcNow + }; + + // Distribuir el monto total entre los meses y tipos + var detalles = DistribuirMonto( + model.MontoTotal, + tiposColaboracion, + mesesAPagar, + model.TipoPrioritario); + + foreach (var detalle in detalles) + { + colaboracion.Detalles.Add(detalle); + } + + _context.Colaboraciones.Add(colaboracion); + await _context.SaveChangesAsync(); + + return colaboracion; + } + + private List DistribuirMonto( + decimal montoTotal, + List tipos, + List<(int anio, int mes)> meses, + long? tipoPrioritario) + { + var detalles = new List(); + var montoRestante = montoTotal; + + // Estrategia: Mes a Mes + // Para cada mes, intentamos cubrir los tipos (Prioritario primero) + + foreach (var (anio, mes) in meses) + { + if (montoRestante <= 0) break; + + // Ordenar tipos para este mes: Prioritario al inicio + var tiposOrdenados = new List(); + + if (tipoPrioritario.HasValue) + { + var prio = tipos.FirstOrDefault(t => t.Id == tipoPrioritario.Value); + if (prio != null) + { + tiposOrdenados.Add(prio); + tiposOrdenados.AddRange(tipos.Where(t => t.Id != tipoPrioritario.Value)); + } + else + { + tiposOrdenados.AddRange(tipos); + } + } + else + { + tiposOrdenados.AddRange(tipos); + } + + foreach (var tipo in tiposOrdenados) + { + if (montoRestante <= 0) break; + + // Determinar cuánto asignar + // Intentamos cubrir el monto sugerido completo + var montoAAsignar = Math.Min(tipo.MontoSugerido, montoRestante); + + // Si es un monto muy pequeño (ej: residuo), igual lo asignamos para no perderlo, + // salvo que queramos reglas estrictas de "solo completos". + // Por ahora asignamos lo que haya. + + if (montoAAsignar > 0) + { + detalles.Add(new DetalleColaboracion + { + TipoColaboracionId = tipo.Id, + Mes = mes, + Anio = anio, + Monto = montoAAsignar, + CreadoEn = DateTime.UtcNow + }); + + montoRestante -= montoAAsignar; + } + } + } + + return detalles; + } + + public async Task> GetUltimosPagosPorMiembroAsync(long miembroId) + { + // Obtener todos los detalles agrupados por tipo para encontrar la fecha máxima + var detalles = await _context.DetalleColaboraciones + .Include(d => d.Colaboracion) + .Include(d => d.TipoColaboracion) + .Where(d => d.Colaboracion.MiembroId == miembroId) + .ToListAsync(); + + var resultado = detalles + .GroupBy(d => d.TipoColaboracion) + .Select(g => + { + // Encontrar el registro con el mes/año más reciente + var ultimo = g.OrderByDescending(d => d.Anio).ThenByDescending(d => d.Mes).FirstOrDefault(); + if (ultimo == null) return null; + + return new UltimoPagoViewModel + { + TipoId = g.Key.Id, + NombreTipo = g.Key.Nombre, + UltimoMes = ultimo.Mes, + UltimoAnio = ultimo.Anio, + FechaUltimoPago = ultimo.Colaboracion.FechaRegistro + }; + }) + .Where(x => x != null) + .ToList(); + + // Asegurar que retornamos todos los tipos activos, incluso si no tienen pagos + var tiposActivos = await GetTiposActivosAsync(); + var listaFinal = new List(); + + foreach (var tipo in tiposActivos) + { + var pago = resultado.FirstOrDefault(r => r.TipoId == tipo.Id); + if (pago != null) + { + listaFinal.Add(pago); + } + else + { + listaFinal.Add(new UltimoPagoViewModel + { + TipoId = tipo.Id, + NombreTipo = tipo.Nombre, + UltimoMes = 0, // No hay pagos + UltimoAnio = 0 + }); + } + } + + return listaFinal; + } + + private List<(int anio, int mes)> GenerarRangoMeses( + int anioInicial, int mesInicial, + int anioFinal, int mesFinal) + { + var meses = new List<(int, int)>(); + var fecha = new DateTime(anioInicial, mesInicial, 1); + var fechaFin = new DateTime(anioFinal, mesFinal, 1); + + while (fecha <= fechaFin) + { + meses.Add((fecha.Year, fecha.Month)); + fecha = fecha.AddMonths(1); + } + + return meses; + } + + public async Task> GetColaboracionesRecientesAsync(int cantidad = 50) + { + return await _context.Colaboraciones + .Include(c => c.Miembro) + .ThenInclude(m => m.Persona) + .Include(c => c.Detalles) + .ThenInclude(d => d.TipoColaboracion) + .OrderByDescending(c => c.FechaRegistro) + .Take(cantidad) + .AsNoTracking() + .ToListAsync(); + } + + public async Task GetColaboracionByIdAsync(long id) + { + return await _context.Colaboraciones + .Include(c => c.Miembro) + .ThenInclude(m => m.Persona) + .Include(c => c.Detalles) + .ThenInclude(d => d.TipoColaboracion) + .AsNoTracking() + .FirstOrDefaultAsync(c => c.Id == id); + } + + public async Task GenerarReportePorFechasAsync( + DateTime fechaInicio, + DateTime fechaFin) + { + var colaboraciones = await _context.Colaboraciones + .Include(c => c.Miembro) + .ThenInclude(m => m.Persona) + .Include(c => c.Detalles) + .ThenInclude(d => d.TipoColaboracion) + .Where(c => c.FechaRegistro >= fechaInicio && c.FechaRegistro <= fechaFin) + .OrderByDescending(c => c.FechaRegistro) + .AsNoTracking() + .ToListAsync(); + + var reporte = new ReporteColaboracionesViewModel + { + FechaInicio = fechaInicio, + FechaFin = fechaFin, + TotalRecaudado = colaboraciones.Sum(c => c.MontoTotal) + }; + + // Desglose por tipo + var desglosePorTipo = colaboraciones + .SelectMany(c => c.Detalles) + .GroupBy(d => d.TipoColaboracion.Nombre) + .Select(g => new DesglosePorTipo + { + TipoNombre = g.Key, + CantidadMeses = g.Count(), + TotalRecaudado = g.Sum(d => d.Monto) + }) + .OrderBy(d => d.TipoNombre) + .ToList(); + + reporte.DesglosePorTipos = desglosePorTipo; + + // Detalle de movimientos + var movimientos = colaboraciones.Select(c => new DetalleMovimiento + { + ColaboracionId = c.Id, + Fecha = c.FechaRegistro, + NombreMiembro = $"{c.Miembro.Persona.Nombres} {c.Miembro.Persona.Apellidos}", + TiposColaboracion = string.Join(", ", c.Detalles.Select(d => d.TipoColaboracion.Nombre).Distinct()), + PeriodoCubierto = ObtenerPeriodoCubierto(c.Detalles.ToList()), + Monto = c.MontoTotal + }).ToList(); + + reporte.Movimientos = movimientos; + + return reporte; + } + + private string ObtenerPeriodoCubierto(List detalles) + { + if (!detalles.Any()) return ""; + + var ordenados = detalles.OrderBy(d => d.Anio).ThenBy(d => d.Mes).ToList(); + var primero = ordenados.First(); + var ultimo = ordenados.Last(); + + var cultura = new CultureInfo("es-ES"); + + if (primero.Anio == ultimo.Anio && primero.Mes == ultimo.Mes) + { + return new DateTime(primero.Anio, primero.Mes, 1).ToString("MMMM yyyy", cultura); + } + + return $"{new DateTime(primero.Anio, primero.Mes, 1).ToString("MMM yyyy", cultura)} - " + + $"{new DateTime(ultimo.Anio, ultimo.Mes, 1).ToString("MMM yyyy", cultura)}"; + } + + public async Task GenerarEstadoCuentaAsync(long miembroId) + { + var miembro = await _context.Miembros + .Include(m => m.Persona) + .AsNoTracking() + .FirstOrDefaultAsync(m => m.Id == miembroId); + + if (miembro == null) + throw new Exception("Miembro no encontrado"); + + var colaboraciones = await _context.Colaboraciones + .Include(c => c.Detalles) + .ThenInclude(d => d.TipoColaboracion) + .Where(c => c.MiembroId == miembroId) + .AsNoTracking() + .ToListAsync(); + + var estado = new EstadoCuentaViewModel + { + MiembroId = miembroId, + NombreMiembro = $"{miembro.Persona.Nombres} {miembro.Persona.Apellidos}", + FechaConsulta = DateTime.Now, + TotalAportado = colaboraciones.Sum(c => c.MontoTotal) + }; + + // Agrupar por tipo + var historialPorTipo = colaboraciones + .SelectMany(c => c.Detalles.Select(d => new { Detalle = d, FechaRegistro = c.FechaRegistro })) + .GroupBy(x => x.Detalle.TipoColaboracion.Nombre) + .Select(g => new HistorialPorTipo + { + TipoNombre = g.Key, + TotalTipo = g.Sum(x => x.Detalle.Monto), + Registros = g.Select(x => new RegistroMensual + { + Mes = x.Detalle.Mes, + Anio = x.Detalle.Anio, + Monto = x.Detalle.Monto, + FechaRegistro = x.FechaRegistro + }) + .OrderBy(r => r.Anio) + .ThenBy(r => r.Mes) + .ToList() + }) + .OrderBy(h => h.TipoNombre) + .ToList(); + + estado.HistorialPorTipos = historialPorTipo; + + return estado; + } +} diff --git a/RS_system/Services/ContabilidadGeneralService.cs b/RS_system/Services/ContabilidadGeneralService.cs new file mode 100644 index 0000000..59b2310 --- /dev/null +++ b/RS_system/Services/ContabilidadGeneralService.cs @@ -0,0 +1,337 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class ContabilidadGeneralService : IContabilidadGeneralService +{ + private readonly ApplicationDbContext _context; + + public ContabilidadGeneralService(ApplicationDbContext context) + { + _context = context; + } + + // ==================== Categorías de Ingreso ==================== + + public async Task> ObtenerCategoriasIngresoAsync() + { + return await _context.CategoriasIngreso + .Where(c => c.Activa) + .OrderBy(c => c.Nombre) + .AsNoTracking() + .ToListAsync(); + } + + public async Task ObtenerCategoriaIngresoPorIdAsync(long id) + { + return await _context.CategoriasIngreso.FindAsync(id); + } + + public async Task CrearCategoriaIngresoAsync(CategoriaIngreso categoria) + { + categoria.FechaCreacion = DateTime.UtcNow; + _context.CategoriasIngreso.Add(categoria); + await _context.SaveChangesAsync(); + return categoria; + } + + public async Task ActualizarCategoriaIngresoAsync(CategoriaIngreso categoria) + { + try + { + _context.CategoriasIngreso.Update(categoria); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task EliminarCategoriaIngresoAsync(long id) + { + try + { + var categoria = await _context.CategoriasIngreso.FindAsync(id); + if (categoria == null) return false; + + // Soft delete - marcar como inactiva en lugar de eliminar + categoria.Activa = false; + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + // ==================== Categorías de Egreso ==================== + + public async Task> ObtenerCategoriasEgresoAsync() + { + return await _context.CategoriasEgreso + .Where(c => c.Activa) + .OrderBy(c => c.Nombre) + .AsNoTracking() + .ToListAsync(); + } + + public async Task ObtenerCategoriaEgresoPorIdAsync(long id) + { + return await _context.CategoriasEgreso.FindAsync(id); + } + + public async Task CrearCategoriaEgresoAsync(CategoriaEgreso categoria) + { + categoria.FechaCreacion = DateTime.UtcNow; + _context.CategoriasEgreso.Add(categoria); + await _context.SaveChangesAsync(); + return categoria; + } + + public async Task ActualizarCategoriaEgresoAsync(CategoriaEgreso categoria) + { + try + { + _context.CategoriasEgreso.Update(categoria); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task EliminarCategoriaEgresoAsync(long id) + { + try + { + var categoria = await _context.CategoriasEgreso.FindAsync(id); + if (categoria == null) return false; + + // Soft delete - marcar como inactiva en lugar de eliminar + categoria.Activa = false; + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + // ==================== Reportes Mensuales ==================== + + public async Task ObtenerReporteMensualAsync(int mes, int anio) + { + return await _context.ReportesMensualesGenerales + .Include(r => r.Movimientos) + .ThenInclude(m => m.CategoriaIngreso) + .Include(r => r.Movimientos) + .ThenInclude(m => m.CategoriaEgreso) + .FirstOrDefaultAsync(r => r.Mes == mes && r.Anio == anio); + } + + public async Task ObtenerOCrearReporteMensualAsync(int mes, int anio) + { + var reporteExistente = await ObtenerReporteMensualAsync(mes, anio); + if (reporteExistente != null) + return reporteExistente; + + // Obtener el saldo final del mes anterior + var mesAnterior = mes == 1 ? 12 : mes - 1; + var anioAnterior = mes == 1 ? anio - 1 : anio; + + var reporteAnterior = await ObtenerReporteMensualAsync(mesAnterior, anioAnterior); + var saldoInicial = reporteAnterior != null + ? await CalcularSaldoActualAsync(reporteAnterior.Id) + : 0; + + var nuevoReporte = new ReporteMensualGeneral + { + Mes = mes, + Anio = anio, + SaldoInicial = saldoInicial, + FechaCreacion = DateTime.UtcNow, + Cerrado = false + }; + + _context.ReportesMensualesGenerales.Add(nuevoReporte); + await _context.SaveChangesAsync(); + + return nuevoReporte; + } + + public async Task> ListarReportesAsync(int? anio = null) + { + var query = _context.ReportesMensualesGenerales.AsQueryable(); + + if (anio.HasValue) + query = query.Where(r => r.Anio == anio.Value); + + return await query + .OrderByDescending(r => r.Anio) + .ThenByDescending(r => r.Mes) + .AsNoTracking() + .ToListAsync(); + } + + public async Task CerrarReporteAsync(long reporteId) + { + try + { + var reporte = await _context.ReportesMensualesGenerales.FindAsync(reporteId); + if (reporte == null) return false; + + _context.Entry(reporte).Property(x => x.Cerrado).CurrentValue = true; + _context.Entry(reporte).Property(x => x.Cerrado).IsModified = true; + + await _context.SaveChangesAsync(); + return true; + } + catch(Exception ex) + { + return false; + } + } + + // ==================== Movimientos ==================== + + public async Task GuardarMovimientosBulkAsync(long reporteId, List movimientos) + { + try + { + var reporte = await _context.ReportesMensualesGenerales.FindAsync(reporteId); + if (reporte == null || reporte.Cerrado) + return false; + + foreach (var movimiento in movimientos) + { + movimiento.ReporteMensualGeneralId = reporteId; + movimiento.Fecha = DateTime.SpecifyKind(movimiento.Fecha, DateTimeKind.Utc); + + if (movimiento.Id > 0) + { + // Update existing + var existente = await _context.MovimientosGenerales.FindAsync(movimiento.Id); + if (existente != null) + { + existente.Tipo = movimiento.Tipo; + existente.CategoriaIngresoId = movimiento.CategoriaIngresoId; + existente.CategoriaEgresoId = movimiento.CategoriaEgresoId; + existente.Monto = movimiento.Monto; + existente.Fecha = movimiento.Fecha; + existente.Descripcion = movimiento.Descripcion; + existente.NumeroComprobante = movimiento.NumeroComprobante; + } + } + else + { + // Insert new + _context.MovimientosGenerales.Add(movimiento); + } + } + + await _context.SaveChangesAsync(); + return true; + } + catch(Exception ex) + { + return false; + } + } + + public async Task CalcularSaldoActualAsync(long reporteId) + { + var reporte = await _context.ReportesMensualesGenerales + .Include(r => r.Movimientos) + .FirstOrDefaultAsync(r => r.Id == reporteId); + + if (reporte == null) return 0; + + var totalIngresos = reporte.Movimientos + .Where(m => m.Tipo == (int) TipoMovimientoGeneral.Ingreso) + .Sum(m => m.Monto); + + var totalEgresos = reporte.Movimientos + .Where(m => m.Tipo == (int)TipoMovimientoGeneral.Egreso) + .Sum(m => m.Monto); + + return reporte.SaldoInicial + totalIngresos - totalEgresos; + } + + // ==================== Consolidados ==================== + + public async Task> ObtenerConsolidadoIngresosAsync(long reporteId) + { + var movimientos = await _context.MovimientosGenerales + .Include(m => m.CategoriaIngreso) + .Where(m => m.ReporteMensualGeneralId == reporteId + && m.Tipo == (int)TipoMovimientoGeneral.Ingreso) + .AsNoTracking() + .ToListAsync(); + + return movimientos + .GroupBy(m => m.CategoriaIngreso?.Nombre ?? "Sin Categoría") + .ToDictionary(g => g.Key, g => g.Sum(m => m.Monto)); + } + + public async Task> ObtenerConsolidadoEgresosAsync(long reporteId) + { + var movimientos = await _context.MovimientosGenerales + .Include(m => m.CategoriaEgreso) + .Where(m => m.ReporteMensualGeneralId == reporteId + && m.Tipo == (int)TipoMovimientoGeneral.Egreso) + .AsNoTracking() + .ToListAsync(); + + return movimientos + .GroupBy(m => m.CategoriaEgreso?.Nombre ?? "Sin Categoría") + .ToDictionary(g => g.Key, g => g.Sum(m => m.Monto)); + } + + // ==================== Adjuntos ==================== + + public async Task> ObtenerAdjuntosMovimientoAsync(long movimientoId) + { + return await _context.MovimientosGeneralesAdjuntos + .Where(a => a.MovimientoGeneralId == movimientoId) + .OrderByDescending(a => a.FechaSubida) + .AsNoTracking() + .ToListAsync(); + } + + public async Task CrearAdjuntoAsync(long movimientoId, string nombreArchivo, string rutaArchivo, string tipoContenido) + { + var movimiento = await _context.MovimientosGenerales.FindAsync(movimientoId); + if (movimiento == null) return null; + + var adjunto = new MovimientoGeneralAdjunto + { + MovimientoGeneralId = movimientoId, + NombreArchivo = nombreArchivo, + RutaArchivo = rutaArchivo, + TipoContenido = tipoContenido, + FechaSubida = DateTime.UtcNow + }; + + _context.MovimientosGeneralesAdjuntos.Add(adjunto); + await _context.SaveChangesAsync(); + return adjunto; + } + + public async Task EliminarAdjuntoAsync(long adjuntoId) + { + var adjunto = await _context.MovimientosGeneralesAdjuntos.FindAsync(adjuntoId); + if (adjunto == null) return false; + + _context.MovimientosGeneralesAdjuntos.Remove(adjunto); + await _context.SaveChangesAsync(); + return true; + } +} diff --git a/RS_system/Services/ContabilidadService.cs b/RS_system/Services/ContabilidadService.cs new file mode 100644 index 0000000..6c49058 --- /dev/null +++ b/RS_system/Services/ContabilidadService.cs @@ -0,0 +1,169 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class ContabilidadService : IContabilidadService +{ + private readonly ApplicationDbContext _context; + + public ContabilidadService(ApplicationDbContext context) + { + _context = context; + } + + public async Task CrearRegistroAsync(ContabilidadRegistro registro) + { + // Ensure Group exists + var groupExists = await _context.GruposTrabajo.AnyAsync(g => g.Id == registro.GrupoTrabajoId); + if (!groupExists) + { + throw new ArgumentException($"Grupo de trabajo con ID {registro.GrupoTrabajoId} no existe."); + } + + _context.ContabilidadRegistros.Add(registro); + await _context.SaveChangesAsync(); + return registro; + } + + public async Task> ObtenerRegistrosAsync(long grupoId, DateTime desde, DateTime hasta) + { + return await _context.ContabilidadRegistros + .Include(c => c.GrupoTrabajo) + .Where(c => c.GrupoTrabajoId == grupoId && c.Fecha.Date >= desde.Date && c.Fecha.Date <= hasta.Date) + .OrderByDescending(c => c.Fecha) + .ToListAsync(); + } + + public async Task ObtenerReporteMensualAsync(long grupoId, int mes, int anio) + { + return await _context.ReportesMensualesContables + .Include(r => r.Registros) + .FirstOrDefaultAsync(r => r.GrupoTrabajoId == grupoId && r.Mes == mes && r.Anio == anio); + } + + public async Task ObtenerOCrearReporteMensualAsync(long grupoId, int mes, int anio) + { + var reporte = await ObtenerReporteMensualAsync(grupoId, mes, anio); + if (reporte != null) return reporte; + + // Calculate Saldo Inicial based on previous month + decimal saldoInicial = 0; + var prevMes = mes == 1 ? 12 : mes - 1; + var prevAnio = mes == 1 ? anio - 1 : anio; + + var reportePrevio = await ObtenerReporteMensualAsync(grupoId, prevMes, prevAnio); + if (reportePrevio != null) + { + saldoInicial = await CalcularSaldoActualAsync(reportePrevio.Id); + } + + reporte = new ReporteMensualContable + { + GrupoTrabajoId = grupoId, + Mes = mes, + Anio = anio, + SaldoInicial = saldoInicial, + FechaCreacion = DateTime.UtcNow, + Cerrado = false + }; + + _context.ReportesMensualesContables.Add(reporte); + await _context.SaveChangesAsync(); + return reporte; + } + + public async Task> ListarReportesPorGrupoAsync(long grupoId) + { + return await _context.ReportesMensualesContables + .Where(r => r.GrupoTrabajoId == grupoId) + .OrderByDescending(r => r.Anio) + .ThenByDescending(r => r.Mes) + .ToListAsync(); + } + + public async Task GuardarRegistrosBulkAsync(long reporteId, List registros) + { + var reporte = await _context.ReportesMensualesContables + .Include(r => r.Registros) + .FirstOrDefaultAsync(r => r.Id == reporteId); + + if (reporte == null || reporte.Cerrado) return false; + try + { + // Remove existing records for this report (or handle updates carefully) + // For a simple bulk entry system, we might replace all or upsert by ID. + // Let's go with UPSERT based on ID. + + var existingIds = reporte.Registros.Select(r => r.Id).ToList(); + var incomingIds = registros.Where(r => r.Id > 0).Select(r => r.Id).ToList(); + + // Delete records that are no longer in the list + var toDelete = reporte.Registros.Where(r => !incomingIds.Contains(r.Id)).ToList(); + _context.ContabilidadRegistros.RemoveRange(toDelete); + + foreach (var registro in registros) + { + if (registro.Id > 0) + { + // Update + var existing = reporte.Registros.FirstOrDefault(r => r.Id == registro.Id); + if (existing != null) + { + existing.Tipo = registro.Tipo; + existing.Monto = registro.Monto; + existing.Fecha = registro.Fecha; + existing.Descripcion = registro.Descripcion; + _context.Entry(existing).State = EntityState.Modified; + } + } + else + { + // Add + registro.ReporteMensualId = reporteId; + registro.GrupoTrabajoId = reporte.GrupoTrabajoId; + _context.ContabilidadRegistros.Add(registro); + } + } + + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task CalcularSaldoActualAsync(long reporteId) + { + var reporte = await _context.ReportesMensualesContables + .Include(r => r.Registros) + .FirstOrDefaultAsync(r => r.Id == reporteId); + + if (reporte == null) return 0; + + decimal ingresos = reporte.Registros + .Where(r => r.Tipo == TipoMovimientoContable.Ingreso) + .Sum(r => r.Monto); + + decimal egresos = reporte.Registros + .Where(r => r.Tipo == TipoMovimientoContable.Egreso) + .Sum(r => r.Monto); + + return reporte.SaldoInicial + ingresos - egresos; + } + + public async Task CerrarReporteAsync(long reporteId) + { + var reporte = await _context.ReportesMensualesContables.FindAsync(reporteId); + if (reporte == null || reporte.Cerrado) return false; + + reporte.Cerrado = true; + _context.ReportesMensualesContables.Update(reporte); + await _context.SaveChangesAsync(); + return true; + } + +} diff --git a/RS_system/Services/EstadoArticuloService.cs b/RS_system/Services/EstadoArticuloService.cs new file mode 100644 index 0000000..9b1780a --- /dev/null +++ b/RS_system/Services/EstadoArticuloService.cs @@ -0,0 +1,102 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class EstadoArticuloService : IEstadoArticuloService +{ + private readonly ApplicationDbContext _context; + + public EstadoArticuloService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetAllAsync() + { + return await _context.EstadosArticulos + .Where(e => !e.Eliminado) + .OrderBy(e => e.Nombre) + .ToListAsync(); + } + + public async Task GetByIdAsync(int id) + { + return await _context.EstadosArticulos + .FirstOrDefaultAsync(e => e.Id == id && !e.Eliminado); + } + + public async Task CreateAsync(EstadoArticulo estado) + { + try + { + estado.CreadoEn = DateTime.UtcNow; + estado.ActualizadoEn = DateTime.UtcNow; + estado.Eliminado = false; + + _context.EstadosArticulos.Add(estado); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task UpdateAsync(EstadoArticulo estado) + { + try + { + var existing = await _context.EstadosArticulos.FindAsync(estado.Id); + if (existing == null || existing.Eliminado) return false; + + existing.Nombre = estado.Nombre; + existing.Descripcion = estado.Descripcion; + existing.Color = estado.Color; + existing.Activo = estado.Activo; + existing.ActualizadoEn = DateTime.UtcNow; + + _context.EstadosArticulos.Update(existing); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task DeleteAsync(int id) + { + try + { + var estado = await _context.EstadosArticulos.FindAsync(id); + if (estado == null || estado.Eliminado) return false; + + estado.Eliminado = true; + estado.ActualizadoEn = DateTime.UtcNow; + + _context.EstadosArticulos.Update(estado); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task ExistsAsync(string nombre, int? excludeId = null) + { + var query = _context.EstadosArticulos.AsQueryable(); + + if (excludeId.HasValue) + { + query = query.Where(e => e.Id != excludeId.Value); + } + + return await query.AnyAsync(e => e.Nombre.ToLower() == nombre.ToLower() && !e.Eliminado); + } +} diff --git a/RS_system/Services/IArticuloService.cs b/RS_system/Services/IArticuloService.cs new file mode 100644 index 0000000..35fda58 --- /dev/null +++ b/RS_system/Services/IArticuloService.cs @@ -0,0 +1,18 @@ +using Rs_system.Models.ViewModels; + +namespace Rs_system.Services; + +public interface IArticuloService +{ + Task> GetAllAsync(string? search = null, int? categoriaId = null, int? ubicacionId = null, int? estadoId = null); + Task GetByIdAsync(int id); + Task CreateAsync(ArticuloViewModel viewModel, string createdBy); + Task UpdateAsync(ArticuloViewModel viewModel); + Task DeleteAsync(int id); + Task ExistsCodigoAsync(string codigo, int? excludeId = null); + + // Dropdown helpers + Task> GetCategoriasAsync(); + Task> GetEstadosAsync(); + Task> GetUbicacionesAsync(); +} diff --git a/RS_system/Services/ICategoriaService.cs b/RS_system/Services/ICategoriaService.cs new file mode 100644 index 0000000..b2d2bd6 --- /dev/null +++ b/RS_system/Services/ICategoriaService.cs @@ -0,0 +1,13 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface ICategoriaService +{ + Task> GetAllAsync(); + Task GetByIdAsync(int id); + Task CreateAsync(Categoria categoria); + Task UpdateAsync(Categoria categoria); + Task DeleteAsync(int id); + Task ExistsAsync(string nombre, int? excludeId = null); +} diff --git a/RS_system/Services/IColaboracionService.cs b/RS_system/Services/IColaboracionService.cs new file mode 100644 index 0000000..ae1c5e1 --- /dev/null +++ b/RS_system/Services/IColaboracionService.cs @@ -0,0 +1,21 @@ +using Rs_system.Models; +using Rs_system.Models.ViewModels; + +namespace Rs_system.Services; + +public interface IColaboracionService +{ + // Tipos de colaboración + Task> GetTiposActivosAsync(); + Task GetTipoByIdAsync(long id); + + // Colaboraciones + Task RegistrarColaboracionAsync(RegistrarColaboracionViewModel model, string registradoPor); + Task> GetColaboracionesRecientesAsync(int cantidad = 50); + Task GetColaboracionByIdAsync(long id); + + // Reportes + Task GenerarReportePorFechasAsync(DateTime fechaInicio, DateTime fechaFin); + Task GenerarEstadoCuentaAsync(long miembroId); + Task> GetUltimosPagosPorMiembroAsync(long miembroId); +} diff --git a/RS_system/Services/IContabilidadGeneralService.cs b/RS_system/Services/IContabilidadGeneralService.cs new file mode 100644 index 0000000..cce28de --- /dev/null +++ b/RS_system/Services/IContabilidadGeneralService.cs @@ -0,0 +1,39 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IContabilidadGeneralService +{ + // Categorías de Ingreso + Task> ObtenerCategoriasIngresoAsync(); + Task ObtenerCategoriaIngresoPorIdAsync(long id); + Task CrearCategoriaIngresoAsync(CategoriaIngreso categoria); + Task ActualizarCategoriaIngresoAsync(CategoriaIngreso categoria); + Task EliminarCategoriaIngresoAsync(long id); + + // Categorías de Egreso + Task> ObtenerCategoriasEgresoAsync(); + Task ObtenerCategoriaEgresoPorIdAsync(long id); + Task CrearCategoriaEgresoAsync(CategoriaEgreso categoria); + Task ActualizarCategoriaEgresoAsync(CategoriaEgreso categoria); + Task EliminarCategoriaEgresoAsync(long id); + + // Reportes Mensuales + Task ObtenerReporteMensualAsync(int mes, int anio); + Task ObtenerOCrearReporteMensualAsync(int mes, int anio); + Task> ListarReportesAsync(int? anio = null); + Task CerrarReporteAsync(long reporteId); + + // Movimientos + Task GuardarMovimientosBulkAsync(long reporteId, List movimientos); + Task CalcularSaldoActualAsync(long reporteId); + + // Consolidados + Task> ObtenerConsolidadoIngresosAsync(long reporteId); + Task> ObtenerConsolidadoEgresosAsync(long reporteId); + + // Adjuntos + Task> ObtenerAdjuntosMovimientoAsync(long movimientoId); + Task CrearAdjuntoAsync(long movimientoId, string nombreArchivo, string rutaArchivo, string tipoContenido); + Task EliminarAdjuntoAsync(long adjuntoId); +} diff --git a/RS_system/Services/IContabilidadService.cs b/RS_system/Services/IContabilidadService.cs new file mode 100644 index 0000000..a8ea07d --- /dev/null +++ b/RS_system/Services/IContabilidadService.cs @@ -0,0 +1,18 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IContabilidadService +{ + Task CrearRegistroAsync(ContabilidadRegistro registro); + Task> ObtenerRegistrosAsync(long grupoId, DateTime desde, DateTime hasta); + + // Monthly Report Methods + Task ObtenerReporteMensualAsync(long grupoId, int mes, int anio); + Task ObtenerOCrearReporteMensualAsync(long grupoId, int mes, int anio); + Task> ListarReportesPorGrupoAsync(long grupoId); + Task GuardarRegistrosBulkAsync(long reporteId, List registros); + Task CalcularSaldoActualAsync(long reporteId); + Task CerrarReporteAsync(long reporteId); + +} diff --git a/RS_system/Services/IEstadoArticuloService.cs b/RS_system/Services/IEstadoArticuloService.cs new file mode 100644 index 0000000..9919c20 --- /dev/null +++ b/RS_system/Services/IEstadoArticuloService.cs @@ -0,0 +1,13 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IEstadoArticuloService +{ + Task> GetAllAsync(); + Task GetByIdAsync(int id); + Task CreateAsync(EstadoArticulo estado); + Task UpdateAsync(EstadoArticulo estado); + Task DeleteAsync(int id); + Task ExistsAsync(string nombre, int? excludeId = null); +} diff --git a/RS_system/Services/IMovimientoService.cs b/RS_system/Services/IMovimientoService.cs new file mode 100644 index 0000000..553a2e6 --- /dev/null +++ b/RS_system/Services/IMovimientoService.cs @@ -0,0 +1,21 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IMovimientoService +{ + Task> GetHistorialGeneralAsync(int limit = 100); + Task> GetHistorialPorArticuloAsync(int articuloId); + + // Legacy wrappers (Quantity = 1) + Task RegistrarTrasladoAsync(int articuloId, int nuevaUbicacionId, string observacion, string usuario); + Task RegistrarBajaAsync(int articuloId, string motivo, string usuario); + + // New Quantity-Aware Methods + Task RegistrarTrasladoCantidadAsync(int articuloId, int nuevaUbicacionId, int cantidad, string observacion, string usuario); + Task RegistrarBajaCantidadAsync(int articuloId, int cantidad, string motivo, string usuario); + + Task RegistrarCambioEstadoAsync(int articuloId, int nuevoEstadoId, string observacion, string usuario); + Task RegistrarPrestamoAsync(int articuloId, int cantidad, string personaNombre, string? personaIdentificacion, DateTime? fechaDevolucionEstimada, string observacion, string usuario); + Task RegistrarEntradaCantidadAsync(int articuloId, int cantidad, string observacion, string usuario); +} diff --git a/RS_system/Services/IPrestamoService.cs b/RS_system/Services/IPrestamoService.cs new file mode 100644 index 0000000..6c97430 --- /dev/null +++ b/RS_system/Services/IPrestamoService.cs @@ -0,0 +1,13 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IPrestamoService +{ + Task> GetHistorialPrestamosAsync(int limit = 100); + Task> GetPrestamosActivosAsync(); + Task GetPrestamoByIdAsync(long id); + Task RegistrarPrestamoAsync(int articuloId, int cantidad, string personaNombre, string? personaIdentificacion, DateTime? fechaDevolucionEstimada, string observacion, string usuario); + Task RegistrarDevolucionAsync(long prestamoId, string observacion, string usuario); + Task RegistrarDevolucionParcialAsync(long prestamoId, List codigosDevolucion, string observacion, string usuario); +} \ No newline at end of file diff --git a/RS_system/Services/IUbicacionService.cs b/RS_system/Services/IUbicacionService.cs new file mode 100644 index 0000000..de465a8 --- /dev/null +++ b/RS_system/Services/IUbicacionService.cs @@ -0,0 +1,13 @@ +using Rs_system.Models; + +namespace Rs_system.Services; + +public interface IUbicacionService +{ + Task> GetAllAsync(); + Task GetByIdAsync(int id); + Task CreateAsync(Ubicacion ubicacion); + Task UpdateAsync(Ubicacion ubicacion); + Task DeleteAsync(int id); + Task ExistsAsync(string nombre, int? excludeId = null); +} diff --git a/RS_system/Services/MovimientoService.cs b/RS_system/Services/MovimientoService.cs new file mode 100644 index 0000000..fec09e9 --- /dev/null +++ b/RS_system/Services/MovimientoService.cs @@ -0,0 +1,450 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class MovimientoService : IMovimientoService +{ + private readonly ApplicationDbContext _context; + + public MovimientoService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetHistorialGeneralAsync(int limit = 100) + { + return await _context.MovimientosInventario + .Include(m => m.Articulo) + .Include(m => m.UbicacionOrigen) + .Include(m => m.UbicacionDestino) + .Include(m => m.EstadoAnterior) + .Include(m => m.EstadoNuevo) + .OrderByDescending(m => m.Fecha) + .Take(limit) + .ToListAsync(); + } + + public async Task> GetHistorialPorArticuloAsync(int articuloId) + { + return await _context.MovimientosInventario + .Include(m => m.UbicacionOrigen) + .Include(m => m.UbicacionDestino) + .Include(m => m.EstadoAnterior) + .Include(m => m.EstadoNuevo) + .Where(m => m.ArticuloId == articuloId) + .OrderByDescending(m => m.Fecha) + .ToListAsync(); + } + + public async Task RegistrarTrasladoAsync(int articuloId, int nuevaUbicacionId, string observacion, string usuario) + { + return await RegistrarTrasladoCantidadAsync(articuloId, nuevaUbicacionId, 1, observacion, usuario); + } + + public async Task RegistrarTrasladoCantidadAsync( + int articuloId, + int nuevaUbicacionId, + int cantidad, + string observacion, + string usuario) +{ + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + var fecha = DateTime.UtcNow; + + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + // ===== LOTE ===== + var origenExistencia = await _context.Existencias + .FirstOrDefaultAsync(e => + e.ArticuloId == articuloId && + e.UbicacionId == articulo.UbicacionId); + + if (origenExistencia == null || origenExistencia.Cantidad < cantidad) + return false; + + origenExistencia.Cantidad -= cantidad; + origenExistencia.ActualizadoEn = fecha; + _context.Existencias.Update(origenExistencia); + + + var destinoExistencia = await _context.Existencias + .FirstOrDefaultAsync(e => + e.ArticuloId == articuloId && + e.UbicacionId == nuevaUbicacionId); + + if (destinoExistencia == null) + { + destinoExistencia = new Existencia + { + ArticuloId = articuloId, + UbicacionId = nuevaUbicacionId, + Cantidad = 0, + ActualizadoEn = fecha + }; + _context.Existencias.Add(destinoExistencia); + } + + destinoExistencia.Cantidad += cantidad; + destinoExistencia.ActualizadoEn = fecha; + + // 📉 MOVIMIENTO SALIDA + var movSalida = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.TRASLADO), + Fecha = fecha, + UbicacionOrigenId = articulo.UbicacionId, + Cantidad = cantidad, + TipMov = 2, + Observacion = observacion, + UsuarioId = usuario, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId + }; + + // 📈 MOVIMIENTO ENTRADA + var movEntrada = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.TRASLADO), + Fecha = fecha, + UbicacionDestinoId = nuevaUbicacionId, + Cantidad = cantidad, + TipMov = 1, + Observacion = observacion, + UsuarioId = usuario, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId + }; + + _context.MovimientosInventario.AddRange(movSalida, movEntrada); + } + else + { + // ===== UNITARIO ===== + if (articulo.UbicacionId == nuevaUbicacionId) + return false; + + // 📉 SALIDA + var movSalida = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.TRASLADO), + Fecha = fecha, + UbicacionOrigenId = articulo.UbicacionId, + Cantidad = 1, + TipMov = 2, + Observacion = observacion, + UsuarioId = usuario, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId + }; + + // 📈 ENTRADA + var movEntrada = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.TRASLADO), + Fecha = fecha, + UbicacionDestinoId = nuevaUbicacionId, + Cantidad = 1, + TipMov = 1, + Observacion = observacion, + UsuarioId = usuario, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId + }; + + articulo.UbicacionId = nuevaUbicacionId; + articulo.ActualizadoEn = fecha; + + _context.Articulos.Update(articulo); + _context.MovimientosInventario.AddRange(movSalida, movEntrada); + } + + await _context.SaveChangesAsync(); + await transaction.CommitAsync(); + return true; + } + catch + { + await transaction.RollbackAsync(); + return false; + } + }); +} + + + public async Task RegistrarCambioEstadoAsync(int articuloId, int nuevoEstadoId, string observacion, string usuario) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + if (articulo.EstadoId == nuevoEstadoId) return false; + + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.CAMBIO_ESTADO), + Fecha = DateTime.UtcNow, + UbicacionOrigenId = articulo.UbicacionId, + UbicacionDestinoId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = nuevoEstadoId, + Cantidad = (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) ? articulo.CantidadGlobal : 1, + Observacion = observacion, + UsuarioId = usuario + }; + + articulo.EstadoId = nuevoEstadoId; + articulo.ActualizadoEn = DateTime.UtcNow; + + _context.MovimientosInventario.Add(movimiento); + _context.Articulos.Update(articulo); + + await _context.SaveChangesAsync(); + await transaction.CommitAsync(); + return true; + } + catch + { + await transaction.RollbackAsync(); + return false; + } + }); + } + + public async Task RegistrarPrestamoAsync(int articuloId, int cantidad, string personaNombre, string? personaIdentificacion, + DateTime? fechaDevolucionEstimada, string observacion, string usuario) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + // Validar stock disponible + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + var existencia = await _context.Existencias + .FirstOrDefaultAsync(e => e.ArticuloId == articuloId && e.UbicacionId == articulo.UbicacionId); + + if (existencia == null || existencia.Cantidad < cantidad) return false; + + // Reducir stock existente + existencia.Cantidad -= cantidad; + articulo.CantidadGlobal -= cantidad; + + if (articulo.CantidadGlobal < 0) articulo.CantidadGlobal = 0; + if (existencia.Cantidad < 0) existencia.Cantidad = 0; + + _context.Existencias.Update(existencia); + _context.Articulos.Update(articulo); + } + else + { + // UNITARIO - Solo se puede prestar 1 + if (cantidad != 1) return false; + if (!articulo.Activo) return false; + } + + // Crear movimiento de inventario + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.PRESTAMO), + TipMov = 2, + Fecha = DateTime.UtcNow, + UbicacionOrigenId = articulo.UbicacionId, + UbicacionDestinoId = articulo.UbicacionId, // Mismo lugar, solo está prestado + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId, + Cantidad = cantidad, + Observacion = $"Préstamo a {personaNombre}. {observacion}", + UsuarioId = usuario + }; + + _context.MovimientosInventario.Add(movimiento); + + await _context.SaveChangesAsync(); + await transaction.CommitAsync(); + return true; + } + catch + { + await transaction.RollbackAsync(); + return false; + } + }); + } + + public async Task RegistrarBajaAsync(int articuloId, string motivo, string usuario) + { + return await RegistrarBajaCantidadAsync(articuloId, 1, motivo, usuario); + } + + public async Task RegistrarBajaCantidadAsync(int articuloId, int cantidad, string motivo, string usuario) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + var existencia = await _context.Existencias + .FirstOrDefaultAsync(e => e.ArticuloId == articuloId && e.UbicacionId == articulo.UbicacionId); + + if (existencia == null || existencia.Cantidad < cantidad) return false; + + existencia.Cantidad -= cantidad; + articulo.CantidadGlobal -= cantidad; + + if (articulo.CantidadGlobal <= 0) articulo.Activo = false; + + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.BAJA), + TipMov = 2, + Fecha = DateTime.UtcNow, + UbicacionOrigenId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + Cantidad = cantidad, + Observacion = motivo, + UsuarioId = usuario + }; + + _context.Existencias.Update(existencia); + _context.MovimientosInventario.Add(movimiento); + _context.Articulos.Update(articulo); + } + else + { + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.BAJA), + TipMov = 2, + Fecha = DateTime.UtcNow, + UbicacionOrigenId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + Cantidad = 1, + Observacion = motivo, + UsuarioId = usuario + }; + + articulo.Activo = false; + _context.MovimientosInventario.Add(movimiento); + _context.Articulos.Update(articulo); + } + + await _context.SaveChangesAsync(); + await transaction.CommitAsync(); + return true; + } + catch + { + await transaction.RollbackAsync(); + return false; + } + }); + } + + public async Task RegistrarEntradaCantidadAsync(int articuloId, int cantidad, string observacion, string usuario) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + var existencia = await _context.Existencias + .FirstOrDefaultAsync(e => e.ArticuloId == articuloId && e.UbicacionId == articulo.UbicacionId); + + if (existencia == null) + { + existencia = new Existencia + { + ArticuloId = articuloId, + UbicacionId = articulo.UbicacionId, + Cantidad = 0, + ActualizadoEn = DateTime.UtcNow + }; + _context.Existencias.Add(existencia); + } + + existencia.Cantidad += cantidad; + articulo.CantidadGlobal += cantidad; + articulo.ActualizadoEn = DateTime.UtcNow; + + _context.Existencias.Update(existencia); + _context.Articulos.Update(articulo); + } + else + { + // UNITARIO - Si está inactivo por baja, lo reactivamos? + // En unitario, una entrada suele ser que el objeto "vuelve" a estar disponible. + articulo.Activo = true; + articulo.ActualizadoEn = DateTime.UtcNow; + _context.Articulos.Update(articulo); + } + + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.ENTRADA), + TipMov = 1, + Fecha = DateTime.UtcNow, + UbicacionDestinoId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId, + Cantidad = cantidad, + Observacion = observacion, + UsuarioId = usuario + }; + + _context.MovimientosInventario.Add(movimiento); + + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + }); + } +} diff --git a/RS_system/Services/PrestamoService.cs b/RS_system/Services/PrestamoService.cs new file mode 100644 index 0000000..a870b3d --- /dev/null +++ b/RS_system/Services/PrestamoService.cs @@ -0,0 +1,226 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class PrestamoService : IPrestamoService +{ + private readonly ApplicationDbContext _context; + + public PrestamoService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetHistorialPrestamosAsync(int limit = 100) + { + return await _context.Prestamos + .Include(p => p.Articulo) + .OrderByDescending(p => p.FechaPrestamo) + .Take(limit) + .ToListAsync(); + } + + public async Task> GetPrestamosActivosAsync() + { + return await _context.Prestamos + .Include(p => p.Articulo) + .Where(p => p.Estado == "ACTIVO" || p.Estado == "ATRASADO") + .OrderByDescending(p => p.FechaPrestamo) + .ToListAsync(); + } + + public async Task GetPrestamoByIdAsync(long id) + { + return await _context.Prestamos + .Include(p => p.Articulo) + .Include(p => p.Detalles) + .FirstOrDefaultAsync(p => p.Id == id); + } + + public async Task RegistrarPrestamoAsync(int articuloId, int cantidad, string personaNombre, string? personaIdentificacion, DateTime? fechaDevolucionEstimada, string observacion, string usuario) + { + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var articulo = await _context.Articulos.FindAsync(articuloId); + if (articulo == null) return false; + + // 1. Validar y actualizar stock + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + var existencia = await _context.Existencias + .FirstOrDefaultAsync(e => e.ArticuloId == articuloId && e.UbicacionId == articulo.UbicacionId); + + if (existencia == null || existencia.Cantidad < cantidad) return false; + + existencia.Cantidad -= cantidad; + articulo.CantidadGlobal -= cantidad; + _context.Existencias.Update(existencia); + _context.Articulos.Update(articulo); + } + else + { + // Unitario + if (cantidad != 1 || !articulo.Activo) return false; + // En unitario, podrías marcar como inactivo o simplemente registrar el préstamo + // Para este sistema, asumiremos que prestado sigue siendo "Activo" pero en una ubicación de préstamo (vía movimiento) + } + + // 2. Crear el registro de préstamo + var prestamo = new Prestamo + { + ArticuloId = articuloId, + Cantidad = cantidad, + PersonaNombre = personaNombre, + PersonaIdentificacion = personaIdentificacion, + FechaPrestamo = DateTime.UtcNow, + FechaDevolucionEstimada = fechaDevolucionEstimada, + Estado = "ACTIVO", + Observacion = observacion, + UsuarioId = usuario + }; + + _context.Prestamos.Add(prestamo); + await _context.SaveChangesAsync(); // Guardamos para tener el ID del préstamo + + // 3. Crear movimiento de inventario (auditoría) + var movimiento = new MovimientoInventario + { + ArticuloId = articuloId, + TipoMovimiento = nameof(TipoMovimiento.PRESTAMO), + TipMov = 2, + Fecha = DateTime.UtcNow, + UbicacionOrigenId = articulo.UbicacionId, + UbicacionDestinoId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId, + Cantidad = cantidad, + Observacion = $"Préstamo #{prestamo.Id} a {personaNombre}. {observacion}", + UsuarioId = usuario + }; + + _context.MovimientosInventario.Add(movimiento); + + await _context.SaveChangesAsync(); + await transaction.CommitAsync(); + return true; + } + catch + { + await transaction.RollbackAsync(); + return false; + } + }); + } + + public async Task RegistrarDevolucionAsync( + long prestamoId, + string observacion, + string usuario) +{ + var strategy = _context.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + try + { + var prestamo = await _context.Prestamos.FindAsync(prestamoId); + if (prestamo == null) + return false; + + if (prestamo.Estado == "DEVUELTO") + return false; + + var articulo = await _context.Articulos.FindAsync(prestamo.ArticuloId); + if (articulo == null) + return false; + + var fechaActual = DateTime.UtcNow; + + if (articulo.TipoControl == nameof(Articulo.TipoControlInventario.LOTE)) + { + // --- Buscar existencia --- + var existencia = await _context.Existencias + .FirstOrDefaultAsync(e => + e.ArticuloId == articulo.Id && + e.UbicacionId == articulo.UbicacionId); + + // --- Crear existencia si no existe --- + if (existencia == null) + { + existencia = new Existencia + { + ArticuloId = articulo.Id, + UbicacionId = articulo.UbicacionId, + Cantidad = 0, + ActualizadoEn = fechaActual + }; + _context.Existencias.Add(existencia); + } + + // --- Actualizar cantidades --- + existencia.Cantidad += prestamo.Cantidad; + existencia.ActualizadoEn = fechaActual; + + articulo.CantidadGlobal += prestamo.Cantidad; + articulo.ActualizadoEn = fechaActual; + + _context.Existencias.Update(existencia); + _context.Articulos.Update(articulo); + } + else + { + articulo.Activo = true; + articulo.ActualizadoEn = fechaActual; + _context.Articulos.Update(articulo); + } + + prestamo.Estado = "DEVUELTO"; + prestamo.FechaDevolucionReal = fechaActual; + prestamo.Observacion = + $"{prestamo.Observacion}\nDevolución: {observacion}"; + + _context.Prestamos.Update(prestamo); + + var movimiento = new MovimientoInventario + { + ArticuloId = articulo.Id, + TipoMovimiento = nameof(TipoMovimiento.DEVOLUCION), + TipMov = 1, // ENTRADA + Fecha = fechaActual, + UbicacionOrigenId = articulo.UbicacionId, + UbicacionDestinoId = articulo.UbicacionId, + EstadoAnteriorId = articulo.EstadoId, + EstadoNuevoId = articulo.EstadoId, + Cantidad = prestamo.Cantidad, + Observacion = $"Devolución de préstamo #{prestamo.Id}. {observacion}", + UsuarioId = usuario + }; + + _context.MovimientosInventario.Add(movimiento); + + await _context.SaveChangesAsync(); + + return true; + } + catch + { + return false; + } + }); +} + + + public async Task RegistrarDevolucionParcialAsync(long prestamoId, List codigosDevolucion, string observacion, string usuario) + { + // Implementación básica para seguir la interfaz, aunque el controlador actual no la usa directamente + // Esta lógica sería más para artículos unitarios con códigos específicos (PrestamoDetalle) + return await RegistrarDevolucionAsync(prestamoId, "Devolución parcial - " + observacion, usuario); + } +} diff --git a/RS_system/Services/UbicacionService.cs b/RS_system/Services/UbicacionService.cs new file mode 100644 index 0000000..f691e3a --- /dev/null +++ b/RS_system/Services/UbicacionService.cs @@ -0,0 +1,102 @@ +using Microsoft.EntityFrameworkCore; +using Rs_system.Data; +using Rs_system.Models; + +namespace Rs_system.Services; + +public class UbicacionService : IUbicacionService +{ + private readonly ApplicationDbContext _context; + + public UbicacionService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetAllAsync() + { + return await _context.Ubicaciones + .Where(u => !u.Eliminado) + .OrderBy(u => u.Nombre) + .ToListAsync(); + } + + public async Task GetByIdAsync(int id) + { + return await _context.Ubicaciones + .FirstOrDefaultAsync(u => u.Id == id && !u.Eliminado); + } + + public async Task CreateAsync(Ubicacion ubicacion) + { + try + { + ubicacion.CreadoEn = DateTime.UtcNow; + ubicacion.ActualizadoEn = DateTime.UtcNow; + ubicacion.Eliminado = false; + + _context.Ubicaciones.Add(ubicacion); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task UpdateAsync(Ubicacion ubicacion) + { + try + { + var existing = await _context.Ubicaciones.FindAsync(ubicacion.Id); + if (existing == null || existing.Eliminado) return false; + + existing.Nombre = ubicacion.Nombre; + existing.Descripcion = ubicacion.Descripcion; + existing.Responsable = ubicacion.Responsable; + existing.Activo = ubicacion.Activo; + existing.ActualizadoEn = DateTime.UtcNow; + + _context.Ubicaciones.Update(existing); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task DeleteAsync(int id) + { + try + { + var ubicacion = await _context.Ubicaciones.FindAsync(id); + if (ubicacion == null || ubicacion.Eliminado) return false; + + ubicacion.Eliminado = true; + ubicacion.ActualizadoEn = DateTime.UtcNow; + + _context.Ubicaciones.Update(ubicacion); + await _context.SaveChangesAsync(); + return true; + } + catch + { + return false; + } + } + + public async Task ExistsAsync(string nombre, int? excludeId = null) + { + var query = _context.Ubicaciones.AsQueryable(); + + if (excludeId.HasValue) + { + query = query.Where(u => u.Id != excludeId.Value); + } + + return await query.AnyAsync(u => u.Nombre.ToLower() == nombre.ToLower() && !u.Eliminado); + } +} diff --git a/RS_system/Views/Articulos/Create.cshtml b/RS_system/Views/Articulos/Create.cshtml new file mode 100644 index 0000000..9019b80 --- /dev/null +++ b/RS_system/Views/Articulos/Create.cshtml @@ -0,0 +1,208 @@ +@model Rs_system.Models.ViewModels.ArticuloViewModel +@{ + ViewData["Title"] = "Nuevo Artículo"; +} + +
+
+

Nuevo Artículo

+

Registrar un nuevo activo en el inventario

+
+ + Volver a la lista + +
+ +
+
+ +
+
+
+
Información General
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+ + + +
+ +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
Detalles del Activo
+
+
+
+
+ + + +
+
+ +
+ $ + +
+ +
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
Clasificación
+
+
+
+ + +
Unitario: Control 1 a 1 por Serie. Lote: Control por Cantidad.
+ +
+ + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+
+
+
+ +
+
+
Imagen
+
+
+
+
+ + Sin Imagen +
+ + +
+
+
+ +
+ + Cancelar +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} + +} diff --git a/RS_system/Views/Articulos/Details.cshtml b/RS_system/Views/Articulos/Details.cshtml new file mode 100644 index 0000000..7b8770c --- /dev/null +++ b/RS_system/Views/Articulos/Details.cshtml @@ -0,0 +1,128 @@ +@model Rs_system.Models.ViewModels.ArticuloViewModel +@{ + ViewData["Title"] = "Ficha Técnica"; +} + +
+
+

Ficha Técnica

+

Detalles del activo: @Model.Codigo

+
+ +
+ +
+ +
+
+
+ @if (!string.IsNullOrEmpty(Model.ImagenUrl)) + { + Imagen del Artículo + } + else + { +
+
+ + Sin Imagen +
+
+ } + +
@Model.Nombre
+

@Model.Codigo

+ +
+ + Estado: @Model.EstadoNombre + + @if (Model.Activo) + { + Activo + } + else + { + Inactivo + } +
+
+
+
+ + +
+
+
+
Información Detallada
+
+
+
+
Descripción
+
+ @(!string.IsNullOrEmpty(Model.Descripcion) ? Model.Descripcion : "-") +
+
+ +
+
Ubicación Actual
+
+ + + @Model.UbicacionNombre + +
+
+ +
+
Categoría
+
@Model.CategoriaNombre
+
+ +
+ +
+
+ Marca + @(!string.IsNullOrEmpty(Model.Marca) ? Model.Marca : "-") +
+
+ Modelo + @(!string.IsNullOrEmpty(Model.Modelo) ? Model.Modelo : "-") +
+
+ +
+
+ Número de Serie + + @(!string.IsNullOrEmpty(Model.NumeroSerie) ? Model.NumeroSerie : "N/A") + +
+
+ Precio Estimado + + @Model.Precio.ToString("C") + +
+
+ +
+
+ Fecha Adquisición + + @(Model.FechaAdquisicion.HasValue ? Model.FechaAdquisicion.Value.ToString("dd/MM/yyyy") : "-") + +
+
+
+
+
+
diff --git a/RS_system/Views/Articulos/Edit.cshtml b/RS_system/Views/Articulos/Edit.cshtml new file mode 100644 index 0000000..c443b53 --- /dev/null +++ b/RS_system/Views/Articulos/Edit.cshtml @@ -0,0 +1,215 @@ +@model Rs_system.Models.ViewModels.ArticuloViewModel +@{ + ViewData["Title"] = "Editar Artículo"; +} + +
+
+

Editar Artículo

+

Modificar información del activo

+
+ + Volver + +
+ +
+ +
+ +
+
+
+
Información General
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+ + + +
+ +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
Detalles del Activo
+
+
+
+
+ + + +
+
+ +
+ $ + +
+ +
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
Clasificación
+
+
+
+
+ + + +
+
+ @if (Model.TipoControl == "LOTE") + { + + +
Gestionar cantidad vía Movimientos.
+ } + else + { + + + } +
+
+ +
+ + + +
+ +
+ + @if (Model.TipoControl == "LOTE") + { + + +
La ubicación se gestiona por Existencias en Lotes.
+ } + else + { + + + } +
+ +
+ + + +
+ +
+
+ + +
+
+
+
+ +
+
+
Imagen
+
+
+
+
+ @if (!string.IsNullOrEmpty(Model.ImagenUrl)) + { + Vista Previa + + } + else + { + + Sin Imagen + } +
+ + +
+
+
+ +
+ + Cancelar +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} + +} diff --git a/RS_system/Views/Articulos/Index.cshtml b/RS_system/Views/Articulos/Index.cshtml new file mode 100644 index 0000000..4419a31 --- /dev/null +++ b/RS_system/Views/Articulos/Index.cshtml @@ -0,0 +1,141 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Inventario de Artículos"; +} + +
+
+

Inventario de Artículos

+

Gestión de bienes y activos fijos

+
+ + Nuevo Artículo + +
+ + +
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + else + { + @foreach (var item in Model) + { + + + + + + + + + + } + } + + +
ImgCódigoNombre / MarcaUbicaciónCategoríaEstadoAcciones
+ + No se encontraron artículos +
+ @if (!string.IsNullOrEmpty(item.ImagenUrl)) + { + Img + } + else + { +
+ +
+ } +
+ @item.Codigo + +
@item.Nombre
+ @if (!string.IsNullOrEmpty(item.Marca)) + { + @item.Marca @item.Modelo + } +
+ + @item.UbicacionNombre + @item.CategoriaNombre + + @item.EstadoNombre + + + +
+
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/Categorias/Create.cshtml b/RS_system/Views/Categorias/Create.cshtml new file mode 100644 index 0000000..3c28a07 --- /dev/null +++ b/RS_system/Views/Categorias/Create.cshtml @@ -0,0 +1,53 @@ +@model Rs_system.Models.Categoria +@{ + ViewData["Title"] = "Nueva Categoría"; +} + +
+
+

Nueva Categoría

+

Registrar una nueva categoría de inventario

+
+ + Volver + +
+ +
+
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+
Si está inactiva, no aparecerá en las selecciones de nuevos artículos.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Categorias/Edit.cshtml b/RS_system/Views/Categorias/Edit.cshtml new file mode 100644 index 0000000..c0c2713 --- /dev/null +++ b/RS_system/Views/Categorias/Edit.cshtml @@ -0,0 +1,54 @@ +@model Rs_system.Models.Categoria +@{ + ViewData["Title"] = "Editar Categoría"; +} + +
+
+

Editar Categoría

+

Modificar información de la categoría

+
+ + Volver + +
+ +
+
+
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+
Si está inactiva, no aparecerá en las selecciones de nuevos artículos.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Categorias/Index.cshtml b/RS_system/Views/Categorias/Index.cshtml new file mode 100644 index 0000000..1f19844 --- /dev/null +++ b/RS_system/Views/Categorias/Index.cshtml @@ -0,0 +1,117 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Categorías"; +} + +
+
+

Categorías de Inventario

+

Gestión de categorías para clasificación de artículos

+
+ + Nueva Categoría + +
+ +
+
+ + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var item in Model) + { + + + + + + + } + +
NombreDescripciónEstadoAcciones
+ + No hay categorías registradas +
+ @item.Nombre + + @if (!string.IsNullOrEmpty(item.Descripcion)) + { + @item.Descripcion + } + else + { + - + } + + @if (item.Activo) + { + Activo + } + else + { + Inactivo + } + + + + + +
+
+
+ + + + +@section Scripts { + +} diff --git a/RS_system/Views/Colaboracion/Create.cshtml b/RS_system/Views/Colaboracion/Create.cshtml new file mode 100644 index 0000000..86ef629 --- /dev/null +++ b/RS_system/Views/Colaboracion/Create.cshtml @@ -0,0 +1,453 @@ +@model Rs_system.Models.ViewModels.RegistrarColaboracionViewModel +@{ + ViewData["Title"] = "Nueva Colaboración"; +} + +
+
+

Nueva Colaboración

+

Registrar colaboración económica mensual

+
+ +
+ +
+
+
+ + +
+
Información del Miembro
+
+
+ + + + + + + + + +
+
+
+ + +
+
Período a Cubrir
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+ + +
+
Tipos de Colaboración
+
+ @if (Model.TiposDisponibles != null && Model.TiposDisponibles.Any()) + { + @foreach (var tipo in Model.TiposDisponibles) + { + var esTransporteOLimpieza = tipo.Nombre.Equals("Transporte", StringComparison.OrdinalIgnoreCase) || + tipo.Nombre.Equals("Limpieza", StringComparison.OrdinalIgnoreCase); + +
+
+ + +
+
+ } + } + else + { +
+
+ No hay tipos de colaboración activos. Gestionar tipos +
+
+ } +
+ +
+ + +
+
Priorización (Opcional)
+
+
+ + + + Si selecciona un tipo prioritario, el monto se asignará primero a ese tipo usando su monto sugerido, + y el resto se distribuirá equitativamente entre los demás tipos. + +
+
+
+ + +
+
Monto de la Colaboración
+
+
+ +
+ $ + +
+ + Monto total que entrega el miembro +
+
+ +
+
+
+ Meses a cubrir: + 0 +
+
+ Tipos seleccionados: + 0 +
+
+
+ Monto sugerido: + $0.00 +
+ +
+
+
+
+
+ + +
+ + + +
+ +
+ Cancelar + +
+
+
+ + @section Scripts { + +} diff --git a/RS_system/Views/Colaboracion/Details.cshtml b/RS_system/Views/Colaboracion/Details.cshtml new file mode 100644 index 0000000..c364b88 --- /dev/null +++ b/RS_system/Views/Colaboracion/Details.cshtml @@ -0,0 +1,130 @@ +@model Rs_system.Models.Colaboracion +@{ + ViewData["Title"] = "Detalle de Colaboración"; +} + +
+
+

Detalle de Colaboración #@Model.Id

+

Información completa de la colaboración

+
+ + Volver + +
+ +
+ +
+
+
Información de Registro
+ +
+ +
@Model.Miembro.Persona.Nombres @Model.Miembro.Persona.Apellidos
+
+ +
+ +
@Model.FechaRegistro.ToString("dd/MM/yyyy HH:mm")
+
+ +
+ +
@(Model.RegistradoPor ?? "Sistema")
+
+ +
+ +

$@Model.MontoTotal.ToString("N2")

+
+ + @if (!string.IsNullOrEmpty(Model.Observaciones)) + { +
+ +
@Model.Observaciones
+
+ } +
+
+ + +
+
+
Desglose por Tipo
+ + @{ + var porTipo = Model.Detalles.GroupBy(d => d.TipoColaboracion.Nombre); + } + + @foreach (var grupo in porTipo) + { +
+
+
@grupo.Key
+ @grupo.Count() meses +
+
+ Total: $@grupo.Sum(d => d.Monto).ToString("N2") +
+
+ } +
+
+
+ + +
+
Meses Cubiertos
+ +
+ + + + + + + + + + + @foreach (var detalle in Model.Detalles.OrderBy(d => d.Anio).ThenBy(d => d.Mes)) + { + + + + + + + } + + + + + + + +
MesAñoTipoMonto
+ @{ + var fecha = new DateTime(detalle.Anio, detalle.Mes, 1); + } + @fecha.ToString("MMMM", new System.Globalization.CultureInfo("es-ES")) + @detalle.Anio + @detalle.TipoColaboracion.Nombre + + $@detalle.Monto.ToString("N2") +
TOTAL: +
$@Model.Detalles.Sum(d => d.Monto).ToString("N2")
+
+
+
+ + diff --git a/RS_system/Views/Colaboracion/EstadoCuenta.cshtml b/RS_system/Views/Colaboracion/EstadoCuenta.cshtml new file mode 100644 index 0000000..08c7768 --- /dev/null +++ b/RS_system/Views/Colaboracion/EstadoCuenta.cshtml @@ -0,0 +1,133 @@ +@model Rs_system.Models.ViewModels.EstadoCuentaViewModel +@{ + ViewData["Title"] = "Estado de Cuenta"; +} + +
+
+

Estado de Cuenta

+

@Model.NombreMiembro

+
+
+ + + Volver + +
+
+ + +
+
+

ESTADO DE CUENTA DE COLABORACIONES

+
@Model.NombreMiembro
+

Fecha de consulta: @Model.FechaConsulta.ToString("dd/MM/yyyy HH:mm")

+
+
+
+
Total Aportado
+

$@Model.TotalAportado.ToString("N2")

+
+
+ + +@if (Model.HistorialPorTipos.Any()) +{ + @foreach (var historial in Model.HistorialPorTipos) + { +
+
+
+ @historial.TipoNombre +
+
+ Total: $@historial.TotalTipo.ToString("N2") +
+
+ +
+ + + + + + + + + + @foreach (var registro in historial.Registros.OrderByDescending(r => r.Anio).ThenByDescending(r => r.Mes)) + { + + + + + + } + + + + + + + +
Mes / AñoFecha de PagoMonto
@registro.MesTexto@registro.FechaRegistro.ToString("dd/MM/yyyy") + $@registro.Monto.ToString("N2") +
Subtotal @historial.TipoNombre: + $@historial.TotalTipo.ToString("N2") +
+
+
+ } + + +
+
+

TOTAL GENERAL

+

$@Model.TotalAportado.ToString("N2")

+
+
+} +else +{ +
+
+ + Este miembro aún no tiene colaboraciones registradas. +
+
+} + + +
+
+

Este documento es un comprobante de colaboraciones realizadas

+

Generado el @DateTime.Now.ToString("dd/MM/yyyy HH:mm")

+
+ + + +@section Scripts { + +} diff --git a/RS_system/Views/Colaboracion/Index.cshtml b/RS_system/Views/Colaboracion/Index.cshtml new file mode 100644 index 0000000..da4bf50 --- /dev/null +++ b/RS_system/Views/Colaboracion/Index.cshtml @@ -0,0 +1,147 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Colaboraciones"; +} + +
+
+

Colaboraciones Económicas

+

Registro de colaboraciones mensuales de los miembros

+
+ +
+ + +
+
+
+
Total Recaudado Hoy
+

+ $@Model.Where(c => c.FechaRegistro.Date == DateTime.Today).Sum(c => c.MontoTotal).ToString("N2") +

+
+
+
+
+
Colaboraciones Hoy
+

+ @Model.Count(c => c.FechaRegistro.Date == DateTime.Today) +

+
+
+
+
+
Total Registros
+

@Model.Count()

+
+
+
+ + +
+
+ + + + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var colaboracion in Model) + { + + + + + + + + + + } + +
FechaMiembroTiposPeríodoMontoRegistrado porAcciones
+ + No hay colaboraciones registradas +
+ @colaboracion.FechaRegistro.ToString("dd/MM/yyyy")
+ @colaboracion.FechaRegistro.ToString("HH:mm") +
+ @colaboracion.Miembro.Persona.Nombres @colaboracion.Miembro.Persona.Apellidos + + @{ + var tipos = colaboracion.Detalles.Select(d => d.TipoColaboracion.Nombre).Distinct(); + } + @foreach (var tipo in tipos) + { + @tipo + } + + @{ + var ordenados = colaboracion.Detalles.OrderBy(d => d.Anio).ThenBy(d => d.Mes).ToList(); + var primero = ordenados.First(); + var ultimo = ordenados.Last(); + + if (primero.Anio == ultimo.Anio && primero.Mes == ultimo.Mes) + { + var fecha = new DateTime(primero.Anio, primero.Mes, 1); + @fecha.ToString("MMMM yyyy", new System.Globalization.CultureInfo("es-ES")) + } + else + { + var fechaInicio = new DateTime(primero.Anio, primero.Mes, 1); + var fechaFin = new DateTime(ultimo.Anio, ultimo.Mes, 1); + @fechaInicio.ToString("MMM yyyy", new System.Globalization.CultureInfo("es-ES")) - @fechaFin.ToString("MMM yyyy", new System.Globalization.CultureInfo("es-ES")) + } + } + + $@colaboracion.MontoTotal.ToString("N2") + + @(colaboracion.RegistradoPor ?? "Sistema") + + + + + + + +
+
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/Colaboracion/Reporte.cshtml b/RS_system/Views/Colaboracion/Reporte.cshtml new file mode 100644 index 0000000..452e504 --- /dev/null +++ b/RS_system/Views/Colaboracion/Reporte.cshtml @@ -0,0 +1,150 @@ +@model Rs_system.Models.ViewModels.ReporteColaboracionesViewModel +@{ + ViewData["Title"] = "Reporte de Colaboraciones"; +} + +
+
+

Reporte de Colaboraciones

+

+ Del @Model.FechaInicio.ToString("dd/MM/yyyy") al @Model.FechaFin.ToString("dd/MM/yyyy") +

+
+
+ + + Nuevo Reporte + +
+
+ + +
+
+
+
Total Recaudado
+

$@Model.TotalRecaudado.ToString("N2")

+
+
+
+
+
Total Movimientos
+

@Model.Movimientos.Count

+
+
+
+
+
Tipos de Colaboración
+

@Model.DesglosePorTipos.Count

+
+
+
+ + +
+
Desglose por Tipo de Colaboración
+ + @if (Model.DesglosePorTipos.Any()) + { +
+ + + + + + + + + + @foreach (var tipo in Model.DesglosePorTipos.OrderByDescending(t => t.TotalRecaudado)) + { + + + + + + } + + + + + + + +
Tipo de ColaboraciónCantidad de MesesTotal Recaudado
+ @tipo.TipoNombre + @tipo.CantidadMeses + $@tipo.TotalRecaudado.ToString("N2") +
TOTAL: +
$@Model.TotalRecaudado.ToString("N2")
+
+
+ } + else + { +
+ No hay datos para el período seleccionado. +
+ } +
+ + +
+
Detalle de Movimientos
+ + @if (Model.Movimientos.Any()) + { +
+ + + + + + + + + + + + @foreach (var movimiento in Model.Movimientos.OrderByDescending(m => m.Fecha)) + { + + + + + + + + } + +
FechaMiembroTiposPeríodo CubiertoMonto
@movimiento.Fecha.ToString("dd/MM/yyyy HH:mm")@movimiento.NombreMiembro + @foreach (var tipo in movimiento.TiposColaboracion.Split(", ")) + { + @tipo + } + @movimiento.PeriodoCubierto + $@movimiento.Monto.ToString("N2") +
+
+ } + else + { +
+ No hay movimientos registrados en este período. +
+ } +
+ + diff --git a/RS_system/Views/Colaboracion/Reportes.cshtml b/RS_system/Views/Colaboracion/Reportes.cshtml new file mode 100644 index 0000000..83cd1b6 --- /dev/null +++ b/RS_system/Views/Colaboracion/Reportes.cshtml @@ -0,0 +1,118 @@ +@{ + ViewData["Title"] = "Reportes de Colaboraciones"; +} + +
+
+

Reportes de Colaboraciones

+

Generar reportes por rango de fechas

+
+ + Volver + +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
Accesos Rápidos
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/Contabilidad/Create.cshtml b/RS_system/Views/Contabilidad/Create.cshtml new file mode 100644 index 0000000..81d3c23 --- /dev/null +++ b/RS_system/Views/Contabilidad/Create.cshtml @@ -0,0 +1,64 @@ +@model Rs_system.Models.ContabilidadRegistro +@{ + ViewData["Title"] = "Nuevo Registro Contable"; +} + +
+
+
+
+
Nuevo Movimiento
+
+
+
+
+ +
+ + + +
+ +
+
+ + + +
+
+ + + +
+
+ +
+ +
+ $ + +
+ +
+ +
+ + + +
+ +
+ Cancelar + +
+
+
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Contabilidad/Index.cshtml b/RS_system/Views/Contabilidad/Index.cshtml new file mode 100644 index 0000000..846d23b --- /dev/null +++ b/RS_system/Views/Contabilidad/Index.cshtml @@ -0,0 +1,140 @@ +@using Rs_system.Models +@model List +@{ + ViewData["Title"] = "Contabilidad Mensual"; + var grupoId = ViewBag.GrupoId as long?; +} + +
+
+

Contabilidad Mensual

+

Gestión de reportes financieros por grupo

+
+
+ +
+
+
+
+ + +
+
+ +
+
+
+
+ +@if (grupoId.HasValue) +{ + @if (Model != null && Model.Any()) + { +
+
+ + + + + + + + + + + + @foreach (var item in Model) + { + + + + + + + + } + +
Mes / AñoSaldo InicialEstadoFecha CreaciónAcciones
@item.NombreMes @item.Anio@item.SaldoInicial.ToString("C") + @if (item.Cerrado) + { + Cerrado + } + else + { + Abierto + } + @item.FechaCreacion.ToLocalTime().ToString("dd/MM/yyyy HH:mm") + + @(item.Cerrado ? "Ver Detalles" : "Gestionar Registros") + +
+
+
+ } + else + { +
+ +
No hay reportes mensuales para este grupo
+

Haga clic en "Abrir Nuevo Mes" para comenzar el registro contable de este mes.

+
+ } +} +else +{ +
+ +
Seleccione un grupo para ver sus reportes mensuales
+
+} + + + + diff --git a/RS_system/Views/Contabilidad/RegistroMensual.cshtml b/RS_system/Views/Contabilidad/RegistroMensual.cshtml new file mode 100644 index 0000000..c15f7b5 --- /dev/null +++ b/RS_system/Views/Contabilidad/RegistroMensual.cshtml @@ -0,0 +1,261 @@ +@model Rs_system.Models.ReporteMensualContable +@{ + ViewData["Title"] = $"Reporte {Model.NombreMes} {Model.Anio}"; +} + +
+
+

@Model.GrupoTrabajo.Nombre - @Model.NombreMes @Model.Anio

+
+ @if (Model.Cerrado) + { + REPORTE CERRADO + } + else + { + REPORTE ABIERTO + } + Creado el @Model.FechaCreacion.ToLocalTime().ToString("dd/MM/yyyy") +
+
+
+ + Volver a Planilla + + @if (!Model.Cerrado) + { +
+ +
+ } +
+
+ +
+
+
+ Saldo Inicial +

@Model.SaldoInicial.ToString("N2")

+
+
+
+
+ Ingresos (+) +

0.00

+
+
+
+
+ Egresos (-) +

0.00

+
+
+
+
+ Saldo Final (=) +

0.00

+
+
+
+ +
+
+
Registros de Movimientos
+ @if (!Model.Cerrado) + { +
+ + +
+ } +
+
+
+ + + + + + + + + @if(!Model.Cerrado) { } + + + + @if (Model.Registros != null && Model.Registros.Any()) + { + int count = 1; + foreach (var item in Model.Registros.OrderBy(r => r.Fecha)) + { + + + + + + + @if(!Model.Cerrado) { + + } + + count++; + } + } + + @if(!Model.Cerrado) { + + + + + + } +
#FechaTipoDescripciónMonto
@count + + + +
+ +
+
+
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/ContabilidadGeneral/Consolidado.cshtml b/RS_system/Views/ContabilidadGeneral/Consolidado.cshtml new file mode 100644 index 0000000..3516212 --- /dev/null +++ b/RS_system/Views/ContabilidadGeneral/Consolidado.cshtml @@ -0,0 +1,164 @@ +@model Rs_system.Models.ReporteMensualGeneral +@{ + ViewData["Title"] = $"Consolidado - {Model.NombreMes} {Model.Anio}"; + var ingresosPorCat = ViewBag.ConsolidadoIngresos as Dictionary ?? new Dictionary(); + var egresosPorCat = ViewBag.ConsolidadoEgresos as Dictionary ?? new Dictionary(); + + var totalIngresosMes = ingresosPorCat.Values.Sum(); + var totalEgresosMes = egresosPorCat.Values.Sum(); + var saldoFinal = Model.SaldoInicial + totalIngresosMes - totalEgresosMes; +} + +
+
+

Consolidado: @Model.NombreMes @Model.Anio

+ +
+ + +
+
+
+
+
+
+
Saldo Inicial
+
@Model.SaldoInicial.ToString("C")
+
+
+
+
+
+ +
+
+
+
+
+
Total Ingresos
+
@totalIngresosMes.ToString("C")
+
+
+
+
+
+ +
+
+
+
+
+
Total Egresos
+
@totalEgresosMes.ToString("C")
+
+
+
+
+
+ +
+
+
+
+
+
Saldo Final
+
@saldoFinal.ToString("C")
+
+
+
+
+
+
+ +
+ +
+
+
+
Desglose de Ingresos
+
+
+
+ + + + + + + + + + @foreach (var item in ingresosPorCat.OrderByDescending(x => x.Value)) + { + var porcentaje = totalIngresosMes > 0 ? (item.Value / totalIngresosMes) * 100 : 0; + + + + + + } + + + + + + + + +
CategoríaMonto%
@item.Key@item.Value.ToString("C")@porcentaje.ToString("F1")%
Total@totalIngresosMes.ToString("C")100%
+
+
+
+
+ + +
+
+
+
Desglose de Egresos
+
+
+
+ + + + + + + + + + @foreach (var item in egresosPorCat.OrderByDescending(x => x.Value)) + { + var porcentaje = totalEgresosMes > 0 ? (item.Value / totalEgresosMes) * 100 : 0; + + + + + + } + + + + + + + + +
CategoríaMonto%
@item.Key@item.Value.ToString("C")@porcentaje.ToString("F1")%
Total@totalEgresosMes.ToString("C")100%
+
+
+
+
+
+
diff --git a/RS_system/Views/ContabilidadGeneral/GestionCategorias.cshtml b/RS_system/Views/ContabilidadGeneral/GestionCategorias.cshtml new file mode 100644 index 0000000..0a6864b --- /dev/null +++ b/RS_system/Views/ContabilidadGeneral/GestionCategorias.cshtml @@ -0,0 +1,222 @@ +@{ + ViewData["Title"] = "Gestión de Categorías"; + var categoriasIngreso = ViewBag.CategoriasIngreso as List; + var categoriasEgreso = ViewBag.CategoriasEgreso as List; +} + +
+
+

Gestión de Categorías

+ + Volver + +
+ + @if (TempData["Success"] != null) + { +
@TempData["Success"]
+ } + +
+ +
+
+
+
Categorías de Ingreso
+ +
+
+
+ + + + + + + + + + @foreach (var item in categoriasIngreso) + { + + + + + + } + +
NombreDescripciónAcciones
@item.Nombre@item.Descripcion + +
+ +
+
+
+
+
+
+ + +
+
+
+
Categorías de Egreso
+ +
+
+
+ + + + + + + + + + @foreach (var item in categoriasEgreso) + { + + + + + + } + +
NombreDescripciónAcciones
@item.Nombre@item.Descripcion + +
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + +@section Scripts { + +} diff --git a/RS_system/Views/ContabilidadGeneral/Index.cshtml b/RS_system/Views/ContabilidadGeneral/Index.cshtml new file mode 100644 index 0000000..6885236 --- /dev/null +++ b/RS_system/Views/ContabilidadGeneral/Index.cshtml @@ -0,0 +1,124 @@ +@model List + +@{ + ViewData["Title"] = "Contabilidad General"; + var anioActual = ViewBag.Anio; +} + +
+
+

Contabilidad General

+ +
+ + +
+
+ + @if (TempData["Error"] != null) + { +
@TempData["Error"]
+ } + +
+
+
+
+
Reportes Mensuales @anioActual
+
+ + Gestionar Categorías + + + +
+
+
+
+ + + + + + + + + + + @foreach (var item in Model) + { + + + + + + + } + @if (!Model.Any()) + { + + + + } + +
MesSaldo InicialEstadoAcciones
@item.NombreMes@item.SaldoInicial.ToString("C") + @if (item.Cerrado) + { + Cerrado + } + else + { + Abierto + } + + + Gestionar + + + Ver Consolidado + +
No hay reportes para este año.
+
+
+
+
+
+
+ + + diff --git a/RS_system/Views/ContabilidadGeneral/RegistroMensual.cshtml b/RS_system/Views/ContabilidadGeneral/RegistroMensual.cshtml new file mode 100644 index 0000000..278a48e --- /dev/null +++ b/RS_system/Views/ContabilidadGeneral/RegistroMensual.cshtml @@ -0,0 +1,479 @@ +@model Rs_system.Models.ReporteMensualGeneral +@{ + ViewData["Title"] = $"Registro - {Model.NombreMes} {Model.Anio}"; + var categoriasIngreso = ViewBag.CategoriasIngreso as List; + var categoriasEgreso = ViewBag.CategoriasEgreso as List; +} + +
+
+
+

Registro Mensual: @Model.NombreMes @Model.Anio

+
+ Saldo Actual: @ViewBag.SaldoActual?.ToString("C") +
+
+
+ + Volver + + @if (!Model.Cerrado) + { + +
+ +
+ } + else + { + Mes Cerrado + } +
+
+ + @if (TempData["Success"] != null) + { + + } + + @if (TempData["Error"] != null) + { + + } + +
+
+
+ + + + + + + + + + + + @if (!Model.Cerrado) + { + + } + + + + + + @if (!Model.Cerrado) + { + + + + + + } +
#FechaTipoCategoríaDescripciónComprobanteMonto
+ +
+
+
+
+
+ + + + +@section Scripts { + +} diff --git a/RS_system/Views/Estados/Create.cshtml b/RS_system/Views/Estados/Create.cshtml new file mode 100644 index 0000000..abef083 --- /dev/null +++ b/RS_system/Views/Estados/Create.cshtml @@ -0,0 +1,67 @@ +@model Rs_system.Models.EstadoArticulo +@{ + ViewData["Title"] = "Nuevo Estado"; +} + +
+
+

Nuevo Estado

+

Registrar un nuevo estado para clasificación

+
+ + Volver + +
+ +
+
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + +
Color que se usará para mostrar el estado en las listas.
+ +
+ +
+
+ + +
+
Si está inactivo, no aparecerá en las selecciones.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Estados/Edit.cshtml b/RS_system/Views/Estados/Edit.cshtml new file mode 100644 index 0000000..635abda --- /dev/null +++ b/RS_system/Views/Estados/Edit.cshtml @@ -0,0 +1,68 @@ +@model Rs_system.Models.EstadoArticulo +@{ + ViewData["Title"] = "Editar Estado"; +} + +
+
+

Editar Estado

+

Modificar información del estado

+
+ + Volver + +
+ +
+
+
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + +
Color que se usará para mostrar el estado en las listas.
+ +
+ +
+
+ + +
+
Si está inactivo, no aparecerá en las selecciones.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Estados/Index.cshtml b/RS_system/Views/Estados/Index.cshtml new file mode 100644 index 0000000..b85163b --- /dev/null +++ b/RS_system/Views/Estados/Index.cshtml @@ -0,0 +1,121 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Estados de Artículos"; +} + +
+
+

Estados de Artículos

+

Gestión de estados para bienes e inventario

+
+ + Nuevo Estado + +
+ +
+
+ + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var item in Model) + { + + + + + + + + } + +
NombreDescripciónEtiqueta VisualEstadoAcciones
+ + No hay estados registrados +
+ @item.Nombre + + @if (!string.IsNullOrEmpty(item.Descripcion)) + { + @item.Descripcion + } + else + { + - + } + + @item.Nombre + + @if (item.Activo) + { + Activo + } + else + { + Inactivo + } + + + + + +
+
+
+ + + + +@section Scripts { + +} diff --git a/RS_system/Views/MovimientosInventario/Create.cshtml b/RS_system/Views/MovimientosInventario/Create.cshtml new file mode 100644 index 0000000..ee214f6 --- /dev/null +++ b/RS_system/Views/MovimientosInventario/Create.cshtml @@ -0,0 +1,298 @@ +@model dynamic +@{ + ViewData["Title"] = "Nuevo Movimiento"; +} + +
+
+

Registrar Movimiento

+

Traslados, bajas o cambios de estado

+
+ + Cancelar + +
+ +
+ +
+
+
+
1. Seleccionar Artículo
+
+
+
+
+ + +
Seleccione para cargar datos actuales.
+
+
+ + @if (ViewBag.ArticuloId != null) + { +
+
Estado Actual
+
Ubicación: @ViewBag.UbicacionActual
+
Estado: @ViewBag.EstadoActual
+
+ } +
+
+
+ + +
+ @if (ViewBag.ArticuloId != null) + { +
+
+ +
+
+
+ + +
+
+ +
Registrar Entrada de Inventario (Compra/Reingreso)
+ +
+ + Esta acción aumentará el stock actual del artículo. +
+ +
+ + @if (ViewBag.TipoControl == "LOTE") + { + + } + else + { + +
Para artículos unitarios, la cantidad es siempre 1.
+ } +
+ +
+ + +
+ + +
+
+ + +
+
+ +
Registrar Traslado de Ubicación
+ + @if (ViewBag.TipoControl == "LOTE") + { +
+
+ Control por Lote: Especifique la cantidad a mover. + Global: @ViewBag.CantidadGlobal +
+
+
+ + +
+ } + +
+ + +
+
+ + +
+ +
+
+ + +
+
+ +
Registrar Cambio de Condición
+ +
+ + @if(ViewBag.TipoControl == "LOTE") { + El cambio de estado aplicará a todo el lote (@ViewBag.CantidadGlobal unidades). + } else { + El cambio de estado aplica a la unidad única. + } +
+ +
+ + +
+
+ + +
+ +
+
+ + +
+
+ +
Registrar Préstamo a Persona
+ + @if (ViewBag.TipoControl == "LOTE") + { +
+
+ Control por Lote: Especifique la cantidad a prestar. + Disponible: @ViewBag.CantidadGlobal +
+
+
+ + +
+ } + +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+ + +
Fecha aproximada de devolución del artículo.
+
+ +
+ + +
+ +
+ + Se generarán códigos individuales para cada artículo prestado (ej: sp-b20-001, sp-b20-002, ...) +
+ + +
+
+ + +
+
+ +
Registrar Baja de Activo
+ + @if (ViewBag.TipoControl == "LOTE") + { +
+ + +
Esto restará del stock global.
+
+ } + else + { +
+ + Atención: Esta acción marcará el artículo como inactivo. +
+ } + +
+ + +
+ +
+
+ +
+
+
+ } + else + { +
+
+ +
Seleccione un artículo para comenzar
+

Use el panel de la izquierda para buscar el activo.

+
+
+ } +
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/MovimientosInventario/Index.cshtml b/RS_system/Views/MovimientosInventario/Index.cshtml new file mode 100644 index 0000000..8bd82c0 --- /dev/null +++ b/RS_system/Views/MovimientosInventario/Index.cshtml @@ -0,0 +1,128 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Historial de Movimientos"; +} + +
+
+

Historial de Movimientos

+

Registro de traslados, bajas y cambios de estado

+
+ + Nuevo Movimiento + +
+ +
+
+ + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var item in Model) + { + + + + + + + + } + +
FechaArtículoTipoDetallesUsuario
+ + No hay movimientos registrados +
+
@item.Fecha.ToLocalTime().ToString("dd/MM/yyyy")
+ @item.Fecha.ToLocalTime().ToString("HH:mm") +
+
@item.Articulo?.Codigo
+ @item.Articulo?.Nombre +
+ @switch (item.TipoMovimiento) + { + case "ENTRADA": + ENTRADA + break; + case "TRASLADO": + TRASLADO + break; + case "BAJA": + BAJA + break; + case "PRESTAMO": + PRESTAMO + break; + case "DEVOLUCION": + DEVOLUCIÓN + break; + case "CAMBIO_ESTADO": + ESTADO + break; + default: + @item.TipoMovimiento + break; + } + + @if (item.TipoMovimiento == "TRASLADO") + { +
+ @item.UbicacionOrigen?.Nombre + + @item.UbicacionDestino?.Nombre +
+ } + else if (item.TipoMovimiento == "CAMBIO_ESTADO") + { +
+ @item.EstadoAnterior?.Nombre + + @item.EstadoNuevo?.Nombre +
+ } + + @if (item.Cantidad > 1 || item.Articulo?.TipoControl == "LOTE") + { +
+ Cantidad: @item.Cantidad +
+ } + + @if (!string.IsNullOrEmpty(item.Observacion)) + { +
+ @item.Observacion +
+ } +
+ @item.UsuarioId +
+
+
+ +@section Scripts { + +} diff --git a/RS_system/Views/MovimientosInventario/PrestamosActivos.cshtml b/RS_system/Views/MovimientosInventario/PrestamosActivos.cshtml new file mode 100644 index 0000000..65b1f8b --- /dev/null +++ b/RS_system/Views/MovimientosInventario/PrestamosActivos.cshtml @@ -0,0 +1,156 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Préstamos Activos"; +} + +
+
+

Préstamos Activos

+

Artículos actualmente prestados

+
+ +
+ +
+
+ @if (!Model.Any()) + { +
+ +
No hay préstamos activos
+

Todos los artículos han sido devueltos.

+
+ } + else + { +
+ + + + + + + + + + + + + + @foreach (var prestamo in Model) + { + + + + + + + + + + } + +
ArtículoPersonaCantidadFecha PréstamoDevolución EstimadaEstadoAcciones
+
@prestamo.Articulo?.Codigo
+
@prestamo.Articulo?.Nombre
+
+
@prestamo.PersonaNombre
+ @if (!string.IsNullOrEmpty(prestamo.PersonaIdentificacion)) + { +
@prestamo.PersonaIdentificacion
+ } +
+ @prestamo.Cantidad + @prestamo.FechaPrestamo.ToString("dd/MM/yyyy") + @if (prestamo.FechaDevolucionEstimada.HasValue) + { + var diasRestantes = (prestamo.FechaDevolucionEstimada.Value - DateTime.Today).Days; + var claseCss = diasRestantes < 0 ? "text-danger" : diasRestantes <= 3 ? "text-warning" : "text-success"; + @prestamo.FechaDevolucionEstimada.Value.ToString("dd/MM/yyyy") + } + else + { + No definida + } + + @switch (prestamo.Estado) + { + case "ACTIVO": + Activo + break; + case "ATRASADO": + Atrasado + break; + default: + @prestamo.Estado + break; + } + +
+ +
+ + +
+
+
+
+ } +
+
+ + + + +@section Scripts { + +} \ No newline at end of file diff --git a/RS_system/Views/TipoColaboracion/Create.cshtml b/RS_system/Views/TipoColaboracion/Create.cshtml new file mode 100644 index 0000000..db5d7b2 --- /dev/null +++ b/RS_system/Views/TipoColaboracion/Create.cshtml @@ -0,0 +1,63 @@ +@model Rs_system.Models.TipoColaboracion +@{ + ViewData["Title"] = "Nuevo Tipo de Colaboración"; +} + +
+
+

Nuevo Tipo de Colaboración

+

Crear un nuevo tipo de colaboración

+
+ + Volver + +
+ +
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+
+ +
+ $ + +
+ +
+
+ + + + Orden de aparición en las listas +
+
+ +
+
+ + +
+
+ +
+ Cancelar + +
+
+
diff --git a/RS_system/Views/TipoColaboracion/Edit.cshtml b/RS_system/Views/TipoColaboracion/Edit.cshtml new file mode 100644 index 0000000..5d345b0 --- /dev/null +++ b/RS_system/Views/TipoColaboracion/Edit.cshtml @@ -0,0 +1,65 @@ +@model Rs_system.Models.TipoColaboracion +@{ + ViewData["Title"] = "Editar Tipo de Colaboración"; +} + +
+
+

Editar Tipo de Colaboración

+

Modificar tipo de colaboración existente

+
+ + Volver + +
+ +
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ +
+ $ + +
+ +
+
+ + + +
+
+ +
+
+ + +
+
+ +
+ Cancelar + +
+
+
diff --git a/RS_system/Views/TipoColaboracion/Index.cshtml b/RS_system/Views/TipoColaboracion/Index.cshtml new file mode 100644 index 0000000..5d126a4 --- /dev/null +++ b/RS_system/Views/TipoColaboracion/Index.cshtml @@ -0,0 +1,112 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Tipos de Colaboración"; +} + +
+
+

Tipos de Colaboración

+

Gestión de tipos de colaboración económica

+
+ + Nuevo Tipo + +
+ +
+
+ + + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var tipo in Model) + { + + + + + + + + + } + +
OrdenNombreDescripciónMonto SugeridoEstadoAcciones
+ + No hay tipos de colaboración registrados +
@tipo.Orden@tipo.Nombre@(tipo.Descripcion ?? "-")$@tipo.MontoSugerido.ToString("N2") + @if (tipo.Activo) + { + Activo + } + else + { + Inactivo + } + + + + + @if (tipo.Activo) + { + + } +
+
+
+ + + + +@section Scripts { + +} diff --git a/RS_system/Views/Ubicaciones/Create.cshtml b/RS_system/Views/Ubicaciones/Create.cshtml new file mode 100644 index 0000000..2f02151 --- /dev/null +++ b/RS_system/Views/Ubicaciones/Create.cshtml @@ -0,0 +1,63 @@ +@model Rs_system.Models.Ubicacion +@{ + ViewData["Title"] = "Nueva Ubicación"; +} + +
+
+

Nueva Ubicación

+

Registrar un nuevo lugar de almacenamiento

+
+ + Volver + +
+ +
+
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ + +
+
Persona a cargo de esta ubicación (opcional).
+ +
+ +
+
+ + +
+
Si está inactiva, no se podrá asignar a nuevos artículos.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Ubicaciones/Edit.cshtml b/RS_system/Views/Ubicaciones/Edit.cshtml new file mode 100644 index 0000000..661bbe6 --- /dev/null +++ b/RS_system/Views/Ubicaciones/Edit.cshtml @@ -0,0 +1,64 @@ +@model Rs_system.Models.Ubicacion +@{ + ViewData["Title"] = "Editar Ubicación"; +} + +
+
+

Editar Ubicación

+

Modificar información del lugar

+
+ + Volver + +
+ +
+
+
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ + +
+
Persona a cargo de esta ubicación (opcional).
+ +
+ +
+
+ + +
+
Si está inactiva, no se podrá asignar a nuevos artículos.
+
+ +
+ Cancelar + +
+
+
+
+ +@section Scripts { + @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} +} diff --git a/RS_system/Views/Ubicaciones/Index.cshtml b/RS_system/Views/Ubicaciones/Index.cshtml new file mode 100644 index 0000000..0221fa9 --- /dev/null +++ b/RS_system/Views/Ubicaciones/Index.cshtml @@ -0,0 +1,131 @@ +@model IEnumerable +@{ + ViewData["Title"] = "Ubicaciones de Inventario"; +} + +
+
+

Ubicaciones de Inventario

+

Gestión de lugares físicos de almacenamiento

+
+ + Nueva Ubicación + +
+ +
+
+ + + + + + + + + + + + @if (!Model.Any()) + { + + + + } + @foreach (var item in Model) + { + + + + + + + + } + +
NombreDescripciónResponsableEstadoAcciones
+ + No hay ubicaciones registradas +
+ @item.Nombre + + @if (!string.IsNullOrEmpty(item.Descripcion)) + { + @item.Descripcion + } + else + { + - + } + + @if (!string.IsNullOrEmpty(item.Responsable)) + { +
+ + @item.Responsable +
+ } + else + { + - + } +
+ @if (item.Activo) + { + Activo + } + else + { + Inactivo + } + + + + + +
+
+
+ + + + +@section Scripts { + +} diff --git a/RS_system/sql_colaboraciones.sql b/RS_system/sql_colaboraciones.sql new file mode 100644 index 0000000..96d8398 --- /dev/null +++ b/RS_system/sql_colaboraciones.sql @@ -0,0 +1,103 @@ +-- ============================================= +-- Script SQL: Módulo de Colaboraciones Económicas +-- Descripción: Crea las tablas para gestionar colaboraciones mensuales +-- Autor: Sistema +-- Fecha: 2026-02-01 +-- ============================================= + +-- Tabla 1: Tipos de Colaboración (configurable) +CREATE TABLE IF NOT EXISTS public.tipos_colaboracion +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion text COLLATE pg_catalog."default", + monto_sugerido decimal(10, 2) NOT NULL DEFAULT 0, + activo boolean NOT NULL DEFAULT true, + orden integer NOT NULL DEFAULT 0, + creado_en timestamp with time zone NOT NULL DEFAULT now(), + actualizado_en timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT pk_tipos_colaboracion PRIMARY KEY (id) +); + +COMMENT ON TABLE public.tipos_colaboracion IS 'Catálogo de tipos de colaboración (Transporte, Limpieza, etc.)'; +COMMENT ON COLUMN public.tipos_colaboracion.nombre IS 'Nombre del tipo de colaboración'; +COMMENT ON COLUMN public.tipos_colaboracion.monto_sugerido IS 'Cuota sugerida mensual'; +COMMENT ON COLUMN public.tipos_colaboracion.orden IS 'Orden de presentación en UI'; + +-- Datos iniciales +INSERT INTO public.tipos_colaboracion (nombre, descripcion, monto_sugerido, orden) +VALUES + ('Transporte', 'Colaboración mensual para transporte', 1.00, 1), + ('Limpieza', 'Colaboración mensual para limpieza', 1.00, 2) +ON CONFLICT DO NOTHING; + +-- ============================================= + +-- Tabla 2: Colaboraciones (cabecera de transacción) +CREATE TABLE IF NOT EXISTS public.colaboraciones +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + miembro_id bigint NOT NULL, + fecha_registro timestamp with time zone NOT NULL DEFAULT now(), + monto_total decimal(10, 2) NOT NULL, + observaciones text COLLATE pg_catalog."default", + registrado_por character varying(100) COLLATE pg_catalog."default", + creado_en timestamp with time zone NOT NULL DEFAULT now(), + actualizado_en timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT pk_colaboraciones PRIMARY KEY (id), + CONSTRAINT fk_colaboraciones_miembro FOREIGN KEY (miembro_id) + REFERENCES public.miembros (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT +); + +COMMENT ON TABLE public.colaboraciones IS 'Registro de transacciones de colaboración'; +COMMENT ON COLUMN public.colaboraciones.miembro_id IS 'Miembro que realizó el pago'; +COMMENT ON COLUMN public.colaboraciones.monto_total IS 'Monto total de la transacción'; +COMMENT ON COLUMN public.colaboraciones.registrado_por IS 'Usuario que registró el pago'; + +-- Índices para optimizar búsquedas +CREATE INDEX IF NOT EXISTS idx_colaboraciones_miembro ON public.colaboraciones(miembro_id); +CREATE INDEX IF NOT EXISTS idx_colaboraciones_fecha ON public.colaboraciones(fecha_registro); + +-- ============================================= + +-- Tabla 3: Detalle de Colaboraciones (desglose mensual) +CREATE TABLE IF NOT EXISTS public.detalle_colaboraciones +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + colaboracion_id bigint NOT NULL, + tipo_colaboracion_id bigint NOT NULL, + mes integer NOT NULL, + anio integer NOT NULL, + monto decimal(10, 2) NOT NULL, + creado_en timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT pk_detalle_colaboraciones PRIMARY KEY (id), + CONSTRAINT fk_detalle_colaboracion FOREIGN KEY (colaboracion_id) + REFERENCES public.colaboraciones (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE CASCADE, + CONSTRAINT fk_detalle_tipo FOREIGN KEY (tipo_colaboracion_id) + REFERENCES public.tipos_colaboracion (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT, + CONSTRAINT chk_mes_valido CHECK (mes >= 1 AND mes <= 12), + CONSTRAINT chk_anio_valido CHECK (anio >= 2000 AND anio <= 2100) +); + +COMMENT ON TABLE public.detalle_colaboraciones IS 'Desglose mensual de cada colaboración'; +COMMENT ON COLUMN public.detalle_colaboraciones.mes IS 'Mes cubierto (1-12)'; +COMMENT ON COLUMN public.detalle_colaboraciones.anio IS 'Año cubierto'; +COMMENT ON COLUMN public.detalle_colaboraciones.monto IS 'Monto para este mes/tipo específico'; + +-- Índices para reportes y búsquedas +CREATE INDEX IF NOT EXISTS idx_detalle_tipo ON public.detalle_colaboraciones(tipo_colaboracion_id); +CREATE INDEX IF NOT EXISTS idx_detalle_periodo ON public.detalle_colaboraciones(anio, mes); + +-- Índice único para evitar duplicados (mismo mes/año/tipo en misma colaboración) +CREATE UNIQUE INDEX IF NOT EXISTS idx_detalle_unico +ON public.detalle_colaboraciones(colaboracion_id, tipo_colaboracion_id, mes, anio); + +-- ============================================= +-- FIN DEL SCRIPT +-- ============================================= diff --git a/RS_system/sql_contabilidad_adjuntos.sql b/RS_system/sql_contabilidad_adjuntos.sql new file mode 100644 index 0000000..43ac964 --- /dev/null +++ b/RS_system/sql_contabilidad_adjuntos.sql @@ -0,0 +1,17 @@ +-- Tabla: movimientos_generales_adjuntos +CREATE TABLE IF NOT EXISTS public.movimientos_generales_adjuntos +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + movimiento_general_id bigint NOT NULL, + nombre_archivo character varying(255) COLLATE pg_catalog."default" NOT NULL, + ruta_archivo character varying(500) COLLATE pg_catalog."default" NOT NULL, + tipo_contenido character varying(100) COLLATE pg_catalog."default", + fecha_subida timestamp without time zone NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + CONSTRAINT pk_movimientos_generales_adjuntos PRIMARY KEY (id), + CONSTRAINT fk_adjuntos_movimiento FOREIGN KEY (movimiento_general_id) + REFERENCES public.movimientos_generales (id) + ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS idx_adjuntos_movimiento + ON public.movimientos_generales_adjuntos (movimiento_general_id); diff --git a/RS_system/sql_contabilidad_general.sql b/RS_system/sql_contabilidad_general.sql new file mode 100644 index 0000000..906542d --- /dev/null +++ b/RS_system/sql_contabilidad_general.sql @@ -0,0 +1,171 @@ +-- ===================================================== +-- Script SQL para Sistema de Contabilidad General +-- Base de datos: PostgreSQL +-- Fecha: 2026-01-28 +-- ===================================================== + +-- ===================================================== +-- 1. CREAR TABLAS +-- ===================================================== + +-- Tabla: categorias_ingreso +CREATE TABLE IF NOT EXISTS public.categorias_ingreso +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(255) COLLATE pg_catalog."default", + activa boolean NOT NULL DEFAULT true, + fecha_creacion timestamp without time zone NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + CONSTRAINT pk_categorias_ingreso PRIMARY KEY (id) +); + +-- Tabla: categorias_egreso +CREATE TABLE IF NOT EXISTS public.categorias_egreso +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + nombre character varying(100) COLLATE pg_catalog."default" NOT NULL, + descripcion character varying(255) COLLATE pg_catalog."default", + activa boolean NOT NULL DEFAULT true, + fecha_creacion timestamp without time zone NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + CONSTRAINT pk_categorias_egreso PRIMARY KEY (id) +); + +-- Tabla: reportes_mensuales_generales +CREATE TABLE IF NOT EXISTS public.reportes_mensuales_generales +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + mes integer NOT NULL, + anio integer NOT NULL, + saldo_inicial numeric(18,2) NOT NULL DEFAULT 0, + fecha_creacion timestamp without time zone NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + cerrado boolean NOT NULL DEFAULT false, + CONSTRAINT pk_reportes_mensuales_generales PRIMARY KEY (id), + CONSTRAINT uk_mes_anio_general UNIQUE (mes, anio), + CONSTRAINT ck_mes_rango CHECK (mes >= 1 AND mes <= 12), + CONSTRAINT ck_anio_valido CHECK (anio >= 2000 AND anio <= 2100) +); + +-- Crear tipo enum para tipo_movimiento_general si no existe +DO $$ BEGIN + CREATE TYPE tipo_movimiento_general AS ENUM ('Ingreso', 'Egreso'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; + +-- Tabla: movimientos_generales +CREATE TABLE IF NOT EXISTS public.movimientos_generales +( + id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + reporte_mensual_general_id bigint, + tipo tipo_movimiento_general NOT NULL, + categoria_ingreso_id bigint, + categoria_egreso_id bigint, + monto numeric(18,2) NOT NULL, + fecha timestamp without time zone NOT NULL, + descripcion character varying(200) COLLATE pg_catalog."default" NOT NULL DEFAULT '', + numero_comprobante character varying(50) COLLATE pg_catalog."default", + CONSTRAINT pk_movimientos_generales PRIMARY KEY (id), + CONSTRAINT fk_movimientos_reporte FOREIGN KEY (reporte_mensual_general_id) + REFERENCES public.reportes_mensuales_generales (id) + ON DELETE CASCADE, + CONSTRAINT fk_movimientos_categoria_ingreso FOREIGN KEY (categoria_ingreso_id) + REFERENCES public.categorias_ingreso (id) + ON DELETE RESTRICT, + CONSTRAINT fk_movimientos_categoria_egreso FOREIGN KEY (categoria_egreso_id) + REFERENCES public.categorias_egreso (id) + ON DELETE RESTRICT, + CONSTRAINT ck_monto_positivo CHECK (monto > 0), + CONSTRAINT ck_categoria_tipo CHECK ( + (tipo = 'Ingreso' AND categoria_ingreso_id IS NOT NULL AND categoria_egreso_id IS NULL) OR + (tipo = 'Egreso' AND categoria_egreso_id IS NOT NULL AND categoria_ingreso_id IS NULL) + ) +); + +-- ===================================================== +-- 2. CREAR ÍNDICES +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_movimientos_reporte + ON public.movimientos_generales (reporte_mensual_general_id); + +CREATE INDEX IF NOT EXISTS idx_movimientos_fecha + ON public.movimientos_generales (fecha); + +CREATE INDEX IF NOT EXISTS idx_movimientos_categoria_ingreso + ON public.movimientos_generales (categoria_ingreso_id); + +CREATE INDEX IF NOT EXISTS idx_movimientos_categoria_egreso + ON public.movimientos_generales (categoria_egreso_id); + +CREATE INDEX IF NOT EXISTS idx_reportes_anio + ON public.reportes_mensuales_generales (anio); + +-- ===================================================== +-- 3. INSERTAR DATOS INICIALES - CATEGORÍAS DE INGRESO +-- ===================================================== + +INSERT INTO public.categorias_ingreso (nombre, descripcion, activa) VALUES +('Ofrendas', 'Ofrendas regulares de los cultos', true), +('Donaciones', 'Donaciones especiales de hermanos y visitantes', true), +('Diezmos', 'Diezmos de los miembros', true), +('Eventos Especiales', 'Ingresos de eventos, conferencias, retiros', true), +('Alquileres', 'Ingresos por alquiler de instalaciones', true), +('Ventas', 'Ventas de materiales, libros u otros productos', true), +('Otros Ingresos', 'Ingresos diversos no categorizados', true) +ON CONFLICT DO NOTHING; + +-- ===================================================== +-- 4. INSERTAR DATOS INICIALES - CATEGORÍAS DE EGRESO +-- ===================================================== + +INSERT INTO public.categorias_egreso (nombre, descripcion, activa) VALUES +('Agua', 'Pago del servicio de agua', true), +('Luz', 'Pago del servicio de electricidad', true), +('Teléfono/Internet', 'Servicios de telefonía e internet', true), +('Impuestos', 'Pago de impuestos municipales, prediales, etc.', true), +('Funeraria', 'Gastos relacionados con servicios funerarios', true), +('Mantenimiento Edificio', 'Reparaciones y mantenimiento de las instalaciones', true), +('Suministros Ministerio', 'Materiales para ministerios (niños, jóvenes, etc.)', true), +('Salarios Personal', 'Salarios de pastores y personal administrativo', true), +('Eventos', 'Gastos de organización de eventos', true), +('Transporte', 'Gastos de transporte y combustible', true), +('Limpieza', 'Servicios de limpieza y productos', true), +('Seguridad', 'Servicio de seguridad o vigilancia', true), +('Otros Gastos', 'Gastos diversos no categorizados', true) +ON CONFLICT DO NOTHING; + +-- ===================================================== +-- 5. COMENTARIOS SOBRE LAS TABLAS +-- ===================================================== + +COMMENT ON TABLE public.categorias_ingreso IS 'Categorías para clasificar los ingresos de la iglesia'; +COMMENT ON TABLE public.categorias_egreso IS 'Categorías para clasificar los egresos de la iglesia'; +COMMENT ON TABLE public.reportes_mensuales_generales IS 'Reportes mensuales de contabilidad general de la iglesia'; +COMMENT ON TABLE public.movimientos_generales IS 'Movimientos individuales de ingresos y egresos'; + +-- ===================================================== +-- 6. VERIFICACIÓN +-- ===================================================== + +-- Verificar que se crearon las tablas +SELECT + table_name, + (SELECT COUNT(*) FROM information_schema.columns WHERE table_name = t.table_name) as columnas +FROM information_schema.tables t +WHERE table_schema = 'public' + AND table_name IN ( + 'categorias_ingreso', + 'categorias_egreso', + 'reportes_mensuales_generales', + 'movimientos_generales' + ) +ORDER BY table_name; + +-- Verificar datos iniciales de categorías +SELECT 'Categorías de Ingreso' as tipo, COUNT(*) as total FROM public.categorias_ingreso +UNION ALL +SELECT 'Categorías de Egreso' as tipo, COUNT(*) as total FROM public.categorias_egreso; + +-- ===================================================== +-- FIN DEL SCRIPT +-- ===================================================== diff --git a/RS_system/sql_permisos_colaboraciones.sql b/RS_system/sql_permisos_colaboraciones.sql new file mode 100644 index 0000000..e5cc1a8 --- /dev/null +++ b/RS_system/sql_permisos_colaboraciones.sql @@ -0,0 +1,97 @@ +-- ============================================ +-- Script: Agregar Gestión de Tipos de Colaboración +-- Descripción: Agrega el módulo y permiso para gestionar tipos de colaboración +-- Fecha: 2026-02-01 +-- NOTA: Este script NO debe ejecutarse automáticamente, el usuario lo ejecutará manualmente +-- ============================================ + +-- 1. Insertar permiso para Tipo Colaboración (si no existe) +DO $$ +BEGIN + -- Verificar si ya existe el módulo de Finanzas + IF NOT EXISTS (SELECT 1 FROM public.modulos WHERE codigo = 'FINANZAS') THEN + INSERT INTO public.modulos (nombre, descripcion, codigo, icono, activo, orden, creado_en, actualizado_en) + VALUES ('Finanzas', 'Módulo de gestión financiera', 'FINANZAS', 'bi-cash-stack', true, 5, NOW(), NOW()); + END IF; + + -- Insertar permiso para Colaboraciones (si no existe) + IF NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Colaboracion') THEN + INSERT INTO public.permisos (nombre, descripcion, codigo, modulo_id, activo, orden, creado_en, actualizado_en) + VALUES ( + 'Colaboraciones', + 'Gestión de colaboraciones económicas mensuales', + 'Colaboracion', + (SELECT id FROM public.modulos WHERE codigo = 'FINANZAS' LIMIT 1), + true, + 1, + NOW(), + NOW() + ); + END IF; + + -- Insertar permiso para Tipos de Colaboración (si no existe) + IF NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'TipoColaboracion') THEN + INSERT INTO public.permisos (nombre, descripcion, codigo, modulo_id, activo, orden, creado_en, actualizado_en) + VALUES ( + 'Tipos de Colaboración', + 'Gestión de tipos de colaboración (Transporte, Limpieza, etc.)', + 'TipoColaboracion', + (SELECT id FROM public.modulos WHERE codigo = 'FINANZAS' LIMIT 1), + true, + 2, + NOW(), + NOW() + ); + END IF; + + RAISE NOTICE 'Permisos para Colaboraciones creados exitosamente'; +END $$; + +-- 2. (Opcional) Asignar permisos al rol de Administrador +-- Descomentar si se desea asignar automáticamente +/* +DO $$ +DECLARE + v_rol_admin_id BIGINT; + v_permiso_colaboracion_id BIGINT; + v_permiso_tipo_id BIGINT; +BEGIN + -- Obtener el ID del rol de administrador (ajustar el nombre según tu sistema) + SELECT id INTO v_rol_admin_id FROM public.roles_sistema WHERE nombre = 'Administrador' LIMIT 1; + + -- Obtener IDs de los permisos + SELECT id INTO v_permiso_colaboracion_id FROM public.permisos WHERE codigo = 'Colaboracion' LIMIT 1; + SELECT id INTO v_permiso_tipo_id FROM public.permisos WHERE codigo = 'TipoColaboracion' LIMIT 1; + + IF v_rol_admin_id IS NOT NULL THEN + -- Asignar permiso de Colaboraciones + IF NOT EXISTS (SELECT 1 FROM public.roles_permisos WHERE rol_id = v_rol_admin_id AND permiso_id = v_permiso_colaboracion_id) THEN + INSERT INTO public.roles_permisos (rol_id, permiso_id, creado_en) + VALUES (v_rol_admin_id, v_permiso_colaboracion_id, NOW()); + END IF; + + -- Asignar permiso de Tipos de Colaboración + IF NOT EXISTS (SELECT 1 FROM public.roles_permisos WHERE rol_id = v_rol_admin_id AND permiso_id = v_permiso_tipo_id) THEN + INSERT INTO public.roles_permisos (rol_id, permiso_id, creado_en) + VALUES (v_rol_admin_id, v_permiso_tipo_id, NOW()); + END IF; + + RAISE NOTICE 'Permisos asignados al rol Administrador'; + END IF; +END $$; +*/ + +-- 3. Verificación: Listar permisos creados +SELECT + m.nombre AS modulo, + p.nombre AS permiso, + p.codigo, + p.activo +FROM public.permisos p +INNER JOIN public.modulos m ON p.modulo_id = m.id +WHERE p.codigo IN ('Colaboracion', 'TipoColaboracion') +ORDER BY m.nombre, p.orden; + +-- ============================================ +-- FIN DEL SCRIPT +-- ============================================ diff --git a/RS_system/wwwroot/Assets/apple-touch-icon.png b/RS_system/wwwroot/Assets/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9f3334c6f617de719f09230368daa848909613 GIT binary patch literal 18840 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 literal 0 HcmV?d00001 diff --git a/RS_system/wwwroot/Assets/favicon-16x16.png b/RS_system/wwwroot/Assets/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f446c775a0d37cd8b983486fd47acef966982c69 GIT binary patch literal 892 zcmV-?1B3jDP)%A^YJ57OLNuA)K$sVEKAc;tV|LOveYD! z%%CveLY6`XD&~W<^;uc@%5BZ(Jaf3Mp6aeHH0YKv-XW`mZ&HZPs>R(?*{^-AtPCu>b z4hp!C6!)>SQ%;o(84PO~V{`>+ICLDM60YoVJrV!Ds%3Kbs}C%HYMpEDn2k$eN#o+J zrXIug$n?jpQQB+HB*IAnN024}R1Anp@T+du7Y>cjUDVZO`KS3>>7O*uI=>sX3Vf7y z5c;Zb2lsz9gjBXo<#>n2o(5Fl$P-8i+k+^YY{UCK)YW9y0|&@$ntm`c&Li6g^&ZK& z%|#4BT|-WjsoXSwc0t%m9Kr+?0zf4KkO#eOuUG0iYFFJ1bGquh%lgHZH72EJ-IuE? zi!;ruiek(Gjp5B1a;RQF;eT5I5Ck}%RX^Y!_j1%PrLnuIbJFAU=z_1d;KxWz$?)%t z3YegJsVR<&Z%9%&2tzW;Fp)!|w`%*n(2dIMkPS+^4Q3^_>l9^o)k^ctVAY=b4%RddR#L=nA6el0jj0zN|7^=9uav! zzXP=}pa+1K-dVq{;TeB{!%EIO(^b21!IgR09B#iAPQN SnuehO0000& zb36n*4d_&THTVEOb3HgFmKK}|dsh8uQq7~Hm>b#K2LNK8_zR5Z$|2xsfO4n?3E3|a z5y!;RYiDOVYN{=c`dUe;dN98YUyu+nHJae*&;)herU9(`!b5{G1n0>uAD?bLJIJ!E zJo)h_#;jfsE6Of}7?hTqu%Pv4B`iU31Q25+YUPuF^uNu|u|c_)WVpS>u)vgn(^l_f>~ zvdyPlQ6aOTswSrPaZ%j#Iq#4A^2Dy!^i0YCJO*p$R&@r|mS}-CgMx^XLY&mGV{2@i zcWg^v_DSBAn~$ss)-HkhO-_a9XJ?gG-uwQEyUEE^i(l^ba+tO5NNLWh_3QpzR+!rZ z({XdEK$b3884Z1jKOCIcf}vgau)6VNBO++YNbYI%Km|4S04?C8ohgP z^zZi7WRxB6)FXKHkjWqI0InRacJT6Jmuu%FZ#!3*arCe6bFNvj4AyViwB;oMXy*oy zi?iUy@vy0LlMipsEY2t>YsS;CJPT2jd zou_4orN0Jj%k76Q``UvATNW%|pSyF*lE9Wt8Bq;k@Z1e>&e@`*#03dk@^0iml-_P? zX8D@pj48?5mhdPqtp;dd4Ohv1Th6VzsTT?wW=b6_o-g3umCX&sUu|9PZgxdAD{wLU zR{f9zxys$SiHnv}Z7^?_>fi&Cgfea<%vzVFxwy)<381z! z?nz;fv}u47%*gle_PWeV+U6F{l|Hm zX0FZo`ey!rrV)?PVn|u`Cr5nkwo-fqtzi)*Kr(6z0LVcUUmCn9^Lqpw97UfBDn-HD zQ4zz(MIV`hHhzx4HB7@eMsUR~+pZ=oP+AC(#IeYu%}s}!26iK2AfkYs`P(~X?OPl^ z?8JuG=63bgxC9F9oEPxc)_1!19}v_r185+RRBOSLwiGi01W39~CiSCx!0=C)97^ux zgq7SmA6b0&d}QhEbCH1&At3>Qp-$gU-I{@mTjGqd`VJaYx$2+VvX5-+p8ffT?xfFT zq;?Z!7#Ia{541rHx;p@)0SpMxSnzcv3l&Q{lzVN`inHHM{38l#vL~%P``v`4Cl5Sz z%9;umSbC`Z^sw7Vlj{LoeyycSzJnTP zUUqAN88`Lo$cc`bm1CB~yXRsHTtsQqSe~ws6gPOB9KesjI6t|9P6pP%X}VUl31vpA zsR;836C`XDfZ+gr=)34P-T;!&7NBmTN0SLiR3O)osRFQ%ir5kQK!jnmB||Zo?W_C zIjyRy5PvZ#8*qCLo-uiftg5OFKWPDqMK2{NEe!~l!hKa=oAlJB!b`PX?KeW>mb{_! zDF)!@*S~zz;<$cu$Mig7lQo5dh3)*Za!&HPBX=H`-NeVDH%#oHQAtCC>v~>&=2pV( z7Nr`vt69{dpx6(Lmyj7A_Rbhn7f*|ho;;#!R>uy|pGj~&G%hJ4@YVM`Ck&1lSvF(L z;Ei^xCNrjSKVPO6meqG@XsEJrtkEZCNw?6EN&77zU-9u`QKJTSyqGvXcsP^%8@aia z&`fW@eBJck0V0QvFWtOm_2|@hBIBb&yh@lX$J@Mpe&`dIloAm!#YQ~0=4!%XOyVj# zurl_u8NUfC?qKiIv3FeZd~SmuB$>?)>%odA4pc_%`FPF9(eWwwJ?8|#HUR)P7LNd* zIfy|F5_GUQOqewLc-n_k2Q2(;Kw6-mNDM!3)qVO@-qTre zi;kvEr5&(d|_gy1heT{>y_+6_Ci8MX<4uQjv`s!uPyXn+h6B9ufpfGGg}{*jHz z2`L|Zv~XC|m_fe(^tQ1GOv=tYR~U>Xad)Ow)HHUks%gx%%52bt5#8<`Tt9JP(tC+- z_3AgG#yAhqt>NZv0X+Q7%(Ob zss)Cr1GxSoB)YCwc--x3)fEn^8Wt25bE0L}nS&|&-s51^ZXArzYb q1pom5|2Op@CjbBd21!IgR09BU@M==ZQf#sS0000DZ literal 0 HcmV?d00001 diff --git a/RS_system/wwwroot/Assets/favicon.ico b/RS_system/wwwroot/Assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1b54f3009041ecf42842bf883b3773524a97f598 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/RS_system/wwwroot/Assets/icon-192x192.png b/RS_system/wwwroot/Assets/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..6f28e1c9e6bbd36898fccd4a3d083d3bd0b7177e GIT binary patch literal 20995 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 z zi6F*PkKtxB-qQY39{4|A(%SXG!;63Q96bFr_g!h#Ea#Z#6wA=#?QRqPOasVs^b->=&?%02zsQLvE@M(r)$S(;JC*b=51|mr` z-6i}tP6BKwEOdxUJpU-kd$`uy0w^Nzw%ZVyr#O+9gZci5zCiDCOPno-I^FvhSGa8< zi<1#VLLI)!eOt8UFF$zNOAq|&>$l!|Yrp)QP`N$`WbcKlyzH%;ewq+vgXds0Di~+vO8W_Bk8&wfbUM5)b

ZVr813%mM{kV=p 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 literal 0 HcmV?d00001 diff --git a/RS_system/wwwroot/css/bootstrap-icons.css b/RS_system/wwwroot/css/bootstrap-icons.css new file mode 100644 index 0000000..5f7ae28 --- /dev/null +++ b/RS_system/wwwroot/css/bootstrap-icons.css @@ -0,0 +1,2106 @@ +/*! + * Bootstrap Icons v1.13.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: url("./fonts/bootstrap-icons.woff2?e34853135f9e39acf64315236852cd5a") format("woff2"), +url("./fonts/bootstrap-icons.woff?e34853135f9e39acf64315236852cd5a") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } +.bi-bluesky::before { content: "\f7f9"; } +.bi-tux::before { content: "\f904"; } +.bi-beaker-fill::before { content: "\f905"; } +.bi-beaker::before { content: "\f906"; } +.bi-flask-fill::before { content: "\f907"; } +.bi-flask-florence-fill::before { content: "\f908"; } +.bi-flask-florence::before { content: "\f909"; } +.bi-flask::before { content: "\f90a"; } +.bi-leaf-fill::before { content: "\f90b"; } +.bi-leaf::before { content: "\f90c"; } +.bi-measuring-cup-fill::before { content: "\f90d"; } +.bi-measuring-cup::before { content: "\f90e"; } +.bi-unlock2-fill::before { content: "\f90f"; } +.bi-unlock2::before { content: "\f910"; } +.bi-battery-low::before { content: "\f911"; } +.bi-anthropic::before { content: "\f912"; } +.bi-apple-music::before { content: "\f913"; } +.bi-claude::before { content: "\f914"; } +.bi-openai::before { content: "\f915"; } +.bi-perplexity::before { content: "\f916"; } +.bi-css::before { content: "\f917"; } +.bi-javascript::before { content: "\f918"; } +.bi-typescript::before { content: "\f919"; } +.bi-fork-knife::before { content: "\f91a"; } +.bi-globe-americas-fill::before { content: "\f91b"; } +.bi-globe-asia-australia-fill::before { content: "\f91c"; } +.bi-globe-central-south-asia-fill::before { content: "\f91d"; } +.bi-globe-europe-africa-fill::before { content: "\f91e"; } diff --git a/RS_system/wwwroot/css/bootstrap-icons.json b/RS_system/wwwroot/css/bootstrap-icons.json new file mode 100644 index 0000000..9d8873b --- /dev/null +++ b/RS_system/wwwroot/css/bootstrap-icons.json @@ -0,0 +1,2080 @@ +{ + "123": 63103, + "alarm-fill": 61697, + "alarm": 61698, + "align-bottom": 61699, + "align-center": 61700, + "align-end": 61701, + "align-middle": 61702, + "align-start": 61703, + "align-top": 61704, + "alt": 61705, + "app-indicator": 61706, + "app": 61707, + "archive-fill": 61708, + "archive": 61709, + "arrow-90deg-down": 61710, + "arrow-90deg-left": 61711, + "arrow-90deg-right": 61712, + "arrow-90deg-up": 61713, + "arrow-bar-down": 61714, + "arrow-bar-left": 61715, + "arrow-bar-right": 61716, + "arrow-bar-up": 61717, + "arrow-clockwise": 61718, + "arrow-counterclockwise": 61719, + "arrow-down-circle-fill": 61720, + "arrow-down-circle": 61721, + "arrow-down-left-circle-fill": 61722, + "arrow-down-left-circle": 61723, + "arrow-down-left-square-fill": 61724, + "arrow-down-left-square": 61725, + "arrow-down-left": 61726, + "arrow-down-right-circle-fill": 61727, + "arrow-down-right-circle": 61728, + "arrow-down-right-square-fill": 61729, + "arrow-down-right-square": 61730, + "arrow-down-right": 61731, + "arrow-down-short": 61732, + "arrow-down-square-fill": 61733, + "arrow-down-square": 61734, + "arrow-down-up": 61735, + "arrow-down": 61736, + "arrow-left-circle-fill": 61737, + "arrow-left-circle": 61738, + "arrow-left-right": 61739, + "arrow-left-short": 61740, + "arrow-left-square-fill": 61741, + "arrow-left-square": 61742, + "arrow-left": 61743, + "arrow-repeat": 61744, + "arrow-return-left": 61745, + "arrow-return-right": 61746, + "arrow-right-circle-fill": 61747, + "arrow-right-circle": 61748, + "arrow-right-short": 61749, + "arrow-right-square-fill": 61750, + "arrow-right-square": 61751, + "arrow-right": 61752, + "arrow-up-circle-fill": 61753, + "arrow-up-circle": 61754, + "arrow-up-left-circle-fill": 61755, + "arrow-up-left-circle": 61756, + "arrow-up-left-square-fill": 61757, + "arrow-up-left-square": 61758, + "arrow-up-left": 61759, + "arrow-up-right-circle-fill": 61760, + "arrow-up-right-circle": 61761, + "arrow-up-right-square-fill": 61762, + "arrow-up-right-square": 61763, + "arrow-up-right": 61764, + "arrow-up-short": 61765, + "arrow-up-square-fill": 61766, + "arrow-up-square": 61767, + "arrow-up": 61768, + "arrows-angle-contract": 61769, + "arrows-angle-expand": 61770, + "arrows-collapse": 61771, + "arrows-expand": 61772, + "arrows-fullscreen": 61773, + "arrows-move": 61774, + "aspect-ratio-fill": 61775, + "aspect-ratio": 61776, + "asterisk": 61777, + "at": 61778, + "award-fill": 61779, + "award": 61780, + "back": 61781, + "backspace-fill": 61782, + "backspace-reverse-fill": 61783, + "backspace-reverse": 61784, + "backspace": 61785, + "badge-3d-fill": 61786, + "badge-3d": 61787, + "badge-4k-fill": 61788, + "badge-4k": 61789, + "badge-8k-fill": 61790, + "badge-8k": 61791, + "badge-ad-fill": 61792, + "badge-ad": 61793, + "badge-ar-fill": 61794, + "badge-ar": 61795, + "badge-cc-fill": 61796, + "badge-cc": 61797, + "badge-hd-fill": 61798, + "badge-hd": 61799, + "badge-tm-fill": 61800, + "badge-tm": 61801, + "badge-vo-fill": 61802, + "badge-vo": 61803, + "badge-vr-fill": 61804, + "badge-vr": 61805, + "badge-wc-fill": 61806, + "badge-wc": 61807, + "bag-check-fill": 61808, + "bag-check": 61809, + "bag-dash-fill": 61810, + "bag-dash": 61811, + "bag-fill": 61812, + "bag-plus-fill": 61813, + "bag-plus": 61814, + "bag-x-fill": 61815, + "bag-x": 61816, + "bag": 61817, + "bar-chart-fill": 61818, + "bar-chart-line-fill": 61819, + "bar-chart-line": 61820, + "bar-chart-steps": 61821, + "bar-chart": 61822, + "basket-fill": 61823, + "basket": 61824, + "basket2-fill": 61825, + "basket2": 61826, + "basket3-fill": 61827, + "basket3": 61828, + "battery-charging": 61829, + "battery-full": 61830, + "battery-half": 61831, + "battery": 61832, + "bell-fill": 61833, + "bell": 61834, + "bezier": 61835, + "bezier2": 61836, + "bicycle": 61837, + "binoculars-fill": 61838, + "binoculars": 61839, + "blockquote-left": 61840, + "blockquote-right": 61841, + "book-fill": 61842, + "book-half": 61843, + "book": 61844, + "bookmark-check-fill": 61845, + "bookmark-check": 61846, + "bookmark-dash-fill": 61847, + "bookmark-dash": 61848, + "bookmark-fill": 61849, + "bookmark-heart-fill": 61850, + "bookmark-heart": 61851, + "bookmark-plus-fill": 61852, + "bookmark-plus": 61853, + "bookmark-star-fill": 61854, + "bookmark-star": 61855, + "bookmark-x-fill": 61856, + "bookmark-x": 61857, + "bookmark": 61858, + "bookmarks-fill": 61859, + "bookmarks": 61860, + "bookshelf": 61861, + "bootstrap-fill": 61862, + "bootstrap-reboot": 61863, + "bootstrap": 61864, + "border-all": 61865, + "border-bottom": 61866, + "border-center": 61867, + "border-inner": 61868, + "border-left": 61869, + "border-middle": 61870, + "border-outer": 61871, + "border-right": 61872, + "border-style": 61873, + "border-top": 61874, + "border-width": 61875, + "border": 61876, + "bounding-box-circles": 61877, + "bounding-box": 61878, + "box-arrow-down-left": 61879, + "box-arrow-down-right": 61880, + "box-arrow-down": 61881, + "box-arrow-in-down-left": 61882, + "box-arrow-in-down-right": 61883, + "box-arrow-in-down": 61884, + "box-arrow-in-left": 61885, + "box-arrow-in-right": 61886, + "box-arrow-in-up-left": 61887, + "box-arrow-in-up-right": 61888, + "box-arrow-in-up": 61889, + "box-arrow-left": 61890, + "box-arrow-right": 61891, + "box-arrow-up-left": 61892, + "box-arrow-up-right": 61893, + "box-arrow-up": 61894, + "box-seam": 61895, + "box": 61896, + "braces": 61897, + "bricks": 61898, + "briefcase-fill": 61899, + "briefcase": 61900, + "brightness-alt-high-fill": 61901, + "brightness-alt-high": 61902, + "brightness-alt-low-fill": 61903, + "brightness-alt-low": 61904, + "brightness-high-fill": 61905, + "brightness-high": 61906, + "brightness-low-fill": 61907, + "brightness-low": 61908, + "broadcast-pin": 61909, + "broadcast": 61910, + "brush-fill": 61911, + "brush": 61912, + "bucket-fill": 61913, + "bucket": 61914, + "bug-fill": 61915, + "bug": 61916, + "building": 61917, + "bullseye": 61918, + "calculator-fill": 61919, + "calculator": 61920, + "calendar-check-fill": 61921, + "calendar-check": 61922, + "calendar-date-fill": 61923, + "calendar-date": 61924, + "calendar-day-fill": 61925, + "calendar-day": 61926, + "calendar-event-fill": 61927, + "calendar-event": 61928, + "calendar-fill": 61929, + "calendar-minus-fill": 61930, + "calendar-minus": 61931, + "calendar-month-fill": 61932, + "calendar-month": 61933, + "calendar-plus-fill": 61934, + "calendar-plus": 61935, + "calendar-range-fill": 61936, + "calendar-range": 61937, + "calendar-week-fill": 61938, + "calendar-week": 61939, + "calendar-x-fill": 61940, + "calendar-x": 61941, + "calendar": 61942, + "calendar2-check-fill": 61943, + "calendar2-check": 61944, + "calendar2-date-fill": 61945, + "calendar2-date": 61946, + "calendar2-day-fill": 61947, + "calendar2-day": 61948, + "calendar2-event-fill": 61949, + "calendar2-event": 61950, + "calendar2-fill": 61951, + "calendar2-minus-fill": 61952, + "calendar2-minus": 61953, + "calendar2-month-fill": 61954, + "calendar2-month": 61955, + "calendar2-plus-fill": 61956, + "calendar2-plus": 61957, + "calendar2-range-fill": 61958, + "calendar2-range": 61959, + "calendar2-week-fill": 61960, + "calendar2-week": 61961, + "calendar2-x-fill": 61962, + "calendar2-x": 61963, + "calendar2": 61964, + "calendar3-event-fill": 61965, + "calendar3-event": 61966, + "calendar3-fill": 61967, + "calendar3-range-fill": 61968, + "calendar3-range": 61969, + "calendar3-week-fill": 61970, + "calendar3-week": 61971, + "calendar3": 61972, + "calendar4-event": 61973, + "calendar4-range": 61974, + "calendar4-week": 61975, + "calendar4": 61976, + "camera-fill": 61977, + "camera-reels-fill": 61978, + "camera-reels": 61979, + "camera-video-fill": 61980, + "camera-video-off-fill": 61981, + "camera-video-off": 61982, + "camera-video": 61983, + "camera": 61984, + "camera2": 61985, + "capslock-fill": 61986, + "capslock": 61987, + "card-checklist": 61988, + "card-heading": 61989, + "card-image": 61990, + "card-list": 61991, + "card-text": 61992, + "caret-down-fill": 61993, + "caret-down-square-fill": 61994, + "caret-down-square": 61995, + "caret-down": 61996, + "caret-left-fill": 61997, + "caret-left-square-fill": 61998, + "caret-left-square": 61999, + "caret-left": 62000, + "caret-right-fill": 62001, + "caret-right-square-fill": 62002, + "caret-right-square": 62003, + "caret-right": 62004, + "caret-up-fill": 62005, + "caret-up-square-fill": 62006, + "caret-up-square": 62007, + "caret-up": 62008, + "cart-check-fill": 62009, + "cart-check": 62010, + "cart-dash-fill": 62011, + "cart-dash": 62012, + "cart-fill": 62013, + "cart-plus-fill": 62014, + "cart-plus": 62015, + "cart-x-fill": 62016, + "cart-x": 62017, + "cart": 62018, + "cart2": 62019, + "cart3": 62020, + "cart4": 62021, + "cash-stack": 62022, + "cash": 62023, + "cast": 62024, + "chat-dots-fill": 62025, + "chat-dots": 62026, + "chat-fill": 62027, + "chat-left-dots-fill": 62028, + "chat-left-dots": 62029, + "chat-left-fill": 62030, + "chat-left-quote-fill": 62031, + "chat-left-quote": 62032, + "chat-left-text-fill": 62033, + "chat-left-text": 62034, + "chat-left": 62035, + "chat-quote-fill": 62036, + "chat-quote": 62037, + "chat-right-dots-fill": 62038, + "chat-right-dots": 62039, + "chat-right-fill": 62040, + "chat-right-quote-fill": 62041, + "chat-right-quote": 62042, + "chat-right-text-fill": 62043, + "chat-right-text": 62044, + "chat-right": 62045, + "chat-square-dots-fill": 62046, + "chat-square-dots": 62047, + "chat-square-fill": 62048, + "chat-square-quote-fill": 62049, + "chat-square-quote": 62050, + "chat-square-text-fill": 62051, + "chat-square-text": 62052, + "chat-square": 62053, + "chat-text-fill": 62054, + "chat-text": 62055, + "chat": 62056, + "check-all": 62057, + "check-circle-fill": 62058, + "check-circle": 62059, + "check-square-fill": 62060, + "check-square": 62061, + "check": 62062, + "check2-all": 62063, + "check2-circle": 62064, + "check2-square": 62065, + "check2": 62066, + "chevron-bar-contract": 62067, + "chevron-bar-down": 62068, + "chevron-bar-expand": 62069, + "chevron-bar-left": 62070, + "chevron-bar-right": 62071, + "chevron-bar-up": 62072, + "chevron-compact-down": 62073, + "chevron-compact-left": 62074, + "chevron-compact-right": 62075, + "chevron-compact-up": 62076, + "chevron-contract": 62077, + "chevron-double-down": 62078, + "chevron-double-left": 62079, + "chevron-double-right": 62080, + "chevron-double-up": 62081, + "chevron-down": 62082, + "chevron-expand": 62083, + "chevron-left": 62084, + "chevron-right": 62085, + "chevron-up": 62086, + "circle-fill": 62087, + "circle-half": 62088, + "circle-square": 62089, + "circle": 62090, + "clipboard-check": 62091, + "clipboard-data": 62092, + "clipboard-minus": 62093, + "clipboard-plus": 62094, + "clipboard-x": 62095, + "clipboard": 62096, + "clock-fill": 62097, + "clock-history": 62098, + "clock": 62099, + "cloud-arrow-down-fill": 62100, + "cloud-arrow-down": 62101, + "cloud-arrow-up-fill": 62102, + "cloud-arrow-up": 62103, + "cloud-check-fill": 62104, + "cloud-check": 62105, + "cloud-download-fill": 62106, + "cloud-download": 62107, + "cloud-drizzle-fill": 62108, + "cloud-drizzle": 62109, + "cloud-fill": 62110, + "cloud-fog-fill": 62111, + "cloud-fog": 62112, + "cloud-fog2-fill": 62113, + "cloud-fog2": 62114, + "cloud-hail-fill": 62115, + "cloud-hail": 62116, + "cloud-haze-fill": 62118, + "cloud-haze": 62119, + "cloud-haze2-fill": 62120, + "cloud-lightning-fill": 62121, + "cloud-lightning-rain-fill": 62122, + "cloud-lightning-rain": 62123, + "cloud-lightning": 62124, + "cloud-minus-fill": 62125, + "cloud-minus": 62126, + "cloud-moon-fill": 62127, + "cloud-moon": 62128, + "cloud-plus-fill": 62129, + "cloud-plus": 62130, + "cloud-rain-fill": 62131, + "cloud-rain-heavy-fill": 62132, + "cloud-rain-heavy": 62133, + "cloud-rain": 62134, + "cloud-slash-fill": 62135, + "cloud-slash": 62136, + "cloud-sleet-fill": 62137, + "cloud-sleet": 62138, + "cloud-snow-fill": 62139, + "cloud-snow": 62140, + "cloud-sun-fill": 62141, + "cloud-sun": 62142, + "cloud-upload-fill": 62143, + "cloud-upload": 62144, + "cloud": 62145, + "clouds-fill": 62146, + "clouds": 62147, + "cloudy-fill": 62148, + "cloudy": 62149, + "code-slash": 62150, + "code-square": 62151, + "code": 62152, + "collection-fill": 62153, + "collection-play-fill": 62154, + "collection-play": 62155, + "collection": 62156, + "columns-gap": 62157, + "columns": 62158, + "command": 62159, + "compass-fill": 62160, + "compass": 62161, + "cone-striped": 62162, + "cone": 62163, + "controller": 62164, + "cpu-fill": 62165, + "cpu": 62166, + "credit-card-2-back-fill": 62167, + "credit-card-2-back": 62168, + "credit-card-2-front-fill": 62169, + "credit-card-2-front": 62170, + "credit-card-fill": 62171, + "credit-card": 62172, + "crop": 62173, + "cup-fill": 62174, + "cup-straw": 62175, + "cup": 62176, + "cursor-fill": 62177, + "cursor-text": 62178, + "cursor": 62179, + "dash-circle-dotted": 62180, + "dash-circle-fill": 62181, + "dash-circle": 62182, + "dash-square-dotted": 62183, + "dash-square-fill": 62184, + "dash-square": 62185, + "dash": 62186, + "diagram-2-fill": 62187, + "diagram-2": 62188, + "diagram-3-fill": 62189, + "diagram-3": 62190, + "diamond-fill": 62191, + "diamond-half": 62192, + "diamond": 62193, + "dice-1-fill": 62194, + "dice-1": 62195, + "dice-2-fill": 62196, + "dice-2": 62197, + "dice-3-fill": 62198, + "dice-3": 62199, + "dice-4-fill": 62200, + "dice-4": 62201, + "dice-5-fill": 62202, + "dice-5": 62203, + "dice-6-fill": 62204, + "dice-6": 62205, + "disc-fill": 62206, + "disc": 62207, + "discord": 62208, + "display-fill": 62209, + "display": 62210, + "distribute-horizontal": 62211, + "distribute-vertical": 62212, + "door-closed-fill": 62213, + "door-closed": 62214, + "door-open-fill": 62215, + "door-open": 62216, + "dot": 62217, + "download": 62218, + "droplet-fill": 62219, + "droplet-half": 62220, + "droplet": 62221, + "earbuds": 62222, + "easel-fill": 62223, + "easel": 62224, + "egg-fill": 62225, + "egg-fried": 62226, + "egg": 62227, + "eject-fill": 62228, + "eject": 62229, + "emoji-angry-fill": 62230, + "emoji-angry": 62231, + "emoji-dizzy-fill": 62232, + "emoji-dizzy": 62233, + "emoji-expressionless-fill": 62234, + "emoji-expressionless": 62235, + "emoji-frown-fill": 62236, + "emoji-frown": 62237, + "emoji-heart-eyes-fill": 62238, + "emoji-heart-eyes": 62239, + "emoji-laughing-fill": 62240, + "emoji-laughing": 62241, + "emoji-neutral-fill": 62242, + "emoji-neutral": 62243, + "emoji-smile-fill": 62244, + "emoji-smile-upside-down-fill": 62245, + "emoji-smile-upside-down": 62246, + "emoji-smile": 62247, + "emoji-sunglasses-fill": 62248, + "emoji-sunglasses": 62249, + "emoji-wink-fill": 62250, + "emoji-wink": 62251, + "envelope-fill": 62252, + "envelope-open-fill": 62253, + "envelope-open": 62254, + "envelope": 62255, + "eraser-fill": 62256, + "eraser": 62257, + "exclamation-circle-fill": 62258, + "exclamation-circle": 62259, + "exclamation-diamond-fill": 62260, + "exclamation-diamond": 62261, + "exclamation-octagon-fill": 62262, + "exclamation-octagon": 62263, + "exclamation-square-fill": 62264, + "exclamation-square": 62265, + "exclamation-triangle-fill": 62266, + "exclamation-triangle": 62267, + "exclamation": 62268, + "exclude": 62269, + "eye-fill": 62270, + "eye-slash-fill": 62271, + "eye-slash": 62272, + "eye": 62273, + "eyedropper": 62274, + "eyeglasses": 62275, + "facebook": 62276, + "file-arrow-down-fill": 62277, + "file-arrow-down": 62278, + "file-arrow-up-fill": 62279, + "file-arrow-up": 62280, + "file-bar-graph-fill": 62281, + "file-bar-graph": 62282, + "file-binary-fill": 62283, + "file-binary": 62284, + "file-break-fill": 62285, + "file-break": 62286, + "file-check-fill": 62287, + "file-check": 62288, + "file-code-fill": 62289, + "file-code": 62290, + "file-diff-fill": 62291, + "file-diff": 62292, + "file-earmark-arrow-down-fill": 62293, + "file-earmark-arrow-down": 62294, + "file-earmark-arrow-up-fill": 62295, + "file-earmark-arrow-up": 62296, + "file-earmark-bar-graph-fill": 62297, + "file-earmark-bar-graph": 62298, + "file-earmark-binary-fill": 62299, + "file-earmark-binary": 62300, + "file-earmark-break-fill": 62301, + "file-earmark-break": 62302, + "file-earmark-check-fill": 62303, + "file-earmark-check": 62304, + "file-earmark-code-fill": 62305, + "file-earmark-code": 62306, + "file-earmark-diff-fill": 62307, + "file-earmark-diff": 62308, + "file-earmark-easel-fill": 62309, + "file-earmark-easel": 62310, + "file-earmark-excel-fill": 62311, + "file-earmark-excel": 62312, + "file-earmark-fill": 62313, + "file-earmark-font-fill": 62314, + "file-earmark-font": 62315, + "file-earmark-image-fill": 62316, + "file-earmark-image": 62317, + "file-earmark-lock-fill": 62318, + "file-earmark-lock": 62319, + "file-earmark-lock2-fill": 62320, + "file-earmark-lock2": 62321, + "file-earmark-medical-fill": 62322, + "file-earmark-medical": 62323, + "file-earmark-minus-fill": 62324, + "file-earmark-minus": 62325, + "file-earmark-music-fill": 62326, + "file-earmark-music": 62327, + "file-earmark-person-fill": 62328, + "file-earmark-person": 62329, + "file-earmark-play-fill": 62330, + "file-earmark-play": 62331, + "file-earmark-plus-fill": 62332, + "file-earmark-plus": 62333, + "file-earmark-post-fill": 62334, + "file-earmark-post": 62335, + "file-earmark-ppt-fill": 62336, + "file-earmark-ppt": 62337, + "file-earmark-richtext-fill": 62338, + "file-earmark-richtext": 62339, + "file-earmark-ruled-fill": 62340, + "file-earmark-ruled": 62341, + "file-earmark-slides-fill": 62342, + "file-earmark-slides": 62343, + "file-earmark-spreadsheet-fill": 62344, + "file-earmark-spreadsheet": 62345, + "file-earmark-text-fill": 62346, + "file-earmark-text": 62347, + "file-earmark-word-fill": 62348, + "file-earmark-word": 62349, + "file-earmark-x-fill": 62350, + "file-earmark-x": 62351, + "file-earmark-zip-fill": 62352, + "file-earmark-zip": 62353, + "file-earmark": 62354, + "file-easel-fill": 62355, + "file-easel": 62356, + "file-excel-fill": 62357, + "file-excel": 62358, + "file-fill": 62359, + "file-font-fill": 62360, + "file-font": 62361, + "file-image-fill": 62362, + "file-image": 62363, + "file-lock-fill": 62364, + "file-lock": 62365, + "file-lock2-fill": 62366, + "file-lock2": 62367, + "file-medical-fill": 62368, + "file-medical": 62369, + "file-minus-fill": 62370, + "file-minus": 62371, + "file-music-fill": 62372, + "file-music": 62373, + "file-person-fill": 62374, + "file-person": 62375, + "file-play-fill": 62376, + "file-play": 62377, + "file-plus-fill": 62378, + "file-plus": 62379, + "file-post-fill": 62380, + "file-post": 62381, + "file-ppt-fill": 62382, + "file-ppt": 62383, + "file-richtext-fill": 62384, + "file-richtext": 62385, + "file-ruled-fill": 62386, + "file-ruled": 62387, + "file-slides-fill": 62388, + "file-slides": 62389, + "file-spreadsheet-fill": 62390, + "file-spreadsheet": 62391, + "file-text-fill": 62392, + "file-text": 62393, + "file-word-fill": 62394, + "file-word": 62395, + "file-x-fill": 62396, + "file-x": 62397, + "file-zip-fill": 62398, + "file-zip": 62399, + "file": 62400, + "files-alt": 62401, + "files": 62402, + "film": 62403, + "filter-circle-fill": 62404, + "filter-circle": 62405, + "filter-left": 62406, + "filter-right": 62407, + "filter-square-fill": 62408, + "filter-square": 62409, + "filter": 62410, + "flag-fill": 62411, + "flag": 62412, + "flower1": 62413, + "flower2": 62414, + "flower3": 62415, + "folder-check": 62416, + "folder-fill": 62417, + "folder-minus": 62418, + "folder-plus": 62419, + "folder-symlink-fill": 62420, + "folder-symlink": 62421, + "folder-x": 62422, + "folder": 62423, + "folder2-open": 62424, + "folder2": 62425, + "fonts": 62426, + "forward-fill": 62427, + "forward": 62428, + "front": 62429, + "fullscreen-exit": 62430, + "fullscreen": 62431, + "funnel-fill": 62432, + "funnel": 62433, + "gear-fill": 62434, + "gear-wide-connected": 62435, + "gear-wide": 62436, + "gear": 62437, + "gem": 62438, + "geo-alt-fill": 62439, + "geo-alt": 62440, + "geo-fill": 62441, + "geo": 62442, + "gift-fill": 62443, + "gift": 62444, + "github": 62445, + "globe": 62446, + "globe2": 62447, + "google": 62448, + "graph-down": 62449, + "graph-up": 62450, + "grid-1x2-fill": 62451, + "grid-1x2": 62452, + "grid-3x2-gap-fill": 62453, + "grid-3x2-gap": 62454, + "grid-3x2": 62455, + "grid-3x3-gap-fill": 62456, + "grid-3x3-gap": 62457, + "grid-3x3": 62458, + "grid-fill": 62459, + "grid": 62460, + "grip-horizontal": 62461, + "grip-vertical": 62462, + "hammer": 62463, + "hand-index-fill": 62464, + "hand-index-thumb-fill": 62465, + "hand-index-thumb": 62466, + "hand-index": 62467, + "hand-thumbs-down-fill": 62468, + "hand-thumbs-down": 62469, + "hand-thumbs-up-fill": 62470, + "hand-thumbs-up": 62471, + "handbag-fill": 62472, + "handbag": 62473, + "hash": 62474, + "hdd-fill": 62475, + "hdd-network-fill": 62476, + "hdd-network": 62477, + "hdd-rack-fill": 62478, + "hdd-rack": 62479, + "hdd-stack-fill": 62480, + "hdd-stack": 62481, + "hdd": 62482, + "headphones": 62483, + "headset": 62484, + "heart-fill": 62485, + "heart-half": 62486, + "heart": 62487, + "heptagon-fill": 62488, + "heptagon-half": 62489, + "heptagon": 62490, + "hexagon-fill": 62491, + "hexagon-half": 62492, + "hexagon": 62493, + "hourglass-bottom": 62494, + "hourglass-split": 62495, + "hourglass-top": 62496, + "hourglass": 62497, + "house-door-fill": 62498, + "house-door": 62499, + "house-fill": 62500, + "house": 62501, + "hr": 62502, + "hurricane": 62503, + "image-alt": 62504, + "image-fill": 62505, + "image": 62506, + "images": 62507, + "inbox-fill": 62508, + "inbox": 62509, + "inboxes-fill": 62510, + "inboxes": 62511, + "info-circle-fill": 62512, + "info-circle": 62513, + "info-square-fill": 62514, + "info-square": 62515, + "info": 62516, + "input-cursor-text": 62517, + "input-cursor": 62518, + "instagram": 62519, + "intersect": 62520, + "journal-album": 62521, + "journal-arrow-down": 62522, + "journal-arrow-up": 62523, + "journal-bookmark-fill": 62524, + "journal-bookmark": 62525, + "journal-check": 62526, + "journal-code": 62527, + "journal-medical": 62528, + "journal-minus": 62529, + "journal-plus": 62530, + "journal-richtext": 62531, + "journal-text": 62532, + "journal-x": 62533, + "journal": 62534, + "journals": 62535, + "joystick": 62536, + "justify-left": 62537, + "justify-right": 62538, + "justify": 62539, + "kanban-fill": 62540, + "kanban": 62541, + "key-fill": 62542, + "key": 62543, + "keyboard-fill": 62544, + "keyboard": 62545, + "ladder": 62546, + "lamp-fill": 62547, + "lamp": 62548, + "laptop-fill": 62549, + "laptop": 62550, + "layer-backward": 62551, + "layer-forward": 62552, + "layers-fill": 62553, + "layers-half": 62554, + "layers": 62555, + "layout-sidebar-inset-reverse": 62556, + "layout-sidebar-inset": 62557, + "layout-sidebar-reverse": 62558, + "layout-sidebar": 62559, + "layout-split": 62560, + "layout-text-sidebar-reverse": 62561, + "layout-text-sidebar": 62562, + "layout-text-window-reverse": 62563, + "layout-text-window": 62564, + "layout-three-columns": 62565, + "layout-wtf": 62566, + "life-preserver": 62567, + "lightbulb-fill": 62568, + "lightbulb-off-fill": 62569, + "lightbulb-off": 62570, + "lightbulb": 62571, + "lightning-charge-fill": 62572, + "lightning-charge": 62573, + "lightning-fill": 62574, + "lightning": 62575, + "link-45deg": 62576, + "link": 62577, + "linkedin": 62578, + "list-check": 62579, + "list-nested": 62580, + "list-ol": 62581, + "list-stars": 62582, + "list-task": 62583, + "list-ul": 62584, + "list": 62585, + "lock-fill": 62586, + "lock": 62587, + "mailbox": 62588, + "mailbox2": 62589, + "map-fill": 62590, + "map": 62591, + "markdown-fill": 62592, + "markdown": 62593, + "mask": 62594, + "megaphone-fill": 62595, + "megaphone": 62596, + "menu-app-fill": 62597, + "menu-app": 62598, + "menu-button-fill": 62599, + "menu-button-wide-fill": 62600, + "menu-button-wide": 62601, + "menu-button": 62602, + "menu-down": 62603, + "menu-up": 62604, + "mic-fill": 62605, + "mic-mute-fill": 62606, + "mic-mute": 62607, + "mic": 62608, + "minecart-loaded": 62609, + "minecart": 62610, + "moisture": 62611, + "moon-fill": 62612, + "moon-stars-fill": 62613, + "moon-stars": 62614, + "moon": 62615, + "mouse-fill": 62616, + "mouse": 62617, + "mouse2-fill": 62618, + "mouse2": 62619, + "mouse3-fill": 62620, + "mouse3": 62621, + "music-note-beamed": 62622, + "music-note-list": 62623, + "music-note": 62624, + "music-player-fill": 62625, + "music-player": 62626, + "newspaper": 62627, + "node-minus-fill": 62628, + "node-minus": 62629, + "node-plus-fill": 62630, + "node-plus": 62631, + "nut-fill": 62632, + "nut": 62633, + "octagon-fill": 62634, + "octagon-half": 62635, + "octagon": 62636, + "option": 62637, + "outlet": 62638, + "paint-bucket": 62639, + "palette-fill": 62640, + "palette": 62641, + "palette2": 62642, + "paperclip": 62643, + "paragraph": 62644, + "patch-check-fill": 62645, + "patch-check": 62646, + "patch-exclamation-fill": 62647, + "patch-exclamation": 62648, + "patch-minus-fill": 62649, + "patch-minus": 62650, + "patch-plus-fill": 62651, + "patch-plus": 62652, + "patch-question-fill": 62653, + "patch-question": 62654, + "pause-btn-fill": 62655, + "pause-btn": 62656, + "pause-circle-fill": 62657, + "pause-circle": 62658, + "pause-fill": 62659, + "pause": 62660, + "peace-fill": 62661, + "peace": 62662, + "pen-fill": 62663, + "pen": 62664, + "pencil-fill": 62665, + "pencil-square": 62666, + "pencil": 62667, + "pentagon-fill": 62668, + "pentagon-half": 62669, + "pentagon": 62670, + "people-fill": 62671, + "people": 62672, + "percent": 62673, + "person-badge-fill": 62674, + "person-badge": 62675, + "person-bounding-box": 62676, + "person-check-fill": 62677, + "person-check": 62678, + "person-circle": 62679, + "person-dash-fill": 62680, + "person-dash": 62681, + "person-fill": 62682, + "person-lines-fill": 62683, + "person-plus-fill": 62684, + "person-plus": 62685, + "person-square": 62686, + "person-x-fill": 62687, + "person-x": 62688, + "person": 62689, + "phone-fill": 62690, + "phone-landscape-fill": 62691, + "phone-landscape": 62692, + "phone-vibrate-fill": 62693, + "phone-vibrate": 62694, + "phone": 62695, + "pie-chart-fill": 62696, + "pie-chart": 62697, + "pin-angle-fill": 62698, + "pin-angle": 62699, + "pin-fill": 62700, + "pin": 62701, + "pip-fill": 62702, + "pip": 62703, + "play-btn-fill": 62704, + "play-btn": 62705, + "play-circle-fill": 62706, + "play-circle": 62707, + "play-fill": 62708, + "play": 62709, + "plug-fill": 62710, + "plug": 62711, + "plus-circle-dotted": 62712, + "plus-circle-fill": 62713, + "plus-circle": 62714, + "plus-square-dotted": 62715, + "plus-square-fill": 62716, + "plus-square": 62717, + "plus": 62718, + "power": 62719, + "printer-fill": 62720, + "printer": 62721, + "puzzle-fill": 62722, + "puzzle": 62723, + "question-circle-fill": 62724, + "question-circle": 62725, + "question-diamond-fill": 62726, + "question-diamond": 62727, + "question-octagon-fill": 62728, + "question-octagon": 62729, + "question-square-fill": 62730, + "question-square": 62731, + "question": 62732, + "rainbow": 62733, + "receipt-cutoff": 62734, + "receipt": 62735, + "reception-0": 62736, + "reception-1": 62737, + "reception-2": 62738, + "reception-3": 62739, + "reception-4": 62740, + "record-btn-fill": 62741, + "record-btn": 62742, + "record-circle-fill": 62743, + "record-circle": 62744, + "record-fill": 62745, + "record": 62746, + "record2-fill": 62747, + "record2": 62748, + "reply-all-fill": 62749, + "reply-all": 62750, + "reply-fill": 62751, + "reply": 62752, + "rss-fill": 62753, + "rss": 62754, + "rulers": 62755, + "save-fill": 62756, + "save": 62757, + "save2-fill": 62758, + "save2": 62759, + "scissors": 62760, + "screwdriver": 62761, + "search": 62762, + "segmented-nav": 62763, + "server": 62764, + "share-fill": 62765, + "share": 62766, + "shield-check": 62767, + "shield-exclamation": 62768, + "shield-fill-check": 62769, + "shield-fill-exclamation": 62770, + "shield-fill-minus": 62771, + "shield-fill-plus": 62772, + "shield-fill-x": 62773, + "shield-fill": 62774, + "shield-lock-fill": 62775, + "shield-lock": 62776, + "shield-minus": 62777, + "shield-plus": 62778, + "shield-shaded": 62779, + "shield-slash-fill": 62780, + "shield-slash": 62781, + "shield-x": 62782, + "shield": 62783, + "shift-fill": 62784, + "shift": 62785, + "shop-window": 62786, + "shop": 62787, + "shuffle": 62788, + "signpost-2-fill": 62789, + "signpost-2": 62790, + "signpost-fill": 62791, + "signpost-split-fill": 62792, + "signpost-split": 62793, + "signpost": 62794, + "sim-fill": 62795, + "sim": 62796, + "skip-backward-btn-fill": 62797, + "skip-backward-btn": 62798, + "skip-backward-circle-fill": 62799, + "skip-backward-circle": 62800, + "skip-backward-fill": 62801, + "skip-backward": 62802, + "skip-end-btn-fill": 62803, + "skip-end-btn": 62804, + "skip-end-circle-fill": 62805, + "skip-end-circle": 62806, + "skip-end-fill": 62807, + "skip-end": 62808, + "skip-forward-btn-fill": 62809, + "skip-forward-btn": 62810, + "skip-forward-circle-fill": 62811, + "skip-forward-circle": 62812, + "skip-forward-fill": 62813, + "skip-forward": 62814, + "skip-start-btn-fill": 62815, + "skip-start-btn": 62816, + "skip-start-circle-fill": 62817, + "skip-start-circle": 62818, + "skip-start-fill": 62819, + "skip-start": 62820, + "slack": 62821, + "slash-circle-fill": 62822, + "slash-circle": 62823, + "slash-square-fill": 62824, + "slash-square": 62825, + "slash": 62826, + "sliders": 62827, + "smartwatch": 62828, + "snow": 62829, + "snow2": 62830, + "snow3": 62831, + "sort-alpha-down-alt": 62832, + "sort-alpha-down": 62833, + "sort-alpha-up-alt": 62834, + "sort-alpha-up": 62835, + "sort-down-alt": 62836, + "sort-down": 62837, + "sort-numeric-down-alt": 62838, + "sort-numeric-down": 62839, + "sort-numeric-up-alt": 62840, + "sort-numeric-up": 62841, + "sort-up-alt": 62842, + "sort-up": 62843, + "soundwave": 62844, + "speaker-fill": 62845, + "speaker": 62846, + "speedometer": 62847, + "speedometer2": 62848, + "spellcheck": 62849, + "square-fill": 62850, + "square-half": 62851, + "square": 62852, + "stack": 62853, + "star-fill": 62854, + "star-half": 62855, + "star": 62856, + "stars": 62857, + "stickies-fill": 62858, + "stickies": 62859, + "sticky-fill": 62860, + "sticky": 62861, + "stop-btn-fill": 62862, + "stop-btn": 62863, + "stop-circle-fill": 62864, + "stop-circle": 62865, + "stop-fill": 62866, + "stop": 62867, + "stoplights-fill": 62868, + "stoplights": 62869, + "stopwatch-fill": 62870, + "stopwatch": 62871, + "subtract": 62872, + "suit-club-fill": 62873, + "suit-club": 62874, + "suit-diamond-fill": 62875, + "suit-diamond": 62876, + "suit-heart-fill": 62877, + "suit-heart": 62878, + "suit-spade-fill": 62879, + "suit-spade": 62880, + "sun-fill": 62881, + "sun": 62882, + "sunglasses": 62883, + "sunrise-fill": 62884, + "sunrise": 62885, + "sunset-fill": 62886, + "sunset": 62887, + "symmetry-horizontal": 62888, + "symmetry-vertical": 62889, + "table": 62890, + "tablet-fill": 62891, + "tablet-landscape-fill": 62892, + "tablet-landscape": 62893, + "tablet": 62894, + "tag-fill": 62895, + "tag": 62896, + "tags-fill": 62897, + "tags": 62898, + "telegram": 62899, + "telephone-fill": 62900, + "telephone-forward-fill": 62901, + "telephone-forward": 62902, + "telephone-inbound-fill": 62903, + "telephone-inbound": 62904, + "telephone-minus-fill": 62905, + "telephone-minus": 62906, + "telephone-outbound-fill": 62907, + "telephone-outbound": 62908, + "telephone-plus-fill": 62909, + "telephone-plus": 62910, + "telephone-x-fill": 62911, + "telephone-x": 62912, + "telephone": 62913, + "terminal-fill": 62914, + "terminal": 62915, + "text-center": 62916, + "text-indent-left": 62917, + "text-indent-right": 62918, + "text-left": 62919, + "text-paragraph": 62920, + "text-right": 62921, + "textarea-resize": 62922, + "textarea-t": 62923, + "textarea": 62924, + "thermometer-half": 62925, + "thermometer-high": 62926, + "thermometer-low": 62927, + "thermometer-snow": 62928, + "thermometer-sun": 62929, + "thermometer": 62930, + "three-dots-vertical": 62931, + "three-dots": 62932, + "toggle-off": 62933, + "toggle-on": 62934, + "toggle2-off": 62935, + "toggle2-on": 62936, + "toggles": 62937, + "toggles2": 62938, + "tools": 62939, + "tornado": 62940, + "trash-fill": 62941, + "trash": 62942, + "trash2-fill": 62943, + "trash2": 62944, + "tree-fill": 62945, + "tree": 62946, + "triangle-fill": 62947, + "triangle-half": 62948, + "triangle": 62949, + "trophy-fill": 62950, + "trophy": 62951, + "tropical-storm": 62952, + "truck-flatbed": 62953, + "truck": 62954, + "tsunami": 62955, + "tv-fill": 62956, + "tv": 62957, + "twitch": 62958, + "twitter": 62959, + "type-bold": 62960, + "type-h1": 62961, + "type-h2": 62962, + "type-h3": 62963, + "type-italic": 62964, + "type-strikethrough": 62965, + "type-underline": 62966, + "type": 62967, + "ui-checks-grid": 62968, + "ui-checks": 62969, + "ui-radios-grid": 62970, + "ui-radios": 62971, + "umbrella-fill": 62972, + "umbrella": 62973, + "union": 62974, + "unlock-fill": 62975, + "unlock": 62976, + "upc-scan": 62977, + "upc": 62978, + "upload": 62979, + "vector-pen": 62980, + "view-list": 62981, + "view-stacked": 62982, + "vinyl-fill": 62983, + "vinyl": 62984, + "voicemail": 62985, + "volume-down-fill": 62986, + "volume-down": 62987, + "volume-mute-fill": 62988, + "volume-mute": 62989, + "volume-off-fill": 62990, + "volume-off": 62991, + "volume-up-fill": 62992, + "volume-up": 62993, + "vr": 62994, + "wallet-fill": 62995, + "wallet": 62996, + "wallet2": 62997, + "watch": 62998, + "water": 62999, + "whatsapp": 63000, + "wifi-1": 63001, + "wifi-2": 63002, + "wifi-off": 63003, + "wifi": 63004, + "wind": 63005, + "window-dock": 63006, + "window-sidebar": 63007, + "window": 63008, + "wrench": 63009, + "x-circle-fill": 63010, + "x-circle": 63011, + "x-diamond-fill": 63012, + "x-diamond": 63013, + "x-octagon-fill": 63014, + "x-octagon": 63015, + "x-square-fill": 63016, + "x-square": 63017, + "x": 63018, + "youtube": 63019, + "zoom-in": 63020, + "zoom-out": 63021, + "bank": 63022, + "bank2": 63023, + "bell-slash-fill": 63024, + "bell-slash": 63025, + "cash-coin": 63026, + "check-lg": 63027, + "coin": 63028, + "currency-bitcoin": 63029, + "currency-dollar": 63030, + "currency-euro": 63031, + "currency-exchange": 63032, + "currency-pound": 63033, + "currency-yen": 63034, + "dash-lg": 63035, + "exclamation-lg": 63036, + "file-earmark-pdf-fill": 63037, + "file-earmark-pdf": 63038, + "file-pdf-fill": 63039, + "file-pdf": 63040, + "gender-ambiguous": 63041, + "gender-female": 63042, + "gender-male": 63043, + "gender-trans": 63044, + "headset-vr": 63045, + "info-lg": 63046, + "mastodon": 63047, + "messenger": 63048, + "piggy-bank-fill": 63049, + "piggy-bank": 63050, + "pin-map-fill": 63051, + "pin-map": 63052, + "plus-lg": 63053, + "question-lg": 63054, + "recycle": 63055, + "reddit": 63056, + "safe-fill": 63057, + "safe2-fill": 63058, + "safe2": 63059, + "sd-card-fill": 63060, + "sd-card": 63061, + "skype": 63062, + "slash-lg": 63063, + "translate": 63064, + "x-lg": 63065, + "safe": 63066, + "apple": 63067, + "microsoft": 63069, + "windows": 63070, + "behance": 63068, + "dribbble": 63071, + "line": 63072, + "medium": 63073, + "paypal": 63074, + "pinterest": 63075, + "signal": 63076, + "snapchat": 63077, + "spotify": 63078, + "stack-overflow": 63079, + "strava": 63080, + "wordpress": 63081, + "vimeo": 63082, + "activity": 63083, + "easel2-fill": 63084, + "easel2": 63085, + "easel3-fill": 63086, + "easel3": 63087, + "fan": 63088, + "fingerprint": 63089, + "graph-down-arrow": 63090, + "graph-up-arrow": 63091, + "hypnotize": 63092, + "magic": 63093, + "person-rolodex": 63094, + "person-video": 63095, + "person-video2": 63096, + "person-video3": 63097, + "person-workspace": 63098, + "radioactive": 63099, + "webcam-fill": 63100, + "webcam": 63101, + "yin-yang": 63102, + "bandaid-fill": 63104, + "bandaid": 63105, + "bluetooth": 63106, + "body-text": 63107, + "boombox": 63108, + "boxes": 63109, + "dpad-fill": 63110, + "dpad": 63111, + "ear-fill": 63112, + "ear": 63113, + "envelope-check-fill": 63115, + "envelope-check": 63116, + "envelope-dash-fill": 63118, + "envelope-dash": 63119, + "envelope-exclamation-fill": 63121, + "envelope-exclamation": 63122, + "envelope-plus-fill": 63123, + "envelope-plus": 63124, + "envelope-slash-fill": 63126, + "envelope-slash": 63127, + "envelope-x-fill": 63129, + "envelope-x": 63130, + "explicit-fill": 63131, + "explicit": 63132, + "git": 63133, + "infinity": 63134, + "list-columns-reverse": 63135, + "list-columns": 63136, + "meta": 63137, + "nintendo-switch": 63140, + "pc-display-horizontal": 63141, + "pc-display": 63142, + "pc-horizontal": 63143, + "pc": 63144, + "playstation": 63145, + "plus-slash-minus": 63146, + "projector-fill": 63147, + "projector": 63148, + "qr-code-scan": 63149, + "qr-code": 63150, + "quora": 63151, + "quote": 63152, + "robot": 63153, + "send-check-fill": 63154, + "send-check": 63155, + "send-dash-fill": 63156, + "send-dash": 63157, + "send-exclamation-fill": 63159, + "send-exclamation": 63160, + "send-fill": 63161, + "send-plus-fill": 63162, + "send-plus": 63163, + "send-slash-fill": 63164, + "send-slash": 63165, + "send-x-fill": 63166, + "send-x": 63167, + "send": 63168, + "steam": 63169, + "terminal-dash": 63171, + "terminal-plus": 63172, + "terminal-split": 63173, + "ticket-detailed-fill": 63174, + "ticket-detailed": 63175, + "ticket-fill": 63176, + "ticket-perforated-fill": 63177, + "ticket-perforated": 63178, + "ticket": 63179, + "tiktok": 63180, + "window-dash": 63181, + "window-desktop": 63182, + "window-fullscreen": 63183, + "window-plus": 63184, + "window-split": 63185, + "window-stack": 63186, + "window-x": 63187, + "xbox": 63188, + "ethernet": 63189, + "hdmi-fill": 63190, + "hdmi": 63191, + "usb-c-fill": 63192, + "usb-c": 63193, + "usb-fill": 63194, + "usb-plug-fill": 63195, + "usb-plug": 63196, + "usb-symbol": 63197, + "usb": 63198, + "boombox-fill": 63199, + "displayport": 63201, + "gpu-card": 63202, + "memory": 63203, + "modem-fill": 63204, + "modem": 63205, + "motherboard-fill": 63206, + "motherboard": 63207, + "optical-audio-fill": 63208, + "optical-audio": 63209, + "pci-card": 63210, + "router-fill": 63211, + "router": 63212, + "thunderbolt-fill": 63215, + "thunderbolt": 63216, + "usb-drive-fill": 63217, + "usb-drive": 63218, + "usb-micro-fill": 63219, + "usb-micro": 63220, + "usb-mini-fill": 63221, + "usb-mini": 63222, + "cloud-haze2": 63223, + "device-hdd-fill": 63224, + "device-hdd": 63225, + "device-ssd-fill": 63226, + "device-ssd": 63227, + "displayport-fill": 63228, + "mortarboard-fill": 63229, + "mortarboard": 63230, + "terminal-x": 63231, + "arrow-through-heart-fill": 63232, + "arrow-through-heart": 63233, + "badge-sd-fill": 63234, + "badge-sd": 63235, + "bag-heart-fill": 63236, + "bag-heart": 63237, + "balloon-fill": 63238, + "balloon-heart-fill": 63239, + "balloon-heart": 63240, + "balloon": 63241, + "box2-fill": 63242, + "box2-heart-fill": 63243, + "box2-heart": 63244, + "box2": 63245, + "braces-asterisk": 63246, + "calendar-heart-fill": 63247, + "calendar-heart": 63248, + "calendar2-heart-fill": 63249, + "calendar2-heart": 63250, + "chat-heart-fill": 63251, + "chat-heart": 63252, + "chat-left-heart-fill": 63253, + "chat-left-heart": 63254, + "chat-right-heart-fill": 63255, + "chat-right-heart": 63256, + "chat-square-heart-fill": 63257, + "chat-square-heart": 63258, + "clipboard-check-fill": 63259, + "clipboard-data-fill": 63260, + "clipboard-fill": 63261, + "clipboard-heart-fill": 63262, + "clipboard-heart": 63263, + "clipboard-minus-fill": 63264, + "clipboard-plus-fill": 63265, + "clipboard-pulse": 63266, + "clipboard-x-fill": 63267, + "clipboard2-check-fill": 63268, + "clipboard2-check": 63269, + "clipboard2-data-fill": 63270, + "clipboard2-data": 63271, + "clipboard2-fill": 63272, + "clipboard2-heart-fill": 63273, + "clipboard2-heart": 63274, + "clipboard2-minus-fill": 63275, + "clipboard2-minus": 63276, + "clipboard2-plus-fill": 63277, + "clipboard2-plus": 63278, + "clipboard2-pulse-fill": 63279, + "clipboard2-pulse": 63280, + "clipboard2-x-fill": 63281, + "clipboard2-x": 63282, + "clipboard2": 63283, + "emoji-kiss-fill": 63284, + "emoji-kiss": 63285, + "envelope-heart-fill": 63286, + "envelope-heart": 63287, + "envelope-open-heart-fill": 63288, + "envelope-open-heart": 63289, + "envelope-paper-fill": 63290, + "envelope-paper-heart-fill": 63291, + "envelope-paper-heart": 63292, + "envelope-paper": 63293, + "filetype-aac": 63294, + "filetype-ai": 63295, + "filetype-bmp": 63296, + "filetype-cs": 63297, + "filetype-css": 63298, + "filetype-csv": 63299, + "filetype-doc": 63300, + "filetype-docx": 63301, + "filetype-exe": 63302, + "filetype-gif": 63303, + "filetype-heic": 63304, + "filetype-html": 63305, + "filetype-java": 63306, + "filetype-jpg": 63307, + "filetype-js": 63308, + "filetype-jsx": 63309, + "filetype-key": 63310, + "filetype-m4p": 63311, + "filetype-md": 63312, + "filetype-mdx": 63313, + "filetype-mov": 63314, + "filetype-mp3": 63315, + "filetype-mp4": 63316, + "filetype-otf": 63317, + "filetype-pdf": 63318, + "filetype-php": 63319, + "filetype-png": 63320, + "filetype-ppt": 63322, + "filetype-psd": 63323, + "filetype-py": 63324, + "filetype-raw": 63325, + "filetype-rb": 63326, + "filetype-sass": 63327, + "filetype-scss": 63328, + "filetype-sh": 63329, + "filetype-svg": 63330, + "filetype-tiff": 63331, + "filetype-tsx": 63332, + "filetype-ttf": 63333, + "filetype-txt": 63334, + "filetype-wav": 63335, + "filetype-woff": 63336, + "filetype-xls": 63338, + "filetype-xml": 63339, + "filetype-yml": 63340, + "heart-arrow": 63341, + "heart-pulse-fill": 63342, + "heart-pulse": 63343, + "heartbreak-fill": 63344, + "heartbreak": 63345, + "hearts": 63346, + "hospital-fill": 63347, + "hospital": 63348, + "house-heart-fill": 63349, + "house-heart": 63350, + "incognito": 63351, + "magnet-fill": 63352, + "magnet": 63353, + "person-heart": 63354, + "person-hearts": 63355, + "phone-flip": 63356, + "plugin": 63357, + "postage-fill": 63358, + "postage-heart-fill": 63359, + "postage-heart": 63360, + "postage": 63361, + "postcard-fill": 63362, + "postcard-heart-fill": 63363, + "postcard-heart": 63364, + "postcard": 63365, + "search-heart-fill": 63366, + "search-heart": 63367, + "sliders2-vertical": 63368, + "sliders2": 63369, + "trash3-fill": 63370, + "trash3": 63371, + "valentine": 63372, + "valentine2": 63373, + "wrench-adjustable-circle-fill": 63374, + "wrench-adjustable-circle": 63375, + "wrench-adjustable": 63376, + "filetype-json": 63377, + "filetype-pptx": 63378, + "filetype-xlsx": 63379, + "1-circle-fill": 63382, + "1-circle": 63383, + "1-square-fill": 63384, + "1-square": 63385, + "2-circle-fill": 63388, + "2-circle": 63389, + "2-square-fill": 63390, + "2-square": 63391, + "3-circle-fill": 63394, + "3-circle": 63395, + "3-square-fill": 63396, + "3-square": 63397, + "4-circle-fill": 63400, + "4-circle": 63401, + "4-square-fill": 63402, + "4-square": 63403, + "5-circle-fill": 63406, + "5-circle": 63407, + "5-square-fill": 63408, + "5-square": 63409, + "6-circle-fill": 63412, + "6-circle": 63413, + "6-square-fill": 63414, + "6-square": 63415, + "7-circle-fill": 63418, + "7-circle": 63419, + "7-square-fill": 63420, + "7-square": 63421, + "8-circle-fill": 63424, + "8-circle": 63425, + "8-square-fill": 63426, + "8-square": 63427, + "9-circle-fill": 63430, + "9-circle": 63431, + "9-square-fill": 63432, + "9-square": 63433, + "airplane-engines-fill": 63434, + "airplane-engines": 63435, + "airplane-fill": 63436, + "airplane": 63437, + "alexa": 63438, + "alipay": 63439, + "android": 63440, + "android2": 63441, + "box-fill": 63442, + "box-seam-fill": 63443, + "browser-chrome": 63444, + "browser-edge": 63445, + "browser-firefox": 63446, + "browser-safari": 63447, + "c-circle-fill": 63450, + "c-circle": 63451, + "c-square-fill": 63452, + "c-square": 63453, + "capsule-pill": 63454, + "capsule": 63455, + "car-front-fill": 63456, + "car-front": 63457, + "cassette-fill": 63458, + "cassette": 63459, + "cc-circle-fill": 63462, + "cc-circle": 63463, + "cc-square-fill": 63464, + "cc-square": 63465, + "cup-hot-fill": 63466, + "cup-hot": 63467, + "currency-rupee": 63468, + "dropbox": 63469, + "escape": 63470, + "fast-forward-btn-fill": 63471, + "fast-forward-btn": 63472, + "fast-forward-circle-fill": 63473, + "fast-forward-circle": 63474, + "fast-forward-fill": 63475, + "fast-forward": 63476, + "filetype-sql": 63477, + "fire": 63478, + "google-play": 63479, + "h-circle-fill": 63482, + "h-circle": 63483, + "h-square-fill": 63484, + "h-square": 63485, + "indent": 63486, + "lungs-fill": 63487, + "lungs": 63488, + "microsoft-teams": 63489, + "p-circle-fill": 63492, + "p-circle": 63493, + "p-square-fill": 63494, + "p-square": 63495, + "pass-fill": 63496, + "pass": 63497, + "prescription": 63498, + "prescription2": 63499, + "r-circle-fill": 63502, + "r-circle": 63503, + "r-square-fill": 63504, + "r-square": 63505, + "repeat-1": 63506, + "repeat": 63507, + "rewind-btn-fill": 63508, + "rewind-btn": 63509, + "rewind-circle-fill": 63510, + "rewind-circle": 63511, + "rewind-fill": 63512, + "rewind": 63513, + "train-freight-front-fill": 63514, + "train-freight-front": 63515, + "train-front-fill": 63516, + "train-front": 63517, + "train-lightrail-front-fill": 63518, + "train-lightrail-front": 63519, + "truck-front-fill": 63520, + "truck-front": 63521, + "ubuntu": 63522, + "unindent": 63523, + "unity": 63524, + "universal-access-circle": 63525, + "universal-access": 63526, + "virus": 63527, + "virus2": 63528, + "wechat": 63529, + "yelp": 63530, + "sign-stop-fill": 63531, + "sign-stop-lights-fill": 63532, + "sign-stop-lights": 63533, + "sign-stop": 63534, + "sign-turn-left-fill": 63535, + "sign-turn-left": 63536, + "sign-turn-right-fill": 63537, + "sign-turn-right": 63538, + "sign-turn-slight-left-fill": 63539, + "sign-turn-slight-left": 63540, + "sign-turn-slight-right-fill": 63541, + "sign-turn-slight-right": 63542, + "sign-yield-fill": 63543, + "sign-yield": 63544, + "ev-station-fill": 63545, + "ev-station": 63546, + "fuel-pump-diesel-fill": 63547, + "fuel-pump-diesel": 63548, + "fuel-pump-fill": 63549, + "fuel-pump": 63550, + "0-circle-fill": 63551, + "0-circle": 63552, + "0-square-fill": 63553, + "0-square": 63554, + "rocket-fill": 63555, + "rocket-takeoff-fill": 63556, + "rocket-takeoff": 63557, + "rocket": 63558, + "stripe": 63559, + "subscript": 63560, + "superscript": 63561, + "trello": 63562, + "envelope-at-fill": 63563, + "envelope-at": 63564, + "regex": 63565, + "text-wrap": 63566, + "sign-dead-end-fill": 63567, + "sign-dead-end": 63568, + "sign-do-not-enter-fill": 63569, + "sign-do-not-enter": 63570, + "sign-intersection-fill": 63571, + "sign-intersection-side-fill": 63572, + "sign-intersection-side": 63573, + "sign-intersection-t-fill": 63574, + "sign-intersection-t": 63575, + "sign-intersection-y-fill": 63576, + "sign-intersection-y": 63577, + "sign-intersection": 63578, + "sign-merge-left-fill": 63579, + "sign-merge-left": 63580, + "sign-merge-right-fill": 63581, + "sign-merge-right": 63582, + "sign-no-left-turn-fill": 63583, + "sign-no-left-turn": 63584, + "sign-no-parking-fill": 63585, + "sign-no-parking": 63586, + "sign-no-right-turn-fill": 63587, + "sign-no-right-turn": 63588, + "sign-railroad-fill": 63589, + "sign-railroad": 63590, + "building-add": 63591, + "building-check": 63592, + "building-dash": 63593, + "building-down": 63594, + "building-exclamation": 63595, + "building-fill-add": 63596, + "building-fill-check": 63597, + "building-fill-dash": 63598, + "building-fill-down": 63599, + "building-fill-exclamation": 63600, + "building-fill-gear": 63601, + "building-fill-lock": 63602, + "building-fill-slash": 63603, + "building-fill-up": 63604, + "building-fill-x": 63605, + "building-fill": 63606, + "building-gear": 63607, + "building-lock": 63608, + "building-slash": 63609, + "building-up": 63610, + "building-x": 63611, + "buildings-fill": 63612, + "buildings": 63613, + "bus-front-fill": 63614, + "bus-front": 63615, + "ev-front-fill": 63616, + "ev-front": 63617, + "globe-americas": 63618, + "globe-asia-australia": 63619, + "globe-central-south-asia": 63620, + "globe-europe-africa": 63621, + "house-add-fill": 63622, + "house-add": 63623, + "house-check-fill": 63624, + "house-check": 63625, + "house-dash-fill": 63626, + "house-dash": 63627, + "house-down-fill": 63628, + "house-down": 63629, + "house-exclamation-fill": 63630, + "house-exclamation": 63631, + "house-gear-fill": 63632, + "house-gear": 63633, + "house-lock-fill": 63634, + "house-lock": 63635, + "house-slash-fill": 63636, + "house-slash": 63637, + "house-up-fill": 63638, + "house-up": 63639, + "house-x-fill": 63640, + "house-x": 63641, + "person-add": 63642, + "person-down": 63643, + "person-exclamation": 63644, + "person-fill-add": 63645, + "person-fill-check": 63646, + "person-fill-dash": 63647, + "person-fill-down": 63648, + "person-fill-exclamation": 63649, + "person-fill-gear": 63650, + "person-fill-lock": 63651, + "person-fill-slash": 63652, + "person-fill-up": 63653, + "person-fill-x": 63654, + "person-gear": 63655, + "person-lock": 63656, + "person-slash": 63657, + "person-up": 63658, + "scooter": 63659, + "taxi-front-fill": 63660, + "taxi-front": 63661, + "amd": 63662, + "database-add": 63663, + "database-check": 63664, + "database-dash": 63665, + "database-down": 63666, + "database-exclamation": 63667, + "database-fill-add": 63668, + "database-fill-check": 63669, + "database-fill-dash": 63670, + "database-fill-down": 63671, + "database-fill-exclamation": 63672, + "database-fill-gear": 63673, + "database-fill-lock": 63674, + "database-fill-slash": 63675, + "database-fill-up": 63676, + "database-fill-x": 63677, + "database-fill": 63678, + "database-gear": 63679, + "database-lock": 63680, + "database-slash": 63681, + "database-up": 63682, + "database-x": 63683, + "database": 63684, + "houses-fill": 63685, + "houses": 63686, + "nvidia": 63687, + "person-vcard-fill": 63688, + "person-vcard": 63689, + "sina-weibo": 63690, + "tencent-qq": 63691, + "wikipedia": 63692, + "alphabet-uppercase": 62117, + "alphabet": 63114, + "amazon": 63117, + "arrows-collapse-vertical": 63120, + "arrows-expand-vertical": 63125, + "arrows-vertical": 63128, + "arrows": 63138, + "ban-fill": 63139, + "ban": 63158, + "bing": 63170, + "cake": 63200, + "cake2": 63213, + "cookie": 63214, + "copy": 63321, + "crosshair": 63337, + "crosshair2": 63380, + "emoji-astonished-fill": 63381, + "emoji-astonished": 63386, + "emoji-grimace-fill": 63387, + "emoji-grimace": 63392, + "emoji-grin-fill": 63393, + "emoji-grin": 63398, + "emoji-surprise-fill": 63399, + "emoji-surprise": 63404, + "emoji-tear-fill": 63405, + "emoji-tear": 63410, + "envelope-arrow-down-fill": 63411, + "envelope-arrow-down": 63416, + "envelope-arrow-up-fill": 63417, + "envelope-arrow-up": 63422, + "feather": 63423, + "feather2": 63428, + "floppy-fill": 63429, + "floppy": 63448, + "floppy2-fill": 63449, + "floppy2": 63460, + "gitlab": 63461, + "highlighter": 63480, + "marker-tip": 63490, + "nvme-fill": 63491, + "nvme": 63500, + "opencollective": 63501, + "pci-card-network": 63693, + "pci-card-sound": 63694, + "radar": 63695, + "send-arrow-down-fill": 63696, + "send-arrow-down": 63697, + "send-arrow-up-fill": 63698, + "send-arrow-up": 63699, + "sim-slash-fill": 63700, + "sim-slash": 63701, + "sourceforge": 63702, + "substack": 63703, + "threads-fill": 63704, + "threads": 63705, + "transparency": 63706, + "twitter-x": 63707, + "type-h4": 63708, + "type-h5": 63709, + "type-h6": 63710, + "backpack-fill": 63711, + "backpack": 63712, + "backpack2-fill": 63713, + "backpack2": 63714, + "backpack3-fill": 63715, + "backpack3": 63716, + "backpack4-fill": 63717, + "backpack4": 63718, + "brilliance": 63719, + "cake-fill": 63720, + "cake2-fill": 63721, + "duffle-fill": 63722, + "duffle": 63723, + "exposure": 63724, + "gender-neuter": 63725, + "highlights": 63726, + "luggage-fill": 63727, + "luggage": 63728, + "mailbox-flag": 63729, + "mailbox2-flag": 63730, + "noise-reduction": 63731, + "passport-fill": 63732, + "passport": 63733, + "person-arms-up": 63734, + "person-raised-hand": 63735, + "person-standing-dress": 63736, + "person-standing": 63737, + "person-walking": 63738, + "person-wheelchair": 63739, + "shadows": 63740, + "suitcase-fill": 63741, + "suitcase-lg-fill": 63742, + "suitcase-lg": 63743, + "suitcase": 63744, + "suitcase2-fill": 63745, + "suitcase2": 63746, + "vignette": 63747, + "bluesky": 63481, + "tux": 63748, + "beaker-fill": 63749, + "beaker": 63750, + "flask-fill": 63751, + "flask-florence-fill": 63752, + "flask-florence": 63753, + "flask": 63754, + "leaf-fill": 63755, + "leaf": 63756, + "measuring-cup-fill": 63757, + "measuring-cup": 63758, + "unlock2-fill": 63759, + "unlock2": 63760, + "battery-low": 63761, + "anthropic": 63762, + "apple-music": 63763, + "claude": 63764, + "openai": 63765, + "perplexity": 63766, + "css": 63767, + "javascript": 63768, + "typescript": 63769, + "fork-knife": 63770, + "globe-americas-fill": 63771, + "globe-asia-australia-fill": 63772, + "globe-central-south-asia-fill": 63773, + "globe-europe-africa-fill": 63774 +} \ No newline at end of file diff --git a/RS_system/wwwroot/css/bootstrap-icons.scss b/RS_system/wwwroot/css/bootstrap-icons.scss new file mode 100644 index 0000000..19735c4 --- /dev/null +++ b/RS_system/wwwroot/css/bootstrap-icons.scss @@ -0,0 +1,2118 @@ +/*! + * Bootstrap Icons v1.13.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +$bootstrap-icons-font: "bootstrap-icons" !default; +$bootstrap-icons-font-dir: "./fonts" !default; +$bootstrap-icons-font-file: "#{$bootstrap-icons-font-dir}/#{$bootstrap-icons-font}" !default; +$bootstrap-icons-font-hash: "24e3eb84d0bcaf83d77f904c78ac1f47" !default; +$bootstrap-icons-font-src: url("#{$bootstrap-icons-font-file}.woff2?#{$bootstrap-icons-font-hash}") format("woff2"), + url("#{$bootstrap-icons-font-file}.woff?#{$bootstrap-icons-font-hash}") format("woff") !default; + +@font-face { + font-display: block; + font-family: $bootstrap-icons-font; + src: $bootstrap-icons-font-src; +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: $bootstrap-icons-font !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +$bootstrap-icons-map: ( + "123": "\f67f", + "alarm-fill": "\f101", + "alarm": "\f102", + "align-bottom": "\f103", + "align-center": "\f104", + "align-end": "\f105", + "align-middle": "\f106", + "align-start": "\f107", + "align-top": "\f108", + "alt": "\f109", + "app-indicator": "\f10a", + "app": "\f10b", + "archive-fill": "\f10c", + "archive": "\f10d", + "arrow-90deg-down": "\f10e", + "arrow-90deg-left": "\f10f", + "arrow-90deg-right": "\f110", + "arrow-90deg-up": "\f111", + "arrow-bar-down": "\f112", + "arrow-bar-left": "\f113", + "arrow-bar-right": "\f114", + "arrow-bar-up": "\f115", + "arrow-clockwise": "\f116", + "arrow-counterclockwise": "\f117", + "arrow-down-circle-fill": "\f118", + "arrow-down-circle": "\f119", + "arrow-down-left-circle-fill": "\f11a", + "arrow-down-left-circle": "\f11b", + "arrow-down-left-square-fill": "\f11c", + "arrow-down-left-square": "\f11d", + "arrow-down-left": "\f11e", + "arrow-down-right-circle-fill": "\f11f", + "arrow-down-right-circle": "\f120", + "arrow-down-right-square-fill": "\f121", + "arrow-down-right-square": "\f122", + "arrow-down-right": "\f123", + "arrow-down-short": "\f124", + "arrow-down-square-fill": "\f125", + "arrow-down-square": "\f126", + "arrow-down-up": "\f127", + "arrow-down": "\f128", + "arrow-left-circle-fill": "\f129", + "arrow-left-circle": "\f12a", + "arrow-left-right": "\f12b", + "arrow-left-short": "\f12c", + "arrow-left-square-fill": "\f12d", + "arrow-left-square": "\f12e", + "arrow-left": "\f12f", + "arrow-repeat": "\f130", + "arrow-return-left": "\f131", + "arrow-return-right": "\f132", + "arrow-right-circle-fill": "\f133", + "arrow-right-circle": "\f134", + "arrow-right-short": "\f135", + "arrow-right-square-fill": "\f136", + "arrow-right-square": "\f137", + "arrow-right": "\f138", + "arrow-up-circle-fill": "\f139", + "arrow-up-circle": "\f13a", + "arrow-up-left-circle-fill": "\f13b", + "arrow-up-left-circle": "\f13c", + "arrow-up-left-square-fill": "\f13d", + "arrow-up-left-square": "\f13e", + "arrow-up-left": "\f13f", + "arrow-up-right-circle-fill": "\f140", + "arrow-up-right-circle": "\f141", + "arrow-up-right-square-fill": "\f142", + "arrow-up-right-square": "\f143", + "arrow-up-right": "\f144", + "arrow-up-short": "\f145", + "arrow-up-square-fill": "\f146", + "arrow-up-square": "\f147", + "arrow-up": "\f148", + "arrows-angle-contract": "\f149", + "arrows-angle-expand": "\f14a", + "arrows-collapse": "\f14b", + "arrows-expand": "\f14c", + "arrows-fullscreen": "\f14d", + "arrows-move": "\f14e", + "aspect-ratio-fill": "\f14f", + "aspect-ratio": "\f150", + "asterisk": "\f151", + "at": "\f152", + "award-fill": "\f153", + "award": "\f154", + "back": "\f155", + "backspace-fill": "\f156", + "backspace-reverse-fill": "\f157", + "backspace-reverse": "\f158", + "backspace": "\f159", + "badge-3d-fill": "\f15a", + "badge-3d": "\f15b", + "badge-4k-fill": "\f15c", + "badge-4k": "\f15d", + "badge-8k-fill": "\f15e", + "badge-8k": "\f15f", + "badge-ad-fill": "\f160", + "badge-ad": "\f161", + "badge-ar-fill": "\f162", + "badge-ar": "\f163", + "badge-cc-fill": "\f164", + "badge-cc": "\f165", + "badge-hd-fill": "\f166", + "badge-hd": "\f167", + "badge-tm-fill": "\f168", + "badge-tm": "\f169", + "badge-vo-fill": "\f16a", + "badge-vo": "\f16b", + "badge-vr-fill": "\f16c", + "badge-vr": "\f16d", + "badge-wc-fill": "\f16e", + "badge-wc": "\f16f", + "bag-check-fill": "\f170", + "bag-check": "\f171", + "bag-dash-fill": "\f172", + "bag-dash": "\f173", + "bag-fill": "\f174", + "bag-plus-fill": "\f175", + "bag-plus": "\f176", + "bag-x-fill": "\f177", + "bag-x": "\f178", + "bag": "\f179", + "bar-chart-fill": "\f17a", + "bar-chart-line-fill": "\f17b", + "bar-chart-line": "\f17c", + "bar-chart-steps": "\f17d", + "bar-chart": "\f17e", + "basket-fill": "\f17f", + "basket": "\f180", + "basket2-fill": "\f181", + "basket2": "\f182", + "basket3-fill": "\f183", + "basket3": "\f184", + "battery-charging": "\f185", + "battery-full": "\f186", + "battery-half": "\f187", + "battery": "\f188", + "bell-fill": "\f189", + "bell": "\f18a", + "bezier": "\f18b", + "bezier2": "\f18c", + "bicycle": "\f18d", + "binoculars-fill": "\f18e", + "binoculars": "\f18f", + "blockquote-left": "\f190", + "blockquote-right": "\f191", + "book-fill": "\f192", + "book-half": "\f193", + "book": "\f194", + "bookmark-check-fill": "\f195", + "bookmark-check": "\f196", + "bookmark-dash-fill": "\f197", + "bookmark-dash": "\f198", + "bookmark-fill": "\f199", + "bookmark-heart-fill": "\f19a", + "bookmark-heart": "\f19b", + "bookmark-plus-fill": "\f19c", + "bookmark-plus": "\f19d", + "bookmark-star-fill": "\f19e", + "bookmark-star": "\f19f", + "bookmark-x-fill": "\f1a0", + "bookmark-x": "\f1a1", + "bookmark": "\f1a2", + "bookmarks-fill": "\f1a3", + "bookmarks": "\f1a4", + "bookshelf": "\f1a5", + "bootstrap-fill": "\f1a6", + "bootstrap-reboot": "\f1a7", + "bootstrap": "\f1a8", + "border-all": "\f1a9", + "border-bottom": "\f1aa", + "border-center": "\f1ab", + "border-inner": "\f1ac", + "border-left": "\f1ad", + "border-middle": "\f1ae", + "border-outer": "\f1af", + "border-right": "\f1b0", + "border-style": "\f1b1", + "border-top": "\f1b2", + "border-width": "\f1b3", + "border": "\f1b4", + "bounding-box-circles": "\f1b5", + "bounding-box": "\f1b6", + "box-arrow-down-left": "\f1b7", + "box-arrow-down-right": "\f1b8", + "box-arrow-down": "\f1b9", + "box-arrow-in-down-left": "\f1ba", + "box-arrow-in-down-right": "\f1bb", + "box-arrow-in-down": "\f1bc", + "box-arrow-in-left": "\f1bd", + "box-arrow-in-right": "\f1be", + "box-arrow-in-up-left": "\f1bf", + "box-arrow-in-up-right": "\f1c0", + "box-arrow-in-up": "\f1c1", + "box-arrow-left": "\f1c2", + "box-arrow-right": "\f1c3", + "box-arrow-up-left": "\f1c4", + "box-arrow-up-right": "\f1c5", + "box-arrow-up": "\f1c6", + "box-seam": "\f1c7", + "box": "\f1c8", + "braces": "\f1c9", + "bricks": "\f1ca", + "briefcase-fill": "\f1cb", + "briefcase": "\f1cc", + "brightness-alt-high-fill": "\f1cd", + "brightness-alt-high": "\f1ce", + "brightness-alt-low-fill": "\f1cf", + "brightness-alt-low": "\f1d0", + "brightness-high-fill": "\f1d1", + "brightness-high": "\f1d2", + "brightness-low-fill": "\f1d3", + "brightness-low": "\f1d4", + "broadcast-pin": "\f1d5", + "broadcast": "\f1d6", + "brush-fill": "\f1d7", + "brush": "\f1d8", + "bucket-fill": "\f1d9", + "bucket": "\f1da", + "bug-fill": "\f1db", + "bug": "\f1dc", + "building": "\f1dd", + "bullseye": "\f1de", + "calculator-fill": "\f1df", + "calculator": "\f1e0", + "calendar-check-fill": "\f1e1", + "calendar-check": "\f1e2", + "calendar-date-fill": "\f1e3", + "calendar-date": "\f1e4", + "calendar-day-fill": "\f1e5", + "calendar-day": "\f1e6", + "calendar-event-fill": "\f1e7", + "calendar-event": "\f1e8", + "calendar-fill": "\f1e9", + "calendar-minus-fill": "\f1ea", + "calendar-minus": "\f1eb", + "calendar-month-fill": "\f1ec", + "calendar-month": "\f1ed", + "calendar-plus-fill": "\f1ee", + "calendar-plus": "\f1ef", + "calendar-range-fill": "\f1f0", + "calendar-range": "\f1f1", + "calendar-week-fill": "\f1f2", + "calendar-week": "\f1f3", + "calendar-x-fill": "\f1f4", + "calendar-x": "\f1f5", + "calendar": "\f1f6", + "calendar2-check-fill": "\f1f7", + "calendar2-check": "\f1f8", + "calendar2-date-fill": "\f1f9", + "calendar2-date": "\f1fa", + "calendar2-day-fill": "\f1fb", + "calendar2-day": "\f1fc", + "calendar2-event-fill": "\f1fd", + "calendar2-event": "\f1fe", + "calendar2-fill": "\f1ff", + "calendar2-minus-fill": "\f200", + "calendar2-minus": "\f201", + "calendar2-month-fill": "\f202", + "calendar2-month": "\f203", + "calendar2-plus-fill": "\f204", + "calendar2-plus": "\f205", + "calendar2-range-fill": "\f206", + "calendar2-range": "\f207", + "calendar2-week-fill": "\f208", + "calendar2-week": "\f209", + "calendar2-x-fill": "\f20a", + "calendar2-x": "\f20b", + "calendar2": "\f20c", + "calendar3-event-fill": "\f20d", + "calendar3-event": "\f20e", + "calendar3-fill": "\f20f", + "calendar3-range-fill": "\f210", + "calendar3-range": "\f211", + "calendar3-week-fill": "\f212", + "calendar3-week": "\f213", + "calendar3": "\f214", + "calendar4-event": "\f215", + "calendar4-range": "\f216", + "calendar4-week": "\f217", + "calendar4": "\f218", + "camera-fill": "\f219", + "camera-reels-fill": "\f21a", + "camera-reels": "\f21b", + "camera-video-fill": "\f21c", + "camera-video-off-fill": "\f21d", + "camera-video-off": "\f21e", + "camera-video": "\f21f", + "camera": "\f220", + "camera2": "\f221", + "capslock-fill": "\f222", + "capslock": "\f223", + "card-checklist": "\f224", + "card-heading": "\f225", + "card-image": "\f226", + "card-list": "\f227", + "card-text": "\f228", + "caret-down-fill": "\f229", + "caret-down-square-fill": "\f22a", + "caret-down-square": "\f22b", + "caret-down": "\f22c", + "caret-left-fill": "\f22d", + "caret-left-square-fill": "\f22e", + "caret-left-square": "\f22f", + "caret-left": "\f230", + "caret-right-fill": "\f231", + "caret-right-square-fill": "\f232", + "caret-right-square": "\f233", + "caret-right": "\f234", + "caret-up-fill": "\f235", + "caret-up-square-fill": "\f236", + "caret-up-square": "\f237", + "caret-up": "\f238", + "cart-check-fill": "\f239", + "cart-check": "\f23a", + "cart-dash-fill": "\f23b", + "cart-dash": "\f23c", + "cart-fill": "\f23d", + "cart-plus-fill": "\f23e", + "cart-plus": "\f23f", + "cart-x-fill": "\f240", + "cart-x": "\f241", + "cart": "\f242", + "cart2": "\f243", + "cart3": "\f244", + "cart4": "\f245", + "cash-stack": "\f246", + "cash": "\f247", + "cast": "\f248", + "chat-dots-fill": "\f249", + "chat-dots": "\f24a", + "chat-fill": "\f24b", + "chat-left-dots-fill": "\f24c", + "chat-left-dots": "\f24d", + "chat-left-fill": "\f24e", + "chat-left-quote-fill": "\f24f", + "chat-left-quote": "\f250", + "chat-left-text-fill": "\f251", + "chat-left-text": "\f252", + "chat-left": "\f253", + "chat-quote-fill": "\f254", + "chat-quote": "\f255", + "chat-right-dots-fill": "\f256", + "chat-right-dots": "\f257", + "chat-right-fill": "\f258", + "chat-right-quote-fill": "\f259", + "chat-right-quote": "\f25a", + "chat-right-text-fill": "\f25b", + "chat-right-text": "\f25c", + "chat-right": "\f25d", + "chat-square-dots-fill": "\f25e", + "chat-square-dots": "\f25f", + "chat-square-fill": "\f260", + "chat-square-quote-fill": "\f261", + "chat-square-quote": "\f262", + "chat-square-text-fill": "\f263", + "chat-square-text": "\f264", + "chat-square": "\f265", + "chat-text-fill": "\f266", + "chat-text": "\f267", + "chat": "\f268", + "check-all": "\f269", + "check-circle-fill": "\f26a", + "check-circle": "\f26b", + "check-square-fill": "\f26c", + "check-square": "\f26d", + "check": "\f26e", + "check2-all": "\f26f", + "check2-circle": "\f270", + "check2-square": "\f271", + "check2": "\f272", + "chevron-bar-contract": "\f273", + "chevron-bar-down": "\f274", + "chevron-bar-expand": "\f275", + "chevron-bar-left": "\f276", + "chevron-bar-right": "\f277", + "chevron-bar-up": "\f278", + "chevron-compact-down": "\f279", + "chevron-compact-left": "\f27a", + "chevron-compact-right": "\f27b", + "chevron-compact-up": "\f27c", + "chevron-contract": "\f27d", + "chevron-double-down": "\f27e", + "chevron-double-left": "\f27f", + "chevron-double-right": "\f280", + "chevron-double-up": "\f281", + "chevron-down": "\f282", + "chevron-expand": "\f283", + "chevron-left": "\f284", + "chevron-right": "\f285", + "chevron-up": "\f286", + "circle-fill": "\f287", + "circle-half": "\f288", + "circle-square": "\f289", + "circle": "\f28a", + "clipboard-check": "\f28b", + "clipboard-data": "\f28c", + "clipboard-minus": "\f28d", + "clipboard-plus": "\f28e", + "clipboard-x": "\f28f", + "clipboard": "\f290", + "clock-fill": "\f291", + "clock-history": "\f292", + "clock": "\f293", + "cloud-arrow-down-fill": "\f294", + "cloud-arrow-down": "\f295", + "cloud-arrow-up-fill": "\f296", + "cloud-arrow-up": "\f297", + "cloud-check-fill": "\f298", + "cloud-check": "\f299", + "cloud-download-fill": "\f29a", + "cloud-download": "\f29b", + "cloud-drizzle-fill": "\f29c", + "cloud-drizzle": "\f29d", + "cloud-fill": "\f29e", + "cloud-fog-fill": "\f29f", + "cloud-fog": "\f2a0", + "cloud-fog2-fill": "\f2a1", + "cloud-fog2": "\f2a2", + "cloud-hail-fill": "\f2a3", + "cloud-hail": "\f2a4", + "cloud-haze-fill": "\f2a6", + "cloud-haze": "\f2a7", + "cloud-haze2-fill": "\f2a8", + "cloud-lightning-fill": "\f2a9", + "cloud-lightning-rain-fill": "\f2aa", + "cloud-lightning-rain": "\f2ab", + "cloud-lightning": "\f2ac", + "cloud-minus-fill": "\f2ad", + "cloud-minus": "\f2ae", + "cloud-moon-fill": "\f2af", + "cloud-moon": "\f2b0", + "cloud-plus-fill": "\f2b1", + "cloud-plus": "\f2b2", + "cloud-rain-fill": "\f2b3", + "cloud-rain-heavy-fill": "\f2b4", + "cloud-rain-heavy": "\f2b5", + "cloud-rain": "\f2b6", + "cloud-slash-fill": "\f2b7", + "cloud-slash": "\f2b8", + "cloud-sleet-fill": "\f2b9", + "cloud-sleet": "\f2ba", + "cloud-snow-fill": "\f2bb", + "cloud-snow": "\f2bc", + "cloud-sun-fill": "\f2bd", + "cloud-sun": "\f2be", + "cloud-upload-fill": "\f2bf", + "cloud-upload": "\f2c0", + "cloud": "\f2c1", + "clouds-fill": "\f2c2", + "clouds": "\f2c3", + "cloudy-fill": "\f2c4", + "cloudy": "\f2c5", + "code-slash": "\f2c6", + "code-square": "\f2c7", + "code": "\f2c8", + "collection-fill": "\f2c9", + "collection-play-fill": "\f2ca", + "collection-play": "\f2cb", + "collection": "\f2cc", + "columns-gap": "\f2cd", + "columns": "\f2ce", + "command": "\f2cf", + "compass-fill": "\f2d0", + "compass": "\f2d1", + "cone-striped": "\f2d2", + "cone": "\f2d3", + "controller": "\f2d4", + "cpu-fill": "\f2d5", + "cpu": "\f2d6", + "credit-card-2-back-fill": "\f2d7", + "credit-card-2-back": "\f2d8", + "credit-card-2-front-fill": "\f2d9", + "credit-card-2-front": "\f2da", + "credit-card-fill": "\f2db", + "credit-card": "\f2dc", + "crop": "\f2dd", + "cup-fill": "\f2de", + "cup-straw": "\f2df", + "cup": "\f2e0", + "cursor-fill": "\f2e1", + "cursor-text": "\f2e2", + "cursor": "\f2e3", + "dash-circle-dotted": "\f2e4", + "dash-circle-fill": "\f2e5", + "dash-circle": "\f2e6", + "dash-square-dotted": "\f2e7", + "dash-square-fill": "\f2e8", + "dash-square": "\f2e9", + "dash": "\f2ea", + "diagram-2-fill": "\f2eb", + "diagram-2": "\f2ec", + "diagram-3-fill": "\f2ed", + "diagram-3": "\f2ee", + "diamond-fill": "\f2ef", + "diamond-half": "\f2f0", + "diamond": "\f2f1", + "dice-1-fill": "\f2f2", + "dice-1": "\f2f3", + "dice-2-fill": "\f2f4", + "dice-2": "\f2f5", + "dice-3-fill": "\f2f6", + "dice-3": "\f2f7", + "dice-4-fill": "\f2f8", + "dice-4": "\f2f9", + "dice-5-fill": "\f2fa", + "dice-5": "\f2fb", + "dice-6-fill": "\f2fc", + "dice-6": "\f2fd", + "disc-fill": "\f2fe", + "disc": "\f2ff", + "discord": "\f300", + "display-fill": "\f301", + "display": "\f302", + "distribute-horizontal": "\f303", + "distribute-vertical": "\f304", + "door-closed-fill": "\f305", + "door-closed": "\f306", + "door-open-fill": "\f307", + "door-open": "\f308", + "dot": "\f309", + "download": "\f30a", + "droplet-fill": "\f30b", + "droplet-half": "\f30c", + "droplet": "\f30d", + "earbuds": "\f30e", + "easel-fill": "\f30f", + "easel": "\f310", + "egg-fill": "\f311", + "egg-fried": "\f312", + "egg": "\f313", + "eject-fill": "\f314", + "eject": "\f315", + "emoji-angry-fill": "\f316", + "emoji-angry": "\f317", + "emoji-dizzy-fill": "\f318", + "emoji-dizzy": "\f319", + "emoji-expressionless-fill": "\f31a", + "emoji-expressionless": "\f31b", + "emoji-frown-fill": "\f31c", + "emoji-frown": "\f31d", + "emoji-heart-eyes-fill": "\f31e", + "emoji-heart-eyes": "\f31f", + "emoji-laughing-fill": "\f320", + "emoji-laughing": "\f321", + "emoji-neutral-fill": "\f322", + "emoji-neutral": "\f323", + "emoji-smile-fill": "\f324", + "emoji-smile-upside-down-fill": "\f325", + "emoji-smile-upside-down": "\f326", + "emoji-smile": "\f327", + "emoji-sunglasses-fill": "\f328", + "emoji-sunglasses": "\f329", + "emoji-wink-fill": "\f32a", + "emoji-wink": "\f32b", + "envelope-fill": "\f32c", + "envelope-open-fill": "\f32d", + "envelope-open": "\f32e", + "envelope": "\f32f", + "eraser-fill": "\f330", + "eraser": "\f331", + "exclamation-circle-fill": "\f332", + "exclamation-circle": "\f333", + "exclamation-diamond-fill": "\f334", + "exclamation-diamond": "\f335", + "exclamation-octagon-fill": "\f336", + "exclamation-octagon": "\f337", + "exclamation-square-fill": "\f338", + "exclamation-square": "\f339", + "exclamation-triangle-fill": "\f33a", + "exclamation-triangle": "\f33b", + "exclamation": "\f33c", + "exclude": "\f33d", + "eye-fill": "\f33e", + "eye-slash-fill": "\f33f", + "eye-slash": "\f340", + "eye": "\f341", + "eyedropper": "\f342", + "eyeglasses": "\f343", + "facebook": "\f344", + "file-arrow-down-fill": "\f345", + "file-arrow-down": "\f346", + "file-arrow-up-fill": "\f347", + "file-arrow-up": "\f348", + "file-bar-graph-fill": "\f349", + "file-bar-graph": "\f34a", + "file-binary-fill": "\f34b", + "file-binary": "\f34c", + "file-break-fill": "\f34d", + "file-break": "\f34e", + "file-check-fill": "\f34f", + "file-check": "\f350", + "file-code-fill": "\f351", + "file-code": "\f352", + "file-diff-fill": "\f353", + "file-diff": "\f354", + "file-earmark-arrow-down-fill": "\f355", + "file-earmark-arrow-down": "\f356", + "file-earmark-arrow-up-fill": "\f357", + "file-earmark-arrow-up": "\f358", + "file-earmark-bar-graph-fill": "\f359", + "file-earmark-bar-graph": "\f35a", + "file-earmark-binary-fill": "\f35b", + "file-earmark-binary": "\f35c", + "file-earmark-break-fill": "\f35d", + "file-earmark-break": "\f35e", + "file-earmark-check-fill": "\f35f", + "file-earmark-check": "\f360", + "file-earmark-code-fill": "\f361", + "file-earmark-code": "\f362", + "file-earmark-diff-fill": "\f363", + "file-earmark-diff": "\f364", + "file-earmark-easel-fill": "\f365", + "file-earmark-easel": "\f366", + "file-earmark-excel-fill": "\f367", + "file-earmark-excel": "\f368", + "file-earmark-fill": "\f369", + "file-earmark-font-fill": "\f36a", + "file-earmark-font": "\f36b", + "file-earmark-image-fill": "\f36c", + "file-earmark-image": "\f36d", + "file-earmark-lock-fill": "\f36e", + "file-earmark-lock": "\f36f", + "file-earmark-lock2-fill": "\f370", + "file-earmark-lock2": "\f371", + "file-earmark-medical-fill": "\f372", + "file-earmark-medical": "\f373", + "file-earmark-minus-fill": "\f374", + "file-earmark-minus": "\f375", + "file-earmark-music-fill": "\f376", + "file-earmark-music": "\f377", + "file-earmark-person-fill": "\f378", + "file-earmark-person": "\f379", + "file-earmark-play-fill": "\f37a", + "file-earmark-play": "\f37b", + "file-earmark-plus-fill": "\f37c", + "file-earmark-plus": "\f37d", + "file-earmark-post-fill": "\f37e", + "file-earmark-post": "\f37f", + "file-earmark-ppt-fill": "\f380", + "file-earmark-ppt": "\f381", + "file-earmark-richtext-fill": "\f382", + "file-earmark-richtext": "\f383", + "file-earmark-ruled-fill": "\f384", + "file-earmark-ruled": "\f385", + "file-earmark-slides-fill": "\f386", + "file-earmark-slides": "\f387", + "file-earmark-spreadsheet-fill": "\f388", + "file-earmark-spreadsheet": "\f389", + "file-earmark-text-fill": "\f38a", + "file-earmark-text": "\f38b", + "file-earmark-word-fill": "\f38c", + "file-earmark-word": "\f38d", + "file-earmark-x-fill": "\f38e", + "file-earmark-x": "\f38f", + "file-earmark-zip-fill": "\f390", + "file-earmark-zip": "\f391", + "file-earmark": "\f392", + "file-easel-fill": "\f393", + "file-easel": "\f394", + "file-excel-fill": "\f395", + "file-excel": "\f396", + "file-fill": "\f397", + "file-font-fill": "\f398", + "file-font": "\f399", + "file-image-fill": "\f39a", + "file-image": "\f39b", + "file-lock-fill": "\f39c", + "file-lock": "\f39d", + "file-lock2-fill": "\f39e", + "file-lock2": "\f39f", + "file-medical-fill": "\f3a0", + "file-medical": "\f3a1", + "file-minus-fill": "\f3a2", + "file-minus": "\f3a3", + "file-music-fill": "\f3a4", + "file-music": "\f3a5", + "file-person-fill": "\f3a6", + "file-person": "\f3a7", + "file-play-fill": "\f3a8", + "file-play": "\f3a9", + "file-plus-fill": "\f3aa", + "file-plus": "\f3ab", + "file-post-fill": "\f3ac", + "file-post": "\f3ad", + "file-ppt-fill": "\f3ae", + "file-ppt": "\f3af", + "file-richtext-fill": "\f3b0", + "file-richtext": "\f3b1", + "file-ruled-fill": "\f3b2", + "file-ruled": "\f3b3", + "file-slides-fill": "\f3b4", + "file-slides": "\f3b5", + "file-spreadsheet-fill": "\f3b6", + "file-spreadsheet": "\f3b7", + "file-text-fill": "\f3b8", + "file-text": "\f3b9", + "file-word-fill": "\f3ba", + "file-word": "\f3bb", + "file-x-fill": "\f3bc", + "file-x": "\f3bd", + "file-zip-fill": "\f3be", + "file-zip": "\f3bf", + "file": "\f3c0", + "files-alt": "\f3c1", + "files": "\f3c2", + "film": "\f3c3", + "filter-circle-fill": "\f3c4", + "filter-circle": "\f3c5", + "filter-left": "\f3c6", + "filter-right": "\f3c7", + "filter-square-fill": "\f3c8", + "filter-square": "\f3c9", + "filter": "\f3ca", + "flag-fill": "\f3cb", + "flag": "\f3cc", + "flower1": "\f3cd", + "flower2": "\f3ce", + "flower3": "\f3cf", + "folder-check": "\f3d0", + "folder-fill": "\f3d1", + "folder-minus": "\f3d2", + "folder-plus": "\f3d3", + "folder-symlink-fill": "\f3d4", + "folder-symlink": "\f3d5", + "folder-x": "\f3d6", + "folder": "\f3d7", + "folder2-open": "\f3d8", + "folder2": "\f3d9", + "fonts": "\f3da", + "forward-fill": "\f3db", + "forward": "\f3dc", + "front": "\f3dd", + "fullscreen-exit": "\f3de", + "fullscreen": "\f3df", + "funnel-fill": "\f3e0", + "funnel": "\f3e1", + "gear-fill": "\f3e2", + "gear-wide-connected": "\f3e3", + "gear-wide": "\f3e4", + "gear": "\f3e5", + "gem": "\f3e6", + "geo-alt-fill": "\f3e7", + "geo-alt": "\f3e8", + "geo-fill": "\f3e9", + "geo": "\f3ea", + "gift-fill": "\f3eb", + "gift": "\f3ec", + "github": "\f3ed", + "globe": "\f3ee", + "globe2": "\f3ef", + "google": "\f3f0", + "graph-down": "\f3f1", + "graph-up": "\f3f2", + "grid-1x2-fill": "\f3f3", + "grid-1x2": "\f3f4", + "grid-3x2-gap-fill": "\f3f5", + "grid-3x2-gap": "\f3f6", + "grid-3x2": "\f3f7", + "grid-3x3-gap-fill": "\f3f8", + "grid-3x3-gap": "\f3f9", + "grid-3x3": "\f3fa", + "grid-fill": "\f3fb", + "grid": "\f3fc", + "grip-horizontal": "\f3fd", + "grip-vertical": "\f3fe", + "hammer": "\f3ff", + "hand-index-fill": "\f400", + "hand-index-thumb-fill": "\f401", + "hand-index-thumb": "\f402", + "hand-index": "\f403", + "hand-thumbs-down-fill": "\f404", + "hand-thumbs-down": "\f405", + "hand-thumbs-up-fill": "\f406", + "hand-thumbs-up": "\f407", + "handbag-fill": "\f408", + "handbag": "\f409", + "hash": "\f40a", + "hdd-fill": "\f40b", + "hdd-network-fill": "\f40c", + "hdd-network": "\f40d", + "hdd-rack-fill": "\f40e", + "hdd-rack": "\f40f", + "hdd-stack-fill": "\f410", + "hdd-stack": "\f411", + "hdd": "\f412", + "headphones": "\f413", + "headset": "\f414", + "heart-fill": "\f415", + "heart-half": "\f416", + "heart": "\f417", + "heptagon-fill": "\f418", + "heptagon-half": "\f419", + "heptagon": "\f41a", + "hexagon-fill": "\f41b", + "hexagon-half": "\f41c", + "hexagon": "\f41d", + "hourglass-bottom": "\f41e", + "hourglass-split": "\f41f", + "hourglass-top": "\f420", + "hourglass": "\f421", + "house-door-fill": "\f422", + "house-door": "\f423", + "house-fill": "\f424", + "house": "\f425", + "hr": "\f426", + "hurricane": "\f427", + "image-alt": "\f428", + "image-fill": "\f429", + "image": "\f42a", + "images": "\f42b", + "inbox-fill": "\f42c", + "inbox": "\f42d", + "inboxes-fill": "\f42e", + "inboxes": "\f42f", + "info-circle-fill": "\f430", + "info-circle": "\f431", + "info-square-fill": "\f432", + "info-square": "\f433", + "info": "\f434", + "input-cursor-text": "\f435", + "input-cursor": "\f436", + "instagram": "\f437", + "intersect": "\f438", + "journal-album": "\f439", + "journal-arrow-down": "\f43a", + "journal-arrow-up": "\f43b", + "journal-bookmark-fill": "\f43c", + "journal-bookmark": "\f43d", + "journal-check": "\f43e", + "journal-code": "\f43f", + "journal-medical": "\f440", + "journal-minus": "\f441", + "journal-plus": "\f442", + "journal-richtext": "\f443", + "journal-text": "\f444", + "journal-x": "\f445", + "journal": "\f446", + "journals": "\f447", + "joystick": "\f448", + "justify-left": "\f449", + "justify-right": "\f44a", + "justify": "\f44b", + "kanban-fill": "\f44c", + "kanban": "\f44d", + "key-fill": "\f44e", + "key": "\f44f", + "keyboard-fill": "\f450", + "keyboard": "\f451", + "ladder": "\f452", + "lamp-fill": "\f453", + "lamp": "\f454", + "laptop-fill": "\f455", + "laptop": "\f456", + "layer-backward": "\f457", + "layer-forward": "\f458", + "layers-fill": "\f459", + "layers-half": "\f45a", + "layers": "\f45b", + "layout-sidebar-inset-reverse": "\f45c", + "layout-sidebar-inset": "\f45d", + "layout-sidebar-reverse": "\f45e", + "layout-sidebar": "\f45f", + "layout-split": "\f460", + "layout-text-sidebar-reverse": "\f461", + "layout-text-sidebar": "\f462", + "layout-text-window-reverse": "\f463", + "layout-text-window": "\f464", + "layout-three-columns": "\f465", + "layout-wtf": "\f466", + "life-preserver": "\f467", + "lightbulb-fill": "\f468", + "lightbulb-off-fill": "\f469", + "lightbulb-off": "\f46a", + "lightbulb": "\f46b", + "lightning-charge-fill": "\f46c", + "lightning-charge": "\f46d", + "lightning-fill": "\f46e", + "lightning": "\f46f", + "link-45deg": "\f470", + "link": "\f471", + "linkedin": "\f472", + "list-check": "\f473", + "list-nested": "\f474", + "list-ol": "\f475", + "list-stars": "\f476", + "list-task": "\f477", + "list-ul": "\f478", + "list": "\f479", + "lock-fill": "\f47a", + "lock": "\f47b", + "mailbox": "\f47c", + "mailbox2": "\f47d", + "map-fill": "\f47e", + "map": "\f47f", + "markdown-fill": "\f480", + "markdown": "\f481", + "mask": "\f482", + "megaphone-fill": "\f483", + "megaphone": "\f484", + "menu-app-fill": "\f485", + "menu-app": "\f486", + "menu-button-fill": "\f487", + "menu-button-wide-fill": "\f488", + "menu-button-wide": "\f489", + "menu-button": "\f48a", + "menu-down": "\f48b", + "menu-up": "\f48c", + "mic-fill": "\f48d", + "mic-mute-fill": "\f48e", + "mic-mute": "\f48f", + "mic": "\f490", + "minecart-loaded": "\f491", + "minecart": "\f492", + "moisture": "\f493", + "moon-fill": "\f494", + "moon-stars-fill": "\f495", + "moon-stars": "\f496", + "moon": "\f497", + "mouse-fill": "\f498", + "mouse": "\f499", + "mouse2-fill": "\f49a", + "mouse2": "\f49b", + "mouse3-fill": "\f49c", + "mouse3": "\f49d", + "music-note-beamed": "\f49e", + "music-note-list": "\f49f", + "music-note": "\f4a0", + "music-player-fill": "\f4a1", + "music-player": "\f4a2", + "newspaper": "\f4a3", + "node-minus-fill": "\f4a4", + "node-minus": "\f4a5", + "node-plus-fill": "\f4a6", + "node-plus": "\f4a7", + "nut-fill": "\f4a8", + "nut": "\f4a9", + "octagon-fill": "\f4aa", + "octagon-half": "\f4ab", + "octagon": "\f4ac", + "option": "\f4ad", + "outlet": "\f4ae", + "paint-bucket": "\f4af", + "palette-fill": "\f4b0", + "palette": "\f4b1", + "palette2": "\f4b2", + "paperclip": "\f4b3", + "paragraph": "\f4b4", + "patch-check-fill": "\f4b5", + "patch-check": "\f4b6", + "patch-exclamation-fill": "\f4b7", + "patch-exclamation": "\f4b8", + "patch-minus-fill": "\f4b9", + "patch-minus": "\f4ba", + "patch-plus-fill": "\f4bb", + "patch-plus": "\f4bc", + "patch-question-fill": "\f4bd", + "patch-question": "\f4be", + "pause-btn-fill": "\f4bf", + "pause-btn": "\f4c0", + "pause-circle-fill": "\f4c1", + "pause-circle": "\f4c2", + "pause-fill": "\f4c3", + "pause": "\f4c4", + "peace-fill": "\f4c5", + "peace": "\f4c6", + "pen-fill": "\f4c7", + "pen": "\f4c8", + "pencil-fill": "\f4c9", + "pencil-square": "\f4ca", + "pencil": "\f4cb", + "pentagon-fill": "\f4cc", + "pentagon-half": "\f4cd", + "pentagon": "\f4ce", + "people-fill": "\f4cf", + "people": "\f4d0", + "percent": "\f4d1", + "person-badge-fill": "\f4d2", + "person-badge": "\f4d3", + "person-bounding-box": "\f4d4", + "person-check-fill": "\f4d5", + "person-check": "\f4d6", + "person-circle": "\f4d7", + "person-dash-fill": "\f4d8", + "person-dash": "\f4d9", + "person-fill": "\f4da", + "person-lines-fill": "\f4db", + "person-plus-fill": "\f4dc", + "person-plus": "\f4dd", + "person-square": "\f4de", + "person-x-fill": "\f4df", + "person-x": "\f4e0", + "person": "\f4e1", + "phone-fill": "\f4e2", + "phone-landscape-fill": "\f4e3", + "phone-landscape": "\f4e4", + "phone-vibrate-fill": "\f4e5", + "phone-vibrate": "\f4e6", + "phone": "\f4e7", + "pie-chart-fill": "\f4e8", + "pie-chart": "\f4e9", + "pin-angle-fill": "\f4ea", + "pin-angle": "\f4eb", + "pin-fill": "\f4ec", + "pin": "\f4ed", + "pip-fill": "\f4ee", + "pip": "\f4ef", + "play-btn-fill": "\f4f0", + "play-btn": "\f4f1", + "play-circle-fill": "\f4f2", + "play-circle": "\f4f3", + "play-fill": "\f4f4", + "play": "\f4f5", + "plug-fill": "\f4f6", + "plug": "\f4f7", + "plus-circle-dotted": "\f4f8", + "plus-circle-fill": "\f4f9", + "plus-circle": "\f4fa", + "plus-square-dotted": "\f4fb", + "plus-square-fill": "\f4fc", + "plus-square": "\f4fd", + "plus": "\f4fe", + "power": "\f4ff", + "printer-fill": "\f500", + "printer": "\f501", + "puzzle-fill": "\f502", + "puzzle": "\f503", + "question-circle-fill": "\f504", + "question-circle": "\f505", + "question-diamond-fill": "\f506", + "question-diamond": "\f507", + "question-octagon-fill": "\f508", + "question-octagon": "\f509", + "question-square-fill": "\f50a", + "question-square": "\f50b", + "question": "\f50c", + "rainbow": "\f50d", + "receipt-cutoff": "\f50e", + "receipt": "\f50f", + "reception-0": "\f510", + "reception-1": "\f511", + "reception-2": "\f512", + "reception-3": "\f513", + "reception-4": "\f514", + "record-btn-fill": "\f515", + "record-btn": "\f516", + "record-circle-fill": "\f517", + "record-circle": "\f518", + "record-fill": "\f519", + "record": "\f51a", + "record2-fill": "\f51b", + "record2": "\f51c", + "reply-all-fill": "\f51d", + "reply-all": "\f51e", + "reply-fill": "\f51f", + "reply": "\f520", + "rss-fill": "\f521", + "rss": "\f522", + "rulers": "\f523", + "save-fill": "\f524", + "save": "\f525", + "save2-fill": "\f526", + "save2": "\f527", + "scissors": "\f528", + "screwdriver": "\f529", + "search": "\f52a", + "segmented-nav": "\f52b", + "server": "\f52c", + "share-fill": "\f52d", + "share": "\f52e", + "shield-check": "\f52f", + "shield-exclamation": "\f530", + "shield-fill-check": "\f531", + "shield-fill-exclamation": "\f532", + "shield-fill-minus": "\f533", + "shield-fill-plus": "\f534", + "shield-fill-x": "\f535", + "shield-fill": "\f536", + "shield-lock-fill": "\f537", + "shield-lock": "\f538", + "shield-minus": "\f539", + "shield-plus": "\f53a", + "shield-shaded": "\f53b", + "shield-slash-fill": "\f53c", + "shield-slash": "\f53d", + "shield-x": "\f53e", + "shield": "\f53f", + "shift-fill": "\f540", + "shift": "\f541", + "shop-window": "\f542", + "shop": "\f543", + "shuffle": "\f544", + "signpost-2-fill": "\f545", + "signpost-2": "\f546", + "signpost-fill": "\f547", + "signpost-split-fill": "\f548", + "signpost-split": "\f549", + "signpost": "\f54a", + "sim-fill": "\f54b", + "sim": "\f54c", + "skip-backward-btn-fill": "\f54d", + "skip-backward-btn": "\f54e", + "skip-backward-circle-fill": "\f54f", + "skip-backward-circle": "\f550", + "skip-backward-fill": "\f551", + "skip-backward": "\f552", + "skip-end-btn-fill": "\f553", + "skip-end-btn": "\f554", + "skip-end-circle-fill": "\f555", + "skip-end-circle": "\f556", + "skip-end-fill": "\f557", + "skip-end": "\f558", + "skip-forward-btn-fill": "\f559", + "skip-forward-btn": "\f55a", + "skip-forward-circle-fill": "\f55b", + "skip-forward-circle": "\f55c", + "skip-forward-fill": "\f55d", + "skip-forward": "\f55e", + "skip-start-btn-fill": "\f55f", + "skip-start-btn": "\f560", + "skip-start-circle-fill": "\f561", + "skip-start-circle": "\f562", + "skip-start-fill": "\f563", + "skip-start": "\f564", + "slack": "\f565", + "slash-circle-fill": "\f566", + "slash-circle": "\f567", + "slash-square-fill": "\f568", + "slash-square": "\f569", + "slash": "\f56a", + "sliders": "\f56b", + "smartwatch": "\f56c", + "snow": "\f56d", + "snow2": "\f56e", + "snow3": "\f56f", + "sort-alpha-down-alt": "\f570", + "sort-alpha-down": "\f571", + "sort-alpha-up-alt": "\f572", + "sort-alpha-up": "\f573", + "sort-down-alt": "\f574", + "sort-down": "\f575", + "sort-numeric-down-alt": "\f576", + "sort-numeric-down": "\f577", + "sort-numeric-up-alt": "\f578", + "sort-numeric-up": "\f579", + "sort-up-alt": "\f57a", + "sort-up": "\f57b", + "soundwave": "\f57c", + "speaker-fill": "\f57d", + "speaker": "\f57e", + "speedometer": "\f57f", + "speedometer2": "\f580", + "spellcheck": "\f581", + "square-fill": "\f582", + "square-half": "\f583", + "square": "\f584", + "stack": "\f585", + "star-fill": "\f586", + "star-half": "\f587", + "star": "\f588", + "stars": "\f589", + "stickies-fill": "\f58a", + "stickies": "\f58b", + "sticky-fill": "\f58c", + "sticky": "\f58d", + "stop-btn-fill": "\f58e", + "stop-btn": "\f58f", + "stop-circle-fill": "\f590", + "stop-circle": "\f591", + "stop-fill": "\f592", + "stop": "\f593", + "stoplights-fill": "\f594", + "stoplights": "\f595", + "stopwatch-fill": "\f596", + "stopwatch": "\f597", + "subtract": "\f598", + "suit-club-fill": "\f599", + "suit-club": "\f59a", + "suit-diamond-fill": "\f59b", + "suit-diamond": "\f59c", + "suit-heart-fill": "\f59d", + "suit-heart": "\f59e", + "suit-spade-fill": "\f59f", + "suit-spade": "\f5a0", + "sun-fill": "\f5a1", + "sun": "\f5a2", + "sunglasses": "\f5a3", + "sunrise-fill": "\f5a4", + "sunrise": "\f5a5", + "sunset-fill": "\f5a6", + "sunset": "\f5a7", + "symmetry-horizontal": "\f5a8", + "symmetry-vertical": "\f5a9", + "table": "\f5aa", + "tablet-fill": "\f5ab", + "tablet-landscape-fill": "\f5ac", + "tablet-landscape": "\f5ad", + "tablet": "\f5ae", + "tag-fill": "\f5af", + "tag": "\f5b0", + "tags-fill": "\f5b1", + "tags": "\f5b2", + "telegram": "\f5b3", + "telephone-fill": "\f5b4", + "telephone-forward-fill": "\f5b5", + "telephone-forward": "\f5b6", + "telephone-inbound-fill": "\f5b7", + "telephone-inbound": "\f5b8", + "telephone-minus-fill": "\f5b9", + "telephone-minus": "\f5ba", + "telephone-outbound-fill": "\f5bb", + "telephone-outbound": "\f5bc", + "telephone-plus-fill": "\f5bd", + "telephone-plus": "\f5be", + "telephone-x-fill": "\f5bf", + "telephone-x": "\f5c0", + "telephone": "\f5c1", + "terminal-fill": "\f5c2", + "terminal": "\f5c3", + "text-center": "\f5c4", + "text-indent-left": "\f5c5", + "text-indent-right": "\f5c6", + "text-left": "\f5c7", + "text-paragraph": "\f5c8", + "text-right": "\f5c9", + "textarea-resize": "\f5ca", + "textarea-t": "\f5cb", + "textarea": "\f5cc", + "thermometer-half": "\f5cd", + "thermometer-high": "\f5ce", + "thermometer-low": "\f5cf", + "thermometer-snow": "\f5d0", + "thermometer-sun": "\f5d1", + "thermometer": "\f5d2", + "three-dots-vertical": "\f5d3", + "three-dots": "\f5d4", + "toggle-off": "\f5d5", + "toggle-on": "\f5d6", + "toggle2-off": "\f5d7", + "toggle2-on": "\f5d8", + "toggles": "\f5d9", + "toggles2": "\f5da", + "tools": "\f5db", + "tornado": "\f5dc", + "trash-fill": "\f5dd", + "trash": "\f5de", + "trash2-fill": "\f5df", + "trash2": "\f5e0", + "tree-fill": "\f5e1", + "tree": "\f5e2", + "triangle-fill": "\f5e3", + "triangle-half": "\f5e4", + "triangle": "\f5e5", + "trophy-fill": "\f5e6", + "trophy": "\f5e7", + "tropical-storm": "\f5e8", + "truck-flatbed": "\f5e9", + "truck": "\f5ea", + "tsunami": "\f5eb", + "tv-fill": "\f5ec", + "tv": "\f5ed", + "twitch": "\f5ee", + "twitter": "\f5ef", + "type-bold": "\f5f0", + "type-h1": "\f5f1", + "type-h2": "\f5f2", + "type-h3": "\f5f3", + "type-italic": "\f5f4", + "type-strikethrough": "\f5f5", + "type-underline": "\f5f6", + "type": "\f5f7", + "ui-checks-grid": "\f5f8", + "ui-checks": "\f5f9", + "ui-radios-grid": "\f5fa", + "ui-radios": "\f5fb", + "umbrella-fill": "\f5fc", + "umbrella": "\f5fd", + "union": "\f5fe", + "unlock-fill": "\f5ff", + "unlock": "\f600", + "upc-scan": "\f601", + "upc": "\f602", + "upload": "\f603", + "vector-pen": "\f604", + "view-list": "\f605", + "view-stacked": "\f606", + "vinyl-fill": "\f607", + "vinyl": "\f608", + "voicemail": "\f609", + "volume-down-fill": "\f60a", + "volume-down": "\f60b", + "volume-mute-fill": "\f60c", + "volume-mute": "\f60d", + "volume-off-fill": "\f60e", + "volume-off": "\f60f", + "volume-up-fill": "\f610", + "volume-up": "\f611", + "vr": "\f612", + "wallet-fill": "\f613", + "wallet": "\f614", + "wallet2": "\f615", + "watch": "\f616", + "water": "\f617", + "whatsapp": "\f618", + "wifi-1": "\f619", + "wifi-2": "\f61a", + "wifi-off": "\f61b", + "wifi": "\f61c", + "wind": "\f61d", + "window-dock": "\f61e", + "window-sidebar": "\f61f", + "window": "\f620", + "wrench": "\f621", + "x-circle-fill": "\f622", + "x-circle": "\f623", + "x-diamond-fill": "\f624", + "x-diamond": "\f625", + "x-octagon-fill": "\f626", + "x-octagon": "\f627", + "x-square-fill": "\f628", + "x-square": "\f629", + "x": "\f62a", + "youtube": "\f62b", + "zoom-in": "\f62c", + "zoom-out": "\f62d", + "bank": "\f62e", + "bank2": "\f62f", + "bell-slash-fill": "\f630", + "bell-slash": "\f631", + "cash-coin": "\f632", + "check-lg": "\f633", + "coin": "\f634", + "currency-bitcoin": "\f635", + "currency-dollar": "\f636", + "currency-euro": "\f637", + "currency-exchange": "\f638", + "currency-pound": "\f639", + "currency-yen": "\f63a", + "dash-lg": "\f63b", + "exclamation-lg": "\f63c", + "file-earmark-pdf-fill": "\f63d", + "file-earmark-pdf": "\f63e", + "file-pdf-fill": "\f63f", + "file-pdf": "\f640", + "gender-ambiguous": "\f641", + "gender-female": "\f642", + "gender-male": "\f643", + "gender-trans": "\f644", + "headset-vr": "\f645", + "info-lg": "\f646", + "mastodon": "\f647", + "messenger": "\f648", + "piggy-bank-fill": "\f649", + "piggy-bank": "\f64a", + "pin-map-fill": "\f64b", + "pin-map": "\f64c", + "plus-lg": "\f64d", + "question-lg": "\f64e", + "recycle": "\f64f", + "reddit": "\f650", + "safe-fill": "\f651", + "safe2-fill": "\f652", + "safe2": "\f653", + "sd-card-fill": "\f654", + "sd-card": "\f655", + "skype": "\f656", + "slash-lg": "\f657", + "translate": "\f658", + "x-lg": "\f659", + "safe": "\f65a", + "apple": "\f65b", + "microsoft": "\f65d", + "windows": "\f65e", + "behance": "\f65c", + "dribbble": "\f65f", + "line": "\f660", + "medium": "\f661", + "paypal": "\f662", + "pinterest": "\f663", + "signal": "\f664", + "snapchat": "\f665", + "spotify": "\f666", + "stack-overflow": "\f667", + "strava": "\f668", + "wordpress": "\f669", + "vimeo": "\f66a", + "activity": "\f66b", + "easel2-fill": "\f66c", + "easel2": "\f66d", + "easel3-fill": "\f66e", + "easel3": "\f66f", + "fan": "\f670", + "fingerprint": "\f671", + "graph-down-arrow": "\f672", + "graph-up-arrow": "\f673", + "hypnotize": "\f674", + "magic": "\f675", + "person-rolodex": "\f676", + "person-video": "\f677", + "person-video2": "\f678", + "person-video3": "\f679", + "person-workspace": "\f67a", + "radioactive": "\f67b", + "webcam-fill": "\f67c", + "webcam": "\f67d", + "yin-yang": "\f67e", + "bandaid-fill": "\f680", + "bandaid": "\f681", + "bluetooth": "\f682", + "body-text": "\f683", + "boombox": "\f684", + "boxes": "\f685", + "dpad-fill": "\f686", + "dpad": "\f687", + "ear-fill": "\f688", + "ear": "\f689", + "envelope-check-fill": "\f68b", + "envelope-check": "\f68c", + "envelope-dash-fill": "\f68e", + "envelope-dash": "\f68f", + "envelope-exclamation-fill": "\f691", + "envelope-exclamation": "\f692", + "envelope-plus-fill": "\f693", + "envelope-plus": "\f694", + "envelope-slash-fill": "\f696", + "envelope-slash": "\f697", + "envelope-x-fill": "\f699", + "envelope-x": "\f69a", + "explicit-fill": "\f69b", + "explicit": "\f69c", + "git": "\f69d", + "infinity": "\f69e", + "list-columns-reverse": "\f69f", + "list-columns": "\f6a0", + "meta": "\f6a1", + "nintendo-switch": "\f6a4", + "pc-display-horizontal": "\f6a5", + "pc-display": "\f6a6", + "pc-horizontal": "\f6a7", + "pc": "\f6a8", + "playstation": "\f6a9", + "plus-slash-minus": "\f6aa", + "projector-fill": "\f6ab", + "projector": "\f6ac", + "qr-code-scan": "\f6ad", + "qr-code": "\f6ae", + "quora": "\f6af", + "quote": "\f6b0", + "robot": "\f6b1", + "send-check-fill": "\f6b2", + "send-check": "\f6b3", + "send-dash-fill": "\f6b4", + "send-dash": "\f6b5", + "send-exclamation-fill": "\f6b7", + "send-exclamation": "\f6b8", + "send-fill": "\f6b9", + "send-plus-fill": "\f6ba", + "send-plus": "\f6bb", + "send-slash-fill": "\f6bc", + "send-slash": "\f6bd", + "send-x-fill": "\f6be", + "send-x": "\f6bf", + "send": "\f6c0", + "steam": "\f6c1", + "terminal-dash": "\f6c3", + "terminal-plus": "\f6c4", + "terminal-split": "\f6c5", + "ticket-detailed-fill": "\f6c6", + "ticket-detailed": "\f6c7", + "ticket-fill": "\f6c8", + "ticket-perforated-fill": "\f6c9", + "ticket-perforated": "\f6ca", + "ticket": "\f6cb", + "tiktok": "\f6cc", + "window-dash": "\f6cd", + "window-desktop": "\f6ce", + "window-fullscreen": "\f6cf", + "window-plus": "\f6d0", + "window-split": "\f6d1", + "window-stack": "\f6d2", + "window-x": "\f6d3", + "xbox": "\f6d4", + "ethernet": "\f6d5", + "hdmi-fill": "\f6d6", + "hdmi": "\f6d7", + "usb-c-fill": "\f6d8", + "usb-c": "\f6d9", + "usb-fill": "\f6da", + "usb-plug-fill": "\f6db", + "usb-plug": "\f6dc", + "usb-symbol": "\f6dd", + "usb": "\f6de", + "boombox-fill": "\f6df", + "displayport": "\f6e1", + "gpu-card": "\f6e2", + "memory": "\f6e3", + "modem-fill": "\f6e4", + "modem": "\f6e5", + "motherboard-fill": "\f6e6", + "motherboard": "\f6e7", + "optical-audio-fill": "\f6e8", + "optical-audio": "\f6e9", + "pci-card": "\f6ea", + "router-fill": "\f6eb", + "router": "\f6ec", + "thunderbolt-fill": "\f6ef", + "thunderbolt": "\f6f0", + "usb-drive-fill": "\f6f1", + "usb-drive": "\f6f2", + "usb-micro-fill": "\f6f3", + "usb-micro": "\f6f4", + "usb-mini-fill": "\f6f5", + "usb-mini": "\f6f6", + "cloud-haze2": "\f6f7", + "device-hdd-fill": "\f6f8", + "device-hdd": "\f6f9", + "device-ssd-fill": "\f6fa", + "device-ssd": "\f6fb", + "displayport-fill": "\f6fc", + "mortarboard-fill": "\f6fd", + "mortarboard": "\f6fe", + "terminal-x": "\f6ff", + "arrow-through-heart-fill": "\f700", + "arrow-through-heart": "\f701", + "badge-sd-fill": "\f702", + "badge-sd": "\f703", + "bag-heart-fill": "\f704", + "bag-heart": "\f705", + "balloon-fill": "\f706", + "balloon-heart-fill": "\f707", + "balloon-heart": "\f708", + "balloon": "\f709", + "box2-fill": "\f70a", + "box2-heart-fill": "\f70b", + "box2-heart": "\f70c", + "box2": "\f70d", + "braces-asterisk": "\f70e", + "calendar-heart-fill": "\f70f", + "calendar-heart": "\f710", + "calendar2-heart-fill": "\f711", + "calendar2-heart": "\f712", + "chat-heart-fill": "\f713", + "chat-heart": "\f714", + "chat-left-heart-fill": "\f715", + "chat-left-heart": "\f716", + "chat-right-heart-fill": "\f717", + "chat-right-heart": "\f718", + "chat-square-heart-fill": "\f719", + "chat-square-heart": "\f71a", + "clipboard-check-fill": "\f71b", + "clipboard-data-fill": "\f71c", + "clipboard-fill": "\f71d", + "clipboard-heart-fill": "\f71e", + "clipboard-heart": "\f71f", + "clipboard-minus-fill": "\f720", + "clipboard-plus-fill": "\f721", + "clipboard-pulse": "\f722", + "clipboard-x-fill": "\f723", + "clipboard2-check-fill": "\f724", + "clipboard2-check": "\f725", + "clipboard2-data-fill": "\f726", + "clipboard2-data": "\f727", + "clipboard2-fill": "\f728", + "clipboard2-heart-fill": "\f729", + "clipboard2-heart": "\f72a", + "clipboard2-minus-fill": "\f72b", + "clipboard2-minus": "\f72c", + "clipboard2-plus-fill": "\f72d", + "clipboard2-plus": "\f72e", + "clipboard2-pulse-fill": "\f72f", + "clipboard2-pulse": "\f730", + "clipboard2-x-fill": "\f731", + "clipboard2-x": "\f732", + "clipboard2": "\f733", + "emoji-kiss-fill": "\f734", + "emoji-kiss": "\f735", + "envelope-heart-fill": "\f736", + "envelope-heart": "\f737", + "envelope-open-heart-fill": "\f738", + "envelope-open-heart": "\f739", + "envelope-paper-fill": "\f73a", + "envelope-paper-heart-fill": "\f73b", + "envelope-paper-heart": "\f73c", + "envelope-paper": "\f73d", + "filetype-aac": "\f73e", + "filetype-ai": "\f73f", + "filetype-bmp": "\f740", + "filetype-cs": "\f741", + "filetype-css": "\f742", + "filetype-csv": "\f743", + "filetype-doc": "\f744", + "filetype-docx": "\f745", + "filetype-exe": "\f746", + "filetype-gif": "\f747", + "filetype-heic": "\f748", + "filetype-html": "\f749", + "filetype-java": "\f74a", + "filetype-jpg": "\f74b", + "filetype-js": "\f74c", + "filetype-jsx": "\f74d", + "filetype-key": "\f74e", + "filetype-m4p": "\f74f", + "filetype-md": "\f750", + "filetype-mdx": "\f751", + "filetype-mov": "\f752", + "filetype-mp3": "\f753", + "filetype-mp4": "\f754", + "filetype-otf": "\f755", + "filetype-pdf": "\f756", + "filetype-php": "\f757", + "filetype-png": "\f758", + "filetype-ppt": "\f75a", + "filetype-psd": "\f75b", + "filetype-py": "\f75c", + "filetype-raw": "\f75d", + "filetype-rb": "\f75e", + "filetype-sass": "\f75f", + "filetype-scss": "\f760", + "filetype-sh": "\f761", + "filetype-svg": "\f762", + "filetype-tiff": "\f763", + "filetype-tsx": "\f764", + "filetype-ttf": "\f765", + "filetype-txt": "\f766", + "filetype-wav": "\f767", + "filetype-woff": "\f768", + "filetype-xls": "\f76a", + "filetype-xml": "\f76b", + "filetype-yml": "\f76c", + "heart-arrow": "\f76d", + "heart-pulse-fill": "\f76e", + "heart-pulse": "\f76f", + "heartbreak-fill": "\f770", + "heartbreak": "\f771", + "hearts": "\f772", + "hospital-fill": "\f773", + "hospital": "\f774", + "house-heart-fill": "\f775", + "house-heart": "\f776", + "incognito": "\f777", + "magnet-fill": "\f778", + "magnet": "\f779", + "person-heart": "\f77a", + "person-hearts": "\f77b", + "phone-flip": "\f77c", + "plugin": "\f77d", + "postage-fill": "\f77e", + "postage-heart-fill": "\f77f", + "postage-heart": "\f780", + "postage": "\f781", + "postcard-fill": "\f782", + "postcard-heart-fill": "\f783", + "postcard-heart": "\f784", + "postcard": "\f785", + "search-heart-fill": "\f786", + "search-heart": "\f787", + "sliders2-vertical": "\f788", + "sliders2": "\f789", + "trash3-fill": "\f78a", + "trash3": "\f78b", + "valentine": "\f78c", + "valentine2": "\f78d", + "wrench-adjustable-circle-fill": "\f78e", + "wrench-adjustable-circle": "\f78f", + "wrench-adjustable": "\f790", + "filetype-json": "\f791", + "filetype-pptx": "\f792", + "filetype-xlsx": "\f793", + "1-circle-fill": "\f796", + "1-circle": "\f797", + "1-square-fill": "\f798", + "1-square": "\f799", + "2-circle-fill": "\f79c", + "2-circle": "\f79d", + "2-square-fill": "\f79e", + "2-square": "\f79f", + "3-circle-fill": "\f7a2", + "3-circle": "\f7a3", + "3-square-fill": "\f7a4", + "3-square": "\f7a5", + "4-circle-fill": "\f7a8", + "4-circle": "\f7a9", + "4-square-fill": "\f7aa", + "4-square": "\f7ab", + "5-circle-fill": "\f7ae", + "5-circle": "\f7af", + "5-square-fill": "\f7b0", + "5-square": "\f7b1", + "6-circle-fill": "\f7b4", + "6-circle": "\f7b5", + "6-square-fill": "\f7b6", + "6-square": "\f7b7", + "7-circle-fill": "\f7ba", + "7-circle": "\f7bb", + "7-square-fill": "\f7bc", + "7-square": "\f7bd", + "8-circle-fill": "\f7c0", + "8-circle": "\f7c1", + "8-square-fill": "\f7c2", + "8-square": "\f7c3", + "9-circle-fill": "\f7c6", + "9-circle": "\f7c7", + "9-square-fill": "\f7c8", + "9-square": "\f7c9", + "airplane-engines-fill": "\f7ca", + "airplane-engines": "\f7cb", + "airplane-fill": "\f7cc", + "airplane": "\f7cd", + "alexa": "\f7ce", + "alipay": "\f7cf", + "android": "\f7d0", + "android2": "\f7d1", + "box-fill": "\f7d2", + "box-seam-fill": "\f7d3", + "browser-chrome": "\f7d4", + "browser-edge": "\f7d5", + "browser-firefox": "\f7d6", + "browser-safari": "\f7d7", + "c-circle-fill": "\f7da", + "c-circle": "\f7db", + "c-square-fill": "\f7dc", + "c-square": "\f7dd", + "capsule-pill": "\f7de", + "capsule": "\f7df", + "car-front-fill": "\f7e0", + "car-front": "\f7e1", + "cassette-fill": "\f7e2", + "cassette": "\f7e3", + "cc-circle-fill": "\f7e6", + "cc-circle": "\f7e7", + "cc-square-fill": "\f7e8", + "cc-square": "\f7e9", + "cup-hot-fill": "\f7ea", + "cup-hot": "\f7eb", + "currency-rupee": "\f7ec", + "dropbox": "\f7ed", + "escape": "\f7ee", + "fast-forward-btn-fill": "\f7ef", + "fast-forward-btn": "\f7f0", + "fast-forward-circle-fill": "\f7f1", + "fast-forward-circle": "\f7f2", + "fast-forward-fill": "\f7f3", + "fast-forward": "\f7f4", + "filetype-sql": "\f7f5", + "fire": "\f7f6", + "google-play": "\f7f7", + "h-circle-fill": "\f7fa", + "h-circle": "\f7fb", + "h-square-fill": "\f7fc", + "h-square": "\f7fd", + "indent": "\f7fe", + "lungs-fill": "\f7ff", + "lungs": "\f800", + "microsoft-teams": "\f801", + "p-circle-fill": "\f804", + "p-circle": "\f805", + "p-square-fill": "\f806", + "p-square": "\f807", + "pass-fill": "\f808", + "pass": "\f809", + "prescription": "\f80a", + "prescription2": "\f80b", + "r-circle-fill": "\f80e", + "r-circle": "\f80f", + "r-square-fill": "\f810", + "r-square": "\f811", + "repeat-1": "\f812", + "repeat": "\f813", + "rewind-btn-fill": "\f814", + "rewind-btn": "\f815", + "rewind-circle-fill": "\f816", + "rewind-circle": "\f817", + "rewind-fill": "\f818", + "rewind": "\f819", + "train-freight-front-fill": "\f81a", + "train-freight-front": "\f81b", + "train-front-fill": "\f81c", + "train-front": "\f81d", + "train-lightrail-front-fill": "\f81e", + "train-lightrail-front": "\f81f", + "truck-front-fill": "\f820", + "truck-front": "\f821", + "ubuntu": "\f822", + "unindent": "\f823", + "unity": "\f824", + "universal-access-circle": "\f825", + "universal-access": "\f826", + "virus": "\f827", + "virus2": "\f828", + "wechat": "\f829", + "yelp": "\f82a", + "sign-stop-fill": "\f82b", + "sign-stop-lights-fill": "\f82c", + "sign-stop-lights": "\f82d", + "sign-stop": "\f82e", + "sign-turn-left-fill": "\f82f", + "sign-turn-left": "\f830", + "sign-turn-right-fill": "\f831", + "sign-turn-right": "\f832", + "sign-turn-slight-left-fill": "\f833", + "sign-turn-slight-left": "\f834", + "sign-turn-slight-right-fill": "\f835", + "sign-turn-slight-right": "\f836", + "sign-yield-fill": "\f837", + "sign-yield": "\f838", + "ev-station-fill": "\f839", + "ev-station": "\f83a", + "fuel-pump-diesel-fill": "\f83b", + "fuel-pump-diesel": "\f83c", + "fuel-pump-fill": "\f83d", + "fuel-pump": "\f83e", + "0-circle-fill": "\f83f", + "0-circle": "\f840", + "0-square-fill": "\f841", + "0-square": "\f842", + "rocket-fill": "\f843", + "rocket-takeoff-fill": "\f844", + "rocket-takeoff": "\f845", + "rocket": "\f846", + "stripe": "\f847", + "subscript": "\f848", + "superscript": "\f849", + "trello": "\f84a", + "envelope-at-fill": "\f84b", + "envelope-at": "\f84c", + "regex": "\f84d", + "text-wrap": "\f84e", + "sign-dead-end-fill": "\f84f", + "sign-dead-end": "\f850", + "sign-do-not-enter-fill": "\f851", + "sign-do-not-enter": "\f852", + "sign-intersection-fill": "\f853", + "sign-intersection-side-fill": "\f854", + "sign-intersection-side": "\f855", + "sign-intersection-t-fill": "\f856", + "sign-intersection-t": "\f857", + "sign-intersection-y-fill": "\f858", + "sign-intersection-y": "\f859", + "sign-intersection": "\f85a", + "sign-merge-left-fill": "\f85b", + "sign-merge-left": "\f85c", + "sign-merge-right-fill": "\f85d", + "sign-merge-right": "\f85e", + "sign-no-left-turn-fill": "\f85f", + "sign-no-left-turn": "\f860", + "sign-no-parking-fill": "\f861", + "sign-no-parking": "\f862", + "sign-no-right-turn-fill": "\f863", + "sign-no-right-turn": "\f864", + "sign-railroad-fill": "\f865", + "sign-railroad": "\f866", + "building-add": "\f867", + "building-check": "\f868", + "building-dash": "\f869", + "building-down": "\f86a", + "building-exclamation": "\f86b", + "building-fill-add": "\f86c", + "building-fill-check": "\f86d", + "building-fill-dash": "\f86e", + "building-fill-down": "\f86f", + "building-fill-exclamation": "\f870", + "building-fill-gear": "\f871", + "building-fill-lock": "\f872", + "building-fill-slash": "\f873", + "building-fill-up": "\f874", + "building-fill-x": "\f875", + "building-fill": "\f876", + "building-gear": "\f877", + "building-lock": "\f878", + "building-slash": "\f879", + "building-up": "\f87a", + "building-x": "\f87b", + "buildings-fill": "\f87c", + "buildings": "\f87d", + "bus-front-fill": "\f87e", + "bus-front": "\f87f", + "ev-front-fill": "\f880", + "ev-front": "\f881", + "globe-americas": "\f882", + "globe-asia-australia": "\f883", + "globe-central-south-asia": "\f884", + "globe-europe-africa": "\f885", + "house-add-fill": "\f886", + "house-add": "\f887", + "house-check-fill": "\f888", + "house-check": "\f889", + "house-dash-fill": "\f88a", + "house-dash": "\f88b", + "house-down-fill": "\f88c", + "house-down": "\f88d", + "house-exclamation-fill": "\f88e", + "house-exclamation": "\f88f", + "house-gear-fill": "\f890", + "house-gear": "\f891", + "house-lock-fill": "\f892", + "house-lock": "\f893", + "house-slash-fill": "\f894", + "house-slash": "\f895", + "house-up-fill": "\f896", + "house-up": "\f897", + "house-x-fill": "\f898", + "house-x": "\f899", + "person-add": "\f89a", + "person-down": "\f89b", + "person-exclamation": "\f89c", + "person-fill-add": "\f89d", + "person-fill-check": "\f89e", + "person-fill-dash": "\f89f", + "person-fill-down": "\f8a0", + "person-fill-exclamation": "\f8a1", + "person-fill-gear": "\f8a2", + "person-fill-lock": "\f8a3", + "person-fill-slash": "\f8a4", + "person-fill-up": "\f8a5", + "person-fill-x": "\f8a6", + "person-gear": "\f8a7", + "person-lock": "\f8a8", + "person-slash": "\f8a9", + "person-up": "\f8aa", + "scooter": "\f8ab", + "taxi-front-fill": "\f8ac", + "taxi-front": "\f8ad", + "amd": "\f8ae", + "database-add": "\f8af", + "database-check": "\f8b0", + "database-dash": "\f8b1", + "database-down": "\f8b2", + "database-exclamation": "\f8b3", + "database-fill-add": "\f8b4", + "database-fill-check": "\f8b5", + "database-fill-dash": "\f8b6", + "database-fill-down": "\f8b7", + "database-fill-exclamation": "\f8b8", + "database-fill-gear": "\f8b9", + "database-fill-lock": "\f8ba", + "database-fill-slash": "\f8bb", + "database-fill-up": "\f8bc", + "database-fill-x": "\f8bd", + "database-fill": "\f8be", + "database-gear": "\f8bf", + "database-lock": "\f8c0", + "database-slash": "\f8c1", + "database-up": "\f8c2", + "database-x": "\f8c3", + "database": "\f8c4", + "houses-fill": "\f8c5", + "houses": "\f8c6", + "nvidia": "\f8c7", + "person-vcard-fill": "\f8c8", + "person-vcard": "\f8c9", + "sina-weibo": "\f8ca", + "tencent-qq": "\f8cb", + "wikipedia": "\f8cc", + "alphabet-uppercase": "\f2a5", + "alphabet": "\f68a", + "amazon": "\f68d", + "arrows-collapse-vertical": "\f690", + "arrows-expand-vertical": "\f695", + "arrows-vertical": "\f698", + "arrows": "\f6a2", + "ban-fill": "\f6a3", + "ban": "\f6b6", + "bing": "\f6c2", + "cake": "\f6e0", + "cake2": "\f6ed", + "cookie": "\f6ee", + "copy": "\f759", + "crosshair": "\f769", + "crosshair2": "\f794", + "emoji-astonished-fill": "\f795", + "emoji-astonished": "\f79a", + "emoji-grimace-fill": "\f79b", + "emoji-grimace": "\f7a0", + "emoji-grin-fill": "\f7a1", + "emoji-grin": "\f7a6", + "emoji-surprise-fill": "\f7a7", + "emoji-surprise": "\f7ac", + "emoji-tear-fill": "\f7ad", + "emoji-tear": "\f7b2", + "envelope-arrow-down-fill": "\f7b3", + "envelope-arrow-down": "\f7b8", + "envelope-arrow-up-fill": "\f7b9", + "envelope-arrow-up": "\f7be", + "feather": "\f7bf", + "feather2": "\f7c4", + "floppy-fill": "\f7c5", + "floppy": "\f7d8", + "floppy2-fill": "\f7d9", + "floppy2": "\f7e4", + "gitlab": "\f7e5", + "highlighter": "\f7f8", + "marker-tip": "\f802", + "nvme-fill": "\f803", + "nvme": "\f80c", + "opencollective": "\f80d", + "pci-card-network": "\f8cd", + "pci-card-sound": "\f8ce", + "radar": "\f8cf", + "send-arrow-down-fill": "\f8d0", + "send-arrow-down": "\f8d1", + "send-arrow-up-fill": "\f8d2", + "send-arrow-up": "\f8d3", + "sim-slash-fill": "\f8d4", + "sim-slash": "\f8d5", + "sourceforge": "\f8d6", + "substack": "\f8d7", + "threads-fill": "\f8d8", + "threads": "\f8d9", + "transparency": "\f8da", + "twitter-x": "\f8db", + "type-h4": "\f8dc", + "type-h5": "\f8dd", + "type-h6": "\f8de", + "backpack-fill": "\f8df", + "backpack": "\f8e0", + "backpack2-fill": "\f8e1", + "backpack2": "\f8e2", + "backpack3-fill": "\f8e3", + "backpack3": "\f8e4", + "backpack4-fill": "\f8e5", + "backpack4": "\f8e6", + "brilliance": "\f8e7", + "cake-fill": "\f8e8", + "cake2-fill": "\f8e9", + "duffle-fill": "\f8ea", + "duffle": "\f8eb", + "exposure": "\f8ec", + "gender-neuter": "\f8ed", + "highlights": "\f8ee", + "luggage-fill": "\f8ef", + "luggage": "\f8f0", + "mailbox-flag": "\f8f1", + "mailbox2-flag": "\f8f2", + "noise-reduction": "\f8f3", + "passport-fill": "\f8f4", + "passport": "\f8f5", + "person-arms-up": "\f8f6", + "person-raised-hand": "\f8f7", + "person-standing-dress": "\f8f8", + "person-standing": "\f8f9", + "person-walking": "\f8fa", + "person-wheelchair": "\f8fb", + "shadows": "\f8fc", + "suitcase-fill": "\f8fd", + "suitcase-lg-fill": "\f8fe", + "suitcase-lg": "\f8ff", + "suitcase": "\f900", + "suitcase2-fill": "\f901", + "suitcase2": "\f902", + "vignette": "\f903", + "bluesky": "\f7f9", + "tux": "\f904", + "beaker-fill": "\f905", + "beaker": "\f906", + "flask-fill": "\f907", + "flask-florence-fill": "\f908", + "flask-florence": "\f909", + "flask": "\f90a", + "leaf-fill": "\f90b", + "leaf": "\f90c", + "measuring-cup-fill": "\f90d", + "measuring-cup": "\f90e", + "unlock2-fill": "\f90f", + "unlock2": "\f910", + "battery-low": "\f911", + "anthropic": "\f912", + "apple-music": "\f913", + "claude": "\f914", + "openai": "\f915", + "perplexity": "\f916", + "css": "\f917", + "javascript": "\f918", + "typescript": "\f919", + "fork-knife": "\f91a", + "globe-americas-fill": "\f91b", + "globe-asia-australia-fill": "\f91c", + "globe-central-south-asia-fill": "\f91d", + "globe-europe-africa-fill": "\f91e", +); + +@each $icon, $codepoint in $bootstrap-icons-map { + .bi-#{$icon}::before { content: $codepoint; } +} diff --git a/RS_system/wwwroot/uploads/miembros/02958366-eb79-4433-859c-9eff0bfd8ccf.png b/RS_system/wwwroot/uploads/miembros/02958366-eb79-4433-859c-9eff0bfd8ccf.png new file mode 100644 index 0000000000000000000000000000000000000000..f66b0bcbe0e44131f1b62745b4a2f363f19f4d9b GIT binary patch literal 9474 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%0DoWWM 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 Yy0-sCRP_H(_TQ0S{Xe=&us>t}0SIG&f&c&j literal 0 HcmV?d00001