<commit_before><?php
namespace modules\sga\grupos;

use Novosga\Context;
use Novosga\Util\Arrays;
use Novosga\Model\SequencialModel;
use Novosga\Model\Grupo;
use Novosga\Controller\TreeModelController;

/**
 * GruposController
 *
 * @author <NAME> <<EMAIL>>
 */
class GruposController extends TreeModelController {
    
    private $adicionando = false;

    protected function createModel() {
        return new Grupo();
    }
    
    protected function requiredFields() {
        return array('nome', 'descricao');
    }

    protected function preSave(Context $context, SequencialModel $model) {
        $id_pai = (int) $context->request()->post('id_pai', 0);
        $pai = $this->em()->find(get_class($model), $id_pai);
        if ($pai) {
            $model->setParent($pai);
        }
        // adicionando
        if ($model->getId() == 0) {
            if (!$pai) {
                throw new \Exception(_('Favor escolher o Grupo pai'));
            }
            $this->adicionando = true;
        }
    }
    
    protected function postSave(Context $context, SequencialModel $model) {
        /* 
         * Se o pai tem unidades vinculadas a ele, é porque esse é o primeiro filho.
         * Então move todas as unidades para esse novo grupo
         */
        if ($this->adicionando) {
            $em = $context->database()->createEntityManager();
            $unidades = $this->countUnidades($model->getParent($em));
            if ($unidades > 0) {
                $query = $this->em()->createQuery("
                    UPDATE 
                        Novosga\Model\Unidade e 
                    SET
                        e.grupo = :novo
                    WHERE 
                        e.grupo = :grupo
                ");
                $query->setParameter('grupo', $model->getParent($em)->getId());
                $query->setParameter('novo', $model->getId());
                $query->execute();
            }
        }
    }

    protected function search($arg) {
        $query = $this->em()->createQuery("
            SELECT 
                e 
            FROM 
                Novosga\Model\Grupo e 
                JOIN e.unidade u
            WHERE 
                UPPER(e.nome) LIKE :arg OR UPPER(e.descricao) LIKE :arg 
            ORDER BY 
                e.left, e.nome
        ");
        $query->setParameter('arg', $arg);
        return $query;
    }
    
    
    private function countUnidades(Grupo $grupo) {
        $query = $this->em()->createQuery("
            SELECT 
                COUNT(e) as total
            FROM 
                Novosga\Model\Unidade e 
            WHERE 
                e.grupo = :grupo
        ");
        $query->setParameter('grupo', $grupo->getId());
        $rs = $query->getSingleResult();
        return $rs['total'];<commit_msg>fixes #196<commit_after><?php
namespace modules\sga\grupos;

use Novosga\Context;
use Novosga\Util\Arrays;
use Novosga\Model\SequencialModel;
use Novosga\Model\Grupo;
use Novosga\Controller\TreeModelController;

/**
 * GruposController
 *
 * @author <NAME> <<EMAIL>>
 */
class GruposController extends TreeModelController {
    
    private $adicionando = false;

    protected function createModel() {
        return new Grupo();
    }
    
    protected function requiredFields() {
        return array('nome', 'descricao');
    }

    protected function preSave(Context $context, SequencialModel $model) {
        $id_pai = (int) $context->request()->post('id_pai', 0);
        $pai = $this->em()->find(get_class($model), $id_pai);
        if ($pai) {
            $model->setParent($pai);
        }
        // adicionando
        if ($model->getId() == 0) {
            if (!$pai) {
                throw new \Exception(_('Favor escolher o Grupo pai'));
            }
            $this->adicionando = true;
        }
    }
    
    protected function postSave(Context $context, SequencialModel $model) {
        /* 
         * Se o pai tem unidades vinculadas a ele, é porque esse é o primeiro filho.
         * Então move todas as unidades para esse novo grupo
         */
        if ($this->adicionando) {
            $em = $context->database()->createEntityManager();
            $unidades = $this->countUnidades($model->getParent($em));
            if ($unidades > 0) {
                $query = $this->em()->createQuery("
                    UPDATE 
                        Novosga\Model\Unidade e 
                    SET
                        e.grupo = :novo
                    WHERE 
                        e.grupo = :grupo
                ");
                $query->setParameter('grupo', $model->getParent($em)->getId());
                $query->setParameter('novo', $model->getId());
                $query->execute();
            }
        }
    }

    protected function search($arg) {
        $query = $this->em()->createQuery("
            SELECT 
                e 
            FROM 
                Novosga\Model\Grupo e 
            WHERE 
                UPPER(e.nome) LIKE :arg OR UPPER(e.descricao) LIKE :arg 
            ORDER BY 
                e.left, e.nome
        ");
        $query->setParameter('arg', $arg);
        return $query;
    }
    
    
    private function countUnidades(Grupo $grupo) {
        $query = $this->em()->createQuery("
            SELECT 
                COUNT(e) as total
            FROM 
                Novosga\Model\Unidade e 
            WHERE 
                e.grupo = :grupo
        ");
        $query->setParameter('grupo', $grupo->getId());
        $rs = $query->getSingleResult();
        return $rs['total'];
{'fraction_non_alphanumeric': 0.1279028224365845, 'fraction_numerical': 0.001607717041800643, 'mean_word_length': 1.5403811252268602, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 67, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1353870', 'n_tokens_mistral': 1664, 'n_tokens_neox': 1572, 'n_words': 343}