<?php
/**
 * Description of Empaquetar
 *
 * @author yerko      MCC  19-03-15
 */

class Empaquetar {
    
    var $sRutSII='60803000-K';
    var $sFechaResolucion;
    var $sNumeroResolucion;
    var $sRutEmisor;
    var $sRutEnvia;
    var $documentos;
    var $sXmlEnvio;
    var $arrXmlEnviar;
    var $pkRuta;
    var $pkPass;
    var $tipoDoc;
    
    public function __construct($docs) {
        $this->documentos=$docs;
    }
    
    public function Empaqueta() {
        $this->generaDocEnviar();
       echo "<pre>";
       echo '<a href="'.$this->arrXmlEnviar['archivo'].'">'.$this->arrXmlEnviar['archivo'].'</a>';//exit();
    }
    
    function generarXmlCaratulaDTE(){
         $sl=chr(10);
         $initTab=chr(9);
         $tab=chr(9).$initTab;
         $dbltab=chr(9).chr(9).$initTab;
         
         foreach ($this->documentos as $docs){
             if(isset($arrtipoDTE[$docs["tipoDTE"]]["cantidad"]))$arrtipoDTE[$docs["tipoDTE"]]["cantidad"]++;
             else $arrtipoDTE[$docs["tipoDTE"]]["cantidad"] = 1 ;
         }
         
        // print_r($arrtipoDTE);
         
         $sSubTotDTE ='';
         
         foreach ($arrtipoDTE as $tipoDTE => $cantidad) {
             $sSubTotDTE.=$tab.'<SubTotDTE>'.$sl.
                        $dbltab.'<TpoDTE>'.$tipoDTE.'</TpoDTE>'.$sl.
                        $dbltab.'<NroDTE>'.$cantidad["cantidad"].'</NroDTE>'.$sl.
                    $tab.'</SubTotDTE>'.$sl;
         }
         
                           
         $sXml=$initTab.'<Caratula version="1.0">'.$sl.
                    $tab.'<RutEmisor>'.$this->sRutEmisor.'</RutEmisor>'.$sl.
                    $tab.'<RutEnvia>'.$this->sRutEnvia.'</RutEnvia>'.$sl.
                    $tab.'<RutReceptor>'.$this->sRutSII.'</RutReceptor>'.$sl.
                    $tab.'<FchResol>'.$this->sFechaResolucion.'</FchResol>'.$sl.
                    $tab.'<NroResol>'.$this->sNumeroResolucion.'</NroResol>'.$sl.
                    $tab.'<TmstFirmaEnv>'.date('Y-m-d').'T'.date('H:i:s').'</TmstFirmaEnv>'.$sl.
                    $sSubTotDTE.
                $initTab.'</Caratula>';
         return $sXml;
     }
     
     function generaStrEnvio() {
        $sl=chr(10);
        $sXmlDTESign='';
        
        foreach ($this->documentos as $docs) 
		{
		//echo ($docs["tipoDTE"]); //exit();
		
            if( $docs["tipoDTE"]=="COMPRA" || $docs["tipoDTE"]=="VENTA" || $docs["tipoDTE"]=="GUIAS" || $docs["tipoDTE"]=="BOLETAS" )
			{
                $this->tipoDoc = "LIBRO";
                $sXmlDTESign.=str_replace('<?xml version="1.0" encoding="UTF-8"?>'.chr(10), chr(10), file_get_contents($docs['rutaFirmado'])).$sl;
                $sXmlDTESign=str_replace('</EnvioLibro>'.chr(10), '<TmstFirma>'.date('Y-m-d').'T'.date('H:i:s').'</TmstFirma>'.chr(10).'</EnvioLibro>'.chr(10), $sXmlDTESign);
            }
          
			else
			{
			 if( $docs["tipoDTE"]=="39" )
			 {
                $this->tipoDoc = "BOLETA";
                $sXmlDTESign.=str_replace('<?xml version="1.0"?>'.chr(10), chr(10), file_get_contents($docs['rutaFirmado'])).$sl;
			 }
             else 
			 {
			    $this->tipoDoc = "DTE";
                $sXmlDTESign.=str_replace('<?xml version="1.0"?>'.chr(10), chr(10), file_get_contents($docs['rutaFirmado'])).$sl;
				}
            }
        }
	//*************************************
		
        if( $docs["tipoDTE"]=="COMPRA" || $docs["tipoDTE"]=="VENTA" )
		{
            $this->sXmlEnvio=utf8_decode('<?xml version="1.0" encoding="ISO-8859-1"?>'.
                    '<LibroCompraVenta xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://www.sii.cl/SiiDte LibroCV_v10.xsd">'.$sl.
                            $sXmlDTESign.    
                    '</LibroCompraVenta>');
        }
        elseif(  $docs["tipoDTE"]=="GUIAS" )
		 {
            $this->sXmlEnvio=utf8_decode('<?xml version="1.0" encoding="ISO-8859-1"?>'.
                    '<LibroGuia xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://www.sii.cl/SiiDte LibroGuia_v10.xsd">'.$sl.
                            $sXmlDTESign.    
                    '</LibroGuia>');
		 }		
		 elseif(  $docs["tipoDTE"]=="BOLETAS" )
		 {
            $this->sXmlEnvio=utf8_decode('<?xml version="1.0" encoding="ISO-8859-1"?>'.
                    '<LibroBoleta xmlns="http://www.sii.cl/SiiDte" version="1.0" xsi:schemaLocation="http://www.sii.cl/SiiDte LibroBOLETA_v10.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'.$sl.
                            $sXmlDTESign.    
                    '</LibroBoleta>');			
        }
        
		else
        {  if (  $docs["tipoDTE"]=="39" )
		    {
		$this->sXmlEnvio=utf8_decode('<?xml version="1.0" encoding="ISO-8859-1"?>'.$sl.
                    '<EnvioBOLETA version="1.0" xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioBOLETA_v11.xsd">'.$sl.
                    '<SetDTE ID="SetDoc">'.$sl.
                            $this->generarXmlCaratulaDTE().
                            $sXmlDTESign.
                    '</SetDTE>'.$sl.    
                    '</EnvioBOLETA>');
					}
					else
					{
		
            $this->sXmlEnvio=utf8_decode('<?xml version="1.0" encoding="ISO-8859-1"?>'.$sl.
                    '<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">'.$sl.
                    '<SetDTE ID="SetDoc">'.$sl.
                            $this->generarXmlCaratulaDTE().
                            $sXmlDTESign.
                    '</SetDTE>'.$sl.    
                    '</EnvioDTE>');
					}
        }
     }
     
     function generaDocEnviar()
	 {
        $this->generaStrEnvio();
        $estaFirma = new Firmar(); 
        $estaFirma->pkRuta = $this->pkRuta;
        $estaFirma->pkPass = $this->pkPass;
        
        $arrPKCertificado = $estaFirma->staticGetArrayPrivateKey() ;
        switch ($this->tipoDoc)
        {
           
            case "DTE":
                $this->arrXmlEnviar=$estaFirma->singXmlString($this->sXmlEnvio, $arrPKCertificado, array('node'=>'SetDTE', 'ruta'=>'../DOC/ENVIO/', 'archivo'=>  str_replace('.xml', '_', $this->documentos[0]["nombre"]).'mail.xml'));
                break;
             case "39":
                $this->arrXmlEnviar=$estaFirma->singXmlString($this->sXmlEnvio, $arrPKCertificado, array('node'=>'SetDTE', 'ruta'=>'../DOC/ENVIO/', 'archivo'=>  str_replace('.xml', '_', $this->documentos[0]["nombre"]).'BOLETAmail.xml'));
                break;
								
            case "LIBRO":
                $this->arrXmlEnviar=$estaFirma->singXmlString($this->sXmlEnvio, $arrPKCertificado, array('node'=>'EnvioLibro', 'ruta'=>'../DOC/ENVIO/'));
                break;
            
            default :
                $this->arrXmlEnviar=$estaFirma->singXmlString($this->sXmlEnvio, $arrPKCertificado, array('node'=>'SetDTE', 'ruta'=>'../DOC/ENVIO/'));
                break;
        }
        /*********** COMPRUEBA LA FIRMA ***********************************************/
		
        $arrComp=$this->compruebaXmlEnvioDTE();
		//$arrComp=$this->compruebaXmlEnvioBOLETA();
        
     }
/******* FUNCION QUE COMPRUEBA LA VALIDEZ DE UN ENVIO, SEGUN SCHEMA ***********/    
    
    function compruebaXmlEnvioDTE(){ 
        
        libxml_use_internal_errors(true);
        $aRet['success']=false;
        $aRet['error']='';
        $sSchemaEnvioDTE='./DTE/EnvioDTE_v10.xsd';

        $oDoc = new DOMDocument(); 
        $oDoc->load($this->arrXmlEnviar['archivo']);


       if ($oDoc->schemaValidate($sSchemaEnvioDTE)){
           $aRet['success']=true;
       }else{
           $aRet['error'].=$this->obtieneErroresSchema();
       }


       return $aRet;        
    }     

      function compruebaXmlEnvioBOLETA(){ 
        
        libxml_use_internal_errors(true);
        $aRet['success']=false;
        $aRet['error']='';
        $sSchemaEnvioDTE='./DTE/EnvioBoleta_v11.xsd';

        $oDoc = new DOMDocument(); 
        $oDoc->load($this->arrXmlEnviar['archivo']);


       if ($oDoc->schemaValidate($sSchemaEnvioDTE)){
           $aRet['success']=true;
       }else{
           $aRet['error'].=$this->obtieneErroresSchema();
       }


       return $aRet;        
    }     
    function obtieneErroresSchema(){
         $sError='';
         $errors = libxml_get_errors();
         foreach ($errors as $error) {
           $sError.=$this->getErrorsValiteSchema($error);
         }
         libxml_clear_errors();
         return $sError;
     }
     
     function getErrorsValiteSchema($error){
            $return = "<br/>\n";
            switch ($error->level) {
                case LIBXML_ERR_WARNING:
                    $return .= "<b>Warning $error->code</b>: ";
                    break;
                case LIBXML_ERR_ERROR:
                    $return .= "<b>Error $error->code</b>: ";
                    break;
                case LIBXML_ERR_FATAL:
                    $return .= "<b>Fatal Error $error->code</b>: ";
                    break;
            }
            
            $return .= trim($error->message);
            $return .= " en linea <b>$error->line</b>\n";

            return $return;
     }
}
