Expand description
§CFDI.rs
Crate para Deserializar un XML de un CFDI en structs nativos en Rust.
§Comprobante
El struct principal es Comprobante. Al igual que en un xml de un CFDI, es el nodo de origen.
Tambien hay structs para otros subnodos del xml, incluyendo sus atributos. Estos incluyen [‘Emisor’], [‘Receptor’] y [‘TimbreFiscalDigital’]
Este crate por el momento solo contempla la estructura más básica de un CFDI. No se intenta generar un modelo completo del estandar de los CFDI 4.0+ Hasta esta versión, solo se implementa el siguient modelo:
|-Comprobante
|-- Emisor
|**-> rfc
|**-> nombre
|**-> regimen_fiscal
|-- Receptor
|**-> rfc
|**-> nombre
|**-> regimen_fiscal
|**-> uso_cfdi
|-- Conceptos
|-- Complemento (opcional) - Incluye TimbreFiscalDigital
|**-> total
|**-> subtotal
|**-> fecha
|**-> forma_de_pago
|**-> descuento
|**-> tipo_comprobante
|**-> forma_de_pago
|-- Representan subnodos
|**-> representan atributos del nodoSin embargo, cualquier persona que necesite más detalle puede revisar el codigo fuente y de ahi basarse para agregar los subnodos que necesite. Realmente no es dificil, pero es un poco tedioso. Si agregan subnodos les agradecería hicieran un Pull Request.
§Ejemplo:
Usando Comprobante:
use cfdi::{DatosPrincipales, get_datos_principales};
let path = ("path/to/file.xml");
let xml_string = std::fs::read_to_string(&path).unwrap();
if let Ok(parsed) = parse_cfdi(&xml_string) {
println!("Emisor: {}, RFC: {}", parsed.emisor.nombre, parsed.emisor.rfc);
println!("Receptor: {}, RFC: {}", parsed.receptor.nombre, parsed.receptor.rfc);
println!("Subtotal: {}", parsed.subtotal);
println!("Total: {}", parsed.total);
println!("Fecha Factura: {}", parsed.fecha);
println!("UUID: {}", parsed.complemento);
println!("Fecha Timbrado: {}", parsed.fecha_timbrado);
// Otros datos no incluidos en [`DatosPrincipales`]:
match &parsed.complemento {
Some(c) => c.timbre_fiscal_digital
.clone()
.map(|tfd| println!("Certificado SAT: {}", tfd.no_certificado_sat),
None => None,
}
}§Datos Principales
DatosPrincipales es un struct que facilita recopilar en 1 solo nivel los principales
atributos del cfdi. Asume que los datos se encuntran correctamente definidos en el cfdi.
Además, no incluye otros datos que a veces ocupan mucho espacio, o simplemente no conviene
estar manejando (ej. Sello, certificado, etc.)
use cfdi::{DatosPrincipales, get_datos_principales};
let path = ("path/to/file.xml");
let xml_string = std::fs::read_to_string(&path).unwrap();
if let Ok(parsed) = parse_cfdi(&xml_string) {
let datos: DatosPrincipales = parsed.get_datos_principales();
println!("Emisor: {}, RFC: {}", datos.emisor_nombre, datos.emisor_rfc);
println!("Receptor: {}, RFC: {}", datos.receptor_nombre, datos.receptor_rfc);
println!("Subtotal: {}", datos.subtotal);
println!("Total: {}", datos.total);
println!("Fecha Factura: {}", datos.fecha);
println!("UUID: {}", datos.get_uuid());
println!("Fecha Timbrado: {}", datos.get_fecha_timbrado());
}Structs§
- Complemento
- Comlemento de la factura. Incluye Timbre Fiscal (si se encuentra)
- Comprobante
- Nodo principal del CFDI. De aqui se pueden obtener todos los demás subnodos.
- Concepto
- Representa un concepto de la factura.
- Conceptos
- Lista de
Concepto - Datos
Principales - Utility Struct - para guardar datos principales de un comprobante en 1 solo struct
- Emisor
- Información del Contribuyente Emisor del Complemento
- Receptor
- Información del Contribuyente Receptor del Complemento
- Timbre
Fiscal Digital - Representa el Timbre Fiscal, incluye el UUID, certificado SAT, etc.
Functions§
- parse_
cfdi - Intenta generar un objeto de tipo
Comprobantea partir de un texto (&str)