Ver Mensaje Individual
  #537  
Antiguo 02-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Reputación: 5
bilbur Va por buen camino
PHP Generación del xml

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.
Responder Con Cita