/// <summary> /// Obtener información para Nodo CFDI Relacionados /// </summary> /// <param name="idComprobante">ID Comprobante</param> /// <returns>Modelo ComprobanteCfdiRelacionados</returns> public async Task <ComprobanteCfdiRelacionados> ObtenerCfdiRelacionados(string idComprobante) { ComprobanteCfdiRelacionados respuesta = new ComprobanteCfdiRelacionados(); try { var resultado = await _baseDatos.SelectAsync <NodoCfdiRelacionados>(_queryNodoCfdiRelacionados + idComprobante); if ((resultado?.Any() ?? false)) { respuesta.TipoRelacion = resultado.FirstOrDefault().tipoRelacion; var uuids = resultado.Select(x => new ComprobanteCfdiRelacionadosCfdiRelacionado() { UUID = x.uuid }).ToList(); respuesta.CfdiRelacionado = uuids.ToArray(); } else { respuesta = null; } } catch (Exception ex) { respuesta = null; } return(respuesta); }
private ComprobanteCfdiRelacionados ConstruyeCfdiRelacionado(string uuidRelacionado) { ComprobanteCfdiRelacionados cfdiRelacionados = new ComprobanteCfdiRelacionados(); cfdiRelacionados.TipoRelacion = "04"; cfdiRelacionados.CfdiRelacionado[0].UUID = uuidRelacionado; return(cfdiRelacionados); }
static Comprobante InvoiceToCFDv33(FiscalDocument item) { var cer = item.Issuer.Certificates.SingleOrDefault(x => x.Id == item.IssuerCertificateNumber); var cfd = new Comprobante { TipoDeComprobante = (c_TipoDeComprobante)FDT2TDC(item.Type), NoCertificado = item.IssuerCertificateNumber.PadLeft(20, '0'), Serie = item.Batch, Folio = item.Serial.ToString(), Fecha = item.Issued.GetValueOrDefault(), MetodoPago = item.Terms == PaymentTerms.Immediate ? c_MetodoPago.PagoEnUnaSolaExhibicion : c_MetodoPago.PagoEnParcialidadesODiferido, MetodoPagoSpecified = true, FormaPago = (c_FormaPago)(int)item.PaymentMethod, FormaPagoSpecified = true, LugarExpedicion = item.IssuedLocation, SubTotal = item.Subtotal, Total = item.Total, Moneda = item.Currency.GetDisplayName(), TipoCambio = item.ExchangeRate, TipoCambioSpecified = item.Currency != CurrencyCode.MXN, Sello = item.IssuerDigitalSeal, Certificado = (cer == null ? null : SecurityHelpers.EncodeBase64(cer.CertificateData)), Emisor = new ComprobanteEmisor { Rfc = item.Issuer.Id, Nombre = item.IssuerName, RegimenFiscal = (c_RegimenFiscal)int.Parse(item.IssuerRegime.Id), }, Receptor = new ComprobanteReceptor { Rfc = item.Recipient, Nombre = item.RecipientName, UsoCFDI = CfdiUsage2UsoCFDI(item.Usage.Id) }, Conceptos = new ComprobanteConcepto [item.Details.Count] }; int i = 0; foreach (var detail in item.Details) { cfd.Conceptos [i] = new ComprobanteConcepto { Cantidad = detail.Quantity, ClaveUnidad = detail.UnitOfMeasurement.Id, Unidad = detail.UnitOfMeasurementName, NoIdentificacion = detail.ProductCode, ClaveProdServ = detail.ProductService.Id, Descripcion = detail.ProductName, ValorUnitario = detail.NetPrice, Importe = detail.Subtotal, Descuento = detail.Discount, DescuentoSpecified = detail.Discount > 0m }; //cfd.Conceptos [i].InformacionAduanera = new ComprobanteConceptoInformacionAduanera [] { // new ComprobanteConceptoInformacionAduanera { // NumeroPedimento = "" // } //}; if (detail.Subtotal == detail.Discount) { i++; continue; } if (detail.TaxRate >= 0m) { cfd.Conceptos [i].Impuestos = new ComprobanteConceptoImpuestos { Traslados = new ComprobanteConceptoImpuestosTraslado [] { new ComprobanteConceptoImpuestosTraslado { Impuesto = c_Impuesto.IVA, TipoFactor = c_TipoFactor.Tasa, Base = detail.TaxBase, Importe = detail.Taxes, ImporteSpecified = true, TasaOCuota = detail.TaxRate, TasaOCuotaSpecified = true } }, Retenciones = item.RetentionRate <= 0m ? null : new ComprobanteConceptoImpuestosRetencion [] { new ComprobanteConceptoImpuestosRetencion { Impuesto = c_Impuesto.IVA, TipoFactor = c_TipoFactor.Tasa, Base = detail.TaxBase, Importe = detail.RetentionTaxes, TasaOCuota = item.RetentionRate } } }; } else { cfd.Conceptos [i].Impuestos = new ComprobanteConceptoImpuestos { Traslados = new ComprobanteConceptoImpuestosTraslado [] { new ComprobanteConceptoImpuestosTraslado { Impuesto = c_Impuesto.IVA, TipoFactor = c_TipoFactor.Exento, Base = detail.TaxBase } } }; } i++; } if (item.Discount > 0) { cfd.Descuento = item.Discount; cfd.DescuentoSpecified = true; } cfd.Impuestos = new ComprobanteImpuestos(); var taxes = new List <ComprobanteImpuestosTraslado> (); if (cfd.Conceptos.Any(c => c.Impuestos != null && c.Impuestos.Traslados.Any(x => x.TasaOCuota == decimal.Zero))) { taxes.Add(new ComprobanteImpuestosTraslado { Impuesto = c_Impuesto.IVA, TipoFactor = c_TipoFactor.Tasa, TasaOCuota = 0.000000m, Importe = 0.00m }); } if (cfd.Conceptos.Any(c => c.Impuestos != null && c.Impuestos.Traslados.Any(x => x.TasaOCuota == WebConfig.DefaultVAT))) { taxes.Add(new ComprobanteImpuestosTraslado { Impuesto = c_Impuesto.IVA, TipoFactor = c_TipoFactor.Tasa, TasaOCuota = WebConfig.DefaultVAT, Importe = cfd.Conceptos.Where(x => x.Impuestos != null).Sum(c => c.Impuestos.Traslados.Where(x => x.TasaOCuota == WebConfig.DefaultVAT).Sum(x => x.Importe)) }); } cfd.Impuestos.Traslados = taxes.ToArray(); cfd.Impuestos.TotalImpuestosTrasladados = cfd.Impuestos.Traslados.Sum(x => x.Importe); cfd.Impuestos.TotalImpuestosTrasladadosSpecified = true; if (item.RetentionRate > 0m) { cfd.Impuestos.Retenciones = new ComprobanteImpuestosRetencion [] { new ComprobanteImpuestosRetencion { Impuesto = c_Impuesto.IVA, Importe = item.RetentionTaxes, } }; cfd.Impuestos.TotalImpuestosRetenidos = cfd.Impuestos.Retenciones.Sum(x => x.Importe); cfd.Impuestos.TotalImpuestosRetenidosSpecified = true; } if (item.LocalRetentionRate > 0m) { var implocal = new ImpuestosLocalesRetencionesLocales { ImpLocRetenido = item.LocalRetentionName, Importe = item.LocalRetentionTaxes, TasadeRetencion = Math.Round(item.LocalRetentionRate * 100m, 2) }; if (cfd.Complemento == null) { cfd.Complemento = new List <object> (); } cfd.Complemento.Add(new ImpuestosLocales { TotaldeRetenciones = 76.50m, RetencionesLocales = new ImpuestosLocalesRetencionesLocales [] { implocal } }); } if (item.Relations.Any()) { var rels = new ComprobanteCfdiRelacionados { CfdiRelacionado = new ComprobanteCfdiRelacionadosCfdiRelacionado [item.Relations.Count] }; if (item.Type == FiscalDocumentType.AdvancePaymentsApplied) { rels.TipoRelacion = c_TipoRelacion.AplicacionDeAnticipo; } else if (item.Type == FiscalDocumentType.CreditNote) { rels.TipoRelacion = c_TipoRelacion.NotaDeCredito; } else { rels.TipoRelacion = c_TipoRelacion.Sustitucion; } i = 0; foreach (var relation in item.Relations) { rels.CfdiRelacionado [i++] = new ComprobanteCfdiRelacionadosCfdiRelacionado { UUID = relation.Relation.StampId }; } cfd.CfdiRelacionados = rels; } return(cfd); }