has('assinados') && request()->assinados === 'true') { $impressoes = self::getImpressoesAtendimentoAssinados(request()->atendimento_id); } else { $atendimento = Atendimento::findOrFail(request()->atendimento_id); switch (request()->origem) { case 'recepcao': { $impressoes = self::getImpressoesRecepcao($atendimento); break; } case 'pre-atendimento': { $impressoes = self::getImpressoesPreAtendimento($atendimento); break; } case 'atendimento': { $impressoes = self::getImpressoesAtendimento($atendimento); break; } case 'pos-consulta': { $impressoes = self::getImpressoesPosConsulta($atendimento); break; } } } $impressoes = $impressoes->sortBy('text')->values(); return [ 'form' => [ 'impressoes' => $impressoes, 'impressoes_assinadas' => request()->has('soap_id') && is_numeric(request()->soap_id) ? self::getImpressoesAtendimentoAssinados(request()->soap_id) : [], ], 'model' => [ 'impressoes' => [], ], ]; } private static function getImpressoesRecepcao($atendimento) { return collect([ [ 'value' => 'senha', 'text' => 'Senha', 'data' => [ 'data' => $atendimento->fila->data_emissao, 'hora' => $atendimento->fila->hora_emissao, 'senha' => $atendimento->fila->senha, ], ] ]); } private static function getImpressoesPreAtendimento($atendimento) { $impressoes = collect([ [ 'value' => 'preAtendimento', 'text' => 'Pré-atendimento', ], ]); if (self::hasDeclaracaoComparecimento($atendimento)) { $impressoes->push([ 'value' => 'declaracaoComparecimento', 'text' => 'Declaração de comparecimento', ]); } return $impressoes; } private static function getImpressoesPosConsulta($atendimento) { $hasCamposObrigatoriosMama = !is_null($atendimento->paciente->cidadao->nome) && !is_null($atendimento->paciente->cidadao->data_nascimento) && (!is_null($atendimento->paciente->cidadao->cpf) || !is_null($atendimento->paciente->cidadao->cns)); $impressoes = collect([ [ 'value' => 'posConsulta', 'text' => 'Pós-consulta', ], ]); $solicitacoesSadt = self::getSolicitacoesFichaSadt($atendimento); if ($solicitacoesSadt->isNotEmpty()) { $impressoes->push([ 'value' => 'fichaRequisicaoServicoAuxiliarDiagnoseTerapia', 'text' => 'Ficha de requisição de serviços auxiliares de diagnose e terapia (SADT)', 'data' => $solicitacoesSadt, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_SADT ]); } $solicitacoesSadat = self::getSolicitacoesFichaSadat($atendimento); if ($solicitacoesSadat->isNotEmpty()) { $impressoes->push([ 'value' => 'servicoAnaliseDiagnosticoTerapiaSolicitacaoExame', 'text' => 'Serviço de análises, diagnósticos e terapia, solicitação de exames (SADAT)', 'data' => $solicitacoesSadat, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_SADAT ]); } if (self::hasSolicitacaoExameCitopatologicoColoUtero($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoColoUtero', 'text' => 'Requisição de exame citopatológico - Colo do útero', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_CITOPATOLOGICO_DE_COLO_DE_UTERO ]); } if ($hasCamposObrigatoriosMama && self::hasSolicitacaoExameCitopatologicoMama($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoMama', 'text' => 'Requisição de exame citopatológico - Mama', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_CITOPATOLOGICO_DE_MAMA ]); } if (self::hasSolicitacaoExameHistopatologicoMamografia($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameHistopatologicoMamografia', 'text' => 'Requisição de exame histopatológico - Mamografia', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_HISTOPATOLOGICO_DE_MAMA ]); } $solicitacoesApac = self::getSolicitacoesApac($atendimento); if ($solicitacoesApac->isNotEmpty()) { $impressoes->push([ 'value' => 'laudoSolicitacaoAutorizacaoProcedimentoAmbulatorial', 'text' => 'Laudo para solicitacao/autorizacao de procedimento ambulatorial', 'data' => $solicitacoesApac, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_APAC ]); } if (self::hasEncaminhamento($atendimento)) { $impressoes->push([ 'value' => 'encaminhamento', 'text' => 'Encaminhamento', ]); } if ($hasCamposObrigatoriosMama && self::hasRequisicaoMamografia($atendimento)) { $impressoes->push([ 'value' => 'requisicaoMamografia', 'text' => 'Requisição de mamografia', ]); } return $impressoes; } public static function getImpressoesAtendimento($atendimento) { $impressoes = collect(); $hasCamposObrigatoriosMama = !is_null($atendimento->paciente->cidadao->nome) && !is_null($atendimento->paciente->cidadao->data_nascimento) && (!is_null($atendimento->paciente->cidadao->cpf) || !is_null($atendimento->paciente->cidadao->cns)); $impressoes->push([ 'value' => 'atendimento', 'text' => 'Atendimento', 'assinatura' => ImpressaoAssinaturaEletronica::REGISTRO_DO_ATENDIMENTO_MEDICO ]); if (self::hasCartaMedica($atendimento)) { $impressoes->push([ 'value' => 'cartaMedica', 'text' => 'Carta médica', 'assinatura' => ImpressaoAssinaturaEletronica::CARTAS_MEDICAS ]); } $receitasMedicasComuns = self::getReceitasMedicasComuns($atendimento); if ($receitasMedicasComuns->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaComum', 'text' => 'Receituário comum', 'data' => $receitasMedicasComuns, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } $receitasMedicasEspeciais = self::getReceitasMedicasEspeciais($atendimento); if ($receitasMedicasEspeciais->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaEspecial', 'text' => 'Receituário especial', 'data' => $receitasMedicasEspeciais, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } $laudoMedicamentos = self::getLaudoMedicamentos($atendimento); if ($laudoMedicamentos->isNotEmpty() && self::requiredFieldAtendimento($atendimento) && self::requiredFieldPaciente($atendimento)) { $impressoes->push([ 'value' => 'laudoMedicamentos', 'text' => 'Laudo de medicamentos (LME)', 'data' => $laudoMedicamentos, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } $solicitacoesSadt = self::getSolicitacoesFichaSadt($atendimento); if ($solicitacoesSadt->isNotEmpty()) { $impressoes->push([ 'value' => 'fichaRequisicaoServicoAuxiliarDiagnoseTerapia', 'text' => 'Ficha de requisição de serviços auxiliares de diagnose e terapia (SADT)', 'data' => $solicitacoesSadt, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_SADT ]); } $solicitacoesSadat = self::getSolicitacoesFichaSadat($atendimento); if ($solicitacoesSadat->isNotEmpty()) { $impressoes->push([ 'value' => 'servicoAnaliseDiagnosticoTerapiaSolicitacaoExame', 'text' => 'Serviço de análises, diagnósticos e terapia, solicitação de exames (SADAT)', 'data' => $solicitacoesSadat, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_SADAT ]); } if (self::hasSolicitacaoExameCitopatologicoColoUtero($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoColoUtero', 'text' => 'Requisição de exame citopatológico - Colo do útero', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_CITOPATOLOGICO_DE_COLO_DE_UTERO ]); } if ($hasCamposObrigatoriosMama && self::hasSolicitacaoExameCitopatologicoMama($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoMama', 'text' => 'Requisição de exame citopatológico - Mama', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_CITOPATOLOGICO_DE_MAMA ]); } if (self::hasSolicitacaoExameHistopatologicoMamografia($atendimento)) { $impressoes->push([ 'value' => 'requisicaoExameHistopatologicoMamografia', 'text' => 'Requisição de exame histopatológico - Mamografia', 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_HISTOPATOLOGICO_DE_MAMA ]); } $solicitacoesApac = self::getSolicitacoesApac($atendimento); if ($solicitacoesApac->isNotEmpty()) { $impressoes->push([ 'value' => 'laudoSolicitacaoAutorizacaoProcedimentoAmbulatorial', 'text' => 'Laudo para solicitacao/autorizacao de procedimento ambulatorial', 'data' => $solicitacoesApac, 'assinatura' => ImpressaoAssinaturaEletronica::SOLICITACAO_DE_EXAMES_APAC ]); } $receitasMedicasEspeciaisAzuis = self::getReceitasMedicasEspeciaisAzuis($atendimento); if ($receitasMedicasEspeciaisAzuis->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaEspecialAzul', 'text' => 'Receituário especial (Azul)', 'data' => $receitasMedicasEspeciaisAzuis, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } $receitasMedicasEspeciaisAmarelas = self::getReceitasMedicasEspeciaisAmarelas($atendimento); if ($receitasMedicasEspeciaisAmarelas->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaEspecialAmarela', 'text' => 'Receituário especial (Amarela)', 'data' => $receitasMedicasEspeciaisAmarelas, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } if (self::hasDeclaracaoComparecimento($atendimento)) { $impressoes->push([ 'value' => 'declaracaoComparecimento', 'text' => 'Declaração de comparecimento', 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } if (self::hasAtestado($atendimento)) { $impressoes->push([ 'value' => 'atestado', 'text' => 'Atestado', 'assinatura' => ImpressaoAssinaturaEletronica::ATESTADOS_MEDICOS ]); } $receitasMedicasNaoPadronizadasComuns = self::getReceitasMedicasNaoPadronizadasComuns($atendimento); if ($receitasMedicasNaoPadronizadasComuns->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaNaoPadronizadaComum', 'text' => 'Receituário (Não padronizada) comum', 'data' => $receitasMedicasNaoPadronizadasComuns, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } $receitasMedicasNaoPadronizadasEspeciais = self::getReceitasMedicasNaoPadronizadasEspeciais($atendimento); if ($receitasMedicasNaoPadronizadasEspeciais->isNotEmpty()) { $impressoes->push([ 'value' => 'receitaMedicaNaoPadronizadaEspecial', 'text' => 'Receituário (Não padronizada) especial', 'data' => $receitasMedicasNaoPadronizadasEspeciais, 'assinatura' => ImpressaoAssinaturaEletronica::RECEITUARIO_MEDICO ]); } if (self::hasOrientacao($atendimento)) { $impressoes->push([ 'value' => 'orientacao', 'text' => 'Orientação', 'assinatura' => ImpressaoAssinaturaEletronica::ORIENTACAO ]); } if (self::hasEncaminhamento($atendimento)) { $impressoes->push([ 'value' => 'encaminhamento', 'text' => 'Encaminhamento', 'assinatura' => ImpressaoAssinaturaEletronica::ENCAMINHAMENTOS ]); } if (self::hasEncaminhamentoHospitalar($atendimento)) { $impressoes->push([ 'value' => 'encaminhamentoHospitalar', 'text' => 'Encaminhamento Hospitalar', 'assinatura' => ImpressaoAssinaturaEletronica::ENCAMINHAMENTOS ]); } if (self::hasFichaNotificacaoSinan($atendimento)) { $impressoes->push([ 'value' => 'fichaNotificacaoSinan', 'text' => 'Ficha de notificação', ]); } if ($hasCamposObrigatoriosMama && self::hasRequisicaoMamografia($atendimento)) { $impressoes->push([ 'value' => 'requisicaoMamografia', 'text' => 'Requisição de mamografia', ]); } if (self::hasPuericulturaQuestionarioMChatR($atendimento)) { $impressoes->push([ 'value' => 'laudoMChatR', 'text' => 'Laudo M-CHAT-R', ]); } return $impressoes->sortBy('text')->values(); } public static function getImpressoesAtendimentoAssinados($id) { $impressoes = collect(); if (self::hasAssinado($id, 'atendimento')) { $impressoes->push([ 'value' => 'atendimento', 'text' => 'Atendimento', ]); } if (self::hasAssinado($id, 'cartaMedica')) { $impressoes->push([ 'value' => 'cartaMedica', 'text' => 'Carta médica', ]); } if (self::hasAssinado($id, 'receitaMedicaComum')) { $impressoes->push([ 'value' => 'receitaMedicaComum', 'text' => 'Receituário comum', ]); } if (self::hasAssinado($id, 'receitaMedicaEspecial')) { $impressoes->push([ 'value' => 'receitaMedicaEspecial', 'text' => 'Receituário especial', ]); } if (self::hasAssinado($id, 'laudoMedicamentos')) { $impressoes->push([ 'value' => 'laudoMedicamentos', 'text' => 'Laudo de medicamentos (LME)', ]); } if (self::hasAssinado($id, 'fichaRequisicaoServicoAuxiliarDiagnoseTerapia')) { $impressoes->push([ 'value' => 'fichaRequisicaoServicoAuxiliarDiagnoseTerapia', 'text' => 'Ficha de requisição de serviços auxiliares de diagnose e terapia (SADT)', ]); } if (self::hasAssinado($id, 'servicoAnaliseDiagnosticoTerapiaSolicitacaoExame')) { $impressoes->push([ 'value' => 'servicoAnaliseDiagnosticoTerapiaSolicitacaoExame', 'text' => 'Serviço de análises, diagnósticos e terapia, solicitação de exames (SADAT)', ]); } if (self::hasAssinado($id, 'requisicaoExameCitopatologicoColoUtero')) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoColoUtero', 'text' => 'Requisição de exame citopatológico - Colo do útero', ]); } if (self::hasAssinado($id, 'requisicaoExameCitopatologicoMama')) { $impressoes->push([ 'value' => 'requisicaoExameCitopatologicoMama', 'text' => 'Requisição de exame citopatológico - Mama', ]); } if (self::hasAssinado($id, 'requisicaoExameHistopatologicoMamografia')) { $impressoes->push([ 'value' => 'requisicaoExameHistopatologicoMamografia', 'text' => 'Requisição de exame histopatológico - Mamografia', ]); } if (self::hasAssinado($id, 'laudoSolicitacaoAutorizacaoProcedimentoAmbulatorial')) { $impressoes->push([ 'value' => 'laudoSolicitacaoAutorizacaoProcedimentoAmbulatorial', 'text' => 'Laudo para solicitacao/autorizacao de procedimento ambulatorial', ]); } if (self::hasAssinado($id, 'receitaMedicaEspecialAzul')) { $impressoes->push([ 'value' => 'receitaMedicaEspecialAzul', 'text' => 'Receituário especial (Azul)', ]); } if (self::hasAssinado($id, 'receitaMedicaEspecialAmarela')) { $impressoes->push([ 'value' => 'receitaMedicaEspecialAmarela', 'text' => 'Receituário especial (Amarela)', ]); } if (self::hasAssinado($id, 'declaracaoComparecimento')) { $impressoes->push([ 'value' => 'declaracaoComparecimento', 'text' => 'Declaração de comparecimento', ]); } if (self::hasAssinado($id, 'atestado')) { $impressoes->push([ 'value' => 'atestado', 'text' => 'Atestado', ]); } if (self::hasAssinado($id, 'receitaMedicaNaoPadronizadaComum')) { $impressoes->push([ 'value' => 'receitaMedicaNaoPadronizadaComum', 'text' => 'Receituário (Não padronizada) comum', ]); } if (self::hasAssinado($id, 'receitaMedicaNaoPadronizadaEspecial')) { $impressoes->push([ 'value' => 'receitaMedicaNaoPadronizadaEspecial', 'text' => 'Receituário (Não padronizada) especial', ]); } if (self::hasAssinado($id, 'orientacao')) { $impressoes->push([ 'value' => 'orientacao', 'text' => 'Orientação', ]); } if (self::hasAssinado($id, 'encaminhamento')) { $impressoes->push([ 'value' => 'encaminhamento', 'text' => 'Encaminhamento', ]); } return $impressoes->sortBy('text')->values(); } private static function hasCartaMedica($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('cartasMedicas')->exists(); } private static function getReceitasMedicasComuns($atendimento) { return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::COMUM)) ) ->get() ->map(fn ($prescricao) => [ 'collapse' => true, 'id' => $prescricao->id, 'medicamentos' => $prescricao->itens() ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::COMUM)) ->get() ->map(function ($item) { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; } $data = [ 'checked' => false, 'id' => $item->id, 'is_manual' => false, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, 'recomendacoes' => $item->recomendacoes, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } return $data; }), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $prescricao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $prescricao->created_at->format('d/m/Y \à\s H:i'), ]); } private static function getReceitasMedicasEspeciais($atendimento) { return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL)) ) ->get() ->map(fn ($prescricao) => [ 'collapse' => true, 'id' => $prescricao->id, 'medicamentos' => $prescricao->itens() ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL)) ->get() ->map(function ($item) { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; } $data = [ 'checked' => false, 'id' => $item->id, 'is_manual' => false, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, 'recomendacoes' => $item->recomendacoes, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } return $data; }), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $prescricao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $prescricao->created_at->format('d/m/Y \à\s H:i'), ]); } private static function getLaudoMedicamentos($atendimento) { return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q->whereNotIn('receita_tipo_id', [TipoReceita::COMUM])) ) ->get() ->map(fn ($prescricao) => [ 'collapse' => true, 'id' => $prescricao->id, 'medicamentos' => $prescricao->itens() ->whereHas('material', fn ($q) => $q->whereNotIn('receita_tipo_id', [TipoReceita::COMUM])) ->get() ->map(function ($item) { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; } $data = [ 'checked' => false, 'id' => $item->id, 'is_manual' => false, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, 'recomendacoes' => $item->recomendacoes, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } return $data; }), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $prescricao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $prescricao->created_at->format('d/m/Y \à\s H:i'), ]); } private static function requiredFieldAtendimento($atendimento) { foreach ($atendimento->soaps()->where('is_rascunho', false)->get() as $soap) { $peso = DB::table('ambulatorio_atendimento_antropometria') ->where('soap_id', $soap->id) ->value('peso'); $altura = DB::table('ambulatorio_atendimento_antropometria') ->where('soap_id', $soap->id) ->value('altura'); $diagnostico = $soap->avaliacao_descricao ? trim(preg_replace('/\s+/', ' ', strip_tags($soap->avaliacao_descricao))) : null; $cid = collect(self::getAtendimentoProblemasCondicoes($soap))->first(); if ($peso && $altura && $diagnostico && $cid) { return true; } } return false; } private static function requiredFieldPaciente($atendimento) { $paciente = $atendimento->paciente; $cidadao = $paciente->cidadao; $cns = $cidadao->cns ?? null; $cpf = $cidadao->cpf ?? null; $nomeMae = $cidadao->nome_mae ?? null; $racaCorId = $cidadao->raca_cor_id ?? null; $telefoneNumero = $cidadao->telefone_principal->numero ?? null; $email = $paciente->email ?? null; $nacionalidadeId = $cidadao->nacionalidade_id ?? null; $etniaIndigena = $cidadao->etniaIndigena->descricao ?? null; if ((!$cns && !$cpf) || !$nomeMae || !$racaCorId || !$telefoneNumero || ($racaCorId === RacaCor::INDIGENA && $nacionalidadeId === Nacionalidade::BRASILEIRO && !$etniaIndigena)) { return false; } return true; } private static function getAtendimentoProblemasCondicoes($soap) { $problemasCondicoes = $soap->problemasCondicoes() ->with([ 'cid:id,codigo,nome', ]) ->first([ 'cid_id', ]); return $problemasCondicoes['cid']['codigo'] ?? null; } private static function getSolicitacoesFichaSadt($atendimento) { $solicitacoesExames = collect(); DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item AS solicitacao_exame_item') ->join('parametrizacao_exame AS exame', 'exame.id', 'solicitacao_exame_item.exame_id') ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'exame.codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->join( 'ambulatorio_atendimento_soap_solicitacao_exame AS solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.solicitacao_exame_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_exame.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_exame.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_exame.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_exame.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_exame.ciap_id') ->where('exame.tipo_id', TipoExame::IMAGEM) ->whereIn('procedimento.complexidade', [Complexidade::ATENCAO_BASICA,Complexidade::MEDIA_COMPLEXIDADE]) ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->whereNotIn('sigtap.procedimento.codigo', [Procedimento::MAMOGRAFIA, Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO]) ->select( 'solicitacao_exame.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_exame.id AS solicitacao_exame_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_exame.justificativa', 'solicitacao_exame.observacao', 'solicitacao_exame_item.id AS solicitacao_exame_item_id', 'exame.codigo AS exame_codigo', 'exame.nome AS exame_nome', ) ->get() ->each(function ($item) use ($solicitacoesExames) { $solicitacao = $solicitacoesExames->where('id', $item->solicitacao_exame_id)->first(); if (is_null($solicitacao)) { $solicitacao = (object) [ 'origem' => 'exame', 'collapse' => true, 'id' => $item->solicitacao_exame_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'setor_nome' => $item->setor_nome, 'usuario_nome' => $item->usuario_nome, 'ocupacao_descricao' => "{$item->ocupacao_codigo} - {$item->ocupacao_nome}", 'cid_descricao' => is_null($item->cid_codigo) ? null : "{$item->cid_codigo} - {$item->cid_nome}", 'ciap_descricao' => is_null($item->ciap_codigo) ? null : "{$item->ciap_codigo} - {$item->ciap_descricao}", 'justificativa' => $item->justificativa, 'observacao' => $item->observacao, 'itens' => collect(), ]; $solicitacoesExames->push($solicitacao); } $solicitacao->itens->push((object) [ 'checked' => false, 'id' => $item->solicitacao_exame_item_id, 'exame_descricao' => $item->exame_codigo ? MaskUtil::getProcedimentoMasked($item->exame_codigo) . " - {$item->exame_nome}" : $item->exame_nome, ]); }); $solicitacoesProcedimentosCirurgicos = collect(); DB::table('ambulatorio_atendimento_soap_solicitacao_proc_cirurgico_item AS solicitacao_proc_cirurgico_item') ->join( 'parametrizacao_procedimento_cirurgico AS procedimento_cirurgico', 'procedimento_cirurgico.id', 'solicitacao_proc_cirurgico_item.procedimento_cirurgico_id' ) ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'procedimento_cirurgico.procedimento_codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->join( 'ambulatorio_atendimento_soap_solicitacao_proc_cirurgico AS solicitacao_proc_cirurgico', 'solicitacao_proc_cirurgico.id', 'solicitacao_proc_cirurgico_item.solicitacao_proc_cirurgico_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_proc_cirurgico.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_proc_cirurgico.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_proc_cirurgico.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_proc_cirurgico.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_proc_cirurgico.ciap_id') ->where('procedimento.complexidade', Complexidade::MEDIA_COMPLEXIDADE) ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( 'solicitacao_proc_cirurgico.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_proc_cirurgico.id AS solicitacao_proc_cirurgico_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_proc_cirurgico.justificativa', 'solicitacao_proc_cirurgico.observacao', 'solicitacao_proc_cirurgico_item.id AS solicitacao_proc_cirurgico_item_id', 'procedimento_cirurgico.procedimento_codigo AS procedimento_cirurgico_codigo', 'procedimento_cirurgico.nome AS procedimento_cirurgico_nome', ) ->get() ->each(function ($item) use ($solicitacoesProcedimentosCirurgicos) { $solicitacao = $solicitacoesProcedimentosCirurgicos->where('id', $item->solicitacao_proc_cirurgico_id)->first(); if (is_null($solicitacao)) { $solicitacao = (object) [ 'origem' => 'procedimento_cirurgico', 'collapse' => true, 'id' => $item->solicitacao_proc_cirurgico_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'setor_nome' => $item->setor_nome, 'usuario_nome' => $item->usuario_nome, 'ocupacao_descricao' => "{$item->ocupacao_codigo} - {$item->ocupacao_nome}", 'cid_descricao' => is_null($item->cid_codigo) ? null : "{$item->cid_codigo} - {$item->cid_nome}", 'ciap_descricao' => is_null($item->ciap_codigo) ? null : "{$item->ciap_codigo} - {$item->ciap_descricao}", 'justificativa' => $item->justificativa, 'observacao' => $item->observacao, 'itens' => collect(), ]; $solicitacoesProcedimentosCirurgicos->push($solicitacao); } $solicitacao->itens->push((object) [ 'checked' => false, 'id' => $item->solicitacao_proc_cirurgico_item_id, 'procedimento_cirurgico_descricao' => MaskUtil::getProcedimentoMasked($item->procedimento_cirurgico_codigo) . " - {$item->procedimento_cirurgico_nome}", ]); }); return $solicitacoesExames->concat($solicitacoesProcedimentosCirurgicos); } private static function getSolicitacoesFichaSadat($atendimento) { $solicitacoes = collect(); DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item AS solicitacao_exame_item') ->join('parametrizacao_exame AS exame', 'exame.id', 'solicitacao_exame_item.exame_id') ->join( 'ambulatorio_atendimento_soap_solicitacao_exame AS solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.solicitacao_exame_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_exame.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_exame.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_exame.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_exame.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_exame.ciap_id') ->where('exame.tipo_id', TipoExame::LABORATORIAL) ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( DB::raw("'padrao' AS tipo_solicitacao"), 'solicitacao_exame.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_exame.id AS solicitacao_exame_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_exame.justificativa', 'solicitacao_exame.observacao', 'solicitacao_exame_item.id AS solicitacao_exame_item_id', 'exame.id AS exame_id', 'exame.codigo AS exame_codigo', 'exame.nome AS exame_nome', ) ->unionAll(DB::table('ambulatorio_atendimento_soap_exame_solicitado_item AS solicitacao_exame_item') ->join( 'atencao_basica_cadastro_exame_solicitado_avaliado AS exame', 'exame.id', 'solicitacao_exame_item.exame_solicitado_avaliado_id' ) ->join( 'ambulatorio_atendimento_soap_exame_solicitado AS solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.soap_exame_solicitado_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_exame.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_exame.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_exame.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_exame.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_exame.ciap_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( DB::raw("'predefinido' AS tipo_solicitacao"), 'solicitacao_exame.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_exame.id AS solicitacao_exame_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_exame.justificativa', 'solicitacao_exame.observacao', DB::raw("NULL AS solicitacao_exame_item_id"), 'exame.id AS exame_id', 'exame.codigo_procedimento AS exame_codigo', 'exame.descricao AS exame_nome', ) ) ->unionAll(DB::table('ambulatorio_atendimento_soap_triagem_neonatal_solicitado_item AS solicitacao_exame_item') ->join( 'atencao_basica_cadastro_triagem_neonatal AS exame', 'exame.id', 'solicitacao_exame_item.triagem_neonatal_id' ) ->join( 'ambulatorio_atendimento_soap_triagem_neonatal_solicitado AS solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.soap_triagem_neonatal_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_exame.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_exame.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_exame.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_exame.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_exame.ciap_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( DB::raw("'triagem_neonatal' AS tipo_solicitacao"), 'solicitacao_exame.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_exame.id AS solicitacao_exame_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_exame.justificativa', 'solicitacao_exame.observacao', DB::raw("NULL AS solicitacao_exame_item_id"), 'exame.id AS exame_id', 'exame.codigo_procedimento AS exame_codigo', 'exame.descricao AS exame_nome', ) ) ->get() ->each(function ($item) use ($solicitacoes) { $solicitacao = $solicitacoes ->where('tipo_solicitacao', $item->tipo_solicitacao) ->where('id', $item->solicitacao_exame_id) ->first(); if (is_null($solicitacao)) { $solicitacao = (object) [ 'collapse' => true, 'tipo_solicitacao' => $item->tipo_solicitacao, 'id' => $item->solicitacao_exame_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'setor_nome' => $item->setor_nome, 'usuario_nome' => $item->usuario_nome, 'ocupacao_descricao' => "{$item->ocupacao_codigo} - {$item->ocupacao_nome}", 'cid_descricao' => is_null($item->cid_codigo) ? null : "{$item->cid_codigo} - {$item->cid_nome}", 'ciap_descricao' => is_null($item->ciap_codigo) ? null : "{$item->ciap_codigo} - {$item->ciap_descricao}", 'justificativa' => $item->justificativa, 'observacao' => $item->observacao, 'itens' => collect(), ]; $solicitacoes->push($solicitacao); } $solicitacao->itens->push((object) [ 'checked' => false, 'tipo_solicitacao' => $item->tipo_solicitacao, 'id' => $item->solicitacao_exame_item_id, 'solicitacao_id' => $item->solicitacao_exame_id, 'exame_id' => $item->exame_id, 'exame_descricao' => $item->exame_codigo ? MaskUtil::getProcedimentoMasked($item->exame_codigo) . " - {$item->exame_nome}" : $item->exame_nome, ]); }); return $solicitacoes; } private static function hasSolicitacaoExameCitopatologicoColoUtero($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('solicitacoesExames.itens.exame', fn ($q) => $q ->whereIn('codigo', [ Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO, Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA, Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO, ]) )->exists(); } public function hasAssinado($id, $fileName) { $path = 'assinatura-eletronica' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . 'ambulatorio' . DIRECTORY_SEPARATOR . 'atendimento'; $arquivo = "{$fileName}-{$id}.PDF"; $filePath = $path . DIRECTORY_SEPARATOR . $arquivo; if (Storage::disk('local')->exists($filePath)) { return true; } return false; } private static function hasSolicitacaoExameCitopatologicoMama($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('solicitacoesExames.itens.exame', fn ($q) => $q ->whereIn('codigo', [ Procedimento::EXAME_CITOPATOLOGICO_DE_MAMA ]) )->exists(); } private static function hasRequisicaoMamografia($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('solicitacoesExames.itens.exame', fn ($q) => $q ->whereIn('codigo', [ Procedimento::MAMOGRAFIA, Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO, ]) )->exists(); } private static function hasSolicitacaoExameHistopatologicoMamografia($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('solicitacoesExames.itens.exame', fn ($q) => $q ->whereIn('codigo', [ Procedimento::EXAME_ANATOMOPATOLOGICO_DE_MAMA_BIOPSIA, Procedimento::EXAME_ANATOMOPATOLOGICO_DE_MAMA_PECA_CIRURGICA, ]) )->exists(); } private static function getSolicitacoesApac($atendimento) { $solicitacoesExames = collect(); DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item AS solicitacao_exame_item') ->join('parametrizacao_exame AS exame', 'exame.id', 'solicitacao_exame_item.exame_id') ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'exame.codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->join( 'ambulatorio_atendimento_soap_solicitacao_exame AS solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.solicitacao_exame_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_exame.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_exame.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_exame.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_exame.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_exame.ciap_id') ->where('procedimento.complexidade', Complexidade::ALTA_COMPLEXIDADE) ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( 'solicitacao_exame.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_exame.id AS solicitacao_exame_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_exame.justificativa', 'solicitacao_exame.observacao', 'solicitacao_exame_item.id AS solicitacao_exame_item_id', 'exame.codigo AS exame_codigo', 'exame.nome AS exame_nome', ) ->get() ->each(function ($item) use ($solicitacoesExames) { $solicitacao = $solicitacoesExames->where('id', $item->solicitacao_exame_id)->first(); if (is_null($solicitacao)) { $solicitacao = (object) [ 'origem' => 'exame', 'collapse' => true, 'id' => $item->solicitacao_exame_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'setor_nome' => $item->setor_nome, 'usuario_nome' => $item->usuario_nome, 'ocupacao_descricao' => "{$item->ocupacao_codigo} - {$item->ocupacao_nome}", 'cid_descricao' => is_null($item->cid_codigo) ? null : "{$item->cid_codigo} - {$item->cid_nome}", 'ciap_descricao' => is_null($item->ciap_codigo) ? null : "{$item->ciap_codigo} - {$item->ciap_descricao}", 'justificativa' => $item->justificativa, 'observacao' => $item->observacao, 'itens' => collect(), ]; $solicitacoesExames->push($solicitacao); } $solicitacao->itens->push((object) [ 'checked' => false, 'id' => $item->solicitacao_exame_item_id, 'exame_descricao' => $item->exame_codigo ? MaskUtil::getProcedimentoMasked($item->exame_codigo) . " - {$item->exame_nome}" : $item->exame_nome, ]); }); $solicitacoesProcedimentosCirurgicos = collect(); DB::table('ambulatorio_atendimento_soap_solicitacao_proc_cirurgico_item AS solicitacao_proc_cirurgico_item') ->join( 'parametrizacao_procedimento_cirurgico AS procedimento_cirurgico', 'procedimento_cirurgico.id', 'solicitacao_proc_cirurgico_item.procedimento_cirurgico_id' ) ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'procedimento_cirurgico.procedimento_codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->join( 'ambulatorio_atendimento_soap_solicitacao_proc_cirurgico AS solicitacao_proc_cirurgico', 'solicitacao_proc_cirurgico.id', 'solicitacao_proc_cirurgico_item.solicitacao_proc_cirurgico_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'solicitacao_proc_cirurgico.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'solicitacao_proc_cirurgico.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'solicitacao_proc_cirurgico.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'solicitacao_proc_cirurgico.cid_id') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'solicitacao_proc_cirurgico.ciap_id') ->where('procedimento.complexidade', Complexidade::ALTA_COMPLEXIDADE) ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select( 'solicitacao_proc_cirurgico.created_at AS data_hora', 'setor.nome AS setor_nome', 'usuario_cidadao.nome AS usuario_nome', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'solicitacao_proc_cirurgico.id AS solicitacao_proc_cirurgico_id', 'cid.codigo AS cid_codigo', 'cid.nome AS cid_nome', 'ciap.codigo AS ciap_codigo', 'ciap.descricao AS ciap_descricao', 'solicitacao_proc_cirurgico.justificativa', 'solicitacao_proc_cirurgico.observacao', 'solicitacao_proc_cirurgico_item.id AS solicitacao_proc_cirurgico_item_id', 'procedimento_cirurgico.procedimento_codigo AS procedimento_cirurgico_codigo', 'procedimento_cirurgico.nome AS procedimento_cirurgico_nome', ) ->get() ->each(function ($item) use ($solicitacoesProcedimentosCirurgicos) { $solicitacao = $solicitacoesProcedimentosCirurgicos->where('id', $item->solicitacao_proc_cirurgico_id)->first(); if (is_null($solicitacao)) { $solicitacao = (object) [ 'origem' => 'procedimento_cirurgico', 'collapse' => true, 'id' => $item->solicitacao_proc_cirurgico_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'setor_nome' => $item->setor_nome, 'usuario_nome' => $item->usuario_nome, 'ocupacao_descricao' => "{$item->ocupacao_codigo} - {$item->ocupacao_nome}", 'cid_descricao' => is_null($item->cid_codigo) ? null : "{$item->cid_codigo} - {$item->cid_nome}", 'ciap_descricao' => is_null($item->ciap_codigo) ? null : "{$item->ciap_codigo} - {$item->ciap_descricao}", 'justificativa' => $item->justificativa, 'observacao' => $item->observacao, 'itens' => collect(), ]; $solicitacoesProcedimentosCirurgicos->push($solicitacao); } $solicitacao->itens->push((object) [ 'checked' => false, 'id' => $item->solicitacao_proc_cirurgico_item_id, 'procedimento_cirurgico_descricao' => MaskUtil::getProcedimentoMasked($item->procedimento_cirurgico_codigo) . " - {$item->procedimento_cirurgico_nome}", ]); }); return $solicitacoesExames->concat($solicitacoesProcedimentosCirurgicos); } private static function getReceitasMedicasEspeciaisAzuis($atendimento) { return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL_AZUL)) ) ->get() ->map(fn ($prescricao) => [ 'collapse' => true, 'id' => $prescricao->id, 'medicamentos' => $prescricao->itens() ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL_AZUL)) ->get() ->map(function ($item) { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; } $data = [ 'checked' => false, 'id' => $item->id, 'is_manual' => false, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, 'recomendacoes' => $item->recomendacoes, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } return $data; }), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $prescricao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $prescricao->created_at->format('d/m/Y \à\s H:i'), ]); } private static function getReceitasMedicasEspeciaisAmarelas($atendimento) { return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL_AMARELA)) ) ->get() ->map(fn ($prescricao) => [ 'collapse' => true, 'id' => $prescricao->id, 'medicamentos' => $prescricao->itens() ->whereHas('material', fn ($q) => $q->where('receita_tipo_id', TipoReceita::ESPECIAL_AMARELA)) ->get() ->map(function ($item) { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; } $data = [ 'checked' => false, 'id' => $item->id, 'is_manual' => false, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, 'recomendacoes' => $item->recomendacoes, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } return $data; }), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $prescricao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $prescricao->created_at->format('d/m/Y \à\s H:i'), ]); } private static function hasDeclaracaoComparecimento($atendimento) { return $atendimento->declaracoesComparecimento() ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->exists(); } private static function hasAtestado($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('atestados')->exists(); } private static function getReceitasMedicasNaoPadronizadasComuns($atendimento) { $receitas = collect(); DB::table('ambulatorio_atendimento_soap_prescricao_medicamento_item AS prescricao_medicamento_item') ->join( 'ambulatorio_atendimento_soap_prescricao_medicamento AS prescricao_medicamento', 'prescricao_medicamento.id', 'prescricao_medicamento_item.prescricao_medicamento_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'prescricao_medicamento.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'prescricao_medicamento.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'prescricao_medicamento.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->whereNull('prescricao_medicamento_item.material_id') ->where(fn ($q) => $q ->whereNull('prescricao_medicamento_item.receita_tipo_id') ->orWhere('prescricao_medicamento_item.receita_tipo_id', TipoReceita::COMUM) ) ->select( 'prescricao_medicamento_item.id AS prescricao_medicamento_item_id', 'prescricao_medicamento.id AS prescricao_medicamento_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'usuario_cidadao.nome AS usuario_nome', 'setor.nome AS setor_nome', 'prescricao_medicamento.created_at AS data_hora', 'prescricao_medicamento_item.descricao', 'prescricao_medicamento_item.justificativa', 'prescricao_medicamento_item.receita_tipo_id', 'prescricao_medicamento_item.recomendacoes' ) ->get() ->map(function ($item) use ($receitas) { $receita = $receitas->where('id', $item->prescricao_medicamento_id)->first(); if (is_null($receita)) { $receita = (object) [ 'collapse' => true, 'id' => $item->prescricao_medicamento_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $item->ocupacao_codigo, 'nome' => $item->ocupacao_nome, ], 'profissional' => [ 'nome' => $item->usuario_nome, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $item->setor_nome, ], ], 'medicamentos' => collect(), ]; $receitas->push($receita); } $receita->medicamentos->push((object) [ 'checked' => false, 'id' => $item->prescricao_medicamento_item_id, 'is_manual' => true, 'descricao' => $item->descricao, 'justificativa' => $item->justificativa, 'recomendacoes' => $item->recomendacoes, ]); }); return $receitas; } private static function getReceitasMedicasNaoPadronizadasEspeciais($atendimento) { $receitas = collect(); DB::table('ambulatorio_atendimento_soap_prescricao_medicamento_item AS prescricao_medicamento_item') ->join( 'ambulatorio_atendimento_soap_prescricao_medicamento AS prescricao_medicamento', 'prescricao_medicamento.id', 'prescricao_medicamento_item.prescricao_medicamento_id' ) ->join('ambulatorio_atendimento_soap AS soap', 'soap.id', 'prescricao_medicamento.soap_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.id', 'prescricao_medicamento.created_lotacao_id') ->join('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id') ->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'prescricao_medicamento.created_centro_custo_id') ->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->whereNull('prescricao_medicamento_item.material_id') ->where(fn ($q) => $q ->whereNull('prescricao_medicamento_item.receita_tipo_id') ->orWhere('prescricao_medicamento_item.receita_tipo_id', TipoReceita::ESPECIAL) ) ->select( 'prescricao_medicamento_item.id AS prescricao_medicamento_item_id', 'prescricao_medicamento.id AS prescricao_medicamento_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'usuario_cidadao.nome AS usuario_nome', 'setor.nome AS setor_nome', 'prescricao_medicamento.created_at AS data_hora', 'prescricao_medicamento_item.descricao', 'prescricao_medicamento_item.justificativa', 'prescricao_medicamento_item.receita_tipo_id', 'prescricao_medicamento_item.recomendacoes' ) ->get() ->map(function ($item) use ($receitas) { $receita = $receitas->where('id', $item->prescricao_medicamento_id)->first(); if (is_null($receita)) { $receita = (object) [ 'collapse' => true, 'id' => $item->prescricao_medicamento_id, 'data_hora' => Carbon::create($item->data_hora)->format('d/m/Y \à\s H:i'), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $item->ocupacao_codigo, 'nome' => $item->ocupacao_nome, ], 'profissional' => [ 'nome' => $item->usuario_nome, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $item->setor_nome, ], ], 'medicamentos' => collect(), ]; $receitas->push($receita); } $receita->medicamentos->push((object) [ 'checked' => false, 'id' => $item->prescricao_medicamento_item_id, 'is_manual' => true, 'descricao' => $item->descricao, 'justificativa' => $item->justificativa, 'recomendacoes' => $item->recomendacoes, ]); }); return $receitas; } private static function hasOrientacao($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('orientacoes')->exists(); } private static function hasEncaminhamento($atendimento) { return $atendimento->soaps() ->where('is_rascunho', false) ->whereHas('encaminhamentos', function($query){ $query->where('tipo_id', '!=', Encaminhamento::ENCAMINHAMENTO_PARA_INTERNACAO_HOSPITALAR); }) ->exists(); } private static function hasEncaminhamentoHospitalar($atendimento){ return $atendimento->soaps() ->where('is_rascunho', false) ->whereHas('encaminhamentos', function($query){ $query->where('tipo_id', Encaminhamento::ENCAMINHAMENTO_PARA_INTERNACAO_HOSPITALAR); }) ->exists(); } private static function hasFichaNotificacaoSinan($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('casosSuspeitos')->exists(); } private static function hasPuericulturaQuestionarioMChatR($atendimento) { return $atendimento->soaps()->where('is_rascunho', false)->whereHas('puericulturaQuestionarioMChatR')->exists(); } }