<?php

/**
 * Copyright 2005-2021 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 *
 *
 *
 *
 *
 *
 **/

$MIOLO->getClass('gnuteca3', 'controls/GFileUploader');
$MIOLO->getClass('gnuteca3', 'gIso2709Import');
$MIOLO->getClass('gnuteca3', 'gIso2709');
$MIOLO->getClass('gnuteca3', 'GSaraivaImport');

class FrmBibliotecaDigital extends GForm
{
    public $busMaterial;
    public $busPreCatalogue;
    public $busSpreadsheet;
    public $busTag;

    public function __construct($data)
    {
        $this->MIOLO    = MIOLO::getInstance();
        $this->module   = MIOLO::getCurrentModule();

        $this->busMaterial = $this->MIOLO->getBusiness($this->module, 'BusMaterial');
        $this->busPreCatalogue = $this->MIOLO->getBusiness($this->module, 'BusPreCatalogue');
        $this->busSpreadsheet = $this->MIOLO->getBusiness($this->module, 'BusSpreadsheet');
        $this->busTag = $this->MIOLO->getBusiness($this->module, 'BusTag');

        if ( GForm::primeiroAcessoAoForm() )
        {
            GFileUploader::clearData('isoFile');
        }

        $this->setTransaction('gtcISO2709Import');

        parent::__construct(_M("Importar", $this->module));
    }

    public function mainFields()
    {
        $fields = array();
        $tags = $this->busSpreadsheet->getTagsOfSpreadSheet('BK', 4);

        if ( !in_array('040.a', $tags['BK.4']) )
        {
            $fields[] = new MTextLabel('',_M('É necessário habilitar o campo 040.a na planilha de categoria BK e nível 4 (padrão).'), '');
        }
        else
        {
            $fields[] =  new GSelection('bibliotecaDigital', null, _M('Biblioteca digital',$this->module), array('saraiva' => 'Saraiva'),null, null, null,true);
            $fields[] = new MSeparator('<br>');
            $fields[] = new GFileUploader( _M('Envie seu arquivo', $this->module), false, $opts = array('remove'), 'isoFile' );
            GFileUploader::setLimit(10, 'isoFile');

            $fields[] = new MSeparator('<br>');
            $fields[] = new MDiv('divGrid');

            //toolbar
            $this->getToolBar();
            $fields[] =  $this->_toolBar;
            $this->_toolBar->enableButtons('tbBtnSave', 'tbBtnNew');
            $this->_toolBar->disableButton( array('tbBtnSearch'));
        }

        $this->setFields($fields);
    }

    public function tbBtnSave_click($sender=NULL, $confirm = DB_FALSE)
    {
        ini_set('memory_limit', '-1'); // define sem nenhuma limitação de memória
        $data = $this->getData();
        $action = MIOLO::getCurrentAction();

        if ( $data->bibliotecaDigital == 'saraiva' )
        {
            $data->files = GFileUploader::getData('isoFile');

            $ok = array();
            $readRecords = 0;

            $data->recordDelimiter = chr(29);
            $data->fieldDelimiter = chr(30);
            $data->subFieldDelimiter = chr(31);

            $readRecords = 0 ;
            
            //interpreta os arquivos a fim de verificar a quantidades de registros
            if ( is_array($data->files) )
            {
                foreach( $data->files as $file )
                {
                    $content = file_get_contents($file->tmp_name);
                    $importObject = new gIso2709Import($content , $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
                    $readRecords += $importObject->size();
                }
            }
            else 
            {
                return $this->information(_M('Não há registros para importar.', $this->module));
            }
            
            //caso existiam registros nos arquivos pede confirmação
            if ( $readRecords > 0 )
            {
                $this->MIOLO->getSession()->setValue('data', $data);
                
                return $this->question(_M('Tem certeza que deseja importar @1 registros?', $this->module, $readRecords), GUtil::getAjax('saveConfirmation'));
            } 
            else 
            {
                return $this->information(_M('Não há registros para importar.', $this->module));
            }
        }
        else
        {
            $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
            $this->error(_M('Ocorreu um erro na importação', $this->module), $goto);
        }
    }

    /**
     * Função chamada após a confirmação de importação de registros
     */
    public function saveConfirmation()
    {
        $action = MIOLO::getCurrentAction();
        $data = $this->MIOLO->getSession()->getValue('data'); //pega os files da sessão
        GFileUploader::clearData('isoFile'); //limpa a repetitive de arquivos
        GFileUploader::generateTable('isoFile');
        $this->busMaterial->beginTransaction();
        $repetitiveTags = $this->busTag->listAllRepetitiveTag();

        $import = array();

        $tagFonteCatalogacao = new stdClass();
        $tagFonteCatalogacao->fieldid = '040'; 
        $tagFonteCatalogacao->subfieldid = 'a';
        $tagFonteCatalogacao->line = 0;
        $tagFonteCatalogacao->indicator1 = null;
        $tagFonteCatalogacao->indicator2 = null;
        $tagFonteCatalogacao->content = 'Saraiva';

        $readRecords = $savedRecors = 0;

        if ( !is_array($data->files))
        {
            throw new Exception(_M('Impossível encontrar arquivo!','gnuteca3'));
        }

        foreach($data->files as $file )
        {
            $content = file_get_contents($file->tmp_name);
            $importObject = new gIso2709($content, $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
            $records = $importObject->getRecords();

            foreach ( $records as $record )
            {
                $tags = $record->getTags();

                $tags[] = $tagFonteCatalogacao;

                $gSaraivaImport = new GSaraivaImport($tags, $repetitiveTags);
                $import[] = $gSaraivaImport->execute();
                $savedRecors += $gSaraivaImport->savedRecords;
            }
        }

        $this->busMaterial->commitTransaction();

        // Indexação da pesquisa.
        $controlNumbers = $this->busMaterial->getAllControlNumberByContent('040.a', array('Saraiva'));
        if ( is_array($controlNumbers) )
        {
            foreach ( $controlNumbers as $cn )
            {
                $arguments = new stdClass();
                $arguments->controlNumber = $cn;
                $arguments->controlNumberFather = NULL;
                GBackgroundTask::executeBackgroundTask('updateSearchTable', $arguments);
            }
        }
        
        if ( !in_array(false, $import)  )
        {
            $urlConfirm = $this->MIOLO->getActionURL('gnuteca3', $action, null, array('function' => 'insert'));
            $this->information( _M('Foram importados @1 materiais.', $this->module, $savedRecors), $urlConfirm);
        }
        else
        {
            $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
            $this->error(_M('Ocorreu um erro na importação', $this->module), $goto);
        }
    }

}

?>
