Esempio n. 1
0
 protected function postSave(Context $context, SequencialModel $model)
 {
     if ($this->isNew) {
         $contador = new Contador();
         $contador->setUnidade($model);
         $contador->setTotal(0);
         $this->em()->persist($contador);
         $this->em()->flush();
     }
     $this->isNew = false;
 }
Esempio n. 2
0
 /**
  * Gera um novo atendimento.
  *
  * @param int|Unidade    $unidade
  * @param int|Usuario    $usuario
  * @param int|Servico    $servico
  * @param int|Prioridade $prioridade
  * @param string         $nomeCliente
  * @param string         $documentoCliente
  *
  * @return Atendimento
  *
  * @throws Exception
  */
 public function distribuiSenha($unidade, $usuario, $servico, $prioridade, $nomeCliente, $documentoCliente)
 {
     // verificando a unidade
     if (!$unidade instanceof Unidade) {
         $unidade = $this->em->find("Novosga\\Model\\Unidade", (int) $unidade);
     }
     if (!$unidade) {
         throw new Exception(_('Nenhum unidade escolhida'));
     }
     // verificando o usuario na sessao
     if (!$usuario instanceof Usuario || $usuario instanceof UsuarioSessao) {
         if ($usuario instanceof UsuarioSessao) {
             $usuario = $usuario->getWrapped();
         } else {
             $usuario = $this->em->find("Novosga\\Model\\Usuario", (int) $usuario);
         }
     }
     if (!$usuario) {
         throw new Exception(_('Nenhum usuário na sessão'));
     }
     // verificando o servico
     if (!$servico instanceof Servico) {
         $servico = $this->em->find("Novosga\\Model\\Servico", (int) $servico);
     }
     if (!$servico) {
         throw new Exception(_('Serviço inválido'));
     }
     // verificando a prioridade
     if (!$prioridade instanceof Prioridade) {
         $prioridade = $this->em->find("Novosga\\Model\\Prioridade", (int) $prioridade);
     }
     if (!$prioridade || $prioridade->getStatus() == 0) {
         throw new Exception(_('Prioridade inválida'));
     }
     // verificando se o servico esta disponivel na unidade
     $service = new ServicoService($this->em);
     $su = $service->servicoUnidade($unidade, $servico);
     if (!$su) {
         throw new Exception(_('Serviço não disponível para a unidade atual'));
     }
     $contador = $this->em->find('Novosga\\Model\\Contador', $unidade);
     if (!$contador) {
         $contador = new Contador();
         $contador->setUnidade($unidade);
         $contador->setTotal(0);
         $this->em->persist($contador);
         $this->em->flush();
     }
     $numeroSenha = $contador->getTotal() + 1;
     $contador->setTotal($numeroSenha);
     $atendimento = new Atendimento();
     $atendimento->setServicoUnidade($su);
     $atendimento->setPrioridade($prioridade);
     $atendimento->setUsuarioTriagem($usuario);
     $atendimento->setStatus(self::SENHA_EMITIDA);
     $atendimento->setLocal(0);
     $atendimento->setNomeCliente($nomeCliente);
     $atendimento->setDocumentoCliente($documentoCliente);
     $atendimento->setSiglaSenha($su->getSigla());
     AppConfig::getInstance()->hook('attending.pre-create', array($atendimento));
     $this->em->beginTransaction();
     try {
         $attempts = 5;
         $this->em->lock($contador, LockMode::PESSIMISTIC_WRITE);
         do {
             try {
                 // ultimo numero gerado (servico). busca pela sigla do servico para nao aparecer duplicada (em caso de mais de um servico com a mesma sigla)
                 try {
                     $numeroSenhaServico = (int) $this->em->createQuery('
                             SELECT
                                 e.numeroSenhaServico
                             FROM
                                 Novosga\\Model\\Atendimento e
                                 JOIN e.servicoUnidade su
                             WHERE
                                 su.unidade = :unidade AND
                                 e.siglaSenha = :sigla
                             ORDER BY
                                 e.numeroSenhaServico DESC
                         ')->setParameter('unidade', $unidade)->setParameter('sigla', $su->getSigla())->setMaxResults(1)->getSingleScalarResult();
                 } catch (Exception $e) {
                     $numeroSenhaServico = 0;
                 }
                 $atendimento->setDataChegada(new DateTime());
                 $atendimento->setNumeroSenha($numeroSenha);
                 $atendimento->setNumeroSenhaServico($numeroSenhaServico + 1);
                 $this->em->persist($atendimento);
                 $this->em->merge($contador);
                 $this->em->commit();
                 $this->em->flush();
                 break;
             } catch (OptimisticLockException $e) {
                 --$attempts;
                 if ($attempts <= 0) {
                     throw $e;
                 }
                 usleep(100);
             }
         } while ($attempts > 0);
         if ($attempts === 0) {
             throw new Exception(_('Erro ao tentar gerar nova senha'));
         }
         if (!$atendimento || !$atendimento->getId()) {
             throw new \Exception(sprintf(_('O último ID retornado pelo banco não é de um atendimento válido: %s'), $id));
         }
         AppConfig::getInstance()->hook('attending.create', $atendimento);
         return $atendimento;
     } catch (Exception $e) {
         try {
             $this->em->rollback();
         } catch (Exception $ex) {
         }
         throw $e;
     }
 }