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; }
/** * 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; } }