<commit_before><?php

/**
 * SowerPHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

// namespace del controlador
namespace website\Dte;

/**
 * Clase para el controlador asociado a la tabla registro_compra de la base de
 * datos
 * Comentario de la tabla:
 * Esta clase permite controlar las acciones entre el modelo y vista para la
 * tabla registro_compra
 * @author SowerPHP Code Generator
 * @version 2019-08-09 13:54:15
 */
class Controller_RegistroCompras extends \Controller_App
{

    /**
     * Acción principal que redirecciona a los documentos pendientes, ya que no
     * se deberían estar cargando de otro tipo actualmente, quizás en el futuro (?)
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-13
     */
    public function index()
    {
        $this->redirect('/dte/registro_compras/pendientes');
    }

    /**
     * Acción para mostrar los documentos recibidos en SII con estado pendientes
     * de procesar
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-31
     */
    public function pendientes()
    {
        $filtros = array_merge($this->getQuery([
            'emisor' => null,
            'fecha_desde' => null,
            'fecha_hasta' => null,
            'dte' => null,
            'fecha_recepcion_sii_desde' => null,
            'fecha_recepcion_sii_hasta' => null,
            'total_desde' => null,
            'total_hasta' => null,
        ]), ['estado' => 0]); // forzar estado PENDIENTE
        $Receptor = $this->getContribuyente();
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->buscar($filtros);
        $this->set([
            'Receptor' => $Receptor,
            'filtros' => $filtros,
            'documentos' => $documentos,
        ]);
    }

    /**
     * Acción para generar un CSV con los documentos recibidos en SII con
     * estado pendientes de procesar
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-09
     */
    public function csv()
    {
        $filtros = array_merge($this->getQuery([
            'emisor' => null,
            'fecha_desde' => null,
            'fecha_hasta' => null,
            'dte' => null,
            'total_desde' => null,
            'total_hasta' => null,
        ]), ['estado' => 0]); // forzar estado PENDIENTE
        $Receptor = $this->getContribuyente();
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->getDetalle($filtros);
        if (!$documentos) {
            \sowerphp\core\Model_Datasource_Session::message('No hay documentos recibidos en SII para la búsqueda realizada');
            $this->redirect('/dte/registro_compras');
        }
        array_unshift($documentos, array_keys($documentos[0]));
        $csv = \sowerphp\general\Utility_Spreadsheet_CSV::get($documentos);
        $this->response->sendContent($csv, $Receptor->rut.'-'.$Receptor->dv.'_recibidos_'.date('YmdHis').'.csv');
    }

    /**
     * Acción para generar un CSV con el resumen de los documentos pendientes
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-31
     */
    public function pendientes_resumen_csv()
    {
        $Receptor = $this->getContribuyente();
        $resumen = (new Model_RegistroCompras())->setContribuyente($Receptor)->getResumenPendientes();
        if (!$resumen) {
            \sowerphp\core\Model_Datasource_Session::message('No hay documentos recibidos pendientes en SII');
            $this->redirect('/dte');
        }
        array_unshift($resumen, array_keys($resumen[0]));
        $csv = \sowerphp\general\Utility_Spreadsheet_CSV::get($resumen);
        $this->response->sendContent($csv, $Receptor->rut.'-'.$Receptor->dv.'_resumen_recibidos_pendientes_'.date('YmdHis').'.csv');
    }

    /**
     * Acción para el buscador de documentos recibidos
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-13
     */
    public function buscar()
    {
        $Receptor = $this->getContribuyente();
        $this->set([
            'Receptor' => $Receptor,
            'dte_tipos' => (new \website\Dte\Admin\Mantenedores\Model_DteTipos())->getList(),
        ]);
        if (isset($_POST['submit'])) {
            unset($_POST['submit']);
            $filtros = array_merge($_POST, ['estado' => 0]); // forzar estado PENDIENTE
            // obtener PDF desde servicio web
            $r = $this->consume('/api/dte/registro_compras/buscar/'.$Receptor->rut, $filtros);
            if ($r['status']['code']!=200) {
                \sowerphp\core\Model_Datasource_Session::message($r['body'], 'error');
                return;
            }
            if (empty($r['body'])) {
                \sowerphp\core\Model_Datasource_Session::message(__('No hay documentos recibidos en SII para la búsqueda realizada'), 'warning');
            }
            $this->set([
                'filtros' => $filtros,
                'documentos' => $r['body'],
            ]);
        }
    }

    /**
     * API que permite buscar en los documentos recibidos en el registro de
     * compras del SII
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2020-02-17
     */
    public function _api_buscar_POST($receptor)
    {
        // usuario autenticado
        $User = $this->Api->getAuthUser();
        if (is_string($User)) {
            $this->Api->send($User, 401);
        }
        // crear receptor
        $Receptor = new Model_Contribuyente($receptor);
        if (!$Receptor->exists()) {
            $this->Api->send(__('Receptor no existe'), 404);
        }
        if (!$Receptor->usuarioAutorizado($User, '/dte/registro_compras/buscar')) {
            $this->Api->send(__('No está autorizado a operar con la empresa solicitada'), 403);
        }
        // obtener boletas
        $filtros = [];
        foreach ((array)$this->Api->data as $key => $val) {
            if (!empty($val) or (isset($val) and $val===0)) {
                $filtros[$key] = $val;
            }
        }
        if (empty($filtros)) {
            $this->Api->send(__('Debe definir a lo menos un filtro para la búsqueda'), 400);
        }
        $filtros['estado'] = 0; // forzar estado PENDIENTE
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->buscar($filtros);
        $this->Api->send($documentos, 200, JSON_PRETTY_PRINT);
    }

    /**
     * Acción para actualizar el listado de documentos del registro de compras
     * del SII
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-13
     */
    public function actualizar()
    {
        $estado = 'PENDIENTE'; // forzar estado PENDIENTE
        $meses = 2;
        $Receptor = $this->getContribuyente();
        try {
            (new Model_RegistroCompras())->setContribuyente($Receptor)->sincronizar($estado, $meses);
            \sowerphp\core\Model_Datasource_Session::message(__('Documentos recibidos con estado %s actualizados', $estado), 'ok');
        } catch (\Exception $e) {
            \sowerphp\core\Model_Datasource_Session::message($e->getMessage(), 'error');
        }
        $this->redirect('/dte/registro_compras');
    }

    /**
     * Acción que permite ingresar una acción al registro de compras del DTE en
     * el SII
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-14
     */
    public function ingresar_accion($emisor, $dte, $folio)
    {
        list($emisor_rut, $emisor_dv) = explode('-', str_replace('.', '', $emisor));
        $Contribuyente = $this->getContribuyente();
        $Firma = $Contribuyente->getFirma($this->Auth->User->id);
        if (!$Firma) {
            \sowerphp\core\Model_Datasource_Session::message(
                'No existe firma asociada', 'error'
            );
            $this->redirect('/dte/registro_compras/pendientes');<commit_msg>Se puede especificar la cantidad de meses a sincronizar los pendientes de compras en el SII<commit_after><?php

/**
 * SowerPHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

// namespace del controlador
namespace website\Dte;

/**
 * Clase para el controlador asociado a la tabla registro_compra de la base de
 * datos
 * Comentario de la tabla:
 * Esta clase permite controlar las acciones entre el modelo y vista para la
 * tabla registro_compra
 * @author SowerPHP Code Generator
 * @version 2019-08-09 13:54:15
 */
class Controller_RegistroCompras extends \Controller_App
{

    /**
     * Acción principal que redirecciona a los documentos pendientes, ya que no
     * se deberían estar cargando de otro tipo actualmente, quizás en el futuro (?)
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-13
     */
    public function index()
    {
        $this->redirect('/dte/registro_compras/pendientes');
    }

    /**
     * Acción para mostrar los documentos recibidos en SII con estado pendientes
     * de procesar
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-31
     */
    public function pendientes()
    {
        $filtros = array_merge($this->getQuery([
            'emisor' => null,
            'fecha_desde' => null,
            'fecha_hasta' => null,
            'dte' => null,
            'fecha_recepcion_sii_desde' => null,
            'fecha_recepcion_sii_hasta' => null,
            'total_desde' => null,
            'total_hasta' => null,
        ]), ['estado' => 0]); // forzar estado PENDIENTE
        $Receptor = $this->getContribuyente();
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->buscar($filtros);
        $this->set([
            'Receptor' => $Receptor,
            'filtros' => $filtros,
            'documentos' => $documentos,
        ]);
    }

    /**
     * Acción para generar un CSV con los documentos recibidos en SII con
     * estado pendientes de procesar
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-09
     */
    public function csv()
    {
        $filtros = array_merge($this->getQuery([
            'emisor' => null,
            'fecha_desde' => null,
            'fecha_hasta' => null,
            'dte' => null,
            'total_desde' => null,
            'total_hasta' => null,
        ]), ['estado' => 0]); // forzar estado PENDIENTE
        $Receptor = $this->getContribuyente();
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->getDetalle($filtros);
        if (!$documentos) {
            \sowerphp\core\Model_Datasource_Session::message('No hay documentos recibidos en SII para la búsqueda realizada');
            $this->redirect('/dte/registro_compras');
        }
        array_unshift($documentos, array_keys($documentos[0]));
        $csv = \sowerphp\general\Utility_Spreadsheet_CSV::get($documentos);
        $this->response->sendContent($csv, $Receptor->rut.'-'.$Receptor->dv.'_recibidos_'.date('YmdHis').'.csv');
    }

    /**
     * Acción para generar un CSV con el resumen de los documentos pendientes
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-31
     */
    public function pendientes_resumen_csv()
    {
        $Receptor = $this->getContribuyente();
        $resumen = (new Model_RegistroCompras())->setContribuyente($Receptor)->getResumenPendientes();
        if (!$resumen) {
            \sowerphp\core\Model_Datasource_Session::message('No hay documentos recibidos pendientes en SII');
            $this->redirect('/dte');
        }
        array_unshift($resumen, array_keys($resumen[0]));
        $csv = \sowerphp\general\Utility_Spreadsheet_CSV::get($resumen);
        $this->response->sendContent($csv, $Receptor->rut.'-'.$Receptor->dv.'_resumen_recibidos_pendientes_'.date('YmdHis').'.csv');
    }

    /**
     * Acción para el buscador de documentos recibidos
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-13
     */
    public function buscar()
    {
        $Receptor = $this->getContribuyente();
        $this->set([
            'Receptor' => $Receptor,
            'dte_tipos' => (new \website\Dte\Admin\Mantenedores\Model_DteTipos())->getList(),
        ]);
        if (isset($_POST['submit'])) {
            unset($_POST['submit']);
            $filtros = array_merge($_POST, ['estado' => 0]); // forzar estado PENDIENTE
            // obtener PDF desde servicio web
            $r = $this->consume('/api/dte/registro_compras/buscar/'.$Receptor->rut, $filtros);
            if ($r['status']['code']!=200) {
                \sowerphp\core\Model_Datasource_Session::message($r['body'], 'error');
                return;
            }
            if (empty($r['body'])) {
                \sowerphp\core\Model_Datasource_Session::message(__('No hay documentos recibidos en SII para la búsqueda realizada'), 'warning');
            }
            $this->set([
                'filtros' => $filtros,
                'documentos' => $r['body'],
            ]);
        }
    }

    /**
     * API que permite buscar en los documentos recibidos en el registro de
     * compras del SII
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2020-02-17
     */
    public function _api_buscar_POST($receptor)
    {
        // usuario autenticado
        $User = $this->Api->getAuthUser();
        if (is_string($User)) {
            $this->Api->send($User, 401);
        }
        // crear receptor
        $Receptor = new Model_Contribuyente($receptor);
        if (!$Receptor->exists()) {
            $this->Api->send(__('Receptor no existe'), 404);
        }
        if (!$Receptor->usuarioAutorizado($User, '/dte/registro_compras/buscar')) {
            $this->Api->send(__('No está autorizado a operar con la empresa solicitada'), 403);
        }
        // obtener boletas
        $filtros = [];
        foreach ((array)$this->Api->data as $key => $val) {
            if (!empty($val) or (isset($val) and $val===0)) {
                $filtros[$key] = $val;
            }
        }
        if (empty($filtros)) {
            $this->Api->send(__('Debe definir a lo menos un filtro para la búsqueda'), 400);
        }
        $filtros['estado'] = 0; // forzar estado PENDIENTE
        $documentos = (new Model_RegistroCompras())->setContribuyente($Receptor)->buscar($filtros);
        $this->Api->send($documentos, 200, JSON_PRETTY_PRINT);
    }

    /**
     * Acción para actualizar el listado de documentos del registro de compras
     * del SII
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2020-07-02
     */
    public function actualizar($meses = 2)
    {
        $estado = 'PENDIENTE'; // forzar estado PENDIENTE
        $Receptor = $this->getContribuyente();
        try {
            (new Model_RegistroCompras())->setContribuyente($Receptor)->sincronizar($estado, $meses);
            \sowerphp\core\Model_Datasource_Session::message(__('Documentos recibidos con estado %s actualizados', $estado), 'ok');
        } catch (\Exception $e) {
            \sowerphp\core\Model_Datasource_Session::message($e->getMessage(), 'error');
        }
        $this->redirect('/dte/registro_compras');
    }

    /**
     * Acción que permite ingresar una acción al registro de compras del DTE en
     * el SII
     * @author <NAME> <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2019-08-14
     */
    public function ingresar_accion($emisor, $dte, $folio)
    {
        list($emisor_rut, $emisor_dv) = explode('-', str_replace('.', '', $emisor));
        $Contribuyente = $this->getContribuyente();
        $Firma = $Contribuyente->getFirma($this->Auth->User->id);
        if (!$Firma) {
            \sowerphp\core\Model_Datasource_Session::message(
                'No existe firma asociada', 'error'
            );
            $this->redirect('/dte/registro_compras/pendientes');
{'fraction_non_alphanumeric': 0.13935134512356703, 'fraction_numerical': 0.012097471052479982, 'mean_word_length': 2.4831460674157304, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 188, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4096871', 'n_tokens_mistral': 5896, 'n_tokens_neox': 5707, 'n_words': 1260}