Пример #1
0
        /// <summary>
        /// Handles the Click event of the FinishButton control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        /// <exception cref="Exception">El comprobante \"" + tbUUID.Text + "\" es " + tipoDoc + ", solo se pueden anular facturas.</exception>
        protected void FinishButton_Click(object sender, EventArgs e)
        {
            try
            {
                var          sql     = "";
                decimal      iva16   = 0;
                decimal      propina = 0;
                DbDataReader dr;
                var          sAmbiente          = "1";
                var          conceptos          = new List <object[]>();
                var          txt                = new SpoolMx();
                var          versionXmlOriginal = "";
                var          folioReservacion   = "";
                var          idFactura          = "";
                var          codDoc             = "";
                var          tipoDoc            = "";
                var          motivo             = "";
                if (string.IsNullOrEmpty(tbUUID.Text))
                {
                    sql = @"SELECT TOP 1 numeroAutorizacion FROM Dat_General INNER JOIN Cat_Emisor ON id_Emisor = IDEEMI WHERE serie = @serie AND folio = @folio AND RFCEMI = @RFC";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@serie", tbSerie.Text);
                    _db.AsignarParametroCadena("@folio", tbFolio.Text);
                    _db.AsignarParametroCadena("@RFC", ddlRFC.SelectedItem.Text);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        tbUUID.Text = dr[0].ToString();
                    }
                    _db.Desconectar();
                }
                if (!string.IsNullOrEmpty(tbUUID.Text))
                {
                    sql = @"SELECT TOP 1 idcomprobante FROM Dat_General WHERE numeroAutorizacion = @UUID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@UUID", tbUUID.Text);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        idFactura = dr[0].ToString();
                    }
                    _db.Desconectar();
                }
                else
                {
                    throw new Exception("No existe ningun comprobante con los parametros establecidos");
                }
                sql = "SELECT g.codDoc, cc.descripcion FROM Dat_General g INNER JOIN Cat_Catalogo1_C cc ON cc.codigo = g.codDoc AND cc.tipo = 'Comprobante' WHERE g.idComprobante = @id";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", idFactura);
                dr = _db.EjecutarConsulta();
                if (dr.Read())
                {
                    codDoc  = dr[0].ToString();
                    tipoDoc = dr[1].ToString();
                }
                _db.Desconectar();
                if (!codDoc.Equals("01"))
                {
                    throw new Exception("El comprobante \"" + tbUUID.Text + "\" es " + tipoDoc + ", solo se pueden anular facturas.");
                }
                sql = @"SELECT TOP 1
                            g.referencia,
                            p.formapago, p.condicionesDePago, g.subTotal, g.totalDescuento, g.motivoDescuento, g.tipoCambio, g.moneda, g.total, 'egreso' as tipoDoc, g.metodoPago, g.lugarExpedicion, p.numCtaPago, g.numeroAutorizacion, g.serie, g.fecha, g.total, g.codDoc, e.NOMEMI, e.RFCEMI, e.curp as curpE, e.telefono as telE, e.email as mailE, e.EmpresaTipo as etipoE, e.regimenFiscal as regimenE, e.obligadoContabilidad as contE, e.dirMatriz AS calleE, e.noExterior as extE, e.noInterior as intE, e.colonia as colE, e.localidad as locE, e.referencia as refE, e.municipio as munE, e.estado as edoE, e.pais as paisE, e.codigoPostal as cpE, d.dirEstablecimientos as calleExp, d.noExterior as extExp, d.noInterior as intExp, d.colonia as colExp, d.localidad as locExp, d.referencia as refExp, d.municipio as munExp, d.estado as esoExp, d.pais as paisExp, d.codigoPostal as cpExp, r.NOMREC, r.RFCREC, r.curp as curpR, r.telefono as telR, r.email as mailR, r.telefono2 as tel2R, r.denominacionSocial as denR, r.obligadoContabilidad as contR, r.domicilio as calleR, r.noExterior as extR, r.noInterior as intR, r.colonia as colR, r.localidad as locR, r.referencia as refR, r.municipio as munR, r.estado as edoR, r.pais as paisR, r.codigoPostal as cpR, IVA12 as iva16, g.propina, g.ambiente, g.cargoxservicio as otrosCargos, g.importeAPagar as totalAPagar, g.observaciones, he.tipo AS tipoHE, g.folioReservacion, he.noHabitacion, he.fechaLlegada, he.fechaSalida, he.huesped,he.tipohabitacion, g.estab as claveSucursal, g.noTicket, g.usoCfdi, r.numRegIdTrib, g.version, g.folio
                        FROM
                            Dat_General g INNER JOIN
                            Cat_Emisor e ON g.id_Emisor = e.IDEEMI INNER JOIN
                            Dat_DOMEMIEXP d ON g.id_EmisorExp = d.IDEDOMEMIEXP INNER JOIN
                            Cat_Receptor r ON g.id_Receptor = r.IDEREC INNER JOIN
                            Dat_Pagos p ON g.idComprobante = p.id_Comprobante LEFT OUTER JOIN
                            Dat_HabitacionEvento he ON he.id_Comprobante = g.idComprobante
                        WHERE g.idComprobante = @ID";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@ID", idFactura);
                dr = _db.EjecutarConsulta();
                if (dr.Read())
                {
                    var formaPago = Session["CfdiVersion"].ToString().Equals("3.3") ? "PUE" : dr["formapago"].ToString();
                    versionXmlOriginal = dr["version"].ToString();
                    folioReservacion   = dr["folioReservacion"].ToString();
                    motivo             = "ESTA NOTA DE CREDITO AFECTA A LA FACTURA " + dr["serie"].ToString() + dr["folio"] + ". " + tbMotivo.Text;
                    if (string.IsNullOrEmpty(folioReservacion))
                    {
                        folioReservacion = dr["noTicket"].ToString();
                    }
                    var moneda     = dr["moneda"].ToString();
                    var tipoCambio = dr["tipoCambio"].ToString();
                    if (string.IsNullOrEmpty(moneda))
                    {
                        moneda = "MXN";
                    }
                    txt.SetComprobanteCfdi(ddlSerie.SelectedItem.Text, "", Localization.Now.ToString("s"), formaPago, dr["condicionesDePago"].ToString(), dr["subTotal"].ToString(), dr["totalDescuento"].ToString(), dr["motivoDescuento"].ToString(), tipoCambio, moneda, dr["total"].ToString(), dr["tipoDoc"].ToString(), dr["metodoPago"].ToString(), dr["lugarExpedicion"].ToString(), dr["numCtaPago"].ToString(), dr["numeroAutorizacion"].ToString() + ":01", dr["serie"].ToString(), Localization.Parse(dr["fecha"].ToString()).ToString("s"), dr["total"].ToString(), dr["codDoc"].ToString(), motivo, dr["otrosCargos"].ToString(), dr["totalAPagar"].ToString(), dr["observaciones"].ToString());
                    txt.SetEmisorCfdi(dr["NOMEMI"].ToString(), dr["RFCEMI"].ToString(), dr["curpE"].ToString(), dr["telE"].ToString(), dr["mailE"].ToString(), dr["etipoE"].ToString(), dr["regimenE"].ToString(), dr["contE"].ToString());
                    txt.SetEmisorDomCfdi(dr["calleE"].ToString(), dr["extE"].ToString(), dr["intE"].ToString(), dr["colE"].ToString(), dr["locE"].ToString(), dr["refE"].ToString(), dr["munE"].ToString(), dr["edoE"].ToString(), dr["paisE"].ToString(), dr["cpE"].ToString());
                    txt.SetEmisorExpCfdi(dr["calleExp"].ToString(), dr["extExp"].ToString(), dr["intExp"].ToString(), dr["colExp"].ToString(), dr["locExp"].ToString(), dr["refExp"].ToString(), dr["munExp"].ToString(), dr["esoExp"].ToString(), dr["paisExp"].ToString(), dr["cpExp"].ToString(), dr["claveSucursal"].ToString());
                    var UsoCfdi = ""; //dr["usoCfdi"].ToString();
                    if (string.IsNullOrEmpty(UsoCfdi))
                    {
                        UsoCfdi = ddlUsoCFDI.SelectedValue.ToString();
                    }                                                                                    // UsoCfdi = "P01";
                    txt.SetReceptorCfdi(dr["NOMREC"].ToString(), dr["RFCREC"].ToString(), dr["curpR"].ToString(), dr["telR"].ToString(), dr["mailR"].ToString(), dr["tel2R"].ToString(), dr["denR"].ToString(), dr["contR"].ToString(), dr["numRegIdTrib"].ToString(), UsoCfdi);
                    txt.SetReceptorDomCfdi(dr["calleR"].ToString(), dr["extR"].ToString(), dr["intR"].ToString(), dr["colR"].ToString(), dr["locR"].ToString(), dr["refR"].ToString(), dr["munR"].ToString(), dr["edoR"].ToString(), dr["paisR"].ToString(), dr["cpR"].ToString());
                    decimal.TryParse(CerosNull(dr["iva16"].ToString()), out iva16);
                    decimal.TryParse(CerosNull(dr["propina"].ToString()), out propina);
                    sAmbiente = dr["ambiente"].ToString();
                    if (!(dr["tipoHE"] is DBNull) && dr["tipoHE"] != null && !string.IsNullOrEmpty(dr["tipoHE"].ToString()))
                    {
                        switch (dr["tipoHE"].ToString())
                        {
                        case "1":
                            txt.SetInfoAdicionalHabitacionCfdi(dr["huesped"].ToString(), folioReservacion, dr["noHabitacion"].ToString(), dr["fechaLlegada"].ToString(), dr["fechaSalida"].ToString(), dr["referencia"].ToString(), dr["tipohabitacion"].ToString(), dr["propina"].ToString());
                            break;

                        case "2":
                            txt.SetInfoAdicionalEventoCfdi(dr["huesped"].ToString(), folioReservacion, dr["fechaLlegada"].ToString(), dr["propina"].ToString());
                            break;

                        default:
                            break;
                        }
                    }
                    else if (!string.IsNullOrEmpty(folioReservacion))
                    {
                        txt.SetInfoAdicionalRestauranteCfdi(CerosNull(propina.ToString()), folioReservacion);
                    }
                }
                _db.Desconectar();
                sql = @"SELECT
                             ISNULL(SUM(it.valor), 0.00) as impTras, ISNULL(SUM(ir.valorRetenido), 0.00) as impRets
                        FROM
                            Dat_General g LEFT OUTER JOIN
                            Dat_TotalConImpuestos it ON it.id_Comprobante = g.idComprobante LEFT OUTER JOIN
                            Dat_ImpuestosRetenciones ir ON ir.numDocSustento = g.idComprobante
                        WHERE
                            g.idComprobante = @ID";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@ID", idFactura);
                dr = _db.EjecutarConsulta();
                if (dr.Read())
                {
                    txt.SetCantidadImpuestosCfdi(dr["impRets"].ToString(), dr["impTras"].ToString(), CerosNull(iva16.ToString()));
                }
                _db.Desconectar();
                sql = @"SELECT
                            ir.tipo as impuesto, ir.valorRetenido as importe, ir.tipoFactor
                        FROM
                            Dat_ImpuestosRetenciones ir INNER JOIN
                            Dat_General g on ir.numDocSustento = g.idComprobante
                        WHERE
                            g.idComprobante = @ID";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@ID", idFactura);
                dr = _db.EjecutarConsulta();
                while (dr.Read())
                {
                    txt.AgregaImpuestoRetencionCfdi(dr["impuesto"].ToString(), dr["importe"].ToString(), dr["tipoFactor"].ToString());
                }
                _db.Desconectar();
                sql = @"SELECT
                            CASE
                                it.codigo
                                WHEN '1' THEN 'IVA'
                                WHEN '2' THEN 'IEPS'
                            END AS impuesto, it.tarifa as tasa, it.valor as importe, it.tipoFactor
                        FROM
                            Dat_TotalConImpuestos it INNER JOIN
                            Dat_General g on it.id_Comprobante = g.idComprobante
                        WHERE
                            g.idComprobante = @ID";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@ID", idFactura);
                dr = _db.EjecutarConsulta();
                while (dr.Read())
                {
                    txt.AgregaImpuestoTrasladoCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString(), dr["tipoFactor"].ToString());
                }
                _db.Desconectar();
                #region Conceptos
                if (Session["CfdiVersion"].ToString().Equals("3.3") && versionXmlOriginal.Equals("3.3"))
                {
                    sql = "SELECT p.dirdocs, a.XMLARC FROM Dat_General g INNER JOIN Dat_Archivos a ON g.idComprobante = a.IDEFAC, Par_ParametrosSistema p WHERE g.idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        var rutaXml = dr["dirdocs"].ToString().Replace("docus", "") + @"\" + dr["XMLARC"].ToString();
                        var fileXml = new FileInfo(rutaXml);
                        if (fileXml.Exists)
                        {
                            var xDoc = new XmlDocument();
                            xDoc.Load(fileXml.FullName);
                            var nodosConceptos = xDoc.GetElementsByTagName("cfdi:Concepto").Cast <XmlNode>().ToList();
                            for (int i = 0; i < nodosConceptos.Count; i++)
                            {
                                var concepto             = nodosConceptos[i];
                                var cantidad             = "";
                                var unidad               = "";
                                var numeroIdentificacion = "";
                                var descripcion          = "";
                                var valorUnitario        = "";
                                var importe              = "";
                                var descuento            = "";
                                var claveProdServ        = "";
                                var claveUnidad          = "";
                                try { cantidad = concepto.Attributes["Cantidad"].Value; } catch (Exception ex) { }
                                try { unidad = concepto.Attributes["Unidad"].Value; } catch (Exception ex) { }
                                try { numeroIdentificacion = concepto.Attributes["NoIdentificacion"].Value; } catch (Exception ex) { }
                                try { descripcion = concepto.Attributes["Descripcion"].Value; } catch (Exception ex) { }
                                try { valorUnitario = concepto.Attributes["ValorUnitario"].Value; } catch (Exception ex) { }
                                try { importe = concepto.Attributes["Importe"].Value; } catch (Exception ex) { }
                                try { descuento = concepto.Attributes["Descuento"].Value; } catch (Exception ex) { }
                                //try { claveProdServ = concepto.Attributes["ClaveProdServ"].Value; } catch (Exception ex) { }
                                //try { claveUnidad = concepto.Attributes["ClaveUnidad"].Value; } catch (Exception ex) { }
                                claveProdServ = "84111506";
                                claveUnidad   = "ACT";
                                txt.AgregaConceptoCfdi(cantidad, unidad, numeroIdentificacion, descripcion, valorUnitario, importe, descuento, claveProdServ, claveUnidad, i.ToString());
                                if (concepto.HasChildNodes)
                                {
                                    var nsmgr = new XmlNamespaceManager(xDoc.NameTable);
                                    nsmgr.AddNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");
                                    var trasladosConcepto   = concepto.SelectNodes("cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado", nsmgr).Cast <XmlNode>().ToList();
                                    var retencionesConcepto = concepto.SelectNodes("cfdi:Impuestos/cfdi:Retenciones/cfdi:Retencion", nsmgr).Cast <XmlNode>().ToList();
                                    if (trasladosConcepto != null && trasladosConcepto.Count > 0)
                                    {
                                        foreach (var impuesto in trasladosConcepto)
                                        {
                                            var baseC       = "";
                                            var impuestoC   = "";
                                            var tipoFactorC = "";
                                            var tasaOCuotaC = "";
                                            var importeC    = "";
                                            try { baseC = impuesto.Attributes["Base"].Value; } catch (Exception ex) { }
                                            try { impuestoC = impuesto.Attributes["Impuesto"].Value; } catch (Exception ex) { }
                                            try { tipoFactorC = impuesto.Attributes["TipoFactor"].Value; } catch (Exception ex) { }
                                            try { tasaOCuotaC = impuesto.Attributes["TasaOCuota"].Value; } catch (Exception ex) { }
                                            try { importeC = impuesto.Attributes["Importe"].Value; } catch (Exception ex) { }
                                            txt.AgregaConceptoImpuestoCfdi(false, baseC, impuestoC, tipoFactorC, tasaOCuotaC, importeC, i.ToString());
                                        }
                                    }
                                    if (retencionesConcepto != null && retencionesConcepto.Count > 0)
                                    {
                                        foreach (var impuesto in retencionesConcepto)
                                        {
                                            var baseC       = "";
                                            var impuestoC   = "";
                                            var tipoFactorC = "";
                                            var tasaOCuotaC = "";
                                            var importeC    = "";
                                            try { baseC = impuesto.Attributes["Base"].Value; } catch (Exception ex) { }
                                            try { impuestoC = impuesto.Attributes["Impuesto"].Value; } catch (Exception ex) { }
                                            try { tipoFactorC = impuesto.Attributes["TipoFactor"].Value; } catch (Exception ex) { }
                                            try { tasaOCuotaC = impuesto.Attributes["TasaOCuota"].Value; } catch (Exception ex) { }
                                            try { importeC = impuesto.Attributes["Importe"].Value; } catch (Exception ex) { }
                                            txt.AgregaConceptoImpuestoCfdi(true, baseC, impuestoC, tipoFactorC, tasaOCuotaC, importeC, i.ToString());
                                        }
                                    }
                                }
                            }
                        }
                    }
                    _db.Desconectar();
                }
                else if (Session["CfdiVersion"].ToString().Equals("3.3") && versionXmlOriginal.Equals("3.2"))
                {
                    var importeConcepto   = "";
                    var descuentoConcepto = "";
                    var baseImpuesto      = "";
                    sql = "SELECT SUM(precioTotalSinImpuestos) AS importe, SUM(descuento) AS descuento FROM Dat_Detalles INNER JOIN Dat_General on id_Comprobante = idComprobante WHERE idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        importeConcepto   = ControlUtilities.CerosNull(dr["importe"].ToString());
                        descuentoConcepto = ControlUtilities.CerosNull(dr["descuento"].ToString());
                        baseImpuesto      = (decimal.Parse(importeConcepto) - decimal.Parse(descuentoConcepto)).ToString();
                    }
                    _db.Desconectar();
                    txt.AgregaConceptoCfdi("1", "Actividad", "", motivo, importeConcepto, importeConcepto, descuentoConcepto, "84111506", "ACT", "1");
                    sql = @"SELECT
                            ir.tipo as impuesto, ir.valorRetenido as importe, ir.tipoFactor
                        FROM
                            Dat_ImpuestosRetenciones ir INNER JOIN
                            Dat_General g on ir.numDocSustento = g.idComprobante
                        WHERE
                            g.idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaConceptoImpuestoCfdi(true, baseImpuesto, dr["impuesto"].ToString(), dr["tipoFactor"].ToString(), "", dr["importe"].ToString(), "1");
                    }
                    _db.Desconectar();
                    sql = @"SELECT
                            CASE
                                it.codigo
                                WHEN '1' THEN 'IVA'
                                WHEN '2' THEN 'IEPS'
                            END AS impuesto, it.tarifa as tasa, it.valor as importe, it.tipoFactor
                        FROM
                            Dat_TotalConImpuestos it INNER JOIN
                            Dat_General g on it.id_Comprobante = g.idComprobante
                        WHERE
                            g.idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaConceptoImpuestoCfdi(false, baseImpuesto, dr["impuesto"].ToString(), dr["tipoFactor"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString(), "1");
                    }
                    _db.Desconectar();
                }
                else
                {
                    sql = "SELECT idDetalles, codigoPrincipal AS noId, descripcion, precioUnitario AS valorUnitario, cantidad, precioTotalSinImpuestos AS importe, unidad, ctaPredial, claveProdServ, claveUnidad, descuento FROM Dat_Detalles INNER JOIN Dat_General on id_Comprobante = idComprobante WHERE idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        var sqlResults = new object[dr.FieldCount];
                        dr.GetValues(sqlResults);
                        conceptos.Add(sqlResults);
                    }
                    _db.Desconectar();
                    foreach (var concepto in conceptos)
                    {
                        txt.AgregaConceptoCfdi(concepto[4].ToString(), concepto[6].ToString(), concepto[1].ToString(), concepto[2].ToString(), concepto[3].ToString(), concepto[5].ToString(), concepto[10].ToString(), concepto[8].ToString(), concepto[9].ToString());
                        if (!string.IsNullOrEmpty(concepto[7].ToString()))
                        {
                            txt.SetPredialConceptoCfdi(concepto[7].ToString());
                        }
                        sql = "SELECT idDetallesAduana, numero, fecha, aduana FROM Dat_DetallesAduana WHERE id_Detalles = @idDet";
                        _db.Conectar();
                        _db.CrearComando(sql);
                        _db.AsignarParametroCadena("@idDet", concepto[0].ToString());
                        dr = _db.EjecutarConsulta();
                        while (dr.Read())
                        {
                            txt.AgregaAduaneraConceptoCfdi(dr["numero"].ToString(), dr["fecha"].ToString(), dr["aduana"].ToString());
                        }
                        _db.Desconectar();
                        var partes = new List <object[]>();
                        sql = "SELECT idDetallesParte, cantidad, unidad, noIdentificacion, descripcion, valorUnitario, importe FROM Dat_DetallesParte WHERE id_Detalles = @idDet";
                        _db.Conectar();
                        _db.CrearComando(sql);
                        _db.AsignarParametroCadena("@idDet", concepto[0].ToString());
                        dr = _db.EjecutarConsulta();
                        while (dr.Read())
                        {
                            var sqlResults = new object[dr.FieldCount];
                            dr.GetValues(sqlResults);
                            partes.Add(sqlResults);
                        }
                        _db.Desconectar();
                        foreach (var parte in partes)
                        {
                            txt.AgregaParteConceptoCfdi(parte[1].ToString(), parte[2].ToString(), parte[3].ToString(), parte[4].ToString(), parte[5].ToString(), parte[6].ToString());
                            sql = "SELECT idDetallesAduana, numero, fecha, aduana FROM Dat_DetallesAduana WHERE id_DetallesParte = @idDet";
                            _db.Conectar();
                            _db.CrearComando(sql);
                            _db.AsignarParametroCadena("@idPart", parte[0].ToString());
                            dr = _db.EjecutarConsulta();
                            while (dr.Read())
                            {
                                txt.AgregaParteAduaneraConceptoCfdi(dr["numero"].ToString(), dr["fecha"].ToString(), dr["aduana"].ToString());
                            }
                            _db.Desconectar();
                        }
                    }
                }
                #endregion
                sql = "SELECT idImpLocal FROM Dat_MX_ImpLocales INNER JOIN Dat_General on id_Comprobante = idComprobante WHERE idComprobante = @ID";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@ID", idFactura);
                dr = _db.EjecutarConsulta();
                var tieneLocales = dr.HasRows;
                _db.Desconectar();
                if (tieneLocales)
                {
                    sql = @"SELECT totalRetImpLocales, totalTraImpLocales FROM Dat_General WHERE idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        txt.SetImpuestosLocalesCfdi(dr["totalRetImpLocales"].ToString(), dr["totalTraImpLocales"].ToString());
                    }
                    _db.Desconectar();
                    sql = "SELECT nombre as impuesto, tasadeRetencion as tasa, importe FROM Dat_MX_ImpLocales INNER JOIN Dat_General ON id_Comprobante = idComprobante WHERE tasadeRetencion IS NOT NULL AND tasadeTraslado IS NULL AND idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaRetencionLocalCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString());
                    }
                    _db.Desconectar();
                    sql = "SELECT nombre as impuesto, tasadeTraslado as tasa, importe FROM Dat_MX_ImpLocales INNER JOIN Dat_General ON id_Comprobante = idComprobante WHERE tasadeTraslado IS NOT NULL AND tasadeRetencion IS NULL AND idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaTrasladoLocalCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString());
                    }
                    _db.Desconectar();
                }
                var ambiente = false;
                switch (sAmbiente)
                {
                case "1":
                    ambiente = false;
                    break;

                case "2":
                    ambiente = true;
                    break;

                default:
                    break;
                }
                var txtInvoice = txt.ConstruyeTxtCfdi();
                var randomMs   = new Random().Next(1000, 5000);
                System.Threading.Thread.Sleep(randomMs);
                var coreMx = new wsEmision.WsEmision {
                    Timeout = (1800 * 5000)
                };
                var result = coreMx.RecibeInfoTxt(txtInvoice, _idUser, Session["IDENTEMI"].ToString(), ambiente, "04", false, true, "", "");
                if (result != null)
                {
                    //sql = @"UPDATE Dat_General SET estado = 4, saldo = total, pagoAplicado = total, saldoPendiente = 0.00, estadoPago = 1, id_Empleado_Canc = @idCanc WHERE idComprobante = @ID";
                    //_db.Conectar();
                    //_db.CrearComando(sql);
                    //_db.AsignarParametroCadena("@ID", idComprobanteOriginal);
                    //_db.AsignarParametroCadena("@idCanc", _idUser);
                    //_db.EjecutarConsulta1();
                    //_db.Desconectar();
                    sql = @"UPDATE Dat_General SET estado = 4, id_Empleado_Canc = @idCanc WHERE idComprobante = @ID";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@ID", idFactura);
                    _db.AsignarParametroCadena("@idCanc", _idUser);
                    _db.EjecutarConsulta1();
                    _db.Desconectar();
                    try
                    {
                        var idTramas = new List <string>();
                        _db.Conectar();
                        _db.CrearComando("select idTrama from log_trama where tipo = 4 and (noReserva = @folioReservacion or noTicket = @folioReservacion)");
                        _db.AsignarParametroCadena("@folioReservacion", folioReservacion);
                        _db.AsignarParametroCadena("@folioReservacion", folioReservacion);
                        dr = _db.EjecutarConsulta();
                        while (dr.Read())
                        {
                            idTramas.Add(dr["idTrama"].ToString());
                        }
                        _db.Desconectar();
                        if (idTramas.Count > 1)
                        {
                            var idOriginal = idTramas.OrderBy(t => t).First();
                            if (!string.IsNullOrEmpty(idOriginal))
                            {
                                idTramas.Remove(idOriginal);
                                var tramasBorrar = string.Join(",", idTramas);
                                _db.Conectar();
                                _db.CrearComando("DELETE FROM Log_Trama WHERE idTrama IN (" + tramasBorrar + ")");
                                _db.EjecutarConsulta1();
                                _db.Desconectar();
                                _db.Conectar();
                                _db.CrearComando("UPDATE Log_Trama SET observaciones = 'ExtranetOk', folio = 0 WHERE idTrama = @idTrama");
                                _db.AsignarParametroCadena("@idTrama", idOriginal);
                                _db.EjecutarConsulta1();
                                _db.Desconectar();
                            }
                        }
                    }
                    catch { }
                    var xDoc = new XmlDocument();
                    xDoc.LoadXml(result.OuterXml);
                    Session["uuidCreado"] = GetAtributte(xDoc, "UUID", "tfd:TimbreFiscalDigital");
                    (Master as SiteMaster).MostrarAlerta(this, "El comprobante se ha generado satisfactoriamente", 2, null);
                    Response.Redirect("~/Documentos.aspx", false);
                }
                else
                {
                    (Master as SiteMaster).MostrarAlerta(this, "El comprobante no se creó correctamente<br/>" + coreMx.ObtenerMensaje(), 4, null);
                }
            }
            catch (Exception ex)
            {
                (Master as SiteMaster).MostrarAlerta(this, "El comprobante no se creó correctamente<br/>" + ex.Message, 4, null);
                if (ddlBusq.SelectedValue.Equals("1"))
                {
                }
                else if (ddlBusq.SelectedValue.Equals("2"))
                {
                    ddlBusq.SelectedValue = "1";
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Handles the Click event of the FinishButton control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void FinishButton_Click(object sender, EventArgs e)
        {
            try
            {
                var          sql     = "";
                decimal      iva16   = 0;
                decimal      propina = 0;
                DbDataReader dr;
                var          sAmbiente = "1";
                var          conceptos = new List <object[]>();
                var          txt       = new SpoolMx();
                var          codDoc    = "";
                var          manual    = true;
                sql = @"SELECT
                            p.formapago, p.condicionesDePago, g.subTotal, g.totalDescuento, g.motivoDescuento, g.tipoCambio, g.moneda, g.total, g.tipoDeComprobante as tipoDoc, g.metodoPago, g.lugarExpedicion, p.numCtaPago, g.numeroAutorizacion, g.serie, g.fecha, g.total, g.codDoc, e.NOMEMI, e.RFCEMI, e.curp as curpE, e.telefono as telE, e.email as mailE, e.EmpresaTipo as etipoE, e.regimenFiscal as regimenE, e.obligadoContabilidad as contE, e.dirMatriz AS calleE, e.noExterior as extE, e.noInterior as intE, e.colonia as colE, e.localidad as locE, e.referencia as refE, e.municipio as munE, e.estado as edoE, e.pais as paisE, e.codigoPostal as cpE, d.dirEstablecimientos as calleExp, d.noExterior as extExp, d.noInterior as intExp, d.colonia as colExp, d.localidad as locExp, d.referencia as refExp, d.municipio as munExp, d.estado as esoExp, d.pais as paisExp, d.codigoPostal as cpExp, r.NOMREC, r.RFCREC, r.curp as curpR, r.telefono as telR, r.email as mailR, r.telefono2 as tel2R, r.denominacionSocial as denR, r.obligadoContabilidad as contR, r.domicilio as calleR, r.noExterior as extR, r.noInterior as intR, r.colonia as colR, r.localidad as locR, r.referencia as refR, r.municipio as munR, r.estado as edoR, r.pais as paisR, r.codigoPostal as cpR, IVA12 as iva16, g.propina, g.ambiente, g.idComprobante, g.importeAPagar, g.cargoxservicio as otrosCargos, g.observaciones, he.tipo AS tipoHE, g.folioReservacion, he.noHabitacion, he.fechaLlegada, he.fechaSalida, he.huesped, g.folio, t.tipo AS tipoEmision, g.estab AS claveSucursal
                        FROM
                            Dat_General g INNER JOIN
                            Cat_Emisor e ON g.id_Emisor = e.IDEEMI INNER JOIN
                            Dat_DOMEMIEXP d ON g.id_EmisorExp = d.IDEDOMEMIEXP INNER JOIN
                            Cat_Receptor r ON g.id_Receptor = r.IDEREC INNER JOIN
							Log_Trama t ON g.idTrama = t.idTrama INNER JOIN
                            Dat_Pagos p ON g.idComprobante = p.id_Comprobante LEFT OUTER JOIN
							Dat_HabitacionEvento he ON he.id_Comprobante = g.idComprobante
                        WHERE g.idComprobante = @id";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                if (dr.Read())
                {
                    codDoc = dr["codDoc"].ToString();
                    manual = dr["tipoEmision"].ToString().Equals("2");
                    txt.SetComprobanteCfdi(dr["serie"].ToString(), dr["folio"].ToString(), Localization.Now.ToString("s"), dr["formapago"].ToString(), dr["condicionesDePago"].ToString(), dr["subTotal"].ToString(), dr["totalDescuento"].ToString(), dr["motivoDescuento"].ToString(), dr["tipoCambio"].ToString(), dr["moneda"].ToString(), dr["total"].ToString(), dr["tipoDoc"].ToString(), dr["metodoPago"].ToString(), dr["lugarExpedicion"].ToString(), dr["numCtaPago"].ToString(), dr["numeroAutorizacion"].ToString(), dr["serie"].ToString(), Localization.Parse(dr["fecha"].ToString()).ToString("s"), dr["total"].ToString(), dr["codDoc"].ToString(), "", dr["otrosCargos"].ToString(), dr["importeAPagar"].ToString(), dr["observaciones"].ToString());
                    txt.SetEmisorCfdi(dr["NOMEMI"].ToString(), dr["RFCEMI"].ToString(), dr["curpE"].ToString(), dr["telE"].ToString(), dr["mailE"].ToString(), dr["etipoE"].ToString(), dr["regimenE"].ToString(), dr["contE"].ToString());
                    txt.SetEmisorDomCfdi(dr["calleE"].ToString(), dr["extE"].ToString(), dr["intE"].ToString(), dr["colE"].ToString(), dr["locE"].ToString(), dr["refE"].ToString(), dr["munE"].ToString(), dr["edoE"].ToString(), dr["paisE"].ToString(), dr["cpE"].ToString());
                    txt.SetEmisorExpCfdi(dr["calleExp"].ToString(), dr["extExp"].ToString(), dr["intExp"].ToString(), dr["colExp"].ToString(), dr["locExp"].ToString(), dr["refExp"].ToString(), dr["munExp"].ToString(), dr["esoExp"].ToString(), dr["paisExp"].ToString(), dr["cpExp"].ToString(), dr["claveSucursal"].ToString());
                    txt.SetReceptorCfdi(tbRazonSocialRec.Text, tbRfcRec.Text, dr["curpR"].ToString(), dr["telR"].ToString(), dr["mailR"].ToString(), dr["tel2R"].ToString(), tbDenomSocialRec.Text, dr["contR"].ToString());
                    if (cbDomRec.Checked)
                    {
                        var isSucursal = !ddlSucRec.SelectedValue.Equals("0");
                        txt.SetReceptorDomCfdi(tbCalleRec.Text, tbNoExtRec.Text, tbNoIntRec.Text, tbColoniaRec.Text, dr["locR"].ToString(), dr["refR"].ToString(), tbMunicipioRec.Text, tbEstadoRec.Text, tbPaisRec.Text, tbCpRec.Text, isSucursal);
                    }
                    decimal.TryParse(CerosNull(dr["iva16"].ToString()), out iva16);
                    decimal.TryParse(CerosNull(dr["propina"].ToString()), out propina);
                    sAmbiente = dr["ambiente"].ToString();
                    if (!(dr["tipoHE"] is DBNull) && dr["tipoHE"] != null && !string.IsNullOrEmpty(dr["tipoHE"].ToString()))
                    {
                        switch (dr["tipoHE"].ToString())
                        {
                        case "1":
                            txt.SetInfoAdicionalHabitacionCfdi(dr["huesped"].ToString(), dr["folioReservacion"].ToString(), dr["noHabitacion"].ToString(), dr["fechaLlegada"].ToString(), dr["fechaSalida"].ToString());
                            break;

                        case "2":
                            txt.SetInfoAdicionalEventoCfdi(dr["huesped"].ToString(), dr["folioReservacion"].ToString(), dr["fechaLlegada"].ToString());
                            break;

                        default:
                            break;
                        }
                    }
                }
                _db.Desconectar();
                sql = @"SELECT
	                         ISNULL(SUM(it.valor), 0.00) as impTras, ISNULL(SUM(ir.valorRetenido), 0.00) as impRets
                        FROM
	                        Dat_General g INNER JOIN
							Dat_TotalConImpuestos it ON it.id_Comprobante = g.idComprobante INNER JOIN
							Dat_ImpuestosRetenciones ir ON ir.numDocSustento = g.idComprobante
						WHERE
							g.idComprobante = @id"                            ;
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                if (dr.Read())
                {
                    txt.SetCantidadImpuestosCfdi(dr["impRets"].ToString(), dr["impTras"].ToString(), CerosNull(iva16.ToString()));
                }
                _db.Desconectar();
                sql = @"SELECT
	                        ir.tipo as impuesto, ir.valorRetenido as importe
                        FROM
	                        Dat_ImpuestosRetenciones ir INNER JOIN
	                        Dat_General g on ir.numDocSustento = g.idComprobante
						WHERE
							g.idComprobante = @id"                            ;
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                while (dr.Read())
                {
                    txt.AgregaImpuestoRetencionCfdi(dr["impuesto"].ToString(), dr["importe"].ToString());
                }
                _db.Desconectar();
                sql = @"SELECT
	                        CASE
		                        it.codigo
		                        WHEN '1' THEN 'IVA'
		                        WHEN '2' THEN 'IEPS'
	                        END AS impuesto, it.tarifa as tasa, it.valor as importe
                        FROM
	                        Dat_TotalConImpuestos it INNER JOIN
	                        Dat_General g on it.id_Comprobante = g.idComprobante
						WHERE
							g.idComprobante = @id"                            ;
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                while (dr.Read())
                {
                    txt.AgregaImpuestoTrasladoCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString());
                }
                _db.Desconectar();
                sql = "SELECT idDetalles, codigoPrincipal AS noId, descripcion, precioUnitario AS valorUnitario, cantidad, precioTotalSinImpuestos AS importe, unidad, ctaPredial FROM Dat_Detalles INNER JOIN Dat_General on id_Comprobante = idComprobante WHERE idComprobante = @id";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                while (dr.Read())
                {
                    var sqlResults = new object[dr.FieldCount];
                    dr.GetValues(sqlResults);
                    conceptos.Add(sqlResults);
                }
                _db.Desconectar();
                foreach (var concepto in conceptos)
                {
                    txt.AgregaConceptoCfdi(concepto[4].ToString(), concepto[6].ToString(), concepto[1].ToString(), concepto[2].ToString(), concepto[3].ToString(), concepto[5].ToString());
                    if (!string.IsNullOrEmpty(concepto[7].ToString()))
                    {
                        txt.SetPredialConceptoCfdi(concepto[7].ToString());
                    }
                    sql = "SELECT idDetallesAduana, numero, fecha, aduana FROM Dat_DetallesAduana WHERE id_Detalles = @idDet";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@idDet", concepto[0].ToString());
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaAduaneraConceptoCfdi(dr["numero"].ToString(), dr["fecha"].ToString(), dr["aduana"].ToString());
                    }
                    _db.Desconectar();
                    var partes = new List <object[]>();
                    sql = "SELECT idDetallesParte, cantidad, unidad, noIdentificacion, descripcion, valorUnitario, importe FROM Dat_DetallesParte WHERE id_Detalles = @idDet";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@idDet", concepto[0].ToString());
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        var sqlResults = new object[dr.FieldCount];
                        dr.GetValues(sqlResults);
                        partes.Add(sqlResults);
                    }
                    _db.Desconectar();
                    foreach (var parte in partes)
                    {
                        txt.AgregaParteConceptoCfdi(parte[1].ToString(), parte[2].ToString(), parte[3].ToString(), parte[4].ToString(), parte[5].ToString(), parte[6].ToString());
                        sql = "SELECT idDetallesAduana, numero, fecha, aduana FROM Dat_DetallesAduana WHERE id_DetallesParte = @idDet";
                        _db.Conectar();
                        _db.CrearComando(sql);
                        _db.AsignarParametroCadena("@idPart", parte[0].ToString());
                        dr = _db.EjecutarConsulta();
                        while (dr.Read())
                        {
                            txt.AgregaParteAduaneraConceptoCfdi(dr["numero"].ToString(), dr["fecha"].ToString(), dr["aduana"].ToString());
                        }
                        _db.Desconectar();
                    }
                }
                if (propina > 0)
                {
                    txt.SetInfoAdicionalRestauranteCfdi(CerosNull(propina.ToString()));
                }
                sql = "SELECT idImpLocal FROM Dat_MX_ImpLocales INNER JOIN Dat_General on id_Comprobante = idComprobante WHERE idComprobante = @id";
                _db.Conectar();
                _db.CrearComando(sql);
                _db.AsignarParametroCadena("@id", _idComprobante);
                dr = _db.EjecutarConsulta();
                var tieneLocales = dr.HasRows;
                _db.Desconectar();
                if (tieneLocales)
                {
                    sql = @"SELECT totalRetImpLocales, totalTraImpLocales FROM Dat_General WHERE idComprobante = @id";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@id", _idComprobante);
                    dr = _db.EjecutarConsulta();
                    if (dr.Read())
                    {
                        txt.SetImpuestosLocalesCfdi(dr["totalRetImpLocales"].ToString(), dr["totalTraImpLocales"].ToString());
                    }
                    _db.Desconectar();
                    sql = "SELECT nombre as impuesto, tasadeRetencion as tasa, importe FROM Dat_MX_ImpLocales INNER JOIN Dat_General ON id_Comprobante = idComprobante WHERE tasadeRetencion IS NOT NULL AND tasadeTraslado IS NULL AND idComprobante = @id";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@id", _idComprobante);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaRetencionLocalCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString());
                    }
                    _db.Desconectar();
                    sql = "SELECT nombre as impuesto, tasadeTraslado as tasa, importe FROM Dat_MX_ImpLocales INNER JOIN Dat_General ON id_Comprobante = idComprobante WHERE tasadeTraslado IS NOT NULL AND tasadeRetencion IS NULL AND idComprobante = @id";
                    _db.Conectar();
                    _db.CrearComando(sql);
                    _db.AsignarParametroCadena("@id", _idComprobante);
                    dr = _db.EjecutarConsulta();
                    while (dr.Read())
                    {
                        txt.AgregaTrasladoLocalCfdi(dr["impuesto"].ToString(), dr["tasa"].ToString(), dr["importe"].ToString());
                    }
                    _db.Desconectar();
                }
                var ambiente = false;
                switch (sAmbiente)
                {
                case "1":
                    ambiente = false;
                    break;

                case "2":
                    ambiente = true;
                    break;

                default:
                    break;
                }
                var txtInvoice = txt.ConstruyeTxtCfdi();
                var coreMx     = new wsEmision.WsEmision {
                    Timeout = (1800 * 1000)
                };
                var result = coreMx.RecibeInfoTxt(txtInvoice, _idUser, Session["IDENTEMI"].ToString(), ambiente, codDoc, !manual, manual, "", "");
                if (result != null)
                {
                    try
                    {
                        _db.Conectar();
                        _db.CrearComando(@"DELETE FROM Dat_HabitacionEvento WHERE id_Comprobante = @id;DELETE FROM Dat_General WHERE idComprobante = @id");
                        _db.AsignarParametroCadena("@id", _idComprobante);
                        _db.AsignarParametroCadena("@id", _idComprobante);
                        _db.EjecutarConsulta1();
                    }
                    catch { }
                    finally
                    {
                        _db.Desconectar();
                    }
                    var xDoc = new XmlDocument();
                    xDoc.LoadXml(result.OuterXml);
                    Session["uuidCreado"] = GetAtributte(xDoc, "UUID", "tfd:TimbreFiscalDigital");
                    (Master as SiteMaster).MostrarAlerta(this, "El comprobante se ha generado satisfactoriamente", 2, null);
                    Response.Redirect("~/Documentos.aspx", false);
                }
                else
                {
                    (Master as SiteMaster).MostrarAlerta(this, "El comprobante no se creó correctamente<br/>" + coreMx.ObtenerMensaje(), 4, null);
                }
            }
            catch (Exception ex)
            {
                (Master as SiteMaster).MostrarAlerta(this, "El comprobante no se creó correctamente<br/>" + ex.Message, 4, null);
            }
            _idComprobante = "";
        }