Generación previa a su firma
En mi caso sólo vendo bienes, no servicios
La intención es ver la estructura del xml
Código PHP:
$xml = "<?xml version='1.0' encoding='UTF-8'?>";
$xml .= "<T:TicketBai xmlns:T='urn:ticketbai:emision' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd'>";
$xml .= "<Cabecera>";
$xml .= "<IDVersionTBAI>".$versionTB."</IDVersionTBAI>";
$xml .= "</Cabecera>";
$xml .= "<Sujetos>";
$xml .= "<Emisor>";
$xml .= "<NIF>".$cif_emisor."</NIF>";
$xml .= "<ApellidosNombreRazonSocial>".$nomb_emisor."</ApellidosNombreRazonSocial>";
$xml .= "</Emisor>";
if ($ano_cli == 'S') $cif_cli = $nif_simplificado;
// $ano_cli si es fra simplificada $nif_simplificado = 00000000T
$xml .= "<Destinatarios>";
$xml .= "<IDDestinatario>"; // $pai_cli = país del cliente
if($pai_cli != 'ES' && $es_exportacion == 'SI')
{
$xml .= "<IDOtro>";
$xml .= "<CodigoPais>".$pai_cli."</CodigoPais>";
$xml .= "<IDType>06</IDType>";
$xml .= "<ID>".$cif_cli."</ID>";
$xml .= "</IDOtro>";
} elseif($es_intracomunitaria == 'SI')
{
$xml .= "<IDOtro>";
$xml .= "<IDType>02</IDType>";
$xml .= "<ID>".$cif_cli."</ID>";
$xml .= "</IDOtro>";
}
else
$xml .= "<NIF>".$cif_cli."</NIF>";
$xml .= "<ApellidosNombreRazonSocial>".$nomb_cli."</ApellidosNombreRazonSocial>";
$xml .= "<CodigoPostal>".$cpo_cli."</CodigoPostal>";
$ClientAdresse = elimina_acentos($ClientAdresse);
$xml .= "<Direccion>".$ClientAdresse."</Direccion>";
$xml .= "</IDDestinatario>";
$xml .= "</Destinatarios>";
$xml .= "<EmitidaPorTercerosODestinatario>N</EmitidaPorTercerosODestinatario>";
$xml .= "</Sujetos>";
$hora = time();
$hora = (date("H:i:s"));
$xml .= "<Factura>";
$xml .= "<CabeceraFactura>";
$xml .= "<SerieFactura>".$seriefactura."</SerieFactura>";
$xml .= "<NumFactura>".$numero_factura."</NumFactura>";
$xml .= "<FechaExpedicionFactura>".$fecha_factura_TBAI."</FechaExpedicionFactura>";
$xml .= "<HoraExpedicionFactura>".$hora."</HoraExpedicionFactura>";
if($ano_cli == 'S')
$xml .= "<FacturaSimplificada>".$ano_cli."</FacturaSimplificada>";
$xml .= "<FacturaEmitidaSustitucionSimplificada>N</FacturaEmitidaSustitucionSimplificada>";
if($FacturaRectificativa == 'S')
{
$base_ivaR = number_format($bimp_alb*(-1),2,".","");
$imp_ivaR = number_format($iiva_alb*(-1),2,".","");
$imp_reqR = number_format($ire_alb*(-1), 2,".","");
$xml .= "<FacturaRectificativa>";
if($ano_cli == 'S')
$xml .= "<Codigo>R5</Codigo>";
else
$xml .= "<Codigo>R1</Codigo>";
$xml .= "<Tipo>I</Tipo>";
if ($hacienda_foral == 'GIP')
{
$xml .= "<ImporteRectificacionSustitutiva>";
$xml .= "<BaseRectificada>".$base_ivaR."</BaseRectificada>";
$xml .= "<CuotaRectificada>".$imp_ivaR."</CuotaRectificada>";
$xml .= "<CuotaRecargoRectificada>".$imp_reqR."</CuotaRecargoRectificada>";
$xml .= "</ImporteRectificacionSustitutiva>";
}
$xml .= "</FacturaRectificativa>";
$xml .= "<FacturasRectificadasSustituidas>";
$xml .= "<IDFacturaRectificadaSustituida>";
$xml .= "<NumFactura>".$rectifica1."</NumFactura>";
$xml .= "<FechaExpedicionFactura>".$rectifica2."</FechaExpedicionFactura>";
$xml .= "</IDFacturaRectificadaSustituida>";
$xml .= "</FacturasRectificadasSustituidas>";
}
$xml .= "</CabeceraFactura>";
$xml .= "<DatosFactura>";
if($FacturaRectificativa == 'S')
{
$xml .= "<FechaOperacion>".$rectifica2."</FechaOperacion>";
$xml .= "<DescripcionFactura>FACTURA RECTIFICATIVA</DescripcionFactura>";
}
else
{
$xml .= "<FechaOperacion>".$fecha_factura_TBAI."</FechaOperacion>";
$xml .= "<DescripcionFactura>FACTURA DE VENTA</DescripcionFactura>";
}
/////////// detalle factura ////////////////////////
if($enviar_detalle_lineas == 'SI')
{
$xml .= "<DetallesFactura>";
if($lineas_factura)
foreach ($lineas_factura as $clave => $valor)
{
$valor_valor = explode("|",$valor);
$des_art = $valor_valor[1];
$neto_lin = number_format($valor_valor[2],2,".","");
$prec_lin = number_format($valor_valor[3],8,".","");
$impo_lin = $valor_valor[4];
$impo_lin = $impo_lin + $impo_lin*($tipo_iva/100) + $impo_lin*($tipo_req/100);
$impo_lin = number_format($impo_lin,2,".","");
$xml .= "<IDDetalleFactura>";
$des_art = elimina_acentos($des_art);
$des_art = preg_replace("([^ A-Za-z0-9])", "", $des_art);
$xml .= "<DescripcionDetalle>".$des_art."</DescripcionDetalle>";
$xml .= "<Cantidad>".$neto_lin."</Cantidad>";
$xml .= "<ImporteUnitario>".$prec_lin."</ImporteUnitario>";
$xml .= "<ImporteTotal>".$impo_lin."</ImporteTotal>";
$xml .= "</IDDetalleFactura>";
} // fin for
unset($lineas_factura);
$xml .= "</DetallesFactura>";
}
######################### totales
$xml .= "<ImporteTotalFactura>".$total_factura."</ImporteTotalFactura>";
if($retencion)
$xml .= "<RetencionSoportada>".$retencion."</RetencionSoportada>";
$xml .= "<Claves>";
$xml .= "<IDClave>";
$xml .= "<ClaveRegimenIvaOpTrascendencia>".$ClaveRegimenEspecialOTrascendencia."</ClaveRegimenIvaOpTrascendencia>";
$xml .= "</IDClave>";
$xml .= "</Claves>";
$xml .= "</DatosFactura>";
$tipo_iva_m = number_format($tipo_iva,2,".","");
if($tipo_req!=0 && $ire_alb!=0)
$tipo_req_m = number_format($tipo_req,2,".","");
if($es_exportacion == 'SI')
{
$xml .= "<TipoDesglose>";
$xml .= "<DesgloseTipoOperacion>";
$xml .= "<Entrega>";
$xml .= "<Sujeta>";
$xml .= "<Exenta>";
$xml .= "<DetalleExenta>";
$xml .= "<CausaExencion>E2</CausaExencion>";
$xml .= "<BaseImponible>".$base_iva."</BaseImponible>";
$xml .= "</DetalleExenta>";
$xml .= "</Exenta>";
$xml .= "</Sujeta>";
$xml .= "</Entrega>";
$xml .= "</DesgloseTipoOperacion>";
$xml .= "</TipoDesglose>";
}
elseif($es_intracomunitaria == 'SI')
{
$xml .= "<TipoDesglose>";
$xml .= "<DesgloseTipoOperacion>";
$xml .= "<Entrega>";
$xml .= "<Sujeta>";
$xml .= "<Exenta>";
$xml .= "<DetalleExenta>";
$xml .= "<CausaExencion>E5</CausaExencion>";
$xml .= "<BaseImponible>".$base_iva."</BaseImponible>";
$xml .= "</DetalleExenta>";
$xml .= "</Exenta>";
$xml .= "</Sujeta>";
$xml .= "</Entrega>";
$xml .= "</DesgloseTipoOperacion>";
$xml .= "</TipoDesglose>";
} else {
$xml .= "<TipoDesglose>";
$xml .= "<DesgloseFactura>";
$xml .= "<Sujeta>";
$xml .= "<NoExenta>";
$xml .= "<DetalleNoExenta>";
$xml .= "<TipoNoExenta>S1</TipoNoExenta>";
$xml .= "<DesgloseIVA>";
$xml .= "<DetalleIVA>";
$xml .= "<BaseImponible>".$base_iva."</BaseImponible>";
$xml .= "<TipoImpositivo>".$tipo_iva_m."</TipoImpositivo>";
$xml .= "<CuotaImpuesto>".$imp_iva."</CuotaImpuesto>";
if($tipo_req!=0 && $ire_alb!=0)
{
$xml .= "<TipoRecargoEquivalencia>".$tipo_req_m."</TipoRecargoEquivalencia>";
$xml .= "<CuotaRecargoEquivalencia>".$imp_req."</CuotaRecargoEquivalencia>";
}
$xml .= "</DetalleIVA>";
$xml .= "</DesgloseIVA>";
$xml .= "</DetalleNoExenta>";
$xml .= "</NoExenta>";
$xml .= "</Sujeta>";
$xml .= "</DesgloseFactura>";
$xml .= "</TipoDesglose>";
}
$xml .= "</Factura>";
</div>Tened en cuenta u obviad las variables de PHP que vienen de una consulta sql previa
Seguimos con el encadenamiento dentro del mismo script
Busco la factura firmada anterior
Código PHP:
$firmada_anterior = $directorio_TBAI.$factura_anterior;
$file_anterior = $firmada_anterior;
if (file_exists($file_anterior)) {
$xml_anterior = simplexml_load_file($firmada_anterior);
$SerieFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->SerieFactura;
$NumFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->NumFactura;
$FechaExpedicionFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->FechaExpedicionFactura;
$signatureNode = $xml_anterior->children('ds', true)->Signature;
$SignatureValueFirmaFacturaAnterior = $signatureNode->SignatureValue;
} else {
$enviada_anterior = $directorio_TBAI_envios.$factura_anterior;
$file_enviado = $enviada_anterior;
if (file_exists($file_enviado)) {
$xml_anterior = simplexml_load_file($enviada_anterior);
$SerieFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->SerieFactura;
$NumFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->NumFactura;
$FechaExpedicionFacturaAnterior = $xml_anterior->Factura->CabeceraFactura->FechaExpedicionFactura;
$signatureNode = $xml_anterior->children('ds', true)->Signature;
$SignatureValueFirmaFacturaAnterior = $signatureNode->SignatureValue;
} else {
$NumFacturaAnterior = 'Primera factura del ciclo de facturacion';
$SignatureValueFirmaFacturaAnterior = 'Primera factura del ciclo de facturacion';
}
}
$SignatureValueFirmaFacturaAnterior = substr($SignatureValueFirmaFacturaAnterior,0,100);
$xml .= "<HuellaTBAI>";
$xml .= "<EncadenamientoFacturaAnterior>";
$xml .= "<SerieFacturaAnterior>".$SerieFacturaAnterior."</SerieFacturaAnterior>";
$xml .= "<NumFacturaAnterior>".$NumFacturaAnterior."</NumFacturaAnterior>";
$xml .= "<FechaExpedicionFacturaAnterior>".$FechaExpedicionFacturaAnterior."</FechaExpedicionFacturaAnterior>";
$xml .= "<SignatureValueFirmaFacturaAnterior>".$SignatureValueFirmaFacturaAnterior."</SignatureValueFirmaFacturaAnterior>";
$xml .= "</EncadenamientoFacturaAnterior>";
$xml .= "<Software>";
$xml .= "<LicenciaTBAI>".$LicenciaTBAI."</LicenciaTBAI>";
$xml .= "<EntidadDesarrolladora>";
$xml .= "<NIF>".$nif_fabricante."</NIF>";
$xml .= "</EntidadDesarrolladora>";
$xml .= "<Nombre>".$SoftwareNombre."</Nombre>";
$xml .= "<Version>".$SoftwareVersion."</Version>";
$xml .= "</Software>";
$xml .= "<NumSerieDispositivo>".$NumSerieDispositivo_TBAI."</NumSerieDispositivo>";
$xml .= "</HuellaTBAI>";
$xml .= "</T:TicketBai>";
Fima del xml que detallaré más adelante en otro envío
Código PHP:
$guardar_como = $tbai_alb.'.xsig';
require_once($_SERVER['DOCUMENT_ROOT'].'/xxxxxx/ticketBAI/src/XmlTools.php' );
require_once($_SERVER['DOCUMENT_ROOT'].'/xxxxxx/ticketBAI/src/firmador.php' );
$dir_cert = ($_SERVER['DOCUMENT_ROOT'].'/infoxxxxrmix/_certificandos'.$alias_pdf.'/xxxxxxx.pfx' );
$fac = new Firmador();
$xmlF = $fac -> firmar($dir_cert,$cal_cert, $xml, $hacienda_foral);
$directorio_ventas = $directorio_TBAI.$guardar_como;
file_put_contents($directorio_ventas, $xmlF);
</div>
Queda enviar el desarrollo de la firma donde intervienen XmlTools.php, firmador.php y el certificado de firma y su clave.