1332 lines
65 KiB
PHP
1332 lines
65 KiB
PHP
<?php
|
|
|
|
namespace App\Services\AtencaoBasica\AtendimentoIndividual;
|
|
|
|
use App\Enums\Ambulatorio\ProblemaCondicaoSituacao as AmbulatorioProblemaCondicaoSituacao;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada as EnumsCondicaoAvaliada;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\Conduta as AtendimentoIndividualConduta;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\ExameSolicitadoAvaliado as EnumsExameSolicitadoAvaliado;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\LocalAtendimento as EnumsLocalAtendimento;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar as EnumsModalidadeAtencaoDomiciliar;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento as EnumsRastreamento;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\TipoAtendimento as EnumsTipoAtendimento;
|
|
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
|
|
use App\Enums\Cadastro\SujeitoAtencao\FatorRisco as FatorRiscoEnum;
|
|
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
|
use App\Enums\Geral\Ciap as CiapEnum;
|
|
use App\Enums\Sigtap\Cid as CidEnum;
|
|
use App\Enums\Sigtap\Procedimento as SigtapProcedimento;
|
|
use App\Exceptions\AtencaoBasica\CondicaoAvaliadaException;
|
|
use App\Exceptions\AtencaoBasica\ExameSolicitadoAvaliadoException;
|
|
use App\Exceptions\AtencaoBasica\RastreamentoException;
|
|
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
|
|
use App\Models\Ambulatorio\ProblemaCondicaoSituacao;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AleitamentoMaterno;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividual;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualExameSolicitadoAvaliado;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualIvcf;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualOutroExame;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualProblemaCondicao;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualProcedimento;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualTriagemNeonatal;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\Conduta;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\Encaminhamento;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\EscalaCoelho;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\ExameSolicitadoAvaliado;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\Nasf;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\RacionalidadeSaude;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\Rastreamento;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\TriagemNeonatal;
|
|
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
|
|
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
|
|
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
|
|
use App\Models\AtencaoBasica\Parametrizacao\OutrosPermissaoOcupacao;
|
|
use App\Models\AtencaoBasica\Procedimento\Procedimento as ModelAtencaoBasicaProcedimento;
|
|
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimento;
|
|
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimentoProcedimento;
|
|
use App\Models\Cadastro\Estabelecimento\Unidade;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Cadastro\SujeitoAtencao\Usuario;
|
|
use App\Models\Cns\TermoInvalido;
|
|
use App\Models\Geral\Turno;
|
|
use App\Models\Parametrizacao\Exame\Exame;
|
|
use App\Models\Sigtap\Ocupacao;
|
|
use App\Models\Sigtap\Procedimento;
|
|
use App\Services\AtencaoBasica\Procedimento\ProcedimentoService;
|
|
use App\Services\Integracao\CnsService;
|
|
use App\Services\Service;
|
|
use App\Utils\MaskUtil;
|
|
use Carbon\Carbon;
|
|
use DateTime;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class AtendimentoIndividualService extends Service
|
|
{
|
|
public const CIAPS_GRAVIDEZ_NORMAL = [
|
|
CiapEnum::GRAVIDEZ,
|
|
];
|
|
|
|
public const CIDS_GRAVIDEZ_NORMAL = [
|
|
CidEnum::SUPERVISAO_DE_GRAVIDEZ_NORMAL,
|
|
CidEnum::SUPERVISAO_DE_PRIMEIRA_GRAVIDEZ_NORMAL,
|
|
CidEnum::SUPERVISAO_DE_OUTRA_GRAVIDEZ_NORMAL,
|
|
CidEnum::SUPERVISAO_DE_GRAVIDEZ_NORMAL_NAO_ESPECIFICADA,
|
|
];
|
|
|
|
public static function index()
|
|
{
|
|
return [];
|
|
}
|
|
|
|
public static function getAtendimentos()
|
|
{
|
|
|
|
$paciente = Paciente::findOrFail(request()->id);
|
|
|
|
return [
|
|
'additionals' => [
|
|
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
|
|
],
|
|
'atendimentos' => AtendimentoIndividual::where('paciente_id', request()->id)
|
|
->get()
|
|
->map(function ($query) {
|
|
return [
|
|
'id' => $query->id,
|
|
'data' => $query->data_usuario_responsavel,
|
|
'turno' => $query->turno->nome ?? null,
|
|
'local_atendimento' => $query->localAtendimento->descricao ?? null,
|
|
'profissional' => $query->usuario->cidadao->nome ?? null,
|
|
'data_exportacao' => $query->data_hora_exportacao
|
|
? (new Carbon($query->data_hora_exportacao))->format('d/m/Y') . ' às '
|
|
. (new Carbon($query->data_hora_exportacao))->format('H:i')
|
|
: null,
|
|
'profissional_exportacao' => $query->usuarioExportacao->cidadao->nome ?? null,
|
|
];
|
|
}),
|
|
'cidadao' => [
|
|
'paciente_id' => $paciente->id ?? null,
|
|
'nome' => $paciente->cidadao->nome ?? null,
|
|
'nome_social' => $paciente->cidadao->nome_social ?? null,
|
|
'sexo' => $paciente->cidadao->sexo->descricao ?? null,
|
|
'cns' => $paciente ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : null,
|
|
'data_nascimento' => $paciente->cidadao->data_nascimento->format('Y-m-d') ?? null,
|
|
'idade' => [
|
|
'anos' => $paciente->cidadao->idade['anos'],
|
|
'meses' => $paciente->cidadao->idade['meses'],
|
|
'dias' => $paciente->cidadao->idade['dias'],
|
|
],
|
|
'prontuario' => $paciente->prontuario,
|
|
'subclassificacao_id' => $paciente->subclassificacao_id,
|
|
'sexo' => $paciente->cidadao->sexo,
|
|
'telefones' => $paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
|
|
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
|
|
'nome_mae' => $paciente->cidadao->nome_mae ?? null,
|
|
'classificacao_id' => $paciente->classificacao_id,
|
|
'cidadao_id' => $paciente->cidadao_id,
|
|
],
|
|
];
|
|
}
|
|
|
|
public static function getEquipes(){
|
|
|
|
return DB::table('atencao_basica_parametrizacao_equipe_usuario')
|
|
->select([
|
|
'atencao_basica_parametrizacao_equipe.id AS id',
|
|
DB::raw("
|
|
CONCAT(
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(atencao_basica_parametrizacao_area.descricao, ''),
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(atencao_basica_parametrizacao_microarea.descricao, '')
|
|
) AS descricao
|
|
")
|
|
])
|
|
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
|
|
->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true)
|
|
->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id))
|
|
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $id))
|
|
->get();
|
|
}
|
|
|
|
public static function getUnidades(){
|
|
|
|
return DB::table('atencao_basica_parametrizacao_equipe_usuario')
|
|
->select([
|
|
'cadastro_unidade.id AS id',
|
|
DB::raw("CONCAT(TRIM(cadastro_unidade.cnes), ' - ', cadastro_unidade.nome_fantasia ) AS nome_fantasia"),
|
|
])
|
|
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
|
|
->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true)
|
|
->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id))
|
|
->distinct()
|
|
->orderBy('cadastro_unidade.cnes')
|
|
->get();
|
|
}
|
|
|
|
public static function getInfraestruturas(){
|
|
|
|
return DB::table('atencao_basica_parametrizacao_equipe_usuario')
|
|
->select([
|
|
'cadastro_infraestrutura.id AS id',
|
|
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome'),
|
|
])
|
|
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
|
|
->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true)
|
|
->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id))
|
|
->when(request()->unidade_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $id))
|
|
->distinct()
|
|
->orderBy('nome')
|
|
->get();
|
|
}
|
|
|
|
public static function getOcupacoes()
|
|
{
|
|
$usuario = Usuario::findOrFail(request()->usuario_id);
|
|
$permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::ATENDIMENTO_INDIVIDUAL)->get();
|
|
$codigos = $permissao->pluck('ocupacao');
|
|
|
|
return $usuario->lotacoes
|
|
->filter(function ($lotacao) use ($codigos) {
|
|
return $lotacao->infraestrutura->id == request()->infraestrutura_id &&
|
|
$codigos->contains($lotacao->ocupacao->codigo);
|
|
})
|
|
->pluck('ocupacao');
|
|
}
|
|
|
|
public static function getOcupacoesAuxiliar()
|
|
{
|
|
$usuario = Usuario::findOrFail(request()->usuario_id);
|
|
|
|
return $usuario->lotacoes
|
|
->filter(function ($lotacao) {
|
|
return $lotacao->infraestrutura->id == request()->infraestrutura_id;
|
|
})
|
|
->pluck('ocupacao');
|
|
}
|
|
|
|
private static function getFormData($paciente, $dataAtendimento, $atendimento)
|
|
{
|
|
|
|
$gestanteAtendimentos = AtendimentoIndividual::where('paciente_id', $paciente->id)
|
|
->where('data_usuario_responsavel', '<=', $dataAtendimento)
|
|
->whereNotNull('data_ultima_menstruacao');
|
|
|
|
if ($atendimento !== null) {
|
|
$gestanteAtendimentos->where('id', '!=', $atendimento->id);
|
|
}
|
|
|
|
return [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao),
|
|
'turnos' => Turno::orderBy('nome')->get(),
|
|
'local_atendimento' => LocalAtendimento::whereNotIn('id', [
|
|
EnumsLocalAtendimento::HOSPITAL,
|
|
EnumsLocalAtendimento::UNIDADE_PRONTO_ATENDIMENTO,
|
|
EnumsLocalAtendimento::CACON_UNACON,
|
|
])
|
|
->orderBy('descricao')
|
|
->get(),
|
|
'tipo_atendimento' => TipoAtendimento::whereNotIn('id', [
|
|
EnumsTipoAtendimento::ATENDIMENTO_PROGRAMADO,
|
|
EnumsTipoAtendimento::ATENDIMENTO_NAO_PROGRAMADO,
|
|
EnumsTipoAtendimento::VISITA_DOMICILIAR_POS_OBITO,
|
|
])
|
|
->orderBy('descricao')
|
|
->get(),
|
|
'atencao_domiciliar' => ModalidadeAtencaoDomiciliar::whereNotIn('id', [
|
|
EnumsModalidadeAtencaoDomiciliar::INELEGIVEL
|
|
])
|
|
->orderBy('descricao')
|
|
->get(),
|
|
'condicao_avaliada' => CondicaoAvaliada::orderBy('descricao')->get(),
|
|
'doenca_transmissivel' => DoencaTransmissivel::orderBy('descricao')->get(),
|
|
'rastreamento' => Rastreamento::orderBy('descricao')->get(),
|
|
'exame_solicitado_avaliado' => ExameSolicitadoAvaliado::orderBy('descricao')->get(),
|
|
'triagem_neonatal' => TriagemNeonatal::orderBy('descricao')->get(),
|
|
'nasf' => Nasf::orderBy('descricao')->get(),
|
|
'conduta' => Conduta::whereNotIn('id', [AtendimentoIndividualConduta::AGENDAMENTO_PARA_NASF])->orderBy('descricao')->get(),
|
|
'encaminhamento' => Encaminhamento::orderBy('descricao')->get(),
|
|
'aleitamento_materno' => AleitamentoMaterno::orderBy('descricao')->get(),
|
|
'racionalidade_saude' => RacionalidadeSaude::orderBy('descricao')->get(),
|
|
'escala_coelho' => EscalaCoelho::orderBy('id')->get(),
|
|
'procedimentos' => Procedimento::whereIn('codigo', [
|
|
SigtapProcedimento::MEDICAO_PESO,
|
|
SigtapProcedimento::MEDICAO_ALTURA,
|
|
SigtapProcedimento::AFERICAO_TEMPERATURA,
|
|
SigtapProcedimento::AFERICAO_PRESSAO_ARTERIAL,
|
|
SigtapProcedimento::AVALIACAO_ANTROPOMETRICA,
|
|
])
|
|
->where('competencia_id', function ($query) {
|
|
$query->select('sigtap.competencia.id')
|
|
->from('sigtap.competencia')
|
|
->orderByDesc('sigtap.competencia.valor')
|
|
->limit(1);
|
|
})
|
|
->groupBy('codigo')
|
|
->get(),
|
|
'gestante' => $gestanteAtendimentos->get()
|
|
->map(function ($atendimento) {
|
|
return [
|
|
'data' => (new Carbon($atendimento->data_usuario_responsavel))->format('d/m/Y'),
|
|
'dum' => (new Carbon($atendimento->data_ultima_menstruacao))->format('d/m/Y'),
|
|
'idade_gestacional' => $atendimento->idade_gestacional_semanas . ' semana(s) e '
|
|
. $atendimento->idade_gestacional_dias . ' dia(s)',
|
|
'usuario' => $atendimento->usuario->cidadao->nome ?? null,
|
|
'unidade' => $atendimento->equipe->unidade->nome_fantasia ?? null,
|
|
'ocupacao' => $atendimento->usuarioOcupacao->codigo_nome ?? null,
|
|
];
|
|
}),
|
|
'momentos_coleta' => GlicemiaCapilarMomentoColeta::orderBy('id')->get(['id', 'nome']),
|
|
'problema_condicao_situacoes' => ProblemaCondicaoSituacao::orderBy('nome')->get(['id', 'nome']),
|
|
'problemas_condicoes_paciente' => self::getProblemasCondicoesAtivosOuLatentes($paciente, $atendimento)
|
|
];
|
|
}
|
|
|
|
private static function getProblemasCondicoesAtivosOuLatentes($paciente, $atendimento = null)
|
|
{
|
|
return AtendimentoIndividualProblemaCondicao::whereIn('situacao_id', [
|
|
AmbulatorioProblemaCondicaoSituacao::ATIVO,
|
|
AmbulatorioProblemaCondicaoSituacao::LATENTE,
|
|
])
|
|
->whereHas('atendimentoIndividual', fn ($q) => $q
|
|
->where('paciente_id', $paciente->id)
|
|
->when($atendimento, fn ($q) => $q
|
|
->where('id', '<>', $atendimento->id)
|
|
->where('data_usuario_responsavel', '<=', $atendimento->data_usuario_responsavel)
|
|
)
|
|
)
|
|
->whereDoesntHave('problemaCondicaoPosterior')
|
|
->get()
|
|
->map(fn ($problemaCondicao) => [
|
|
'id' => $problemaCondicao->id,
|
|
'ciap' => [
|
|
'id' => $problemaCondicao->ciap_id,
|
|
'codigo' => $problemaCondicao->ciap->codigo ?? null,
|
|
'descricao' => $problemaCondicao->ciap->descricao ?? null,
|
|
],
|
|
'cid' => [
|
|
'id' => $problemaCondicao->cid_id,
|
|
'codigo' => $problemaCondicao->cid->codigo ?? null,
|
|
'nome' => $problemaCondicao->cid->nome ?? null,
|
|
],
|
|
'situacao_id' => $problemaCondicao->situacao_id,
|
|
'situacao_nome' => $problemaCondicao->situacao->nome,
|
|
'inicio' => is_null($problemaCondicao->inicio) ? null : $problemaCondicao->inicio->format('d/m/Y'),
|
|
'fim' => is_null($problemaCondicao->fim) ? null : $problemaCondicao->fim->format('d/m/Y'),
|
|
'observacao' => $problemaCondicao->observacao,
|
|
]);
|
|
}
|
|
|
|
private static function getModelData($atendimento = null, $paciente = null)
|
|
{
|
|
|
|
$cadastroIndividual = $paciente->cadastroIndividual ?? null;
|
|
|
|
if ($atendimento) {
|
|
$ivcf = AtendimentoIndividualIvcf::where('atendimento_individual_id', $atendimento->id)->first();
|
|
} else {
|
|
$ivcf = null;
|
|
}
|
|
|
|
return [
|
|
'cadastro' => [
|
|
'usuario' => [
|
|
'id' => $atendimento->usuario->id ?? null,
|
|
'cidadao_nome' => $atendimento->usuario->cidadao->nome ?? null,
|
|
],
|
|
'unidade_id' => $atendimento->equipe->unidade_id ?? null,
|
|
'infraestrutura_id' => $atendimento->equipe->infraestrutura_id ?? null,
|
|
'equipe_id' => $atendimento->equipe_id ?? null,
|
|
'ocupacao_id' => $atendimento->usuario_ocupacao_id ?? null,
|
|
'data_usuario_responsavel' => $atendimento->data_usuario_responsavel ?? Carbon::now()->format('Y-m-d'),
|
|
'usuario_auxiliar' => [
|
|
'id' => $atendimento->usuarioAuxiliar->id ?? null,
|
|
'cidadao_nome' => $atendimento->usuarioAuxiliar->cidadao->nome ?? null,
|
|
],
|
|
'unidade_auxiliar_id' => $atendimento->usuarioAuxiliarEquipe->unidade_id ?? null,
|
|
'infraestrutura_auxiliar_id' => $atendimento->usuarioAuxiliarEquipe->infraestrutura_id ?? null,
|
|
'equipe_auxiliar_id' => $atendimento->usuario_auxiliar_equipe_id ?? null,
|
|
'ocupacao_auxiliar_id' => $atendimento->usuario_auxiliar_ocupacao_id ?? null,
|
|
],
|
|
'cidadao' => [
|
|
'paciente_id' => $paciente->id ?? null,
|
|
'nome' => $paciente->cidadao->nome ?? null,
|
|
'nome_social' => $paciente->cidadao->nome_social ?? null,
|
|
'escala_coelho' => $paciente->cidadao->domicilio->cadastroDomiciliar->escalaCoelho->descricao ?? 'NÃO INFORMADO',
|
|
'sexo_id' => $paciente->cidadao->sexo_id ?? null,
|
|
'sexo' => $paciente->cidadao->sexo->descricao ?? null,
|
|
'cns' => $paciente ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : null,
|
|
'cpf' => $paciente ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
|
|
'data_nascimento' => $paciente->cidadao->data_nascimento->format('Y-m-d') ?? null,
|
|
'idade' => $paciente->cidadao->data_nascimento
|
|
? "{$paciente->cidadao->idade['anos']} ano(s), "
|
|
. "{$paciente->cidadao->idade['meses']} mês(es) e "
|
|
. "{$paciente->cidadao->idade['dias']} dia(s) "
|
|
: 'NÃO INFORMADA',
|
|
'classificacao_id' => $paciente->classificacao_id,
|
|
'cidadao_id' => $paciente->cidadao_id,
|
|
'idade_anos' => $paciente->cidadao->idade['anos'] ?? null,
|
|
],
|
|
'condicao' => [
|
|
'gestante' => $cadastroIndividual ? $paciente->cadastroIndividual->gestante : false,
|
|
'fumante' => $cadastroIndividual ? $paciente->cadastroIndividual->fumante : false,
|
|
'usa_alcool' => $cadastroIndividual ? $paciente->cadastroIndividual->usa_alcool : false,
|
|
'outras_drogas' => $cadastroIndividual ? $paciente->cadastroIndividual->outras_drogas : false,
|
|
'hipertensao' => $cadastroIndividual ? $paciente->cadastroIndividual->hipertensao : false,
|
|
'diabetes' => $cadastroIndividual ? $paciente->cadastroIndividual->diabetes : false,
|
|
'cadastro_individual_id' => $cadastroIndividual ? $cadastroIndividual->id : null,
|
|
],
|
|
'atendimento' => [
|
|
'id' => $atendimento ? $atendimento->id : null,
|
|
'turno_id' => $atendimento ? $atendimento->turno_id : null,
|
|
'local_atendimento_id' => $atendimento ? $atendimento->local_atendimento_id : null,
|
|
'tipo_atendimento_id' => $atendimento ? $atendimento->tipo_atendimento_id : null,
|
|
'perimetro_cefalico' => $atendimento ? $atendimento->perimetro_cefalico : null,
|
|
'glicemia' => $atendimento ? $atendimento->glicemia : null,
|
|
'momento_coleta_id' => $atendimento ? $atendimento->momento_coleta_id : null,
|
|
'saturacao_o2' => $atendimento ? $atendimento->saturacao_o2 : null,
|
|
'circunferencia_abdominal' => $atendimento ? $atendimento->circunferencia_abdominal : null,
|
|
'perimetro_panturrilha' => $atendimento ? $atendimento->perimetro_panturrilha : null,
|
|
'frequencia_cardiaca' => $atendimento ? $atendimento->frequencia_cardiaca : null,
|
|
'frequencia_respiratoria' => $atendimento ? $atendimento->frequencia_respiratoria : null,
|
|
'pressao_arterial' => $atendimento ? $atendimento->pressao_arterial : null,
|
|
'peso' => $atendimento ? $atendimento->peso : null,
|
|
'altura' => $atendimento ? $atendimento->altura : null,
|
|
'temperatura' => $atendimento ? $atendimento->temperatura : null,
|
|
'vacinacao' => $atendimento ? $atendimento->vacinacao : null,
|
|
'modalidade_atencao_domiciliar_id' => $atendimento ? $atendimento->modalidade_atencao_domiciliar_id : null,
|
|
'aleitamento_materno_id' => $atendimento ? $atendimento->aleitamento_materno_id : null,
|
|
'racionalidade_saude_id' => $atendimento ? $atendimento->racionalidade_saude_id : null,
|
|
'condicao_avaliada' => $atendimento ? $atendimento->condicaoAvaliada->pluck('id') : [],
|
|
'doenca_transmissivel' => $atendimento ? $atendimento->doencaTransmissivel->pluck('id') : [],
|
|
'rastreamento' => $atendimento ? $atendimento->rastreamento->pluck('id') : [],
|
|
'problemas_condicoes' => $atendimento ? $atendimento->problemasCondicoes->map(fn ($problemaCondicao) => [
|
|
'problema_condicao_anterior_id' => null,
|
|
'id' => $problemaCondicao->id,
|
|
'automatico' => $problemaCondicao->automatico,
|
|
'ciap' => $problemaCondicao->ciap ? [
|
|
'id' => $problemaCondicao->ciap->id,
|
|
'codigo' => $problemaCondicao->ciap->codigo,
|
|
'descricao' => $problemaCondicao->ciap->descricao,
|
|
] : null,
|
|
'cid' => $problemaCondicao->cid ? [
|
|
'id' => $problemaCondicao->cid->id,
|
|
'codigo' => $problemaCondicao->cid->codigo,
|
|
'nome' => $problemaCondicao->cid->nome,
|
|
] : null,
|
|
'incluir_lista_paciente' => !is_null($problemaCondicao->situacao_id),
|
|
'situacao_id' => $problemaCondicao->situacao_id,
|
|
'situacao_nome' => $problemaCondicao->situacao->nome ?? null,
|
|
'inicio' => $problemaCondicao->inicio ? [
|
|
'data' => $problemaCondicao->inicio->format('d/m/Y'),
|
|
'ano' => null,
|
|
'mes' => null,
|
|
] : null,
|
|
'fim' => $problemaCondicao->fim ? [
|
|
'data' => $problemaCondicao->fim->format('d/m/Y'),
|
|
'ano' => null,
|
|
'mes' => null,
|
|
] : null,
|
|
'observacao' => $problemaCondicao->observacao,
|
|
'has_continuidade' => $problemaCondicao->problemaCondicaoPosterior()->exists()
|
|
]) : collect(),
|
|
'exame_solicitado_avaliado' => $atendimento ? AtendimentoIndividualExameSolicitadoAvaliado::where('atendimento_individual_id', $atendimento->id)
|
|
->get()
|
|
->map(function ($query) {
|
|
$results = [];
|
|
|
|
if ($query->solicitado) {
|
|
$results[] = 's_' . $query->exame_solicitado_avaliado_id;
|
|
}
|
|
|
|
if ($query->avaliado) {
|
|
$results[] = 'a_' . $query->exame_solicitado_avaliado_id;
|
|
}
|
|
|
|
return $results;
|
|
})
|
|
->flatten()
|
|
->values() : [],
|
|
'triagem_neonatal' => $atendimento ? AtendimentoIndividualTriagemNeonatal::where('atendimento_individual_id', $atendimento->id)
|
|
->get()
|
|
->map(function ($query) {
|
|
$results = [];
|
|
|
|
if ($query->solicitado) {
|
|
$results[] = 's_' . $query->triagem_neonatal_id;
|
|
}
|
|
|
|
if ($query->avaliado) {
|
|
$results[] = 'a_' . $query->triagem_neonatal_id;
|
|
}
|
|
|
|
return $results;
|
|
})
|
|
->flatten()
|
|
->values() : [],
|
|
'outros_exames' => $atendimento ? AtendimentoIndividualOutroExame::where('atendimento_individual_id', $atendimento->id)
|
|
->get()
|
|
->map(function ($query) {
|
|
return [
|
|
'id' => $query->id,
|
|
'avaliado' => $query->avaliado,
|
|
'exame_id' => $query->exame_id ?? null,
|
|
'solicitado' => $query->solicitado ?? null,
|
|
'exame_nome' => $query->exame->nome ?? null,
|
|
'codigo' => $query->exame->codigo ?? null,
|
|
];
|
|
})
|
|
->sortBy('exame_nome')
|
|
->values() : [],
|
|
'observacao' => $atendimento ? $atendimento->observacao : null,
|
|
'nasf' => $atendimento ? $atendimento->nasf->pluck('id') : [],
|
|
'conduta' => $atendimento ? $atendimento->conduta->pluck('id') : [],
|
|
'encaminhamento' => $atendimento ? $atendimento->encaminhamento->pluck('id') : [],
|
|
'dum' => $atendimento ? $atendimento->data_ultima_menstruacao : null,
|
|
'idade_gestacional_semanas' => $atendimento ? $atendimento->idade_gestacional_semanas : null,
|
|
'idade_gestacional_dias' => $atendimento ? $atendimento->idade_gestacional_dias : null,
|
|
'data_possivel_parto' => $atendimento ? $atendimento->data_possivel_parto : null,
|
|
'gravidez_planejada' => $atendimento ? $atendimento->gravidez_planejada : null,
|
|
'gestacao_previa' => $atendimento ? $atendimento->gestacao_previa : null,
|
|
'parto' => $atendimento ? $atendimento->parto : null,
|
|
'ivcf' => [
|
|
'deseja_preencher' => $ivcf ? true : false,
|
|
'estado_saude_geral' => $ivcf->estado_saude_geral ?? null,
|
|
'limitacao_compras' => $ivcf->limitacao_compras ?? null,
|
|
'limitacao_gestao_financeira' => $ivcf->limitacao_gestao_financeira ?? null,
|
|
'limitacao_tarefas_domesticas' => $ivcf->limitacao_tarefas_domesticas ?? null,
|
|
'banho_independencia' => $ivcf->banho_independencia ?? null,
|
|
'relato_esquecimento_por_terceiros' => $ivcf->relato_esquecimento_por_terceiros ?? null,
|
|
'esquecimento_piorando' => $ivcf->esquecimento_piorando ?? null,
|
|
'esquecimento_impacta_atividades' => $ivcf->esquecimento_impacta_atividades ?? null,
|
|
'humor_tristeza_desanimo' => $ivcf->humor_tristeza_desanimo ?? null,
|
|
'perda_interesse_atividades' => $ivcf->perda_interesse_atividades ?? null,
|
|
'limitacao_elevar_bracos' => $ivcf->limitacao_elevar_bracos ?? null,
|
|
'limitacao_motricidade_fina' => $ivcf->limitacao_motricidade_fina ?? null,
|
|
'perda_peso_nao_intencional' => $ivcf->perda_peso_nao_intencional ?? null,
|
|
'imc_abaixo_22' => $ivcf->imc_abaixo_22 ?? null,
|
|
'panturrilha_abaixo_31' => $ivcf->panturrilha_abaixo_31 ?? null,
|
|
'marcha_lenta_4m_maior_5s' => $ivcf->marcha_lenta_4m_maior_5s ?? null,
|
|
'dificuldade_caminhar_impacto_atividades' => $ivcf->dificuldade_caminhar_impacto_atividades ?? null,
|
|
'quedas_recorrentes' => $ivcf->quedas_recorrentes ?? null,
|
|
'incontinencia' => $ivcf->incontinencia ?? null,
|
|
'problema_visao_impacto_atividades' => $ivcf->problema_visao_impacto_atividades ?? null,
|
|
'problema_audicao_impacto_atividades' => $ivcf->problema_audicao_impacto_atividades ?? null,
|
|
'doencas_cronicas_multiplas' => $ivcf->doencas_cronicas_multiplas ?? null,
|
|
'polifarmacia_5_ou_mais_medicamentos' => $ivcf->polifarmacia_5_ou_mais_medicamentos ?? null,
|
|
'internacao_ultimos_6_meses' => $ivcf->internacao_ultimos_6_meses ?? null,
|
|
],
|
|
],
|
|
'procedimentos' => $atendimento ? AtendimentoIndividualProcedimento::where('atendimento_individual_id', $atendimento->id)
|
|
->get()
|
|
->map(function ($query) {
|
|
return [
|
|
'id' => $query->procedimento->id,
|
|
'codigo' => $query->procedimento->codigo ?? null,
|
|
'nome' => $query->procedimento->nome ?? null,
|
|
];
|
|
})
|
|
->sortBy('exame_nome')
|
|
->values() : [],
|
|
'complemento' => $atendimento ? $atendimento->complemento : null,
|
|
];
|
|
}
|
|
|
|
public static function showAtendimento($id)
|
|
{
|
|
return AtendimentoIndividual::findOrFail($id);
|
|
}
|
|
|
|
public static function edit($id)
|
|
{
|
|
|
|
$atendimento = self::showAtendimento($id);
|
|
|
|
$dataAtendimento = $atendimento->data_usuario_responsavel;
|
|
|
|
$paciente = Paciente::findOrFail($atendimento->paciente->id);
|
|
|
|
return [
|
|
'additionals' => [
|
|
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
|
|
'paciente' => [
|
|
'sexo_id' => $paciente->cidadao->sexo_id,
|
|
'sexo_identificador' => $paciente->cidadao->sexo->identificador ?? null,
|
|
'data_nascimento' => $paciente->cidadao->data_nascimento
|
|
? $paciente->cidadao->data_nascimento->format('d/m/Y')
|
|
: null
|
|
],
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
],
|
|
'form' => self::getFormData($paciente, $dataAtendimento, $atendimento),
|
|
'model' => self::getModelData($atendimento, $paciente),
|
|
];
|
|
}
|
|
|
|
public static function show($id)
|
|
{
|
|
|
|
$atendimento = null;
|
|
$paciente = Paciente::findOrFail($id);
|
|
|
|
$dataAtendimento = Carbon::now()->format('Y-m-d');
|
|
|
|
return [
|
|
'additionals' => [
|
|
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
|
|
'paciente' => [
|
|
'sexo_id' => $paciente->cidadao->sexo_id,
|
|
'sexo_identificador' => $paciente->cidadao->sexo->identificador ?? null,
|
|
'data_nascimento' => $paciente->cidadao->data_nascimento
|
|
? $paciente->cidadao->data_nascimento->format('d/m/Y')
|
|
: null
|
|
],
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
],
|
|
'form' => self::getFormData($paciente, $dataAtendimento, $atendimento),
|
|
'model' => self::getModelData($atendimento, $paciente),
|
|
];
|
|
}
|
|
|
|
public static function store()
|
|
{
|
|
|
|
return self::saveStore(request()->all());
|
|
}
|
|
|
|
public static function saveStore($params)
|
|
{
|
|
|
|
self::validate($params);
|
|
|
|
$params = (object) $params;
|
|
|
|
$atendimento = $params->atendimento;
|
|
|
|
$atendimentoIndividual = $atendimento['id']
|
|
? AtendimentoIndividual::findOrFail($atendimento['id'])
|
|
: new AtendimentoIndividual();
|
|
|
|
|
|
|
|
self::exceptionExamesSolicitadoAvaliado($params, $atendimento['exame_solicitado_avaliado']);
|
|
self::exceptionCondicaoAvaliada($params, $atendimento['condicao_avaliada']);
|
|
self::exceptionRastreamento($params, $atendimento['rastreamento']);
|
|
|
|
$atendimentoIndividual->soap_id = $params->soap_id ?? null;
|
|
$atendimentoIndividual->paciente_id = $params->paciente_id;
|
|
|
|
$cadastro = $params->cadastro;
|
|
$atendimentoIndividual->data_usuario_responsavel = $cadastro['data_usuario_responsavel'];
|
|
|
|
$atendimentoIndividual->usuario_id = $cadastro['usuario_id'];
|
|
$atendimentoIndividual->equipe_id = $cadastro['equipe_id'];
|
|
$atendimentoIndividual->usuario_ocupacao_id = $cadastro['ocupacao_id'];
|
|
|
|
$atendimentoIndividual->usuario_auxiliar_id = $cadastro['usuario_auxiliar_id'] ?? null ;
|
|
$atendimentoIndividual->usuario_auxiliar_equipe_id = $cadastro['equipe_auxiliar_id'];
|
|
$atendimentoIndividual->usuario_auxiliar_ocupacao_id = $cadastro['ocupacao_auxiliar_id'];
|
|
|
|
$atendimentoIndividual->turno_id = $atendimento['turno_id'];
|
|
$atendimentoIndividual->local_atendimento_id = $atendimento['local_atendimento_id'];
|
|
$atendimentoIndividual->tipo_atendimento_id = $atendimento['tipo_atendimento_id'];
|
|
$atendimentoIndividual->perimetro_cefalico = $atendimento['perimetro_cefalico'];
|
|
$atendimentoIndividual->peso = $atendimento['peso'];
|
|
$atendimentoIndividual->altura = $atendimento['altura'];
|
|
$atendimentoIndividual->temperatura = $atendimento['temperatura'];
|
|
$atendimentoIndividual->pressao_arterial = $atendimento['pressao_arterial'];
|
|
$atendimentoIndividual->frequencia_respiratoria = $atendimento['frequencia_respiratoria'];
|
|
$atendimentoIndividual->frequencia_cardiaca = $atendimento['frequencia_cardiaca'];
|
|
$atendimentoIndividual->saturacao_o2 = $atendimento['saturacao_o2'];
|
|
$atendimentoIndividual->circunferencia_abdominal = $atendimento['circunferencia_abdominal'];
|
|
$atendimentoIndividual->perimetro_panturrilha = $atendimento['perimetro_panturrilha'];
|
|
$atendimentoIndividual->glicemia = $atendimento['glicemia'];
|
|
$atendimentoIndividual->momento_coleta_id = $atendimento['momento_coleta_id'];
|
|
$atendimentoIndividual->vacinacao = $atendimento['vacinacao'];
|
|
$atendimentoIndividual->modalidade_atencao_domiciliar_id = $atendimento['modalidade_atencao_domiciliar_id'];
|
|
$atendimentoIndividual->aleitamento_materno_id = $atendimento['aleitamento_materno_id'];
|
|
$atendimentoIndividual->racionalidade_saude_id = $atendimento['racionalidade_saude_id'];
|
|
$atendimentoIndividual->data_ultima_menstruacao = $atendimento['dum'];
|
|
$atendimentoIndividual->idade_gestacional_semanas = $atendimento['idade_gestacional_semanas'];
|
|
$atendimentoIndividual->idade_gestacional_dias = $atendimento['idade_gestacional_dias'];
|
|
$atendimentoIndividual->data_possivel_parto = $atendimento['data_possivel_parto'];
|
|
$atendimentoIndividual->gravidez_planejada = $atendimento['gravidez_planejada'];
|
|
$atendimentoIndividual->gestacao_previa = $atendimento['gestacao_previa'];
|
|
$atendimentoIndividual->parto = $atendimento['parto'];
|
|
$atendimentoIndividual->observacao = $atendimento['observacao'];
|
|
$atendimentoIndividual->complemento = $params->complemento;
|
|
$atendimentoIndividual->latitude = $atendimento['latitude'] ?? null;
|
|
$atendimentoIndividual->longitude = $atendimento['longitude'] ?? null;
|
|
$atendimentoIndividual->save();
|
|
|
|
|
|
|
|
$atendimentoIndividual->condicaoAvaliada()->sync($atendimento['condicao_avaliada']);
|
|
$atendimentoIndividual->doencaTransmissivel()->sync($atendimento['doenca_transmissivel']);
|
|
$atendimentoIndividual->rastreamento()->sync($atendimento['rastreamento']);
|
|
|
|
self::saveProblemasCondicoes($params, $atendimentoIndividual);
|
|
|
|
AtendimentoIndividualExameSolicitadoAvaliado::where('atendimento_individual_id', $atendimentoIndividual->id)->delete();
|
|
AtendimentoIndividualOutroExame::where('atendimento_individual_id', $atendimentoIndividual->id)->delete();
|
|
AtendimentoIndividualTriagemNeonatal::where('atendimento_individual_id', $atendimentoIndividual->id)->delete();
|
|
AtendimentoIndividualProcedimento::where('atendimento_individual_id', $atendimentoIndividual->id)->delete();
|
|
|
|
self::saveExamesSolicitadoAvaliado($atendimento['exame_solicitado_avaliado'], $atendimentoIndividual);
|
|
self::saveTriagemNeonatal($atendimento['triagem_neonatal'], $atendimentoIndividual);
|
|
self::saveOutrosExames($atendimento['outros_exames'], $atendimentoIndividual);
|
|
self::saveProcedimentos($params->procedimentos, $atendimentoIndividual);
|
|
|
|
$condicao = $params->condicao;
|
|
unset($condicao['cadastro_individual_id']);
|
|
tap(CadastroIndividual::where('paciente_id', $params->paciente_id))->update($condicao);
|
|
|
|
$atendimentoIndividual->nasf()->sync($atendimento['nasf']);
|
|
$atendimentoIndividual->conduta()->sync($atendimento['conduta']);
|
|
$atendimentoIndividual->encaminhamento()->sync($atendimento['encaminhamento']);
|
|
|
|
if (!isset($params->origem) || $params->origem !== 'ambulatorio_atendimento_enfermagem') {
|
|
self::storeProcedimentos($params, $atendimentoIndividual->id);
|
|
}
|
|
|
|
self::savePaciente($atendimento['dum'], $atendimentoIndividual);
|
|
|
|
if (isset($atendimento['ivcf']['deseja_preencher']) && $atendimento['ivcf']['deseja_preencher'] === true) {
|
|
AtendimentoIndividualIvcf::updateOrCreate(
|
|
[
|
|
'atendimento_individual_id' => $atendimentoIndividual->id
|
|
],
|
|
[
|
|
'atendimento_individual_id' => $atendimentoIndividual->id,
|
|
'estado_saude_geral' => $atendimento['ivcf']['estado_saude_geral'],
|
|
'limitacao_compras' => $atendimento['ivcf']['limitacao_compras'],
|
|
'limitacao_gestao_financeira' => $atendimento['ivcf']['limitacao_gestao_financeira'],
|
|
'limitacao_tarefas_domesticas' => $atendimento['ivcf']['limitacao_tarefas_domesticas'],
|
|
'banho_independencia' => $atendimento['ivcf']['banho_independencia'],
|
|
'relato_esquecimento_por_terceiros' => $atendimento['ivcf']['relato_esquecimento_por_terceiros'],
|
|
'esquecimento_piorando' => $atendimento['ivcf']['esquecimento_piorando'],
|
|
'esquecimento_impacta_atividades' => $atendimento['ivcf']['esquecimento_impacta_atividades'],
|
|
'humor_tristeza_desanimo' => $atendimento['ivcf']['humor_tristeza_desanimo'],
|
|
'perda_interesse_atividades' => $atendimento['ivcf']['perda_interesse_atividades'],
|
|
'limitacao_elevar_bracos' => $atendimento['ivcf']['limitacao_elevar_bracos'],
|
|
'limitacao_motricidade_fina' => $atendimento['ivcf']['limitacao_motricidade_fina'],
|
|
'perda_peso_nao_intencional' => $atendimento['ivcf']['perda_peso_nao_intencional'],
|
|
'imc_abaixo_22' => $atendimento['ivcf']['imc_abaixo_22'],
|
|
'panturrilha_abaixo_31' => $atendimento['ivcf']['panturrilha_abaixo_31'],
|
|
'marcha_lenta_4m_maior_5s' => $atendimento['ivcf']['marcha_lenta_4m_maior_5s'],
|
|
'dificuldade_caminhar_impacto_atividades' => $atendimento['ivcf']['dificuldade_caminhar_impacto_atividades'],
|
|
'quedas_recorrentes' => $atendimento['ivcf']['quedas_recorrentes'],
|
|
'incontinencia' => $atendimento['ivcf']['incontinencia'],
|
|
'problema_visao_impacto_atividades' => $atendimento['ivcf']['problema_visao_impacto_atividades'],
|
|
'problema_audicao_impacto_atividades' => $atendimento['ivcf']['problema_audicao_impacto_atividades'],
|
|
'doencas_cronicas_multiplas' => $atendimento['ivcf']['doencas_cronicas_multiplas'],
|
|
'polifarmacia_5_ou_mais_medicamentos' => $atendimento['ivcf']['polifarmacia_5_ou_mais_medicamentos'],
|
|
'internacao_ultimos_6_meses' => $atendimento['ivcf']['internacao_ultimos_6_meses'],
|
|
]
|
|
);
|
|
} else {
|
|
AtendimentoIndividualIvcf::where('atendimento_individual_id', $atendimentoIndividual->id)->delete();
|
|
}
|
|
}
|
|
|
|
private static function saveProblemasCondicoes($params, $atendimentoIndividual)
|
|
{
|
|
AtendimentoIndividualProblemaCondicao::where('atendimento_individual_id', $atendimentoIndividual->id)
|
|
->whereNotIn('id', collect($params->atendimento['problemas_condicoes'])->pluck('id')->filter())
|
|
->delete();
|
|
|
|
foreach ($params->atendimento['problemas_condicoes'] as $problemaCondicao) {
|
|
$problemaCondicaoAutomatico = isset($problemaCondicao['automatico']) ? $problemaCondicao['automatico'] : false;
|
|
$problemaCondicaoAnteriorId = isset($problemaCondicao['problema_condicao_anterior_id']) ? $problemaCondicao['problema_condicao_anterior_id'] : null;
|
|
$problemaCondicaoCiapId = isset($problemaCondicao['ciap_id']) ? $problemaCondicao['ciap_id'] : null;
|
|
$problemaCondicaoCidId = isset($problemaCondicao['cid_id']) ? $problemaCondicao['cid_id'] : null;
|
|
$problemaCondicaoSituacaoId = isset($problemaCondicao['situacao_id']) ? $problemaCondicao['situacao_id'] : null;
|
|
$problemaCondicaoInicio = isset($problemaCondicao['inicio']) ? $problemaCondicao['inicio'] : null;
|
|
$problemaCondicaoFim = isset($problemaCondicao['fim']) ? $problemaCondicao['fim'] : null;
|
|
$problemaCondicaoObservacao = isset($problemaCondicao['observacao']) ? $problemaCondicao['observacao'] : null;
|
|
|
|
$data = [
|
|
'automatico' => $problemaCondicaoAutomatico,
|
|
'ciap_id' => $problemaCondicaoCiapId,
|
|
'cid_id' => $problemaCondicaoCidId,
|
|
'situacao_id' => $problemaCondicaoSituacaoId,
|
|
];
|
|
|
|
if (isset($problemaCondicao['soap_problema_condicao_id'])) {
|
|
$data['soap_problema_condicao_id'] = $problemaCondicao['soap_problema_condicao_id'];
|
|
}
|
|
|
|
if (is_null($problemaCondicaoSituacaoId)) {
|
|
$data['inicio'] = null;
|
|
$data['fim'] = null;
|
|
$data['observacao'] = null;
|
|
}
|
|
else {
|
|
|
|
$data['inicio'] = is_null($problemaCondicaoInicio)
|
|
? null
|
|
: Carbon::createFromFormat('d/m/Y', $problemaCondicaoInicio);
|
|
|
|
$data['fim'] = is_null($problemaCondicaoFim)
|
|
? null
|
|
: Carbon::createFromFormat('d/m/Y', $problemaCondicaoFim);
|
|
|
|
$data['observacao'] = $problemaCondicaoObservacao;
|
|
|
|
$data['uuid_evolucao'] = Str::uuid();
|
|
|
|
if (!isset($problemaCondicao['id'])) {
|
|
if ($problemaCondicaoAnteriorId) {
|
|
$problemaCondicaoAnterior = AtendimentoIndividualProblemaCondicao::findOrFail($problemaCondicaoAnteriorId);
|
|
|
|
$data['uuid_inicial_problema_condicao'] = $problemaCondicaoAnterior->uuid_inicial_problema_condicao
|
|
?? $problemaCondicaoAnterior->uuid_evolucao;
|
|
|
|
$data['sequencial_evolucao'] = $problemaCondicaoAnterior->sequencial_evolucao + 1;
|
|
|
|
$data['problema_condicao_anterior_id'] = $problemaCondicaoAnteriorId;
|
|
|
|
$data['problema_condicao_inicial_id'] = $problemaCondicaoAnterior->problema_condicao_inicial_id
|
|
?? $problemaCondicaoAnterior->id;
|
|
}
|
|
else {
|
|
$data['sequencial_evolucao'] = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
$atendimentoIndividual->problemasCondicoes()->updateOrCreate(
|
|
['id' => $problemaCondicao['id']],
|
|
$data
|
|
);
|
|
}
|
|
}
|
|
|
|
private static function savePaciente($dum, $atendimentoIndividual) {
|
|
|
|
if ($dum) {
|
|
|
|
$atendimentoIndividual->paciente->dum()->updateOrCreate(
|
|
['paciente_id' => $atendimentoIndividual->paciente->id],
|
|
['data_ultima_menstruacao' => $dum]
|
|
);
|
|
|
|
if (self::isGestante($atendimentoIndividual)) {
|
|
|
|
$CadastroPaciente = CadastroIndividual::where('paciente_id', $atendimentoIndividual['paciente_id']);
|
|
|
|
if($CadastroPaciente){
|
|
$CadastroPaciente->update(['gestante' => true]);
|
|
}
|
|
|
|
if (!$atendimentoIndividual->paciente->cidadao->fatoresRisco->contains(FatorRiscoEnum::GESTANTE)) {
|
|
|
|
$atendimentoIndividual->paciente->cidadao->fatoresRisco()->attach(FatorRiscoEnum::GESTANTE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function isGestante($atendimentoIndividual) {
|
|
|
|
if (!$atendimentoIndividual->paciente->cidadao->data_nascimento || !$atendimentoIndividual->paciente->cidadao->sexo_id) {
|
|
return false;
|
|
}
|
|
|
|
$dataNascimento = new DateTime($atendimentoIndividual->paciente->cidadao->data_nascimento);
|
|
$dataResponsavel = new DateTime($atendimentoIndividual->data_usuario_responsavel);
|
|
$idade = $dataNascimento->diff($dataResponsavel)->y;
|
|
|
|
return$atendimentoIndividual->paciente->cidadao->sexo->id === Sexo::FEMININO && ($idade >= 9 && $idade <= 60)
|
|
&& $atendimentoIndividual->condicaoAvaliada()->where('condicao_avaliada_id', EnumsCondicaoAvaliada::PRE_NATAL)->exists();
|
|
}
|
|
|
|
private static function saveTriagemNeonatal($triagemNeonatal, $atendimentoIndividual) {
|
|
|
|
$obj = [];
|
|
|
|
foreach ($triagemNeonatal as $triagem) {
|
|
$tipo = substr($triagem, 0, 2);
|
|
$id = substr($triagem, 2);
|
|
|
|
$indice = array_search($id, array_column($obj, 'triagem_neonatal_id'));
|
|
|
|
if ($indice !== false) {
|
|
|
|
if ($tipo === 'a_') {
|
|
$obj[$indice]['avaliado'] = true;
|
|
} elseif ($tipo === 's_') {
|
|
$obj[$indice]['solicitado'] = true;
|
|
}
|
|
} else {
|
|
$novoObj = [
|
|
'triagem_neonatal_id' => $id,
|
|
'avaliado' => ($tipo === 'a_'),
|
|
'solicitado' => ($tipo === 's_')
|
|
];
|
|
|
|
$obj[] = $novoObj;
|
|
}
|
|
}
|
|
|
|
foreach ($obj as $ob) {
|
|
|
|
$triagemNeoNatal = AtendimentoIndividualTriagemNeonatal::where('triagem_neonatal_id', $ob['triagem_neonatal_id'])
|
|
->where('atendimento_individual_id', $atendimentoIndividual->id)
|
|
->first() ?? new AtendimentoIndividualTriagemNeonatal();
|
|
|
|
$triagemNeoNatal->triagem_neonatal_id = $ob['triagem_neonatal_id'];
|
|
$triagemNeoNatal->atendimento_individual_id = $atendimentoIndividual->id;
|
|
$triagemNeoNatal->avaliado = $ob['avaliado'];
|
|
$triagemNeoNatal->solicitado = $ob['solicitado'];
|
|
$triagemNeoNatal->save();
|
|
}
|
|
}
|
|
|
|
private static function saveOutrosExames($exames, $atendimentoIndividual) {
|
|
|
|
foreach ($exames as $exame) {
|
|
|
|
$outroExame = AtendimentoIndividualOutroExame::where('exame_id', $exame['exame_id'])
|
|
->where('atendimento_individual_id', $atendimentoIndividual->id)
|
|
->first() ?? new AtendimentoIndividualOutroExame();
|
|
|
|
$outroExame->exame_id = $exame['exame_id'];
|
|
$outroExame->atendimento_individual_id = $atendimentoIndividual->id;
|
|
$outroExame->avaliado = $exame['avaliado'];
|
|
$outroExame->solicitado = $exame['solicitado'];
|
|
$outroExame->save();
|
|
}
|
|
}
|
|
|
|
private static function saveProcedimentos($procedimentos, $atendimentoIndividual) {
|
|
|
|
foreach ($procedimentos as $procedimento) {
|
|
|
|
$existe = AtendimentoIndividualProcedimento::where('procedimento_id', $procedimento['procedimento_id'])
|
|
->where('atendimento_individual_id', $atendimentoIndividual->id)
|
|
->first();
|
|
|
|
if (!$existe) {
|
|
|
|
$AtendimentoIndividualProcedimento = new AtendimentoIndividualProcedimento();
|
|
$AtendimentoIndividualProcedimento->procedimento_id = $procedimento['procedimento_id'];
|
|
$AtendimentoIndividualProcedimento->atendimento_individual_id = $atendimentoIndividual->id;
|
|
$AtendimentoIndividualProcedimento->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function saveExamesSolicitadoAvaliado($exames, $atendimentoIndividual) {
|
|
|
|
$obj = [];
|
|
|
|
foreach ($exames as $exame) {
|
|
$tipo = substr($exame, 0, 2);
|
|
$id = substr($exame, 2);
|
|
|
|
$indice = array_search($id, array_column($obj, 'exame_solicitado_avaliado_id'));
|
|
|
|
if ($indice !== false) {
|
|
|
|
if ($tipo === 'a_') {
|
|
$obj[$indice]['avaliado'] = true;
|
|
} elseif ($tipo === 's_') {
|
|
$obj[$indice]['solicitado'] = true;
|
|
}
|
|
} else {
|
|
$novoObj = [
|
|
'exame_solicitado_avaliado_id' => $id,
|
|
'avaliado' => ($tipo === 'a_'),
|
|
'solicitado' => ($tipo === 's_')
|
|
];
|
|
|
|
$obj[] = $novoObj;
|
|
}
|
|
}
|
|
|
|
foreach ($obj as $ob) {
|
|
|
|
$exameSolicitadoAvaliado = AtendimentoIndividualExameSolicitadoAvaliado::where('exame_solicitado_avaliado_id', $ob['exame_solicitado_avaliado_id'])
|
|
->where('atendimento_individual_id', $atendimentoIndividual->id)
|
|
->first() ?? new AtendimentoIndividualExameSolicitadoAvaliado();
|
|
|
|
$exameSolicitadoAvaliado->exame_solicitado_avaliado_id = $ob['exame_solicitado_avaliado_id'];
|
|
$exameSolicitadoAvaliado->atendimento_individual_id = $atendimentoIndividual->id;
|
|
$exameSolicitadoAvaliado->avaliado = $ob['avaliado'];
|
|
$exameSolicitadoAvaliado->solicitado = $ob['solicitado'];
|
|
$exameSolicitadoAvaliado->save();
|
|
}
|
|
}
|
|
|
|
private static function storeProcedimentos($params, $atendimentoIndividualId) {
|
|
|
|
$cadastro = $params->cadastro;
|
|
$atendimento = $params->atendimento;
|
|
$procedimentos = $params->procedimentos;
|
|
$procedimentosFicha = [];
|
|
|
|
foreach ($procedimentos as $procedimento) {
|
|
|
|
$procedimentosFicha[] = [
|
|
'id' => $procedimento['procedimento_id'],
|
|
'quantidade' => 1,
|
|
];
|
|
}
|
|
|
|
$ficha = [
|
|
'id' => null,
|
|
'atendimento_individual_id' => $atendimentoIndividualId,
|
|
'paciente_id' => $params->paciente_id,
|
|
'data_usuario_responsavel' => $cadastro['data_usuario_responsavel'],
|
|
'equipe_id' => $cadastro['equipe_id'],
|
|
'ocupacao_id' => $cadastro['ocupacao_id'],
|
|
'unidade_id' => $cadastro['unidade_id'],
|
|
'usuario_id' => $cadastro['usuario_id'],
|
|
'local_atendimento_id' => $atendimento['local_atendimento_id'],
|
|
'afericao_pa' => $atendimento['pressao_arterial'],
|
|
'altura' => $atendimento['altura'],
|
|
'tipo_atendimento_id' => $atendimento['tipo_atendimento_id'],
|
|
'curativo' => null,
|
|
'exame_laboratorial' => null,
|
|
'teste_rapido' => null,
|
|
'procedimento_pequena_cirurgia' => null,
|
|
'administracao_medicamento' => null,
|
|
'peso' => $atendimento['peso'],
|
|
'temperatura' => $atendimento['temperatura'],
|
|
'perimetro_cefalico' => $atendimento['perimetro_cefalico'],
|
|
'frequencia_respiratoria' => $atendimento['frequencia_respiratoria'],
|
|
'frequencia_cardiaca' => $atendimento['frequencia_cardiaca'],
|
|
'saturacao_o2' => $atendimento['saturacao_o2'],
|
|
'circunferencia_abdominal' => $atendimento['circunferencia_abdominal'],
|
|
'perimetro_panturrilha' => $atendimento['perimetro_panturrilha'],
|
|
'glicemia' => $atendimento['glicemia'],
|
|
'momento_coleta_id' => $atendimento['momento_coleta_id'],
|
|
'microarea_id' => null,
|
|
'escuta_inicial' => null,
|
|
'turno_id' => $atendimento['turno_id'],
|
|
'procedimentos' => $procedimentosFicha,
|
|
];
|
|
|
|
$atendimento = [
|
|
'id' => null,
|
|
'origem' => 'atendimento_individual',
|
|
'cadastro' => [
|
|
'data_usuario_responsavel' => $cadastro['data_usuario_responsavel'],
|
|
'equipe_id' => $cadastro['equipe_id'],
|
|
'ocupacao_id' => $cadastro['ocupacao_id'],
|
|
'unidade_id' => $cadastro['unidade_id'],
|
|
'usuario_id' => $cadastro['usuario_id'],
|
|
],
|
|
'atendimentos' => [$ficha],
|
|
'procedimento_consolidado' => [
|
|
'afericao_pa' => null,
|
|
'altura' => null,
|
|
'curativo' => null,
|
|
'exame_laboratorial' => null,
|
|
'glicemia_capilar' => null,
|
|
'peso' => null,
|
|
'temperatura' => null,
|
|
]
|
|
];
|
|
|
|
ProcedimentoService::saveStore($atendimento);
|
|
}
|
|
|
|
private static function exceptionExamesSolicitadoAvaliado($params, $exames) {
|
|
|
|
$paciente = Paciente::findOrFail($params->paciente_id);
|
|
|
|
$obj = [];
|
|
|
|
foreach ($exames as $exame) {
|
|
$tipo = substr($exame, 0, 2);
|
|
$id = substr($exame, 2);
|
|
|
|
$indice = array_search($id, array_column($obj, 'exame_solicitado_avaliado_id'));
|
|
|
|
if ($indice !== false) {
|
|
|
|
if ($tipo === 'a_') {
|
|
$obj[$indice]['avaliado'] = true;
|
|
} elseif ($tipo === 's_') {
|
|
$obj[$indice]['solicitado'] = true;
|
|
}
|
|
} else {
|
|
$novoObj = [
|
|
'exame_solicitado_avaliado_id' => $id,
|
|
'avaliado' => ($tipo === 'a_'),
|
|
'solicitado' => ($tipo === 's_')
|
|
];
|
|
|
|
$obj[] = $novoObj;
|
|
}
|
|
}
|
|
|
|
foreach ($obj as $ob) {
|
|
|
|
if ($ob['exame_solicitado_avaliado_id'] == EnumsExameSolicitadoAvaliado::TESTE_DE_GRAVIDEZ
|
|
&& $paciente->cidadao->sexo_id === Sexo::MASCULINO) {
|
|
|
|
$exame = ExameSolicitadoAvaliado::findOrFail($ob['exame_solicitado_avaliado_id']);
|
|
|
|
throw new ExameSolicitadoAvaliadoException(json_encode($exame->descricao));
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function exceptionCondicaoAvaliada($params, $condicaoAvaliada) {
|
|
|
|
$paciente = Paciente::findOrFail($params->paciente_id);
|
|
|
|
foreach ($condicaoAvaliada as $condicao) {
|
|
|
|
if (($condicao == EnumsCondicaoAvaliada::PRE_NATAL || $condicao == EnumsCondicaoAvaliada::PUERPERIO_ATE_42_DIAS)
|
|
&& $paciente->cidadao->sexo_id === Sexo::MASCULINO) {
|
|
|
|
$descriao = CondicaoAvaliada::findOrFail($condicao)->descricao;
|
|
|
|
throw new CondicaoAvaliadaException(json_encode($descriao));
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function exceptionRastreamento($params, $rastreamento) {
|
|
|
|
$paciente = Paciente::findOrFail($params->paciente_id);
|
|
|
|
foreach ($rastreamento as $item) {
|
|
|
|
if ($item == EnumsRastreamento::CANCER_COLO_UTERO && $paciente->cidadao->sexo_id === Sexo::MASCULINO) {
|
|
|
|
$descriao = Rastreamento::findOrFail($item)->descricao;
|
|
|
|
throw new RastreamentoException(json_encode($descriao));
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function destroy($id)
|
|
{
|
|
DB::beginTransaction();
|
|
|
|
try {
|
|
$atendimentoIndividual = AtendimentoIndividual::findOrFail($id);
|
|
|
|
DB::table('integracao_esus_inconsistencia_atendimento_individual')
|
|
->where('atendimento_individual_id', $id)
|
|
->delete();
|
|
|
|
AtendimentoIndividualExameSolicitadoAvaliado::where('atendimento_individual_id', $id)->delete();
|
|
AtendimentoIndividualOutroExame::where('atendimento_individual_id', $id)->delete();
|
|
AtendimentoIndividualTriagemNeonatal::where('atendimento_individual_id', $id)->delete();
|
|
AtendimentoIndividualProcedimento::where('atendimento_individual_id', $id)->delete();
|
|
|
|
$procedimentoAtendimento = ProcedimentoAtendimento::where('atendimento_individual_id', $id)->first();
|
|
|
|
if ($procedimentoAtendimento) {
|
|
$procedimentoId = $procedimentoAtendimento->procedimento_id;
|
|
|
|
ProcedimentoAtendimentoProcedimento::where('procedimento_atendimento_id', $procedimentoAtendimento->id)->delete();
|
|
|
|
$procedimentoAtendimento->testesRapidos()->sync([]);
|
|
$procedimentoAtendimento->pequenasCirurgias()->sync([]);
|
|
$procedimentoAtendimento->administracaoMedicamentos()->sync([]);
|
|
$procedimentoAtendimento->delete();
|
|
|
|
$existeAtendimento = ProcedimentoAtendimento::where('procedimento_id', $procedimentoId)
|
|
->first();
|
|
|
|
if (!$existeAtendimento) {
|
|
ModelAtencaoBasicaProcedimento::where('id', $procedimentoId)->delete();
|
|
}
|
|
}
|
|
|
|
$atendimentoIndividual->condicaoAvaliada()->sync([]);
|
|
$atendimentoIndividual->doencaTransmissivel()->sync([]);
|
|
$atendimentoIndividual->rastreamento()->sync([]);
|
|
$atendimentoIndividual->nasf()->sync([]);
|
|
$atendimentoIndividual->conduta()->sync([]);
|
|
$atendimentoIndividual->encaminhamento()->sync([]);
|
|
|
|
$atendimentoIndividual->delete();
|
|
|
|
DB::commit();
|
|
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
private static function validate($params)
|
|
{
|
|
return Validator::make($params, [
|
|
'cadastro.usuario_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Usuario::class, 'id'),
|
|
],
|
|
'cadastro.unidade_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Unidade::class, 'id'),
|
|
],
|
|
'cadastro.equipe_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Equipe::class, 'id'),
|
|
],
|
|
'cadastro.ocupacao_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Ocupacao::class, 'id'),
|
|
],
|
|
'cadastro.data_usuario_responsavel' => [
|
|
'required',
|
|
'date',
|
|
],
|
|
'cadastro.usuario_auxiliar_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists(Usuario::class, 'id'),
|
|
],
|
|
'cadastro.usuario_auxiliar_unidade_id' => [
|
|
'nullable',
|
|
'required_if:cadastro.usuario_auxiliar_id, !=, null',
|
|
'integer',
|
|
Rule::exists(Unidade::class, 'id'),
|
|
],
|
|
'cadastro.usuario_auxiliar_equipe_id' => [
|
|
'nullable',
|
|
'required_if:cadastro.usuario_auxiliar_id, !=, null',
|
|
'integer',
|
|
Rule::exists(Equipe::class, 'id'),
|
|
],
|
|
'cadastro.usuario_auxiliar_ocupacao_id' => [
|
|
'nullable',
|
|
'required_if:cadastro.usuario_auxiliar_id, !=, null',
|
|
'integer',
|
|
Rule::exists(Ocupacao::class, 'id'),
|
|
],
|
|
'atendimento.turno_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Turno::class, 'id'),
|
|
],
|
|
'atendimento.local_atendimento_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(LocalAtendimento::class, 'id'),
|
|
],
|
|
'atendimento.tipo_atendimento_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(TipoAtendimento::class, 'id'),
|
|
],
|
|
'atendimento.aleitamento_materno_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists(AleitamentoMaterno::class, 'id'),
|
|
],
|
|
'atendimento.racionalidade_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists(RacionalidadeSaude::class, 'id'),
|
|
],
|
|
'atendimento.condicao_avaliada' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(CondicaoAvaliada::class, 'id'),
|
|
],
|
|
'atendimento.doenca_transmissivel' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(DoencaTransmissivel::class, 'id'),
|
|
],
|
|
'atendimento.rastreamento' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Rastreamento::class, 'id'),
|
|
],
|
|
'atendimento.nasf' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Nasf::class, 'id'),
|
|
],
|
|
'atendimento.conduta' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Conduta::class, 'id'),
|
|
],
|
|
'atendimento.encaminhamento' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Encaminhamento::class, 'id'),
|
|
],
|
|
'atendimento.complemento' => [
|
|
'nullable',
|
|
'string',
|
|
'max:1000'
|
|
],
|
|
'atendimento.outrosExames' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Exame::class, 'id'),
|
|
],
|
|
'atendimento.procedimento' => [
|
|
'nullable',
|
|
'array',
|
|
Rule::exists(Procedimento::class, 'id'),
|
|
],
|
|
])->validate();
|
|
}
|
|
|
|
private static function getPermissoesAtualizacaoCadastroPaciente()
|
|
{
|
|
$parametrizacao = CnsService::getParametrizacao();
|
|
|
|
if (!is_null($parametrizacao)) {
|
|
$lotacao = self::getCurrentLotacao();
|
|
|
|
return DB::table('cadastro_parametrizacao_permissao_usuario')
|
|
->select([
|
|
'municipe',
|
|
'provisorio',
|
|
'outro_municipio',
|
|
])
|
|
->where('infraestrutura_id', $lotacao->infraestrutura_id)
|
|
->where('usuario_id', $lotacao->usuario_id)
|
|
->get()
|
|
->first();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|