Os adjunto lo que tengo hecho para el envío a Gipuzkoa
Este envío es el más sencillo
Más o menos lo que hago es:
- Proceso previo o simultáneo a la emisión y firma de la factura
- En el directorio donde están las facturas firmadas, creo, si no están, los directorios de Envios y Respuestas.
- Si la factura firmada existe en el directorio de facturas firmadas, la envío a TBAI GIP
- Me guardo la respuesta y si es afirmativa muevo la factura firmada al directorio de Envios
<div>
Código PHP:
if($hacienda_foral == 'GIP' && $orden_tbai != '000000') {
$directorio_TBAI = $originales."TBAI/".$cif_340."/";
$directorio_TBAI_envios = $originales."TBAI/".$cif_340."/Envios/";
if (!is_dir($directorio_TBAI_envios)) mkdir($directorio_TBAI_envios, 0777);
$directorio_respuestas = $directorio_TBAI.'Respuestas/';
if (!is_dir($directorio_respuestas)) mkdir($directorio_respuestas, 0777);
$estado_tbai = '';
$xml_enviado_tbai = $orden_tbai.'.xsig';
$guardado_enviar_tbai = $directorio_TBAI.$xml_enviado_tbai;
if (file_exists($guardado_enviar_tbai))
{
$estado_tbai = 'No enviado';
$descripcion_TBAI = $estado_tbai;
$xml = file_get_contents($guardado_enviar_tbai);
$header_soap = array(
"Content-Type: application/xml;charset=utf-8",
"Accept: application/xml",
"Content-length: ".strlen($xml)
);
$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, $url_TBAI );
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 100);
curl_setopt($soap_do, CURLOPT_TIMEOUT, 100);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap_do, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap_do, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($soap_do, CURLOPT_POST, true );
curl_setopt($soap_do, CURLOPT_SSLCERT, getcwd().'/_certificandos'.$alias_pdf.'/'.$cif_340.'.pem' );
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $xml);
curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header_soap);
$response = curl_exec($soap_do);
if(!curl_exec($soap_do)) {
$err = 'Error: ' . curl_error($soap_do);
curl_close($soap_do);
echo "<br>No se puede conectar con la TBAI GIP.<br><br>";
print_r($err);
echo "<br>";
echo "<br><b>Respuesta de la TBAI GIP: 312</b><br><br>";
print_r($response);
} else {
curl_close($soap_do);
$response = preg_replace('/(<\s*)\w+:/','$1',$response); // removes <xxx:
$response = preg_replace('/(<\/\s*)\w+:/','$1',$response); // removes </xxx:
$response = preg_replace('/\s+xmlns:[^>]+/','',$response); // removes xmlns:...
$use_errors = libxml_use_internal_errors(true);
$parser = simplexml_load_string($response);
if ($parser === false) {
echo "<br>No se puede cargar el fichero xml devuelto por la TBA GIP.<br><br>";
echo "<br>";
echo "<br><b>Respuesta de la TBAI GIP:</b><br><br>";
print_r($response);
}
libxml_clear_errors();
libxml_use_internal_errors($use_errors);
if ($parser === false) exit();
$parser->asXML($directorio_respuestas.$orden_tbai.'.xml');
}
$facturas_en_TBAI = $parser;
if ($facturas_en_TBAI === false)
{
echo "<br><b>Respuesta de TBAI parser:</b><br><br>";
print_r ($facturas_en_TBAI);
}
$guardado_enviado_tbai = $directorio_TBAI_envios.$xml_enviado_tbai;
$nodo = $facturas_en_TBAI->Salida;
$Estado = $nodo->Estado;
if($Estado == '00')
rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto
unset($facturas_en_TBAI);
}
} // if($hacienda_foral == 'GIP')
</div>Aparte tengo un script para visualizar la respuesta
En este lo más interesante puede ser la generación de la url del mensaje TBAI para verlo como si se tratara del código QR
Código PHP:
<?php
$directorio_respuestas = $directorio_TBAI.'Respuestas/';
if (!is_dir($directorio_respuestas)) mkdir($directorio_respuestas, 0777);
$directorio_envios = $directorio_TBAI.'Envios/';
if (!is_dir($directorio_envios)) mkdir($directorio_envios, 0777);
$estado_tbai = '';
$xml_enviado_tbai = $orden_tbai.'.xsig';
$guardado_enviado_tbai = $directorio_envios.$xml_enviado_tbai;
if (file_exists($guardado_enviado_tbai))
$estado_tbai = 'Enviado'; else $estado_tbai = 'No enviado';
$descripcion_TBAI = $estado_tbai;
if($estado_tbai == 'Enviado')
{
$msg_TBAI = '';
$xml_actual_enviado = simplexml_load_file($guardado_enviado_tbai);
$signatureNodeActual = $xml_actual_enviado->children('ds', true)->Signature;
$SignatureValueFirmaFacturaActual = $signatureNodeActual->SignatureValue;
$SignatureValueFirmaFacturaActual = substr($SignatureValueFirmaFacturaActual,0,13);
$factura_tbai_serie = $xml_actual_enviado->Factura->CabeceraFactura->SerieFactura;
$factura_tbai_numero = $xml_actual_enviado->Factura->CabeceraFactura->NumFactura;
$factura_tbai_fecha = $xml_actual_enviado->Factura->CabeceraFactura->FechaExpedicionFactura;
$factura_tbai_fecha_dd = substr($factura_tbai_fecha,0,2);
$factura_tbai_fecha_mm = substr($factura_tbai_fecha,3,2);
$factura_tbai_fecha_aa = substr($factura_tbai_fecha,-2);
$factura_tbai_importe = $xml_actual_enviado->Factura->DatosFactura->ImporteTotalFactura;
$TBAIID = 'TBAI'.$caracterSeparador.$cif_340.$caracterSeparador.$factura_tbai_fecha_dd;
$TBAIID .= $factura_tbai_fecha_mm.$factura_tbai_fecha_aa.$caracterSeparador;
$TBAIID .= $SignatureValueFirmaFacturaActual.$caracterSeparador;
$TBAIID = utf8_encode($TBAIID);
$cod_crc8 = crc8($TBAIID);
$TBAIID = $TBAIID.$cod_crc8;
unset($xml_actual_enviado);
$msg_TBAI = $url_TBAI_QR.'?id='.$TBAIID.'&s='.$factura_tbai_serie.'&nf='.$factura_tbai_numero.'&i='.$factura_tbai_importe;
$msg_TBAI = utf8_encode($msg_TBAI);
$cod_crc8 = crc8($msg_TBAI);
$msg_TBAI = $msg_TBAI.'&cr='.$cod_crc8;
$xml_respuesta = $orden_tbai.'.xml';
$guardado_respuesta = $directorio_respuestas.$xml_respuesta;
if (file_exists($guardado_respuesta))
{
$respuesta_tbai = simplexml_load_file($guardado_respuesta);
if ($respuesta_tbai === false) {
$estado_tbai = 'No se puede leer la respuesta de TBAI';
} else {
$estado_tbai = 'Existe respuesta de TBAI';
}
} else {
$estado_tbai = 'No se encuentra la respuesta de TBAI';
$sin_respuesta_tbai = '<?xml version="1.0" encoding="UTF-8"?>';
$sin_respuesta_tbai .= '<Salida></Salida>';
$respuesta_tbai = simplexml_load_string($sin_respuesta_tbai);
}
$descripcion_TBAI = $estado_tbai;
$nodo = $respuesta_tbai->Salida;
$Estado = $nodo->Estado;
$FechaRecepcion = $nodo->FechaRecepcion;
if($Estado == '00')
{
$IdentificadorTBAI = $nodo->IdentificadorTBAI;
$Descripcion = $nodo->Descripcion;
$Descripcion = utf8_decode($Descripcion);
$CSV_tbai = 'CSV: '.$nodo->CSV;
$ResultadosValidacion = $nodo->ResultadosValidacion;
$CodigoRV = $ResultadosValidacion->Codigo;
if($CodigoRV)
$DescripcionRV = $errores_envio_TBAI["$CodigoRV"];
$estado_tbai = 'Correcto';
$descripcion_TBAI = $estado_tbai.': '.$IdentificadorTBAI.' '.$FechaRecepcion.' '.$Descripcion.' '.$CSV_tbai;
if($CodigoRV)
{
$descripcion_TBAI .= ' '.$CodigoRV.' '.$DescripcionRV;
$estado_tbai = 'Aviso';
}
}
if($Estado == '01')
{
$ResultadosValidacion = $nodo->ResultadosValidacion;
$CodigoRV = $ResultadosValidacion->Codigo;
$DescripcionRV = $errores_envio_TBAI["$CodigoRV"];
if(substr($DescripcionRV,0,5) == 'Aviso' || $CodigoRV == '005' )
$estado_tbai = 'Aviso';
else $estado_tbai = 'Rechazado';
$descripcion_TBAI = $estado_tbai.': '.$FechaRecepcion.' '.$CodigoRV.' '.$DescripcionRV;
}
unset($respuesta_tbai);
} // enviado
Tengo, si interesa, la generación del código QR para PDF con la libreria fpdf.
Comentamos ...