/**
  * Acción que permite importar un libro desde un archivo CSV
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-29
  */
 public function importar()
 {
     if (isset($_POST['submit'])) {
         // verificar que se haya podido subir el archivo con el libro
         if (!isset($_FILES['archivo']) or $_FILES['archivo']['error']) {
             \sowerphp\core\Model_Datasource_Session::message('Ocurrió un error al subir el libro', 'error');
             return;
         }
         // obtener receptor (contribuyente operando)
         $Receptor = $this->getContribuyente();
         $Libro = new \sasco\LibreDTE\Sii\LibroCompraVenta();
         $Libro->agregarComprasCSV($_FILES['archivo']['tmp_name']);
         $detalle = $Libro->getCompras();
         // agregar cada documento del libro
         $keys = array_keys($this->detalle_cols);
         $noGuardado = [];
         foreach ($detalle as $d) {
             $datos = array_combine($keys, $d);
             $DteRecibido = new Model_DteRecibido();
             $DteRecibido->set($datos);
             $DteRecibido->emisor = explode('-', str_replace('.', '', $datos['rut']))[0];
             $DteRecibido->certificacion = $Receptor->certificacion;
             $DteRecibido->receptor = $Receptor->rut;
             $DteRecibido->usuario = $this->Auth->User->id;
             try {
                 if (!$DteRecibido->save()) {
                     $noGuardado[] = 'T' . $DteRecibido->dte . 'F' . $DteRecibido->folio;
                 }
             } catch (\sowerphp\core\Exception_Model_Datasource_Database $e) {
                 $noGuardado[] = 'T' . $DteRecibido->dte . 'F' . $DteRecibido->folio . ': ' . $e->getMessage();
             }
         }
         // mostrar errores o redireccionar
         if ($noGuardado) {
             \sowerphp\core\Model_Datasource_Session::message('Los siguientes documentos no se agregaron:<br/><br/>- ' . implode('<br/><br/>- ', $noGuardado), 'error');
         } else {
             \sowerphp\core\Model_Datasource_Session::message('Se importó el libro de compras', 'ok');
             $this->redirect('/dte/dte_compras');
         }
     }
 }
 /**
  * Método que permite generar un libro de Compras o Ventas a partir de un
  * archivo CSV con el detalle del mismo
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-24
  */
 public function generar_libro()
 {
     // si no se viene por post terminar
     if (!isset($_POST['submit'])) {
         return;
     }
     // verificar campos no estén vacíos
     $campos = ['TipoOperacion', 'RutEmisorLibro', 'PeriodoTributario', 'FchResol', 'NroResol', 'TipoLibro', 'TipoEnvio', 'FolioNotificacion', 'contrasenia'];
     foreach ($campos as $campo) {
         if (empty($_POST[$campo])) {
             \sowerphp\core\Model_Datasource_Session::message($campo . ' no puede estar en blanco', 'error');
             return;
         }
     }
     // si no se pasó el archivo error
     if (!isset($_FILES['archivo']) or $_FILES['archivo']['error']) {
         \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo CSV con el detalle de las compras o ventas al que deseas generar su XML', 'error');
         return;
     }
     // si no se pasó la firma error
     if (!isset($_FILES['firma']) or $_FILES['firma']['error']) {
         \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo con la firma digital', 'error');
         return;
     }
     // Objeto de la Firma
     try {
         $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => file_get_contents($_FILES['firma']['tmp_name']), 'pass' => $_POST['contrasenia']]);
     } catch (\Exception $e) {
         \sowerphp\core\Model_Datasource_Session::message('No fue posible abrir la firma digital, quizás contraseña incorrecta', 'error');
         return;
     }
     // generar caratula del libro
     $caratula = ['RutEmisorLibro' => str_replace('.', '', $_POST['RutEmisorLibro']), 'RutEnvia' => $Firma->getID(), 'PeriodoTributario' => $_POST['PeriodoTributario'], 'FchResol' => $_POST['FchResol'], 'NroResol' => $_POST['NroResol'], 'TipoOperacion' => $_POST['TipoOperacion'], 'TipoLibro' => $_POST['TipoLibro'], 'TipoEnvio' => $_POST['TipoEnvio'], 'FolioNotificacion' => $_POST['FolioNotificacion']];
     // definir si es certificacion
     $caratula_certificacion = ['COMPRA' => ['PeriodoTributario' => 2000, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006], 'VENTA' => ['PeriodoTributario' => 1980, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006]];
     $certificacion = true;
     foreach ($caratula_certificacion[$caratula['TipoOperacion']] as $attr => $val) {
         if ($caratula[$attr] != $val or $attr == 'PeriodoTributario' and substr($caratula[$attr], 0, 4) != $val) {
             $certificacion = false;
             break;
         }
     }
     // generar libro de compras o venta
     $LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta((bool) $_POST['simplificado']);
     if ($caratula['TipoOperacion'] === 'COMPRA') {
         $LibroCompraVenta->agregarComprasCSV($_FILES['archivo']['tmp_name']);
     } else {
         $LibroCompraVenta->agregarVentasCSV($_FILES['archivo']['tmp_name']);
     }
     $LibroCompraVenta->setCaratula($caratula);
     $LibroCompraVenta->setFirma($Firma);
     $xml = $LibroCompraVenta->generar();
     if (!$LibroCompraVenta->schemaValidate()) {
         \sowerphp\core\Model_Datasource_Session::message(implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error');
         return;
     }
     // descargar XML
     $file = TMP . '/' . $LibroCompraVenta->getID() . '.xml';
     file_put_contents($file, $xml);
     \sasco\LibreDTE\File::compress($file, ['format' => 'zip', 'delete' => true]);
     exit;
 }
/**
 * @file 021-libro_compras_csv.php
 *
 * Ejemplo que muestra como crear el libro de compras a partir de un archivo CSV
 *
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-17
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// caratula del libro
$caratula = ['RutEmisorLibro' => '76192083-9', 'RutEnvia' => '11222333-4', 'PeriodoTributario' => '2000-03', 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoOperacion' => 'COMPRA', 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006];
// Objetos de Firma y LibroCompraVenta
$Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']);
$LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta();
// agregar detalle desde un archivo CSV con ; como separador
$LibroCompraVenta->agregarComprasCSV('libros/libro_compras.csv');
// enviar libro de compras y mostrar resultado del envío: track id o bien =false si hubo error
$LibroCompraVenta->setCaratula($caratula);
$LibroCompraVenta->generar();
// generar XML sin firma
$LibroCompraVenta->setFirma($Firma);
$track_id = $LibroCompraVenta->enviar();
// enviar XML generado en línea anterior
var_dump($track_id);
// si hubo errores mostrar
foreach (\sasco\LibreDTE\Log::readAll() as $error) {
    echo $error, "\n";
}