<?php

/**
 * This is the model base class for the table "modulos".
 * DO NOT MODIFY THIS FILE! It is automatically generated by giix.
 * If any changes are necessary, you must set or override the required
 * property or method in class "Modulos".
 *
 * Columns in table "modulos" available as properties of the model,
 * and there are no model relations.
 *
 * @property integer $MOD_IDMODULO
 * @property string $MOD_DESCRICAO
 * @property string $MOD_OBS
 * @property string $MOD_VLRMENSAL
 * @property string $MOD_TIPO
 * @property string $MOD_USATEF
 * @property string $MOD_USANFE
 * @property string $MOD_VLRIMPLANTACAO
 * @property string $MOD_DESCONTOMAX
 * @property string $MOD_SITUACAO
 * @property string $MOD_COMPLEMENTO
 * @property string $MOD_VLRACRESCMENSAL
 * @property string $MOD_VLRACRESCIMPL
 *
 */
class Modulos extends GxActiveRecord
{

	public $IdsDocumentosFiscais = array();

	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	public function tableName()
	{
		return 'modulos';
	}

	public static function label($n = 1)
	{
		return Yii::t('app', 'Módulo|Módulos', $n);
	}

	public static function representingColumn()
	{
		return 'MOD_DESCRICAO';
	}

	public function rules()
	{
		return array(
			array('MOD_DESCRICAO', 'length', 'max'=>50),
			array('MOD_DESCRICAO, MOD_OBS, MOD_TIPO, MOD_SITUACAO, MOD_COMPLEMENTO, MOD_SITUACAO', 'required'),
			array('MOD_TIPO, MOD_USATEF, MOD_USANFE, MOD_SITUACAO, MOD_COMPLEMENTO, MOD_MOBILE', 'length', 'max'=>1),
			array('MOD_DESCONTOMAX', 'length', 'max'=>5),
			array('MOD_OBS,IdsDocumentosFiscais, LAST_UPDATE', 'safe'),
			array('MOD_DESCRICAO, MOD_OBS, MOD_VLRMENSAL, MOD_TIPO, MOD_USATEF, MOD_USANFE, MOD_VLRIMPLANTACAO, MOD_DESCONTOMAX, MOD_SITUACAO, MOD_COMPLEMENTO, MOD_VLRACRESCMENSAL, MOD_VLRACRESCIMPL', 'default', 'setOnEmpty' => true, 'value' => null),
			array('MOD_IDMODULO, MOD_DESCRICAO, MOD_OBS, MOD_VLRMENSAL, MOD_TIPO, MOD_USATEF, MOD_USANFE, MOD_VLRIMPLANTACAO, MOD_DESCONTOMAX, MOD_SITUACAO, MOD_COMPLEMENTO, MOD_VLRACRESCMENSAL, MOD_VLRACRESCIMPL', 'safe', 'on'=>'search'),
		);
	}

	public function relations()
	{
		return array(
			'DocumentosFiscais'     => array(self::HAS_MANY, 'ModulosDocumentosFiscais', 'MDF_IDMODULO', 'joinType' => 'LEFT JOIN'),
			'Valor' 				=> array(self::BELONGS_TO, 'Valores', 'MOD_IDVALOR', 'joinType' => 'LEFT JOIN'),
		);
	}

	public function pivotModels()
	{
		return array(
		);
	}

	public function attributeLabels()
	{
		return array(
			'valores'				=> 'Valores',
			'MOD_IDMODULO'			=> 'Código',
			'MOD_DESCRICAO'			=> 'Nome do Produto',
			'MOD_OBS'				=> 'Composição do Produto',
			'MOD_VLRMENSAL'			=> 'Valor Mensal',
			'MOD_TIPO'				=> 'Tipo',
			'MOD_USATEF'			=> 'Usa TEF',
			'MOD_USANFE'			=> 'Usa NFe',
			'MOD_VLRIMPLANTACAO'	=> 'Valor implantação',
			'MOD_DESCONTOMAX'		=> 'Desconto máximo',
			'MOD_SITUACAO'			=> 'Situação',
			'MOD_COMPLEMENTO'		=> 'Produto Complementar',
			'MOD_VLRACRESCMENSAL'	=> 'Acréscimo mensalidade',
			'MOD_VLRACRESCIMPL'		=> 'Acréscimo implantação',
			'DocumentosFiscais'     => 'Documentos Fiscais',
			'IdsDocumentosFiscais'  => 'Documentos Fiscais',
			'MOD_MOBILE'  			=> 'Módulo mobile?',
		);
	}

	protected function beforeSave()
	{
		parent::beforeSave();
		if(!empty($this->MOD_VLRMENSAL)) $this->MOD_VLRMENSAL =	str_replace(',', '.', str_replace( '.', '', $this->MOD_VLRMENSAL));
        if(!empty($this->MOD_VLRIMPLANTACAO)) $this->MOD_VLRIMPLANTACAO =	str_replace(',', '.', str_replace( '.', '', $this->MOD_VLRIMPLANTACAO));
        $this->LAST_UPDATE = date('Y-m-d H:i:s');
        return true;
	}

	public function search()
	{
		$criteria = new CDbCriteria;

		$criteria->compare('MOD_IDMODULO', $this->MOD_IDMODULO);
		$criteria->compare('MOD_DESCRICAO', utf8_decode($this->MOD_DESCRICAO), true);
		$criteria->compare('MOD_OBS', $this->MOD_OBS, true);
		$criteria->compare('MOD_VLRMENSAL', $this->MOD_VLRMENSAL, true);
		$criteria->compare('MOD_TIPO', $this->MOD_TIPO, true);
		$criteria->compare('MOD_USATEF', $this->MOD_USATEF, true);
		$criteria->compare('MOD_USANFE', $this->MOD_USANFE, true);
		$criteria->compare('MOD_VLRIMPLANTACAO', $this->MOD_VLRIMPLANTACAO, true);
		$criteria->compare('MOD_DESCONTOMAX', $this->MOD_DESCONTOMAX, true);
		$criteria->compare('MOD_SITUACAO', $this->MOD_SITUACAO, true);
		$criteria->compare('MOD_COMPLEMENTO', $this->MOD_COMPLEMENTO, true);
		$criteria->compare('MOD_VLRACRESCMENSAL', $this->MOD_VLRACRESCMENSAL, true);
		$criteria->compare('MOD_VLRACRESCIMPL', $this->MOD_VLRACRESCIMPL, true);

		return new CActiveDataProvider($this, array(
			'criteria' => $criteria,
			'sort' => array(
	            'defaultOrder'=> 'MOD_DESCRICAO ASC',
 	        	),
 	        'pagination' => array(
                'pageSize' => 20,
				)
			)
		);
	}

	public function saveDocumentosFiscais()
	{
		ModulosDocumentosFiscais::model()->deleteAll("MDF_IDMODULO = {$this->MOD_IDMODULO}");
		foreach($this->IdsDocumentosFiscais as $id) {
			$doc = new ModulosDocumentosFiscais;
			$doc->MDF_IDDOCUMENTO = $id;
			$doc->MDF_IDMODULO = $this->MOD_IDMODULO;
			$doc->save();
			unset($doc);
		}
	}

	public function listDocumentosFiscais($implode = false, $keys = false)
	{
		$documentos = array();
		if(is_array($this->DocumentosFiscais)) {
			foreach($this->DocumentosFiscais as $documento) {
				$documentos[$documento->DocumentoFiscal->DFS_IDDOCUMENTO] = $documento->DocumentoFiscal->DFS_DESCRICAO;
			}
		}
		if($keys) {
			$documentos = array_keys($documentos);
		}
		if($implode) {
			return implode(', ', $documentos);
		}
		return $documentos;
	}

    public function getNomeProduto()
    {
        $nome = "";
        if (!empty($this->MOD_DESCRICAO)) {
            $remove = substr($this->MOD_DESCRICAO, 0, 4);
            $nome = str_replace($remove, "", $this->MOD_DESCRICAO);
            $nome = trim($nome);
        }

        return $nome;
    }

    public function valorMinimo($tipoDocumento, $usuarios, $idCliente = false)
    {
    	switch ($tipoDocumento) {
            case Contratos::CONTRATO:
            case Contratos::ORCAMENTO:
            case Contratos::PEDIDO_REATIVACAO:
                return $this->valorMinimoMensalidadeContrato($usuarios);
                break;

            case Contratos::ADENDO:
                return $this->valorMinimoMensalidadeAdendo($usuarios, $idCliente);
                break;

            case Contratos::PEDIDO_IMPLANTACAO:
                return $this->valorMinimoImplantacao();
                break;

        }
    }

    public function valorMinimoMensalidadeContrato($usuarios)
    {
    	if(!$this->Valor) {
    		return 0;
    	}
    	$valorMinimo = Util::valorComDesconto($this->Valor->VAL_VLRMENSAL, $this->Valor->VAL_DESCMAX);
    	
    	// somente calcula para usuários sobressalentes para produto principal ou para módulo complementar mobile
    	if($this->MOD_COMPLEMENTO == 'N' || $this->MOD_MOBILE) {
	        if ($usuarios > 1) {
	            $sobressalentes = $usuarios - 1;
	            $vlrPagar = $sobressalentes * $this->Valor->VAL_ACRESCLOCACAO;
	            $valorMinimo += Util::valorComDesconto($vlrPagar, $this->Valor->VAL_DESCMAX);
	        }

    	}
        return $valorMinimo;
    }

    public function valorMinimoMensalidadeAdendo($usuarios, $idCliente)
    {
    	if(!$this->Valor) {
    		return 0;
    	}
    	$valorMinimo = Util::valorComDesconto($this->Valor->VAL_VLRMENSAL, $this->Valor->VAL_DESCMAX);
    	
    	// somente calcula para usuários sobressalentes para produto principal ou para módulo complementar mobile
	    if ($usuarios > 1) {
	    	if($this->MOD_COMPLEMENTO == 'N') {
	    		$valorMinimo += $this->_valorMinimoMensalidadeAdendo($usuarios, 'COT_NROUSUARIOS', 'VAL_ACRESCADENDO', $idCliente);
	    	} else if($this->MOD_MOBILE) {
	    		$valorMinimo += $this->_valorMinimoMensalidadeAdendo($usuarios, 'COT_USUARIOS_MOBILE', 'VAL_ACRESCLOCACAO', $idCliente);
	    	}
	    }
        return $valorMinimo;
    }

    private function _valorMinimoMensalidadeAdendo($usuarios, $campoUsuarios, $campoValorAcrescimo, $idCliente)
    {
        $novosUsuariosSobressalentes = $usuarios - 1; // usuários sobressalentes do adendo
        $valorMinimo = 0;

		$adendoAnterior = $this->getAdendoAnteriorAtivo($idCliente);
		$contratoOriginal = $this->getContratoAnteriorAtivo($idCliente);

        if($adendoAnterior !== null) {

            if($adendoAnterior->Valor) {
                $usuariosSobressalentesAnterior = $adendoAnterior->{$campoUsuarios} > 0 ? $adendoAnterior->{$campoUsuarios} - 1 : 0;
                $valorAcrescimoAnterior = $adendoAnterior->Valor->{$campoValorAcrescimo};
                $descMaxAnterior = $adendoAnterior->Valor->VAL_DESCMAX;
                $novosUsuariosSobressalentes -= $usuariosSobressalentesAnterior;
                
            	$valorMinimo += Util::valorComDesconto(($usuariosSobressalentesAnterior * $valorAcrescimoAnterior), $descMaxAnterior);
            }
        
        // caso não haja adendo anterior seleciona o contrato original
        } else if($contratoOriginal !== null) {
            
            if($contratoOriginal->Valor) {

                $usuariosSobressalentesAnterior = $contratoOriginal->{$campoUsuarios} > 0 ? $contratoOriginal->{$campoUsuarios} - 1 : 0;
                $valorAcrescimoAnterior = $contratoOriginal->Valor->VAL_ACRESCLOCACAO;
                $descMaxAnterior = $contratoOriginal->Valor->VAL_DESCMAX;
                $novosUsuariosSobressalentes -= $usuariosSobressalentesAnterior;

            	$valorMinimo += Util::valorComDesconto(($usuariosSobressalentesAnterior * $valorAcrescimoAnterior), $descMaxAnterior);
            }
        }
        $valorMinimo += Util::valorComDesconto($novosUsuariosSobressalentes * $this->Valor->{$campoValorAcrescimo}, $this->Valor->VAL_DESCMAX);

        return $valorMinimo;
    }

    private function getDocumentoAnteriorAtivo($tipoDocumento, $idCliente)
    {
        return Contratos::model()->find("COT_IDCLIENTE = {$idCliente} and COT_SITUACAO = {$tipoDocumento} and COT_STATUS in(2, 14) order by COT_DTCADASTRO desc");
    }

    private function getAdendoAnteriorAtivo($idCliente)
    {
        return $this->getDocumentoAnteriorAtivo(Contratos::ADENDO, $idCliente);
    }

    private function getContratoAnteriorAtivo($idCliente)
    {
        return $this->getDocumentoAnteriorAtivo(Contratos::CONTRATO, $idCliente);
    }

    public function valorMinimoImplantacao()
    {
    	if(!$this->Valor) {
    		return 0;
    	}
    	$valorMinimo = Util::valorComDesconto($this->Valor->VAL_VLRIMPLANTACAO, $this->Valor->VAL_DESCMAX);
    	
        return $valorMinimo;
    }
}