/// <summary>
        /// recibe la sigla del documento, retorna la clase
        /// </summary>
        /// <param name="tipo"></param>
        /// <returns></returns>
        public string Getclasefactura(object tipo)
        {
            FbData db = new FbData();

            var sqltipodoc = "select clase from tipdoc where sigla = '" + tipo + "'";

            var da = db.DataReader(sqltipodoc);

            DataTable dt = new DataTable();

            da.Fill(dt);

            var clase = dt.Rows[0][0].ToString();

            return(clase);
        }
        private void GetFacturas()
        {
            var tipofe = ConfigurationManager.AppSettings.Get("prefijofe");
            var tiponc = ConfigurationManager.AppSettings.Get("prefijonc");
            var tipond = ConfigurationManager.AppSettings.Get("prefijond");


            FbData fb = new FbData();

            var sql = "select TIPDOC.SIGLA AS tipo,a.number numero,  a.fecha,b.id_n nit,b.company Cliente,a.subtotal,a.salestax impuesto, " +
                      " a.total, coalesce(a.procesadodian, 'N') procesado, coalesce(a.cufe, '') cufe " +
                      " from oe a,tipdoc, cust b where a.tipo = tipdoc.clase and a.id_n = b.id_n and a.fecha between '" + dtpDesde.Value.ToString("yyyy-MM-dd") + "' and '" + dtpHasta.Value.ToString("yyyy-MM-dd") + "' ";


            if (cmbDocumento.SelectedIndex == 0)
            {
                sql = sql + "and TIPDOC.SIGLA  = '" + tipofe + "' ";
            }


            if (cmbDocumento.SelectedIndex == 1)
            {
                sql = sql + "and TIPDOC.SIGLA = '" + tipond + "' ";
            }


            if (cmbDocumento.SelectedIndex == 2)
            {
                sql = sql + "and TIPDOC.SIGLA = '" + tiponc + "' ";
            }


            var da = fb.DataReader(sql);


            DataTable dt = new DataTable();

            da.Fill(dt);

            dataGridView1.DataSource = dt;
        }
        public List <formapago> getfacturapago(string tipo, int numero)
        {
            var fp = new formapago();

            FbData db = new FbData();


            var sql = "  SELECT PAGOS.NUMERO, " +
                      " PAGOS.TIPO as tipo, PAGOS.CONCEPTO as concepto, " +
                      " PAGOS.DESCRIPCION,   PAGOS.VLR_PAGO as valor, PAGOS.DIAS, PAGOS.FECHA " +
                      " FROM OE,TIPDOC,PAGOS " +
                      "WHERE OE.TIPO = PAGOS.TIPO AND OE.NUMBER = PAGOS.NUMERO " +
                      "AND (OE.TIPO = TIPDOC.CLASE) " +
                      "AND (TIPDOC.SIGLA = '" + tipo + "') " +
                      " AND (OE.NUMBER = " + numero + ")";


            var da = db.DataReader(sql);

            DataTable dt = new DataTable();

            da.Fill(dt);



            List <formapago> lfp = new List <formapago>();

            foreach (DataRow row in dt.Rows)
            {
                formapago p = new formapago();
                p.concepto = row["concepto"].ToString();
                p.tipo     = row["tipo"].ToString();
                p.valor    = Math.Abs(Convert.ToDecimal(row["valor"].ToString()));
                p.dias     = Convert.ToInt32(row["dias"].ToString());
                p.fecha    = Convert.ToDateTime(row["fecha"].ToString());
                lfp.Add(p);
            }


            return(lfp);
        }
        private void btnEstado_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count > 0)
            {
                var tipo   = dataGridView1.SelectedRows[0].Cells[1].Value.ToString().Trim();
                var numero = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[2].Value);

                Regex reg = new Regex("[*'\",_&#^@]");
                tipo = reg.Replace(tipo, string.Empty);

                FacturaElectronica fe = new FacturaElectronica();

                var data = fe.EstadoDocumento(tipo, numero);

                MessageBox.Show(tipo + "-" + numero.ToString() + "cufe:" + data.cufe);



                LogResult(tipo.ToString(), numero.ToString(), data);

                if (data.codigo == 200 || data.codigo == 201)
                {
                    FbData fb = new FbData();

                    string clase = Getclasefactura(tipo);

                    var sql = "update oe set cufe = '" + data.cufe + "', procesadoDian ='S' where tipo='" + clase.Trim() + "' and number=" + numero.ToString();


                    var rowsaffect = fb.ExecuteNonQuery(sql);
                }

                GetFacturas();
            }
            else
            {
                MessageBox.Show("Seleccione una fila");
            }
        }
        private void btnEmitir_Click(object sender, EventArgs e)
        {
            FbData fb = new FbData();

            string sql   = "";
            string clase = "";

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (Convert.ToBoolean(row.Cells[0].Value) == true)
                {
                    var tipo   = row.Cells[1].Value;
                    var numero = row.Cells[2].Value;


                    #region aplicaredondeoimpuesto

                    clase = Getclasefactura(tipo);

                    if (chkImpuesto.Checked)
                    {
                        sql = "update oedet set vlr_iva = (((price*qtyship)-totaldct) * porc_iva / 100) where tipo = '" + clase + "' and number = " + numero.ToString();

                        fb.ExecuteNonQuery(sql);



                        sql = "update oe set salestax = (select sum(vlr_iva) from oedet where oedet.tipo = oe.tipo and oedet.number = oe.number) " +
                              " where oe.tipo = '" + clase + "' and number = " + numero.ToString();

                        fb.ExecuteNonQuery(sql);

                        sql = "update oe set total = subtotal + salestax - coalesce(disc1,0) - coalesce(disc2,0) - coalesce(disc3,0) " +
                              " where oe.tipo = '" + clase + "' and number = " + numero.ToString();

                        fb.ExecuteNonQuery(sql);
                    }


                    #endregion

                    FacturaElectronica fe = new FacturaElectronica();


                    #region validar datos

                    var f = new FacturaEnc();

                    FbData db = new FbData();

                    var sqlciiu = "select FIRST 1 actividad_eco_enc.cod_internacional " +
                                  " from actividad_eco_enc, actividad_eco_det " +
                                  " where actividad_eco_enc.codact = actividad_eco_det.codact " +
                                  " and actividad_eco_det.principal = 'S' " +
                                  " and actividad_eco_det.id_n = OE.ID_N";


                    sql = "SELECT OE.ID_EMPRESA, " +
                          "OE.ID_SUCURSAL, TIPDOC.SIGLA AS TIPO,OE.NUMBER, OE.FECHA, OE.DUEDATE FECHAVENC, CUST.ID_N, CUST.CV,CUST.COMPANY, CUST.ADDR1 direccion,CUST.PHONE1 telefono1, " +
                          " CIUDADES.CODIGO COD_CIUDAD,SHIPTO.CITY,SHIPTO.COD_DPTO,SHIPTO.DEPARTAMENTO,SHIPTO.EMAIL,OE.OCNUMERO,OE.NROREMISION,OE.COMMENTS, " +
                          " TRIBUTARIA_TIPODOCUMENTO.TDOC CODTIPOIDENTIFICACION,TRIBUTARIA_TIPODOCUMENTO.DESCRIPCION DESCTIPOIDENTIFICACION, " +
                          " TRIBUTARIA_TIPOCONTRIBUYENTE.CODIGO CODTIPOPERSONA,TRIBUTARIA_TIPOCONTRIBUYENTE.DESCRIPCION DESCRIPCIONTIPOPERSONA, " +
                          "(OE.SUBTOTAL - OE.DESTOTAL) VLRBRUTO,OE.SUBTOTAL,OE.SALESTAX IMPUESTO,OE.TOTAL,coalesce(OE.PORCRTFTE,0) PORCRTFTE,coalesce(OE.DISC1,0) retefuente, " +
                          " coalesce(OE.DISC3,0) RETEIVA,coalesce(OE.DISC2,0) RETEICA,OE.DESTOTAL,coalesce((" + sqlciiu + "),'') CODIGOCIIU,OE.DEV_FACTURA CRUCENUMERO, OE.DEV_TIPOFAC CRUCETIPO,OE.CUFE " +
                          " FROM CUST,OE,SHIPTO,TRIBUTARIA,TRIBUTARIA_TIPOCONTRIBUYENTE,TRIBUTARIA_TIPODOCUMENTO,TIPDOC,CIUDADES " +
                          " WHERE((CUST.ID_N = OE.ID_N) " +
                          " AND(CUST.ID_N = SHIPTO.ID_N) " +
                          " AND(OE.ID_N = TRIBUTARIA.ID_N) " +
                          " AND(OE.SHIPTO = SHIPTO.SUCCLIENTE) " +
                          " AND(SHIPTO.CITY = CIUDADES.CIUDAD AND CIUDADES.ID_DEPTO = SHIPTO.COD_DPTO) " +
                          " AND (OE.TIPO = TIPDOC.CLASE) " +
                          " AND(TRIBUTARIA.TDOC = TRIBUTARIA_TIPODOCUMENTO.TDOC) " +
                          " AND(TRIBUTARIA.TIPO_CONTRIBUYENTE = TRIBUTARIA_TIPOCONTRIBUYENTE.CODIGO OR TRIBUTARIA.TIPO_CONTRIBUYENTE = 0 )) " +
                          " AND(((OE.ID_EMPRESA = 1) " +
                          " AND(TIPDOC.SIGLA = '" + tipo + "') " +
                          " AND(OE.NUMBER = " + numero + ")))";


                    var da = db.DataReader(sql);

                    DataTable dt = new DataTable();

                    da.Fill(dt);

                    try
                    {
                        var r = dt.Rows[0];

                        var correoe = r["email"].ToString().Trim();

                        if (correoe == "")
                        {
                            MessageBox.Show("Verificar correo electronico " + numero.ToString());
                            LogText(tipo.ToString(), numero.ToString(), "Verificar correo electronico ");
                        }

                        var tipodoident = r["CODTIPOIDENTIFICACION"].ToString();
                        var ciiu        = r["CODIGOCIIU"].ToString();

                        if (tipodoident == "31" && ciiu == "")
                        {
                            MessageBox.Show("Verificar codigo ciiu tercero con nit " + numero.ToString());
                            LogText(tipo.ToString(), numero.ToString(), "Verificar codigo ciiu tercero con nit ");
                        }
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show("Verificar datos tributarios/direccion de envio " + numero.ToString());
                        LogText(tipo.ToString(), numero.ToString(), "Verificar datos tributarios/direccion de envio ");
                    }

                    #endregion



                    var data = fe.EnviarFactura(tipo.ToString().Trim(), Convert.ToInt32(numero));

                    //MessageBox.Show(tipo + "-" + numero.ToString() + data.mensaje);

                    if (data.codigo == 200 || data.codigo == 201)
                    {
                        //string clase =   Getclasefactura(tipo);

                        sql = "update oe set cufe = '" + data.cufe + "', procesadoDian ='S' where tipo='" + clase + "' and number=" + numero.ToString();

                        fb.ExecuteNonQuery(sql);
                    }

                    LogResult(tipo.ToString(), numero.ToString(), data);
                }
            }



            GetFacturas();
        }
        public List <facturadet> getfacturadet(string tipo, int numero)
        {
            //var fd = new facturadet();

            FbData db = new FbData();


            var sql = " SELECT OEDET.NUMBER, " +
                      " OEDET.TIPO, " +
                      " OEDET.ITEM CODIGOITEM, " +
                      " ITEM.REFFABRICA, " +
                      " ITEM.DESCRIPCION, " +
                      " OEDET.QTYSHIP CANTIDAD, " +
                      " OEDET.PRICE PRECIO, " +
                      " OEDET.PORC_IVA, " +
                      " OEDET.VLR_IVA, " +
                      " coalesce(OEDET.DCTFIJO,0) DCTPORC, " +
                      " coalesce(OEDET.TOTALDCT,0) DESCUENTOVAL, " +
                      " (OEDET.EXTEND) SUBTOTAL, " +
                      " (OEDET.EXTEND + OEDET.VLR_IVA) TOTAL, " +
                      " UNIDAD.EQUIVALENTE AS UNDMEDIDA " +
                      "FROM OE,TIPDOC,OEDET, ITEM, UNIDAD " +
                      "WHERE OE.TIPO = OEDET.TIPO AND OE.NUMBER = OEDET.NUMBER " +
                      "AND(OE.TIPO = TIPDOC.CLASE) " +
                      "AND OEDET.ITEM = ITEM.ITEM " +
                      "AND OEDET.COD_UNIDAD_VENTA = UNIDAD.COD_UNIDAD " +
                      "AND(TIPDOC.SIGLA = '" + tipo + "') " +
                      " AND (OE.NUMBER = " + numero + ")";


            var da = db.DataReader(sql);

            DataTable dt = new DataTable();

            da.Fill(dt);


            List <facturadet> lf = new List <facturadet>();

            foreach (DataRow row in dt.Rows)
            {
                facturadet fe = new facturadet();
                fe.codproducto  = row["codigoitem"].ToString().Trim();
                fe.referencia   = row["reffabrica"].ToString().Trim();
                fe.descprocucto = row["descripcion"].ToString().Trim();
                fe.descalterna  = "";
                fe.cantidad     = Math.Abs(Convert.ToDecimal(row["cantidad"].ToString()));
                fe.precio       = Math.Abs(Convert.ToDecimal(row["precio"].ToString()));
                fe.porcimp      = Convert.ToDecimal(row["porc_iva"].ToString());
                fe.impuesto     = Math.Abs(Convert.ToDecimal(row["vlr_iva"].ToString()));
                fe.unidadmedida = Convert.ToString(row["UNDMEDIDA"].ToString());

                fe.descuentovalor = Math.Abs(Convert.ToDecimal(row["descuentoval"].ToString()));
                fe.subtotal       = Math.Abs(fe.cantidad * fe.precio) - Math.Abs(fe.descuentovalor); //Math.Abs(Convert.ToDecimal(row["subtotal"].ToString()));
                fe.descuentol     = Math.Abs(fe.descuentovalor / (fe.cantidad * fe.precio) * 100);   // Math.Abs(Convert.ToDecimal(row["dctporc"].ToString()));

                fe.total = Math.Abs(Convert.ToDecimal(row["total"].ToString()));

                lf.Add(fe);
            }


            return(lf);
        }
        public FacturaEnc getfacturaenc(string tipo, int numero)
        {
            var f = new FacturaEnc();

            FbData db = new FbData();

            var sqlciiu = "select FIRST 1 actividad_eco_enc.cod_internacional " +
                          " from actividad_eco_enc, actividad_eco_det " +
                          " where actividad_eco_enc.codact = actividad_eco_det.codact " +
                          " and actividad_eco_det.principal = 'S' " +
                          " and actividad_eco_det.id_n = OE.ID_N";


            var sql = "SELECT OE.ID_EMPRESA, " +
                      "OE.ID_SUCURSAL, TIPDOC.SIGLA AS TIPO,OE.NUMBER, OE.FECHA, OE.DUEDATE FECHAVENC, CUST.ID_N, CUST.CV,CUST.COMPANY, SHIPTO.ADDR1 direccion,SHIPTO.PHONE1 telefono1, " +
                      " CIUDADES.CODIGO COD_CIUDAD,SHIPTO.CITY,SHIPTO.COD_DPTO,SHIPTO.DEPARTAMENTO,SHIPTO.EMAIL,OE.OCNUMERO,OE.NROREMISION,OE.COMMENTS, " +
                      " TRIBUTARIA_TIPODOCUMENTO.TDOC CODTIPOIDENTIFICACION,TRIBUTARIA_TIPODOCUMENTO.DESCRIPCION DESCTIPOIDENTIFICACION, " +
                      " TRIBUTARIA_TIPOCONTRIBUYENTE.CODIGO CODTIPOPERSONA,TRIBUTARIA_TIPOCONTRIBUYENTE.DESCRIPCION DESCRIPCIONTIPOPERSONA, " +
                      "(OE.SUBTOTAL - OE.DESTOTAL) VLRBRUTO,OE.SUBTOTAL,OE.SALESTAX IMPUESTO,OE.TOTAL,coalesce(OE.PORCRTFTE,0) PORCRTFTE,coalesce(OE.DISC1,0) retefuente, " +
                      " coalesce(OE.DISC3,0) RETEIVA,coalesce(OE.DISC2,0) RETEICA,OE.DESTOTAL,coalesce((" + sqlciiu + "),'') CODIGOCIIU,OE.DEV_FACTURA CRUCENUMERO, OE.DEV_TIPOFAC CRUCETIPO,OE.CUFE " +
                      "FROM CUST,OE,SHIPTO,TRIBUTARIA,TRIBUTARIA_TIPOCONTRIBUYENTE,TRIBUTARIA_TIPODOCUMENTO,TIPDOC,CIUDADES " +
                      "WHERE((CUST.ID_N = OE.ID_N) " +
                      " AND(CUST.ID_N = SHIPTO.ID_N) " +
                      " AND(OE.ID_N = TRIBUTARIA.ID_N) " +
                      " AND(OE.SHIPTO = SHIPTO.SUCCLIENTE) " +
                      " AND(SHIPTO.CITY = CIUDADES.CIUDAD AND CIUDADES.ID_DEPTO = SHIPTO.COD_DPTO) " +
                      " AND (OE.TIPO = TIPDOC.CLASE) " +
                      " AND(TRIBUTARIA.TDOC = TRIBUTARIA_TIPODOCUMENTO.TDOC) " +
                      " AND(TRIBUTARIA.TIPO_CONTRIBUYENTE = TRIBUTARIA_TIPOCONTRIBUYENTE.CODIGO OR TRIBUTARIA.TIPO_CONTRIBUYENTE = 0 )) " +
                      " AND(((OE.ID_EMPRESA = 1) " +
                      " AND(TIPDOC.SIGLA = '" + tipo + "') " +
                      " AND(OE.NUMBER = " + numero + ")))";


            var da = db.DataReader(sql);

            DataTable dt = new DataTable();

            da.Fill(dt);

            var r = dt.Rows[0];

            var codciudad = r["cod_ciudad"].ToString().Trim();
            var coddepto  = r["cod_dpto"].ToString().Trim();

            codciudad = (Convert.ToInt32(codciudad) + 100000).ToString().Substring(1, 5);
            coddepto  = (Convert.ToInt32(coddepto) + 100).ToString().Substring(1, 2);

            f.numero             = Convert.ToInt32(r["number"].ToString());
            f.tipodoc            = r["tipo"].ToString().Trim();
            f.prefijo            = r["tipo"].ToString().Trim();
            f.fecha              = Convert.ToDateTime(r["fecha"].ToString());
            f.fechavence         = Convert.ToDateTime(r["fechavenc"].ToString());
            f.nit                = r["id_n"].ToString().Trim();
            f.dv                 = r["cv"].ToString().Trim();
            f.company            = r["company"].ToString().Trim();
            f.direccion          = r["direccion"].ToString().Trim();
            f.telefono1          = r["telefono1"].ToString().Trim().Replace(" ", "");
            f.codciudad          = codciudad; //r["cod_ciudad"].ToString().Trim();
            f.ciudad             = r["city"].ToString().Trim();
            f.coddepto           = coddepto;  // r["cod_dpto"].ToString().Trim();
            f.departamento       = r["departamento"].ToString().Trim();
            f.correoe            = r["email"].ToString().Trim();
            f.numordencompra     = r["ocnumero"].ToString().Trim();
            f.numremision        = r["nroremision"].ToString().Trim();
            f.comentario         = r["comments"].ToString().Trim();
            f.tipoIdentificacion = r["CODTIPOIDENTIFICACION"].ToString();
            f.tipoPersona        = r["CODTIPOPERSONA"].ToString();
            f.vlrbruto           = Math.Abs(Convert.ToDecimal(r["vlrbruto"].ToString()));
            f.subtotal           = Math.Abs(Convert.ToDecimal(r["subtotal"].ToString()));
            f.impuesto           = Math.Abs(Convert.ToDecimal(r["impuesto"].ToString()));
            f.total              = Math.Abs(Convert.ToDecimal(r["total"].ToString()));
            f.baseretencion      = Math.Abs(Convert.ToDecimal(r["subtotal"].ToString()));
            f.porcretefuente     = Math.Abs(Convert.ToDecimal(r["PORCRTFTE"].ToString()));
            f.retefuente         = Math.Abs(Convert.ToDecimal(r["retefuente"].ToString()));
            f.porcreteica        = 0; //Convert.ToDecimal(r["dv"].ToString());
            f.reteica            = Math.Abs(Convert.ToDecimal(r["RETEICA"].ToString()));
            f.porcreteiva        = 0; //Convert.ToDecimal(r["dv"].ToString());
            f.reteiva            = Math.Abs(Convert.ToDecimal(r["RETEIVA"].ToString()));
            f.descuentos         = Convert.ToDecimal(r["DESTOTAL"].ToString());
            f.codigociiu         = r["CODIGOCIIU"].ToString();
            f.cufe               = r["cufe"].ToString();
            f.crucenumero        = r["crucenumero"].ToString();
            f.crucetipo          = r["crucetipo"].ToString();


            //List<FacturaEnc> lf = new List<FacturaEnc>();
            //foreach (DataRow row in dt.Rows)
            //{
            //    FacturaEnc fe = new FacturaEnc();
            //    fe.numero = Convert.ToInt32(row["Numero"].ToString());

            //    lf.Add(fe);
            //}


            return(f);
        }