Skip to content

Instantly share code, notes, and snippets.

@pixelead0
Created August 16, 2012 21:03
Show Gist options
  • Select an option

  • Save pixelead0/3373651 to your computer and use it in GitHub Desktop.

Select an option

Save pixelead0/3373651 to your computer and use it in GitHub Desktop.
AdminCFD_PHP - Administra archivos de CFD en PHP
<?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