/** * Método que entrega el objeto del contribuyente que ha sido seleccionado * @return \website\Dte\Model_Contribuyente * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2016-01-02 */ protected function getContribuyente() { if (!isset($this->Contribuyente)) { $this->Contribuyente = \sowerphp\core\Model_Datasource_Session::read('dte.Contribuyente'); } return $this->Contribuyente; }
/** * Método que fuerza la selección de un contribuyente * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-12-12 */ public function beforeFilter() { parent::beforeFilter(); // configuración previa para el módulo Dte y sus submódulos if (strpos($this->request->params['module'], 'Dte') === 0 and $this->request->params['controller'] != 'contribuyentes' and !$this->Auth->allowedWithoutLogin()) { // obtener emisor $Emisor = \sowerphp\core\Model_Datasource_Session::read('dte.Emisor'); if (!$Emisor) { \sowerphp\core\Model_Datasource_Session::message('Antes de utilizar el módulo DTE debe seleccionar un contribuyente con el que operará', 'error'); \sowerphp\core\Model_Datasource_Session::write('referer', $this->request->request); $this->redirect('/dte/contribuyentes/seleccionar'); } // si no existe la definición de ambiente y es de certificación se asigna if (!defined('_LibreDTE_CERTIFICACION_') and $Emisor->certificacion) { define('_LibreDTE_CERTIFICACION_', true); } } }
/** * 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)]); }
?> /usuarios/salir"><span class="glyphicon glyphicon-log-out" aria-hidden="true"></span> Cerrar sesión</a></li> </ul> </li> <?php } ?> </ul> </div> </div> </div> <div class="container main-container"> <!-- BEGIN MAIN CONTENT --> <?php // mensaje si la empresa está en certificación $Emisor = \sowerphp\core\Model_Datasource_Session::read('dte.Emisor'); if ($Emisor and ($Emisor->certificacion or defined('_LibreDTE_CERTIFICACION_') and _LibreDTE_CERTIFICACION_)) { echo '<div class="bg-warning center lead" style="padding:0.5em"><strong>AMBIENTE DE CERTIFICACIÓN: ' . $Emisor->razon_social . '</strong></div>', "\n"; } // menú de módulos si hay sesión iniciada if ($_Auth->logged() and $_module_breadcrumb) { echo '<ol class="breadcrumb">', "\n"; $url = '/'; foreach ($_module_breadcrumb as $link => &$name) { if (is_string($link)) { echo ' <li><a href="', $_base, $url, $link, '">', $name, '</a></li>', "\n"; $url .= $link . '/'; } else { echo ' <li class="active">', $name, '</li>'; } }
/** * 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; } }
?> /usuarios/salir"><span class="glyphicon glyphicon-log-out" aria-hidden="true"></span> Cerrar sesión</a></li> </ul> </li> <?php } ?> </ul> </div> </div> </div> <div class="container main-container"> <!-- BEGIN MAIN CONTENT --> <?php // mensaje si la empresa está en certificación $Emisor = \sowerphp\core\Model_Datasource_Session::read('dte.Contribuyente'); if ($Emisor and ($Emisor->certificacion or defined('_LibreDTE_CERTIFICACION_') and _LibreDTE_CERTIFICACION_)) { echo '<div class="bg-warning center lead" style="padding:0.5em"><strong>AMBIENTE DE CERTIFICACIÓN: ' . $Emisor->razon_social . '</strong></div>', "\n"; } // menú de módulos si hay sesión iniciada if ($_Auth->logged() and $_module_breadcrumb) { echo '<ol class="breadcrumb">', "\n"; $url = '/'; foreach ($_module_breadcrumb as $link => &$name) { if (is_string($link)) { echo ' <li><a href="', $_base, $url, $link, '">', $name, '</a></li>', "\n"; $url .= $link . '/'; } else { echo ' <li class="active">', $name, '</li>'; } }