Files
rkm-conectasus-ci-sandbox/api/app/Services/Ambulatorio/ImpressaoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

1747 lines
79 KiB
PHP

<?php
namespace App\Services\Ambulatorio;
use App\Enums\Ambulatorio\ImpressaoAssinaturaEletronica;
use App\Enums\AtencaoBasica\AtendimentoIndividual\Encaminhamento;
use App\Enums\Cadastro\Medicamento\TipoReceita;
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Parametrizacao\Exame\Tipo as TipoExame;
use App\Enums\Sigtap\Complexidade;
use App\Enums\Sigtap\Procedimento;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\AtendimentoSoapPrescricaoMedicamento;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class ImpressaoService extends Service
{
public static function list()
{
$impressoes = collect();
if (request()->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();
}
}