Created
August 16, 2012 21:03
-
-
Save pixelead0/3373651 to your computer and use it in GitHub Desktop.
AdminCFD_PHP - Administra archivos de CFD en PHP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| ############################################################################### | |
| # AdminCFD_PHP - Administra archivos de CFD en PHP | |
| # Autor: Adan GQ | |
| # email: adangq@gmail.com | |
| # blog: http://adangq.blogspot.com | |
| # twitter: @pixelead0 | |
| # | |
| # NOTA: Existe una version similar creada en python por @rctorr (Ricardo Torres) disponible en: | |
| # http://rctorr.wordpress.com/2012/08/16/administrar-la-recepcion-de-cfdcfdi-script-que-lee-xml-de-un-comprobante-fistal-digital/ | |
| # | |
| # Descripción | |
| # Este script ayuda a leer una carpeta que contiene CFD's para despues renombrar los archivos con de la siguiente manera: | |
| # Fecha_RFCemisor_serie_folio_subtotal_iva_total.xml | |
| #Donde: | |
| # Fecha: Fecha en que se generó el comprobante | |
| # RFCemisor: RFC de quien emite el cfd/cfdi | |
| # Serie y Folio: Numero de Serie y folio de la factura | |
| # Subtotal, iva, total: Importes de la factura. | |
| ############################################################################### | |
| #ToDo List: | |
| # - Generar un archivo CSV con un delimitador posiblemente ";" (punto y coma) | |
| # - Otros... (lo que se sugiera con el tiempo) | |
| # | |
| ############################################################################### | |
| #Bug Error: | |
| # - En los CFDI version 3.0 no lee los atributos Emisor e Importe, | |
| ############################################################################### | |
| # Ver 1.0.1 | |
| # - Se agrega funcion para leer los archivos dentro de un directorio. | |
| # - Antes de renombrar válida la existencia del XML y PDF. | |
| # - Renombra el archivo xml y pdf con el nuevo nombre formateado | |
| ############################################################################### | |
| # Ver 1.0.0 | |
| # - Se lee el nombre del archivo desde la línea de comando | |
| # - Se leen los atributos del archivo xml | |
| # - Genera el nombre con la sintaxis solicitada | |
| ############################################################################### | |
| $path = "C:\\xampp\\htdocs\\sistemas\\cfd\\files\\"; | |
| leerDirCFD($path); | |
| ############################################################################### | |
| # Funcion: leerDirCFD | |
| # Entrada: Ruta del directorio a leer | |
| # Salida: Sin salida | |
| ############################################################################### | |
| function leerDirCFD($path) { | |
| #Creo un objeto del tipo dir, abriendo el directorio de una vez | |
| $dir = dir($path); | |
| #Muestro informacion de la ruta del directorio | |
| echo 'Leyendo la ruta > ' . $dir->path . ' '; | |
| #Comienza a leer y a mostrar cada uno de los elementos del directorio | |
| while($element = $dir->read()){ | |
| #Convierte a mayustulas para fines de comparación. | |
| $element = strtoupper($element); | |
| #Obtiene la extension del archivo | |
| $ext = strrchr($element,'.'); | |
| #Valida que el archivo sea XML | |
| if (($ext == ".XML")) { | |
| #Obtiene el nombre del archivo sin extension | |
| $nombreArchivo= substr($element,0,-4); | |
| #Agrega la extesion PDF | |
| $nombreArchivoPDF= $nombreArchivo.".PDF"; | |
| #Verifica que exista un archivo con el mismo nombre del XML pero en PDF | |
| # En caso de que exista el XML pero no el PDF, se salta el archivo. | |
| if (file_exists($path.$nombreArchivoPDF)){ | |
| #Leer los atributos del XML y genera nuevo nombre. | |
| $nuevoNombre = leerCFDenXML($path.$element); | |
| echo "<pre> ANTES:".$nombreArchivo."<br>NUEVO XML:". $nuevoNombre.".xml<br>NUEVO PDF:". $nuevoNombre.".pdf</pre>"; | |
| #Renombra archivos XML y PDF con el nuevo nombre | |
| renombraArchivo($nombreArchivo, $nuevoNombre,$path); | |
| } //end if file_exists | |
| } //end of if | |
| } //end of while | |
| $dir->close(); | |
| } //end of leerDirCFD | |
| ############################################################################### | |
| # Funcion: leerCFDenXML | |
| # Lee del XML los atributos del CFD para obtener el nombre formateado | |
| # Entrada: Nombre de Archivo XML | |
| # Salida: Nombre del nuevo archivo con formato | |
| # Fecha_RFCemisor_serie_folio_subtotal_iva_total.xml | |
| ############################################################################### | |
| function leerCFDenXML($filename) { | |
| // $filename = "ejemplo.xml"; | |
| $objejemplo = simplexml_load_file($filename); | |
| echo "<pre>";print_r($objejemplo);echo "</pre>"; | |
| #Convierte objeto en array | |
| $arrejemplo = get_object_vars ($objejemplo); | |
| // echo "<pre>";print_r($arrejemplo);echo "</pre>"; | |
| $fecha = trim ($arrejemplo["@attributes"]['fecha'] ); | |
| $serie = trim ($arrejemplo["@attributes"]['serie'] ); | |
| $folio = trim ($arrejemplo["@attributes"]['folio'] ); | |
| $subTotal=trim ($arrejemplo["@attributes"]['subTotal'] ); | |
| $total = trim ($arrejemplo["@attributes"]['total'] ); | |
| #Formatea la fecha | |
| $fecha = date("Ymd",strtotime($fecha)); | |
| #Convierte objeto Emisor en array | |
| $arrejemplo = get_object_vars ($objejemplo->{'Emisor'}); | |
| // echo "<pre>";print_r($arrejemplo);echo "</pre>"; | |
| $rfc = trim ($arrejemplo["@attributes"]['rfc'] ); | |
| $nombre = trim ($arrejemplo["@attributes"]['nombre'] ); | |
| #Convierte objeto Impuestos en array | |
| $arrejemplo = get_object_vars ($objejemplo->Impuestos); | |
| // echo "<pre>";print_r($arrejemplo);echo "</pre>"; | |
| $iva = trim ($arrejemplo["@attributes"]['totalImpuestosTrasladados']); | |
| // $nombre = $arrejemplo["@attributes"]['nombre']; | |
| #Formatea los valores numericos | |
| $tam_num = 7; | |
| $relleno ='0'; | |
| $subTotal = str_pad($subTotal ,$tam_num,$relleno,STR_PAD_LEFT); | |
| $iva = str_pad($iva ,$tam_num,$relleno,STR_PAD_LEFT); | |
| $total = str_pad($total ,$tam_num,$relleno,STR_PAD_LEFT); | |
| // echo "<pre>";print_r($fecha);echo "</pre>"; | |
| // echo "<pre>";print_r($rfc);echo "</pre>"; | |
| // echo "<pre>";print_r($serie);echo "</pre>"; | |
| // echo "<pre>";print_r($folio);echo "</pre>"; | |
| // echo "<pre>";print_r($nombre);echo "</pre>"; | |
| // echo "<pre>";print_r($subTotal);echo "</pre>"; | |
| // echo "<pre>";print_r($iva);echo "</pre>"; | |
| // echo "<pre>";print_r($total);echo "</pre>"; | |
| $nuevoNombreArchivo =$fecha."_".$rfc."_".$serie.$folio."_".$subTotal."_".$iva."_".$total; | |
| return($nuevoNombreArchivo); | |
| }//end leerCFDenXML | |
| ############################################################################### | |
| # Funcion: renombraArchivo | |
| # Renombra los archivos XML y PDF utilizando la linea de comandos | |
| # Entrada: Nombre de Archivo a Renombrar | |
| # Entrada: Nombre de Archivo Nuevo | |
| # Entrada: Ruta del archivo | |
| # Salida: Sin salida | |
| ############################################################################### | |
| function renombraArchivo($fileOld, $fileNew,$path=""){ | |
| $extension='.xml'; | |
| $comandoRenombra = 'ren "'.$path.$fileOld.$extension.'" "'.$fileNew.$extension."'"; | |
| // echo "<pre>";print_r($comandoRenombra);echo "</pre>"; | |
| shell_exec($comandoRenombra); | |
| $extension='.pdf'; | |
| $comandoRenombra = 'ren "'.$path.$fileOld.$extension.'" "'.$fileNew.$extension."'"; | |
| // echo "<pre>";print_r($comandoRenombra);echo "</pre>"; | |
| shell_exec($comandoRenombra); | |
| }//renombraArchivo | |
| ?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment