private async void BtnSave_Click(object sender, EventArgs e)
        {
            try
            {
                var(result, usuario, direccion, venta, agendamiento) = await this.Comprobaciones();

                if (result)
                {
                    MensajeEspera.ShowWait("Guardando...");
                    List <string> errores = new List <string>();
                    string        rpta    = "";

                    if (this.IsEditar)
                    {
                        rpta = NUsuarios.EditarUsuario(usuario.Id_usuario, usuario);
                    }
                    else
                    {
                        rpta = NUsuarios.InsertarUsuario(out int id_usuario, usuario);
                        direccion.Id_usuario = id_usuario;
                        venta.Id_cliente     = id_usuario;
                        usuario.Id_usuario   = id_usuario;
                    }

                    if (rpta.Equals("OK"))
                    {
                        if (this.IsEditar)
                        {
                            rpta = NDireccion_clientes.EditarDireccion(direccion.Id_direccion, direccion);
                        }
                        else
                        {
                            rpta = NDireccion_clientes.InsertarDireccion(out int id_direccion, direccion);
                            venta.Id_direccion = id_direccion;
                        }

                        if (rpta.Equals("OK"))
                        {
                            if (this.IsEditar)
                            {
                                rpta = NVentas.EditarVenta(venta.Id_venta, venta);
                            }
                            else
                            {
                                rpta           = NVentas.InsertarVenta(out int id_venta, venta);
                                venta.Id_venta = id_venta;
                            }

                            if (rpta.Equals("OK"))
                            {
                                if (this.rdActual.Checked && !this.IsEditar && this.chkDescontar.Checked)
                                {
                                    foreach (Articulos art in this.ArticulosSelected)
                                    {
                                        Detalle_articulos_venta detalle = new Detalle_articulos_venta
                                        {
                                            Articulo          = art,
                                            Id_articulo       = art.Id_articulo,
                                            Venta             = venta,
                                            Id_venta          = venta.Id_venta,
                                            Cantidad_articulo = (int)art.Cantidad_articulo,
                                            Valor_articulo    = art.Valor_articulo,
                                            Estado_detalle    = "ACTIVO",
                                        };

                                        var(rptaDetalle, id_detalle) =
                                            await NDetalle_articulos_venta.InsertarDetalle(detalle);

                                        if (!rptaDetalle.Equals("OK"))
                                        {
                                            errores.Add(rptaDetalle);
                                        }
                                    }
                                }

                                MainController main = MainController.GetInstance();

                                if (!this.IsEditar)
                                {
                                    rpta = NUsuariosVentas.InsertarUsuarioVenta(new Usuarios_ventas
                                    {
                                        Id_usuario = main.Usuario.Id_usuario,
                                        Id_venta   = venta.Id_venta,
                                    });

                                    if (rpta.Equals("OK"))
                                    {
                                        agendamiento.Id_venta = venta.Id_venta;
                                        rpta = NAgendamiento_cobros.InsertarAgendamiento(out int id_agendamiento, agendamiento);
                                        if (rpta.Equals("OK"))
                                        {
                                            MensajeEspera.CloseForm();
                                            Mensajes.MensajeInformacion("Se guardó correctamente el cliente, " +
                                                                        "número cliente: " + usuario.Id_usuario + " Número venta: " + venta.Id_venta, "Entendido");
                                            this.Close();
                                        }
                                        else
                                        {
                                            throw new Exception(rpta);
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(rpta);
                                    }
                                }
                                else
                                {
                                    //Obtener el último agendamiento
                                    var(rptaAg, dt) =
                                        await NAgendamiento_cobros.BuscarAgendamientos("ID VENTA", venta.Id_venta.ToString());

                                    if (dt != null)
                                    {
                                        agendamiento             = new Agendamiento_cobros(dt.Rows[0]);
                                        agendamiento.Valor_cobro = venta.Valor_cuota;
                                        agendamiento.Fecha_cobro = this.dateUltimoPago.Value;
                                        rptaAg = await NAgendamiento_cobros.EditarAgendamiento(agendamiento.Id_agendamiento, agendamiento);

                                        if (rptaAg != "OK")
                                        {
                                            Mensajes.MensajeInformacion("Se actualizó el cliente pero no su último pago," +
                                                                        "número cliente: " + usuario.Id_usuario + " Número venta: " + venta.Id_venta, "Entendido");
                                            this.OnRefresh?.Invoke(sender, e);
                                            this.Close();
                                        }
                                        else
                                        {
                                            Mensajes.MensajeInformacion("Se actualizó correctamente el cliente, " +
                                                                        "número cliente: " + usuario.Id_usuario + " Número venta: " + venta.Id_venta, "Entendido");
                                            this.OnRefresh?.Invoke(sender, e);
                                            this.Close();
                                        }
                                    }
                                    else
                                    {
                                        Mensajes.MensajeInformacion("Se actualizó correctamente el cliente pero no se encontraron sus agendamientos, número asignado: " + usuario.Id_usuario, "Entendido");
                                        this.OnRefresh?.Invoke(sender, e);
                                        this.Close();
                                    }
                                }
                            }
                        }
                        else
                        {
                            throw new Exception(rpta);
                        }
                    }
                    else
                    {
                        throw new Exception(rpta);
                    }
                }
                MensajeEspera.CloseForm();
            }
            catch (Exception ex)
            {
                MensajeEspera.CloseForm();
                Mensajes.MensajeErrorCompleto(this.Name, "BtnSave_Click",
                                              "Hubo un error al guardar el cliente", ex.Message);
            }
        }
        public async Task <(string rpta, int id_detalle)> InsertarDetalle(Detalle_articulos_venta detalle)
        {
            int    id_detalle = 0;
            int    contador   = 0;
            string rpta       = "";

            string consulta = "INSERT INTO Detalle_articulos_venta (Id_articulo, Id_venta, Cantidad_articulo, Valor_articulo, Estado_detalle) " +
                              "VALUES(@Id_articulo, @Id_venta, @Cantidad_articulo, @Valor_articulo, @Estado_detalle) " +
                              "SET @Id_detalle_venta = SCOPE_IDENTITY() ";

            SqlConnection SqlCon = new SqlConnection();

            SqlCon.InfoMessage += new SqlInfoMessageEventHandler(SqlCon_InfoMessage);
            SqlCon.FireInfoMessageEventOnUserErrors = true;
            try
            {
                SqlCon.ConnectionString = DConexion.Cn;
                await SqlCon.OpenAsync();

                SqlTransaction tran   = SqlCon.BeginTransaction();
                SqlCommand     SqlCmd = new SqlCommand
                {
                    Connection  = SqlCon,
                    CommandText = consulta,
                    CommandType = CommandType.Text,
                    Transaction = tran,
                };

                SqlParameter Id_detalle_venta = new SqlParameter
                {
                    ParameterName = "@Id_detalle_venta",
                    SqlDbType     = SqlDbType.Int,
                    Direction     = ParameterDirection.Output
                };
                SqlCmd.Parameters.Add(Id_detalle_venta);

                SqlParameter Id_articulo = new SqlParameter
                {
                    ParameterName = "@Id_articulo",
                    SqlDbType     = SqlDbType.Int,
                    Value         = detalle.Id_articulo,
                };
                SqlCmd.Parameters.Add(Id_articulo);
                contador += 1;

                SqlParameter Id_venta = new SqlParameter
                {
                    ParameterName = "@Id_venta",
                    SqlDbType     = SqlDbType.Int,
                    Value         = detalle.Id_venta,
                };
                SqlCmd.Parameters.Add(Id_venta);
                contador += 1;

                SqlParameter Cantidad_articulo = new SqlParameter
                {
                    ParameterName = "@Cantidad_articulo",
                    SqlDbType     = SqlDbType.Int,
                    Value         = detalle.Cantidad_articulo,
                };
                SqlCmd.Parameters.Add(Cantidad_articulo);
                contador += 1;

                SqlParameter Valor_articulo = new SqlParameter
                {
                    ParameterName = "@Valor_articulo",
                    SqlDbType     = SqlDbType.Decimal,
                    Value         = detalle.Cantidad_articulo,
                };
                SqlCmd.Parameters.Add(Valor_articulo);
                contador += 1;

                SqlParameter Estado_detalle = new SqlParameter
                {
                    ParameterName = "@Estado_detalle",
                    SqlDbType     = SqlDbType.VarChar,
                    Size          = 50,
                    Value         = detalle.Estado_detalle.Trim().ToUpper()
                };
                SqlCmd.Parameters.Add(Estado_detalle);
                contador += 1;

                //Ejecutamos nuestro comando
                rpta = await SqlCmd.ExecuteNonQueryAsync() >= 1 ? "OK" : "NO SE INGRESÓ";

                if (!rpta.Equals("OK"))
                {
                    tran.Rollback();
                    if (this.Mensaje_respuesta != null)
                    {
                        rpta = this.Mensaje_respuesta;
                    }
                }
                else
                {
                    tran.Commit();
                    id_detalle = Convert.ToInt32(SqlCmd.Parameters["@Id_detalle_venta"].Value);
                }
                tran.Dispose();
            }
            //Mostramos posible error que tengamos
            catch (SqlException ex)
            {
                rpta = ex.Message;
            }
            catch (Exception ex)
            {
                rpta = ex.Message;
            }
            finally
            {
                //Si la cadena SqlCon esta abierta la cerramos
                if (SqlCon.State == ConnectionState.Open)
                {
                    SqlCon.Close();
                }
            }
            return(rpta, id_detalle);
        }
        public static async Task <(string rpta, int id_detalle)> InsertarDetalle(Detalle_articulos_venta detalle)
        {
            DDetalle_articulos_venta DDetalle_articulos_venta = new DDetalle_articulos_venta();

            return(await DDetalle_articulos_venta.InsertarDetalle(detalle));
        }
        private async void BtnClientes_Click(object sender, EventArgs e)
        {
            MensajeEspera.ShowWait("Cargando reporte...");

            MainController main     = MainController.GetInstance();
            int            id_cobro = main.Id_cobro;

            DataTable dtClientes = new DataTable("Clientes");

            dtClientes.Columns.Add("Id_cliente", typeof(int));
            dtClientes.Columns.Add("Nombre_cliente", typeof(string));
            dtClientes.Columns.Add("Celular_cliente", typeof(string));
            dtClientes.Columns.Add("Referencia_articulo", typeof(string));
            dtClientes.Columns.Add("Saldo_restante", typeof(string));
            dtClientes.Columns.Add("Venta_total", typeof(string));
            dtClientes.Columns.Add("Fecha_venta", typeof(string));
            dtClientes.Columns.Add("Fecha_ultimo_pago", typeof(string));

            int      id_cliente          = 0;
            string   nombre_cliente      = string.Empty;
            string   celular_cliente     = string.Empty;
            string   referencia_articulo = string.Empty;
            decimal  saldo_restante      = 0;
            decimal  total_venta         = 0;
            DateTime fecha_venta         = DateTime.Now;
            decimal  suma_ventas         = 0;
            decimal  suma_saldos         = 0;
            DateTime fecha_ultimo_pago   = DateTime.Now;

            var(rpta, dtVentas) =
                await NVentas.BuscarVentas("ID COBRO ACTIVO", id_cobro.ToString());

            if (dtVentas != null)
            {
                foreach (DataRow row in dtVentas.Rows)
                {
                    Ventas venta = new Ventas(row);
                    id_cliente      = venta.Id_cliente;
                    nombre_cliente  = venta.Cliente.NombreCompleto;
                    celular_cliente = venta.Cliente.Celular;
                    total_venta     = venta.Total_venta;
                    fecha_venta     = venta.Fecha_venta;
                    suma_ventas    += venta.Total_venta;

                    if (!venta.Tipo_venta.Equals("MIGRACION"))
                    {
                        var(dtDetalleArticulos, rptaBusqueda) =
                            await NArticulos.BuscarArticulos("ID VENTA", venta.Id_venta.ToString());

                        if (dtDetalleArticulos != null)
                        {
                            StringBuilder referencias = new StringBuilder();
                            referencias.Append(dtDetalleArticulos.Rows.Count + " referencias: ");
                            foreach (DataRow rowArt in dtDetalleArticulos.Rows)
                            {
                                Detalle_articulos_venta detalle = new Detalle_articulos_venta(rowArt);
                                referencias.Append("(" + detalle.Articulo.Id_articulo + ") ");
                                referencias.Append(detalle.Articulo.Referencia_articulo + " - ");
                            }
                            referencia_articulo = referencias.ToString();
                        }
                    }

                    //Buscar los agendamientos de cada venta para ver su saldo restante
                    var(rpta1, dtAgendamientos) = await NAgendamiento_cobros.BuscarAgendamientos("ID VENTA", venta.Id_venta.ToString());

                    if (dtAgendamientos != null)
                    {
                        Agendamiento_cobros ag = new Agendamiento_cobros(dtAgendamientos.Rows[0]);
                        saldo_restante    = ag.Saldo_restante;
                        suma_saldos      += ag.Saldo_restante;
                        fecha_ultimo_pago = ag.Fecha_cobro;
                    }

                    DataRow newRow = dtClientes.NewRow();
                    newRow["Id_cliente"]          = id_cliente;
                    newRow["Nombre_cliente"]      = nombre_cliente;
                    newRow["Celular_cliente"]     = celular_cliente;
                    newRow["Referencia_articulo"] = referencia_articulo;
                    newRow["Saldo_restante"]      = saldo_restante.ToString("C");
                    newRow["Venta_total"]         = total_venta.ToString("C");
                    newRow["Fecha_venta"]         = fecha_venta.ToString("dd-MM-yyyy");
                    newRow["Fecha_ultimo_pago"]   = fecha_ultimo_pago.ToString("dd-MM-yyyy");
                    dtClientes.Rows.Add(newRow);
                }

                if (dtClientes.Rows.Count > 0)
                {
                    MensajeEspera.CloseForm();
                    //Enviar informe
                    FrmReporteClientes frmReporteClientes = new FrmReporteClientes
                    {
                        WindowState  = FormWindowState.Maximized,
                        dtClientes   = dtClientes,
                        Total_saldos = suma_saldos.ToString("C"),
                        Total_ventas = suma_ventas.ToString("C"),
                    };
                    frmReporteClientes.Show();
                }
                else
                {
                    Mensajes.MensajeInformacion("No se encontraron clientes", "Entendido");
                }
            }
            else
            {
                Mensajes.MensajeInformacion("No se encontraron clientes", "Entendido");
            }

            MensajeEspera.CloseForm();
        }