<?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 --->
 * 
 * This file handles the connection and actions for reserveType table
 *
 * @author Lucas Gerhardt [lucas_gerhardt@solis.coop.br]
 *
 * @version $Id$
 *
 * \b Maintainers \n
 * Jamiel Spezia [jamiel@solis.coop.br]
 * Jader Fiegenbaum [jader@solis.coop.br]
 * Lucas Gerhardt [lucas_gerhardt@solis.coop.br]
 *
 * @since
 * Class created on 31/08/2015
 *
 **/
class BusinessGnuteca3BusMaterialLocation extends GBusiness
{
    public $materialLocationId;
    public $description;
    public $date;
    public $operator;
    
    public $materialLocationIdS;
    public $descriptionS;
    public $dateS;
    public $operatorS;
    
    //Repetitives
    public $intervaloClassificacao;
    public $estadoExemplar;
    public $tipoFisicoDoMaterial;
    public $tipoDoMaterial;
    public $areaConhecimento;
    public $unidadeBiblioteca;
    
    public $busMaterialLocationClassification;
    public $busMaterialLocationExemplaryStatus;
    public $busMaterialLocationMaterialPhysicalType;
    public $busMaterialLocationMaterialType;
    public $busMaterialLocationKnowLedgeArea;
    public $busMaterialLocationLibraryUnit;
    public $busExemplaryControl;
    public $busFile;
    
    /**
     * Class constructor
     **/
    function __construct()
    {
        parent::__construct();
        
        $this->busMaterialLocationClassification = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationClassification');
        $this->busMaterialLocationExemplaryStatus = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationExemplaryStatus');
        $this->busMaterialLocationMaterialPhysicalType = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationMaterialPhysicalType');
        $this->busMaterialLocationMaterialType = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationMaterialType');
        $this->busMaterialLocationKnowLedgeArea = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationKnowLedgeArea');
        $this->busMaterialLocationLibraryUnit = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationLibraryUnit');
        $this->busExemplaryControl = $this->MIOLO->getBusiness($this->module, 'BusExemplaryControl');
        $this->busFile = $this->MIOLO->getBusiness($this->module, 'BusFile');
        
        $this->tables    = 'gtcMaterialLocation';
        $this->colsNoId = 'description,
                           date,
                           operator';
        $this->columns  = 'materialLocationId, ' . $this->colsNoId;
    }
    
    public function getMaterialLocation($materialLocationId)
    {
        $busMaterialLocationClassification = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationClassification');
        $busMaterialLocationExemplaryStatus = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationExemplaryStatus');
        $busMaterialLocationMaterialPhysicalType = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationMaterialPhysicalType');
        $busMaterialLocationMaterialType = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationMaterialType');
        $busMaterialLocationKnowLedgeArea = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationKnowLedgeArea');
        $busMaterialLocationLibraryUnit = $this->MIOLO->getBusiness($this->module, 'BusMaterialLocationLibraryUnit');
        
        $data = array($materialLocationId);
        $this->clear();
        $this->setColumns('materialLocationId,' . $this->colsNoId);
        $this->setTables($this->tables);
        $this->setWhere('materialLocationId = ?');
        
        $sql = $this->select($data);
        $rs  = $this->query($sql, true);
        
        if ( $rs[0] )
        {
            $data = $rs[0];
            
            //Traz os dados da Repetitive de Classificação
            $busMaterialLocationClassification->materialLocationId = $materialLocationId;
            $data->intervaloClassificacao = $busMaterialLocationClassification->searchMaterialLocationClassification(true);
            
            //Traz os dados da Repetitive de Estado de exemplar
            $busMaterialLocationExemplaryStatus->materialLocationId = $materialLocationId;
            $data->estadoExemplar = $busMaterialLocationExemplaryStatus->searchMaterialLocationExemplaryStatus(true);
            if(is_array($data->estadoExemplar)) 
            {
                foreach($data->estadoExemplar as $i => $exemplar)
                {
                    $data->estadoExemplar[$i]->sRegraExemplaryStatus = $exemplar->rule;
                }
            }

            //Traz os dados da Repetitive de Tipo fisico
            $busMaterialLocationMaterialPhysicalType->materialLocationId = $materialLocationId;
            $data->tipoFisicoDoMaterial = $busMaterialLocationMaterialPhysicalType->searchMaterialLocationMaterialPhysicalType(true);
            if(is_array($data->tipoFisicoDoMaterial)) 
            {
                foreach($data->tipoFisicoDoMaterial as $i => $tipoFisicoDoMaterial)
                {
                    $data->tipoFisicoDoMaterial[$i]->sRegraMaterialPhysicalType = $tipoFisicoDoMaterial->rule;
                }
            }

            //Traz os dados da Repetitive de Tipo
            $busMaterialLocationMaterialType->materialLocationId = $materialLocationId;
            $data->tipoDoMaterial = $busMaterialLocationMaterialType->searchMaterialLocationMaterialType(true);
            if(is_array($data->tipoDoMaterial)) 
            {
                foreach($data->tipoDoMaterial as $i => $tipoDoMaterial)
                {
                    $data->tipoDoMaterial[$i]->sRegraMaterialType = $tipoDoMaterial->rule;
                }
            }

            //Traz os dados da Repetitive de Area de conhecimento
            $busMaterialLocationKnowLedgeArea->materialLocationId = $materialLocationId;
            $data->areaConhecimento = $busMaterialLocationKnowLedgeArea->searchMaterialLocationKnowLedgeArea(true);
            if(is_array($data->areaConhecimento)) 
            {
                foreach($data->areaConhecimento as $i => $areaConhecimento)
                {
                    $data->areaConhecimento[$i]->sRegraKnowLedgeArea = $areaConhecimento->rule;
                }
            }

            //Traz os dados da Repetitive de Unidade de biblioteca
            $busMaterialLocationLibraryUnit->materialLocationId = $materialLocationId;
            $data->unidadeBiblioteca = $busMaterialLocationLibraryUnit->searchMaterialLocationLibraryUnit(true);
            if(is_array($data->unidadeBiblioteca)) 
            {
                foreach($data->unidadeBiblioteca as $i => $unidadeBiblioteca)
                {
                    $data->unidadeBiblioteca[$i]->sRegraLibraryUnit = $unidadeBiblioteca->rule;
                }
            }
        }
        $this->setData($data);
        
        return $data;
    }
    
    public function searchMaterialLocation($toObject = false, $libraryUnitNull = false, $distinct = false)
    {
        if ( strlen($this->materialLocationIdS) > 0 )
        {
            $this->setWhere('materialLocationId = ?');
            $data[] = $this->materialLocationIdS;
        }
        if ( strlen($this->descriptionS) > 0 )
        {            
            $this->setWhere('unaccent(lower(description)) LIKE unaccent(lower(?))');
            $data[] = '%' . $this->descriptionS . '%';
        }
        if ( $this->dateS )
        {
            $this->setWhere('date(date)= ?');
            $data[] = $this->dateS . '%';
        }
        if ( strlen($this->operatorS) > 0 )
        {
            $this->setWhere('unaccent(lower(operator)) LIKE unaccent(lower(?))');
            $data[] = '%' . $this->operatorS . '%';
        }

        $distinctString = $distinct ? 'distinct ' : '';
        
        $this->setTables($this->tables);
        $this->setColumns($distinctString . $this->columns);
        
        $this->setOrderBy('materialLocationId');
        $sql = $this->select($data);
        
        return $this->query($sql, $toObject);
    }

    /**
     * Insert a new record
     *
     * @param $data (object): An object of the type handled by the class
     *
     * @return True if succed, otherwise False
     *
     **/
    public function insertMaterialLocation()
    {
        $this->clear();
        $this->setColumns($this->colsNoId);
        $this->setTables($this->tables);
        $data= array($this->description,
                     $this->date,
                     $this->operator
        );
        
        $sql = $this->insert($data);
        $rs  = $this->query($sql . 'RETURNING materialLocationId');
        
        $this->materialLocationId = $rs[0][0];
        
        //Insere os dados da repetitive de Classificação
        if ( is_array($this->intervaloClassificacao) )
        {
            foreach ( $this->intervaloClassificacao as $classificacao )
            {
                $this->busMaterialLocationClassification->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationClassification->beginClassification = $classificacao->beginClassification;
                $this->busMaterialLocationClassification->endClassification = $classificacao->endClassification;
                
                $this->busMaterialLocationClassification->insertMaterialLocationClassification() == true ?  : $rs = false;
            }
        }
        
        //Insere os dados da repetitive de estado do exemplar
        if ( is_array($this->estadoExemplar) )
        {
            foreach ( $this->estadoExemplar as $estadoExemplar )
            {
                $this->busMaterialLocationExemplaryStatus->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationExemplaryStatus->exemplaryStatusId = $estadoExemplar->exemplaryStatusId;
                $this->busMaterialLocationExemplaryStatus->rule = $estadoExemplar->sRegraExemplaryStatus;
                
                $this->busMaterialLocationExemplaryStatus->insertMaterialLocationExemplaryStatus() == true ?  : $rs = false;
            }
        }
        
        //Insere os dados da repetitive de tipo físico
        if ( is_array($this->tipoFisicoDoMaterial) )
        {
            foreach ( $this->tipoFisicoDoMaterial as $tipoFisicoDoMaterial )
            {
                $this->busMaterialLocationMaterialPhysicalType->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationMaterialPhysicalType->materialPhysicalTypeId = $tipoFisicoDoMaterial->materialPhysicalTypeId;
                $this->busMaterialLocationMaterialPhysicalType->rule = $tipoFisicoDoMaterial->sRegraMaterialPhysicalType;
                
                $this->busMaterialLocationMaterialPhysicalType->insertMaterialLocationMaterialPhysicalType() == true ?  : $rs = false;
            }
        }
        
        //Insere os dados da repetitive de tipo 
        if ( is_array($this->tipoDoMaterial) )
        {
            foreach ( $this->tipoDoMaterial as $tipoDoMaterial )
            {
                $this->busMaterialLocationMaterialType->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationMaterialType->materialTypeId = $tipoDoMaterial->materialTypeId;
                $this->busMaterialLocationMaterialType->rule = $tipoDoMaterial->sRegraMaterialType;
                
                $this->busMaterialLocationMaterialType->insertMaterialLocationMaterialType() == true ?  : $rs = false;
            }
        }
        
        //Insere os dados da repetitive de area de conhecimento 
        if ( is_array($this->areaConhecimento) )
        {
            foreach ( $this->areaConhecimento as $areaConhecimento )
            {
                $this->busMaterialLocationKnowLedgeArea->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationKnowLedgeArea->knowLedgeAreaId = $areaConhecimento->knowLedgeAreaId;
                $this->busMaterialLocationKnowLedgeArea->rule = $areaConhecimento->sRegraKnowLedgeArea;
                
                $this->busMaterialLocationKnowLedgeArea->insertMaterialLocationKnowLedgeArea() == true ?  : $rs = false;
            }
        }
        
        //Insere os dados da repetitive de unidade de biblioteca
        if ( is_array($this->unidadeBiblioteca) )
        {
            
            foreach ( $this->unidadeBiblioteca as $unidadeBiblioteca )
            {
                $this->busMaterialLocationLibraryUnit->materialLocationId = $this->materialLocationId;
                $this->busMaterialLocationLibraryUnit->libraryUnitId = $unidadeBiblioteca->libraryUnitId;
                $this->busMaterialLocationLibraryUnit->rule = $unidadeBiblioteca->sRegraLibraryUnit;
                
                $this->busMaterialLocationLibraryUnit->insertMaterialLocationLibraryUnit() == true ?  : $rs = false;
            }
        }
        
        return $rs ? true : false;
    }
    
    /**
     * Update data from a specific record
     *
     * @param $data (object): Data which will replace the old record data
     *
     * @return (boolean): True if succeed, otherwise False
     *
     **/
    public function updateMaterialLocation()
    {        
        $data = $this->associateData( $this->colsNoId . ', materialLocationId' );
        $this->clear();
        $this->setWhere('materialLocationId = ?');
        $this->setColumns($this->colsNoId);
        $this->setTables($this->tables);
        
        $sql = $this->update($data);
        $rs  = $this->execute($sql);
        
        //Deleta todos os registros das repetitives
        if ($this->materialLocationId)
        {
            //Classificação
            $this->busMaterialLocationClassification->materialLocationId = $this->materialLocationId;
            $searchClassification = $this->busMaterialLocationClassification->searchMaterialLocationClassification(TRUE);
            if ($searchClassification)
            {
                foreach ($searchClassification as $valueClassification)
                {
                    $this->busMaterialLocationClassification->deleteMaterialLocationClassification($valueClassification->materialLocationClassificationId);
                }
            }
            
            //Estado do exemplar
            $this->busMaterialLocationExemplaryStatus->materialLocationId = $this->materialLocationId;
            $searchExemplaryStatus = $this->busMaterialLocationExemplaryStatus->searchMaterialLocationExemplaryStatus(TRUE);
            if ($searchExemplaryStatus)
            {
                foreach ($searchExemplaryStatus as $valueExemplaryStatus)
                {
                    $this->busMaterialLocationExemplaryStatus->deleteMaterialLocationExemplaryStatus($valueExemplaryStatus->materialExemplaryStatusId);
                }
            }
            
            //Tipo físico
            $this->busMaterialLocationMaterialPhysicalType->materialLocationId = $this->materialLocationId;
            $searcMaterialPhysicalType = $this->busMaterialLocationMaterialPhysicalType->searchMaterialLocationMaterialPhysicalType(TRUE);
            if ($searcMaterialPhysicalType)
            {
                foreach ($searcMaterialPhysicalType as $valueMaterialPhysicalType)
                {
                    $this->busMaterialLocationMaterialPhysicalType->deleteMaterialLocationMaterialPhysicalType($valueMaterialPhysicalType->materialLocationMaterialPhysicalTypeId);
                }
            }
            
            //Tipo
            $this->busMaterialLocationMaterialType->materialLocationId = $this->materialLocationId;
            $searchMaterialType = $this->busMaterialLocationMaterialType->searchMaterialLocationMaterialType(TRUE);
            if ($searchMaterialType)
            {
                foreach ($searchMaterialType as $valueMaterialType)
                {
                    $this->busMaterialLocationMaterialType->deleteMaterialLocationMaterialType($valueMaterialType->materialLocationMaterialTypeId);
                }
            }
            
            //Area de conhecimento
            $this->busMaterialLocationKnowLedgeArea->materialLocationId = $this->materialLocationId;
            $searchKnowLedgeArea = $this->busMaterialLocationKnowLedgeArea->searchMaterialLocationKnowLedgeArea(TRUE);
            if ($searchKnowLedgeArea)
            {
                foreach ($searchKnowLedgeArea as $valueKnowLedgeArea)
                {
                    $this->busMaterialLocationKnowLedgeArea->deleteMaterialLocationKnowLedgeArea($valueKnowLedgeArea->materialLocationKnowLedgeAreaId);
                }
            }
            
            //Unidade de biblioteca
            $this->busMaterialLocationLibraryUnit->materialLocationId = $this->materialLocationId;
            $searchLibraryUnit = $this->busMaterialLocationLibraryUnit->searchMaterialLocationLibraryUnit(TRUE);
            if ($searchLibraryUnit)
            {
                foreach ( $searchLibraryUnit as $valueLibraryUnit )
                {
                    $this->busMaterialLocationLibraryUnit->deleteMaterialLocationLibraryUnit($valueLibraryUnit->materialLocationLibraryUnitId);
                }
            }
        }
        
        //Insere os dados da repetitive de Classificação
        if ( is_array($this->intervaloClassificacao) )
        {
            foreach ( $this->intervaloClassificacao as $classificacao )
            {
                if (strlen($classificacao->removeData) <= 0 )
                {
                    $this->busMaterialLocationClassification->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationClassification->beginClassification = $classificacao->beginClassification;
                    $this->busMaterialLocationClassification->endClassification = $classificacao->endClassification;

                    $this->busMaterialLocationClassification->insertMaterialLocationClassification() == true ?  : $rs = false;
                }
            }
        }
        
        //Insere os dados da repetitive de estado do exemplar
        if ( is_array($this->estadoExemplar) )
        {
            foreach ( $this->estadoExemplar as $estadoExemplar )
            {
                
                if (strlen($estadoExemplar->removeData) <= 0 )
                {
                    $this->busMaterialLocationExemplaryStatus->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationExemplaryStatus->exemplaryStatusId = $estadoExemplar->exemplaryStatusId;
                    $this->busMaterialLocationExemplaryStatus->rule = $estadoExemplar->sRegraExemplaryStatus;

                    $this->busMaterialLocationExemplaryStatus->insertMaterialLocationExemplaryStatus() == true ?  : $rs = false;
                }
            }
        }
        
        //Insere os dados da repetitive de tipo físico
        if ( is_array($this->tipoFisicoDoMaterial) )
        {
            foreach ( $this->tipoFisicoDoMaterial as $tipoFisicoDoMaterial )
            {
                if (strlen($tipoFisicoDoMaterial->removeData) <= 0 )
                {
                    $this->busMaterialLocationMaterialPhysicalType->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationMaterialPhysicalType->materialPhysicalTypeId = $tipoFisicoDoMaterial->materialPhysicalTypeId;
                    $this->busMaterialLocationMaterialPhysicalType->rule = $tipoFisicoDoMaterial->sRegraMaterialPhysicalType;

                    $this->busMaterialLocationMaterialPhysicalType->insertMaterialLocationMaterialPhysicalType() == true ?  : $rs = false;
                }
            }
        }
        
        //Insere os dados da repetitive de tipo 
        if ( is_array($this->tipoDoMaterial) )
        {
            foreach ( $this->tipoDoMaterial as $tipoDoMaterial )
            {
                if (strlen($tipoDoMaterial->removeData) <= 0 )
                {
                    $this->busMaterialLocationMaterialType->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationMaterialType->materialTypeId = $tipoDoMaterial->materialTypeId;
                    $this->busMaterialLocationMaterialType->rule = $tipoDoMaterial->sRegraMaterialType;

                    $this->busMaterialLocationMaterialType->insertMaterialLocationMaterialType() == true ?  : $rs = false;
                }
            }
        }
        
        //Insere os dados da repetitive de area de conhecimento 
        if ( is_array($this->areaConhecimento) )
        {
            foreach ( $this->areaConhecimento as $areaConhecimento )
            {
                if (strlen($areaConhecimento->removeData) <= 0 )
                {
                    $this->busMaterialLocationKnowLedgeArea->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationKnowLedgeArea->knowLedgeAreaId = $areaConhecimento->knowLedgeAreaId;
                    $this->busMaterialLocationKnowLedgeArea->rule = $areaConhecimento->sRegraKnowLedgeArea;

                    $this->busMaterialLocationKnowLedgeArea->insertMaterialLocationKnowLedgeArea() == true ?  : $rs = false;
                }
            }
        }
        
        //Insere os dados da repetitive de unidade de biblioteca
        if ( is_array($this->unidadeBiblioteca) )
        {
            foreach ( $this->unidadeBiblioteca as $unidadeBiblioteca )
            {
                if (strlen($unidadeBiblioteca->removeData) <= 0 )
                {
                    $this->busMaterialLocationLibraryUnit->materialLocationId = $this->materialLocationId;
                    $this->busMaterialLocationLibraryUnit->libraryUnitId = $unidadeBiblioteca->libraryUnitId;
                    $this->busMaterialLocationLibraryUnit->rule = $unidadeBiblioteca->sRegraLibraryUnit;

                    $this->busMaterialLocationLibraryUnit->insertMaterialLocationLibraryUnit() == true ?  : $rs = false;
                }
            }
        }

        return $rs;
    }

    /**
     * Delete a record
     *
     * @param $moduleConfig (string): Primary key for deletion
     * @param $parameter (string): Primary key for deletion
     *
     * @return (boolean): True if succeed, otherwise False
     *
     **/
    public function deleteMaterialLocation($materialLocationId)
    {
        $data = array($materialLocationId);

        //Deleta todos os registros das repetitives
        if ($materialLocationId)
        {
            //Classificação
            $this->busMaterialLocationClassification->clear();
            $this->busMaterialLocationClassification->materialLocationId = $materialLocationId;
            $searchClassification = $this->busMaterialLocationClassification->searchMaterialLocationClassification(TRUE);
            if ($searchClassification)
            {
                foreach ($searchClassification as $valueClassification)
                {
                    $this->busMaterialLocationClassification->deleteMaterialLocationClassification($valueClassification->materialLocationClassificationId);
                }
            }
            
            //Estado do exemplar
            $this->busMaterialLocationExemplaryStatus->clear();
            $this->busMaterialLocationExemplaryStatus->materialLocationId = $materialLocationId;
            $searchExemplaryStatus = $this->busMaterialLocationExemplaryStatus->searchMaterialLocationExemplaryStatus(TRUE);
            if ($searchExemplaryStatus)
            {
                foreach ($searchExemplaryStatus as $valueExemplaryStatus)
                {
                    $this->busMaterialLocationExemplaryStatus->deleteMaterialLocationExemplaryStatus($valueExemplaryStatus->materialExemplaryStatusId);
                }
            }
            
            //Tipo físico
            $this->busMaterialLocationMaterialPhysicalType->clear();
            $this->busMaterialLocationMaterialPhysicalType->materialLocationId = $materialLocationId;
            $searcMaterialPhysicalType = $this->busMaterialLocationMaterialPhysicalType->searchMaterialLocationMaterialPhysicalType(TRUE);
            if ($searcMaterialPhysicalType)
            {
                foreach ($searcMaterialPhysicalType as $valueMaterialPhysicalType)
                {
                    $this->busMaterialLocationMaterialPhysicalType->deleteMaterialLocationMaterialPhysicalType($valueMaterialPhysicalType->materialLocationMaterialPhysicalTypeId);
                }
            }
            
            //Tipo
            $this->busMaterialLocationMaterialType->clear();
            $this->busMaterialLocationMaterialType->materialLocationId = $materialLocationId;
            $searchMaterialType = $this->busMaterialLocationMaterialType->searchMaterialLocationMaterialType(TRUE);
            if ($searchMaterialType)
            {
                foreach ($searchMaterialType as $valueMaterialType)
                {
                    $this->busMaterialLocationMaterialType->deleteMaterialLocationMaterialType($valueMaterialType->materialLocationMaterialTypeId);
                }
            }
            
            //Area de conhecimento
            $this->busMaterialLocationKnowLedgeArea->clear();
            $this->busMaterialLocationKnowLedgeArea->materialLocationId = $materialLocationId;
            $searchKnowLedgeArea = $this->busMaterialLocationKnowLedgeArea->searchMaterialLocationKnowLedgeArea(TRUE);
            if ($searchKnowLedgeArea)
            {
                foreach ($searchKnowLedgeArea as $valueKnowLedgeArea)
                {
                    $this->busMaterialLocationKnowLedgeArea->deleteMaterialLocationKnowLedgeArea($valueKnowLedgeArea->materialLocationKnowLedgeAreaId);
                }
            }
            
            //Unidade de biblioteca
            $this->busMaterialLocationLibraryUnit->clear();
            $this->busMaterialLocationLibraryUnit->materialLocationId = $materialLocationId;
            $searchLibraryUnit = $this->busMaterialLocationLibraryUnit->searchMaterialLocationLibraryUnit(TRUE);
            if ($searchLibraryUnit)
            {
                foreach ( $searchLibraryUnit as $valueLibraryUnit )
                {
                    $this->busMaterialLocationLibraryUnit->deleteMaterialLocationLibraryUnit($valueLibraryUnit->materialLocationLibraryUnitId);
                }
            }
            
            //Imagem
            $this->busFile->folder = 'location';
            $this->busFile->fileName = $materialLocationId;
            $file = $this->busFile->searchFile($materialLocationId);
            if ( $file )
            {
                $this->busFile->deleteFile($file[0]->absolute);
            }
        }
        
        $this->clear();
        $this->setTables($this->tables);
        $this->setWhere('materialLocationId = ?');
        $sql = $this->delete($data);
        $rs  = $this->execute($sql);

        return $rs;
    }
    
    /**
     * Retorna um array de regras já ordenados de acordo com a preferência 
     * 
     * @param type $controlNumber
     * @return array
     */
    public function getRegras($controlNumber)
    {
        //Busca os exemplares da obra
        $this->busExemplaryControl->controlNumberS = $controlNumber;
        $exemplares = $this->busExemplaryControl->searchExemplaryControl(true);
        
        $regras = array();
        foreach ( $exemplares as $exemplar )
        {
            //Recebe as informações dos exemplares
            $info = $this->busExemplaryControl->getExemplaryControl($exemplar->itemNumber, true);
            
            $existe = false;
            // Verifica se já existe regra igual.
            foreach ( $regras as $regra )
            {
                if ( $regra->classification == $info->classification 
                     && $regra->exemplaryStatusId == $info->exemplaryStatusId 
                     && $regra->materialTypeId == $info->materialTypeId 
                     && $regra->materialPhysicalTypeId == $info->materialPhysicalTypeId 
                     && $regra->knowledgeArea == $info->knowledgeArea 
                     && $regra->libraryUnitId == $info->libraryUnitId )
                {
                    $existe = true;
                    break;
                }
            }

            //Se ainda não existe regra igual, traz esta regra MATERIAL_LOCATION_ORDER para colocar no accordion de Localização
            if ( $existe != true )
            {
                $object = new stdClass();

                $object->classification = $info->classification;
                $object->exemplaryStatusId = $info->exemplaryStatusId;
                $object->materialTypeId = $info->materialTypeId;
                $object->materialPhysicalTypeId = $info->materialPhysicalTypeId;
                $object->knowledgeArea = $info->knowledgeArea;
                $object->libraryUnitId = $info->libraryUnitId;

                $regras[] = $object;
            }
        }
        
        foreach ( $regras as $regra )
        {
            $data = array($regra->classification,
                          $regra->materialTypeId,
                          $regra->materialPhysicalTypeId,
                          $regra->libraryUnitId,
                          $regra->exemplaryStatusId,
                          $regra->knowledgeArea );
            
            $this->clear();
            $this->setColumns('getMaterialLocation(?, ?, ?, ?, ?, ?)');
            $sql = $this->select($data);
            $rs[] = $this->query($sql);
        }
        
        foreach ( $rs as $r )
        {
            foreach( $r as $res )
            {
                $results[] = $res[0];
            }
        }
        
        //Faz unique caso tenha duas regras com dados diferentes
        $result = array_unique($results);
        
        $regrasLocalizada = array();
        foreach ( $result as $rs )
        {
            //Busca as regras
            $regrasLocalizada[] = $this->getMaterialLocation($rs);
        }
        
        //Caso tenha algo na preferência, ordena por ela
        if ( strlen(MATERIAL_LOCATION_ORDER) > 0 )
        {
            //Quebra a preferência por linha em branco
            $ordem = explode("\n", MATERIAL_LOCATION_ORDER);

            $regrasOrdenadas = array();

            foreach ( $ordem as $rule )
            {
                //Quebra a preferência por '-'
                $composition = explode('-', $rule);

                //Percorre cada uma das regras para ordenação
                foreach ( $regrasLocalizada as $i => $regra )
                {
                    $tipoDoMaterialBool = null;
                    $tipoFisicoDoMaterialBool = null;
                    $estadoExemplarBool = null;
                    foreach ( $regra->tipoDoMaterial as $tipo )
                    {
                        if ( $tipo->materialTypeId == $composition[0] )
                        {
                            $tipoDoMaterialBool = true;
                        }
                    }
                    foreach ( $regra->tipoFisicoDoMaterial as $tipoFisico )
                    {
                        if ( $tipoFisico->materialPhysicalTypeId == $composition[1] )
                        {
                            $tipoFisicoDoMaterialBool = true;
                        }
                    }
                    foreach ( $regra->estadoExemplar as $estadoExemplar )
                    {
                        if ( $estadoExemplar->exemplaryStatusId == $composition[2] )
                        {
                            $estadoExemplarBool = true;
                        }
                    }

                    //Caso "tipo", "tipo físico" e "estado do exemplar" das regras forem iguais aos da preferência, coloca estas em ordem
                    if ( $tipoDoMaterialBool && $tipoFisicoDoMaterialBool && $estadoExemplarBool )
                    {
                        $regrasOrdenadas[] = $regra;
                        unset($regrasLocalizada[$i]);
                    }
                }
            }
        }
        
        //Adiciona as demais regras que não tem ordem de forma aleatória
        foreach ( $regrasLocalizada as $regra )
        {
            $regrasOrdenadas[] = $regra;
        }

        return $regrasOrdenadas;
    }
}

?>