getCurrentLotacao(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->first(); $countUsuario = ParametrizacaoPermissaoUsuario::count(); $classificacoes = $permissaoUsuario ? PacienteClassificacao::orderBy('descricao') ->get() ->filter(function ($classificacao) use ($permissaoUsuario) { $exibe = false; switch ($classificacao->id) { case Classificacao::MUNICIPE: $exibe = $permissaoUsuario->municipe; break; case Classificacao::PROVISORIO: $exibe = $permissaoUsuario->provisorio; break; case Classificacao::OUTRO_MUNICIPIO: $exibe = $permissaoUsuario->outro_municipio; break; } return $exibe ? [ 'id' => $classificacao->id, 'descricao' => $classificacao->descricao ] : null; }) ->values() : []; return response()->json( [ 'additionals' => [ 'plantao_id' => $plantao->id ?? null, 'plantao_faixa_etaria_id' => $plantao->faixa_etaria_id ?? null, 'classificacoes' => $classificacoes, 'is_permissao_cadastro' => $countUsuario === 0 ? true : false, ], ], Response::HTTP_OK ); } public function create() { $this->auth(__FUNCTION__); $now = Carbon::now(); $senha = ''; $opcaoEntradaId = null; $pacienteIdentificado = null; $isAtendimentoPreferencial = false; $prioridadeId = null; $alertFaaAberta = false; $alertFaaEvadida = false; $dataHoraDesfecho = null; if (is_numeric(request()->fila_id)) { $fila = Fila::findOrFail(request()->fila_id); $senha = $fila->senha; $opcaoEntradaId = $fila->opcao_entrada_id; if ($fila->prioridade_id) { $isAtendimentoPreferencial = true; $prioridadeId = $fila->prioridade_id; } } if (is_numeric(request()->paciente_id)) { $faa = Faa::with('atendimentos.fila') ->where('paciente_id', request()->paciente_id) ->whereHas('atendimentos.fila', function($query) { $query ->whereHas('centroCusto', function($query) { $query->where( 'infraestrutura_id', Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->infraestrutura_id ); }); }) ->where(function($query) { $query->whereNull('desfecho_id') ->orWhere('desfecho_id', Desfecho::EVASAO); }) ->orderByDesc('id') ->first(); if ($faa) { $setor = null; $createdAt = null; $procedimentos = 0; $finalizado = false; $faa->atendimentos->map(function($atendimento) use (&$setor, &$procedimentos, &$createdAt, &$finalizado) { $createdAt = $atendimento->fila->created_at; $setor = $atendimento->fila->centroCusto->setor; $procedimentos = $atendimento->procedimentos->count(); $finalizado = $atendimento->fila->finalizado; }); $createdAt = Carbon::parse($createdAt)->addDay()->format('Y-m-d h:i'); if ($createdAt >= Carbon::now()->format('Y-m-d h:i')) { if($faa->desfecho_id == Desfecho::EVASAO) { $alertFaaEvadida = true; $dataHoraDesfecho = Carbon::parse($faa->data_hora_desfecho)->format('d/m/Y H:i'); } elseif ($faa->desfecho_id == null || ($procedimentos > 0 && $finalizado)) { $alertFaaAberta = true; } } else { if ($faa->desfecho_id == null) { $alertFaaAberta = true; } } } $paciente = Paciente::findOrFail(request()->paciente_id); $endereco = ''; if ($paciente->cidadao->domicilio_id) { $endereco = $paciente->cidadao->domicilio->endereco; $endereco = $endereco->completo . ' - ' . MaskUtil::getCepMasked($endereco->logradouro->cep); } $pacienteIdentificado = [ 'prontuario' => $paciente->prontuario, 'classificacao_id' => $paciente->classificacao_id, 'cns' => $paciente->cidadao->cns, 'nome' => $paciente->cidadao->nome, 'nome_social' => $paciente->cidadao->nome_social, 'preferencia_nome_id' => $paciente->cidadao->preferencia_nome_id ?? null, 'nome_mae' => $paciente->cidadao->nome_mae ?? '', 'sexo' => [ 'id' => $paciente->cidadao->sexo->id, 'descricao' => $paciente->cidadao->sexo->descricao, ], 'data_nascimento' => $paciente->cidadao->data_nascimento->format('d/m/Y'), 'idade' => $paciente->cidadao->idade, 'endereco' => $endereco, 'telefones' => $paciente->cidadao->telefones->map(fn ($telefone) => [ 'id' => $telefone->id, 'numero' => MaskUtil::getPhoneMasked($telefone->numero), 'observacao' => $telefone->observacao ?? '', 'autoriza_sms' => $telefone->autoriza_sms, 'principal' => $telefone->principal, ]), 'cidadao_id' => $paciente->cidadao_id, ]; if ($paciente->cidadao->idade['anos'] >= 60) { $isAtendimentoPreferencial = true; $prioridadeId = PainelSenhaPrioridade::IDOSO; } } $ocupacoes = collect(); Plantao::whereIn('status_id', [ PlantaoStatus::CADASTRADO, PlantaoStatus::CONFIRMADO, PlantaoStatus::COM_ATENDIMENTO_AGENDADO ]) ->whereRaw("DATE_SUB(pronto_atendimento_plantao.inicio, INTERVAL 60 MINUTE) <= '{$now->format('Y-m-d H:i:s')}'") ->where('pronto_atendimento_plantao.fim', '>=', $now->format('Y-m-d H:i:s')) ->get() ->map(function ($plantao) use ($ocupacoes) { if ($plantao->servico_id === EstabelecimentoServico::CONSULTA_MEDICA) { $ocupacao = $plantao->lotacao->ocupacao; if (!$ocupacoes->contains('id', $ocupacao->id)) { $ocupacoes->push([ 'id' => $ocupacao->id, 'codigoNome' => $ocupacao->codigo_nome, ]); } } }); $lotacao = $this->getCurrentLotacao(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->first(); $countUsuario = ParametrizacaoPermissaoUsuario::count(); $classificacoes = $permissaoUsuario ? PacienteClassificacao::orderBy('descricao') ->get() ->filter(function ($classificacao) use ($permissaoUsuario) { $exibe = false; switch ($classificacao->id) { case Classificacao::MUNICIPE: $exibe = $permissaoUsuario->municipe; break; case Classificacao::PROVISORIO: $exibe = $permissaoUsuario->provisorio; break; case Classificacao::OUTRO_MUNICIPIO: $exibe = $permissaoUsuario->outro_municipio; break; } return $exibe ? [ 'id' => $classificacao->id, 'descricao' => $classificacao->descricao ] : null; }) ->values() : []; return response()->json( [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), ], 'data_atual' => $now->format('d/m/Y'), 'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao), 'form' => [ 'senha' => $senha, 'alert_faa_aberta' => $alertFaaAberta, 'setor' => $setor['nome'] ?? null, 'alert_faa_evadida' => $alertFaaEvadida, 'data_hora_desfecho' => $dataHoraDesfecho, 'is_atendimento_preferencial' => $isAtendimentoPreferencial, 'prioridades' => Prioridade::orderBy('nome') ->get() ->map(fn ($prioridade) => [ 'id' => $prioridade->id, 'nome' => $prioridade->nome, ]), 'prioridade_id' => $prioridadeId, 'paciente_identificado' => $pacienteIdentificado, 'paciente_desconhecido' => [ 'sexos' => Sexo::orderBy('descricao') ->get() ->map(fn ($sexo) => [ 'id' => $sexo->id, 'descricao' => $sexo->descricao ]), ], 'opcoes_entrada' => OpcaoEntrada::where('modulo_id', ModuloService::getId(Modulo::PRONTO_ATENDIMENTO)) ->orderBy('nome') ->where('centro_custo_id', auth()->payload()->get('centro_custo_id')) ->get() ->map(fn($opcao) => [ 'id' => $opcao->id, 'nome' => $opcao->nome, 'prioridade_obrigatoria' => $opcao->prioridade_obrigatoria ]), 'opcao_entrada_id' => $opcaoEntradaId, 'origens_entrada' => OrigemEntrada::orderBy('nome') ->get() ->map(fn ($origem) => [ 'id' => $origem->id, 'nome' => $origem->nome, ]), 'origem_entrada_id' => AtendimentoOrigemEntrada::ESPONTANEA, 'origens_unidade' => [ [ 'id' => OrigemUnidadeEncaminhamento::INTERNA, 'nome' => 'INTERNA' ], [ 'id' => OrigemUnidadeEncaminhamento::EXTERNA, 'nome' => 'EXTERNA' ], ], 'origem_unidade_value' => OrigemUnidadeEncaminhamento::INTERNA, 'servicos' => Servico::orderBy('nome') ->get() ->map(fn ($servico) => [ 'id' => $servico->id, 'nome' => $servico->nome, ]), 'ocupacoes' => $ocupacoes, 'centros_custo_para' => Encaminhamento::where('centro_custo_id_de', auth()->payload()->get('centro_custo_id')) ->get() ->map(fn ($encaminhamento) => [ 'id' => $encaminhamento->centroCustoPara->id, 'nome' => $encaminhamento->centroCustoPara->setor->nome, 'setor_tipo_id' => $encaminhamento->centroCustoPara->setor->tipo_id ]), 'raat_data' => [ 'form' => [ 'raat' => [ 'tipo_acidente' => TipoAcidente::orderBy('nome') ->get() ->map(fn ($tipo) => [ 'id' => $tipo->id, 'nome' => $tipo->nome, ]), 'regime_trabalho' => RegimeTrabalho::orderBy('nome') ->get() ->map(fn ($tipo) => [ 'id' => $tipo->id, 'nome' => $tipo->nome, ]), ] ] ], 'classificacoes' => $classificacoes, 'is_permissao_cadastro' => $countUsuario === 0 ? true : false, ], ], Response::HTTP_OK ); } public function store(RecepcaoRequest $request) { $this->auth(__FUNCTION__); $recepcao = null; DB::beginTransaction(); try { $params = $this->getParams($request); sleep(rand(1, 3)); $faaRecente = Faa::where('paciente_id', $params['paciente'])->where('created_at', '>=', now()->subMinutes(5))->first(); if ($faaRecente) { throw new \Exception('O paciente teve uma FAA criada a menos de 5 minutos, caso deseje criar outra tente novamente após esse tempo.'); } $pacienteId = $this->savePaciente($params['paciente'], $params['atendido_em']); $faa = Faa::create(['paciente_id' => $pacienteId]); if (isset($params['raat'])) { $this->saveRaat($faa, $params['raat']); } $filaId = $this->saveFila($params['fila']); $atendimento = $faa->atendimentos()->create(['fila_id' => $filaId]); $recepcao = $this->saveAtendimentoRecepcao($atendimento, $params); if (isset($params['observacao'])) { $atendimento->observacoes()->create([ 'atendimento_recepcao_id' => $recepcao->id, 'descricao' => $params['observacao'], ]); } $this->encaminharFila($pacienteId, $filaId, $params['fila']); DB::commit(); $recepcao->refresh(); $recepcao->impressoes = $this->getImpressoes($recepcao); } catch (\Exception $e) { DB::rollBack(); return response()->json(['message' => $e->getMessage()], Response::HTTP_BAD_REQUEST); } return response()->json($recepcao, Response::HTTP_CREATED); } private function getParams($request) { $params = $request->all(); if (isset($params['paciente']['nome'])) { $params['paciente']['nome'] = mb_strtoupper($params['paciente']['nome']); } if (isset($params['urgente_motivo'])) { $params['urgente_motivo'] = mb_strtoupper($params['urgente_motivo']); } if (isset($params['medico_samu'])) { $params['medico_samu'] = mb_strtoupper($params['medico_samu']); } if (isset($params['acompanhante'])) { $params['acompanhante'] = mb_strtoupper($params['acompanhante']); } if (isset($params['medico_solicitante_encaminhamento'])) { $params['medico_solicitante_encaminhamento'] = mb_strtoupper($params['medico_solicitante_encaminhamento']); } if (isset($params['raat']['empresa']['nome'])) { $params['raat']['empresa']['nome'] = mb_strtoupper($params['raat']['empresa']['nome']); } if (isset($params['raat']['empresa']['ramo_atividade'])) { $params['raat']['empresa']['ramo_atividade'] = mb_strtoupper($params['raat']['empresa']['ramo_atividade']); } if (isset($params['raat']['empresa']['endereco'])) { $params['raat']['empresa']['endereco'] = mb_strtoupper($params['raat']['empresa']['endereco']); } if (isset($params['raat']['acidente']['local'])) { $params['raat']['acidente']['local'] = mb_strtoupper($params['raat']['acidente']['local']); } if (isset($params['raat']['acidente']['regime_trabalho_outro'])) { $params['raat']['acidente']['regime_trabalho_outro'] = mb_strtoupper( $params['raat']['acidente']['regime_trabalho_outro'] ); } return $params; } private function savePaciente($params, $atendidoEm) { if (isset($params['id'])) { return $params['id']; } return (new PacienteDesconhecidoSaveService( $atendidoEm, $params['sexo_id'], $params['caracteristicas_fisicas'] ?? null ))->save()->id; } private function saveRaat($faa, $params) { return $faa->raat()->create([ 'empresa_nome' => $params['empresa']['nome'], 'empresa_ramo_atividade' => $params['empresa']['ramo_atividade'] ?? null, 'empresa_endereco' => $params['empresa']['endereco'] ?? null, 'empresa_telefone' => $params['empresa']['telefone'] ?? null, 'acidente_data' => $params['acidente']['data'], 'acidente_hora' => $params['acidente']['hora'] ?? null, 'acidente_tipo_id' => $params['acidente']['tipo_id'] ?? null, 'acidente_local' => $params['acidente']['local'] ?? null, 'acidente_descricao' => $params['acidente']['descricao'], 'regime_trabalho_id' => $params['regime_trabalho_id'] ?? null, 'regime_trabalho_outro' => $params['regime_trabalho_outro'] ?? null ]); } private function saveFila($params) { if (isset($params['id'])) { return $params['id']; } $centroCusto = CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id')); $fila = FilaService::store([ 'centro_custo_id' => $centroCusto->id, 'opcao_entrada_id' => $params['opcao_entrada_id'], 'prioridade_id' => $params['prioridade_id'] ]); return $fila->id; } private function saveAtendimentoRecepcao($atendimento, $params) { $plantaoId = $params['plantao_id'] ?? PlantaoService::getCurrentPlantao()->id ?? null; if (isset($plantaoId)) { PlantaoService::setStatusComAtendimento($plantaoId); } return $atendimento->recepcao()->create([ 'plantao_id' => $plantaoId, 'atendido_em' => $params['atendido_em'], 'urgente' => $params['urgente'] ?? null, 'urgente_motivo' => $params['urgente_motivo'] ?? null, 'origem_entrada_id' => $params['origem_entrada_id'] ?? null, 'medico_samu' => $params['medico_samu'] ?? null, 'motivo_atendimento' => $params['motivo_atendimento'] ?? null, 'acompanhante' => $params['acompanhante'] ?? null, 'unidade_encaminhamento_id' => $params['unidade_encaminhamento_id'] ?? null, 'unidade_externa_encaminhamento_id' => $params['unidade_externa_encaminhamento_id'] ?? null, 'medico_solicitante_encaminhamento' => $params['medico_solicitante_encaminhamento'] ?? null, 'servico_id' => $params['servico_id'], 'ocupacao_id' => $params['ocupacao_id'] ?? null, 'observacao' => $params['observacao'] ?? null, ]); } private function encaminharFila($pacienteId, $filaId, $params) { FilaService::forward([ 'centro_custo_id_para' => $params['centro_custo_id_para'], 'prioridade_id' => $params['prioridade_id'] ?? null, 'paciente_id' => $pacienteId, ], $filaId); } private function getImpressoes($recepcao) { $cidadao = $recepcao->atendimento->faa->paciente->cidadao; $fila = $recepcao->atendimento->fila; $impressoesFAA = ImpressaoService::getImpressoesFaa($recepcao->atendimento_id); $indiceFaaEletronica = array_search('eletronica', array_column($impressoesFAA, 'value')); unset($impressoesFAA[$indiceFaaEletronica]); return [ 'recepcao' => ImpressaoService::getImpressoesRecepcao( $recepcao->atendimento_id, [ 'etiqueta' => [ 'atendido_em' => (new Carbon($recepcao->atendido_em))->format('d/m/Y H:i'), 'infraestrutura' => $recepcao->createdLotacao->infraestrutura->nome, 'acompanhante' => $recepcao->acompanhante ?? '', 'paciente' => $cidadao->nome, 'data_nascimento' => $cidadao->data_nascimento ? $cidadao->data_nascimento->format('d/m/Y') : '', 'senha' => $recepcao->atendimento->fila->senha ], 'senha' => [ 'data' => $fila->data_emissao, 'hora' => $fila->hora_emissao, 'senha' => $fila->senha, ] ] ), 'faa' => array_values($impressoesFAA) ]; } private static function getPermissoesAtualizacaoCadastroPaciente() { $parametrizacao = CnsService::getParametrizacao(); if (!is_null($parametrizacao)) { $lotacao = self::getCurrentLotacao(); return DB::table('cadastro_parametrizacao_permissao_usuario') ->select([ 'municipe', 'provisorio', 'outro_municipio', ]) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->where('usuario_id', $lotacao->usuario_id) ->get() ->first(); } return null; } }