public void Run()
        {
            try
            {
                Console.WriteLine("----- Inicio del ejemplo PayrollExample -----");


                // Cfdi Incial (debe ser "PPD")
                // -------- Creacion del cfdi en su forma general (sin items / productos) asociados --------
                Cfdi payroll = CreatePayrollModel(facturama);

                // Se manda timbrar mediante Facturama
                Facturama.Models.Response.Cfdi cfdiInicial = facturama.Cfdis.Create(payroll);

                Console.WriteLine("Se creó exitosamente el CFDI de Nómina con el folio fiscal: " + cfdiInicial.Complement.TaxStamp.Uuid);

                // Descarga de los archivos de la Nómina (en este caso se especifica que el tipo de comprobante es "Payroll")
                String filePath = "nomina" + cfdiInicial.Complement.TaxStamp.Uuid;
                facturama.Cfdis.SavePdf(filePath + ".pdf", cfdiInicial.Id, Facturama.Services.CfdiService.InvoiceType.Payroll);
                facturama.Cfdis.SaveXml(filePath + ".xml", cfdiInicial.Id, Facturama.Services.CfdiService.InvoiceType.Payroll);

                // Posibilidad de mandar las nóminas por correo
                Console.WriteLine(facturama.Cfdis.SendByMail(cfdiInicial.Id, "*****@*****.**", null, Facturama.Services.CfdiService.InvoiceType.Payroll));


                Console.WriteLine("----- Fin del ejemplo de PayrollExample -----");
            }
            catch (FacturamaException ex)
            {
                Console.WriteLine(ex.Message);
                foreach (var messageDetail in ex.Model.Details)
                {
                    Console.WriteLine($"{messageDetail.Key}: {string.Join(",", messageDetail.Value)}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error inesperado: ", ex.Message);
            }
        }
Example #2
0
        public void Run()
        {
            try
            {
                Console.WriteLine("----- Inicio del ejemplo PaymentComplementExample -----");

                // Cfdi Incial (debe ser "PPD")
                // -------- Creacion del cfdi en su forma general (sin items / productos) asociados --------
                Facturama.Models.Request.Cfdi cfdi = CreateModelCfdiGeneral(facturama);

                // -------- Agregar los items que lleva el cfdi ( para este ejemplo, se agregan con datos aleatorios) --------
                cfdi = AddItemsToCfdi(facturama, cfdi);

                cfdi.PaymentMethod = "PPD";           // El método de pago del documento inicial debe ser "PPD"

                // Se manda timbrar mediante Facturama
                Facturama.Models.Response.Cfdi cfdiInicial = facturama.Cfdis.Create(cfdi);

                Console.WriteLine("Se creó exitosamente el cfdi Inicial (PPD) con el folio fiscal: " + cfdiInicial.Complement.TaxStamp.Uuid);

                // Descarga de los archivos del documento inicial
                String filePath = "factura" + cfdiInicial.Complement.TaxStamp.Uuid;
                facturama.Cfdis.SavePdf(filePath + ".pdf", cfdiInicial.Id);
                facturama.Cfdis.SaveXml(filePath + ".xml", cfdiInicial.Id);



                // Complemento de pago (debe ser "PUE")
                // Y no lleva "Items" solo especifica el "Complemento"
                Facturama.Models.Request.Cfdi paymentComplementModel = CreateModelCfdiPaymentComplement(facturama, cfdiInicial);


                // Se manda timbrar el complemento de pago mediante Facturama
                Facturama.Models.Response.Cfdi paymentComplement = facturama.Cfdis.Create(paymentComplementModel);

                Console.WriteLine("Se creó exitosamente el complemento de pago con el folio fiscal: " + cfdiInicial.Complement.TaxStamp.Uuid);


                // Descarga de los archivos del documento inicial
                String filePathPayment = "factura" + paymentComplement.Complement.TaxStamp.Uuid;
                facturama.Cfdis.SavePdf(filePath + ".pdf", paymentComplement.Id);
                facturama.Cfdis.SaveXml(filePath + ".xml", paymentComplement.Id);



                // Posibilidad de mandar  los cfdis por coreo ( el cfdiInical y complemento de pago)
                Console.WriteLine(facturama.Cfdis.SendByMail(cfdiInicial.Id, "*****@*****.**"));
                Console.WriteLine(facturama.Cfdis.SendByMail(paymentComplement.Id, "*****@*****.**"));


                Console.WriteLine("----- Fin del ejemplo de PaymentComplementExample -----");
            }
            catch (FacturamaException ex)
            {
                Console.WriteLine(ex.Message);
                foreach (var messageDetail in ex.Model.Details)
                {
                    Console.WriteLine($"{messageDetail.Key}: {string.Join(",", messageDetail.Value)}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error inesperado: ", ex.Message);
            }
        }
Example #3
0
        /**
         * Modelo "Complemento de pago"
         * - Se especifica: la moneda, método de pago, forma de pago, cliente, y lugar de expedición
         */
        private static Facturama.Models.Request.Cfdi CreateModelCfdiPaymentComplement(FacturamaApi facturama, Facturama.Models.Response.Cfdi cfdiInicial)
        {
            Cfdi cfdi = new Cfdi();

            // Lista del catálogo de nombres en el PDF
            var nameForPdf = facturama.Catalogs.NameIds.First(m => m.Value == "14"); // Nombre en el pdf: "Complemento de pago"

            cfdi.NameId = nameForPdf.Value;

            // Receptor de comprobante (se toma como cliente el mismo a quien se emitió el CFDI Inicial),
            String clientRfc = cfdiInicial.Receiver.Rfc;
            Client client    = facturama.Clients.List().Where(p => p.Rfc.Equals(clientRfc)).First();

            Receiver receiver = new Receiver
            {
                CfdiUse = "P01",
                Name    = client.Name,
                Rfc     = client.Rfc
            };

            cfdi.Receiver = receiver;

            // Lugar de expedición (es necesario por lo menos tener una sucursal)
            BranchOffice branchOffice = facturama.BranchOffices.List().First();

            cfdi.ExpeditionPlace = "78240";

            // Fecha y hora de expecidión del comprobante
            //DateTime bindingDate;
            //DateTime.TryParse(cfdiBinding.Date, null, DateTimeStyles.RoundtripKind, out bindingDate);

            cfdi.Date     = null; // Puedes especificar una fecha por ejemplo:  DateTime.Now
            cfdi.CfdiType = CfdiType.Pago;
            // Complemento de pago ---
            Complement complement = new Complement();

            // Pueden representarse más de un pago en un solo CFDI
            List <Facturama.Models.Complements.Payment> lstPagos = new List <Facturama.Models.Complements.Payment>();

            Facturama.Models.Complements.Payment pago = new Facturama.Models.Complements.Payment();

            // Fecha y hora en que se registró el pago en el formato: "yyyy-MM-ddTHH:mm:ss"
            // (la fecha del pago debe ser menor que la fecha en que se emite el CFDI)
            // Para este ejemplo, se considera que  el pago se realizó hace una hora
            pago.Date = DateTime.Now.AddHours(-6).ToString("yyyy-MM-dd HH:mm:ss");


            // Forma de pago (Efectivo, Tarjeta, etc)
            Facturama.Models.Response.Catalogs.CatalogViewModel paymentForm = facturama.Catalogs.PaymentForms.Where(p => p.Name.Equals("Efectivo")).First();
            pago.PaymentForm = paymentForm.Value;

            // Selección de la moneda del catálogo
            // La Moneda, puede ser diferente a la del documento inicial
            // (En el caso de que sea diferente, se debe colocar el tipo de cambio)
            List <CurrencyCatalog> lstCurrencies = facturama.Catalogs.Currencies.ToList();
            CurrencyCatalog        currency      = lstCurrencies.Where(p => p.Value.Equals("MXN")).First();

            pago.Currency = currency.Value;

            // Monto del pago
            // Este monto se puede distribuir entre los documentos relacionados al pago
            pago.Amount = 100.00m;

            // Documentos relacionados con el pago
            // En este ejemplo, los datos se obtiene el cfdiInicial, pero puedes colocar solo los datos
            // aun sin tener el "Objeto" del cfdi Inicial, ya que los valores son del tipo "String"
            List <Facturama.Models.Complements.RelatedDocument> lstRelatedDocuments = new List <Facturama.Models.Complements.RelatedDocument>();

            Facturama.Models.Complements.RelatedDocument relatedDocument = new Facturama.Models.Complements.RelatedDocument
            {
                Uuid                  = cfdiInicial.Complement.TaxStamp.Uuid, // "27568D31-E579-442F-BA77-798CBF30BD7D"
                Serie                 = "A",                                  //cfdiInicial.Serie, // "EA"
                Folio                 = cfdiInicial.Folio,                    // 34853
                Currency              = currency.Value,
                PaymentMethod         = "PUE",                                // En el complemento de pago tiene que ser PUE
                PartialityNumber      = 1,
                PreviousBalanceAmount = 100.00m,
                AmountPaid            = 100.00m
            };
            lstRelatedDocuments.Add(relatedDocument);

            pago.RelatedDocuments = lstRelatedDocuments;

            lstPagos.Add(pago);

            complement.Payments = lstPagos;

            cfdi.Complement = complement;


            return(cfdi);
        }