/// <summary> /// Obtener informacion Nodo Información Aduanera por Concepto /// </summary> /// <param name="numeroPedimento">Número de Pedimento</param> /// <returns>Lista modelo ComprobanteConceptoInformacionAduanera</returns> public List <ComprobanteConceptoInformacionAduanera> ObtenerNodoConceptoInformacionAduanera(string numeroPedimento) { List <ComprobanteConceptoInformacionAduanera> respuesta = new List <ComprobanteConceptoInformacionAduanera>(); try { if (!string.IsNullOrEmpty(numeroPedimento)) { ComprobanteConceptoInformacionAduanera pedimento = new ComprobanteConceptoInformacionAduanera(); pedimento.NumeroPedimento = numeroPedimento; respuesta.Add(pedimento); } else { respuesta = null; } } catch (Exception ex) { respuesta = null; } return(respuesta); }
public EntResultadoTimbrado EmitirComprobante(EntComprobante comprobante, bool emitidoEnMatriz) { try { // Se valida que el componente no sea null if (comprobante == null) { throw new ArgumentNullException(nameof(comprobante)); } // El comprobante debe tener al menos un concepto var totalProductos = comprobante.ComprobanteDetalle.Count; if (totalProductos == 0) { throw new Exception("El comprobante no tiene conceptos definidos, agregue un por lo menos un concepto para emitir el comprobante"); } // Inicializamos el conector y establecemos las credenciales para el permiso de conexión var conector = new Conector(_ambienteProductivo); conector.EstableceCredenciales(_usuarioIntegrador); //Creamos un comprobante por medio de la entidad Comprobante var CFDi = new Comprobante(); // Llenamos datos del comprobante switch (comprobante.TipoComprobante.ToLower()) { case "ingreso": CFDi.TipoDeComprobante = "I"; break; case "egreso": CFDi.TipoDeComprobante = "E"; break; case "traslado:": CFDi.TipoDeComprobante = "T"; break; case "nomina": CFDi.TipoDeComprobante = "N"; break; case "pago": CFDi.TipoDeComprobante = "P"; break; } CFDi.Serie = string.IsNullOrEmpty(comprobante.Serie.Trim()) ? null : comprobante.Serie.Trim(); CFDi.Folio = comprobante.Folio.ToString(); CFDi.Version = "3.3"; CFDi.Fecha = comprobante.FechaEmision; CFDi.FormaPago = comprobante.FormaPago; CFDi.FormaPagoSpecified = true; CFDi.MetodoPago = comprobante.MetodoPago; CFDi.MetodoPagoSpecified = true; CFDi.Total = comprobante.Total.ToDecimal(); CFDi.SubTotal = comprobante.Subtotal.ToDecimal(); CFDi.LugarExpedicion = comprobante.LugarExpedicion; CFDi.CondicionesDePago = string.IsNullOrEmpty(comprobante.CondicionesPago.Trim()) ? null : comprobante.CondicionesPago.Trim(); if (comprobante.Descuento != null && comprobante.Descuento.Value > 0) { CFDi.Descuento = comprobante.Descuento.Value.ToDecimal(); CFDi.DescuentoSpecified = true; } CFDi.Moneda = comprobante.Moneda; CFDi.TipoCambio = comprobante.TipoCambio.Value; CFDi.TipoCambioSpecified = true; // Folio del comprobante original (para parcialidades) // Serie del comprobante original (para parcialidades) // Fecha del comprobante original (para parcialidades) // Monto del comprobante original (para parcialidades) //Llenamos datos del emisor CFDi.Emisor = new ComprobanteEmisor { Rfc = comprobante.EmisorRfc, Nombre = comprobante.EmisorNombre, RegimenFiscal = comprobante.RegimenFiscal }; //Llena datos del receptor CFDi.Receptor = new ComprobanteReceptor { Rfc = comprobante.ReceptorRfc, Nombre = comprobante.ReceptorNombre, UsoCFDI = comprobante.UsoCFDi }; //Llenamos los conceptos CFDi.Conceptos = new ComprobanteConcepto[totalProductos]; var indx = 0; foreach (var detalle in comprobante.ComprobanteDetalle.ToList()) { CFDi.Conceptos[indx] = new ComprobanteConcepto(); CFDi.Conceptos[indx].ClaveProdServ = detalle.ClaveProdServ; CFDi.Conceptos[indx].ClaveUnidad = detalle.ClaveUnidad; CFDi.Conceptos[indx].Cantidad = detalle.Cantidad; CFDi.Conceptos[indx].Unidad = detalle.Unidad; CFDi.Conceptos[indx].NoIdentificacion = !string.IsNullOrEmpty(detalle.NoIdentificacion) ? detalle.NoIdentificacion : null; CFDi.Conceptos[indx].Descripcion = detalle.Descripcion; CFDi.Conceptos[indx].ValorUnitario = Math.Round(detalle.ValorUnitario, 2); CFDi.Conceptos[indx].Importe = Math.Round(detalle.Importe, 2); if (detalle.TieneInformacionAduanera) { var informacionAduanera = new ComprobanteConceptoInformacionAduanera(); informacionAduanera.NumeroPedimento = detalle.ComplementoAduana.NumeroPedimento; CFDi.Conceptos[indx].InformacionAduanera = new ComprobanteConceptoInformacionAduanera[1]; CFDi.Conceptos[indx].InformacionAduanera[0] = informacionAduanera; } if (detalle.Descuento != 0) { CFDi.Conceptos[indx].Descuento = detalle.Descuento; CFDi.Conceptos[indx].DescuentoSpecified = true; } if (detalle.TasaTraIva.HasValue) { CFDi.Conceptos[indx].Impuestos = new ComprobanteConceptoImpuestos(); CFDi.Conceptos[indx].Impuestos.Traslados = new ComprobanteConceptoImpuestosTraslado[1]; CFDi.Conceptos[indx].Impuestos.Traslados[0] = new ComprobanteConceptoImpuestosTraslado(); CFDi.Conceptos[indx].Impuestos.Traslados[0].Base = detalle.Importe - detalle.Descuento; CFDi.Conceptos[indx].Impuestos.Traslados[0].Impuesto = "002"; CFDi.Conceptos[indx].Impuestos.Traslados[0].TipoFactor = "Tasa"; CFDi.Conceptos[indx].Impuestos.Traslados[0].Importe = detalle.ImporteTraIva.Value; CFDi.Conceptos[indx].Impuestos.Traslados[0].ImporteSpecified = true; CFDi.Conceptos[indx].Impuestos.Traslados[0].TasaOCuota = detalle.TasaTraIva.Value.ToString(); CFDi.Conceptos[indx].Impuestos.Traslados[0].TasaOCuotaSpecified = true; } if (detalle.TasaTraIeps.HasValue) { CFDi.Conceptos[indx].Impuestos = new ComprobanteConceptoImpuestos(); CFDi.Conceptos[indx].Impuestos.Traslados = new ComprobanteConceptoImpuestosTraslado[1]; CFDi.Conceptos[indx].Impuestos.Traslados[0] = new ComprobanteConceptoImpuestosTraslado(); CFDi.Conceptos[indx].Impuestos.Traslados[0].Base = detalle.Importe - detalle.Descuento; CFDi.Conceptos[indx].Impuestos.Traslados[0].Impuesto = "003"; CFDi.Conceptos[indx].Impuestos.Traslados[0].TipoFactor = "Tasa"; CFDi.Conceptos[indx].Impuestos.Traslados[0].Importe = detalle.ImporteTraIeps.Value; CFDi.Conceptos[indx].Impuestos.Traslados[0].ImporteSpecified = true; CFDi.Conceptos[indx].Impuestos.Traslados[0].TasaOCuota = detalle.TasaTraIeps.Value.ToString(); CFDi.Conceptos[indx].Impuestos.Traslados[0].TasaOCuotaSpecified = true; } if (detalle.TasaRetIva.HasValue) { CFDi.Conceptos[indx].Impuestos = new ComprobanteConceptoImpuestos(); CFDi.Conceptos[indx].Impuestos.Retenciones = new ComprobanteConceptoImpuestosRetencion[1]; CFDi.Conceptos[indx].Impuestos.Retenciones[0] = new ComprobanteConceptoImpuestosRetencion(); CFDi.Conceptos[indx].Impuestos.Retenciones[0].Base = detalle.Importe - detalle.Descuento; CFDi.Conceptos[indx].Impuestos.Retenciones[0].Impuesto = "002"; CFDi.Conceptos[indx].Impuestos.Retenciones[0].TipoFactor = "Tasa"; CFDi.Conceptos[indx].Impuestos.Retenciones[0].Importe = detalle.ImporteRetIva.Value; CFDi.Conceptos[indx].Impuestos.Retenciones[0].TasaOCuota = detalle.TasaRetIva.Value; } if (detalle.TasaRetIsr.HasValue) { CFDi.Conceptos[indx].Impuestos = new ComprobanteConceptoImpuestos(); CFDi.Conceptos[indx].Impuestos.Retenciones = new ComprobanteConceptoImpuestosRetencion[1]; CFDi.Conceptos[indx].Impuestos.Retenciones[0] = new ComprobanteConceptoImpuestosRetencion(); CFDi.Conceptos[indx].Impuestos.Retenciones[0].Base = detalle.Importe - detalle.Descuento; CFDi.Conceptos[indx].Impuestos.Retenciones[0].Impuesto = "001"; CFDi.Conceptos[indx].Impuestos.Retenciones[0].TipoFactor = "Tasa"; CFDi.Conceptos[indx].Impuestos.Retenciones[0].Importe = detalle.ImporteRetIsr.Value; CFDi.Conceptos[indx].Impuestos.Retenciones[0].TasaOCuota = detalle.TasaRetIsr.Value; } //Llenamos los complementos si existiera alguno //if (detalle.Complementos.Count() > 0) //{ // CFDi.Conceptos[indx].Items = new Object[detalle.Complementos.Count()]; // int compIndx = 0; // foreach (IComplementoConcepto complemento in detalle.Complementos) // { // var type = complemento.GetType(); // switch (type.Name) // { // case "EntComplementoAduana": // var complementoAduana = complemento as EntComplementoAduana; // CFDi.Conceptos[indx].Items[compIndx] = new t_InformacionAduanera() // { // aduana = complementoAduana.Nombre, // numero = complementoAduana.Numero, // fecha = complementoAduana.Fecha // }; // break; // case "EntComplementoPredial": // var complementoPredial = complemento as EntComplementoPredial; // CFDi.Conceptos[indx].Items[compIndx] = new ComprobanteConceptoCuentaPredial() // { // numero = complementoPredial.Numero // }; // break; // case "EntComplementoParte": // var complementoParte = complemento as EntComplementoParte; // CFDi.Conceptos[indx].Items[compIndx] = new ComprobanteConceptoParte() // { // cantidad = complementoParte.Cantidad, // unidad = complementoParte.Unidad, // noIdentificacion = complementoParte.NoIdentificacion, // descripcion = complementoParte.Descripcion, // valorUnitario = complementoParte.ValorUnitario, // importe = complementoParte.Importe // }; // break; // } // compIndx++; // } //} indx++; } //Se integran los impuestos var detalles = comprobante.ComprobanteDetalle.ToList() as List <EntComprobanteDetalle>; var impuestosTraslado = new List <EntImpuestoTraslado>(); var impuestosRetencion = new List <EntImpuestoRetencion>(); if (comprobante.ConceptosIncluyenImpuestos) { foreach (EntComprobanteDetalle detalle in detalles) { if (detalle.TasaTraIva.HasValue) { impuestosTraslado.Add(new EntImpuestoTraslado() { Tipo = "IVA", TasaOCuota = detalle.TasaTraIva.Value, Importe = detalle.ImporteTraIva.Value }); } if (detalle.TasaTraIeps.HasValue) { impuestosTraslado.Add(new EntImpuestoTraslado() { Tipo = "IEPS", TasaOCuota = detalle.TasaTraIeps.Value, Importe = detalle.ImporteTraIeps.Value }); } if (detalle.TasaRetIva.HasValue) { impuestosRetencion.Add(new EntImpuestoRetencion() { Tipo = "IVA", TasaOCuota = detalle.TasaRetIva.Value, Importe = detalle.ImporteRetIva.Value }); } if (detalle.TasaRetIsr.HasValue) { impuestosRetencion.Add(new EntImpuestoRetencion() { Tipo = "ISR", TasaOCuota = detalle.TasaRetIsr.Value, Importe = detalle.ImporteRetIsr.Value }); } } } var impuestosTrasladoGroup = (from p in impuestosTraslado group p by new { p.Tipo, p.TasaOCuota } into grupo select new { Tipo = grupo.Key.Tipo, Tasa = grupo.Key.TasaOCuota, Importe = grupo.Sum(x => x.Importe) }).ToList(); var impuestosRetencionGroup = (from p in impuestosRetencion group p by new { p.Tipo, p.TasaOCuota } into grupo select new { Tipo = grupo.Key.Tipo, Tasa = grupo.Key.TasaOCuota, Importe = grupo.Sum(x => x.Importe) }).ToList(); if (!comprobante.EsPago) { //Se registran los impuestos federales CFDi.Impuestos = new ComprobanteImpuestos(); if (impuestosTrasladoGroup.Count > 0) { decimal totalImpuestosTrasladados = 0; CFDi.Impuestos.Traslados = new ComprobanteImpuestosTraslado[impuestosTrasladoGroup.Count]; var i = 0; foreach (var impuesto in impuestosTrasladoGroup) { CFDi.Impuestos.Traslados[i] = new ComprobanteImpuestosTraslado(); if (impuesto.Tipo == "IVA") { CFDi.Impuestos.Traslados[i].Impuesto = "002"; CFDi.Impuestos.Traslados[i].TipoFactor = "Tasa"; CFDi.Impuestos.Traslados[i].TasaOCuota = impuesto.Tasa.ToString(); CFDi.Impuestos.Traslados[i].Importe = impuesto.Importe.ToString("##0.00").ToDecimal(); } if (impuesto.Tipo == "IEPS") { CFDi.Impuestos.Traslados[i].Impuesto = "003"; CFDi.Impuestos.Traslados[i].TipoFactor = "Tasa"; CFDi.Impuestos.Traslados[i].TasaOCuota = impuesto.Tasa.ToString(); CFDi.Impuestos.Traslados[i].Importe = impuesto.Importe.ToString("##0.00").ToDecimal(); } totalImpuestosTrasladados += impuesto.Importe; i++; } CFDi.Impuestos.TotalImpuestosTrasladados = totalImpuestosTrasladados; CFDi.Impuestos.TotalImpuestosTrasladadosSpecified = true; } if (impuestosRetencionGroup.Count > 0) { decimal totalImpuestosRetenidos = 0; CFDi.Impuestos.Retenciones = new ComprobanteImpuestosRetencion[impuestosRetencionGroup.Count]; var i = 0; foreach (var impuesto in impuestosRetencionGroup) { CFDi.Impuestos.Retenciones[i] = new ComprobanteImpuestosRetencion(); if (impuesto.Tipo == "IVA") { CFDi.Impuestos.Retenciones[i].Impuesto = "002"; CFDi.Impuestos.Retenciones[i].Importe = impuesto.Importe.ToString("##0.00").ToDecimal(); } if (impuesto.Tipo == "ISR") { CFDi.Impuestos.Retenciones[i].Impuesto = "001"; CFDi.Impuestos.Retenciones[i].Importe = impuesto.Importe.ToString("##0.00").ToDecimal(); } totalImpuestosRetenidos += impuesto.Importe; i++; } CFDi.Impuestos.TotalImpuestosRetenidos = totalImpuestosRetenidos; CFDi.Impuestos.TotalImpuestosRetenidosSpecified = true; } } // Se registran los complementos de la factura var xmlComplementos = new List <XmlElement>(); // Complemento para pago if (comprobante.EsPago) { var detallePago = new Profact.TimbraCFDI33.Complementos.Pagos10.PagosPago() { FechaPago = comprobante.ComprobantesPagos.Fecha, FormaDePagoP = comprobante.ComprobantesPagos.FormaPago, MonedaP = comprobante.ComprobantesPagos.Moneda, TipoCambioP = comprobante.ComprobantesPagos.TipoCambio ?? comprobante.ComprobantesPagos.TipoCambio.ToDecimal(), TipoCambioPSpecified = comprobante.ComprobantesPagos.TipoCambio != null, Monto = comprobante.ComprobantesPagos.Monto, RfcEmisorCtaBen = string.IsNullOrEmpty(comprobante.ComprobantesPagos.EmisorCuentaBenef) ? null : comprobante.ComprobantesPagos.EmisorCuentaBenef, RfcEmisorCtaOrd = string.IsNullOrEmpty(comprobante.ComprobantesPagos.EmisorCuentaOrigen) ? null : comprobante.ComprobantesPagos.EmisorCuentaOrigen, CtaBeneficiario = string.IsNullOrEmpty(comprobante.ComprobantesPagos.CuentaBeneficiaria) ? null : comprobante.ComprobantesPagos.CuentaBeneficiaria, CtaOrdenante = string.IsNullOrEmpty(comprobante.ComprobantesPagos.CuentaOrdenante) ? null : comprobante.ComprobantesPagos.CuentaOrdenante, NomBancoOrdExt = string.IsNullOrEmpty(comprobante.ComprobantesPagos.Banco) ? null : comprobante.ComprobantesPagos.Banco, NumOperacion = string.IsNullOrEmpty(comprobante.ComprobantesPagos.NumeroOperacion) ? null : comprobante.ComprobantesPagos.NumeroOperacion, TipoCadPago = string.IsNullOrEmpty(comprobante.ComprobantesPagos.TipoCadenaPago) ? null : comprobante.ComprobantesPagos.TipoCadenaPago, TipoCadPagoSpecified = !string.IsNullOrEmpty(comprobante.ComprobantesPagos.TipoCadenaPago), CadPago = string.IsNullOrEmpty(comprobante.ComprobantesPagos.CadenaPago) ? null : comprobante.ComprobantesPagos.CadenaPago, //CertPago //SelloPago }; var tieneComprobantesRelacionados = true; if (tieneComprobantesRelacionados) { detallePago.DoctoRelacionado = new PagosPagoDoctoRelacionado[comprobante.ComprobantesPagos.DocumentosRelacionados.Count]; var i = 0; foreach (var doc in comprobante.ComprobantesPagos.DocumentosRelacionados.ToList()) { var doctoRelacionado = new Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoDoctoRelacionado() { IdDocumento = doc.IdDocumento, MonedaDR = doc.Moneda, MetodoDePagoDR = doc.MetodoPago, NumParcialidad = string.IsNullOrEmpty(doc.NumParcialidad.ToString()) ? null : doc.NumParcialidad.ToString(), ImpSaldoAnt = doc.ImpSaldoAnt ?? doc.ImpSaldoAnt.ToDecimal(), ImpSaldoAntSpecified = doc.ImpSaldoAnt != null, ImpSaldoInsoluto = doc.ImpSaldoInsoluto ?? doc.ImpSaldoInsoluto.ToDecimal(), ImpSaldoInsolutoSpecified = doc.ImpSaldoInsoluto != null, ImpPagado = doc.ImpPagado ?? doc.ImpPagado.ToDecimal(), ImpPagadoSpecified = doc.ImpPagado != null, Folio = string.IsNullOrEmpty(doc.Folio) ? null : doc.Folio, Serie = string.IsNullOrEmpty(doc.Serie) ? null : doc.Serie, TipoCambioDR = doc.TipoCambio ?? doc.TipoCambio.ToDecimal(), TipoCambioDRSpecified = doc.TipoCambio != null }; detallePago.DoctoRelacionado[i] = new PagosPagoDoctoRelacionado(); detallePago.DoctoRelacionado[i] = doctoRelacionado; i++; } } var pago = new Profact.TimbraCFDI33.Complementos.Pagos10.Pagos(); pago.Version = "1.0"; pago.Pago = new PagosPago[1]; pago.Pago[0] = new PagosPago(); pago.Pago[0] = detallePago; XmlSerializerNamespaces nsPagos = new XmlSerializerNamespaces(); nsPagos.Add("pago10", "http://www.sat.gob.mx/Pagos"); string xmlPagos = XMLUtilerias.SerializaObjeto(pago, typeof(Pagos), nsPagos); XmlDocument docPago = new XmlDocument(); docPago.LoadXml(xmlPagos); xmlComplementos.Add(docPago.DocumentElement); CFDi.PagosSpecified = true; } // Impuestos locales //if (comprobante.ImpuestosLocales != null) //{ // if (comprobante.ImpuestosLocales.Count > 0) // { // XmlDocument impLocal = RegistrarImpuestosLocales(comprobante.ImpuestosLocales); // xmlComplementos.Add(impLocal.DocumentElement); // CFDi.ImpLocalSpecified = true; // } //} // Se agregan los complementos if (xmlComplementos.Count > 0) { CFDi.Complemento = new Profact.TimbraCFDI33.ComprobanteComplemento(); CFDi.Complemento.Any = xmlComplementos.ToArray <XmlElement>(); } //Timbramos el comprobante a traves de una petición al PAC var resultadoTimbre = conector.TimbraCFDI(CFDi); //Se mapean los resultados para ser devueltos por el servicio var resultado = new EntResultadoTimbrado { Exitoso = resultadoTimbre.Exitoso, Mensaje = resultadoTimbre.Descripcion }; if (resultadoTimbre.Exitoso) { resultado.FolioUuid = resultadoTimbre.FolioUUID; //2.- Folio fiscal resultado.NoCertificado = resultadoTimbre.No_Certificado; //3.- No. Certificado del Emisor resultado.NoCertificadoSat = resultadoTimbre.No_Certificado_SAT; //4.- No. Certificado del SAT resultado.FechaCertificacion = resultadoTimbre.FechaCertificacion; //5.- Fecha y Hora de certificación resultado.SelloCfdi = resultadoTimbre.SelloCFDI; //6.- Sello del cfdi resultado.SelloSat = resultadoTimbre.SelloSAT; //7.- Sello del SAT resultado.CadenaTimbre = resultadoTimbre.CadenaTimbre; //8.- Cadena original de complemento de certificación resultado.Xml = resultadoTimbre.Xml; resultado.CbbBytes = resultadoTimbre.CodigoBidimensional; } return(resultado); } catch (Exception e) { Console.WriteLine(e); throw e.GetBaseException(); } }