estoy tratando de guardar en una variable todo lo almacenado en el arbol xml en una variable para luego imprimirla invocando la funcion, pero no lo guarda en la variable, que sera el problema?
Código PHP:
function satxmlsv2($arr, $edidata=false, $dir="./tmp/",$nodo="",$esquemas=true) {
// {{{ Parametros generales
global $xml, $cadena_original, $conn;
error_reporting(E_ALL);
$cadena_original='||';
$noatt= array();
$nufa = $arr['serie'].$arr['folio']; // Junta el numero de factura serie + folio
// }}}
// {{{ Datos generales del Comprobante
$xml = new DOMdocument("1.0","UTF-8");
$root = $xml->createElement("Comprobante");
$root = $xml->appendChild($root);
if ($esquemas==true) {
# 7/Dic/2006 porque los necios de Levicom (para chedraui) no quieren estos elmentos, dicen
# que su validador lo agrega
cargaAtt($root, array("xmlns"=>"http://www.sat.gob.mx/cfd/2",
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation"=>"http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"
)
);
}
cargaAtt($root, array("version"=>"2.0",
"serie"=>"A",
"folio"=>"001",
"fecha"=>xml_fech($arr['fecha']),
"sello"=>"aaa010101aaa_CSD_09",
"noAprobacion"=>$arr['noAprobacion'],
"anoAprobacion"=>$arr['anoAprobacion'],
"tipoDeComprobante"=>$arr['tipoDeComprobante'],
"formaDePago"=>$arr['formaDePago'],
"noCertificado"=>$arr['noCertificado'],
"certificado"=>"aaa010101aaa_CSD_09",
"subTotal"=>$arr['subTotal'],
"total"=>$arr['total']
)
);
// }}}
// {{{ Datos del Emisor
$emisor = $xml->createElement("Emisor");
$emisor = $root->appendChild($emisor);
cargaAtt($emisor, array("rfc"=>$arr['Emisor']['rfc'],
"nombre"=>$arr['Emisor']['nombre']
)
);
$domfis = $xml->createElement("DomicilioFiscal");
$domfis = $emisor->appendChild($domfis);
cargaAtt($domfis, array("calle"=>"CARLOS B. ZETINA",
"noExterior"=>"80",
"noInterior"=>"",
"colonia"=>"INDUSTRIAL XALOSTOC",
"localidad"=>"ECATEPEC DE MORELOS",
"municipio"=>"ECATEPEC",
"estado"=>"MEXICO",
"pais"=>"MEXICO",
"codigoPostal"=>"55348"
)
);
$expedido = $xml->createElement("ExpedidoEn");
$expedido = $emisor->appendChild($expedido);
cargaAtt($expedido, array("calle"=>$arr['Emisor']['ExpedidoEn']['calle'],
"noExterior"=>$arr['Emisor']['ExpedidoEn']['noExterior'],
"noInterior"=>$arr['Emisor']['ExpedidoEn']['noInterior'],
"localidad"=>$arr['Emisor']['ExpedidoEn']['localidad'],
"municipio"=>$arr['Emisor']['ExpedidoEn']['municipio'],
"estado"=>$arr['Emisor']['ExpedidoEn']['estado'],
"pais"=>$arr['Emisor']['ExpedidoEn']['pais'],
"codigoPostal"=>$arr['Emisor']['ExpedidoEn']['codigoPostal']
)
);
// }}}
// {{{ Datos del Receptor
$receptor = $xml->createElement("Receptor");
$receptor = $root->appendChild($receptor);
cargaAtt($receptor, array("rfc"=>$arr['Receptor']['rfc'],
"nombre"=>$arr['Receptor']['nombre']
)
);
$domicilio = $xml->createElement("Domicilio");
$domicilio = $receptor->appendChild($domicilio);
cargaAtt($domicilio, array("calle"=>$arr['Receptor']['Domicilio']['calle'],
"noExterior"=>$arr['Receptor']['Domicilio']['noExterior'],
"noInterior"=>$arr['Receptor']['Domicilio']['noInterior'],
"colonia"=>$arr['Receptor']['Domicilio']['colonia'],
"localidad"=>$arr['Receptor']['Domicilio']['localidad'],
"municipio"=>$arr['Receptor']['Domicilio']['municipio'],
"estado"=>$arr['Receptor']['Domicilio']['estado'],
"pais"=>$arr['Receptor']['Domicilio']['pais'],
"codigoPostal"=>$arr['Receptor']['Domicilio']['codigoPostal'],
)
);
// }}}
// {{{ Detalle de los conceptos/produtos de la factura
$conceptos = $xml->createElement("Conceptos");
$conceptos = $root->appendChild($conceptos);
for ($i=1; $i<=sizeof($arr['Conceptos']); $i++) {
$concepto = $xml->createElement("Concepto");
$concepto = $conceptos->appendChild($concepto);
cargaAtt($concepto, array("cantidad"=>$arr['Conceptos'][$i]['cantidad'],
"descripcion"=>$arr['Conceptos'][$i]['descripcion'],
"valorUnitario"=>round($arr['Conceptos'][$i]['valorUnitario'],2),
"importe"=>$arr['Conceptos'][$i]['importe'],
)
);
}
// }}}
// {{{ Impuesto (IVA)
$impuestos = $xml->createElement("Impuestos");
$impuestos = $root->appendChild($impuestos);
# 7/ago/2006 Ojoj, no confundir tasa 0 con excento
if (isset($arr['Traslados']['importe'])) {
$traslados = $xml->createElement("Traslados");
$traslados = $impuestos->appendChild($traslados);
$traslado = $xml->createElement("Traslado");
$traslado = $traslados->appendChild($traslado);
cargaAtt($traslado, array("impuesto"=>$arr['Traslados']['impuesto'],
"tasa"=>$arr['Traslados']['tasa'],
"importe"=>$arr['Traslados']['importe']
)
);
}
// }}}
// {{{ Calculo de sello
$cadena_original .= "|"; // termina la cadena original con el doble ||
$certificado = $arr['noCertificado'];
$maquina = trim(`uname -n`);
$ruta = ($maquina == "www.augustino.net") ? "./" : "./";
$file=$ruta.$certificado."aaa010101aaa_CSD_09.key.pem"; // Ruta al archivo
$pkeyid = openssl_get_privatekey(file_get_contents($file));
openssl_sign($cadena_original, $crypttext, $pkeyid, OPENSSL_ALGO_MD5);
openssl_free_key($pkeyid);
$sello = base64_encode($crypttext); // lo codifica en formato base64
$root->setAttribute("sello",$sello);
$file=$ruta.$certificado."aaa010101aaa_CSD_09.cer.pem"; // Ruta al archivo
$datos = file($file);
$certificado = ""; $carga=false;
for ($i=0; $i<sizeof($datos); $i++) {
if (strstr($datos[$i],"END CERTIFICATE")) $carga=false;
if ($carga) $certificado .= trim($datos[$i]);
if (strstr($datos[$i],"BEGIN CERTIFICATE")) $carga=true;
}
$root->setAttribute("certificado",$certificado);
// }}}
// {{{ Addenda si se requiere
if ($edidata) {
$Addenda = $xml->createElement("Addenda");
// $Addenda->setAttribute("xmlns:foo","http://www.amece.org.mx/cfd/documento");
$Addenda = $root->appendChild($Addenda);
if (substr($edidata,0,5) == "<?xml") {
// Es XML por ejemplo Soriana
$smp = simplexml_load_string($edidata);
$Documento = dom_import_simplexml($smp);
$Documento = $xml->importNode($Documento, true);
} else {
if ($nodo=="") {
// Va el EDIDATA directo sin nodo adiconal. por ejemplo Corvi
$Documento = $xml->createTextNode(utf8_encode($edidata));
} else {
// Va el EDIDATA dentro de un nodo. por ejemplo Walmart
$Documento = $xml->createElement($nodo,utf8_encode($edidata));
}
}
$Documento = $Addenda->appendChild($Documento);
}
// }}}
// {{{ Genera un archivo de texto con el mensaje XML + EDI O lo guarda en cfdsello
$xml->formatOutput = true;
$todo = $xml->saveXML();
/*
if ($dir != "/dev/null") {
$xml->formatOutput = true;
$xml->saveXML();
}
*/
/*else {
$conn->replace("cfdsello",array("selldocu"=>$nufa),"selldocu",true);
$where=" selldocu = '$nufa'";
$conn->UpdateBlob("cfdsello","sellcade",$cadena_original,$where,'TEXT');
$conn->UpdateBlob("cfdsello","sellxml",$todo,$where,'TEXT');
}*/
// }}}
return($todo);
}
// {{{ Funcion que carga los atributos a la etiqueta XML
function cargaAtt(&$nodo, $attr) {
// +-------------------------------------------------------------------------------+
// | Ademas le concatena a la variable global los valores para la cadena origianl |
// +-------------------------------------------------------------------------------+
global $xml, $cadena_original;
$quitar = array('sello'=>1,'noCertificado'=>1,'certificado'=>1);
foreach ($attr as $key => $val) {
$val = preg_replace('/\s\s+/', ' ', $val); // Regla 5a y 5c
$val = trim($val); // Regla 5b
if (strlen($val)>0) { // Regla 6
$val = utf8_encode(str_replace("|","/",$val)); // Regla 1
$nodo->setAttribute($key,$val);
if (!isset($quitar[$key]))
if (substr($key,0,3) != "xml" &&
substr($key,0,4) != "xsi:")
$cadena_original .= $val . "|";
}
}
}
// }}}
// {{{ Formateo de la fecha en el formato XML requerido (ISO)
function xml_fech($fech) {
$ano = substr($fech,0,4);
$mes = substr($fech,4,2);
$dia = substr($fech,6,2);
$hor = substr($fech,8,2);
$min = substr($fech,10,2);
$seg = substr($fech,12,2);
$aux = $ano."-".$mes."-".$dia."T".$hor.":".$min.":".$seg;
return ($aux);
}
$resultado=satxmlsv2($arr, $edidata=false, $dir="./tmp/",$nodo="",$esquemas=true);
echo $resultado;
$todo = $xml->saveXML();
$xml->saveXML();
que loco no?, jejeje