using System.Collections.ObjectModel; using Entidades; using Modelo; namespace Controladora { public class ControladoraFacturas : Singleton { private RepositorioFactura repositorioFacturas; public ControladoraFacturas() { repositorioFacturas = new(new Context()); } private bool ExistePorId(int id) { var fac = repositorioFacturas.ObtenerPorId(id); return (fac.Id == id); } public string Añadir(Factura t) { if (t == null) return "La Factura es nula, fallo la carga"; if (ExistePorId(t.Id)) return $"La Factura con el ID {t.Id} ya existe"; if (t.Cliente == null || t.Cliente.Cuit == 0) return "Debe seleccionar un cliente antes de agregar la factura"; string checkstock = ""; if (t.MostrarDetalles().Count <= 0) return "Se debe Cargar un detalle en la factura antes de agregarla"; foreach (var detalle in t.MostrarDetalles()) { if (detalle.Cantidad > ControladoraLotes.Instance.MostrarStockDeProducto(detalle.Producto)) { checkstock += $"No hay existencias en stock para realizar la venta de {detalle.Producto.Nombre}\n"; } } if (checkstock != "") return checkstock; try { repositorioFacturas.Add(t); bool resultado = repositorioFacturas.Guardar(); string resultadolote = ControladoraLotes.Instance.DisminuirStock(t.MostrarDetalles()); // Convierte ReadOnlyCollection a List var detallesList = new List(t.MostrarDetalles()); if (resultado && resultadolote == "Se Descontaron los productos") { if (ControladoraInformes.Instance.Informa) { // Envía el correo electrónico si la factura se cargó correctamente y el stock se decrementó string emailResult = ControladoraInformes.Instance.EnviarEmail( "Factura Cargada", detallesList // Pasa la lista convertida ); return $"La Factura con el ID {t.Id} se cargó correctamente. {emailResult}"; } return $"La Factura con el ID {t.Id} se cargó correctamente."; } else { return $"Falló la carga de la Factura con el ID {t.Id}"; } } catch (Exception ex) { // Captura cualquier excepción no prevista return $"Ocurrió un error inesperado: {ex.Message}"; } } public ReadOnlyCollection Listar() { return repositorioFacturas.Listar() .AsReadOnly(); } public ReadOnlyCollection ListarDetallesFactura(Factura factura) { Factura facturaalistar = ControladoraFacturas.Instance.Listar().First(x => x.Id == factura.Id); if (facturaalistar == null) return new ReadOnlyCollection(new List()); return facturaalistar.MostrarDetalles(); } public ReadOnlyCollection ListarProductos() { return ControladoraProductos.Instance.Listar(); } public ReadOnlyCollection ListarClientes() { return ControladoraClientes.Instance.Listar(); } } }