/**
  * Método que selecciona la empresa con la que se trabajará en el módulo DTE
  * @param rut Si se pasa un RUT se tratará de seleccionar
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-19
  */
 public function seleccionar($rut = null)
 {
     $referer = \sowerphp\core\Model_Datasource_Session::read('referer');
     // si se está pidiendo una empresa en particular se tratará de usar
     if ($rut) {
         $Emisor = new Model_Contribuyente($rut);
         if (!$Emisor->exists()) {
             \sowerphp\core\Model_Datasource_Session::message('Empresa solicitada no existe', 'error');
             $this->redirect($this->request->request);
         }
         if (!$Emisor->usuarioAutorizado($this->Auth->User->id)) {
             \sowerphp\core\Model_Datasource_Session::message('No está autorizado a operar con la empresa solicitada', 'error');
             $this->redirect('/dte/contribuyentes/seleccionar');
         }
         \sowerphp\core\Model_Datasource_Session::message('Desde ahora estará operando con ' . $Emisor->razon_social);
     } else {
         // si hay una empresa forzada a través de la configuración se crea
         $empresa = \sowerphp\core\Configure::read('dte.empresa');
         if ($empresa) {
             $Emisor = new Model_Contribuyente();
             $Emisor->set($empresa);
             \sowerphp\core\Model_Datasource_Session::message();
             // borrar mensaje de sesión si había
         }
     }
     // si se llegó acá con un emisor se guarda en la sesión
     if (isset($Emisor)) {
         $this->setContribuyente($Emisor);
         // redireccionar
         if ($referer) {
             \sowerphp\core\Model_Datasource_Session::delete('referer');
         } else {
             $referer = '/dte';
         }
         $this->redirect($referer);
     }
     // asignar variables para la vista
     $this->set(['empresas' => (new Model_Contribuyentes())->getByUsuario($this->Auth->User->id)]);
 }
 /**
  * Acción que permite la generación del XML del EnvioDTE a partir de los
  * datos en JSON
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-20
  */
 public function generar_xml()
 {
     // definir plantillas de dte
     $dir = DIR_PROJECT . '/data/plantillas_dte';
     $files = scandir($dir);
     foreach ($files as $file) {
         if ($file[0] == '.') {
             continue;
         }
         $f = substr($file, 0, -5);
         $md5 = md5($f);
         $plantillas_dte[$md5] = base64_encode(file_get_contents($dir . '/' . $file));
         $plantillas_dte_options[$md5] = $f;
     }
     // variables para el formulario
     $documentos_json = \sowerphp\core\Model_Datasource_Session::read('documentos_json');
     if ($documentos_json) {
         \sowerphp\core\Model_Datasource_Session::delete('documentos_json');
     }
     $this->set(['_header_extra' => ['js' => ['/js/utilidades.js', '/dte/js/dte.js']], 'actividades_economicas' => (new \website\Sistema\General\Model_ActividadEconomicas())->getList(), 'comunas' => (new \sowerphp\app\Sistema\General\DivisionGeopolitica\Model_Comunas())->getList(), 'plantillas_dte' => $plantillas_dte, 'plantillas_dte_options' => $plantillas_dte_options, 'documentos_json' => $documentos_json]);
     // generar xml
     if (isset($_POST['submit'])) {
         // datos del emisor
         $Emisor = [];
         foreach (['RUTEmisor', 'RznSoc', 'GiroEmis', 'Acteco', 'DirOrigen', 'CmnaOrigen', 'Telefono', 'CorreoEmisor', 'CdgSIISucur'] as $attr) {
             if (!empty($_POST[$attr])) {
                 $Emisor[$attr] = $_POST[$attr];
             }
         }
         foreach (['RUTEmisor', 'RznSoc', 'GiroEmis', 'Acteco', 'DirOrigen', 'CmnaOrigen'] as $attr) {
             if (empty($Emisor[$attr])) {
                 \sowerphp\core\Model_Datasource_Session::message('Debe especificar el campo ' . $attr, 'error');
                 return;
             }
         }
         $Emisor['CmnaOrigen'] = (new \sowerphp\app\Sistema\General\DivisionGeopolitica\Model_Comuna($Emisor['CmnaOrigen']))->comuna;
         // datos del receptor
         $Receptor = [];
         foreach (['RUTRecep', 'RznSocRecep', 'GiroRecep', 'DirRecep', 'CmnaRecep', 'Contacto', 'CorreoRecep'] as $attr) {
             if (!empty($_POST[$attr])) {
                 $Receptor[$attr] = $_POST[$attr];
             }
         }
         foreach (['RUTRecep', 'RznSocRecep', 'GiroRecep', 'DirRecep', 'CmnaRecep'] as $attr) {
             if (empty($Receptor[$attr])) {
                 \sowerphp\core\Model_Datasource_Session::message('Debe especificar el campo ' . $attr, 'error');
                 return;
             }
         }
         $Receptor['CmnaRecep'] = (new \sowerphp\app\Sistema\General\DivisionGeopolitica\Model_Comuna($Receptor['CmnaRecep']))->comuna;
         // documentos
         $documentos_json = trim($_POST['documentos']);
         if (empty($documentos_json)) {
             \sowerphp\core\Model_Datasource_Session::message('Debe enviar los datos JSON con los documentos', 'error');
             return;
         }
         $documentos = json_decode($documentos_json);
         if (!$documentos) {
             \sowerphp\core\Model_Datasource_Session::message('No fue posible procesar los datos JSON con los documentos, posible error de sintaxis', 'error');
             return;
         }
         // armar datos de folios
         $folios = [];
         if (isset($_FILES['folios'])) {
             $n_folios = count($_FILES['folios']['name']);
             for ($i = 0; $i < $n_folios; $i++) {
                 if (!$_FILES['folios']['error'][$i]) {
                     $folios[] = base64_encode(file_get_contents($_FILES['folios']['tmp_name'][$i]));
                 }
             }
         }
         if (empty($folios)) {
             \sowerphp\core\Model_Datasource_Session::message('Debe enviar a lo menos un archivo CAF con folios', 'error');
             return;
         }
         // firma
         if (!isset($_FILES['firma']) or $_FILES['firma']['error']) {
             \sowerphp\core\Model_Datasource_Session::message('Hubo algún problema al subir la firma electrónica', 'error');
             return;
         }
         $firma = ['data' => base64_encode(file_get_contents($_FILES['firma']['tmp_name'])), 'pass' => $_POST['contrasenia']];
         // armar datos con archivo XML y flag para indicar si es cedible o no
         $data = ['Emisor' => $Emisor, 'Receptor' => $Receptor, 'resolucion' => ['FchResol' => $_POST['FchResol'], 'NroResol' => $_POST['NroResol']], 'documentos' => $documentos, 'folios' => $folios, 'firma' => $firma, 'normalizar_dte' => isset($_POST['normalizar_dte'])];
         // realizar consulta a la API
         $rest = new \sowerphp\core\Network_Http_Rest();
         $rest->setAuth($this->Auth->User ? $this->Auth->User->hash : \sowerphp\core\Configure::read('api.default.token'));
         $response = $rest->post($this->request->url . '/api/dte/documentos/generar_xml', $data);
         if ($response['status']['code'] != 200) {
             \sowerphp\core\Model_Datasource_Session::message(str_replace("\n", '<br/>', $response['body']), 'error');
             return;
         }
         // si dió código 200 se entrega la respuesta del servicio web
         foreach (['Content-Disposition', 'Content-Length', 'Content-Type'] as $header) {
             if (isset($response['header'][$header])) {
                 header($header . ': ' . $response['header'][$header]);
             }
         }
         echo $response['body'];
         exit;
     }
 }