<?php

$Permissoes = User::getUser(true);

if ($Permissoes->FUN_TBL_SOLICITACOES == 1 or $Permissoes->FUN_TBL_RELATORIO_PENDENCIAS == 1) {

    class EspecificacaoFuncionalController extends GxController {

        var $help = 'Esta é a ajuda';

       /* public function actionView($id) {
            $this->render('view', array(
                'model' => $this->loadModel($id, 'EspecificacaoFuncional'),
            ));
        }*/

        public function actionGerarpdf($id) {
            $this->render('pdf', array(
                'model' => $this->loadModel($id, 'EspecificacaoFuncional'),
            ));
        }

        public function actionCreate($ESP_IDSOLICITACAO) {
            User::clockAction('Não é possível acessar a tela requisitada');
            $model = new EspecificacaoFuncional;

            $this->performAjaxValidation($model);

            if (isset($_POST['EspecificacaoFuncional'])) {
                $model->setAttributes($_POST['EspecificacaoFuncional']);
                $model->ESP_DATA = date('d/m/Y');
                if ($model->save()) {

                    $this->saveRelated($model);

                    // lancar atividade
                    $modelAtividade = new SolicitacoesAtividades;
                    $modelAtividade->SAT_IDSOLICITACAO = $model->ESP_IDSOLICITACAO;
                    $modelAtividade->SAT_DATACADASTRO = date('d/m/Y H:i:s');
                    $modelAtividade->SAT_IDAUTOR = User::getId();
                    $modelAtividade->SAT_IDLOCAL = 2;
                    $modelAtividade->SAT_SITUACAO = $model->Solicitacao->SOL_SITUACAO;
                    $modelAtividade->SAT_DESCRICAO = 'Foi criada uma especificação funcional para esta pendência.';
                    $modelAtividade->save(false, array('SAT_IDSOLICITACAO', 'SAT_DATACADASTRO', 'SAT_IDAUTOR', 'SAT_IDLOCAL', 'SAT_SITUACAO', 'SAT_DESCRICAO'));
                    unset($modelAtividade);

                    if (Yii::app()->getRequest()->getIsAjaxRequest()) {
                        Yii::app()->end();
                    } elseif (isset($_POST['fechar'])) {
                        $this->redirect(array('solicitacoes/view', 'id' => $model->ESP_IDSOLICITACAO));
                    } else {
                        Yii::app()->user->setFlash('success', 'Salvo com sucesso!');
                        $this->redirect(array('especificacaoFuncional/update', 'id' => $model->ESP_IDESPECIFICACAO));
                    }
                }
            }
            $solicitacao = $this->loadModel($ESP_IDSOLICITACAO, 'Solicitacoes');
            $this->render('create', array('model' => $model, 'ESP_IDSOLICITACAO' => $ESP_IDSOLICITACAO, 'solicitacao' => $solicitacao));
        }

        public function actionUpdate($id) {
            $model = $this->loadModel($id, 'EspecificacaoFuncional');
            $analistas = EspecificacaoFuncionalAnalistas::model()->findAll('EFA_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            $analistas = CHtml::listData($analistas, 'EFA_IDANALISTA', 'EFA_IDANALISTA');
            $model->ESP_ANALISTA = $analistas;

            $this->performAjaxValidation($model);

            if (isset($_POST['EspecificacaoFuncional'])) {
                $model->setAttributes($_POST['EspecificacaoFuncional']);
                if ($model->save()) {

                    $this->saveRelated($model);

                    if(isset($_POST['fechar'])) {
                        $this->redirect(array('solicitacoes/view', 'id' => $model->ESP_IDSOLICITACAO));
                    } else {
                        Yii::app()->user->setFlash('success', 'Salvo com sucesso!');
                    }
                }
            }
            $solicitacao = $this->loadModel($model->ESP_IDSOLICITACAO, 'Solicitacoes');
            $this->render('update', array('model' => $model, 'solicitacao' => $solicitacao));
        }

        private function saveRelated($model) {
            // excluir registros das tabelas estrangeiras
            EspecificacaoFuncionalAnalistas::model()->deleteAll('EFA_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            EspecificacaoFuncionalRequisitos::model()->deleteAll('EFR_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            EspecificacaoFuncionalSimulacao::model()->deleteAll('EFS_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            $EspecificacaoFuncionalTabelas = EspecificacaoFuncionalTabelas::model()->findAll("EFT_IDESPECIFICACAO = " . $model->ESP_IDESPECIFICACAO);
            foreach ($EspecificacaoFuncionalTabelas as $EspecificacaoFuncionalTabelas) {
                EspecificacaoFuncionalCampos::model()->deleteAll('EFC_IDTABELA = ' . $EspecificacaoFuncionalTabelas->EFT_CODIGO);
            }
            EspecificacaoFuncionalTabelas::model()->deleteAll('EFT_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            EspecificacaoFuncionalCasosTeste::model()->deleteAll('EFC_IDESPECIFICACAO = ' . $model->ESP_IDESPECIFICACAO);
            foreach($model->ESP_ANALISTA as $id_analista) {
                $analista = new EspecificacaoFuncionalAnalistas();
                $analista->EFA_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                $analista->EFA_IDANALISTA = $id_analista;
                $analista->save();
                unset($analista);
            }

            if (isset($_POST['tabelas']) && is_array($_POST['tabelas'])) {
               foreach($_POST['tabelas'] as $tabela) {
                    $modelTabelas = new EspecificacaoFuncionalTabelas;
                    $modelTabelas->EFT_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                    $modelTabelas->EFT_TABELA = $tabela['EFT_TABELA'];
                    $modelTabelas->EFT_CHAVEPRIM = $tabela['EFT_CHAVEPRIM'];
                    $modelTabelas->EFT_CHAVEESTR = $tabela['EFT_CHAVEESTR'];
                    $modelTabelas->save();
                    if(isset($tabela['campos']) && is_array($tabela['campos'])) {
                       foreach ($tabela['campos'] as $campo) {
                            $modelCampos = new EspecificacaoFuncionalCampos;
                            $modelCampos->EFC_IDTABELA = $modelTabelas->EFT_CODIGO;
                            $modelCampos->EFC_NOMECAMPO = $campo['EFC_NOMECAMPO'];
                            $modelCampos->EFC_TIPODADO = $campo['EFC_TIPODADO'];
                            $modelCampos->EFC_TAMANHO = $campo['EFC_TAMANHO'];
                            $modelCampos->EFC_DESCRICAOCAMPO = $campo['EFC_DESCRICAOCAMPO'];
                            $modelCampos->save();
                            unset($modelCampos);
                        }
                    }
                    unset($modelTabelas);
                }
            }

            if (isset($_POST['simulacoes']) && is_array($_POST['simulacoes'])) {
                foreach ($_POST['simulacoes'] as $simulacao) {
                    $modelSimulacao = new EspecificacaoFuncionalSimulacao;
                    $modelSimulacao->EFS_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                    $modelSimulacao->EFS_SITUACAO = $simulacao['EFS_SITUACAO'];
                    $modelSimulacao->save();
                    unset($modelSimulacao);
                }
            }

            if (isset($_POST['requisitos']) && is_array($_POST['requisitos'])) {
                foreach ($_POST['requisitos'] as $requisito) {
                    $modelRequisitos = new EspecificacaoFuncionalRequisitos;
                    $modelRequisitos->EFR_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                    $modelRequisitos->EFR_REQUISITO = $requisito['EFR_REQUISITO'];
                    $modelRequisitos->save();
                    unset($modelRequisitos);
                }
            }

            if (isset($_POST['casosTeste']) && is_array($_POST['casosTeste'])) {
                foreach ($_POST['casosTeste'] as $casoTeste) {
                    $modelCasosTeste = new EspecificacaoFuncionalCasosTeste;
                    $modelCasosTeste->EFC_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                    $modelCasosTeste->EFC_CASOTESTE = $casoTeste['EFC_CASOTESTE'];
                    $modelCasosTeste->EFC_DESCRICAO = $casoTeste['EFC_DESCRICAO'];
                    $modelCasosTeste->save();
                    unset($modelCasosTeste);
                }
            }
        }

        // para lançar não conformidade e caso de teste
        public function actionCreate2($id) {

            $model = $this->loadModel($id, 'EspecificacaoFuncional');
            $oldNaoConformidades = EspecificacaoFuncionalNaoConformidade::model()->findAll('EFN_IDESPECIFICACAO = '.$id);
            $oldPosTestes = EspecificacaoFuncionalPosTestes::model()->findAll('EFP_IDESPECIFICACAO = '.$id);
            if (isset($_POST['EspecificacaoFuncional'])) {
                // laco de cadastro de não-conformidade
                if (isset($_POST['naoConformidades']) && is_array($_POST['naoConformidades'])) {
                    EspecificacaoFuncionalNaoConformidade::model()->deleteAll('EFN_IDESPECIFICACAO = '.$id);
                    foreach ($_POST['naoConformidades'] as $naoConformidade) {
                        $modelNaoConformidade                      = new EspecificacaoFuncionalNaoConformidade;
                        $modelNaoConformidade->EFN_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                        $modelNaoConformidade->EFN_NAOCONFORMIDADE = $naoConformidade['EFN_NAOCONFORMIDADE'];
                        $modelNaoConformidade->EFN_DESCRICAO       = $naoConformidade['EFN_DESCRICAO'];
                        $codigo = (isset($naoConformidade['EFN_CODIGO']) ? $naoConformidade['EFN_CODIGO'] : false);
                        if($codigo) {
                            foreach($oldNaoConformidades as $oldNaoConformidade) {
                                if($oldNaoConformidade->EFN_CODIGO == $codigo) {
                                    $modelNaoConformidade->EFN_IDUSUARIO = $oldNaoConformidade->EFN_IDUSUARIO;
                                    $modelNaoConformidade->EFN_DATA = $oldNaoConformidade->EFN_DATA;
                                    $modelNaoConformidade->EFN_UPDATES = $oldNaoConformidade->EFN_UPDATES;

                                    if($oldNaoConformidade->EFN_NAOCONFORMIDADE != $modelNaoConformidade->EFN_NAOCONFORMIDADE || $oldNaoConformidade->EFN_DESCRICAO != $modelNaoConformidade->EFN_DESCRICAO) {

                                        $modelNaoConformidade->EFN_UPDATES .= "Atualizado por ".User::getName()." em " . date('d/m/Y H:i:s').PHP_EOL;
                                    }
                                }
                            }
                        }
                        if(empty($modelNaoConformidade->EFN_IDUSUARIO)) {
                            $modelNaoConformidade->EFN_IDUSUARIO = User::getId();
                        }
                        if (empty($modelNaoConformidade->EFN_DATA)) {
                            $modelNaoConformidade->EFN_DATA = date('d/m/Y H:i:s');
                        }
                        $modelNaoConformidade->save();
                        unset($modelNaoConformidade);
                    }
                }
                // laco de cadastro de implementação pós testes
                if (isset($_POST['posTestes']) && is_array($_POST['posTestes'])) {
                    EspecificacaoFuncionalPosTestes::model()->deleteAll('EFP_IDESPECIFICACAO = '.$id);
                    foreach ($_POST['posTestes'] as $posTeste) {
                        $modelPosTestes                      = new EspecificacaoFuncionalPosTestes;
                        $modelPosTestes->EFP_IDESPECIFICACAO = $model->ESP_IDESPECIFICACAO;
                        $modelPosTestes->EFP_CASO            = $posTeste['EFP_CASO'];
                        $modelPosTestes->EFP_DESCRICAO       = $posTeste['EFP_DESCRICAO'];
                        $codigo = (isset($posTeste['EFP_CODIGO']) ? $posTeste['EFP_CODIGO'] : false);
                        if($codigo) {
                            foreach($oldPosTestes as $oldPosTeste) {
                                if($oldPosTeste->EFP_CODIGO == $codigo) {
                                    $modelPosTestes->EFP_IDUSUARIO = $oldPosTeste->EFP_IDUSUARIO;
                                    $modelPosTestes->EFP_DATA = $oldPosTeste->EFP_DATA;
                                    $modelPosTestes->EFP_UPDATES = $oldPosTeste->EFP_UPDATES;

                                    if($oldPosTeste->EFP_CASO != $modelPosTestes->EFP_CASO || $oldPosTeste->EFP_DESCRICAO != $modelPosTestes->EFP_DESCRICAO) {
                                        $modelPosTestes->EFP_UPDATES .= "Atualizado por ".User::getName()." em " . date('d/m/Y H:i:s').PHP_EOL;
                                    }
                                }
                            }
                        }
                        if(empty($modelPosTestes->EFP_IDUSUARIO)) {
                            $modelPosTestes->EFP_IDUSUARIO = User::getId();
                        } 
                        if (empty($modelPosTestes->EFP_DATA)) {
                            $modelPosTestes->EFP_DATA = date('d/m/Y H:i:s');
                        }
                        $modelPosTestes->save();
                        unset($modelPosTestes);
                    }
                }

                $modelAtividade                    = new SolicitacoesAtividades;
                $modelAtividade->SAT_IDSOLICITACAO = $model->ESP_IDSOLICITACAO;
                $modelAtividade->SAT_DATACADASTRO  = date('d/m/Y H:i:s');
                $modelAtividade->SAT_IDAUTOR       = User::getId();
                $modelAtividade->SAT_IDLOCAL       = $model->Solicitacao->SOL_IDLOCAL;
                $modelAtividade->SAT_SITUACAO      = $model->Solicitacao->SOL_SITUACAO;
                $modelAtividade->SAT_DESCRICAO     = 'Documento de especificação funcional foi atualizado.';
                $modelAtividade->save(false, array('SAT_IDSOLICITACAO', 'SAT_DATACADASTRO', 'SAT_IDAUTOR', 'SAT_IDLOCAL', 'SAT_SITUACAO', 'SAT_DESCRICAO'));
                unset($modelAtividade);

                if (Yii::app()->getRequest()->getIsAjaxRequest()) {
                    Yii::app()->end();
                } else {

                    $this->redirect(array('solicitacoes/view', 'id' => $model->ESP_IDSOLICITACAO));
                }
            }

            $this->render('create2', array('model' => $model, 'ESP_IDSOLICITACAO' => $id));
        }

        public function actionDelete($id) {
            if(!User::isAdmin()) {
                User::clockAction('Sem permissão para realizar esta ação!');
            }
            $model = $this->loadModel($id, 'EspecificacaoFuncional');
            $id_pendencia = $model->ESP_IDSOLICITACAO;

            // excluir registros das tabelas estrabgeiras
            EspecificacaoFuncionalAnalistas::model()->deleteAll('EFA_IDESPECIFICACAO = ' . $id);
            EspecificacaoFuncionalRequisitos::model()->deleteAll('EFR_IDESPECIFICACAO = ' . $id);
            EspecificacaoFuncionalSimulacao::model()->deleteAll('EFS_IDESPECIFICACAO = ' . $id);
            $EspecificacaoFuncionalTabelas = EspecificacaoFuncionalTabelas::model()->findAll("EFT_IDESPECIFICACAO = " . $id);
            foreach ($EspecificacaoFuncionalTabelas as $EspecificacaoFuncionalTabelas) {
                EspecificacaoFuncionalCampos::model()->deleteAll('EFC_IDTABELA = ' . $EspecificacaoFuncionalTabelas->EFT_CODIGO);
            }
            EspecificacaoFuncionalTabelas::model()->deleteAll('EFT_IDESPECIFICACAO = ' . $id);
            EspecificacaoFuncionalNaoConformidade::model()->deleteAll('EFN_IDESPECIFICACAO = ' . $id);
            EspecificacaoFuncionalCasosTeste::model()->deleteAll('EFC_IDESPECIFICACAO = ' . $id);
            EspecificacaoFuncionalPosTestes::model()->deleteAll('EFP_IDESPECIFICACAO = ' . $id);

            if($model->delete()) {
                Yii::app()->user->setFlash('success', 'Excluído com sucesso!');
            } else {
                Yii::app()->user->setFlash('error', 'Erro ao tentar excluir, por favor tente novamente!');
            }
            $this->redirect(array('solicitacoes/view', 'id' => $id_pendencia));
        }

        /*public function actionAdmin() {
            $model = new EspecificacaoFuncional('search');
            $model->unsetAttributes();

            if (isset($_GET['EspecificacaoFuncional']))
                $model->setAttributes($_GET['EspecificacaoFuncional']);

            $this->render('admin', array(
                'model' => $model,
            ));
        }*/

    }

}