<?php
/**
 * <--- Copyright 2005-2011 de Solis - Cooperativa de Soluções Livres Ltda. e
 * Univates - Centro Universitário.
 * 
 * Este arquivo é parte do programa Gnuteca.
 * 
 * O Gnuteca é um software livre; você pode redistribuí-lo e/ou modificá-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação
 * do Software Livre (FSF); na versão 2 da Licença.
 * 
 * Este programa é distribuído na esperança que possa ser útil, mas SEM
 * NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO
 * ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/GPL em
 * português para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o título
 * "LICENCA.txt", junto com este programa, se não, acesse o Portal do Software
 * Público Brasileiro no endereço www.softwarepublico.gov.br ou escreva para a
 * Fundação do Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301, USA --->
 * 
 * @author Lucas Rodrigo Gerhardt [lucas_gerhardt@solis.coop.br]
 *
 * @version $Id$
 *
 * \b Maintainers \n
 *Jader Fiegenbaum   [jader@solis.coop.br]
 * Jamiel Spezia        [jamiel@solis.coop.br]
 * Lucas Rodrigo Gerhardt [lucas_gerhardt@solis.coop.br]
 *
 * @since
 * Class created on 31/08/2015
 *
 **/
class FrmMaterialLocation extends GForm
{
    public $MIOLO;
    public $module;
    public $action;
    
    public $busExemplaryStatus;
    public $busMaterialPhysicalType;
    public $busMaterialType;
    public $busMarcTagListing;
    public $busMarcTagListingOption;
    public $busLibraryUnit;
    
    public function __construct()
    {
        $this->setAllFunctions('MaterialLocation', array('materialLocationId'), array('materialLocationId'), array('materialLocationId', 'description'));
        $this->MIOLO = MIOLO::getInstance();
        $this->module = MIOLO::getCurrentModule();
        $this->action = MIOLO::getCurrentAction();
        $this->function = MIOLO::_REQUEST('function');
        
        $this->busExemplaryStatus = $this->MIOLO->getBusiness($this->module, 'BusExemplaryStatus');
        $this->busMaterialPhysicalType = $this->MIOLO->getBusiness($this->module, 'BusMaterialPhysicalType');
        $this->busMaterialType = $this->MIOLO->getBusiness($this->module, 'BusMaterialType');
        $this->busMarcTagListing = $this->MIOLO->getBusiness($this->module, 'BusMarcTagListing');
        $this->busMarcTagListingOption = $this->MIOLO->getBusiness($this->module, 'BusMarcTagListingOption');
        $this->busLibraryUnit = $this->MIOLO->getBusiness($this->module, 'BusLibraryUnit');
        
        parent::__construct();
    }
    
    public function mainFields()
    {
        if($this->function == 'insert')
        {
            $gdate = GDate::now();
            $date = $gdate->getDate(GDate::MASK_TIMESTAMP_USER);
            
            $operator = GOperator::getOperatorId();
        }
        else
        {
            $date = $this->date->value;
            $operator = $this->operator->value;
        }
        
        if ( $this->primeiroAcessoAoForm() )
        {
            GFileUploader::clearData('image');
            
            GRepetitiveField::clearData('intervaloClassificacao');
            GRepetitiveField::clearData('estadoExemplar');
            GRepetitiveField::clearData('tipoFisicoDoMaterial');
            GRepetitiveField::clearData('tipoDoMaterial');
            GRepetitiveField::clearData('areaConhecimento');
            GRepetitiveField::clearData('unidadeBiblioteca');
        }
        
        $fields[] = new MIntegerField('materialLocationId', $this->materialLocationId->value, _M('Código', $this->module), FIELD_ID_SIZE, null, null, true);
        $fields[] = $date = new MTextField('date', $date, _M('Data', $this->module), FIELD_DESCRIPTION_SIZE);
        $date->setReadOnly(true);
        $fields[] = new MTextField('operator', $operator, _M('Operador', $this->module),FIELD_DESCRIPTION_SIZE, '', null, true);
        
        $fields[] = new MTextField('description', $this->description->value, _M('Descrição', $this->module), FIELD_DESCRIPTION_SIZE);
        
        //Repetitive de Classificação
        $fldsClass[] = new MTextField('beginClassification', $this->beginClassification->value, _M("Inicia em"), FIELD_DESCRIPTION_SIZE);
        $fldsClass[] = new MTextField('endClassification', $this->endClassification->value, _M("Termina em"), FIELD_DESCRIPTION_SIZE);
        
        $columnsClass[] = new MGridColumn( _M('Inicia em', $this->module), 'left', true, '', true, 'beginClassification');
        $columnsClass[] = new MGridColumn( _M('Termina em', $this->module),      'left', true, '', true, 'endClassification');
        
        $fields[] = $intervaloClassificacao = new GRepetitiveField('intervaloClassificacao', _M('Intervalo de classificação', $this->module), $columnsClass, $fldsClass );
        
        //Validators de Classificação
        $validatorsClass[] = new MRequiredValidator('beginClassification', _M("Inicia em", $this->module));
        $validatorsClass[] = new MRequiredValidator('endClassification', _M("Termina em", $this->module));
        $intervaloClassificacao->setValidators($validatorsClass);        
        
        //Repetitive de Estados do exemplar
        $optionsRegra = array('I' => _M("Inclui", $this->module), 'E' => _M("Exclui", $this->module));
        
        $sRegraExemplaryStatusValue = $this->sRegraExemplaryStatus->value ? $this->sRegraExemplaryStatus->value : 'I';
        
        $fldsExemplaryStatus[] = new MSelection('sRegraExemplaryStatus', $sRegraExemplaryStatusValue, _M("Regra", $this->module), $optionsRegra);
        $fldsExemplaryStatus[] = new MSpacer();
        $fldsExemplaryStatus[] = new MSelection('exemplaryStatusId', $this->exemplaryStatusId->value, _M("Estado do exemplar"), $this->busExemplaryStatus->listExemplaryStatus(), false);
        
        $columnsExemplaryStatus[] = new MGridColumn( _M('Regra', $this->module), 'left', true, '', true, 'sRegraExemplaryStatusDescription');
        $columnsExemplaryStatus[] = new MGridColumn( _M('Estado do exemplar', $this->module),      'left', true, '', true, 'exemplaryStatusIdDescription');
        
        $fields[] = $estadoExemplar = new GRepetitiveField('estadoExemplar', _M('Estados de exemplar', $this->module), $columnsExemplaryStatus, $fldsExemplaryStatus );
        
        //Validators de Estados do exemplar
        $validatorsExemplaryStatus[] = new MRequiredValidator('sRegraExemplaryStatus', _M("Regra", $this->module));
        $validatorsExemplaryStatus[] = new MRequiredValidator('exemplaryStatusId', _M("Estado do exemplar", $this->module));
        $validatorsExemplaryStatus[] = new GnutecaUniqueValidator('exemplaryStatusId', _M("Estado do exemplar", $this->module));
        $estadoExemplar->setValidators($validatorsExemplaryStatus);
        
        //Repetitive de Tipo fisico
        $sRegraMaterialPhysicalTypeValue = $this->sRegraMaterialPhysicalType->value ? $this->sRegraMaterialPhysicalType->value : 'I';
        
        $fldsMaterialPhysicalType[] = new MSelection('sRegraMaterialPhysicalType', $sRegraMaterialPhysicalTypeValue, _M("Regra", $this->module), $optionsRegra);
        $fldsMaterialPhysicalType[] = new MSpacer();
        $fldsMaterialPhysicalType[] = new MSelection('materialPhysicalTypeId', $this->materialPhysicalTypeId->value, _M("Tipo físico"), $this->busMaterialPhysicalType->listMaterialPhysicalType(), false);
        
        $columnsMaterialPhysicalType[] = new MGridColumn( _M('Regra', $this->module), 'left', true, '', true, 'sRegraMaterialPhysicalTypeDescription');
        $columnsMaterialPhysicalType[] = new MGridColumn( _M('Tipo físico', $this->module),      'left', true, '', true, 'materialPhysicalTypeIdDescription');
        
        $fields[] = $tipoFisicoDoMaterial = new GRepetitiveField('tipoFisicoDoMaterial', _M('Tipos físicos', $this->module), $columnsMaterialPhysicalType, $fldsMaterialPhysicalType );
        
        //Validators de Tipo fisico
        $validatorsMaterialPhysicalType[] = new MRequiredValidator('sRegraMaterialPhysicalType', _M("Regra", $this->module));
        $validatorsMaterialPhysicalType[] = new MRequiredValidator('materialPhysicalTypeId', _M("Tipo físico", $this->module));
        $validatorsMaterialPhysicalType[] = new GnutecaUniqueValidator('materialPhysicalTypeId', _M("Tipo físico", $this->module));
        $tipoFisicoDoMaterial->setValidators($validatorsMaterialPhysicalType);
        
        //Repetitive de Tipo
        $sRegraMaterialTypeValue = $this->sRegraMaterialType->value ? $this->sRegraMaterialType->value : 'I';
        
        $fldsMaterialType[] = new MSelection('sRegraMaterialType', $sRegraMaterialTypeValue, _M("Regra", $this->module), $optionsRegra);
        $fldsMaterialType[] = new MSpacer();
        $fldsMaterialType[] = new MSelection('materialTypeId', $this->materialTypeId->value, _M("Tipo"), $this->busMaterialType->listMaterialType(), false);
        
        $columnsMaterialType[] = new MGridColumn( _M('Regra', $this->module), 'left', true, '', true, 'sRegraMaterialTypeDescription');
        $columnsMaterialType[] = new MGridColumn( _M('Tipo', $this->module),      'left', true, '', true, 'materialTypeIdDescription');
        
        $fields[] = $tipoDoMaterial = new GRepetitiveField('tipoDoMaterial', _M('Tipos', $this->module), $columnsMaterialType, $fldsMaterialType );
        
        //Validators de Tipo
        $validatorsMaterialType[] = new MRequiredValidator('sRegraMaterialType', _M("Regra", $this->module));
        $validatorsMaterialType[] = new MRequiredValidator('materialTypeId', _M("Tipo", $this->module));
        $validatorsMaterialType[] = new GnutecaUniqueValidator('materialTypeId', _M("Tipo", $this->module));
        $tipoDoMaterial->setValidators($validatorsMaterialType);
        
        //Repetitive de Área de conhecimento
        $sRegraKnowLedgeAreaValue = $this->sRegraKnowLedgeArea->value ? $this->sRegraKnowLedgeArea->value : 'I';
        
        $fldsKnowLedgeArea[] = new MSelection('sRegraKnowLedgeArea', $sRegraKnowLedgeAreaValue, _M("Regra", $this->module), $optionsRegra);
        $fldsKnowLedgeArea[] = new MSpacer();
        
        //Trata o campo de área de conhecimento para se tornar um array para o MSelection
        foreach ($this->busMarcTagListing->getMarcTagListingOptions('901.b') as $knowLedgeAreas )
        {
            $knowLedgeArea[$knowLedgeAreas->option] = $knowLedgeAreas->description;
        }
        $fldsKnowLedgeArea[] = new MSelection('knowLedgeAreaId', $this->knowLedgeAreaId->value, _M("Área de conhecimento"), $knowLedgeArea, false);
        
        $columnsKnowLedgeArea[] = new MGridColumn( _M('Regra', $this->module), 'left', true, '', true, 'sRegraKnowLedgeAreaDescription');
        $columnsKnowLedgeArea[] = new MGridColumn( _M('Área de conhecimento', $this->module),      'left', true, '', true, 'knowLedgeAreaIdDescription');
        
        $fields[] = $areaConhecimento = new GRepetitiveField('areaConhecimento', _M('Áreas de conhecimento', $this->module), $columnsKnowLedgeArea, $fldsKnowLedgeArea );
        
        //Validators de Área de conhecimento
        $validatorsKnowLedgeArea[] = new MRequiredValidator('sRegraKnowLedgeArea', _M("Regra", $this->module));
        $validatorsKnowLedgeArea[] = new MRequiredValidator('knowLedgeAreaId', _M("Área de conhecimento"));
        $validatorsKnowLedgeArea[] = new GnutecaUniqueValidator('knowLedgeAreaId', _M("Área de conhecimento", $this->module));
        $areaConhecimento->setValidators($validatorsKnowLedgeArea);
        
        //Repetitive de Área de conhecimento
        $sRegraLibraryUnitValue = $this->sRegraLibraryUnit->value ? $this->sRegraLibraryUnit->value : 'I';
        
        $fldsLibraryUnit[] = new MSelection('sRegraLibraryUnit', $sRegraLibraryUnitValue, _M("Regra", $this->module), $optionsRegra);
        $fldsLibraryUnit[] = new MSpacer();
        
        $libraryUnit = $this->busLibraryUnit->listLibraryUnit();
        
        $fldsLibraryUnit[] = new MSelection('libraryUnitId', $this->libraryUnitId->value, _M("Unidade de biblioteca"), $libraryUnit, false);
        
        $columnsLibraryUnit[] = new MGridColumn( _M('Regra', $this->module), 'left', true, '', true, 'sRegraLibraryUnitDescription');
        $columnsLibraryUnit[] = new MGridColumn( _M('Unidade de biblioteca', $this->module),      'left', true, '', true, 'libraryUnitIdDescription');
        
        $fields[] = $unidadeBiblioteca = new GRepetitiveField('unidadeBiblioteca', _M('Unidades de biblioteca', $this->module), $columnsLibraryUnit, $fldsLibraryUnit );
        
        //Validators de Área de conhecimento
        $validatorsLibraryUnit[] = new MRequiredValidator('sRegraLibraryUnit', _M("Regra", $this->module));
        $validatorsLibraryUnit[] = new MRequiredValidator('libraryUnitId', _M("Unidade de biblioteca"));
        $validatorsLibraryUnit[] = new GnutecaUniqueValidator('libraryUnitId', _M("Unidade de biblioteca", $this->module));
        $unidadeBiblioteca->setValidators($validatorsLibraryUnit);
        
        //Upload da imagem
        $fields[] = new GFileUploader(_M('Anexar imagens',$this->module), false, null, 'image' );
        GFileUploader::setLimit(1, 'image'); //somente uma por material
        GFileUploader::setExtensions(array('png','jpg','jpeg','gif'), array('php', 'class', 'js'), 'image');

        $validators[] = new MRequiredValidator('description');
                
        $this->setValidators($validators);
        $this->setFields($fields);
    }
    
    
    /**
     * Método reescrito para fazer o parser da descrição do vínculo
     * @param type $args
     * @param type $forceMode 
     */
    public function addToTable($args, $forceMode = FALSE)
    {
        $item = $args->GRepetitiveField;
        
        if ( strstr($item, 'estadoExemplar') )
        {
            $args = $this->estadoExemplarParse($args);
        }
        elseif ( $item == 'tipoFisicoDoMaterial' )
        {
            $args = $this->tipoFisicoDoMaterialParse($args);
        }
        elseif ( $item == 'tipoDoMaterial' )
        {
            $args = $this->tipoDoMaterialParse($args);
        }
        elseif ( $item == 'areaConhecimento' )
        {
            $args = $this->areaConhecimentoParse($args);
        }
        
        elseif ( $item == 'unidadeBiblioteca' )
        {
            $args = $this->unidadeBibliotecaParse($args);
        }
        ($forceMode) ? parent::forceAddToTable($args) : parent::addToTable($args);
    }

    public function forceAddToTable($args)
    {
        $this->addToTable($args, TRUE);
    }
    
    public function estadoExemplarParse($data)
    {
        if (is_array($data) )
        {
            $arr = array();
            foreach ( $data as $valor )
            {
                $arr[] = $this->estadoExemplarParse($valor);
            }
            
            return $arr;
        }
        else if (is_object($data))
        {
            $data->sRegraExemplaryStatusDescription = $this->getRegraDescription($data->sRegraExemplaryStatus);
            $data->exemplaryStatusIdDescription = $this->busExemplaryStatus->getExemplaryStatus($data->exemplaryStatusId)->description;

            return $data;
        }
        
    }
    
    public function tipoFisicoDoMaterialParse($data)
    {
        if (is_array($data) )
        {
            $arr = array();
            foreach ( $data as $valor )
            {
                $arr[] = $this->tipoFisicoDoMaterialParse($valor);
            }
            
            return $arr;
        }
        else if (is_object($data))
        {
            $data->sRegraMaterialPhysicalTypeDescription = $this->getRegraDescription($data->sRegraMaterialPhysicalType);
           
           $data->materialPhysicalTypeIdDescription = $this->busMaterialPhysicalType->getMaterialPhysicalType($data->materialPhysicalTypeId)->description;

            return $data;
        }
    }
    
    public function tipoDoMaterialParse($data)
    {
        if (is_array($data) )
        {
            $arr = array();
            foreach ( $data as $valor )
            {
                $arr[] = $this->tipoDoMaterialParse($valor);
            }
            
            return $arr;
        }
        else if (is_object($data))
        {
            $data->sRegraMaterialTypeDescription = $this->getRegraDescription($data->sRegraMaterialType);
           
           $data->materialTypeIdDescription = $this->busMaterialType->getMaterialType($data->materialTypeId)->description;

            return $data;
        }
    }
    
    public function areaConhecimentoParse($data)
    {
        if (is_array($data) )
        {
            $arr = array();
            foreach ( $data as $valor )
            {
                $arr[] = $this->areaConhecimentoParse($valor);
            }
            
            return $arr;
        }
        else if (is_object($data))
        {
            $data->sRegraKnowLedgeAreaDescription = $this->getRegraDescription($data->sRegraKnowLedgeArea);
           
           $data->knowLedgeAreaIdDescription = $this->busMarcTagListingOption->getMarcTagListingOption('901.b', $data->knowLedgeAreaId)->description;

            return $data;
        }
    }
    
    public function unidadeBibliotecaParse($data)
    {
        if (is_array($data) )
        {
            $arr = array();
            foreach ( $data as $valor )
            {
                $arr[] = $this->unidadeBibliotecaParse($valor);
            }
            
            return $arr;
        }
        else if (is_object($data))
        {
            $data->sRegraLibraryUnitDescription = $this->getRegraDescription($data->sRegraLibraryUnit);
           
           $data->libraryUnitIdDescription = $this->busLibraryUnit->getLibraryUnit($data->libraryUnitId)->libraryName;

            return $data;
        }
    }
    
    public function getRegraDescription($regra)
    {
        if ( $regra == 'E' )
        {
            return  _M("Exclui", $this->module);
        }
        else if ( $regra == 'I' )
        {
            return _M("Inclui", $this->module);
        }
    }
    
    
    /**
     *  Método reescrito para fazer o parser da descrição do vínculo na repetitive de grupos
     */
    public function loadFields()
    {
        parent::loadFields();
        
        $busFile = $this->MIOLO->getBusiness('gnuteca3','BusFile');
        $busFile->folder    = 'location';
        $busFile->fileName  = MIOLO::_REQUEST('materialLocationId') . '.';
        GFileUploader::setData( $busFile->searchFile(true), 'image');
        
        GRepetitiveField::setData($this->business->intervaloClassificacao, 'intervaloClassificacao');
        GRepetitiveField::setData($this->estadoExemplarParse($this->business->estadoExemplar), 'estadoExemplar');
        GRepetitiveField::setData($this->tipoFisicoDoMaterialParse($this->business->tipoFisicoDoMaterial), 'tipoFisicoDoMaterial');
        GRepetitiveField::setData($this->tipoDoMaterialParse($this->business->tipoDoMaterial), 'tipoDoMaterial');
        GRepetitiveField::setData($this->areaConhecimentoParse($this->business->areaConhecimento), 'areaConhecimento');
        GRepetitiveField::setData($this->unidadeBibliotecaParse($this->business->unidadeBiblioteca), 'unidadeBiblioteca');
    }

    public function tbBtnSave_click($sender = NULL, $data = NULL, array $errors = NULL, $business = null, $method = null)
    {
        $coverData = GFileUploader::getData('image');
        
        $existeFoto = null;
        if ( !$coverData )
        {
            foreach ( $coverData as $cover )
            {
                if ( $cover->removeData != true )
                {
                    $existeFoto = true;
                }
            }
            
            if ( !$existeFoto )
            {
                throw new Exception(_M("É necessário anexar uma imagem à regra."));
            }
        }
        
        parent::tbBtnSave_click($sender, $data, $errors, $business, $method);
        //grava a imagem
        $this->saveImage( $this->business->materialLocationId, $coverData );
        GFileUploader::clearData('image'); //limpa o sessão para evitar fazer 2 vezes a mesma coisa
    }
       
    /**
    * Método que faz a gravação da imagem
    * @param integer código do material 
    */ 
    public function saveImage( $materialLocationId , $coverData )
    {
        $busFile = $this->MIOLO->getBusiness('gnuteca3','BusFile');
        $busFile = new BusinessGnuteca3BusFile();
        $folder  = 'location';
        
        $busFile->folder = $folder;
        if ( strlen($busFile->searchFile()) <= 0 )
        {
            mkdir($busFile->getAbsoluteServerPath(true) . '/' . $folder, 0755);
        }

        if ( $coverData )
        {
            //converte o nome do arquivo para o código da pessoa, foreach caso o id seja diferente de i
            foreach ( $coverData as $line => $info)
            {
                if ( $info->tmp_name )
                {
                    $coverData[$line]->basename = $materialLocationId.'.png';
                }
            }

            //caso já exista uma photo estocada, remove-a, só pode existir uma capa por arquivo
            if ( $busFile->fileExists( $folder, $materialLocationId, 'png') && is_array($coverData[0]) )
            {
                $filePath = $busFile->getAbsoluteFilePath( $folder, $materialLocationId, 'png');
                $busFile->deleteFile($filePath);
            }

            $busFile->folder = $folder;
            $busFile->files = $coverData;
            $busFile->insertFile(); //insere o arquivo
            GFileUploader::clearData('image'); //limpa o sessão para evitar fazer 2 vezes a mesma coisa
        }
    }
    

}

?>