Example #1
0
        public static string ValidataionUrl(this FiscalDocument item)
        {
            var data = string.Format(Resources.FiscalDocumentQRCode33FormatString,
                                     item.Issuer.Id, item.Recipient, item.Total, item.StampId,
                                     item.IssuerDigitalSeal?.Substring(item.IssuerDigitalSeal.Length - 8));

            return(data);
        }
Example #2
0
        static Comprobante FiscalDocumentToCFDv33(FiscalDocument item)
        {
            if (item.Type == FiscalDocumentType.PaymentReceipt)
            {
                return(PaymentReceiptToCFDv33(item));
            }

            return(InvoiceToCFDv33(item));
        }
Example #3
0
        public static bool CancelCFD(FiscalDocument item)
        {
            if (item.IsCancelled)
            {
                return(false);
            }

            return(DFactureCancel(item));
        }
Example #4
0
        public static Comprobante SignCFD(FiscalDocument item)
        {
            var cfd = FiscalDocumentToCFDv33(item);
            var cer = item.Issuer.Certificates.Single(x => x.Id == item.IssuerCertificateNumber);

            cfd.Sign(cer.KeyData, cer.KeyPassword);

            //System.IO.File.WriteAllText (System.Web.HttpContext.Current.Server.MapPath ("~/cfd.xml"), cfd.ToXmlString ());

            return(cfd);
        }
Example #5
0
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = (TimeRaw != null ? TimeRaw.GetDeterministicHashCode() : 0);
         hashCode = (hashCode * 397) ^ Sum.GetHashCode();
         hashCode = (hashCode * 397) ^ (FiscalNumber != null ? FiscalNumber.GetDeterministicHashCode() : 0);
         hashCode = (hashCode * 397) ^ (FiscalDocument != null ? FiscalDocument.GetDeterministicHashCode() : 0);
         hashCode = (hashCode * 397) ^ (FiscalSign != null ? FiscalSign.GetDeterministicHashCode() : 0);
         hashCode = (hashCode * 397) ^ (N != null ? N.GetDeterministicHashCode() : 0);
         return(hashCode);
     }
 }
Example #6
0
        //static Comprobante ProFactStamp (FiscalDocument item)
        //{
        //	var cfd = SignCFD (item);
        //	var cli = new ProFactClient (WebConfig.ProFactUser, WebConfig.ProFactUrl);
        //	var id = string.Format ("{0}-{1:D6}", WebConfig.ProFactCode, item.Id);
        //	//System.IO.File.WriteAllText ("cfd.xml", cfd.ToXmlString ());
        //	var tfd = cli.Stamp (id, cfd);

        //	if (cfd.Complemento == null) {
        //		cfd.Complemento = new List<object> ();
        //	}

        //	cfd.Complemento.Add (tfd);

        //	return cfd;
        //}

        //static bool ProFactCancel (FiscalDocument item)
        //{
        //	try {
        //		if (item.Version > 3.2m) {
        //			var cli = new ProFactClient (WebConfig.ProFactUser, WebConfig.ProFactUrl);
        //			return cli.Cancel (item.Issuer.Id, item.StampId);
        //		} else {
        //			var cli = new ProFactClient (WebConfig.ProFactUser, WebConfig.ProFactUrlV32);
        //			return cli.CancelV32 (item.Issuer.Id, item.StampId);
        //		}
        //	} catch (ProFactClientException ex) {
        //		if (ex.Code == "202") { // UUID Previamente cancelado
        //			return true;
        //		}

        //		throw ex;
        //	}
        //}

        static Comprobante DFactureStamp(FiscalDocument item)
        {
            var cfd = SignCFD(item);
            var cli = new DFactureClient(WebConfig.DFactureUser, WebConfig.DFacturePassword, WebConfig.DFactureUrl);
            //System.IO.File.WriteAllText ("cfd.xml", cfd.ToXmlString ());
            var tfd = cli.Stamp(cfd);

            if (cfd.Complemento == null)
            {
                cfd.Complemento = new List <object> ();
            }

            cfd.Complemento.Add(tfd);

            return(cfd);
        }
Example #7
0
        public static bool CancelCFD(FiscalDocument item)
        {
            if (item.IsCancelled) {
                return false;
            }

            if (!item.IsCompleted || item.Version < CFDI_MIN_VERSION) {
                return true;
            }

            switch (item.Provider) {
            case FiscalCertificationProvider.FiscoClic:
                return FiscoClicCancel (item);
            default:
                return ProFactCancel (item);
            }
        }
Example #8
0
        static bool DFactureCancel(FiscalDocument item)
        {
            var cer = item.Issuer.Certificates.First(x => x.IsActive);
            var cli = new DFactureClient(WebConfig.DFactureUser, WebConfig.DFacturePassword, WebConfig.DFactureUrl);

            try {
                return(cli.Cancel(item.Issuer.Id, item.Recipient, item.StampId, item.Total.ToString(),
                                  Convert.ToBase64String(cer.CertificateData),
                                  Convert.ToBase64String(cer.KeyData),
                                  Encoding.UTF8.GetString(cer.KeyPassword)));
            } catch (DFactureClientException ex) {
                if (ex.Code == "202")                   // UUID Previamente cancelado
                {
                    return(true);
                }

                throw ex;
            }
        }
Example #9
0
        public static dynamic InvoiceToCFD(FiscalDocument item)
        {
            switch (Convert.ToInt32 (item.Version * 10)) {
            case 32:
                return InvoiceToCFDv32 (item);
            case 22:
                return InvoiceToCFDv22 (item);
            case 20:
                return InvoiceToCFDv20 (item);
            }

            switch (item.Issuer.Scheme) {
            case FiscalScheme.CFD:
                return InvoiceToCFDv22 (item);
            case FiscalScheme.CFDI:
                return InvoiceToCFDv32 (item);
            }

            return null;
        }
Example #10
0
 public static Comprobante IssueCFD(FiscalDocument item)
 {
     return(DFactureStamp(item));
 }
Example #11
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
                };

                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.Relations.Any())
            {
                cfd.CfdiRelacionados = new ComprobanteCfdiRelacionados {
                    TipoRelacion    = item.Type == FiscalDocumentType.AdvancePaymentsApplied ? c_TipoRelacion.AplicacionDeAnticipo : c_TipoRelacion.NotaDeCredito,
                    CfdiRelacionado = new ComprobanteCfdiRelacionadosCfdiRelacionado [item.Relations.Count]
                };

                i = 0;
                foreach (var relation in item.Relations)
                {
                    cfd.CfdiRelacionados.CfdiRelacionado [i++] = new ComprobanteCfdiRelacionadosCfdiRelacionado {
                        UUID = relation.Relation.StampId
                    };
                }
            }

            return(cfd);
        }
Example #12
0
        static Comprobante PaymentReceiptToCFDv33(FiscalDocument item)
        {
            var cer = item.Issuer.Certificates.SingleOrDefault(x => x.Id == item.IssuerCertificateNumber);
            var cfd = new Comprobante {
                Serie             = item.Batch,
                Folio             = item.Serial.ToString(),
                Fecha             = item.Issued.GetValueOrDefault(),
                NoCertificado     = item.IssuerCertificateNumber.PadLeft(20, '0'),
                Certificado       = (cer == null ? null : SecurityHelpers.EncodeBase64(cer.CertificateData)),
                SubTotal          = 0,
                Moneda            = "XXX",
                Total             = 0,
                TipoDeComprobante = c_TipoDeComprobante.Pago,
                LugarExpedicion   = item.IssuedLocation,
                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 = c_UsoCFDI.PorDefinir
                },
                Conceptos = new ComprobanteConcepto [] {
                    new ComprobanteConcepto {
                        ClaveProdServ = "84111506",
                        Cantidad      = 1,
                        ClaveUnidad   = "ACT",
                        Descripcion   = "Pago",
                        ValorUnitario = 0,
                        Importe       = 0
                    }
                },
                Complemento = new List <object> ()
            };
            var pagos = new Pagos {
                Pago = new PagosPago [] {
                    new PagosPago {
                        FechaPago            = item.PaymentDate.GetValueOrDefault(),
                        FormaDePagoP         = (c_FormaPago)(int)item.PaymentMethod,
                        MonedaP              = item.Currency.GetDisplayName(),
                        TipoCambioP          = item.ExchangeRate,
                        TipoCambioPSpecified = item.Currency != CurrencyCode.MXN,
                        Monto            = item.PaymentAmount,
                        NumOperacion     = string.IsNullOrWhiteSpace(item.PaymentReference) ? null : item.PaymentReference,
                        NomBancoOrdExt   = string.IsNullOrWhiteSpace(item.Reference) ? null : item.Reference,
                        DoctoRelacionado = new PagosPagoDoctoRelacionado [item.Relations.Count]
                    }
                }
            };

            int i = 0;

            foreach (var relation in item.Relations)
            {
                pagos.Pago [0].DoctoRelacionado [i++] = new PagosPagoDoctoRelacionado {
                    IdDocumento               = relation.Relation.StampId,
                    Serie                     = relation.Relation.Batch,
                    Folio                     = relation.Relation.Serial.ToString(),
                    MonedaDR                  = relation.Relation.Currency.GetDisplayName(),
                    TipoCambioDR              = relation.ExchangeRate,
                    TipoCambioDRSpecified     = relation.Relation.Currency != item.Currency,
                    MetodoDePagoDR            = c_MetodoPago.PagoEnParcialidadesODiferido,
                    NumParcialidad            = relation.Installment.ToString(),
                    ImpSaldoAnt               = relation.PreviousBalance,
                    ImpSaldoAntSpecified      = true,
                    ImpPagado                 = relation.Amount,
                    ImpPagadoSpecified        = true,
                    ImpSaldoInsoluto          = relation.OutstandingBalance,
                    ImpSaldoInsolutoSpecified = true
                };
            }

            cfd.Complemento.Add(pagos);

            return(cfd);
        }
Example #13
0
        static Mictlanix.CFDv20.Comprobante InvoiceToCFDv20(FiscalDocument item)
        {
            var cer = item.Issuer.Certificates.SingleOrDefault (x => x.Id == item.IssuerCertificateNumber);

            var cfd = new Mictlanix.CFDv20.Comprobante {
                tipoDeComprobante = (Mictlanix.CFDv20.ComprobanteTipoDeComprobante)FDT2TDC (item.Type),
                noAprobacion = item.ApprovalNumber.ToString (),
                anoAprobacion = item.ApprovalYear.ToString (),
                noCertificado = item.IssuerCertificateNumber.ToString ().PadLeft (20, '0'),
                serie = item.Batch,
                folio = item.Serial.ToString (),
                fecha = item.Issued.GetValueOrDefault (),
                formaDePago = Resources.SinglePayment,
                certificado = (cer == null ? null : SecurityHelpers.EncodeBase64 (cer.CertificateData)),
                Emisor = new Mictlanix.CFDv20.ComprobanteEmisor
                {
                    rfc = item.Issuer.Id,
                    nombre = item.IssuerName,
                    DomicilioFiscal = new Mictlanix.CFDv20.t_UbicacionFiscal
                    {
                        calle = item.IssuerAddress.Street,
                        noExterior = item.IssuerAddress.ExteriorNumber,
                        noInterior = item.IssuerAddress.InteriorNumber,
                        colonia = item.IssuerAddress.Neighborhood,
                        codigoPostal = item.IssuerAddress.PostalCode,
                        localidad = item.IssuerAddress.Locality,
                        municipio = item.IssuerAddress.Borough,
                        estado = item.IssuerAddress.State,
                        pais = item.IssuerAddress.Country
                    }
                },
                Receptor = new Mictlanix.CFDv20.ComprobanteReceptor
                {
                    rfc = item.Recipient,
                    nombre = item.RecipientName,
                    Domicilio = new Mictlanix.CFDv20.t_Ubicacion
                    {
                        calle = item.RecipientAddress.Street,
                        noExterior = item.RecipientAddress.ExteriorNumber,
                        noInterior = item.RecipientAddress.InteriorNumber,
                        colonia = item.RecipientAddress.Neighborhood,
                        codigoPostal = item.RecipientAddress.PostalCode,
                        localidad = item.RecipientAddress.Locality,
                        municipio = item.RecipientAddress.Borough,
                        estado = item.RecipientAddress.State,
                        pais = item.RecipientAddress.Country
                    }
                },
                Conceptos = new Mictlanix.CFDv20.ComprobanteConcepto[item.Details.Count],
                Impuestos = new Mictlanix.CFDv20.ComprobanteImpuestos
                {
                    Traslados = new Mictlanix.CFDv20.ComprobanteImpuestosTraslado[1]
                },
                subTotal = item.Subtotal,
                total = item.Total,
                sello = item.IssuerDigitalSeal
            };

            int i = 0;
            foreach (var detail in item.Details) {
                cfd.Conceptos [i++] = new Mictlanix.CFDv20.ComprobanteConcepto {
                    cantidad = detail.Quantity,
                    unidad = detail.UnitOfMeasurement,
                    noIdentificacion = detail.ProductCode,
                    descripcion = detail.ProductName,
                    valorUnitario = detail.NetPrice,
                    importe = detail.Subtotal
                };
            }

            // TODO: VAT Summaries
            cfd.Impuestos.Traslados [0] = new Mictlanix.CFDv20.ComprobanteImpuestosTraslado {
                impuesto = Mictlanix.CFDv20.ComprobanteImpuestosTrasladoImpuesto.IVA,
                importe = item.Taxes,
                tasa = WebConfig.DefaultVAT * 100m
            };

            return cfd;
        }
Example #14
0
        static Mictlanix.CFDv32.Comprobante ProFactStamp(FiscalDocument item)
        {
            var cfd = SignCFD (item);
            var cli = new ProFactClient (WebConfig.ProFactUser, WebConfig.ProFactUrl);
            var id = string.Format ("{0}-{1:D6}", WebConfig.ProFactCode, item.Id);
            var tfd = cli.Stamp (id, cfd);

            cfd.Complemento = new List<object> ();
            cfd.Complemento.Add (tfd);

            return cfd;
        }
Example #15
0
        // TODO: credentials per taxpayer
        static bool FiscoClicCancel(FiscalDocument item)
        {
            var cli = new FiscoClicClient (WebConfig.FiscoClicUser,
                                           WebConfig.FiscoClicPasswd,
                                           WebConfig.FiscoClicUrl);

            return cli.Cancel (item.Issuer.Id, item.StampId);
        }
        public ActionResult New()
        {
            var store = WebConfig.Store;

            if (store == null) {
                return View ("InvalidStore");
            }

            var item = new FiscalDocument {
                Issuer = store.Taxpayer
            };

            return PartialView ("_Create", item);
        }
Example #17
0
        // TODO: credentials per taxpayer
        static Mictlanix.CFDv32.Comprobante ServisimStamp(FiscalDocument item)
        {
            var cfd = SignCFD (item);
            var cli = new ServisimClient (WebConfig.ServisimUser,
                WebConfig.ServisimPasswd, WebConfig.ServisimUrl);
            var id = string.Format ("{0}-{1:D6}", WebConfig.ServisimPartnerCode, item.Id);
            var timer = new System.Diagnostics.Stopwatch ();

            cli.EndRequest += (object sender, RequestEventArgs e) => {
                timer.Stop ();

                try {
                    string text = "Time: " + timer.ElapsedMilliseconds + " ms\n" +
                                "Request:\n" + e.Request + "\n" +
                                "Response:\n" + e.Response + "\n";
                    string path = HttpContext.Current.Server.MapPath (string.Format (WebConfig.LogFilePattern, id, DateTime.Now));
                    File.WriteAllText (path, text);
                } catch {
                }
            };

            timer.Start ();
            var tfd = cli.Stamp (id, cfd);

            cfd.Complemento = new List<object> ();
            cfd.Complemento.Add (tfd);

            return cfd;
        }
Example #18
0
        // TODO: credentials per taxpayer
        static bool ServisimCancel(FiscalDocument item)
        {
            var cli = new ServisimClient (WebConfig.ServisimUser,
                WebConfig.ServisimPasswd, WebConfig.ServisimUrl);

            return cli.Cancel (item.Issuer.Id, item.StampId);
        }
Example #19
0
        // TODO: credentials per taxpayer
        static Mictlanix.CFDv32.Comprobante FiscoClicStamp(FiscalDocument item)
        {
            var cfd = SignCFD (item);
            var cli = new FiscoClicClient (WebConfig.FiscoClicUser,
                                           WebConfig.FiscoClicPasswd,
                                           WebConfig.FiscoClicUrl);
            var tfd = cli.Stamp (cfd);

            cfd.Complemento = new List<object> ();
            cfd.Complemento.Add (tfd);

            return cfd;
        }
Example #20
0
        static Mictlanix.CFDv32.Comprobante InvoiceToCFDv32(FiscalDocument item)
        {
            var cer = item.Issuer.Certificates.SingleOrDefault (x => x.Id == item.IssuerCertificateNumber);
            var cfd = new CFDv32.Comprobante {
                tipoDeComprobante = (Mictlanix.CFDv32.ComprobanteTipoDeComprobante)FDT2TDC (item.Type),
                noCertificado = item.IssuerCertificateNumber.PadLeft (20, '0'),
                serie = item.Batch,
                folio = item.Serial.ToString (),
                fecha = item.Issued.GetValueOrDefault (),
                metodoDePago = item.PaymentMethod == PaymentMethod.NA ? item.PaymentMethod.GetDisplayName() : string.Format("{0:D2}", (int) item.PaymentMethod),
                NumCtaPago = item.PaymentReference,
                LugarExpedicion = item.IssuedLocation,
                subTotal = item.Subtotal,
                total = item.Total,
                Moneda = item.Currency.GetDisplayName (),
                TipoCambio = item.FormattedValueFor (x => x.ExchangeRate),
                sello = item.IssuerDigitalSeal,
                formaDePago = Resources.SinglePayment,
                certificado = (cer == null ? null : SecurityHelpers.EncodeBase64 (cer.CertificateData)),
                Emisor = new Mictlanix.CFDv32.ComprobanteEmisor {
                    rfc = item.Issuer.Id,
                    nombre = item.IssuerName,
                    RegimenFiscal = new Mictlanix.CFDv32.ComprobanteEmisorRegimenFiscal [1] {
                        new Mictlanix.CFDv32.ComprobanteEmisorRegimenFiscal {
                            Regimen = item.IssuerRegime
                        }
                    },
                    DomicilioFiscal = (item.IssuerAddress == null) ? null : new Mictlanix.CFDv32.t_UbicacionFiscal {
                        calle = item.IssuerAddress.Street,
                        noExterior = item.IssuerAddress.ExteriorNumber,
                        noInterior = item.IssuerAddress.InteriorNumber,
                        colonia = item.IssuerAddress.Neighborhood,
                        codigoPostal = item.IssuerAddress.PostalCode,
                        localidad = item.IssuerAddress.Locality,
                        municipio = item.IssuerAddress.Borough,
                        estado = item.IssuerAddress.State,
                        pais = item.IssuerAddress.Country
                    },
                    ExpedidoEn = (item.IssuedAt == null) ? null : new Mictlanix.CFDv32.t_Ubicacion {
                        calle = item.IssuedAt.Street,
                        noExterior = item.IssuedAt.ExteriorNumber,
                        noInterior = item.IssuedAt.InteriorNumber,
                        colonia = item.IssuedAt.Neighborhood,
                        codigoPostal = item.IssuedAt.PostalCode,
                        localidad = item.IssuedAt.Locality,
                        municipio = item.IssuedAt.Borough,
                        estado = item.IssuedAt.State,
                        pais = item.IssuedAt.Country
                    }
                },
                Receptor = new Mictlanix.CFDv32.ComprobanteReceptor {
                    rfc = item.Recipient,
                    nombre = item.RecipientName,
                    Domicilio = (item.RecipientAddress == null) ? null : new Mictlanix.CFDv32.t_Ubicacion {
                        calle = item.RecipientAddress.Street,
                        noExterior = item.RecipientAddress.ExteriorNumber,
                        noInterior = item.RecipientAddress.InteriorNumber,
                        colonia = item.RecipientAddress.Neighborhood,
                        codigoPostal = item.RecipientAddress.PostalCode,
                        localidad = item.RecipientAddress.Locality,
                        municipio = item.RecipientAddress.Borough,
                        estado = item.RecipientAddress.State,
                        pais = item.RecipientAddress.Country
                    }
                },
                Conceptos = new Mictlanix.CFDv32.ComprobanteConcepto [item.Details.Count],
                Impuestos = new Mictlanix.CFDv32.ComprobanteImpuestos {
                    Traslados = new Mictlanix.CFDv32.ComprobanteImpuestosTraslado [1]
                }
            };

            int i = 0;
            foreach (var detail in item.Details) {
                cfd.Conceptos [i++] = new Mictlanix.CFDv32.ComprobanteConcepto {
                    cantidad = detail.Quantity,
                    unidad = detail.UnitOfMeasurement,
                    noIdentificacion = detail.ProductCode,
                    descripcion = detail.ProductName,
                    valorUnitario = detail.NetPrice,
                    importe = detail.Subtotal
                };
            }

            // TODO: VAT Summaries
            cfd.Impuestos.Traslados [0] = new Mictlanix.CFDv32.ComprobanteImpuestosTraslado {
                impuesto = Mictlanix.CFDv32.ComprobanteImpuestosTrasladoImpuesto.IVA,
                importe = item.Taxes,
                tasa = WebConfig.DefaultVAT * 100m
            };

            cfd.Impuestos.totalImpuestosTrasladados = cfd.Impuestos.Traslados.Sum (x => x.importe);
            cfd.Impuestos.totalImpuestosTrasladadosSpecified = true;

            if (item.RetentionRate > 0m) {
                cfd.Impuestos.Retenciones = new Mictlanix.CFDv32.ComprobanteImpuestosRetencion[] {
                    new Mictlanix.CFDv32.ComprobanteImpuestosRetencion {
                        impuesto = Mictlanix.CFDv32.ComprobanteImpuestosRetencionImpuesto.IVA,
                        importe = item.RetentionTaxes
                    }
                };

                cfd.Impuestos.totalImpuestosRetenidos = cfd.Impuestos.Retenciones.Sum (x => x.importe);
                cfd.Impuestos.totalImpuestosRetenidosSpecified = true;
            }

            return cfd;
        }
Example #21
0
        public static dynamic IssueCFD(FiscalDocument item)
        {
            if (item.Issuer.Scheme == FiscalScheme.CFD) {
                return SignCFD (item);
            }

            switch (item.Provider) {
            case FiscalCertificationProvider.FiscoClic:
                return FiscoClicStamp (item);
            case FiscalCertificationProvider.Servisim:
                return ServisimStamp (item);
            case FiscalCertificationProvider.ProFact:
                return ProFactStamp (item);
            default:
                return null;
            }
        }
Example #22
0
        static bool ProFactCancel(FiscalDocument item)
        {
            var cli = new ProFactClient (WebConfig.ProFactUser, WebConfig.ProFactUrl);

            return cli.Cancel (item.Issuer.Id, item.StampId);
        }
        public ActionResult New(FiscalDocument item)
        {
            TaxpayerBatch batch = null;

            item.Issuer = TaxpayerIssuer.TryFind (item.IssuerId);
            item.Customer = Customer.TryFind (item.CustomerId);
            var recipient = TaxpayerRecipient.TryFind (item.Recipient);

            if (recipient != null) {
                item.Recipient = recipient.Id;
                item.RecipientName = recipient.Name;
            }

            if (item.Issuer != null) {
                batch = item.Issuer.Batches.FirstOrDefault ();
            }

            if (batch == null) {
                ModelState.AddModelError ("IssuerId", Resources.BatchRangeNotFound);
            }

            if (!ModelState.IsValid) {
                return PartialView ("_Create", item);
            }

            // Store
            item.Store = WebConfig.Store;
            item.IssuedAt = item.Store.Address;
            item.IssuedLocation = item.Store.Location;

            // Issuer
            item.IssuerName = item.Issuer.Name;
            item.IssuerRegime = item.Issuer.Regime;
            item.IssuerAddress = item.Issuer.Address;

            // Recipient
            item.RecipientAddress = recipient.Address;

            // Fiscal doc's info
            item.Batch = batch.Batch;
            item.Type = batch.Type;
            item.Currency = WebConfig.BaseCurrency;
            item.ExchangeRate = 1;
            item.PaymentMethod = PaymentMethod.Cash;
            item.PaymentReference = null;
            item.CreationTime = DateTime.Now;
            item.Creator = CurrentUser.Employee;
            item.ModificationTime = item.CreationTime;
            item.Updater = item.Creator;

            using (var scope = new TransactionScope ()) {
                item.CreateAndFlush ();
            }

            return PartialView ("_CreateSuccesful", new FiscalDocument { Id = item.Id });
        }
Example #24
0
        public static dynamic SignCFD(FiscalDocument item)
        {
            var cfd = InvoiceToCFD (item);
            var cer = item.Issuer.Certificates.Single (x => x.Id == item.IssuerCertificateNumber);

            cfd.Sign (cer.KeyData, cer.KeyPassword);

            return cfd;
        }