jueves, 26 de junio de 2014

Sacar campos del XML de CFDI en Ruby

require 'nokogiri'
class Factura
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DEL ENCABEZADO :::::::::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    def AbrirFact()
        f = File.open("fac23861.xml")
        #f = File.open("#{facturaxml}")
        doc = Nokogiri::XML(f)
        @final=doc   
        #@final=doc.remove_namespaces!
    end

    def LugarExpedicion()
        folio=@final.xpath("//@LugarExpedicion").to_s
    end

    def Moneda()
        folio=@final.xpath("//@Moneda").to_s
    end

    def Certificado()
        folio=@final.xpath("//@certificado").to_s
    end

    def Folio()
        folio=@final.xpath("//@folio").to_s
    end

    def FormaDePago()
        folio=@final.xpath("//@formaDePago").to_s
    end       
   
    def MetodoDePago()
        folio=@final.xpath("//@metodoDePago").to_s
    end

    def NoCertificado()
        folio=@final.xpath("//@noCertificado").to_s
    end

    def CondicionesDePago()
        folio=@final.xpath("//@condicionesDePago").to_s
    end

    def Fecha()
        folio=@final.xpath("//@fecha").to_s
    end

    def Sello()
        folio=@final.xpath("//@sello").to_s
    end

    def Serie()
        folio=@final.xpath("//@serie").to_s
    end

    def SubTotal()
        folio=@final.xpath("//@subTotal").to_s
    end

    def TipoDeComprobante()
        folio=@final.xpath("//@tipoDeComprobante").to_s
    end

    def Total()
        folio=@final.xpath("//@total").to_s
    end
   
    def Version()
        folio=@final.xpath("//@version").to_s
    end
   
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DEL EMISOR :::::::::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    def NombreEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor//@nombre')
    end
   
    def RfcEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor//@rfc')
    end

    def CalleEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@calle')
    end
   
    def CodigoPostalEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@codigoPostal')
    end
   
    def ColoniaEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@colonia')
    end
   
    def EstadoEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@estado')
    end

    def MunicipioEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@municipio')
    end
   
    def PaisEmi
        @final.xpath('/cfdi:Comprobante/cfdi:Emisor/cfdi:DomicilioFiscal//@pais')
    end

# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DEL RECEPTOR :::::::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    def NombreRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor//@nombre')
    end

    def RfcRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor//@rfc')
    end

    def CalleRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@calle')
    end

    def CodigoPostalRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@codigoPostal')
    end

    def ColoniaRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@colonia')
    end

    def EstadoRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@estado')
    end

    def MunicipioRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@municipio')
    end

    def PaisRecep
        @final.xpath('/cfdi:Comprobante/cfdi:Receptor/cfdi:Domicilio//@pais')
    end

# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DE LOS CONCEPTOS :::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    def CantidadConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@cantidad')
    end
   
    def DescripcionConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@descripcion')
    end
   
    def ImporteConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@importe')
    end
   
    def NoIdentificacionConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@noIdentificacion')
    end

    def UnidadConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@unidad')
    end

    def ValorUnitarioConcep
        @final.xpath('/cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto//@valorUnitario')
    end
   
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DE LOS IMPUESTOS :::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    #IMPUESTOS TRASLADADOS FACTURA NORMAL
    def ImporteImpuesTras
        @final.xpath('/cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado//@importe')
    end

    def ImpuestoImpuesTras
        @final.xpath('/cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado//@impuesto')
    end

    def TasaImpuesTras
        @final.xpath('/cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado//@tasa')
    end

# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DEL COMPLEMENTO ::::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
   
    #TIMBRE FISCAL
    def VersionTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@version')

    end

    def UUIDTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@UUID')
    end

    def FechaTimbradoTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@FechaTimbrado')
    end

    def SelloCFDTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@selloCFD')
    end

    def NoCertificadoSATTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@noCertificadoSAT')
    end

    def SelloSATTimbFisc
        @final.xpath('/cfdi:Comprobante/cfdi:Complemento//@selloSAT')
    end

# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :::::::::: DATOS DE LA ADDENDA ::::::::::::::::::::::::::::::::::::::::
# :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    def DatoAddenda
        @final.xpath('/cfdi:Comprobante/cfdi:Addenda//@dato')
    end
   
    def TituloAddenda
        @final.xpath('/cfdi:Comprobante/cfdi:Addenda//@titulo')
    end

end

abj = Factura.new()
abj.AbrirFact
#Cuenta cuantos elementos hay en el arreglo

puts abj.LugarExpedicion
puts abj.Moneda
puts abj.Certificado
puts abj.Folio
puts abj.FormaDePago
puts abj.MetodoDePago
puts abj.NoCertificado
puts abj.CondicionesDePago
puts abj.Fecha
puts abj.Sello
puts abj.Serie
puts abj.SubTotal
puts abj.TipoDeComprobante
puts abj.Total
puts abj.Version
puts abj.NombreEmi
puts abj.RfcEmi
puts abj.CalleEmi
puts abj.CodigoPostalEmi
puts abj.ColoniaEmi
puts abj.EstadoEmi
puts abj.MunicipioEmi
puts abj.PaisEmi
puts abj.NombreRecep
puts abj.RfcRecep
puts abj.CalleRecep
puts abj.CodigoPostalRecep
puts abj.ColoniaRecep
puts abj.EstadoRecep
puts abj.MunicipioRecep
puts abj.PaisRecep
puts abj.CantidadConcep
puts abj.DescripcionConcep
puts abj.ImporteConcep
puts abj.NoIdentificacionConcep
puts abj.UnidadConcep
puts abj.ValorUnitarioConcep
puts abj.ImporteImpuesTras
puts abj.ImpuestoImpuesTras
puts abj.TasaImpuesTras
puts abj.VersionTimbFisc
puts abj.UUIDTimbFisc
puts abj.FechaTimbradoTimbFisc
puts abj.SelloCFDTimbFisc
puts abj.NoCertificadoSATTimbFisc
puts abj.SelloSATTimbFisc
puts abj.DatoAddenda
puts abj.TituloAddenda

#Cuenta el total de los elementos del arreglo
puts abj.Addenda.length
#Imprimimos todos los elemnetos del arreglo
abj.Addenda.each do |cantidad|
puts cantidad
end

1 comentario: