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 nodo
Sin 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
Comprobante
a partir de un texto (&str)