<?php
ini_set('error_reporting', E_ALL);
date_default_timezone_set('America/Santiago');

require_once('../lib/tcpdf/tcpdf_barcodes_2d.php');

/* alinear etiquetas xml en una sola linea */
function alinearXML($xml) {
	$xmlt = str_replace("\t", '', $xml);
	$xmlt = str_replace("\n", '', $xmlt);
	$xmlt = str_replace("\r", '', $xmlt);
	return($xmlt);
}

/* formatea el xml para que openssl pueda firmar el documento completo */
function setdtepreformat($xmlstr) {
	// cambiar el schema
	$rep = '<EnvioDTE xmlns="http://www.sii.cl/SiiDte" xmlns:envio="http://www.sii.cl/SiiDte" xmlns:dtee="http://www.sii.cl/SiiDte" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" version="1.0">';
	$xml = preg_replace('/(<EnvioDTE ?.*\">)/im', $rep, $xmlstr);
	
	// agregar namespace a nodos
	// <dte>
	$xml = preg_replace('/(<DTE ?.*\">)/im', '<dtee:DTE version="1.0">', $xml);
	$xml = preg_replace('/(<\/DTE>)/im', '</dtee:DTE>', $xml);
	
	// <signature>
	$xml = preg_replace('/(<Signature ?.*\">)/im', '<dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">', $xml);
	$xml = preg_replace('/(<\/Signature>)/im', '</dsig:Signature>', $xml);
	
	return($xml);
}
/* revertir operacion de setdtepreformat */
function setdtepostformat($xmlstr) {
	// cambiar el schema
	$rep = '<EnvioDTE xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" version="1.0">';
	$xml = preg_replace('/(<EnvioDTE ?.*\">)/im', $rep, $xmlstr);
	
	// agregar namespace a nodos
	// <dte>
	$xml = preg_replace('/(<dtee\:DTE ?.*\">)/im', '<DTE version="1.0">', $xml);
	$xml = preg_replace('/(<\/dtee\:DTE>)/im', '</DTE>', $xml);
	
	// <signature>
	$xml = preg_replace('/(<dsig:Signature ?.*\">)/im', '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">', $xml);
	$xml = preg_replace('/(<\/dsig:Signature>)/im', '</Signature>', $xml);
	
	return($xml);
}

// obtiene id del nodo principal para la firma del documento
function obtIdNodo($xmlstr, $nodo) {
	preg_match('/<'.$nodo.' ID\=\"([^.]*?)\">/ims', $xmlstr, $res);
	if(count($res)>1) {
		$idnodo = $res[1];
	} else {
		$idnodo = "";
	}
	return($idnodo);
}

function arreglarXML($xml) {
	$xmlt = str_replace("\t", '', $xml);
	$xmlt = str_replace("\n", '', $xmlt);
	$xmlt = str_replace("\r", '', $xmlt);
	
	$docf = new DOMDocument("1.0");
	$docf->preserveWhiteSpace = false;
	$docf->formatOutput = true;
	$docf->loadXML($xmlt);
	$xml = $docf->saveXML();
	$xml = str_replace("  ", "\t", $xml);
	
	return($xml);
}

/* Funcion para extraer informacion desde un nodo XML */
function obtValorXML($xml, $var) {
	$dom = new DOMDocument();
	$dom->load($xml);
	$data = array();
	$elements = $dom->getElementsByTagName($var);
	foreach($elements as $node){
		foreach($node->childNodes as $child) {
			$data[] = $child->nodeValue;
		}
	}
	if(count($data) > 0) {
		return($data[0]);
	} else {
		return "";
	}
}
function obtValorXMLstr($xml, $var) {
	$dom = new DOMDocument();
	$dom->loadXML($xml);
	$data = array();
	$elements = $dom->getElementsByTagName($var);
	foreach($elements as $node){
		foreach($node->childNodes as $child) {
			$data[] = $child->nodeValue;
		}
	}
	if(count($data) > 0) {
		return($data[0]);
	} else {
		return "";
	}
}

/* funcion para extraer CAF, omitiendo nodos fuera de éste */
function extraerCAF($xml) {
	$dom = new DOMDocument();
	$dom->load($xml);
	$xmlcaf = $dom->saveXML();
	preg_match('/<CAF(?:\s+[^>]+)?>(.*?)<\/CAF>/ims', $xmlcaf, $caf);
	return($caf[0]);
}

function crearTED($dte, $folio) {
	/* extraer clave privada y certificado */	
	$rsapriv = utf8_decode(obtValorXML($folio, 'RSASK'));
	$rsapubl = utf8_decode(obtValorXML($folio, 'RSAPUBK'));
	
	/* extraer valores desde factura para armar el TED */
	$xml = $dte;
	$re = utf8_decode(obtValorXML($xml, 'RUTEmisor'));
	$td = utf8_decode(obtValorXML($xml, 'TipoDTE'));
	$f = utf8_decode(obtValorXML($xml, 'Folio'));
	$fe = utf8_decode(obtValorXML($xml, 'FchEmis'));
	$rr = utf8_decode(obtValorXML($xml, 'RUTRecep'));
	$rsr = utf8_decode(obtValorXML($xml, 'RznSocRecep'));
	$mnt = utf8_decode(obtValorXML($xml, 'MntTotal'));
	$it = utf8_decode(obtValorXML($xml, 'DscItem'));
	
	$caf = extraerCAF($folio);	// extraer sólo CAF
	$tst = date("Y-m-d\TH:i:s");// timestamp
	
	/* cuerpo DD */
	$xmldd = <<<XML
	<DD>
	<RE>$re</RE>
	<TD>$td</TD>
	<F>$f</F>
	<FE>$fe</FE>
	<RR>$rr</RR>
	<RSR>$rsr</RSR>
	<MNT>$mnt</MNT>
	<IT1>$it</IT1>
	$caf
	<TSTED>$tst</TSTED>
	</DD>
XML;
	
	$xmldd = str_replace("\t", '', $xmldd);
	$xmldd = str_replace("\n", '', $xmldd);
	$xmldd = str_replace("\r", '', $xmldd);
	//header("Content-Type: application/xml");
	//echo $xmldd; exit();
	
	$tiempo = date("YmdHis");
	$keycaf = "./key-".$tiempo.".pem";
	$dd = "./ted-".$tiempo.".xml";
	
	/* guardar archivo key */
	if(file_exists($keycaf) === FALSE) {
		exec("rm -f $keycaf");
	}
	if (!$f = fopen($keycaf, 'w')) {
		echo "No se puede abrir el archivo: $keycaf";
		exit;
	}
	if (fwrite($f, $rsapriv) === FALSE) {
		echo "No se puede escribir al archivo: $keycaf";
		exit;
	}
	fclose($f);
	
	/* guardar dd */
	if(file_exists($dd) === FALSE) {
		exec("rm -f $dd");
	}
	if (!$f = fopen($dd, 'w')) {
		echo "No se puede abrir el archivo: $dd";
		exit;
	}
	if (fwrite($f, $xmldd) === FALSE) {
		echo "No se puede escribir al archivo: $dd";
		exit;
	}
	fclose($f);
	
	// obtener firma del cuerpo dd
	$firma = shell_exec("openssl dgst -sha1 -binary -sign $keycaf $dd | openssl enc -base64");
	// crear nodo dd
	$fmthash = "<FRMT algoritmo=\"SHA1withRSA\">$firma</FRMT>";
	
	// adjuntar DD y hash de DD
	$xmlted = <<<XML
<TED version="1.0">
$xmldd
$fmthash
</TED>
XML;
	// eliminar archivos
	exec("rm -f $dd");
	exec("rm -f $keycaf");
	
	// reformateo de xml (identacion)
	$docf = new DOMDocument("1.0");
	$docf->preserveWhiteSpace = false;
	$docf->formatOutput = true;
	$docf->loadXML($xmlted);
	$xml = $docf->saveXML();
	$xml = str_replace("  ", "\t", $xml);
	
	return($xml);
}
/*
$folio = '../FE/folios/FoliosSII7836698033120141027124.xml';
$dte = 'factura.xml';

$timbre = crearTED($dte, $folio);
// eliminar <?xml>
$timbre = trim(preg_replace('/<\?xml.*\?>/', '', $timbre, 1));
$timbre = alinearXML($timbre);
//echo $timbre;

$barcodeobj = new TCPDF2DBarcode($timbre, 'PDF417,2.5,5');   // agregamos niveles de error en parametros ratio y resolucion
$data = $barcodeobj->getBarcodePNGdata(2, 2, array(0,0,0));			// output the barcode as PNG image  resolucion
 * 
 */
/*
if(file_exists('timbre.png')) {
	unlink('timbre.png');
}*/
/*
$fp = fopen('timbre.png', 'w');
fwrite($fp, $data);
fclose($fp);
//exit();
$fp = fopen('timbre.xml', 'w');
fwrite($fp, $timbre);
fclose($fp);
*/
?>
<!--
 <table width="640" border="0" align="center" cellpadding="0" cellspacing="0">
	<tr>
		<td width="10%" align="center">	<input type="button" name="SalirT" value="SalirT" onClick="fun_salir();"></td>
	</tr>
</table>




 <script>
function fun_salir()
	{
	window.top.open('','_parent','');window.top.close();		
	}
</script>
-->