using Controladora; using Entidades; using Modelo; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Vista { public partial class FrmFactura : Form { private Factura factura; private Cliente clienteSeleccionado; private List carrito; // Lista para almacenar los lotes en el carrito public FrmFactura(Factura? factura = null) { InitializeComponent(); ConfigurarDataGridView(); ConfigurarDataGridViewCarrito(); // Nueva configuración del DataGridView para el carrito ActualizarGrilla(); CargarClientes(); carrito = new List(); // Inicializar la lista del carrito cmbCliente.SelectedIndexChanged += comboBox1_SelectedIndexChanged; // Para el primer control NumericUpDown numid.Maximum = int.MaxValue; // Esto permitirá IDs muy grandes // Para el segundo control NumericUpDown numtotal.Maximum = decimal.MaxValue; // Esto permitirá totales muy grandes numtotal.Enabled = false; // Deshabilitar el control para que no se pueda modificar // Configurar NumericUpDown para unidades numericUpDown1.Maximum = int.MaxValue; // Configurar el máximo valor permitido cmbCliente.DisplayMember = "Cliente"; cmbCliente.SelectedIndex = -1; if (factura != null) { this.factura = factura; this.Text = "Modificar Factura"; CargarDatos(); } else { this.Text = "Agregar Factura"; } } private void ConfigurarDataGridView() { dataGridView1.AutoGenerateColumns = false; // Definir las columnas manualmente dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Id", HeaderText = "ID", Name = "Id" }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Nombre", HeaderText = "Nombre", Name = "Nombre" }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Precio", HeaderText = "Precio", Name = "Precio" }); } private void ConfigurarDataGridViewCarrito() { dataGridView2.AutoGenerateColumns = false; // Definir las columnas manualmente dataGridView2.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "NombreProducto", // Usa la propiedad NombreProducto HeaderText = "Producto", Name = "Producto" }); dataGridView2.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "CantidadDeProductos", HeaderText = "Cantidad", Name = "CantidadDeProductos" }); // Asignar la lista de lotes al DataGridView dataGridView2.DataSource = carrito; } private void ActualizarGrilla() { dataGridView1.DataSource = null; dataGridView1.DataSource = ControladoraProductos.Instance.Listar(); } private void CargarClientes() { // Obtener la lista de clientes desde el repositorio ReadOnlyCollection clientes = RepositorioClientes.Instance.Listar(); // Asignar la lista de clientes como origen de datos para el ComboBox cmbCliente.DataSource = clientes; // Establecer la propiedad para mostrar el nombre del cliente en el ComboBox cmbCliente.DisplayMember = "NombreCompleto"; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { clienteSeleccionado = (Cliente)cmbCliente.SelectedItem; } private void CargarDatos() { numid.Value = factura.Id; numtotal.Value = (decimal)factura.Total; datepick.Value = factura.Fecha; // Asignar el cliente seleccionado en el ComboBox if (factura.Cliente != null) { cmbCliente.SelectedItem = factura.Cliente; } // Recuperar los lotes asociados a la factura y actualizar el DataGridView carrito = ControladoraLotes.Instance.ListarPorFacturaId(factura.Id).ToList() ?? new List(); dataGridView2.DataSource = null; dataGridView2.DataSource = carrito; // Actualizar el total ActualizarTotal(); } private void ActualizarTotal() { // Recalcular el total de la factura decimal total = 0; foreach (var lote in carrito) { total += (decimal)(lote.Producto.Precio * lote.CantidadDeProductos); } numtotal.Value = total; } private bool ValidarDatos() { string devolucion = ""; if (string.IsNullOrEmpty(numid.Text)) devolucion += "El ID no puede ser nulo o vacío\n"; if (clienteSeleccionado == null) devolucion += "Debe seleccionar un cliente\n"; if (devolucion == "") { return true; } else { MessageBox.Show(devolucion, "Errores de Validación", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } } private void button1_Click(object sender, EventArgs e) { // Validar los datos antes de continuar if (ValidarDatos()) { try { // Verificar si la ID de la factura ya está en uso if (RepositorioFactura.Instance.ExistePorId((int)numid.Value) && factura == null) { MessageBox.Show("La ID de la factura ya está en uso. Por favor, elija una ID diferente.", "ID en Uso", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (factura == null) { // Crear una nueva factura con los datos proporcionados factura = new Factura { Id = (int)numid.Value, Total = (double)numtotal.Value, Fecha = datepick.Value, Cliente = (Cliente)cmbCliente.SelectedItem }; // Agregar la factura a la colección ControladoraFacturas.Instance.Añadir(factura); // Guardar los lotes asociados a la factura foreach (var lote in carrito) { lote.Id = factura.Id; // Usar la ID de la factura lote.Fecha = factura.Fecha; // Usar la fecha de la factura ControladoraLotes.Instance.Añadir(lote); } } else { // Actualizar los datos de la factura existente factura.Id = (int)numid.Value; factura.Total = (double)numtotal.Value; factura.Fecha = datepick.Value; factura.Cliente = (Cliente)cmbCliente.SelectedItem; // Modificar la factura en la colección ControladoraFacturas.Instance.Modificar(factura); // Actualizar los lotes asociados a la factura ControladoraLotes.Instance.EliminarPorFacturaId(factura.Id); // Eliminar lotes antiguos foreach (var lote in carrito) { lote.Id = factura.Id; // Usar la ID de la factura lote.Fecha = factura.Fecha; // Usar la fecha de la factura ControladoraLotes.Instance.Añadir(lote); } } MessageBox.Show("Operación realizada con éxito", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information); Close(); } catch (InvalidOperationException ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { // Captura cualquier otra excepción que pueda ocurrir MessageBox.Show("Ocurrió un error inesperado: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void button2_Click(object sender, EventArgs e) { this.Close(); } private void button3_Click(object sender, EventArgs e) { // Validar los datos antes de crear el lote if (ValidarDatos() && ValidarDatosLote()) { // Verifica si hay una fila seleccionada en el DataGridView if (dataGridView1.CurrentRow != null) { // Deshabilitar los controles para ID, fecha, y cliente numid.Enabled = false; datepick.Enabled = false; cmbCliente.Enabled = false; // Crear un nuevo lote con los datos proporcionados var lote = new Lote { Id = (int)numid.Value, // Usar la misma ID que la de la factura Fecha = datepick.Value, // Usar la misma fecha que la de la factura Producto = (Producto)dataGridView1.CurrentRow.DataBoundItem, CantidadDeProductos = (long)numericUpDown1.Value, // Usar el valor de unidades del NumericUpDown Habilitado = true // Asignar un valor por defecto o según tus necesidades }; // Añadir el lote al carrito carrito.Add(lote); // Actualizar el total de la factura ActualizarTotal(); // Actualizar el DataGridView para reflejar los cambios dataGridView2.DataSource = null; dataGridView2.DataSource = carrito; } else { // Mostrar un mensaje si no se ha seleccionado ninguna fila MessageBox.Show("Por favor, seleccione un producto en el carrito antes de añadir.", "Selección Requerida", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } // Función actualizada para validar los datos del lote private bool ValidarDatosLote() { string devolucion = ""; // Validar la selección del producto if (dataGridView1.CurrentRow == null) devolucion += "Debe seleccionar un producto para añadir al lote\n"; // Validar la cantidad de productos if (numericUpDown1.Value <= 0) devolucion += "La cantidad de productos debe ser mayor que cero\n"; if (devolucion == "") { return true; } else { MessageBox.Show(devolucion, "Errores de Validación", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } } private void datepick_ValueChanged(object sender, EventArgs e) { } } }