<?php

/**
 * This is the model base class for the table "solicitacoes_atividades".
 * 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 "SolicitacoesAtividades".
 *
 * Columns in table "solicitacoes_atividades" available as properties of the model,
 * followed by relations of table "solicitacoes_atividades" available as properties of the model.
 *
 * @property integer $SAT_IDATIVIDADE
 * @property integer $SAT_IDSOLICITACAO
 * @property string $SAT_DATACADASTRO
 * @property integer $SAT_IDAUTOR
 * @property integer $SAT_IDLOCAL
 * @property string $SAT_SITUACAO
 * @property string $SAT_LINK
 * @property string $SAT_DESCRICAO
 * @property integer $SAT_IDPRIORIDADE
 * @property integer $SAT_IDMOTIVO
 * @property integer $SAT_IDDESENVOLVEDOR
 * @property string $SAT_DATAPREVISAO
 * @property integer $SAT_IDPREVISAOVERSAO
 * @property string $SAT_DESCRICAO
 * @property integer $SAT_IDFORMULARIO
 * @property integer $SAT_IDPROJETO
 *
 * @property Versoes $PrevisaoVersao
 * @property Solicitacoes $Solicitacao
 * @property Funcionarios $Autor
 * @property Locais $Local
 * @property Prioridades $Prioridade
 * @property Motivos $Motivo
 * @property Funcionarios $Desenvolvedor
 * @property Funcionarios $Formulario
 * @property Funcionarios $Projeto
 */
class SolicitacoesAtividades extends GxActiveRecord {

    public $SAT_IDSCRITERIOS;
    public $CriteriosAceitos;
    public $solicitacao;
    public $justificativa;
    public $SAT_DATADESENVOLVIMENTO;
    public $SAT_FIM_DATADESENVOLVIMENTO;

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

    public function loadSolicitacao() {
        if(empty($this->solicitacao) && !empty($this->SAT_IDSOLICITACAO)) {
            $this->solicitacao = Solicitacoes::model()->findByPk($this->SAT_IDSOLICITACAO);
        }
    }

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

    public static function label($n = 1) {
        return Yii::t('app', 'Atividade|Atividades', $n);
    }

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

    public function behaviors() {
        return array('datetimeI18NBehavior' => array('class' => 'ext.DateTimeI18NBehavior'));
    }
    public function beforeValidate() {
        $this->loadSolicitacao();
        parent::beforeValidate();
        return true;
    }
    public function beforeSave() {
        parent::beforeSave();
        if(!empty($this->SAT_TEMPO) && strpos($this->SAT_TEMPO, ':') !== false) {
            $this->SAT_TEMPO = $this->convertMinutes($this->SAT_TEMPO);
        }
        return true;
    }

    public function rules() {
        $this->loadSolicitacao();
        return array(
            array('SAT_IDSOLICITACAO, SAT_DATACADASTRO, SAT_IDAUTOR, SAT_IDLOCAL, SAT_SITUACAO', 'required', 'on' => 'analista, normal, automatico, analista_sem_comentario'),
            array('SAT_IDSOLICITACAO, SAT_IDAUTOR, SAT_IDLOCAL, SAT_IDPRIORIDADE, SAT_IDMOTIVO, SAT_IDDESENVOLVEDOR, SAT_IDPREVISAOVERSAO, SAT_IDFORMULARIO, SAT_IDPROJETO, SAT_IDATENDENTE, SAT_IDTECNICORESPONSAVEL, SAT_IDTESTER', 'numerical', 'integerOnly' => true),
            array('SAT_HORAS', 'length', 'max' => 5),
            array('SAT_DESCRICAO', 'length', 'max' => 10000000),
            array('SAT_TEXTOCLIENTE', 'length', 'max' => 10000000),
            array('SAT_SITUACAO', 'length', 'max' => 1),
            array('SAT_DESCRICAO', 'length', 'min' => 1, 'on' => 'automatico'),
            array('SAT_LINK, SAT_DATAPREVISAO, SAT_IDTESTER, Criterios, SAT_IDSCRITERIOS, SAT_IDTECNICORESPONSAVEL, SAT_IDATENDENTE, SAT_IDDESENVOLVEDOR, CriteriosAceitos,SAT_AVALIACAO_PRE_ANALISE, justificativa, SAT_DATADESENVOLVIMENTO, SAT_FIM_DATADESENVOLVIMENTO, SAT_APROV_CUSTOMIZACAO', 'safe'),
            array('SAT_LINK, SAT_IDDESENVOLVEDOR, SAT_DATAPREVISAO, SAT_IDPREVISAOVERSAO', 'default', 'setOnEmpty' => true, 'value' => null),
            array('SAT_IDATIVIDADE, SAT_IDSOLICITACAO, SAT_DATACADASTRO, SAT_IDAUTOR, SAT_IDLOCAL, SAT_SITUACAO, SAT_LINK, SAT_DESCRICAO, SAT_IDPRIORIDADE, SAT_IDMOTIVO, SAT_IDDESENVOLVEDOR, SAT_DATAPREVISAO, SAT_IDPREVISAOVERSAO, SAT_HORAS, SAT_DATADESENVOLVIMENTO, SAT_FIM_DATADESENVOLVIMENTO', 'safe', 'on' => 'search'),
            array('SAT_IDLOCAL', 'podeMovimentar'),
            array('SAT_DESCRICAO', 'verificaDescricao', 'on' => 'normal,analista'),
            array('SAT_DESCRICAO', 'verificaDescricaoVoltar'),
            array('SAT_TEXTOCLIENTE', 'verificaTextoCliente'),
            array('SAT_IDATENDENTE', 'verificaAtendente'),
            array('SAT_IDDESENVOLVEDOR', 'verificaDesenvolvedor'),
            array('SAT_DATADESENVOLVIMENTO', 'verificaDataDesenvolvimento'),
            array('SAT_FIM_DATADESENVOLVIMENTO', 'verificaFimDataDesenvolvimento'),
            array('SAT_HORAS', 'verificaHoras'),
            array('SAT_IDPREVISAOVERSAO', 'verificaVersao'),
            array('SAT_TEMPO', 'verificaTempoTrabalhado'),
            array('SAT_TIPO_PENDENCIA_FALHA', 'verificaTipoFalha'),
            array('SAT_IDPENDENCIA_ORIGEM, SAT_ORIGEM_PENDENCIA_FALHA', 'verificaCamposFalhaNova'),
            array('SAT_JUSTIFICATIVA_FALHA', 'verificaJustificativaFalha'),
            array('SAT_TIPO_PENDENCIA_FALHA, SAT_IDPENDENCIA_ORIGEM, SAT_ORIGEM_PENDENCIA_FALHA, SAT_IDANALISTA_ORIGEM_FALHA, SAT_IDDESENVOLVEDOR_ORIGEM_FALHA, SAT_JUSTIFICATIVA_FALHA', 'default', 'setOnEmpty' => true, 'value' => null),
        );
    }

    public function relations() {
        return array(
            'Arquivos'                      => array(self::HAS_MANY, 'Arquivos', 'ARQ_FOREIGNKEY', 'condition'=>'Arquivos.ARQ_MODEL="SolicitacoesAtividades"'),
            'Autor'                         => array(self::BELONGS_TO, 'Funcionarios', 'SAT_IDAUTOR'),
            'CamposAprovadosPreAnalise'     => array(self::HAS_MANY, 'CriteriosSolicitacoes', 'CRS_IDATIVIDADE', 'condition'=>'CamposAprovadosPreAnalise.CRS_ACEITO=1'),
            'CamposReprovadosPreAnalise'    => array(self::HAS_MANY, 'CriteriosSolicitacoes', 'CRS_IDATIVIDADE', 'condition'=>'CamposReprovadosPreAnalise.CRS_ACEITO=0'),
            'CriteriosAprovados'            => array(self::HAS_MANY, 'CriteriosSolicitacoes', 'CRS_IDATIVIDADE', 'condition'=>'CriteriosAprovados.CRS_ACEITO=1'),
            'CriteriosReprovados'           => array(self::HAS_MANY, 'CriteriosSolicitacoes', 'CRS_IDATIVIDADE', 'condition'=>'CriteriosReprovados.CRS_ACEITO=0'),
            'AvaliacaoPreAnalise'           => array(self::HAS_MANY, 'CriteriosSolicitacoes', 'CRS_IDATIVIDADE'),
            'Desenvolvedor'                 => array(self::BELONGS_TO, 'Funcionarios', 'SAT_IDDESENVOLVEDOR'),
            'Formulario'                    => array(self::BELONGS_TO, 'Formularios', 'SAT_IDFORMULARIO'),
            'Local'                         => array(self::BELONGS_TO, 'Locais', 'SAT_IDLOCAL'),
            'Motivo'                        => array(self::BELONGS_TO, 'Motivos', 'SAT_IDMOTIVO'),
            'PrevisaoVersao'                => array(self::BELONGS_TO, 'Versoes', 'SAT_IDPREVISAOVERSAO'),
            'Prioridade'                    => array(self::BELONGS_TO, 'Prioridades', 'SAT_IDPRIORIDADE'),
            'Projeto'                       => array(self::BELONGS_TO, 'Projetos', 'SAT_IDPROJETO'),
            'Solicitacao'                   => array(self::BELONGS_TO, 'Solicitacoes', 'SAT_IDSOLICITACAO'),
            'Testador'                      => array(self::BELONGS_TO, 'Funcionarios', 'SAT_IDTESTER'),
            'AnalistaFalha'                 => array(self::BELONGS_TO, 'Funcionarios', 'SAT_IDANALISTA_ORIGEM_FALHA'),
            'DesenvolvedorFalha'            => array(self::BELONGS_TO, 'Funcionarios', 'SAT_IDDESENVOLVEDOR_ORIGEM_FALHA'),
        );
    }

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

    public function attributeLabels() {
        return array(
            'SAT_IDATIVIDADE'           => 'Código da Atividade',
            'SAT_IDSOLICITACAO'         => 'Código da Solicitação',
            'SAT_DATACADASTRO'          => 'Data de Cadastro',
            'SAT_IDAUTOR'               => 'Autor',
            'SAT_IDLOCAL'               => 'Local',
            'SAT_SITUACAO'              => 'Situação',
            'SAT_LINK'                  => 'Link',
            'SAT_DESCRICAO'             => 'Atividade',
            'SAT_IDPRIORIDADE'          => 'Prioridade',
            'SAT_IDMOTIVO'              => 'Motivo',
            'SAT_IDDESENVOLVEDOR'       => 'Desenvolvedor',
            'SAT_DATAPREVISAO'          => 'Previsão de Entrega',
            'SAT_IDPREVISAOVERSAO'      => 'Previsão de Versão',
            'SAT_HORAS'                 => 'Previsão de Horas',
            'SAT_IDFORMULARIO'          => 'Formulário',
            'SAT_IDPROJETO'             => 'Projeto',
            'PrevisaoVersao'            => 'Previsão de Versão',
            'Solicitacao'               => 'Código da Solicitação',
            'Autor'                     => 'Autor',
            'Local'                     => 'Local',
            'Prioridade'                => 'Prioridade',
            'Motivo'                    => 'Motivo',
            'Desenvolvedor'             => 'Desenvolvedor',
            'SAT_TEXTOCLIENTE'          => 'Texto Cliente',
            'Formulario'                => 'Formulário',
            'Projeto'                   => 'Projeto',
            'Criterios'                 => 'Critérios',
            'CriteriosAceitos '         => 'Critérios aprovados',
            'Testador'                  => 'Testador',
            'SAT_IDTESTER'              => 'Testador',
            'SAT_IDATENDENTE'           => 'Atendente',
            'SAT_IDTECNICORESPONSAVEL'  => 'Técnico responsável',
            'SAT_TEMPO'                 => 'Horas trabalhadas',
            'SAT_NIVEL_COMPLEXIDADE'    => 'Nível de Complexidade',
            'SAT_TIPO_PENDENCIA_FALHA'         => 'Tipo de Pendência de Falha',
            'SAT_IDPENDENCIA_ORIGEM'           => 'Pendência que originou a falha',
            'SAT_ORIGEM_PENDENCIA_FALHA'       => 'Origem da Falha',
            'SAT_IDANALISTA_ORIGEM_FALHA'      => 'Analista da Pendência que originou a falha',
            'SAT_IDDESENVOLVEDOR_ORIGEM_FALHA' => 'Desenvolvedor da Pendência que originou a falha',
            'SAT_JUSTIFICATIVA_FALHA'          => 'Justificativa',
            'SAT_APROV_CUSTOMIZACAO'           => 'Pendência é customização'
        );
    }

    public function podeMovimentar($attribute, $params) {
        if($this->SAT_IDLOCAL == -1) {
            if(!$this->solicitacao->podeVoltarLocal()) {
                $this->addError($attribute, 'Você não tem permissão de voltar a pendência para o local anterior.');
            }
        }

        $locais = $this->Solicitacao->getLocaisMovimentacao();
        if (!in_array($this->SAT_IDLOCAL, array_keys($locais))) {
            $this->addError($attribute, 'Você não tem permissão de movimentar a pendência para o local selecionado.');
        }
    }

    public function verificaDescricaoVoltar($attribute, $params) {
        if ($this->SAT_IDLOCAL == -1 and empty($this->SAT_DESCRICAO)) {
            $this->addError($attribute, 'Você precisa justificar o motivo de ter voltado a pendência para o local anterior.');
        }

        if (in_array($this->SAT_IDLOCAL, array(21, 5)) and empty($this->SAT_DESCRICAO)) {
            $this->addError($attribute, 'Atividade não pode ser vazio.');
        }
    }

    public function verificaDescricao($attribute, $params) {
        if ($this->solicitacao->SOL_IDLOCAL == 1 and $this->SAT_IDLOCAL == 16 and strlen($this->SAT_DESCRICAO) < 50) {
            $this->addError($attribute, 'Atividade é muito curto (mínimo é 50 caracteres).');
        }

        if (User::getPrivilegio() == 15 and in_array($this->SAT_IDLOCAL, array(2, 3, 4)) and empty($this->SAT_DESCRICAO)) {
            $this->addError($attribute, 'Atividade não pode ser vazio.');
        }
    }

    public function verificaDesenvolvedor($attribute, $params) {
        if ($this->enableFieldDesenvolvedor($this->solicitacao) and $this->SAT_IDLOCAL == 1 and empty($this->SAT_IDDESENVOLVEDOR)) {
            $this->addError($attribute, 'Desenvolvedor não pode ser vazio.');
        }
    }
    
    public function verificaDataDesenvolvimento($attribute, $params) {
        if($this->solicitacao->SOL_IDLOCAL == 3 and !empty($this->SAT_APROV_CUSTOMIZACAO)) {
            return;
        }
        if ($this->enableFieldDataDesenvolvimento($this->solicitacao) and empty($this->SAT_DATADESENVOLVIMENTO) and
            $this->SAT_IDLOCAL == 1) {
            $this->addError($attribute, 'Data de início do desenvolvimento não pode ser vazio');
        }
    }

    public function verificaFimDataDesenvolvimento($attribute, $params) {
        if($this->solicitacao->SOL_IDLOCAL == 3 and !empty($this->SAT_APROV_CUSTOMIZACAO)) {
            return;
        }
        if ($this->enableFieldFimDataDesenvolvimento($this->solicitacao) and empty($this->SAT_FIM_DATADESENVOLVIMENTO) and
            $this->SAT_IDLOCAL == 1) {
            $this->addError($attribute, 'Data do fim do desenvolvimento não pode ser vazio');
        }
    }

    public function verificaAtendente($attribute, $params) {
        if ($this->enableFieldAtendente($this->solicitacao) and empty($this->SAT_IDATENDENTE)) {
            $this->addError($attribute, 'Atendente não pode ser vazio.');
        }
    }

    public function verificaNivelComplexidade($attribute, $params) {
        if (!empty($this->SAT_NIVEL_COMPLEXIDADE)) {
            if ($this->SAT_NIVEL_COMPLEXIDADE != $this->solicitacao->SOL_NIVEL_COMPLEXIDADE) {
                if (!empty($this->solicitacao->SOL_NIVEL_COMPLEXIDADE) && empty($this->justificativa)) {
                    $this->addError("justificativa", "Você deve informar uma justificativa!");
                    return false;
                }
            } else {
                $this->addError($attribute, "O nível de complexidade deve ser diferente do atual!");
                return false;
            }
        } else {
            $this->addError($attribute, 'Nível de complexidade não pode ser vazio!');
            return false;
        }
        return true;
    }

    public function verificaHoras($attribute, $params) {
        if($this->solicitacao->SOL_IDPROJETO == 22) {
            return;
        }
        if (User::getPrivilegio() == 12 and $this->SAT_IDLOCAL == 1 and empty($this->SAT_HORAS)) {
            $this->addError($attribute, 'Previsão de Horas não pode ser vazio.');
        }
    }

    public function verificaVersao($attribute, $params) {
        if($this->solicitacao->SOL_IDPROJETO == 22) {
            return;
        }
        if (User::getPrivilegio() == 12 and $this->SAT_IDLOCAL == 1 and empty($this->SAT_IDPREVISAOVERSAO)) {
            $this->addError($attribute, 'Previsão de Versão não pode ser vazio.');
        }
    }

    public function verificaTextoCliente($attribute, $params) {
        if (User::getPrivilegio() == 15 and $this->SAT_IDLOCAL == 4 and empty($this->SAT_TEXTOCLIENTE) && $this->solicitacao->SOL_IDPROJETO != 22) {
            $this->addError($attribute, 'Texto do Cliente não pode ser vazio.');
        }
    }

    public function verificaTempoTrabalhado($attribute, $params) {
        if ($this->registraTempo()) {
            if (empty($this->{$attribute})) {
                $this->addError($attribute, $this->getAttributeLabel($attribute) . ' é obrigatório e deve estar no formaro HH:MM.');
            }
        }
    }

    public function verificaTipoFalha($attribute, $params) {
        if ($this->Solicitacao->SOL_IDMOTIVO == 151) { // falha de sistema
            if (
                ($this->Solicitacao->SOL_IDLOCAL == 3 && $this->SAT_IDLOCAL == 1) || // de an. desenv. para desenv
                ($this->Solicitacao->SOL_IDLOCAL == 2 && $this->SAT_IDLOCAL == 3) // de analise para an. desenv
            ) {
                if (empty($this->{$attribute})) {
                    $this->addError($attribute, $this->getAttributeLabel($attribute) . ' é obrigatório.');
                    return false;
                }
            }
        }
        return true;
    }

    public function verificaCamposFalhaNova($attribute, $params) {
        if ($this->Solicitacao->SOL_IDMOTIVO == 151) { // falha de sistema
            if (
                ($this->Solicitacao->SOL_IDLOCAL == 3 && $this->SAT_IDLOCAL == 1) || // de an. desenv. para desenv
                ($this->Solicitacao->SOL_IDLOCAL == 2 && $this->SAT_IDLOCAL == 3) // de analise para an. desenv
            ) {
                if ($this->SAT_TIPO_PENDENCIA_FALHA == "N" && empty($this->{$attribute})) {
                    $this->addError($attribute, $this->getAttributeLabel($attribute) . ' é obrigatório.');
                    return false;
                }
            }
        }
        return true;
    }

    public function verificaJustificativaFalha($attribute, $params) {
        if ($this->Solicitacao->SOL_IDMOTIVO == 151) { // falha de sistema
            if (
                ($this->Solicitacao->SOL_IDLOCAL == 3 && $this->SAT_IDLOCAL == 1) || // de an. desenv. para desenv
                ($this->Solicitacao->SOL_IDLOCAL == 2 && $this->SAT_IDLOCAL == 3) // de analise para an. desenv
            ) {
                if (empty($this->{$attribute})) {
                    $this->addError($attribute, $this->getAttributeLabel($attribute) . ' é obrigatório.');
                    return false;
                }
            }
        }
        return true;
    }

    public function registraTempo() {
        return !User::isRevenda() && !in_array(User::getPrivilegio(), array(21));
    }

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

        $criteria->compare('SAT_IDATIVIDADE', $this->SAT_IDATIVIDADE);
        $criteria->compare('SAT_IDSOLICITACAO', $this->SAT_IDSOLICITACAO);
        $criteria->compare('SAT_DATACADASTRO', $this->SAT_DATACADASTRO, true);
        $criteria->compare('SAT_IDAUTOR', $this->SAT_IDAUTOR);
        $criteria->compare('SAT_IDLOCAL', $this->SAT_IDLOCAL);
        $criteria->compare('SAT_SITUACAO', $this->SAT_SITUACAO, true);
        $criteria->compare('SAT_LINK', $this->SAT_LINK, true);
        $criteria->compare('SAT_DESCRICAO', $this->SAT_DESCRICAO, true);
        $criteria->compare('SAT_IDPRIORIDADE', $this->SAT_IDPRIORIDADE);
        $criteria->compare('SAT_IDMOTIVO', $this->SAT_IDMOTIVO);
        $criteria->compare('SAT_IDDESENVOLVEDOR', $this->SAT_IDDESENVOLVEDOR);
        $criteria->compare('SAT_DATAPREVISAO', $this->SAT_DATAPREVISAO, true);
        $criteria->compare('SAT_IDPREVISAOVERSAO', $this->SAT_IDPREVISAOVERSAO);
        $criteria->compare('SAT_TEXTOCLIENTE', $this->SAT_TEXTOCLIENTE, true);
        $criteria->compare('SAT_IDFORMULARIO', $this->SAT_IDFORMULARIO);
        $criteria->compare('SAT_IDPROJETO', $this->SAT_IDPROJETO);

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

    public function afterDelete() {
        parent::afterDelete();
        if(!empty($this->Arquivos))
            foreach($this->Arquivos as $arquivo)
                $arquivo->delete();

        return true;
    }

    private function convertTime($str) {
        $horas   = intval($str/60);
        $minutos = intval($str%60);
        return (strlen($horas) == 1?'0'.$horas:$horas).':'.(strlen($minutos) == 1?'0'.$minutos:substr($minutos, 0, 2));
    }

    private function convertMinutes($str) {
        if(empty($str) && strpos($str, ':') === false) {
            return;
        }
        $tempo = explode(':', $str);
        $horas = $tempo[0];
        $minutos =  $tempo[1];
        $minutos += ($horas * 60);
        return $minutos;
    }

    public function getHoras() {
        return $this->convertTime($this->SAT_TEMPO);
    }

    public function getFormulario() {
        if(isset($this->Formulario->FRM_CODFORM)) {
            return $this->Formulario->FRM_CODFORM . ' - ' . $this->Formulario->FRM_DESCRICAO;
        } else if(!empty($this->SAT_IDFORMULARIO)) {
            $Formulario = Formularios::model()->findByPk($this->SAT_IDFORMULARIO);
            if ($Formulario) {
                return $Formulario->FRM_CODFORM.' - '.$Formulario->FRM_DESCRICAO;
            }
        }
        return 'Não identificado';
    }

    public function enableField($field, $solicitacao) {
        $methods = array(
            'SAT_TEXTOCLIENTE' => 'enableFieldTextoCliente',
            'SAT_IDPROJETO' => 'enableFieldProjeto',
            'SAT_IDFORMULARIO' => 'enableFieldFormulario',
            'SAT_IDMOTIVO' => 'enableFielMotivo',
            'SAT_IDPRIORIDADE' => 'enableFieldPrioridade',
            'SAT_IDTECNICORESPONSAVEL' => 'enableFieldTecnicoResponsavel',
            'SAT_IDATENDENTE' => 'enableFieldAtendente',
            'SAT_IDDESENVOLVEDOR' => 'enableFieldDesenvolvedor',
            'SAT_IDTESTER' => 'enableFieldTester',
            'SAT_HORAS' => 'enableFieldPrevisaoHoras',
            'SAT_DATAPREVISAO' => 'enableFieldPrevisaoEntrega',
            'SAT_IDPREVISAOVERSAO' => 'enableFieldPrevisaoVersao',
            'SAT_IDSCRITERIOS' => 'enableFieldCriterios',
            'SAT_TEMPO' => 'enableFieldHorasTrabalhadas',
            'SAT_DATADESENVOLVIMENTO' => 'enableFieldDataDesenvolvimento',
            'SAT_FIM_DATADESENVOLVIMENTO' => 'enableFieldFimDataDesenvolvimento',
            'SAT_APROV_CUSTOMIZACAO' => 'enableFieldAprovaCustomizacao',
            'anexos' => 'enableFieldAnexos',
        );
        if (isset($methods[$field])) {
            return $this->{$methods[$field]}($solicitacao);
        }
        return false;
    }

    public function enableFieldAprovaCustomizacao($solicitacao) {
        return !empty($this->SAT_APROV_CUSTOMIZACAO)&&($this->SAT_APROV_CUSTOMIZACAO != '0');
    }

    public function enableFieldDataDesenvolvimento($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 12));
    }

    public function enableFieldFimDataDesenvolvimento($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 12));
    }

    public function enableFielMotivo($solicitacao) {
        return $this->_enableBasicInfoPendencia($solicitacao);
    }

    public function enableFieldFormulario($solicitacao) {
        return $this->_enableBasicInfoPendencia($solicitacao);
    }

    public function enableFieldProjeto($solicitacao) {
        if(in_array(User::getPrivilegio(), array(1))) {
            return true;
        }
        if($solicitacao->SOL_IDLOCAL == 14 and in_array(User::getPrivilegio(), array(5, 20, 15))) {
            return true;
        }
    }

    private function _enableBasicInfoPendencia($solicitacao) {
        if(in_array(User::getPrivilegio(), array(1, 3,12))) {
            return true;
        }
        if($solicitacao->SOL_IDLOCAL == 14 and in_array(User::getPrivilegio(), array(5, 20, 15))) {
            return true;
        }
        if($solicitacao->SOL_IDLOCAL == 15 and in_array(User::getPrivilegio(), array(4, 9, 14, 21))) {
            return true;
        }
        return false;
    }

    public function enableFieldAtendente($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 20));
    }

    public function enableFieldTecnicoResponsavel($solicitacao) {
        return false; // campo descontinuado
        // return in_array(User::getPrivilegio(), array(1, 9, 14, 20));
    }

    public function enableFieldDesenvolvedor($solicitacao) {
        if(User::getId() == 24) {
            return true;
        }
        return in_array(User::getPrivilegio(), array(1, 6, 12));
    }

    public function enableFieldTester($solicitacao) {
        if(User::getId() == 24) {
            return true;
        }
        return in_array(User::getPrivilegio(), array(1, 6, 12));
    }

    public function enableFieldTextoCliente($solicitacao) {
        if(User::getPrivilegio() == 1) {
            return true;
        }
        return $solicitacao->SOL_IDLOCAL == 16 and User::getPrivilegio() == 15;
    }

    public function enableFieldPrioridade($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 3, 12));
    }

    public function enableFieldPrevisaoHoras($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 12));
    }

    public function enableFieldPrevisaoVersao($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 12));
    }

    public function enableFieldPrevisaoEntrega($solicitacao) {
        return in_array(User::getPrivilegio(), array(1, 12));
    }

    public function enableFieldCriterios($solicitacao) {
        if(in_array(User::getPrivilegio(), array(5, 20, 15)) && $solicitacao->SOL_APROVADA_PRE_ANALISE != Solicitacoes::APROV_ANTERIOR) {
            return false;
        }
        if(!in_array(User::getPrivilegio(), array(5, 20, 15))) {
            return false;
        }
        return $solicitacao->registraAceitacao();
    }

    public function enableFieldHorasTrabalhadas($solicitacao) {
        return $this->registraTempo();
    }

    public function enableFieldAnexos($solicitacao) {
        return $this->isNewRecord;
    }

    public function fecharHorasUsadas() {
        $usuario = User::getId();
        $fechar = FasesSolicitacao::model()->find("FAS_IDUSUARIO = {$usuario} AND FAS_IDSOLICITACAO = {$this->SAT_IDSOLICITACAO} AND FAS_HORAUSADA = 0");
        while($fechar) {
            $fechar->close($this->SAT_IDATIVIDADE);
            $fechar = FasesSolicitacao::model()->find("FAS_IDUSUARIO = {$usuario} AND FAS_IDSOLICITACAO = {$this->SAT_IDSOLICITACAO} AND FAS_HORAUSADA = 0");
        }
    }

    public static function translateLocal($idLocal)
    {
        $locais = Locais::model()->findByPk($idLocal);
        return $locais->LOC_DESCRICAO ?? "-";
    }
}
