using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LLNet.Utils;
using LLNet.GUI;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Xml;
using System.Globalization;

namespace LLNet.Tienda.MainForms
{
    public partial class Frm_Fe_Compras : Form
    {
        #region Variables Globales
        private DataTable dt;
        private decimal totalArt = 0;
        Regex vExpresion_Ced = new Regex(@"^\d-\d{4,4}-\d{4,4}$");//Expresión regular para el número de cédula
        Regex vExpresion_Jud = new Regex(@"[0-9]{10}");//Expresión regular para el número de cédula
        Regex vExpresion_Ext = new Regex(@"[0-9]{12}");//Expresión regular para el número de cédula
        #endregion
        public Frm_Fe_Compras()
        {
            InitializeComponent();
        }

        #region Metodos

        #region mDepartamentos
        /// <summary>
        /// Este método obtiene y carga en el combobox los tipos de identicación
        /// </summary>
        private void mDepartamentos()
        {
            cbx_Departamento.DataSource = null;
            cbx_Departamento.SelectedValueChanged -= cbx_Departamento_SelectedValueChanged;

            using (DataSet vTipoIdentif = CApp.bll.getDataSet("PDV", "BuscarDepto"))
            {
                // Verifica si tiene datos
                if (vTipoIdentif.Tables.Count > 0 && vTipoIdentif.Tables[0].Rows.Count > 0)
                {
                    cbx_Departamento.DataSource = vTipoIdentif.Tables[0];
                    cbx_Departamento.DisplayMember = "RV_MEANING";
                    cbx_Departamento.ValueMember = "RV_LOW_VALUE";
                }
            }

            cbx_Departamento.SelectedValueChanged -= cbx_Departamento_SelectedValueChanged;
        }

        #endregion

        #region Teclas rapidas
        private void Frm_Fe_Compras_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Alt)
            {
                switch (e.KeyCode)
                {
                    case Keys.A:
                        btn_Cliente_Click(null, null);
                        break;
                    case Keys.B:
                        btn_buscar_Click(null, null);
                        break;
                }
            }
            if (e.Modifiers == Keys.None)
            {
                switch (e.KeyCode)
                {
                    case Keys.F12:
                        btnGuardar_Click(null, null);
                        break;
                    case Keys.Escape:
                        btn_Salir_Click(null, null);
                        break;
                    case Keys.F5:
                        btn_Agregar_Click(null, null);
                        break;
                    case Keys.F4:
                        btn_Eliminar_Click(null, null);
                        break;
                }
            }
        }
        #endregion

        #region Limpiar
        private void LimpiarT()
        {
            cbxTipoID.SelectedIndex = 0;
            mtbIdentificacion.Text = null;
            txtNombre.Text = null;
            txtFactura.Text = null;
            txt_Articulo.Text = null;
            txt_Monto.Text = null;
            txt_Impuesto.Text = null;
            dtp_Fecha.Text = null;
            cbx_Departamento.SelectedIndex = 0;
            txt_Empleado.Text = null;
            btnGuardar.Visible = false;
            btnGuardar.Enabled = false;
            cbxTipoID.Enabled = true;
            mtbIdentificacion.Enabled = true;
            txtNombre.Enabled = true;
            txtFactura.Enabled = true;
            dtp_Fecha.Enabled = true;
            totalArt = 0;
            lbl_Total.Text = "Total: " + totalArt;
            DataRow row = dt.NewRow();
            dt.Rows.Clear();
        }

        private void LimpiarA()
        {
            txt_Articulo.Text = null;
            txt_Cabys.Text = null;
            txt_Monto.Text = null;
            txt_Impuesto.Text = null;
        }
        #endregion

        #region mTiposIdentificacion
        /// <summary>
        /// Este método obtiene y carga en el combobox los tipos de identicación
        /// </summary>
        private void mTiposIdentificacion()
        {
            cbxTipoID.DataSource = null;
            cbxTipoID.SelectedValueChanged -= cbxTipoID_SelectedValueChanged;

            using (DataSet vTipoIdentif = CApp.bll.getDataSet("PDV", "FE_V_TIPO_IDENTIFICACION"))
            {
                // Verifica si tiene datos
                if (vTipoIdentif.Tables.Count > 0 && vTipoIdentif.Tables[0].Rows.Count > 0)
                {
                    cbxTipoID.DataSource = vTipoIdentif.Tables[0];
                    cbxTipoID.DisplayMember = "TIPO";
                    cbxTipoID.ValueMember = "ID_TIPO";
                }
            }

            cbxTipoID.SelectedValueChanged += cbxTipoID_SelectedValueChanged;
        }

        #endregion

        #region Validadcion Cedula
        private void Validar_Cedula()
        {
            string nombre;
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("P_ID", mtbIdentificacion.Text.Trim().ToString());
            nombre = Convert.ToString(CApp.bll.GetSingleValue("ValidarID", qp, "PDV"));

            if (nombre == "")
            {
                CApp.ShowMessage("No hay ningun proveedor con esa identificacion.\n Proceda a registar el proveedor", "Mensaje Informativo", true);
                mtbIdentificacion.Text = null;
                mtbIdentificacion.Focus();
            }
            else
            {
                txtNombre.Text = nombre;
                txtFactura.Focus();
            }
        }

        private void mtbIdentificacion_Leave(object sender, EventArgs e)
        {
            Validar_Cedula();
        }

        private void mtbIdentificacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((int)e.KeyChar == (int)Keys.Enter)
            {
                Validar_Cedula();
            }
        }
        #endregion

        #region Validacion Monto
        private void txt_Monto_KeyPress(object sender, KeyPressEventArgs e)
        {
            CultureInfo cc = System.Threading.Thread.CurrentThread.CurrentCulture;

            if (e.KeyChar ==8 ) {
                e.Handled = false;
                return;
            }

           bool IsDec = false;
            int nroDec = 0;

           for (int i=0 ; i<txt_Monto.Text.Length; i++) {
               if (txt_Monto.Text[i] == Convert.ToChar(cc.NumberFormat.NumberDecimalSeparator))
                IsDec = true;

             if ( IsDec && nroDec++ >=2) {
                e.Handled = true;
                return;
             }
           }

           if ( e.KeyChar>=48 && e.KeyChar<=57)
             e.Handled = false;
           else if (e.KeyChar==46)         
             e.Handled = (IsDec) ? true:false;
           else
             e.Handled = true;
        }

        private void txt_Impuesto_KeyPress(object sender, KeyPressEventArgs e)
        {
            CultureInfo cc = System.Threading.Thread.CurrentThread.CurrentCulture;

            if (e.KeyChar == 8)
            {
                e.Handled = false;
                return;
            }

            bool IsDec = false;
            int nroDec = 0;

            for (int i = 0; i < txt_Impuesto.Text.Length; i++)
            {
                if (txt_Impuesto.Text[i] == Convert.ToChar(cc.NumberFormat.NumberDecimalSeparator))
                    IsDec = true;

                if (IsDec && nroDec++ >= 2)
                {
                    e.Handled = true;
                    return;
                }
            }

            if (e.KeyChar >= 48 && e.KeyChar <= 57)
                e.Handled = false;
            else if (e.KeyChar == 46)
                e.Handled = (IsDec) ? true : false;
            else
                e.Handled = true;
        }

        //|| e.KeyChar.ToString() != cc.NumberFormat.NumberDecimalSeparator
        #endregion

        #region Guardar Factura

        private void Guardar_Documento(string pTipoDoc)
        {
            string depto;
            Utils.QueryParams param = new LLNet.Utils.QueryParams();
            depto = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("BREE"));
            if (depto == "430000000")
	        {
                depto = cbx_Departamento.Text.ToString().Trim();
	        }

            param.AddReplaceParam("p_TIPODOC", pTipoDoc);
            param.AddReplaceParam("p_FECHA", dtp_Fecha.Value.ToString("dd/MM/yyyy hh:mm:ss"));
            param.AddReplaceParam("p_NODOC", txtFactura.Text.Trim());
            param.AddReplaceParam("p_MONTO", totalArt.ToString());
            param.AddReplaceParam("p_ID", mtbIdentificacion.Text.Trim().ToString());
            param.AddReplaceParam("p_TIENDA", depto);
            param.AddReplaceParam("p_JORNADA", Program.Jornada.ToString());
            param.AddReplaceParam("p_CAJA", Program.Caja.ToString());
            param.AddReplaceParam("p_USUARIO", GUI.CApp.usuario.ToString());
            param.AddReplaceParam("p_NOMEMPLEADO", txt_Empleado.Text.Trim());

            GUI.CApp.bll.ExecuteSql("GuardarCompra", param, "PDV");

        }

        #endregion

        #region Guardar Articulos
        private void Guardar_Articulos(string pTipodoc)
        {
            Utils.QueryParams param = new LLNet.Utils.QueryParams();

            for (int i = 0; i < dgv_Articulos.Rows.Count -1; i++)
			{
                param.AddReplaceParam("p_LINEA", (i + 1).ToString());
                param.AddReplaceParam("p_ARTICULO", dgv_Articulos.Rows[i].Cells[0].Value.ToString());
                param.AddReplaceParam("p_CABYS", dgv_Articulos.Rows[i].Cells[1].Value.ToString());
                param.AddReplaceParam("p_FECHA", dtp_Fecha.Value.ToString("dd/MM/yyyy hh:mm:ss"));
                param.AddReplaceParam("p_SUBTOTAL", dgv_Articulos.Rows[i].Cells[2].Value.ToString());
                param.AddReplaceParam("p_IMPUESTO", dgv_Articulos.Rows[i].Cells[3].Value.ToString());
                param.AddReplaceParam("p_NODOC", txtFactura.Text.Trim());
                param.AddReplaceParam("p_ID", mtbIdentificacion.Text.Trim().ToString());
                param.AddReplaceParam("p_TIENDA", Utils.Helpers.ObjToStr(GUI.CApp.GetParam("BREE")));
                param.AddReplaceParam("p_JORNADA", Program.Jornada.ToString());
                param.AddReplaceParam("p_CAJA", Program.Caja.ToString());
                param.AddReplaceParam("p_USUARIO", GUI.CApp.usuario.ToString());
                param.AddReplaceParam("p_TIPODOC", pTipodoc);
                GUI.CApp.bll.ExecuteSql("GuardarArticulos", param, "PDV");

                param.Clear();
			}
        }
        #endregion

        #region mTrama
        /// <summary>
        /// Este método genera la trama y la envía al proveedor
        /// </summary>
        /// <param name="pDocumento"></param>
        private void mTrama(long pDocumento)
        {
            string vClave = String.Empty, vCodigo = String.Empty;
            string vEnvio_Trama = String.Empty;
            QueryParams vParametros = new QueryParams();
            string vRespuesta = String.Empty;
            string vRespuesta_Xml = String.Empty;
            string vUrl = String.Empty;

            try
            {
                vEnvio_Trama = Helpers.Nvl(CApp.GetParam("ETFE"), "N").ToString();

                if (vEnvio_Trama == "S")
                {

                    vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());

                    // Se crea la trama
                    GUI.CApp.bll.ExecuteSql("FE_P_CREAR_TRAMA_COMPRA", vParametros, "PDV");

                    //
                    // Obtiene la trama
                    using (DataSet vDatos = GUI.CApp.bll.getDataSet("PDV", "OBTENER_TRAMA_COMPRA", vParametros))
                    {
                        if (vDatos.Tables.Count > 0 && vDatos.Tables[0].Rows.Count > 0)
                        {
                            vUrl = Helpers.Nvl(CApp.GetParam("URLC"), "").ToString();

                            WSAVD.WSFEBuilderSoapClient vFact_Elect = new WSAVD.WSFEBuilderSoapClient();
                            //
                            // Actualiza la dirección del web services
                            vFact_Elect.Endpoint.Address = new System.ServiceModel.EndpointAddress(vUrl);
                            //
                            // Envía la trama
                            vRespuesta_Xml = vFact_Elect.procesarTextoPlano(vDatos.Tables[0].Rows[0].ItemArray[2].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[3].ToString(), vDatos.Tables[0].Rows[0].ItemArray[4].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[1].ToString(), vDatos.Tables[0].Rows[0].ItemArray[0].ToString());

                            if (!String.IsNullOrEmpty(vRespuesta_Xml))
                            {
                                XmlDocument vXml_Doc = new XmlDocument();
                                vXml_Doc.LoadXml(vRespuesta_Xml);
                                //
                                using (DataSet vDatosXML = new DataSet())
                                {
                                    vDatosXML.ReadXml(new XmlNodeReader(vXml_Doc));

                                    if (vDatosXML.Tables.Count > 0 && vDatosXML.Tables[0].Rows.Count > 0)
                                    {
                                        // Código respuesta del proveedor
                                        vCodigo = vDatosXML.Tables[0].Rows[0].ItemArray[0].ToString();
                                        vRespuesta = vDatosXML.Tables[0].Rows[0].ItemArray[2].ToString();

                                        if (vCodigo.Replace("'", "") == "S0001")
                                        {
                                            vClave = vDatosXML.Tables[0].Rows[0].ItemArray[3].ToString();
                                        }
                                        else
                                        {
                                            vClave = String.Empty;
                                        }
                                    }
                                }
                            }
                            //
                            // Almacena la respuesta
                            vParametros.AddReplaceParam("pCCODIGO", vCodigo.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA", vRespuesta.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA_XML", vRespuesta_Xml.Replace("'", ""));
                            vParametros.AddReplaceParam("pCCLAVE", vClave);

                            GUI.CApp.bll.ExecuteSql("FE_P_ALM_RESPUESTA", vParametros, "PDV");
                        }
                    }
                }
            }
            catch (TimeoutException vErrorTime)
            {
                vParametros = new QueryParams();
                // Error envío AVD
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                vParametros.AddReplaceParam("pCERROR", vErrorTime.Message.Replace("'", ""));
                //
                GUI.CApp.bll.ExecuteSql("FE_P_REGISTRO_ERROR", vParametros, "PDV");
            }
            catch (Exception vError)
            {
                vParametros = new QueryParams();
                // Error envío AVD
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                vParametros.AddReplaceParam("pCERROR", vError.Message.Replace("'", ""));
                //
                GUI.CApp.bll.ExecuteSql("FE_P_REGISTRO_ERROR", vParametros, "PDV");
            }
        }
        #endregion

        #region Articulos anulados
        private void Anular_articulos()
        {
            Utils.QueryParams param = new LLNet.Utils.QueryParams();
            int vcantlinea, vdoc, vdocint;


            param.AddReplaceParam("p_NODOC", txtFactura.Text.Trim());
            param.AddReplaceParam("p_ID", mtbIdentificacion.Text.Trim().ToString());
            param.AddReplaceParam("p_TIPODOC", "C");
            vcantlinea = Convert.ToInt32(CApp.bll.GetSingleValue("CantLinea", param, "PDV").ToString());
            vdoc = Convert.ToInt32(CApp.bll.GetSingleValue("DocInterno", param, "PDV").ToString());
            param.Clear();
            param.AddReplaceParam("p_DOCUMENTO", vdoc.ToString());
            vdocint = Convert.ToInt32(CApp.bll.GetSingleValue("DocPadre", param, "PDV").ToString());

            if (vdocint == 0)
            {
                for (int i = 1; i <= vcantlinea; i++)
                {
                    DataRow row = dt.NewRow();
                    Utils.QueryParams parmeter = new LLNet.Utils.QueryParams();

                    parmeter.AddReplaceParam("p_LINEA", i.ToString());
                    parmeter.AddReplaceParam("p_DOCUMENTO", vdoc.ToString());

                    row["Articulo"] = CApp.bll.GetSingleValue("ObtArt", parmeter, "PDV").ToString();
                    row["Monto"] = CApp.bll.GetSingleValue("ObtMonto", parmeter, "PDV").ToString();
                    row["Impuesto"] = CApp.bll.GetSingleValue("ObtImpt", parmeter, "PDV").ToString();

                    totalArt = totalArt + Convert.ToInt32(CApp.bll.GetSingleValue("ObtMonto", parmeter, "PDV").ToString()) + Convert.ToInt32(CApp.bll.GetSingleValue("ObtImpt", parmeter, "PDV").ToString());

                    dt.Rows.Add(row);
                }
                lbl_Total.Text = "Total: " + totalArt;
            }
            else
            {
                CApp.ShowMessage("La factura ya fue anulada", "Mensaje Informativo", true);
            }
        }

        #endregion

        #endregion

        #region Acciones

        #region Guardar

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (cbxTipoID.SelectedValue.ToString() == "01" && !vExpresion_Ced.IsMatch(mtbIdentificacion.Text))
                {
                    CApp.ShowMessage("¡Digite/complete la cédula con el formato 0-0000-0000!", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                else if (cbxTipoID.SelectedValue.ToString() == "02" && (!vExpresion_Jud.IsMatch(mtbIdentificacion.Text) || mtbIdentificacion.Text.Length > 10))
                {
                    CApp.ShowMessage("La cédula jurídica no puede ser de más o menos de 10 dígitos", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                else if ((cbxTipoID.SelectedValue.ToString() == "03" || cbxTipoID.SelectedValue.ToString() == "04") && (!vExpresion_Ext.IsMatch(mtbIdentificacion.Text)|| mtbIdentificacion.Text.Length > 12))
                {
                    CApp.ShowMessage("El Dimex o NIT no puede ser de más o menos de 12 dígitos", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                if (txt_Articulo.Text.Trim().Length > 30)
                {
                    CApp.ShowMessage("La descripcion del articulo no debe ser mayor a 30 caracteres", "Factura de Compras", true);
                    txt_Articulo.Focus();
                }
                Utils.QueryParams param = new LLNet.Utils.QueryParams();
                long vdocumento;
                string vresult;

                if (rbt_Factura.Checked == true)
                {
                    vresult = "C";
                }
                else
                {
                    vresult = "N";
                }

                Guardar_Documento(vresult);
                Guardar_Articulos(vresult);

                param.AddReplaceParam("p_NODOC", txtFactura.Text.Trim());
                param.AddReplaceParam("p_ID", mtbIdentificacion.Text.Trim().ToString());
                param.AddReplaceParam("p_TIPODOC", vresult);
                vdocumento = Convert.ToInt64(CApp.bll.GetSingleValue("DocInterno", param, "PDV").ToString());

                mTrama(vdocumento);

                LimpiarT();

                if (vresult == "C")
                {
                    CApp.ShowMessage("Factura guardada con exito!", "Mensaje Informativo", true); 
                }
                else
                {
                    CApp.ShowMessage("Nota de credito guardada con exito!", "Mensaje Informativo", true);
                }

            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Factura de Compras", true);
            }
        }

        #endregion

        #region CbxTipoID

        private void cbxTipoID_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbxTipoID.SelectedValue.ToString() == "01")
                {
                    mtbIdentificacion.Mask = "0-0000-0000";
                    mtbIdentificacion.Focus();
                }
                else
                {
                    mtbIdentificacion.Mask = String.Empty;
                    mtbIdentificacion.Focus();
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Factura de Compras", true);
            }
        }

        #endregion

        #region Frm_Load

        private void Frm_Fe_Compras_Load(object sender, EventArgs e)
        {
            string dsB;
            mTiposIdentificacion();
            cbxTipoID_SelectedValueChanged(null, null);
            mDepartamentos();
            cbx_Departamento_SelectedValueChanged(null, null);
            lbl_Total.Text = "Total: " + totalArt;
            btnGuardar.Visible = false;
            btnGuardar.Enabled = false;
            btn_Factura.Enabled = false;
            btn_Factura.Visible = false;

            dt = new DataTable();
            dt.Columns.Add("Articulo");
            dt.Columns.Add("Cabys");
            dt.Columns.Add("Monto");
            dt.Columns.Add("Impuesto");
            dgv_Articulos.DataSource = dt;

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("Param", "BREE");
            dsB = CApp.bll.GetSingleValue("GetParam", qp, "General").ToString();
            if (dsB == "430000000")
            {
                lbl_Dep.Visible = true;
                lbl_Empleado.Visible = true;
                cbx_Departamento.Visible = true;
                txt_Empleado.Visible = true;
            }
            else
            {
                lbl_Dep.Visible = false;
                lbl_Empleado.Visible = false;
                cbx_Departamento.Visible = false;
                txt_Empleado.Visible = false;
            }
        }

        #endregion 

        #region Cliente
        private void btn_Cliente_Click(object sender, EventArgs e)
        {
            Frm_Fe_Proveedor_Compra feprov = new Frm_Fe_Proveedor_Compra();
            feprov.ShowDialog();
        }
        #endregion

        #region Salir
        private void btn_Salir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion

        #region Buscar
        private void btn_buscar_Click(object sender, EventArgs e)
        {
            Frm_FE_Buscar_Proveedor frmbp = new Frm_FE_Buscar_Proveedor();
            frmbp.ShowDialog();
            mtbIdentificacion.Text = frmbp.mIdentificacion;
            txtNombre.Text = frmbp.mNombre;
        }
        #endregion

        #region Agregar
        private void btn_Agregar_Click(object sender, EventArgs e)
        {
            try
            {
                if (txt_Articulo.Text.Trim() != "" && txt_Monto.Text.Trim() != "" && txt_Impuesto.Text.Trim() != "")
                {
                    if (txt_Monto.Text.Trim() == "0" || txt_Monto.Text.Trim() == "")
                    {
                        CApp.ShowMessage("El monto debe ser mayor a cero", "Factura de Compras", true);
                        txt_Articulo.Focus();
                    }
                    if (txt_Impuesto.Text.Trim() == "")
                    {
                        txt_Impuesto.Text = "0";
                    }


                    DataRow row = dt.NewRow();

                    row["Articulo"] = txt_Articulo.Text.Trim();
                    row["Cabys"] = txt_Cabys.Text.Trim();
                    row["Monto"] = txt_Monto.Text.Trim();
                    row["Impuesto"] = txt_Impuesto.Text.Trim();

                    dt.Rows.Add(row);

                    totalArt = totalArt + Convert.ToDecimal(txt_Monto.Text.Trim()) + Convert.ToDecimal(txt_Impuesto.Text.Trim());
                    lbl_Total.Text = "Total: " + totalArt;

                    LimpiarA();

                    btnGuardar.Visible = true;
                    btnGuardar.Enabled = true;
                    cbxTipoID.Enabled = false;
                    mtbIdentificacion.Enabled = false;
                    txtNombre.Enabled = false;
                    txtFactura.Enabled = false;
                    dtp_Fecha.Enabled = false;
                }
                else
                {
                    CApp.ShowMessage("Debe llenar las casillas en blanco", "Mensaje Informativo", true);
                }

            }
            catch (Exception)
            {
                CApp.ShowMessage("Debe llenar las casillas en blanco", "Mensaje Informativo", true);
            }  
        }
        #endregion

        #region Eliminar
        private void btn_Eliminar_Click(object sender, EventArgs e)
        {
            try
            {
                totalArt = totalArt - Convert.ToDecimal(dgv_Articulos.Rows[dgv_Articulos.CurrentRow.Index].Cells[2].Value.ToString()) - Convert.ToDecimal(dgv_Articulos.Rows[dgv_Articulos.CurrentRow.Index].Cells[3].Value.ToString());

                dgv_Articulos.Rows.RemoveAt(dgv_Articulos.CurrentRow.Index);

                lbl_Total.Text = "Total: " + totalArt;

                if ((dgv_Articulos.Rows.Count - 1 ) == 0)
                {
                    btnGuardar.Visible = false;
                    btnGuardar.Enabled = false;
                    cbxTipoID.Enabled = true;
                    mtbIdentificacion.Enabled = true;
                    txtNombre.Enabled = true;
                    txtFactura.Enabled = true;
                    dtp_Fecha.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage("No hay registro para eliminar", "Mensaje Informativo", true);
            }

        }
        #endregion

        #region Cambio Radiobuton
        private void rbt_Factura_CheckedChanged(object sender, EventArgs e)
        {
            LimpiarT();
            txt_Articulo.Enabled = true;
            txt_Monto.Enabled = true;
            txt_Impuesto.Enabled = true;
            btn_Agregar.Enabled = true;
            btn_Eliminar.Enabled = true;
            btnGuardar.Enabled = false;
            btnGuardar.Visible = false;
            btn_Factura.Enabled = false;
            btn_Factura.Visible = false;
            dgv_Articulos.Enabled = true;
        }

        private void rbt_Anulacion_CheckedChanged(object sender, EventArgs e)
        {
            txt_Articulo.Enabled = false;
            txt_Monto.Enabled = false;
            txt_Impuesto.Enabled = false;
            btn_Agregar.Enabled = false;
            btn_Eliminar.Enabled = false;
            btn_Factura.Enabled = true;
            btn_Factura.Visible = true;
            dgv_Articulos.Enabled = false;
        }

        #endregion

        #region Mostar Articulos anulados
        private void txtFactura_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (rbt_Anulacion.Checked == true)
            {
                if ((int)e.KeyChar == (int)Keys.Enter)
                {
                    Anular_articulos();
                    btnGuardar.Enabled = true;
                    btnGuardar.Visible = true;
                }
            }
        }

        private void btn_Factura_Click(object sender, EventArgs e)
        {
            Anular_articulos();
            btnGuardar.Enabled = true;
            btnGuardar.Visible = true;
        }

        #endregion

        private void cbx_Departamento_SelectedValueChanged(object sender, EventArgs e)
        {
            mDepartamentos();
        }

        #endregion
    }
}
