Files
rkm-conectasus-ci-sandbox/api/app/Services/Ambulatorio/AtendimentoHistoricoService.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

2435 lines
101 KiB
PHP

<?php
namespace App\Services\Ambulatorio;
use App\Enums\Ambulatorio\ArcadaDentaria;
use App\Enums\Ambulatorio\Desfecho;
use App\Enums\Ambulatorio\SigiloTipo;
use App\Enums\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Enums\Cadastro\UnidadeMedida;
use App\Enums\Sigtap\Cid as SigtapCid;
use App\Models\Ambulatorio\AtendimentoPosConsulta;
use App\Models\Ambulatorio\AtendimentoPreAtendimento;
use App\Models\Ambulatorio\AtendimentoSoap;
use App\Models\Ambulatorio\AtendimentoSoapExameSolicitado;
use App\Models\Ambulatorio\AtendimentoSoapProblemaCondicao;
use App\Models\Ambulatorio\AtendimentoSoapProcedimentoEmad;
use App\Models\Ambulatorio\AtendimentoSoapTriagemNeonatalSolicitado;
use App\Models\Ambulatorio\AtendimentoSoapFerida;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\Dente;
use App\Models\Ambulatorio\ParametrizacaoSigilo;
use App\Models\Ambulatorio\PuericulturaAlteracaoFenotipica;
use App\Models\Ambulatorio\PuericulturaFatorRisco;
use App\Models\Ambulatorio\PuericulturaMarcoDesenvolvimento;
use App\Models\Ambulatorio\PuericulturaQuestionarioMChatR;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
use App\Models\Integracao\Erpsaude\Atendimento as AtendimentoErpsaude;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Procedimento;
use App\Services\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarService;
use App\Services\Geral\AgeService;
use App\Services\Geral\ImcService;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class AtendimentoHistoricoService extends Service
{
public static function getHistoricoResumido($filters, $options = [])
{
$lotacaoLogada = self::getCurrentLotacao();
$atendimentos = collect();
self::getPreAtendimentos($filters['paciente_id'])
->concat(self::getAtendimentosSoap($filters['paciente_id']))
->concat(self::getPosConsultas($filters['paciente_id']))
->sortByDesc('data_hora')
->each(function ($atendimento) use ($options, $lotacaoLogada, $atendimentos) {
$atendimento->com_sigilo = false;
if (!isset($options['format_date_time']) || $options['format_date_time']) {
$atendimento->data_hora = $atendimento->data_hora->format('d/m/Y \à\s H:i');
}
$parametrizacaoSigilo = ParametrizacaoSigilo::where('ocupacao_id', $atendimento->lotacao['ocupacao']['id'])
->get();
if (sizeof($parametrizacaoSigilo) > 0) {
if ($parametrizacaoSigilo->contains('infraestrutura_id', $atendimento->centro_custo['infraestrutura']['id'])) {
$parametrizacaoSigilo = $parametrizacaoSigilo->where('infraestrutura_id', $atendimento->centro_custo['infraestrutura']['id'])->first();
} else {
$parametrizacaoSigilo = $parametrizacaoSigilo->whereNull('infraestrutura_id')->first();
}
if (!is_null($parametrizacaoSigilo)) {
$permiteVisualizar =
$parametrizacaoSigilo->infraestruturas()->where('infraestrutura_id', $lotacaoLogada->infraestrutura_id)->exists() ||
$parametrizacaoSigilo->ocupacoes()->where('ocupacao_id', $lotacaoLogada->ocupacao_id)->exists();
if (!$permiteVisualizar) {
if ($parametrizacaoSigilo->sigilo_tipo_id === SigiloTipo::SIGILO_COMPLETO) {
return true;
}
$atendimento->com_sigilo = true;
}
}
}
$atendimentos->push($atendimento);
});
return $atendimentos;
}
public static function getHistoricoErpsaudeResumido($paciente)
{
$cpf = $paciente->cidadao->cpf ?? null;
$cns = $paciente->cidadao->cns ?? null;
$nome = $paciente->cidadao->nome ?? null;
$dataNascimento = $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('Y-m-d') : null;
if (empty($cns) && (empty($nome) || empty($dataNascimento))) {
return [];
}
$queryBase = DB::table('integracao_erpsaude_atendimento')
->select([
'integracao_erpsaude_atendimento.id',
DB::raw("DATE_FORMAT(integracao_erpsaude_atendimento.data_atendimento, '%d/%m/%Y') as data_atendimento"),
DB::raw("DATE_FORMAT(integracao_erpsaude_atendimento.horario_atendimento, '%H:%i') as horario_atendimento"),
'integracao_erpsaude_atendimento.profissional',
'integracao_erpsaude_atendimento.unidade_atendimento',
])
->join('integracao_erpsaude_paciente', 'integracao_erpsaude_paciente.id', 'integracao_erpsaude_atendimento.paciente_id');
$result = collect();
if (!empty($cpf)) {
$result = (clone $queryBase)
->where('integracao_erpsaude_paciente.cpf', $cpf)
->orderByDesc('data')
->orderByDesc('hora')
->get();
}
if ($result->isEmpty() && !empty($cns)) {
$result = (clone $queryBase)
->where('integracao_erpsaude_paciente.cns', $cns)
->orderByDesc('data')
->orderByDesc('hora')
->get();
}
if ($result->isEmpty() && !empty($nome) && !empty($dataNascimento)) {
$result = (clone $queryBase)
->where('integracao_erpsaude_paciente.nome', $nome)
->whereDate('integracao_erpsaude_paciente.data_nascimento', $dataNascimento)
->orderByDesc('data')
->orderByDesc('hora')
->get();
}
return $result;
}
private static function getPreAtendimentos($pacienteId)
{
return DB::table('ambulatorio_atendimento_pre_atendimento')
->select([
'ambulatorio_atendimento_pre_atendimento.id',
'ambulatorio_atendimento_pre_atendimento.atendimento_id',
'ambulatorio_atendimento_pre_atendimento.created_at',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Agendada' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_pre_atendimento')
->select([
'ambulatorio_atendimento_pre_atendimento.id',
'ambulatorio_atendimento_pre_atendimento.atendimento_id',
'ambulatorio_atendimento_pre_atendimento.created_at',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Demanda espontânea' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
)
->get()
->map(function ($preAtendimento) {
$preAtendimento->created_at = Carbon::create($preAtendimento->created_at);
$preAtendimento->createdLotacao = (object) [
'ocupacao' => (object) [
'id' => $preAtendimento->ocupacao_id,
'codigo' => $preAtendimento->ocupacao_codigo,
'nome' => $preAtendimento->ocupacao_nome,
],
'usuario' => (object) [
'cidadao' => (object) [
'nome' => $preAtendimento->cidadao_nome,
],
],
];
$preAtendimento->createdCentroCusto = (object) [
'infraestrutura_id' => $preAtendimento->centro_custo_infraestrutura_id,
'setor' => (object) [
'nome' => $preAtendimento->setor_nome
],
'unidade' => (object) [
'nome_fantasia' => $preAtendimento->unidade_nome_fantasia
],
];
return (object) array_merge(self::getLogData($preAtendimento, 'pre-atendimento'), [
'id' => $preAtendimento->id,
'atendimento_id' => $preAtendimento->atendimento_id,
'is_atendimento_soap_assinado' => false,
]);
});
}
public static function getPreAtendimento($preAtendimentoId)
{
$preAtendimento = AtendimentoPreAtendimento::findOrFail($preAtendimentoId);
return array_merge(self::getLogData($preAtendimento, 'pre-atendimento'), [
'ciap' => self::getPreAtendimentoCiap($preAtendimento),
'motivo_atendimento' => $preAtendimento->motivo_atendimento,
'classificacao_risco' => self::getPreAtendimentoClassificacaoRisco($preAtendimento),
'antropometria' => self::getPreAtendimentoAntropometria($preAtendimento),
'sinal_vital' => self::getPreAtendimentoSinalVital($preAtendimento),
'glicemia_capilar' => self::getPreAtendimentoGlicemiaCapilar($preAtendimento),
'declaracao_comparecimento' => self::getPreAtendimentoDeclaracaoComparecimento($preAtendimento),
'procedimentos' => self::getPreAtendimentoProcedimentos($preAtendimento),
'medicamentos' => self::getPreAtendimentoMedicamentos($preAtendimento),
'desfecho' => self::getPreAtendimentoDesfecho($preAtendimento),
]);
}
private static function getPreAtendimentoCiap($preAtendimento)
{
return $preAtendimento->ciap()->first(['codigo', 'descricao']);
}
private static function getPreAtendimentoClassificacaoRisco($preAtendimento)
{
return $preAtendimento->classificacaoRisco()->first(['nome']);
}
private static function getPreAtendimentoAntropometria($preAtendimento)
{
$antropometria = $preAtendimento->antropometria()->first([
'peso',
'altura',
'perimetro_cefalico',
'circunferencia_abdominal',
'perimetro_panturrilha',
]);
if (!is_null($antropometria)) {
$antropometria->imc = !is_null($antropometria->peso) && !is_null($antropometria->altura)
? ImcService::calculate(
UnidadeMedida::QUILOGRAMAS,
$antropometria->peso,
UnidadeMedida::CENTIMETROS,
$antropometria->altura
)
: null;
}
return $antropometria;
}
private static function getPreAtendimentoSinalVital($preAtendimento)
{
return $preAtendimento->sinalVital()->first([
'pressao_arterial',
'frequencia_respiratoria',
'frequencia_cardiaca',
'temperatura',
'saturacao_o2',
]);
}
private static function getPreAtendimentoGlicemiaCapilar($preAtendimento)
{
$glicemiaCapilar = $preAtendimento->glicemiaCapilar()
->with('momentoColeta:id,nome')
->first(['momento_coleta_id', 'valor']);
if (!is_null($glicemiaCapilar)) {
$glicemiaCapilar->makeHidden('momento_coleta_id');
$glicemiaCapilar->momentoColeta->makeHidden('id');
}
return $glicemiaCapilar;
}
private static function getPreAtendimentoDeclaracaoComparecimento($preAtendimento)
{
$declaracaoComparecimento = $preAtendimento->declaracaoComparecimento()
->with('turno:id,nome')
->first([
'nome_acompanhante',
'motivo_comparecimento',
'turno_id',
'entrada',
'saida',
]);
if (!is_null($declaracaoComparecimento)) {
$declaracaoComparecimento->makeHidden('turno_id');
if (!is_null($declaracaoComparecimento->turno)) {
$declaracaoComparecimento->turno->makeHidden('id');
}
}
return $declaracaoComparecimento;
}
private static function getPreAtendimentoProcedimentos($preAtendimento)
{
$procedimentos = $preAtendimento->procedimentos()
->get([
'procedimento_id',
'quantidade',
'automatico',
'local_curativo',
'saida_item_id',
]);
$procedimentos->each(function ($procedimento) {
$almoxarifadoSaidaItem = $procedimento->almoxarifadoSaidaItem;
$procedimento->procedimento = self::getProcedimento($procedimento->procedimento_id);
$procedimento->makeHidden('procedimento_id');
$procedimento->material_descricao_completa = $almoxarifadoSaidaItem->material->descricaoCompleta ?? null;
$procedimento->material_quantidade = $almoxarifadoSaidaItem->quantidade ?? null;
});
return $procedimentos;
}
private static function getPreAtendimentoMedicamentos($preAtendimento)
{
$medicamentos = $preAtendimento->medicamentos()
->get([
'saida_item_id',
]);
$medicamentos->each(function ($medicamento) {
$almoxarifadoSaidaItem = $medicamento->almoxarifadoSaidaItem;
$medicamento->descricao_completa = $almoxarifadoSaidaItem->material->descricaoCompleta ?? null;
$medicamento->quantidade = $almoxarifadoSaidaItem->quantidade ?? null;
});
return $medicamentos;
}
private static function getPreAtendimentoDesfecho($preAtendimento)
{
return $preAtendimento->paciente_liberado
? Desfecho::PACIENTE_LIBERADO
: ($preAtendimento->paciente_mantido_fila ? Desfecho::MANTER_NA_FILA : Desfecho::PACIENTE_ENCAMINHADO);
}
private static function getAtendimentosSoap($pacienteId)
{
return DB::table('ambulatorio_atendimento_soap')
->select([
'ambulatorio_atendimento_soap.id',
'ambulatorio_atendimento_soap.atendimento_id',
'jornada.data',
'ambulatorio_atendimento_soap.is_atendimento_enfermagem',
'ambulatorio_atendimento_soap.is_atendimento_soap_assinado',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Agendada' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada as jornada', 'jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', function ($join) {
$join->whereRaw("
(
(ambulatorio_atendimento_soap.is_atendimento_enfermagem = true
AND cadastro_lotacao.id = ambulatorio_atendimento_soap.created_lotacao_id)
OR
(ambulatorio_atendimento_soap.is_atendimento_enfermagem = false
AND cadastro_lotacao.id = jornada.lotacao_id)
)
");
})
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_soap')
->select([
'ambulatorio_atendimento_soap.id',
'ambulatorio_atendimento_soap.atendimento_id',
'ambulatorio_demanda_espontanea.data',
'ambulatorio_atendimento_soap.is_atendimento_enfermagem',
'ambulatorio_atendimento_soap.is_atendimento_soap_assinado',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Demanda espontânea' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_soap.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
)
->get()
->map(function ($soap) {
$soap->created_at = Carbon::create($soap->data);
$soap->createdLotacao = (object) [
'ocupacao' => (object) [
'id' => $soap->ocupacao_id,
'codigo' => $soap->ocupacao_codigo,
'nome' => $soap->ocupacao_nome,
],
'usuario' => (object) [
'cidadao' => (object) [
'nome' => $soap->cidadao_nome,
],
],
];
$soap->createdCentroCusto = (object) [
'infraestrutura_id' => $soap->centro_custo_infraestrutura_id,
'setor' => (object) [
'nome' => $soap->setor_nome
],
'unidade' => (object) [
'nome_fantasia' => $soap->unidade_nome_fantasia
],
];
$soap->tipo_atendimento = $soap->tipo_atendimento;
return (object) array_merge(self::getLogData($soap, 'atendimento'), [
'id' => $soap->id,
'atendimento_id' => $soap->atendimento_id,
'is_atendimento_enfermagem' => (bool) $soap->is_atendimento_enfermagem,
'is_atendimento_soap_assinado' => (bool) $soap->is_atendimento_soap_assinado,
]);
});
}
public static function getAtendimentoSoap($soapId)
{
$soap = AtendimentoSoap::findOrFail($soapId);
$idadeAnos = null;
if ($soap->atendimento->paciente->cidadao->data_nascimento) {
$idadeAnos = AgeService::getAge(
(new Carbon($soap->atendimento->paciente->cidadao->data_nascimento)),
$soap->created_at->toDateTime()
)->years;
}
return array_merge(self::getLogData($soap, 'atendimento'), [
'tempo_atendimento_unidade' => self::getTempoAtendimentoUnidade($soap),
'tempo_atendimento' => $soap->tempo_atendimento,
'sexo_id' => $soap->atendimento->paciente->cidadao->sexo_id,
'is_atendimento_saude_bucal' => $soap->is_atendimento_saude_bucal,
'is_atendimento_pre_natal' => $soap->is_atendimento_pre_natal,
'is_atendimento_puericultura' => $soap->is_atendimento_puericultura,
'is_atendimento_idoso' => $soap->is_atendimento_idoso,
'antecedente' => self::getAtendimentoAntecedente($soap),
'subjetivo' => [
'descricao' => $soap->subjetivo_descricao,
'motivos' => self::getAtendimentoMotivos($soap),
],
'objetivo' => [
'descricao' => $soap->objetivo_descricao,
'dum' => $soap->dum ? $soap->dum->format('d/m/Y') : null,
'antropometria' => self::getAtendimentoObjetivoAntropometria($soap),
'sinal_vital' => self::getAtendimentoObjetivoSinalVital($soap),
'glicemia_capilar' => self::getAtendimentoObjetivoGlicemiaCapilar($soap),
'tria' => self::getAtendimentoObjetivoTria($soap),
'marcador_consumo_alimentar' => self::getAtendimentoMarcadorConsumoAlimentar($soap),
'vacinacao_em_dia' => $soap->vacinacao_em_dia,
'paciente_com_necessidade_especial' => $soap->paciente_com_necessidade_especial,
'resultados_exames' => self::getAtendimentoResultadosExames($soap),
'exames_avaliados' =>self::getAtendimentoExamesAvaliados($soap->atendimento),
'triagens_neonatal' => self::getAtendimentoTriagensNeoNatal($soap->atendimento),
],
'avaliacao' => [
'descricao' => $soap->avaliacao_descricao,
'condicoes_avaliadas' => $soap->condicoesAvaliadas->pluck('descricao'),
'doencas_transmissiveis' => $soap->doencasTransmissiveis->pluck('descricao'),
'rastreamentos' => $soap->rastreamentos->pluck('descricao'),
'problemas_condicoes' => self::getAtendimentoProblemasCondicoes($soap),
'condicoes_emad' => self::getAtendimentoCondicoesEmad($soap),
],
'plano' => [
'descricao' => $soap->plano_descricao,
'intervencoes' => self::getAtendimentoIntervencoes($soap),
'procedimentos_clinicos' => self::getAtendimentoProcedimentosClinicos($soap),
'procedimentos_emad' => self::getAtendimentoProcedimentosEmad($soap),
'prescricoes_medicamentos' => self::getAtendimentoPrescricoesMedicamentos($soap),
'solicitacoes_exames_comuns' => self::getAtendimentoSolicitacoesExamesComuns($soap),
'exames_solicitados' =>self::getAtendimentoExamesSolicitados($soap),
'triagens_neonatal_solicitados' =>self::getAtendimentoTriagensNeonatalSolicitados($soap),
'solicitacoes_exames_alto_custo' => self::getAtendimentoSolicitacoesExamesAltoCusto($soap),
'testes_rapidos' => self::getAtendimentoTestesRapidos($soap),
'atestados' => self::getAtendimentoAtestados($soap),
'declaracoes_comparecimento' => self::getAtendimentoDeclaracoesComparecimento($soap),
'cartas_medicas' => self::getAtendimentoCartasMedicas($soap),
'orientacoes' => self::getAtendimentoOrientacoes($soap),
'encaminhamentos' => self::getAtendimentoEncaminhamentos($soap),
'compartilhamentos_cuidado' => self::getAtendimentoCompartilhamentosCuidado($soap),
'feridas' => self::getFeridas($soap),
],
'finalizacao' => [
'atendimento_tipo' => self::getAtendimentoAtendimentoTipo($soap),
'atendimento_compartilhado_usuario' => self::getAtendimentoAtendimentoCompartilhadoUsuario($soap),
'procedimentos_administrativos' => self::getAtendimentoProcedimentosAdministrativos($soap),
'casos_suspeitos' => self::getAtendimentoCasosSuspeitos($soap),
'racionalidade_saude' => self::getAtendimentoRacionalidadeSaude($soap),
'condutas' => self::getAtendimentoCondutas($soap),
'equipe' => self::getAtendimentoEquipe($soap),
'turno' => self::getAtendimentoTurno($soap),
'atencao_basica_local_atendimento' => self::getAtendimentoAtencaoBasicaLocalAtendimento($soap),
'desfecho' => $soap->paciente_liberado ? Desfecho::PACIENTE_LIBERADO : Desfecho::MANTER_NA_FILA,
'emad_tipo_atendimento' => optional($soap->emadTipoAtendimento)->descricao,
'emad_modalidade' => optional($soap->emadModalidade)->descricao,
'emad_conduta_desfecho' => optional($soap->emadCondutaDesfecho)->descricao,
'emad_procedencia' => optional($soap->emadProcedencia)->descricao,
'emad_cuidador' => optional($soap->emadCuidador)->descricao,
'emad_conclusao' => optional($soap->emadConclusao)->descricao,
'emad_cid_primario' => $soap->emad_cid_primario_id ? Cid::where('id', $soap->emad_cid_primario_id)->first() : null,
'emad_cns_cuidador' => $soap->emad_cns_cuidador ? MaskUtil::getCnsMasked($soap->emad_cns_cuidador) : null,
'emad_cpf_cuidador' => $soap->emad_cpf_cuidador ? MaskUtil::getCpfMasked($soap->emad_cpf_cuidador) : null,
'emad_justificativa' => optional($soap->justificativaEmad->first())->descricao,
],
'pre_natal' => [
'is_primeiro_atendimento' => self::isPrimeiroAtendimentoPreNatal($soap),
'is_gravidez_alto_risco' => self::isGravidezAltoRisco($soap),
'gravidez_tipo' => self::getAtendimentoPreNatalGravidezTipo($soap),
'altura_uterina' => $soap->pre_natal_altura_uterina,
'edema' => self::getAtendimentoPreNatalEdema($soap),
'movimentacao_fetal' => $soap->pre_natal_movimentacao_fetal,
'gravidez_planejada' => $soap->pre_natal_gravidez_planejada,
'batimento_cardiaco_fetal' => $soap->pre_natal_batimento_cardiaco_fetal,
'dpp' => $soap->dum ? $soap->dum->copy()->addMonths(9)->addDays(7)->format('d/m/Y') : null,
'desfecho_em' => $soap->pre_natal_desfecho_em ? $soap->pre_natal_desfecho_em->format('d/m/Y') : null,
],
'puericultura' => [
'is_primeiro_atendimento' => self::isPrimeiroAtendimentoPuericultura($soap),
'is_crianca_aleitamento' => $idadeAnos <= AtendimentoService::IDADE_ANOS_FINAL_CRIANCA_ALEITAMENTO,
'gravidez_tipo' => self::getAtendimentoPuericulturaGravidezTipo($soap),
'parto_tipo' => self::getAtendimentoPuericulturaPartoTipo($soap),
'idade_gestacional_semanas' => $soap->puericultura_idade_gestacional_semanas,
'idade_gestacional_dias' => $soap->puericultura_idade_gestacional_dias,
'apgar_primeiro_minuto' => $soap->puericultura_apgar_primeiro_minuto,
'apgar_quinto_minuto' => $soap->puericultura_apgar_quinto_minuto,
'apgar_decimo_minuto' => $soap->puericultura_apgar_decimo_minuto,
'peso' => $soap->puericultura_peso,
'comprimento' => $soap->puericultura_comprimento,
'perimetro_cefalico' => $soap->puericultura_perimetro_cefalico,
'aleitamento_tipo' => self::getAtendimentoPuericulturaAleitamentoTipo($soap),
'alteracoes_fenotipicas' => self::getAtendimentoPuericulturaAlteracoesFenotipicas($soap),
'fatores_risco' => self::getAtendimentoPuericulturaFatoresRisco($soap),
'marcos_desenvolvimento' => self::getAtendimentoPuericulturaMarcosDesenvolvimento($soap),
'questionario_m_chat_r' => self::getAtendimentoPuericulturaQuestionarioMChatR($soap),
],
'saude_bucal' => [
'vigilancias' => self::getAtendimentoSaudeBucalVigilancias($soap),
'necessidade_protese_inferior_superior' => $soap->saude_bucal_necessidade_protese_inferior_superior,
'odontograma' => self::getAtendimentoOdontograma($soap),
'consulta_tipo' => self::getAtendimentoSaudeBucalConsultaTipo($soap),
'fornecimentos' => self::getAtendimentoSaudeBucalFornecimentos($soap),
],
'antropometrias' => self::getAtendimentoAntropometrias($soap),
]);
}
public static function getTempoAtendimentoUnidade($soap){
$inicio = Carbon::parse($soap->atendimento->created_at);
$fim = Carbon::parse($soap->atendimento->finalizado_em);
$diferenca = $inicio->diff($fim);
$tempo = sprintf(
'%02d:%02d:%02d',
($diferenca->days * 24) + $diferenca->h,
$diferenca->i,
$diferenca->s
);
return $tempo;
}
public static function getFeridas($soap)
{
$pacienteId = $soap->atendimento->paciente->id;
$atendimentos = Atendimento::where(function ($q) use ($pacienteId) {
$q->whereHas('agendamento', function ($sub) use ($pacienteId) {
$sub->where('paciente_id', $pacienteId);
})->orWhereHas('demandaEspontanea', function ($sub) use ($pacienteId) {
$sub->where('paciente_id', $pacienteId);
});
})->pluck('id');
$soaps = AtendimentoSoap::whereIn('atendimento_id', $atendimentos)
->with([
'feridas',
'feridas.ferida',
'feridas.localAnatomico',
'feridas.localAnatomicoRegiao',
'feridas.exsudato',
'feridas.necrose',
'feridas.procedimentos',
'feridas.procedimentos.atendimentoProcedimento',
'feridas.procedimentos.atendimentoProcedimento.materiais',
'feridas.images',
])->get();
$feridas = $soaps->flatMap(function ($soap) {
return $soap->feridas->map(function ($ferida) {
$procedimentos = $ferida->procedimentos->map(function ($item) {
$atendimentoProcedimento = $item->atendimentoProcedimento;
return [
'id' => $item->id,
'procedimento_id' => $item->atendimentoProcedimento->procedimento_id,
'procedimento' => [
'id' => $item->atendimentoProcedimento->procedimento->id ?? null,
'codigo' => $item->atendimentoProcedimento->procedimento->codigo ?? null,
'nome' => $item->atendimentoProcedimento->procedimento->nome ?? null,
'materiais' => $atendimentoProcedimento
? $atendimentoProcedimento->materiais->map(function ($material) {
return [
'id' => $material->almoxarifadoSaidaItem->material->id ?? null,
'descricao_completa' =>$material->almoxarifadoSaidaItem->material->descricaoCompleta ?? null,
'quantidade' => $material->almoxarifadoSaidaItem->quantidade ?? null
];
}) : collect(),
],
'cid' => $item->atendimentoProcedimento->cid ? [
'id' => $item->atendimentoProcedimento->cid->id,
'codigo' => $item->atendimentoProcedimento->cid->codigo,
'nome' => $item->atendimentoProcedimento->cid->nome,
] : null,
'quantidade' => $item->atendimentoProcedimento->quantidade ?? null,
];
});
$imagesBase64 = $ferida->images->map(function ($image) {
$arquivo = $image->arquivo;
$path = Storage::path('ambulatorio' . DIRECTORY_SEPARATOR . 'feridas' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $arquivo);
if (file_exists($path)) {
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
return [
'id' => $image->id,
'arquivo' => $base64
];
}
return [
'id' => $image->id,
'arquivo' => null
];
});
return [
'id' => $ferida->id,
'soap_id' => $ferida->soap_id,
'data' => $ferida->data->format('d/m/Y') ?? null,
'tipo_descricao' => $ferida->ferida->nome ?? null,
'tipo_id' => $ferida->ferida_id,
'local_anatomico_descricao' => $ferida->localAnatomico->descricao ?? null,
'local_anatomico_id' => $ferida->local_anatomico_id,
'local_anatomico_regiao_descricao' => $ferida->localAnatomicoRegiao->descricao ?? null,
'local_anatomico_regiao_id' => $ferida->local_anatomico_regiao_id,
'exsudato_descricao' => $ferida->exsudato->descricao ?? null,
'exsudato_id' => $ferida->ferida_exsudato_id,
'necrose_descricao' => $ferida->necrose->descricao ?? null,
'necrose_id' => $ferida->ferida_necrose,
'cicatrizada' => $ferida->cicatrizada,
'comprimento' => $ferida->comprimento,
'largura' => $ferida->largura,
'profundidade' => $ferida->profundidade,
'dor' => $ferida->dor,
'observacao' => $ferida->observacao,
'procedimentos' => $procedimentos,
'images' => $imagesBase64,
];
});
});
return [
'ferida' => $feridas
];
}
public static function getAtendimentoHospital($id)
{
$atendimento = AtendimentoErpsaude::where('id', $id)->first();
$cidModel = $atendimento->cid10 ? Cid::where('codigo', $atendimento->cid10)->first() : null;
$cid = $cidModel
? $cidModel->codigo . ' - ' . $cidModel->nome
: ($atendimento->cid10 ?? '-');
return [
'data' => $atendimento->data,
'hora' => $atendimento->hora,
'hipotese_diagnostica' => $atendimento->hipotese_diagnostica,
'cid10' => $cid,
'descricao_procedimento' => $atendimento->descricao_procedimento,
'descricao_exame_clinico' => $atendimento->descricao_exame_clinico,
'conduta_medica' => $atendimento->conduta_medica,
'codigo_conta_prof' => '',
'profissional' => $atendimento->profissional,
'conselho' => $atendimento->conselho,
'uf_conselho' => $atendimento->uf_conselho,
'convenio' => $atendimento->convenio,
'registro_ans' => $atendimento->registro_ans ?? '',
'cod_convenio' => $atendimento->cod_convenio ?? '',
'nome_setor' => $atendimento->nome_setor ?? '',
'codigo_setor' => $atendimento->codigo_setor ?? '',
'cod_tipo_encaminhamento' => $atendimento->cod_tipo_encaminhamento ?? '',
'cod_tipo_atendimento' => $atendimento->tipoAtendimento ? $atendimento->tipoAtendimento->codigo : '',
'cod_grupo_atendimento' => $atendimento->cod_grupo_atendimento ?? '',
'cod_un_encaminhadora' => $atendimento->unidadeEncaminhadora ? $atendimento->unidadeEncaminhadora->codigo : '',
'cod_un_atendimento' => $atendimento->unidadeAtendimento->descricao,
'data_atendimento' => Carbon::parse($atendimento->data_atendimento)->format('d/m/Y'),
'data_alta' => $atendimento->data_alta ? Carbon::parse($atendimento->data_alta)->format('d/m/Y') : '',
'horario_atendimento' => Carbon::parse($atendimento->horario_atendimento)->format('H:i'),
'hora_alta' => $atendimento->hora_alta ? Carbon::parse($atendimento->hora_alta)->format('H:i') : '',
'cod_tipo_alta' => $atendimento->tipoAlta->descricao,
'un_atendimento' => '',
'cnes_un_atendimento' => $atendimento->cnes_un_atendimento,
'reavaliacoes' => $atendimento->reavaliacoes->map(function ($reavaliacao) {
return [
'reavaliacao' => $reavaliacao->reavaliacao ?? '-',
'profissional' => $reavaliacao->profissional ?? '',
'num_conselho' => $reavaliacao->numero_conselho ?? '',
'uf_conselho' => $reavaliacao->uf_conselho ?? '',
'data_reavaliacao' => $reavaliacao->data ? Carbon::parse($reavaliacao->data)->format('d/m/Y') : '',
'hora_reavaliacao' => $reavaliacao->hora ? Carbon::parse($reavaliacao->hora)->format('H:i') : '',
];
})->toArray(),
'exames' => $atendimento->exames->map(function ($exame) {
return [
'tipo' => $exame->tipo ?? '',
'descricao' => $exame->exame ?? '',
];
})->toArray(),
'medicamentos' => $atendimento->medicamentos->map(function ($medicamento) {
return [
'medicamento' => $medicamento->medicamento ?? '',
'qtde_presc' => $medicamento->quantidade ?? '',
'uni_med_presc' => $medicamento->unidade_medida ?? '',
'tipo' => $medicamento->tipo ? strtoupper($medicamento->tipo) : '',
'id_medicamento' => $medicamento->id ?? '0',
];
})->toArray(),
];
}
private static function isPrimeiroAtendimentoPuericultura($soap)
{
if (!$soap->is_atendimento_puericultura) {
return false;
}
$primeiroSoapPuericultura = AtendimentoSoap::where('is_rascunho', false)
->whereHas('atendimento', fn ($q) => $q
->whereHas('agendamento', fn ($q) => $q
->where('paciente_id', $soap->atendimento->paciente->id)
)
->orWhereHas('demandaEspontanea', fn ($q) => $q
->where('paciente_id', $soap->atendimento->paciente->id)
)
)
->where('is_atendimento_puericultura', true)
->orderBy('created_at')
->first(['id']);
return $soap->id === $primeiroSoapPuericultura->id;
}
private static function isPrimeiroAtendimentoPreNatal($soap)
{
if (!$soap->is_atendimento_pre_natal) {
return false;
}
$problemaCondicaoGravidez = $soap->problemasCondicoes()
->whereNotNull('paciente_gestacao_id')
->first(['id', 'paciente_gestacao_id']);
if (!$problemaCondicaoGravidez) {
return false;
}
$primeiroProblemaCondicaoGravidez = AtendimentoSoapProblemaCondicao::whereHas('soap', fn ($q) => $q
->where('is_rascunho', false)
)
->where(
'paciente_gestacao_id',
$problemaCondicaoGravidez->paciente_gestacao_id
)
->orderBy('created_at')
->first(['id']);
if (!$primeiroProblemaCondicaoGravidez) {
return false;
}
return $problemaCondicaoGravidez->id === $primeiroProblemaCondicaoGravidez->id;
}
private static function isGravidezAltoRisco($soap)
{
if (!$soap->is_atendimento_pre_natal) {
return false;
}
$problemaCondicaoGravidez = $soap->problemasCondicoes()
->whereNotNull('paciente_gestacao_id')
->first(['paciente_gestacao_id']);
if (!$problemaCondicaoGravidez) {
return false;
}
$soapsGravidez = AtendimentoSoapProblemaCondicao::whereHas('soap', fn ($q) => $q
->where('is_rascunho', false)
)
->where(
'paciente_gestacao_id',
$problemaCondicaoGravidez->paciente_gestacao_id
)
->where('soap_id', '<=', $soap->id)
->pluck('soap_id');
if (!$soapsGravidez) {
return false;
}
return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao')
->whereIn('problema_condicao.soap_id', $soapsGravidez)
->where(
fn($q) => $q
->whereExists(
fn($q) => $q
->select(DB::raw(1))
->from('geral_ciap as ciap')
->whereColumn('ciap.id', 'problema_condicao.ciap_id')
->whereIn('ciap.codigo', AtendimentoService::CIAPS_GRAVIDEZ_ALTO_RISCO)
)
->orWhereExists(
fn($q) => $q
->select(DB::raw(1))
->from('sigtap.cid as cid')
->whereColumn('cid.id', 'problema_condicao.cid_id')
->whereIn('cid.codigo', AtendimentoService::CIDS_GRAVIDEZ_ALTO_RISCO)
)
)
->exists();
}
private static function getAtendimentoEquipe($soap)
{
$equipe = $soap->equipe()
->with([
'area:id,numero_ine,descricao',
'microarea:id,descricao',
])
->first(['area_id', 'microarea_id']);
return (object) [
'descricao' => is_null($equipe)
? null
: ("INE: {$equipe->area->numero_ine} - Área: {$equipe->area->descricao}"
. (is_null($equipe->microarea_id) ? '' : " - Microárea: {$equipe->microarea->descricao}")
),
];
}
private static function getAtendimentoAtencaoBasicaLocalAtendimento($soap)
{
return $soap->atencaoBasicaLocalAtendimento()->first(['descricao']);
}
private static function getAtendimentoTurno($soap)
{
return $soap->turno()->first(['nome']);
}
private static function getAtendimentoPreNatalGravidezTipo($soap)
{
return $soap->preNatalGravidezTipo()->first(['nome']);
}
private static function getAtendimentoPreNatalEdema($soap)
{
return $soap->preNatalEdema()->first(['nome']);
}
private static function getAtendimentoAtendimentoTipo($soap)
{
$nome = null;
if ($soap->atendimento_tipo_id === TipoAtendimento::CONSULTA_NO_DIA) {
$nome = 'Atendimento no dia';
}
if ($soap->atendimento_tipo_id === TipoAtendimento::ATENDIMENTO_DE_URGENCIA) {
$nome = 'Urgência';
}
return (object) ['nome' => $nome];
}
private static function getAtendimentoAtendimentoCompartilhadoUsuario($soap)
{
$usuario = $soap->atendimentoCompartilhadoUsuario()->setEagerLoads([])->first(['cidadao_id']);
if (!is_null($usuario)) {
$cidadao = $usuario->cidadao()->setEagerLoads([])->first(['nome', 'cns']);
$usuario = (object) [
'nome' => $cidadao->nome,
'cns' => MaskUtil::getCnsMasked($cidadao->cns),
];
}
return $usuario;
}
private static function getAtendimentoRacionalidadeSaude($soap)
{
return $soap->racionalidadeSaude()->first(['descricao']);
}
private static function getAtendimentoSaudeBucalConsultaTipo($soap)
{
return $soap->saudeBucalConsultaTipo()->first(['descricao']);
}
private static function getAtendimentoCasosSuspeitos($soap)
{
return $soap->casosSuspeitos()->orderBy('nome')->get(['nome']);
}
private static function getAtendimentoSaudeBucalVigilancias($soap)
{
return $soap->saudeBucalVigilancias()->orderBy('nome')->pluck('nome');
}
private static function getAtendimentoSaudeBucalFornecimentos($soap)
{
return $soap->saudeBucalFornecimentos()->orderBy('nome')->pluck('nome');
}
private static function getAtendimentoTestesRapidos($soap)
{
return $soap->testesRapidos()->orderBy('nome')->pluck('nome');
}
private static function getAtendimentoCondutas($soap)
{
return $soap->condutas()->orderBy('descricao')->pluck('descricao');
}
private static function getAtendimentoAntecedente($soap)
{
$antecedente = $soap->antecedente()
->with([
'problemasCondicoes:antecedente_id,ciap_id,cid_id,situacao_id,inicio,fim,observacao',
'problemasCondicoes.ciap:id,codigo,descricao',
'problemasCondicoes.cid:id,codigo,nome',
'problemasCondicoes.situacao:id,nome',
'cirurgiasInternacoes:antecedente_id,descricao,realizada_em,observacao',
'problemasFamiliares:antecedente_id,ciap_id,observacao',
'problemasFamiliares.ciap:id,codigo,descricao',
])
->first([
'id',
'descricao',
'gestas_previas',
'abortos',
'desfecho_gestacao_aconteceu_menos_um_ano',
'partos_realizados',
'partos_vaginais',
'partos_cesareas',
'partos_domiciliares',
'nascidos_vivos',
'nascidos_mortos',
'recem_nascidos_com_menos2500_gramas',
'recem_nascidos_com_mais4500_gramas',
'nascidos_vivos_vivem',
'nascidos_vivos_mortos_primeira_semana',
'nascidos_vivos_mortos_depois_primeira_semana',
]);
if (!is_null($antecedente)) {
$antecedente->makeHidden('id');
$antecedente->problemasCondicoes->each(function ($problemaCondicao) {
$problemaCondicao->makeHidden([
'antecedente_id',
'ciap_id',
'cid_id',
'situacao_id',
]);
if (!is_null($problemaCondicao->ciap)) {
$problemaCondicao->ciap->makeHidden('id');
}
if (!is_null($problemaCondicao->cid)) {
$problemaCondicao->cid->makeHidden('id');
}
$problemaCondicao->situacao->makeHidden('id');
});
$antecedente->cirurgiasInternacoes->makeHidden('antecedente_id');
$antecedente->problemasFamiliares->each(function ($problemaFamiliar) {
$problemaFamiliar->makeHidden([
'antecedente_id',
'ciap_id',
]);
$problemaFamiliar->ciap->makeHidden('id');
});
}
return $antecedente;
}
private static function getAtendimentoObjetivoAntropometria($soap)
{
$antropometria = $soap->objetivoAntropometria()
->with('atendimentoAntropometria:id,peso,altura,perimetro_cefalico,circunferencia_abdominal,perimetro_panturrilha,comprimento_pe_direito,largura_pe_direito,circunferencia_pe_direito,comprimento_pe_esquerdo,largura_pe_esquerdo,circunferencia_pe_esquerdo')
->first(['atendimento_antropometria_id']);
if (!is_null($antropometria)) {
$antropometria->atendimentoAntropometria->imc = !is_null($antropometria->atendimentoAntropometria->peso)
&& !is_null($antropometria->atendimentoAntropometria->altura)
? ImcService::calculate(
UnidadeMedida::QUILOGRAMAS,
$antropometria->atendimentoAntropometria->peso,
UnidadeMedida::CENTIMETROS,
$antropometria->atendimentoAntropometria->altura
)
: null;
$antropometria->atendimentoAntropometria->makeHidden('id');
return $antropometria->atendimentoAntropometria;
}
return $antropometria;
}
private static function getAtendimentoObjetivoSinalVital($soap)
{
$sinalVital = $soap->objetivoSinalVital()
->with('atendimentoSinalVital:id,pressao_arterial,frequencia_respiratoria,frequencia_cardiaca,temperatura,saturacao_o2')
->first(['atendimento_sinal_vital_id']);
if (!is_null($sinalVital)) {
$sinalVital->atendimentoSinalVital->makeHidden('id');
return $sinalVital->atendimentoSinalVital;
}
return $sinalVital;
}
private static function getAtendimentoObjetivoGlicemiaCapilar($soap)
{
$glicemiaCapilar = $soap->objetivoGlicemiaCapilar()
->with([
'atendimentoGlicemiaCapilar:id,momento_coleta_id,valor',
'atendimentoGlicemiaCapilar.momentoColeta:id,nome',
])
->first(['atendimento_glicemia_capilar_id']);
if (!is_null($glicemiaCapilar)) {
$glicemiaCapilar->atendimentoGlicemiaCapilar->makeHidden('momento_coleta_id');
$glicemiaCapilar->atendimentoGlicemiaCapilar->momentoColeta->makeHidden('id');
return $glicemiaCapilar->atendimentoGlicemiaCapilar;
}
return $glicemiaCapilar;
}
private static function getAtendimentoObjetivoTria($soap)
{
$triaHistorio = $soap->triaHistorio()->latest('id')->first([
'alimentos_acabaram',
'comeu_alguns_alimentos',
'data_atualizacao_tria',
]);
if (is_null($triaHistorio)) {
return null;
}
return [
'alimentos_acabaram' => $triaHistorio->alimentos_acabaram,
'comeu_alguns_alimentos' => $triaHistorio->comeu_alguns_alimentos,
'data_atualizacao_tria' => $triaHistorio->data_atualizacao_tria
? $triaHistorio->data_atualizacao_tria->format('d/m/Y')
: null,
];
}
private static function getAtendimentoPrescricoesMedicamentos($soap)
{
return $soap->prescricoesMedicamentos->map(fn ($prescricao) => [
'medicamentos' => $prescricao->itens()
->with([
'turno:id,nome',
'unidadeMedida:id,nome',
'intervaloMedidaTempo:id,nome',
'duracaoMedidaTempo:id,nome',
])
->get([
'descricao',
'justificativa',
'material_id',
'dose',
'is_dose_unica',
'is_uso_continuo',
'frequencia_vezes',
'turno_id',
'unidade_medida_id',
'intervalo',
'intervalo_medida_tempo_id',
'inicio',
'duracao',
'duracao_medida_tempo_id',
'recomendacoes',
'tratamento_interrompido_em',
'tratamento_interrompido_justificativa',
])
->map(function ($item) {
$material = $item->material()
->with([
'apresentacao:id,nome',
'apresentacaoUnidadeMedida:id,nome',
'viaAdministracao:id,nome',
])
->first([
'descricao',
'apresentacao_id',
'quantidade',
'apresentacao_unidade_medida_id',
'via_administracao_id',
]);
return (object) [
'is_manual' => $item->is_manual,
'descricao' => $item->descricao,
'justificativa' => $item->justificativa ?? null,
'material' => is_null($material) ? null : [
'descricao' => $material->descricao,
'via_administracao' => [
'nome' => $material->viaAdministracao->nome ?? null
]
],
'is_dose_unica' => $item->is_dose_unica,
'is_uso_continuo' => $item->is_uso_continuo,
'posologia' => $item->posologia,
'inicio' => is_null($item->inicio) ? null : $item->inicio->format('d/m/Y'),
'duracao' => $item->duracao,
'duracao_medida_tempo' => is_null($item->duracaoMedidaTempo) ? null : [
'nome' => $item->duracaoMedidaTempo->nome,
],
'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'),
'recomendacoes' => $item->recomendacoes,
'is_tratamento_concluido' => $item->is_tratamento_concluido,
'is_tratamento_interrompido' => $item->is_tratamento_interrompido,
'tratamento_interrompido_em' => is_null($item->tratamento_interrompido_em)
? null : $item->tratamento_interrompido_em->format('d/m/Y'),
'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa,
];
})
]);
}
private static function getAtendimentoMarcadorConsumoAlimentar($soap)
{
$marcadorConsumoAlimentar = MarcadorConsumoAlimentar::where('soap_id', $soap->id)->first(['id']);
if (is_null($marcadorConsumoAlimentar)) {
return null;
}
$marcador = MarcadorConsumoAlimentarService::edit($marcadorConsumoAlimentar->id);
return [
'titulo' => $marcador['form']['titulo'],
'titulo_area' => $marcador['form']['titulo_area'],
'perguntas' => $marcador['form']['perguntas'],
'respostas' => $marcador['model']['perguntas'],
];
}
private static function getAtendimentoOdontograma($soap)
{
if (!$soap->is_atendimento_saude_bucal) {
return null;
}
$procedimentos = collect();
$odontograma = $soap->odontograma;
$arcadaSuperior = $odontograma->odontogramaArcadas()
->where('arcada_id', ArcadaDentaria::SUPERIOR)
->first();
$arcadaInferior = $odontograma->odontogramaArcadas()
->where('arcada_id', ArcadaDentaria::INFERIOR)
->first();
$getDentesData = function ($arcadaId, $dente) use ($arcadaSuperior, $arcadaInferior) {
$arcada = $arcadaId === ArcadaDentaria::SUPERIOR ? $arcadaSuperior : $arcadaInferior;
$odontogramaArcadaDente = $arcada->odontogramaArcadaDentes()
->where('dente_id', $dente->id)
->first();
return [
'numero' => $dente->numero,
'fragmentos' => [
'esquerda' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_esquerda_tratado],
'cima' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_cima_tratado],
'direita' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_direita_tratado],
'baixo' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_baixo_tratado],
'centro' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_centro_tratado],
],
'problemas_condicoes' => $odontogramaArcadaDente->problemasCondicoes()
->orderBy('nome')
->pluck('nome'),
];
};
$protesesTotais = collect();
if ($arcadaSuperior->possui_protese_total) {
$protesesTotais->push('Total superior');
}
if ($arcadaInferior->possui_protese_total) {
$protesesTotais->push('Total inferior');
}
$setProcedimentoData = function ($model, $local) use ($procedimentos) {
$data = (object) array_merge(self::getLogData($model, 'atendimento'), [
'local' => $local,
'procedimentos' => collect(),
'observacao' => $model->observacao,
]);
$model->atendimentoProcedimentos
->each(function ($atendimentoProcedimento) use ($data) {
$procedimento = $atendimentoProcedimento->atendimentoProcedimento->procedimento;
$codigo = MaskUtil::getProcedimentoMasked($procedimento->codigo);
$data->procedimentos->push([
'descricao' => "{$codigo} - {$procedimento->nome}",
'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade,
]);
});
$procedimentos->push($data);
};
$odontograma->odontogramaArcadas
->each(function ($odontogramaArcada) use ($setProcedimentoData) {
if ($odontogramaArcada->atendimentoProcedimentos->isNotEmpty()) {
$setProcedimentoData(
$odontogramaArcada,
$odontogramaArcada->arcada_id === ArcadaDentaria::SUPERIOR
? 'Arcada superior' : 'Arcada inferior'
);
}
$odontogramaArcada->odontogramaArcadaDentes()
->whereHas('atendimentoProcedimentos')
->get()
->each(fn ($odontogramaArcadaDente) => $setProcedimentoData(
$odontogramaArcadaDente,
"Dente {$odontogramaArcadaDente->dente->numero}"
));
});
$odontograma->dentesSupranumerarios->each(fn ($dente) => $setProcedimentoData($dente, $dente->local));
return [
'mostrar_dentes_deciduos' => false,
'possui_aparelho' => $odontograma->possui_aparelho,
'possui_contencao' => $odontograma->possui_contencao,
'proteses_totais' => $protesesTotais,
'arcadas' => [
'superior' => [
'dentes' => [
'permanentes' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR)
->where('is_deciduo', false)
->orderBy('ordem')
->get()
->map(fn ($dente) => $getDentesData(ArcadaDentaria::SUPERIOR, $dente)),
'deciduos' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR)
->where('is_deciduo', true)
->orderBy('ordem')
->get()
->map(fn ($dente) => $getDentesData(ArcadaDentaria::SUPERIOR, $dente)),
],
],
'inferior' => [
'dentes' => [
'permanentes' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR)
->where('is_deciduo', false)
->orderBy('ordem')
->get()
->map(fn ($dente) => $getDentesData(ArcadaDentaria::INFERIOR, $dente)),
'deciduos' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR)
->where('is_deciduo', true)
->orderBy('ordem')
->get()
->map(fn ($dente) => $getDentesData(ArcadaDentaria::INFERIOR, $dente)),
],
],
],
'procedimentos' => $procedimentos->sort()->values()
];
}
private static function getAtendimentoPuericulturaGravidezTipo($soap)
{
return $soap->puericulturaGravidezTipo()->first(['nome']);
}
private static function getAtendimentoPuericulturaPartoTipo($soap)
{
return $soap->puericulturaPartoTipo()->first(['nome']);
}
private static function getAtendimentoPuericulturaAleitamentoTipo($soap)
{
return $soap->puericulturaAleitamentoTipo()->first(['descricao']);
}
private static function getAtendimentoPuericulturaAlteracoesFenotipicas($soap)
{
$getResposta = function ($alteracaoId) use ($soap) {
$resposta = (object) ['is_presente' => null, 'status' => null];
$alteracao = $soap->puericulturaAlteracoesFenotipicas()
->where('alteracao_fenotipica_id', $alteracaoId)
->first();
if (!is_null($alteracao) && $alteracao->is_presente !== $resposta->is_presente) {
$resposta->is_presente = $alteracao->is_presente;
$resposta->status = is_null($alteracao->is_presente)
? null
: (($alteracao->is_presente ? 'Presente em ' : 'Ausente em ')
. $alteracao->created_at->format('d/m/Y'));
}
return $resposta;
};
return PuericulturaAlteracaoFenotipica::orderBy('id')->get()->map(function ($alteracao) use ($getResposta) {
$resposta = $getResposta($alteracao->id);
return [
'id' => $alteracao->id,
'descricao' => $alteracao->descricao,
'is_presente' => $resposta->is_presente,
'status' => $resposta->status,
];
});
}
private static function getAtendimentoPuericulturaFatoresRisco($soap)
{
$getResposta = function ($fatorId) use ($soap) {
$resposta = (object) ['is_presente' => null, 'status' => null];
$fator = $soap->puericulturaFatoresRisco()
->where('fator_risco_id', $fatorId)
->first();
if (!is_null($fator) && $fator->is_presente !== $resposta->is_presente) {
$resposta->is_presente = $fator->is_presente;
$resposta->status = is_null($fator->is_presente)
? null
: (($fator->is_presente ? 'Presente em ' : 'Ausente em ')
. $fator->created_at->format('d/m/Y'));
}
return $resposta;
};
return PuericulturaFatorRisco::orderBy('id')->get()->map(function ($fator) use ($getResposta) {
$resposta = $getResposta($fator->id);
return [
'id' => $fator->id,
'descricao' => $fator->descricao,
'is_presente' => $resposta->is_presente,
'status' => $resposta->status,
];
});
}
private static function getAtendimentoPuericulturaMarcosDesenvolvimento($soap)
{
$dataNascimento = $soap->atendimento->paciente->cidadao->data_nascimento;
if (is_null($dataNascimento)) {
return [];
}
$getResposta = function ($marcoId) use ($soap, $dataNascimento) {
$resposta = (object) [
'is_presente' => null,
'status' => null,
'alcancado_com_anos' => null,
'alcancado_com_meses' => null,
];
$marco = $soap->puericulturaMarcosDesenvolvimento()
->where('marco_desenvolvimento_id', $marcoId)
->first();
if (!is_null($marco)) {
if ($marco->is_presente !== $resposta->is_presente) {
$resposta->is_presente = $marco->is_presente;
if ($marco->is_presente
&& (!is_null($marco->alcancado_com_anos) || !is_null($marco->alcancado_com_meses))
) {
$resposta->alcancado_com_anos = $marco->alcancado_com_anos;
$resposta->alcancado_com_meses = $marco->alcancado_com_meses;
$resposta->status = $dataNascimento->copy()
->addYears($resposta->alcancado_com_anos)
->addMonths($resposta->alcancado_com_meses)
->format('d/m/Y');
}
else {
$resposta->alcancado_com_anos = null;
$resposta->alcancado_com_meses = null;
$resposta->status = $marco->created_at->format('d/m/Y');
}
}
else if ($marco->is_presente
&& $resposta->is_presente
&& ($marco->alcancado_com_anos !== $resposta->alcancado_com_anos
|| $marco->alcancado_com_meses !== $resposta->alcancado_com_meses
)
) {
$resposta->alcancado_com_anos = $marco->alcancado_com_anos;
$resposta->alcancado_com_meses = $marco->alcancado_com_meses;
$resposta->status = $dataNascimento->copy()
->addYears($resposta->alcancado_com_anos)
->addMonths($resposta->alcancado_com_meses)
->format('d/m/Y');
}
}
return $resposta;
};
$marcos = collect();
$idadeEmMeses = ceil($soap->created_at->diffInDays($dataNascimento) / 31);
PuericulturaMarcoDesenvolvimento::orderBy('faixa_etaria_dias_fim')
->get()
->each(function ($marco) use ($marcos, $idadeEmMeses, $getResposta) {
$faixaEtariaEmMeses = floor($marco->faixa_etaria_dias_fim / 31);
if ($faixaEtariaEmMeses <= $idadeEmMeses) {
$marcoFaixaEtaria = $marcos->where('descricao', $marco->faixa_etaria_descricao)->first();
if (is_null($marcoFaixaEtaria)) {
$marcoFaixaEtaria = (object) [
'descricao' => $marco->faixa_etaria_descricao,
'perguntas' => collect(),
'show_alcancado_com' => $marco->faixa_etaria_dias_fim > 15,
'meses_final' => $faixaEtariaEmMeses,
];
$marcos->push($marcoFaixaEtaria);
}
$resposta = $getResposta($marco->id);
$marcoFaixaEtaria->perguntas->push((object) [
'id' => $marco->id,
'descricao' => $marco->descricao,
'is_presente' => $resposta->is_presente,
'status' => $resposta->status,
'alcancado_com_anos' => $resposta->alcancado_com_anos,
'alcancado_com_meses' => $resposta->alcancado_com_meses,
]);
}
});
$marcos->each(function ($marco) {
$marco->perguntas->each(function ($pergunta) use ($marco) {
if (!is_null($pergunta->is_presente)) {
$meses = ($pergunta->alcancado_com_anos * 12) + $pergunta->alcancado_com_meses;
if ($pergunta->is_presente
&& $marco->meses_final > 0
&& $meses > $marco->meses_final
) {
$pergunta->status = "Presente com atraso em {$pergunta->status}";
}
else {
$pergunta->status = ($pergunta->is_presente ? 'Presente em ' : 'Ausente em ')
. $pergunta->status;
}
}
});
});
return $marcos;
}
private static function getAtendimentoAntropometrias($soap)
{
return $soap->antropometrias()
->whereDoesntHave('soapObjetivoAntropometria')
->orderBy('medido_em')
->get([
'medido_em',
'peso',
'altura',
'perimetro_cefalico',
'circunferencia_abdominal',
'perimetro_panturrilha',
]);
}
private static function getAtendimentoMotivos($soap)
{
$motivos = $soap->motivos()
->with('ciap:id,codigo,descricao')
->get(['ciap_id', 'observacao']);
$motivos->each(function ($motivo) {
$motivo->makeHidden('ciap_id');
if ($motivo->ciap) {
$motivo->ciap->makeHidden('id');
}
});
return $motivos;
}
private static function getAtendimentoExamesAvaliados($atendimento)
{
return DB::table('ambulatorio_atendimento_soap_exame_avaliado as pivot')
->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'pivot.soap_id')
->join('atencao_basica_cadastro_exame_solicitado_avaliado as exame_avaliado', 'exame_avaliado.id', 'pivot.exame_solicitado_avaliado_id')
->where('soap.is_rascunho', false)
->where('soap.atendimento_id', $atendimento->id)
->select(DB::raw("
exame_avaliado.id,
exame_avaliado.descricao,
exame_avaliado.codigo_procedimento,
DATE_FORMAT(pivot.solicitado_em, '%d/%m/%Y') as solicitado_em,
DATE_FORMAT(pivot.realizado_em, '%d/%m/%Y') as realizado_em,
DATE_FORMAT(pivot.resultado_em, '%d/%m/%Y') as resultado_em,
pivot.resultado
"))
->orderBy('descricao')
->get();
}
private static function getAtendimentoExamesSolicitados($soap)
{
return AtendimentoSoapExameSolicitado::where('soap_id', $soap->id)
->get()
->map(function ($solicitacao) {
return [
'cid_descricao' => is_null($solicitacao->cid_id)
? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}",
'ciap_descricao' => is_null($solicitacao->ciap_id)
? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}",
'justificativa' => $solicitacao->justificativa,
'observacao' => $solicitacao->observacao,
'exames' => $solicitacao->examesSolicitados->map(function ($item) {
return [
'id' => $item->id,
'descricao' => $item->descricao,
'codigo_procedimento' => $item->codigo_procedimento,
];
}),
];
});
}
private static function getAtendimentoTriagensNeonatalSolicitados($soap)
{
return AtendimentoSoapTriagemNeonatalSolicitado::where('soap_id', $soap->id)
->get()
->map(function ($solicitacao) {
return [
'cid_descricao' => is_null($solicitacao->cid_id)
? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}",
'ciap_descricao' => is_null($solicitacao->ciap_id)
? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}",
'justificativa' => $solicitacao->justificativa,
'observacao' => $solicitacao->observacao,
'exames' => $solicitacao->triagensNeonatalSolicitados->map(function ($item) {
return [
'id' => $item->id,
'descricao' => $item->descricao,
'codigo_procedimento' => $item->codigo_procedimento,
];
}),
];
});
}
private static function getAtendimentoTriagensNeoNatal($atendimento)
{
return DB::table('ambulatorio_atendimento_soap_triagem_neonatal as pivot')
->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'pivot.soap_id')
->join('atencao_basica_cadastro_triagem_neonatal as triagem_neonatal', 'triagem_neonatal.id', 'pivot.triagem_neonatal_id')
->where('soap.is_rascunho', false)
->where('soap.atendimento_id', $atendimento->id)
->select(DB::raw("
triagem_neonatal.id,
triagem_neonatal.descricao,
triagem_neonatal.codigo_procedimento,
DATE_FORMAT(pivot.solicitado_em, '%d/%m/%Y') as solicitado_em,
DATE_FORMAT(pivot.realizado_em, '%d/%m/%Y') as realizado_em,
DATE_FORMAT(pivot.resultado_em, '%d/%m/%Y') as resultado_em,
pivot.resultado
"))
->orderBy('descricao')
->get();
}
private static function getAtendimentoResultadosExames($soap)
{
$resultadosExames = $soap->resultadosExames()
->with('resultadoTipo:id,nome')
->get([
'exame_id',
'solicitado_em',
'realizado_em',
'resultado_em',
'resultado',
'percentual',
'idade_gestacional_semanas_eco',
'idade_gestacional_dias_eco',
'dpp_eco',
'resultado_tipo_id',
]);
$resultadosExames->each(function ($resultadoExame) {
$resultadoExame->exame = self::getExame($resultadoExame->exame_id);
$resultadoExame->makeHidden(['exame_id', 'resultado_tipo_id']);
if (!is_null($resultadoExame->resultadoTipo)) {
$resultadoExame->resultadoTipo->makeHidden('id');
}
});
return $resultadosExames;
}
private static function getAtendimentoProblemasCondicoes($soap)
{
$problemasCondicoes = $soap->problemasCondicoes()
->with([
'ciap:id,codigo,descricao',
'cid:id,codigo,nome',
'situacao:id,nome',
])
->get([
'ciap_id',
'cid_id',
'situacao_id',
'inicio',
'fim',
'observacao',
'resolvido_automaticamente',
]);
$problemasCondicoes->each(function ($problemaCondicao) {
$problemaCondicao->makeHidden(['ciap_id', 'cid_id']);
if (!is_null($problemaCondicao->ciap)) {
$problemaCondicao->ciap->makeHidden('id');
}
if (!is_null($problemaCondicao->cid)) {
$problemaCondicao->cid->makeHidden('id');
}
if (!is_null($problemaCondicao->situacao)) {
$problemaCondicao->situacao->makeHidden('id');
}
});
return $problemasCondicoes;
}
private static function getAtendimentoCondicoesEmad($soap)
{
return $soap->condicoesEmad()->pluck('nome');
}
private static function getAtendimentoProcedimentosEmad($soap)
{
$procedimentos = AtendimentoSoapProcedimentoEmad::where('soap_id', $soap->id)->get();
$dadosProcedimentos = [];
foreach ($procedimentos as $item) {
$proc = Procedimento::where('codigo', $item->codigo_procedimento)->orderByDesc('competencia_id')->first();
if ($proc) {
$dadosProcedimentos[] = [
'nome' => $proc->nome,
'codigo' => $proc->codigo,
];
}
}
return $dadosProcedimentos;
}
private static function getAtendimentoIntervencoes($soap)
{
$intervencoes = $soap->intervencoes()
->with('ciap:id,codigo,descricao')
->get(['ciap_id', 'observacao']);
$intervencoes->each(function ($intervencao) {
$intervencao->makeHidden('ciap_id');
$intervencao->ciap->makeHidden('id');
});
return $intervencoes;
}
private static function getAtendimentoDeclaracoesComparecimento($soap)
{
$declaracoesComparecimento = $soap->declaracoesComparecimento()
->with('turno:id,nome')
->get([
'motivo_comparecimento',
'nome_acompanhante',
'turno_id',
'entrada',
'saida',
]);
$declaracoesComparecimento->each(function ($declaracaoComparecimento) {
$declaracaoComparecimento->makeHidden('turno_id');
if (!is_null($declaracaoComparecimento->turno)) {
$declaracaoComparecimento->turno->makeHidden('id');
}
});
return $declaracoesComparecimento;
}
private static function getAtendimentoProcedimentosClinicos($soap)
{
$feridaProcedimentosIds = $soap->feridas()
->with('procedimentos')
->get()
->flatMap(function ($ferida) {
return $ferida->procedimentos->pluck('atendimento_procedimento_id');
})
->toArray();
return $soap->procedimentosClinicos()
->whereNotIn('atendimento_procedimento_id', $feridaProcedimentosIds)
->get([
'atendimento_procedimento_id',
'observacao',
])
->map(function ($procedimentoClinico) {
$atendimentoProcedimento = $procedimentoClinico->atendimentoProcedimento()->first([
'procedimento_id',
'quantidade',
'automatico',
]);
return (object) [
'procedimento' => self::getProcedimento($atendimentoProcedimento->procedimento_id),
'quantidade' => $atendimentoProcedimento->quantidade,
'automatico' => $atendimentoProcedimento->automatico,
'observacao' => $procedimentoClinico->observacao,
];
});
}
private static function getAtendimentoProcedimentosAdministrativos($soap)
{
return $soap->procedimentosAdministrativos()
->get(['atendimento_procedimento_id'])
->map(function ($procedimentoAdministrativo) {
$atendimentoProcedimento = $procedimentoAdministrativo->atendimentoProcedimento()->first([
'procedimento_id',
'quantidade',
'automatico',
'cid_id',
]);
return (object) [
'procedimento' => self::getProcedimento($atendimentoProcedimento->procedimento_id),
'quantidade' => $atendimentoProcedimento->quantidade,
'automatico' => $atendimentoProcedimento->automatico,
'cid' => self::getCid($atendimentoProcedimento->cid_id),
];
});
}
private static function getAtendimentoSolicitacoesExamesComuns($soap)
{
return self::getAtendimentoSolicitacoesExames($soap, false);
}
private static function getAtendimentoSolicitacoesExamesAltoCusto($soap)
{
return self::getAtendimentoSolicitacoesExames($soap, true);
}
private static function getAtendimentoSolicitacoesExames($soap, $isAltoCusto)
{
$solicitacoesExames = $soap->solicitacoesExames()
->with([
'cid:id,codigo,nome',
'ciap:id,codigo,descricao',
'classificacaoRisco:id,descricao_encaminhamento',
'itens:solicitacao_exame_id,exame_id',
])
->where('alto_custo', $isAltoCusto)
->get([
'id',
'cid_id',
'ciap_id',
'classificacao_risco_id',
'justificativa',
'observacao',
]);
$solicitacoesExames->each(function ($solicitacaoExame) {
$solicitacaoExame->makeHidden(['id', 'cid_id', 'classificacao_risco_id']);
if (!is_null($solicitacaoExame->cid)) {
$solicitacaoExame->cid->makeHidden('id');
}
if (!is_null($solicitacaoExame->classificacaoRisco)) {
$solicitacaoExame->classificacaoRisco->makeHidden('id');
}
$solicitacaoExame->itens->each(function ($item) {
$item->exame = self::getExame($item->exame_id);
$item->makeHidden(['solicitacao_exame_id', 'exame_id']);
});
});
return $solicitacoesExames;
}
private static function getAtendimentoAtestados($soap)
{
$atestados = $soap->atestados()
->with([
'modelo:id,nome',
'cid:id,codigo,nome',
])
->get([
'modelo_id',
'descricao',
'nome_acompanhante',
'documento_tipo_id',
'cpf',
'cns',
'data',
'horario',
'dias',
'cid_id',
]);
$atestados->each(function ($atestado) use ($soap) {
$atestado->is_atestado_acompanhante = !is_null($atestado->nome_acompanhante);
$atestado->nome = $atestado->nome_acompanhante ?? $soap->atendimento->paciente->cidadao->nome;
if (!is_null($atestado->cpf)) {
$atestado->cpf = MaskUtil::getCpfMasked($atestado->cpf);
}
if (!is_null($atestado->cns)) {
$atestado->cns = MaskUtil::getCnsMasked($atestado->cns);
}
$atestado->makeHidden(['nome_acompanhante', 'cid_id', 'modelo_id']);
if (!is_null($atestado->cid)) {
$atestado->cid->makeHidden('id');
}
});
return $atestados;
}
private static function getAtendimentoOrientacoes($soap)
{
return $soap->orientacoes()->get(['descricao']);
}
private static function getAtendimentoCartasMedicas($soap)
{
return $soap->cartasMedicas()->get(['descricao']);
}
private static function getAtendimentoEncaminhamentos($soap)
{
$encaminhamentos = $soap->encaminhamentos()
->with([
'tipo:id,descricao',
'servicoEspecializadoEspecialidade:id,nome,ocupacao_id',
'servicoEspecializadoEspecialidade.ocupacao:id,codigo,nome',
'servicoEspecializadoCid:id,codigo,nome',
'servicoEspecializadoCiap:id,codigo,descricao',
'servicoEspecializadoClassificacaoRisco:id,descricao_encaminhamento',
])
->get([
'tipo_id',
'servico_especializado_especialidade_id',
'servico_especializado_complemento',
'servico_especializado_cid_id',
'servico_especializado_ciap_id',
'servico_especializado_classificacao_risco_id',
'servico_especializado_motivo',
'servico_especializado_observacao',
'intersetorial_infraestrutura_id',
]);
$encaminhamentos->each(function ($encaminhamento) {
$encaminhamento->makeHidden([
'servico_especializado_especialidade_id',
'servico_especializado_classificacao_risco_id',
'intersetorial_infraestrutura_id',
'tipo_id',
]);
if (!is_null($encaminhamento->servicoEspecializadoEspecialidade)) {
$encaminhamento->servicoEspecializadoEspecialidade->makeHidden(['id', 'ocupacao_id']);
$encaminhamento->servicoEspecializadoEspecialidade->ocupacao->makeHidden('id');
}
if (!is_null($encaminhamento->servicoEspecializadoCid)) {
$encaminhamento->servicoEspecializadoCid->makeHidden('id');
}
if (!is_null($encaminhamento->servicoEspecializadoClassificacaoRisco)) {
$encaminhamento->servicoEspecializadoClassificacaoRisco->makeHidden('id');
}
if (is_null($encaminhamento->intersetorial_infraestrutura_id)) {
$encaminhamento->intersetorial_infraestrutura = null;
}
else {
$intersetorialInfraestrutura = $encaminhamento->intersetorialInfraestrutura()
->setEagerLoads([])
->first(['id', 'nome', 'principal', 'unidade_id']);
$encaminhamento->intersetorial_infraestrutura = (object) [
'nome' => $intersetorialInfraestrutura->nome,
'unidade' => (object) [
'nome_fantasia' => $intersetorialInfraestrutura->unidade()
->first('nome_fantasia')
->nome_fantasia
]
];
}
});
return $encaminhamentos;
}
private static function getAtendimentoCompartilhamentosCuidado($soap)
{
$compartilhamentosCuidado = $soap->compartilhamentosCuidado()
->with([
'especialidade:id,nome,ocupacao_id',
'especialidade.ocupacao:id,codigo,nome',
'ciap:id,codigo,descricao',
'cid:id,codigo,nome',
'classificacaoRisco:id,nome',
])
->get([
'especialidade_id',
'usuario_id',
'ciap_id',
'cid_id',
'classificacao_risco_id',
'discussao_caso_clinico',
]);
$compartilhamentosCuidado->each(function ($compartilhamentoCuidado) {
$compartilhamentoCuidado->usuario = (object) [
'nome' => $compartilhamentoCuidado->usuario()
->setEagerLoads([])
->first(['cidadao_id'])
->cidadao()
->setEagerLoads([])
->first(['nome'])
->nome,
];
$compartilhamentoCuidado->makeHidden([
'especialidade_id',
'usuario_id',
'ciap_id',
'cid_id',
'classificacao_risco_id',
]);
if (!is_null($compartilhamentoCuidado->especialidade)) {
$compartilhamentoCuidado->especialidade->makeHidden('id');
$compartilhamentoCuidado->especialidade->ocupacao->makeHidden('id');
}
if (!is_null($compartilhamentoCuidado->ciap)) {
$compartilhamentoCuidado->ciap->makeHidden('id');
}
if (!is_null($compartilhamentoCuidado->cid)) {
$compartilhamentoCuidado->cid->makeHidden('id');
}
$compartilhamentoCuidado->classificacaoRisco->makeHidden('id');
});
return $compartilhamentosCuidado;
}
private static function getPosConsultas($pacienteId)
{
return DB::table('ambulatorio_atendimento_pos_consulta')
->select([
'ambulatorio_atendimento_pos_consulta.id',
'ambulatorio_atendimento_pos_consulta.atendimento_id',
'ambulatorio_atendimento_pos_consulta.created_at',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Agendada' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_pos_consulta')
->select([
'ambulatorio_atendimento_pos_consulta.id',
'ambulatorio_atendimento_pos_consulta.atendimento_id',
'ambulatorio_atendimento_pos_consulta.created_at',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Demanda espontânea' AS tipo_atendimento"),
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
)
->get()
->map(function ($posConsulta) {
$posConsulta->created_at = Carbon::create($posConsulta->created_at);
$posConsulta->createdLotacao = (object) [
'ocupacao' => (object) [
'id' => $posConsulta->ocupacao_id,
'codigo' => $posConsulta->ocupacao_codigo,
'nome' => $posConsulta->ocupacao_nome,
],
'usuario' => (object) [
'cidadao' => (object) [
'nome' => $posConsulta->cidadao_nome,
],
],
];
$posConsulta->createdCentroCusto = (object) [
'infraestrutura_id' => $posConsulta->centro_custo_infraestrutura_id,
'setor' => (object) [
'nome' => $posConsulta->setor_nome
],
'unidade' => (object) [
'nome_fantasia' => $posConsulta->unidade_nome_fantasia
],
];
return (object) array_merge(self::getLogData($posConsulta, 'pos-consulta'), [
'id' => $posConsulta->id,
'atendimento_id' => $posConsulta->atendimento_id,
'is_atendimento_soap_assinado' => false,
]);
});
}
public static function getPosConsulta($posConsultaId)
{
$posConsulta = AtendimentoPosConsulta::findOrFail($posConsultaId);
return array_merge(self::getLogData($posConsulta, 'pos-consulta'), [
'observacoes' => $posConsulta->observacoes,
'procedimentos' => self::getPosConsultaProcedimentos($posConsulta),
'desfecho' => self::getPosConsultaDesfecho($posConsulta),
]);
}
private static function getPosConsultaProcedimentos($posConsulta)
{
$procedimentos = $posConsulta->procedimentos()
->get([
'procedimento_id',
'quantidade',
'automatico',
'local_curativo',
'saida_item_id',
]);
$procedimentos->each(function ($procedimento) {
$almoxarifadoSaidaItem = $procedimento->almoxarifadoSaidaItem;
$procedimento->procedimento = self::getProcedimento($procedimento->procedimento_id);
$procedimento->makeHidden('procedimento_id');
$procedimento->material_descricao_completa = $almoxarifadoSaidaItem->material->descricaoCompleta ?? null;
$procedimento->material_quantidade = $almoxarifadoSaidaItem->quantidade ?? null;
});
return $procedimentos;
}
private static function getPosConsultaDesfecho($posConsulta)
{
return $posConsulta->paciente_liberado
? Desfecho::PACIENTE_LIBERADO
: Desfecho::MANTER_NA_FILA;
}
private static function getLogData($model, $tipo)
{
return [
'tipo' => $tipo,
'data_hora' => $model->created_at,
'lotacao' => [
'ocupacao' => [
'id' => $model->createdLotacao->ocupacao->id,
'codigo' => $model->createdLotacao->ocupacao->codigo,
'nome' => $model->createdLotacao->ocupacao->nome,
],
'profissional' => [
'nome' => $model->createdLotacao->usuario->cidadao->nome ?? null,
],
],
'centro_custo' => [
'infraestrutura' => [
'id' => $model->createdCentroCusto->infraestrutura_id,
],
'setor' => [
'nome' => $model->createdCentroCusto->setor->nome,
],
'unidade' => [
'nome_fantasia' => $model->createdCentroCusto->unidade->nome_fantasia ?? null,
],
],
'tipo_atendimento' => $model->tipo_atendimento ?? null,
];
}
private static function getProcedimento($procedimentoId)
{
return DB::table('sigtap.procedimento')
->where('id', $procedimentoId)
->select(
'codigo',
'nome'
)
->first();
}
private static function getCid($cidId)
{
return DB::table('sigtap.cid')
->where('id', $cidId)
->select(
'codigo',
'nome'
)
->first();
}
private static function getExame($exameId)
{
return DB::table('parametrizacao_exame')
->where('id', $exameId)
->select(
'codigo',
'nome'
)
->first();
}
private static function getAtendimentoPuericulturaQuestionarioMChatR($soap)
{
$score = PuericulturaQuestionarioMChatR::orderBy('id')
->get()
->reduce(function ($total, $query) use ($soap) {
$questionario = $soap->puericulturaQuestionarioMChatR()
->where('questionario_m_chat_r_id', $query->id)
->first();
$valor = optional($questionario)->resposta
? $query->valor_resposta_sim
: $query->valor_resposta_nao;
return $total + $valor;
}, 0);
$classificacao = null;
if ($score <= 2) {
$classificacao = 'Baixo risco';
} elseif ($score >= 3 && $score <= 7) {
$classificacao = 'Risco moderado';
} elseif ($score >= 8) {
$classificacao = 'Alto risco';
}
return [[
'atendimento_id' => $soap->atendimento_id,
'soap_id' => $soap->id,
'data_hora_atendimento' => $soap->created_at->format('d/m/Y \à\s H:i'),
'usuario_nome' => $soap->createdLotacao->usuario->cidadao->nome ?? null,
'score' => $score,
'classificacao' => $classificacao,
]];
}
}