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); } }
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); } }
/** * 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); }