예제 #1
0
        /// <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);
        }
예제 #3
0
        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);
        }