admincfds-01
Y como a partir del 2014 prácticamente el uso de la facturación electrónica se ha vuelto casi obligatorio, he retomando la administración de archivos xml, ya sea para CFD o CFDi, así que al verificar mi script realizado con anterioridad, resulta que no procesa los CFDi de forma correcta, así que a corregir el bug!!!

Ahora que ya conozco la estructura de un archivo xml para un cfdi v3.2 se que los nombres de los nodos van precedidos por la cadena “cfdi:”, así que manos a la obra.

Todas las modificaciones se realizan en la función getAtributos() quedando de la siguiente manera:

    def getAtributos(self):
        """ Regresa los atributos necesario para formar el nombre del archivo. """

        if os.path.isfile(self.nomFileXml):
            xmlDoc = minidom.parse(self.nomFileXml)
            nodes = xmlDoc.childNodes
            comprobante = nodes[0]
            
            compAtrib = dict(comprobante.attributes.items())
            self.atributos['serie'] = compAtrib['serie']
            self.atributos['folio'] = compAtrib['folio']
            # Se trunca la parte de la hora de emisión
            self.atributos['fecha'] = compAtrib['fecha'][:10]
            self.atributos['total'] = compAtrib['total'].rjust(10,'0')
            self.atributos['subTotal'] = compAtrib['subTotal'].rjust(10,'0')
            version = compAtrib['version']

            if version == "2.2" or version == "2.1": # CFD
                emisor = comprobante.getElementsByTagName('Emisor')
                impuestos = comprobante.getElementsByTagName('Impuestos')
            elif version == "3.2" or version == "3.1": # CFDi
                emisor = comprobante.getElementsByTagName('cfdi:Emisor')
                impuestos = comprobante.getElementsByTagName('cfdi:Impuestos')
            else:
                print
                print "El archivo xml no es una versión válida de cfdi!"
                print
                sys.exit(1)
                
            self.atributos['rfc'] = emisor[0].getAttribute('rfc')
            self.atributos['nombre'] = emisor[0].getAttribute('nombre')
            self.atributos['iva'] = impuestos[0].getAttribute('totalImpuestosTrasladados').rjust(10,'0')
        
        return self.atributos

Al ejecutarlo con un archivo cfdi se observa que ahora si es procesado de manera correcta:

$ ./admincfd-1.1.py FA000015.xml




    _       _           _          ____ _____ ____  _     
   / \   __| |_ __ ___ (_)_ __    / ___|  ___|  _ \( )___ 
  / _ \ / _` | '_ ` _ \| | '_ \  | |   | |_  | | | |// __|
 / ___ \ (_| | | | | | | | | | | | |___|  _| | |_| | \__ \
/_/   \_\__,_|_| |_| |_|_|_| |_|  \____|_|   |____/  |___/
                                                          
            
14-01-2014
rictor@cuhrt.com



Renombrando: FA000015.xml a: 2014-01-14_AAA010101AAA_FA_000015_0002940.00_0000470.40_0003410.40.xml

$ ls -lF
2012-04-02_OVI800131GQ6_VAGG_4774_0000257.76_0000041.24_0000299.00.xml
2014-01-14_AAA010101AAA_FA_000015_0002940.00_0000470.40_0003410.40.xml
admincfd-1.0.py
admincfd-1.1.py
CFD_VAGG4774.xml.original
FA000015.xml.original
$ 

Una mejor por hacer sería que no apareciera todo el banner y trabajara como un comando de unix para así poder usarlo para procesamiento por lotes y poder aplicarlo a n cantidad de archivo sin que aparezca el molesto banner (ya hasta a mi me resultó molesto hehehe! y lo bueno es que soy yo, así que prohibido quejarse!)

Y sigo pensando que más podría necesitar?

Y que los CFDi’s estén con ustedes!

Anuncios