<?php
/**
 * Copyright 2005-2019 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.
 * 
 * 
 * RemissiveDictionary business
 *
 *
 *
 *
 *
 **/
class BusinessGnuteca3BusDictionaryRemissive extends GBusiness
{
    public $dictionaryRemissiveId;
    public $dictionaryContentId;
    public $remissiveContent;
    public $line;

    public function __construct()
    {
        $table = 'gtcdictionaryremissive';
        $pkeys = 'dictionaryRemissiveId';
        $cols  = 'dictionaryContentId,
                  remissiveContent,
                  line';
        parent::__construct($table, $pkeys, $cols);
    }

    public function insertDictionaryRemissive()
    {
    	if ($this->removeData)
    	{
    		if ( $this->dictionaryRemissiveId != FALSE )
    		{
    			$this->deleteDictionaryRemissive($this->dictionaryRemissiveId);
    		}
            
    		return TRUE;
    	}
        
        return $this->autoInsert();
    }

    public function updateDictionaryRemissive()
    {
    	if (($this->removeData) || (!$this->dictionaryRemissiveId))
    	{
    		$this->insertDictionaryRemissive();
    		return TRUE;
    	}
        
        return $this->autoUpdate();
    }

    public function deleteDictionaryRemissive($dictionaryRemissiveId)
    {
        return $this->autoDelete($dictionaryRemissiveId);
    }

    public function getDictionaryRemissive($dictionaryRemissiveId)
    {
        $this->clear();
        return $this->autoGet($dictionaryRemissiveId);
    }

    public function searchDictionaryRemissive($toObject = false)
    {
        $this->clear();
        $filters = array(
            'dictionaryRemissiveId'=> 'equals',
            'dictionaryContentId' => 'equals',
            'remissiveContent' => 'ilike',
            'line' => 'equals'
        );
        
        return $this->autoSearch($filters, $toObject);
    }

    public function listDictionaryRemissive()
    {
        return $this->autoList();
    }
    
    public function updateMaterialContent($dictionaryId, $dictionaryContentId, $content, $dictionaryRemissives)
    {
        $MIOLO = MIOLO::getInstance();
        
        $busDictionary = $MIOLO->getBusiness($this->module, 'BusDictionary');
        $dic = $busDictionary->getDictionaryForRemissivesUpdate( $dictionaryId );
        
        $busMaterial = $MIOLO->getBusiness('gnuteca3', 'BusMaterial');
        $busMaterialHistory = $MIOLO->getBusiness('gnuteca3', 'BusMaterialHistory');
        
        // Remove os registros excluídos da repetitive field.
        if ( $dictionaryRemissives )
        {
            $dictionaryRemissivesAux = array();
            
            foreach ( $dictionaryRemissives as $remissive )
            {
                if ( !isset($remissive->removeData) )
                {
                    $dictionaryRemissivesAux[] = $remissive;
                }
            }
            
            $dictionaryRemissives = $dictionaryRemissivesAux;
        }
        
        // Se o dicionário tiver destino de remissiva configurado, copia as remissivas do conteúdo para o campo destino.
        if ( $dic->remissiveTag )
        {
            $tags = array();
            
            if ( is_array($dic->tags) )
            {
                foreach ( $dic->tags as $line => $tag )
                {
                    //$tag = explode('.', $tag); //separa campo e subcampo
                    $tags[$line]=  "( fieldId='" . $tag->fieldId . "' and subfieldid='" . $tag->subfieldId . "')";
                }

                $tags = implode(' or ' , $tags);
            }

            $remissiveTag = $dic->remissiveTag;
            $remissieveTagParts = explode('.', $remissiveTag);

            $remissiveFieldId = $remissieveTagParts[0];
            $remissiveSubfieldId = $remissieveTagParts[1];

            $sql = "SELECT controlnumber FROM gtcmaterial WHERE content = '{$content}' AND ({$tags})";

            $result = $this->query($sql);

            if ( $result )
            {
                // Itera sobre obras que utilizam o dicionário.
                foreach ( $result as $i => $content )
                {
                    $controlNumber = $content[0];
                    $this->updateMaterial($controlNumber, $remissiveFieldId, $remissiveSubfieldId, $dictionaryRemissives, null);
                }
            }
        }
    }
    
    /**
     * Atualiza os materiais (com as remissivas) que utilizam o determinado conteúdo de dicionário.
     * 
     * @param integer $controlNumber Número de controle.
     * @param String $remissiveFieldId Campo da remissiva.
     * @param String $remissiveSubfieldId Subcampo da remissiva.
     * @param array $dictionaryRemissives Vetor contendo as remissivas do conteúdo de dicionário.
     * @param integer $revisionNumber Número da revisão para o histórico do material.
     */
    public function updateMaterial($controlNumber, $remissiveFieldId, $remissiveSubfieldId, $dictionaryRemissives, $revisionNumber=NULL)
    {
        $MIOLO = MIOLO::getInstance();
        $busMaterial = $MIOLO->getBusiness('gnuteca3', 'BusMaterial');
        $busMaterialHistory = $MIOLO->getBusiness('gnuteca3', 'BusMaterialHistory');
        
        // Prepara objeto do histórico.
        $historyObj= new stdClass();
        $historyObj->controlNumber = $controlNumber;
        // $historyObj->revisionNumber = $busMaterialHistory->getNextRevision($controlNumber);
        $historyObj->operator = GOperator::getOperatorId();
        $historyObj->data = GDate::now()->getDate(GDate::MASK_TIMESTAMP_DB);
        $historyObj->fieldId = $remissiveFieldId;
        $historyObj->subFieldId = $remissiveSubfieldId;

        //adiciona os indicadores
        $historyObj->previousIndicator1 = null;
        $historyObj->currentIndicator1 = null;
        $historyObj->previousIndicator2 = null;
        $historyObj->currentIndicator2 = null;
        $historyObj->previousprefixid = null;
        $historyObj->currentprefixid = null;
        $historyObj->previoussuffixid = null;
        $historyObj->currentsuffixid = null;
        $historyObj->previousseparatorid = null;
        $historyObj->currentseparatorid = null;

        // Obtém o conteúdo da remissiva do material.
        $remissiveMaterialContent = $busMaterial->getContent($controlNumber, $remissiveFieldId, $remissiveSubfieldId, null, true, true, 'line');

        // Itera sobre as remissivas para inserir/editar.
        foreach ( $dictionaryRemissives as $remissiveLine => $remissive )
        {
            if ( !isset($remissiveMaterialContent[$remissiveLine]) )
            {
                if ( !$revisionNumber )
                {
                    $revisionNumber = $busMaterialHistory->getNextRevision($controlNumber);
                }

                $historyObj->revisionNumber = $revisionNumber;

                // Histórico do material .
                $historyInsert = $historyObj;
                $historyInsert->chancesType  = BusinessGnuteca3BusMaterialHistory::CHANGETYPE_INSERT;

                $historyInsert->previousLine = $remissiveLine;
                $historyInsert->currentLine = $remissiveLine;

                $historyInsert->previousContent = '';
                $historyInsert->currentContent = $remissive->remissiveContent;

                $busMaterialHistory->clean();
                $busMaterialHistory->setData($historyInsert);
                $busMaterialHistory->insertMaterialHistory();

                // Insere na gtcmaterial.
                $materialObj->controlNumber = $controlNumber;
                $materialObj->fieldid = $remissiveFieldId;
                $materialObj->subfieldid = $remissiveSubfieldId;
                $materialObj->line = $remissiveLine;
                $materialObj->content = $remissive->remissiveContent;

                $busMaterial->clean();
                $busMaterial->setData($materialObj);
                $busMaterial->insertMaterial();
            }
            elseif ( $remissive->remissiveContent != $remissiveMaterialContent[$remissiveLine]->content)
            {
                if ( !$revisionNumber )
                {
                    $revisionNumber = $busMaterialHistory->getNextRevision($controlNumber);
                }

                $historyObj->revisionNumber = $revisionNumber;

                // Atualiza.
                $historyUpdate = $historyObj;
                $historyUpdate->chancesType  = BusinessGnuteca3BusMaterialHistory::CHANGETYPE_UPDATE;

                $historyUpdate->previousLine = $remissiveLine;
                $historyUpdate->currentLine = $remissiveLine;

                $historyUpdate->previousContent = $remissiveMaterialContent[$remissiveLine]->content;
                $historyUpdate->currentContent = $remissive->remissiveContent;

                $busMaterialHistory->clean();
                $busMaterialHistory->setData($historyUpdate);
                $busMaterialHistory->insertMaterialHistory();

                // Insere na gtcmaterial.
                $materialObj->controlNumber = $controlNumber;
                $materialObj->fieldid = $remissiveFieldId;
                $materialObj->subfieldid = $remissiveSubfieldId;
                $materialObj->line = $remissiveLine;
                $materialObj->content = $remissive->remissiveContent;

                $busMaterial->clean();
                $busMaterial->setData($materialObj);
                $busMaterial->updateMaterialContent();
            }
        }

        //Itera para remoção.
        foreach ( $remissiveMaterialContent as $line => $materialContent)
        {
            if ( !isset($dictionaryRemissives[$line]) )
            {
                if ( !$revisionNumber )
                {
                    $revisionNumber = $busMaterialHistory->getNextRevision($controlNumber);
                }

                $historyObj->revisionNumber = $revisionNumber;
                // Histórico do material.
                $historyDelete = $historyObj;
                $historyDelete->chancesType  = BusinessGnuteca3BusMaterialHistory::CHANGETYPE_DELETE;

                $historyDelete->previousLine = $line;
                $historyDelete->currentLine = $line;

                $historyDelete->previousContent = $materialContent->content;
                $historyDelete->currentContent = '';

                $busMaterialHistory->clean();
                $busMaterialHistory->setData($historyDelete);
                $busMaterialHistory->insertMaterialHistory();

                // Insere na gtcmaterial.
                $materialObj->controlNumber = $controlNumber;
                $materialObj->fieldid = $remissiveFieldId;
                $materialObj->subfieldid = $remissiveSubfieldId;
                $materialObj->line = $line;

                $busMaterial->clean();
                $busMaterial->setData($materialObj);
                $busMaterial->deleteMaterial();
            }
        }
    }
    
    public function clean()
    {
        $this->dictionaryRemissiveId = null;
        $this->dictionaryContentId = null;
        $this->remissiveContent = null;
        $this->line = null;
    }

}
?>