<?php
/**
 * Copyright 2005-2017 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->uses( 'forms/FrmBarCode.class.php', $module );
class FrmBackOfBook extends FrmBarCode
{
    public $MIOLO;
    public $module;
    public $business;
    public $busExemplaryControl;
    public $busLibraryUnit;

    const OPTION_CONTROL_NUMBER = 1;
    const OPTION_ITEM_NUMBER    = 2;
    
    const OPTION_TEXT_ALIGMENT_CENTER = 'C';
    const OPTION_TEXT_ALIGMENT_LEFT = 'L';
    const OPTION_TEXT_ALIGMENT_RIGHT = 'R';

    public function __construct()
    {
        $this->MIOLO    = MIOLO::getInstance();
        $this->module   = MIOLO::getCurrentModule();
        $this->business            = $this->MIOLO->getBusiness($this->module, 'BusFormatBackOfBook');
        $this->busExemplaryControl = $this->MIOLO->getBusiness($this->module, 'BusExemplaryControl');
        $this->busLibraryUnit      = $this->MIOLO->getBusiness($this->module, 'BusLibraryUnit');

        //Define internal format options
        define('OPTION_ILABEL_NO',       1);
        define('OPTION_ILABEL_YES_SAME', 2);
        define('OPTION_ILABEL_YES_DIFF', 3);
        define('OPTION_ILABEL_ONLY',     4);

        define('OPTION_BARCODE_NO', 1);
        define('OPTION_BARCODE_YES_SAME', 2);
        define('OPTION_BARCODE_YES_DIFF', 3);
        define('OPTION_BARCODE_YES_SAME_RIGHT', 4);
        
        $this->forceCreateFields = true;
        $this->setTransaction('gtcBackOfBook');
        parent::__construct( _M('Lombada', $this->module) );

        if (GForm::primeiroAcessoAoForm())
        {
            GRepetitiveField::clearData('codes');
        }

        //força formulário de busca
        $this->setSearchFunction('test');
    }

    public function mainFields()
    {
        $lbl = new MLabel( _M('Intervalo', $this->module) . ':' );
        $lbl->setWidth(FIELD_LABEL_SIZE);
        $interval   = new MRadioButtonGroup('interval', null, $this->getIntervalList(), FrmBarCode::INTERVAL_CONTINUOUS, null, 'vertical');
        $form       = $this->manager->page->getFormId();
        $interval->addAttribute('onchange', "miolo.doAjax( (dojo.byId('interval_0').checked ? 'getContinuousFields' : 'getDiscreteFields') ,'','{$form}');miolo.doAjax('changeBackOfBookOptions', '', '__mainForm');");
        $fields[]   = new GContainer('hctInterval', array($lbl, $interval));

        $options = array(
            array(_M('Número do exemplar', $this->module), self::OPTION_ITEM_NUMBER),
            array(_M('Número de controle', $this->module), self::OPTION_CONTROL_NUMBER),
        );

        $fields[] = $exemplarys = new GRadioButtonGroup('exemplarys', _M('Exemplares', $this->module), $options, self::OPTION_ITEM_NUMBER, null, 'vertical');
        $fields[] = $divInterval = new MDiv('divInterval', $this->getContinuousFields(TRUE));

        $fields[] = $divOptions = new MDiv('divOptions', $this->getOptionsFields(TRUE));

        $fields[] = $formatBackOfBookId = new GSelection('formatBackOfBookId', 3, _M('Formato da lombada', $this->module), $this->business->listFormatBackOfBook());
        $fields[] = new MSeparator();
        $fields[] = $fontSize = new GSelection('fontSize', '10', _M('Tamanho da fonte', $this->module) , $this->getSizeList() , false, null, null, true);
        $fontSize->addStyle('width','60px');
        
        $fields[] = $beginLabel = new MIntegerField('beginLabel', '1', _M('Etiqueta inicial', $this->module), 5);

        $labelLayout = new MLabel( _M('Modelo de etiqueta','gnuteca3'));
        $labelLayout->setWidth(FIELD_LABEL_SIZE);
        $labelLayoutId = new GLookupTextField ('labelLayout',  DEFAULT_BARCODE_LABEL_LAYOUT, '', FIELD_LOOKUPFIELD_SIZE, null, null, 'labelLayoutDescription, lines, columns, topMargin, leftMargin, verticalSpacing, horizontalSpacing, labelHeight, labelWidth, pageFormat, pageOrientation, pageOrientationDesc', $this->module, 'LabelLayout');
        $labelLayoutId->setContext($this->module, $this->module, 'LabelLayout', 'filler', 'labelLayout,labelLayoutDescription,lines,columns,topMargin,leftMargin,verticalSpacing,horizontalSpacing,labelHeight,labelWidth,pageFormat,pageOrientation,pageOrientationDesc', '', true);
        $labelLayoutDescription = new MTextField ('labelLayoutDescription', '', null, FIELD_DESCRIPTION_LOOKUP_SIZE);
        $labelLayoutDescription->setReadOnly(true);
        $fields[] = new GContainer('labelLayoutContainer', array($labelLayout, $labelLayoutId, $labelLayoutDescription));
        $fields[] = $this->getLabelFields();

        $fields[] = new MButton('BtnPrint', _M('Gerar', $this->module) , GUtil::getAjax('tbBtnPrint_click'), GUtil::getImageTheme('print-16x16.png'));

        $this->forceFormContent = TRUE;
        $this->setFields($fields);
        $this->setLabelWidth(FIELD_LABEL_SIZE);
        $this->setShowPostButton(false);

        //desabilita botões da toolbar
        $this->_toolBar->disableButton( MToolBar::BUTTON_DELETE );
        $this->_toolBar->disableButton( MToolBar::BUTTON_NEW );
        $this->_toolBar->disableButton( MToolBar::BUTTON_RESET );
        $this->_toolBar->disableButton( MToolBar::BUTTON_SAVE );
        
        if ( $this->primeiroAcessoAoForm()  && ( $this->GetField('interval')->value == self::INTERVAL_DISCRETE ) ) 
        {
            $this->page->onload(  GUtil::getAjax('getDiscreteFields') );
        }

        if ( $this->primeiroAcessoAoForm()  )
        {
           $this->page->onload(  GUtil::getAjax('changeBackOfBookOptions') );
        }

        // caso parametro esteja ativo ele desabilita alguns campos da tela
        if ( PRINT_MODE_TAG == 1 || PRINT_MODE_TAG == 2 )
        {
            $labelLayoutId->setReadOnly(true);
            $fontSize->setReadOnly(true);
            $beginLabel->setReadOnly(true);
            $this->page->onLoad("document.getElementById(\"divOptions\").style.display = \"none\"");
        }
    }

    public function tbBtnPrint_click($data = null)
    {
        $beginCode     = $this->beginCode->value;
        $endCode       = $this->endCode->value;
        $interval      = $data->interval;
        $exemplarys    = $data->exemplarys;
        
        if ( ($interval == FrmBarCode::INTERVAL_CONTINUOUS) && ($exemplarys == self::OPTION_ITEM_NUMBER) )
        {
            $lengthFirst = strlen(trim($beginCode));

            //Se foi passada a quantidade de zeros para preencher o codigo
            if ($data->barCodeCharacter > 0 )
            {
                $lengthFirst = $data->barCodeCharacter;
            }
            
            for ( $x = $beginCode; $x <= $endCode; $x++ )
            {
                $itemNumber = GUtil::strPad($x, $lengthFirst, '0', STR_PAD_LEFT);
                $itemNumber = BusinessGnuteca3BusExemplaryControl::itemNumberFormat($itemNumber);
                $codes[$itemNumber] = $this->busExemplaryControl->getExemplaryControl( $itemNumber );
            }
        }

        if ( ($interval == FrmBarCode::INTERVAL_DISCRETE) && ($exemplarys == self::OPTION_ITEM_NUMBER) )
        {
            $codeList = GRepetitiveField::getData('codes');
            $codes    = null;

            if ($codeList)
            {
                foreach ($codeList as $key => $c)
                {
                    //Não adicionar exemplares excluídos
                    if (!$c->removeData)
                    {
                        $c->itemNumber = BusinessGnuteca3BusExemplaryControl::itemNumberFormat($c->itemNumber);
                        $codes[$key] = $this->busExemplaryControl->getExemplaryControl($c->itemNumber);
                    }
                }
            }
        }

        if ( ($interval == FrmBarCode::INTERVAL_CONTINUOUS) && ($exemplarys == self::OPTION_CONTROL_NUMBER) )
        {
            $lengthFirst = strlen(trim($beginCode));

            for ($x=$beginCode; $x<=$endCode; $x++)
            {
                $itemNumber = GUtil::strPad($x, $lengthFirst, '0', STR_PAD_LEFT);
                $exemplary = $this->busExemplaryControl->getExemplaryOfMaterial($itemNumber);

                if ($exemplary)
                {
                    foreach ($exemplary as $ex)
                    {
                        $codes[ $ex->itemNumber ] = $ex;
                    }
                }
            }
        }

        if ( ($interval == FrmBarCode::INTERVAL_DISCRETE) && ($exemplarys == self::OPTION_CONTROL_NUMBER) )
        {
            $codeList = GRepetitiveField::getData('codes');
            $codes    = null;
            if ($codeList)
            {
                foreach ($codeList as $c)
                {
                    //Não adicionar números de controle excluídos
                    if (!$c->removeData)
                    {
                        $exemplary = $this->busExemplaryControl->getExemplaryOfMaterial($c->itemNumber);

                        if ($exemplary)
                        {
                            foreach ($exemplary as $ex)
                            {
                                $codes[ $ex->itemNumber ] = $ex;
                            }
                        }
                    }
                }
            }
        }
        
        $this->MIOLO->getClass($this->module, 'GPDFLabel');
        $this->MIOLO->getClass($this->module, 'report/rptBackOfBook');
        
        $report = new rptBackOfBook($data, $codes);

        if ( PRINT_MODE_TAG != 1 && PRINT_MODE_TAG != 2 )
        {
            $report->showDownloadInfo();
        }
        else
        {
            return  $this->information( _M('Impressão realizada!', 'gnuteca3'));;
        }
    }
    
    public function getOptionsFields($return = FALSE,$args = NULL)
    {
        $MIOLO = MIOLO::getInstance();
        $busFormContent = $MIOLO->getBusiness('gnuteca3', 'BusFormContent');

        $busFormContent->form = 'frmbackofbook';
        $search = $busFormContent->searchFormContent(true);
        $formContentValues = array();

        if ( is_array($search) && count($search) > 0 )
        {
            $busFormContent->getFormContent($search[0]->formContentId);

            if ( is_array($busFormContent->formContentDetail) && count($busFormContent->formContentDetail) > 0 )
            {
                foreach ( $busFormContent->formContentDetail as $formContentDetail )
                {
                    $formContentValues[$formContentDetail->field] = $formContentDetail->value;
                }
            }
        }

        $options = array(
            OPTION_BARCODE_NO       => _M('Não', $this->module),
            OPTION_BARCODE_YES_SAME => _M('Sim, na mesma etiqueta (esquerda)', $this->module),
            OPTION_BARCODE_YES_SAME_RIGHT => _M('Sim, na mesma etiqueta (direita)', $this->module),
            OPTION_BARCODE_YES_DIFF => _M('Sim, em etiqueta diferente', $this->module)
        );        

        $value = isset($formContentValues['barCodeType']) ? $formContentValues['barCodeType'] : 1;
        $barCodeType = new GSelection('barCodeType', $value, null, $options,false,'','',true);
        $barCodeType->setValue($args->barCodeType);

        $barCodeType->addAttribute('onchange',GUtil::getAjax('changeBackOfBookOptions'));

        $options = array(
            OPTION_ILABEL_NO       => _M('Não', $this->module),
            OPTION_ILABEL_YES_SAME => _M('Sim, na mesma etiqueta', $this->module),
            OPTION_ILABEL_YES_DIFF => _M('Sim, em etiqueta diferente', $this->module),
            OPTION_ILABEL_ONLY     => _M('Somente etiqueta interna', $this->module)
        );

        $value = isset($formContentValues['internalLabel']) ? $formContentValues['internalLabel'] : 1;
        $internalLabel = new GSelection('internalLabel', $value, null, $options,false,'','',true);
        $internalLabel->setValue($args->internalLabel);
        $internalLabel->addAttribute('onchange',GUtil::getAjax('changeBackOfBookOptions'));          

        if ( !empty($args) )
        {
            if ( !$args->enableBarcode )
            {
                $barCodeType->setClass('mReadOnly');
                $barCodeType->setAttribute('disabled'); 
                $barCodeType->setEnabled($args->enableBarcode);
            }
            else if ( $barCodeType->getValue() != OPTION_BARCODE_NO )
            {
                $options = array(
                    FrmBarCode::TYPE_CODABAR => _M('Codabar', $this->module),
                    FrmBarCode::TYPE_BARCODE128 => _M('Código de barras 128', $this->module)
                );                

                $value = isset($formContentValues['barCodeStyle']) ? $formContentValues['barCodeStyle'] : 1;
                $barCodeStyle = new GSelection('barCodeStyle', $value, null, $options,false,'','',true);
                $barCodeStyle = new MDiv('barCodeStyle',array(new MLabel(_M('Tipo da barra', $this->module) .":" ), $barCodeStyle ));

                $characters[] = array('0', 'Não fixos');
                $characters[] = array('6', '6');
                $characters[] = array('8', '8');
                $characters[] = array('10', '10');
                $characters[] = array('12', '12');                

                $value = isset($formContentValues['barCodeCharacter']) ? $formContentValues['barCodeCharacter'] : 1;
                $barCodeCharacter = $characters = new GSelection('barCodeCharacter', $value, null, $characters , null, null, null, true);
                $barCodeCharacter->addStyle('width','80px');
                $barCodeCharacter = new MDiv('barCodeCharacter',array(new MLabel(_M('Caracteres', $this->module) .":" ), $barCodeCharacter ));     
                
                $value = isset($formContentValues['barCodeText']) ? $formContentValues['barCodeText'] : null;
                $barCodeText = new MTextField('barCodeText', $value,null, FIELD_DESCRIPTION_SIZE, new MDiv('divHint',$this->getFormatTypeHint(rptBarCode::BARCODE_FORMAT_EXEMPLARY)) );
                $barCodeText = new MDiv('barCodeText',array(new MLabel(_M('Texto', $this->module) .":" ), $barCodeText ));        
                
                $optionsTextAligment = array(self::OPTION_TEXT_ALIGMENT_CENTER => 'Centralizado',
                                             self::OPTION_TEXT_ALIGMENT_LEFT => 'Esquerda',
                                             self::OPTION_TEXT_ALIGMENT_RIGHT => 'Direita');

                $value = isset($formContentValues['textAlignment']) ? $formContentValues['textAlignment'] : 1;
                $textAlignement = new GSelection('textAlignment', $value, null, $optionsTextAligment,false,'','',true);
                $textAlignement = new MDiv('textAlignementDiv',array(new MLabel(_M('Alinhamento do texto', $this->module) .":" ), $textAlignement ));        
            }

            if ( !$args->enableInternalLabel )
            {
                $internalLabel->setClass('mReadOnly');
                $internalLabel->setAttribute('disabled'); 
                $internalLabel->setEnabled($args->enableBarcode);
            }
        }

        //se e para deixar visivel o campo de codigo de barras
        if ( defined('BACK_OF_BOOK_BARCODE_TEMP') && MUtil::getBooleanValue(BACK_OF_BOOK_BARCODE_TEMP) == DB_TRUE)
        {
            $fields[] = new MDiv('barCodeType',array(new MLabel(_M('Código de barras', $this->module) . ":"  ), $barCodeType ));
            $fields[] = $barCodeStyle;
            $fields[] = $barCodeText;
            $fields[] = $textAlignement; 
            $fields[] = $barCodeCharacter;
            
            $fields[] = $internalLabel = new MDiv('internalLabel',array(new MLabel(_M('Etiqueta interna', $this->module) .":" ), $internalLabel ));
        }
        else //somente mostra campo da etiqueta interna
        {
            $internalLabel->addAttribute('onchange','');
            $fields[] = new MDiv('internalLabel',array(new MLabel(_M('Etiqueta interna', $this->module) .":" ), $internalLabel ));
        }        
        
        $fields = new MFormContainer('optionFields',$fields);
        
        if ( $return )
        {
            return $fields;
        }
        
        $this->setResponse($fields, 'divOptions');
    }    
    
    public function changeBackOfBookOptions($args)
    {
        //Se veio valor null, aplica o valor de Nao
       $args->barCodeType = is_null($args->barCodeType)? OPTION_BARCODE_NO:$args->barCodeType;
       $args->internalLabel = is_null($args->internalLabel)? OPTION_ILABEL_NO:$args->internalLabel;
        
       //Se tiver seleciona um tipo de codigo de barra.
       if ($args->barCodeType != OPTION_BARCODE_NO)
       {
           $args->enableInternalLabel = false;
           $args->enableBarcode = true;
       }
       else if( $args->internalLabel != OPTION_ILABEL_NO )
       {
           $args->enableInternalLabel = true;
           $args->enableBarcode = false;           
       }
       else
       {
           $args->enableInternalLabel = true;
           $args->enableBarcode = true;                      
       }


       $this->getOptionsFields(FALSE, $args);
    }

    /**
	 * Função chamada ao pressionar botão de salvar dados do formulário.
	 *
	 * @param stdClass $sender
	 */
	public function tbBtnFormContent_click($sender = NULL)
	{
        $data = $this->getData();
        $data->barCodeStyle = MIOLO::_REQUEST('barCodeStyle');
        $data->barCodeText = MIOLO::_REQUEST('barCodeText');
        $data->textAlignment = MIOLO::_REQUEST('textAlignment');
        $data->barCodeCharacter = MIOLO::_REQUEST('barCodeCharacter');
        
		if ( $this->busFormContent->saveFormValues($this, $data) )
		{
		  $this->information(_M('Configurações salvas', $this->module), GUtil::getCloseAction(true) );
		}
		else 
		{
			$this->error( _M('Erro salvando configurações', $this->module), GUtil::getCloseAction(true) );
		}
	}
}

?>
