835 lines
37 KiB
PHP
835 lines
37 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Ambulatorio;
|
|
|
|
use App\Enums\Ambulatorio\ProblemaCondicaoSituacao;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\Conduta as AtendimentoIndividualConduta;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
|
|
use App\Enums\AtencaoBasica\AtendimentoOdontologico\CondutaEncaminhamento as AtendimentoOdontologicoCondutaEncaminhamento;
|
|
use App\Enums\AtencaoBasica\AtendimentoOdontologico\Fornecimento;
|
|
use App\Enums\AtencaoBasica\AtendimentoOdontologico\Procedimento;
|
|
use App\Enums\AtencaoBasica\Avaliacao\Cuidador as EnumCuidador;
|
|
use App\Enums\Geral\Ciap;
|
|
use App\Enums\Sigtap\Procedimento as SigtapProcedimento;
|
|
use App\Models\Administracao\Funcionalidade;
|
|
use App\Models\Ambulatorio\AtendimentoSoap;
|
|
use App\Models\Ambulatorio\AtendimentoSoapProblemaCondicao;
|
|
use App\Models\Ambulatorio\ParametrizacaoInfraestruturaOcupacao;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividual;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\ExameSolicitadoAvaliado;
|
|
use App\Models\AtencaoBasica\AtendimentoIndividual\TriagemNeonatal;
|
|
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologico;
|
|
use App\Models\AtencaoBasica\Avaliacao\Avaliacao;
|
|
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
|
|
use App\Services\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarService;
|
|
use App\Services\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualService;
|
|
use App\Services\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologicoService;
|
|
use App\Services\AtencaoBasica\Avaliacao\AvaliacaoService;
|
|
use App\Services\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarService;
|
|
use App\Services\Service;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class SoapAtencaoBasicaFichaService extends Service
|
|
{
|
|
public static function store($soap, $data = [])
|
|
{
|
|
if (is_null($soap->equipe_id)) {
|
|
|
|
return;
|
|
}
|
|
|
|
if ($soap->is_atendimento_saude_bucal) {
|
|
|
|
self::storeAtendimentoOdontologico($soap);
|
|
}
|
|
else {
|
|
|
|
self::storeAtendimentoIndividual($soap, $data);
|
|
}
|
|
|
|
self::storeMarcadorConsumoAlimentar($soap, $data['marcador_consumo_alimentar']);
|
|
self::storeAtendimentoDomiciliar($soap, $data);
|
|
self::storeAvaliacao($soap, $data);
|
|
}
|
|
|
|
public static function storeAtendimentoOdontologico($soap)
|
|
{
|
|
if (!self::criaFicha($soap, 'atendimento-odontologico')) {
|
|
|
|
return;
|
|
}
|
|
|
|
$getCondutas = function () use ($soap) {
|
|
|
|
return $soap->condutas->map(function ($conduta) {
|
|
|
|
switch ($conduta->id) {
|
|
|
|
case AtendimentoIndividualConduta::RETORNO_PARA_CONSULTA_AGENDADA:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::RETORNO_CONSULTA_AGENDADA;
|
|
|
|
case AtendimentoIndividualConduta::AGENDAMENTO_PARA_GRUPOS:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::AGENDAMENTO_GRUPOS;
|
|
|
|
case AtendimentoIndividualConduta::AGENDAMENTO_PARA_NASF:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::AGENDAMENTO_NASF;
|
|
|
|
case AtendimentoIndividualConduta::ALTA_DO_EPISODIO:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::ALTA_EPISODIO;
|
|
|
|
case AtendimentoIndividualConduta::AGENDAMENTO_PARA_E_MULTI:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::AGENDAMENTO_PARA_E_MULTI;
|
|
|
|
case AtendimentoIndividualConduta::RETORNO_PARA_CUIDADO_CONTINUADO_PROGRAMADO:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::RETORNO_CONSULTA_AGENDADA;
|
|
|
|
case AtendimentoIndividualConduta::TRATAMENTO_CONCLUIDO:
|
|
return AtendimentoOdontologicoCondutaEncaminhamento::TRATAMENTO_CONCLUIDO;
|
|
}
|
|
})
|
|
->filter();
|
|
};
|
|
|
|
$getProcedimentos = function () use ($soap) {
|
|
|
|
$procedimentos = $soap->procedimentos()
|
|
->get()
|
|
->map(fn ($atendimentoProcedimento) => [
|
|
'codigo' => $atendimentoProcedimento->procedimento->codigo,
|
|
'quantidade' => $atendimentoProcedimento->quantidade,
|
|
])
|
|
->all();
|
|
|
|
if ($soap->orientacao_individual_em_saude) {
|
|
$procedimentos[] = [
|
|
'codigo' => Procedimento::ORIENTACAO_INDIVIDUAL_EM_SAUDE,
|
|
'quantidade' => 1,
|
|
];
|
|
}
|
|
|
|
return $procedimentos;
|
|
};
|
|
|
|
$getCondicoesAvaliadas = function () use ($soap) {
|
|
|
|
$condicoes = $soap->condicoesAvaliadas->pluck('id');
|
|
|
|
if ($soap->is_atendimento_pre_natal) {
|
|
|
|
$condicoes->push(CondicaoAvaliada::PRE_NATAL);
|
|
}
|
|
|
|
if ($soap->is_atendimento_puericultura) {
|
|
|
|
$condicoes->push(CondicaoAvaliada::PUERICULTURA);
|
|
}
|
|
|
|
return $condicoes->all();
|
|
};
|
|
|
|
$problemasCondicoes = AtendimentoSoapProblemaCondicao::where('soap_id', $soap->id)
|
|
->get()
|
|
->map(fn ($problemaCondicao) => [
|
|
'ciap' => is_null($problemaCondicao->ciap_id) ? null : [
|
|
'id' => $problemaCondicao->ciap->id,
|
|
],
|
|
'cid' => is_null($problemaCondicao->cid_id) ? null : [
|
|
'id' => $problemaCondicao->cid->id,
|
|
],
|
|
]);
|
|
|
|
$existeSoap = AtendimentoSoap::where('atendimento_id', $soap->atendimento_id)
|
|
->get(['id', 'turno_id'])
|
|
->toArray();
|
|
|
|
$atOdontologico = AtendimentoOdontologico::whereIn('soap_id', array_column($existeSoap, 'id'))
|
|
->get(['id', 'turno_id', 'data_atendimento']);
|
|
|
|
$atOdontId = null;
|
|
|
|
foreach ($atOdontologico as $odontologico) {
|
|
if ($odontologico->turno_id == $soap->turno_id &&
|
|
$odontologico->data_atendimento == $soap->created_at->format('Y-m-d')) {
|
|
|
|
$atOdontId = $odontologico->id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$tipoAtendimentoId = $soap->atendimento_tipo_id;
|
|
|
|
$procedimentos = [
|
|
SigtapProcedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA,
|
|
SigtapProcedimento::TELECONSULTA_POR_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_ESPECIALIZADA_EXCETO_MEDICO,
|
|
SigtapProcedimento::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA,
|
|
];
|
|
|
|
$soap->procedimentos()
|
|
->get()
|
|
->each(function ($soapProcedimento) use (&$tipoAtendimentoId, $procedimentos) {
|
|
if (in_array($soapProcedimento->procedimento->codigo, $procedimentos)) {
|
|
$tipoAtendimentoId = TipoAtendimento::CONSULTA_AGENDADA;
|
|
}
|
|
});
|
|
|
|
if(empty($atOdontId)){
|
|
|
|
AtendimentoOdontologicoService::saveStore([
|
|
|
|
'soap_id' => $soap->id,
|
|
'paciente_id' => $soap->atendimento->paciente->id,
|
|
'usuario_id' => $soap->createdLotacao->usuario_id,
|
|
'ocupacao_id' => $soap->createdLotacao->ocupacao_id,
|
|
'usuario_auxiliar_id ' => null,
|
|
'ocupacao_auxiliar_id ' => null,
|
|
'data_atendimento' => $soap->created_at->format('Y-m-d'),
|
|
'turno_id' => $soap->turno_id,
|
|
'local_atendimento_id' => $soap->atencao_basica_local_atendimento_id,
|
|
'tipo_atendimento_id' => $tipoAtendimentoId,
|
|
'tipo_consulta_id' => $soap->saude_bucal_consulta_tipo_id,
|
|
'necessidades_especiais' => $soap->paciente_com_necessidade_especial ?? false,
|
|
'gestante' => AtendimentoService::isPacienteGestante($soap),
|
|
'unidade_id' => $soap->createdCentroCusto->infraestrutura->unidade_id,
|
|
'equipe_id' => $soap->equipe_id,
|
|
'equipe_auxiliar_id ' => null,
|
|
'escova_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::ESCOVA_DENTAL)->exists(),
|
|
'creme_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::CREME_DENTAL)->exists(),
|
|
'fio_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::FIO_DENTAL)->exists(),
|
|
'vigilancia' => $soap->saudeBucalVigilancias->pluck('codigo_esus'),
|
|
'conduta_encaminhamento' => $getCondutas(),
|
|
'procedimentos' => $getProcedimentos($soap),
|
|
'condicao_avaliada' => $getCondicoesAvaliadas(),
|
|
'doenca_transmissivel' => $soap->doencasTransmissiveis->pluck('id')->all(),
|
|
'rastreamento' => $soap->rastreamentos->pluck('id')->all(),
|
|
'problemas_condicoes' => $problemasCondicoes,
|
|
'medicoes' => [
|
|
'perimetro_cefalico' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_cefalico ?? null,
|
|
'circunferencia_abdominal' => $soap->objetivoAntropometria->atendimentoAntropometria->circunferencia_abdominal ?? null,
|
|
'perimetro_panturrilha' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_panturrilha ?? null,
|
|
'peso' => $soap->objetivoAntropometria->atendimentoAntropometria->peso ?? null,
|
|
'altura' => $soap->objetivoAntropometria->atendimentoAntropometria->altura ?? null,
|
|
'temperatura' => $soap->objetivoSinalVital->atendimentoSinalVital->temperatura ?? null,
|
|
'pressao_arterial' => $soap->objetivoSinalVital->atendimentoSinalVital->pressao_arterial ?? null,
|
|
'frequencia_respiratoria' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_respiratoria ?? null,
|
|
'frequencia_cardiaca' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_cardiaca ?? null,
|
|
'saturacao_o2' => $soap->objetivoSinalVital->atendimentoSinalVital->saturacao_o2 ?? null,
|
|
'glicemia' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->valor ?? null,
|
|
'momento_coleta_id' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->momento_coleta_id ?? null,
|
|
],
|
|
'ivcf' => array_merge(
|
|
[
|
|
'deseja_preencher' => $soap->ivcf ? true : false,
|
|
],
|
|
$soap->ivcf ? $soap->ivcf->toArray() : [],
|
|
),
|
|
]);
|
|
}else {
|
|
|
|
AtendimentoOdontologicoService::update($atOdontId,
|
|
[
|
|
'id' => $atOdontId,
|
|
'soap_id' => $soap->id,
|
|
'paciente_id' => $soap->atendimento->paciente->id,
|
|
'usuario_id' => $soap->createdLotacao->usuario_id,
|
|
'ocupacao_id' => $soap->createdLotacao->ocupacao_id,
|
|
'usuario_auxiliar_id' => null,
|
|
'ocupacao_auxiliar_id' => null,
|
|
'data_atendimento' => $soap->created_at->format('Y-m-d'),
|
|
'turno_id' => $soap->turno_id,
|
|
'local_atendimento_id' => $soap->atencao_basica_local_atendimento_id,
|
|
'tipo_atendimento_id' => $tipoAtendimentoId,
|
|
'tipo_consulta_id' => $soap->saude_bucal_consulta_tipo_id,
|
|
'necessidades_especiais' => $soap->paciente_com_necessidade_especial ?? false,
|
|
'gestante' => AtendimentoService::isPacienteGestante($soap),
|
|
'unidade_id' => $soap->createdCentroCusto->infraestrutura->unidade_id,
|
|
'equipe_id' => $soap->equipe_id,
|
|
'equipe_auxiliar_id ' => null,
|
|
'escova_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::ESCOVA_DENTAL)->exists(),
|
|
'creme_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::CREME_DENTAL)->exists(),
|
|
'fio_dental' => $soap->saudeBucalFornecimentos()->where('id', Fornecimento::FIO_DENTAL)->exists(),
|
|
'vigilancia' => $soap->saudeBucalVigilancias->pluck('codigo_esus'),
|
|
'conduta_encaminhamento' => $getCondutas(),
|
|
'procedimentos' => $getProcedimentos($soap),
|
|
'condicao_avaliada' => $getCondicoesAvaliadas(),
|
|
'doenca_transmissivel' => $soap->doencasTransmissiveis->pluck('id')->all(),
|
|
'rastreamento' => $soap->rastreamentos->pluck('id')->all(),
|
|
'problemas_condicoes' => $problemasCondicoes,
|
|
'medicoes' => [
|
|
'perimetro_cefalico' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_cefalico ?? null,
|
|
'circunferencia_abdominal' => $soap->objetivoAntropometria->atendimentoAntropometria->circunferencia_abdominal ?? null,
|
|
'perimetro_panturrilha' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_panturrilha ?? null,
|
|
'peso' => $soap->objetivoAntropometria->atendimentoAntropometria->peso ?? null,
|
|
'altura' => $soap->objetivoAntropometria->atendimentoAntropometria->altura ?? null,
|
|
'temperatura' => $soap->objetivoSinalVital->atendimentoSinalVital->temperatura ?? null,
|
|
'pressao_arterial' => $soap->objetivoSinalVital->atendimentoSinalVital->pressao_arterial ?? null,
|
|
'frequencia_respiratoria' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_respiratoria ?? null,
|
|
'frequencia_cardiaca' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_cardiaca ?? null,
|
|
'saturacao_o2' => $soap->objetivoSinalVital->atendimentoSinalVital->saturacao_o2 ?? null,
|
|
'glicemia' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->valor ?? null,
|
|
'momento_coleta_id' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->momento_coleta_id ?? null,
|
|
]
|
|
]);
|
|
}
|
|
}
|
|
|
|
public static function storeAtendimentoIndividual($soap, $data)
|
|
{
|
|
if (!self::criaFicha($soap, 'atendimento-individual')) {
|
|
|
|
return;
|
|
}
|
|
|
|
$getProcedimentos = function () use ($soap) {
|
|
|
|
$procedimentos = collect();
|
|
|
|
$soap->procedimentos()
|
|
->get()
|
|
->each(function ($atendimentoProcedimento) use ($procedimentos) {
|
|
|
|
for ($i = 1; $i <= $atendimentoProcedimento->quantidade; $i++) {
|
|
|
|
$procedimentos->push([
|
|
'procedimento_id' => $atendimentoProcedimento->procedimento->id,
|
|
]);
|
|
}
|
|
});
|
|
|
|
return $procedimentos->all();
|
|
};
|
|
|
|
$getDpp = function () use ($soap) {
|
|
|
|
$ultimaDum = AtendimentoService::getUltimaDum($soap->atendimento->paciente);
|
|
|
|
if (!is_null($ultimaDum)) {
|
|
|
|
$ultimaDum = Carbon::createFromFormat('d/m/Y', $ultimaDum);
|
|
|
|
return $ultimaDum->addMonths(9)->addDays(7)->format('Y-m-d');
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
$getCondicoesAvaliadas = function () use ($soap) {
|
|
|
|
$condicoes = $soap->condicoesAvaliadas->pluck('id');
|
|
|
|
if ($soap->is_atendimento_pre_natal) {
|
|
|
|
$condicoes->push(CondicaoAvaliada::PRE_NATAL);
|
|
}
|
|
|
|
if ($soap->is_atendimento_puericultura) {
|
|
|
|
$condicoes->push(CondicaoAvaliada::PUERICULTURA);
|
|
}
|
|
|
|
return $condicoes->all();
|
|
};
|
|
|
|
$getExamesAvaliados = function () use ($data, $soap) {
|
|
|
|
$exames = [];
|
|
|
|
foreach ($data['exame_avaliado'] as $avaliacao) {
|
|
|
|
$exames[] = 'a_'. $avaliacao['id'];
|
|
}
|
|
|
|
foreach ($data['exame_solicitado']['exames'] as $solicitado) {
|
|
|
|
$exames[] = 's_'. $solicitado['exame_id'];
|
|
}
|
|
|
|
foreach ($soap->solicitacoesExames as $solicitacao) {
|
|
foreach ($solicitacao->itens as $item) {
|
|
|
|
if ($item->exame->codigo) {
|
|
|
|
$exameSolicitado = ExameSolicitadoAvaliado::where('codigo_procedimento', $item->exame->codigo)->first();
|
|
|
|
if ($exameSolicitado) {
|
|
|
|
$exames[] = 's_'. $exameSolicitado->id;
|
|
} else {
|
|
|
|
$exameSolicitado = TriagemNeonatal::where('codigo_procedimento', $item->exame->codigo)->first();
|
|
|
|
if ($exameSolicitado) {
|
|
|
|
$exames[] = 's_'. $exameSolicitado->id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($soap->resultadosExames as $solicitacao) {
|
|
|
|
if ($solicitacao->exame->codigo) {
|
|
|
|
$exameSolicitado = ExameSolicitadoAvaliado::where('codigo_procedimento', $solicitacao->exame->codigo)->first();
|
|
|
|
if ($exameSolicitado) {
|
|
|
|
$exames[] = 'a_'. $exameSolicitado->id;
|
|
} else {
|
|
|
|
$exameSolicitado = TriagemNeonatal::where('codigo_procedimento', $solicitacao->exame->codigo)->first();
|
|
|
|
if ($exameSolicitado) {
|
|
|
|
$exames[] = 'a_'. $exameSolicitado->id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $exames;
|
|
};
|
|
|
|
$getTriagensNeonatal = function () use ($data) {
|
|
|
|
$exames = [];
|
|
|
|
foreach ($data['triagem_neonatal'] as $avaliacao) {
|
|
|
|
$exames[] = 'a_'. $avaliacao['id'];
|
|
}
|
|
|
|
foreach ($data['triagem_neonatal_solicitado']['exames'] as $solicitado) {
|
|
|
|
$exames[] = 's_'. $solicitado['exame_id'];
|
|
}
|
|
|
|
return $exames;
|
|
};
|
|
|
|
$getOutrosExames = function () use ($soap) {
|
|
|
|
$exames = collect();
|
|
|
|
$soap->solicitacoesExames->each(function ($solicitacao) use ($exames) {
|
|
|
|
$solicitacao->itens->each(function ($item) use ($exames) {
|
|
|
|
if (is_null($item->exame->codigo)) {
|
|
|
|
return;
|
|
}
|
|
|
|
$exames->push([
|
|
'exame_id' => $item->exame_id,
|
|
'avaliado' => false,
|
|
'solicitado' => true,
|
|
]);
|
|
});
|
|
});
|
|
|
|
$soap->resultadosExames->each(function ($resultado) use ($exames) {
|
|
|
|
if (is_null($resultado->exame->codigo)) {
|
|
|
|
return;
|
|
}
|
|
|
|
$exames->push([
|
|
'exame_id' => $resultado->exame_id,
|
|
'avaliado' => true,
|
|
'solicitado' => false,
|
|
]);
|
|
});
|
|
|
|
return $exames;
|
|
};
|
|
|
|
$idadeGestacional = ['semanas' => null, 'dias' => null];
|
|
$dataInicioGravidez = AtendimentoService::getDataInicioGravidezNaoResolvida($soap->atendimento->paciente);
|
|
|
|
if (!is_null($dataInicioGravidez)) {
|
|
|
|
$interval = Carbon::today()->diff(Carbon::createFromFormat('d/m/Y', $dataInicioGravidez));
|
|
|
|
$idadeGestacional['semanas'] = (int) floor($interval->days / 7);
|
|
$idadeGestacional['dias'] = $interval->days % 7;
|
|
}
|
|
|
|
$existeSoap = AtendimentoSoap::where('atendimento_id', $soap->atendimento_id)
|
|
->get(['id', 'turno_id'])
|
|
->toArray();
|
|
|
|
$atIndividual = AtendimentoIndividual::whereIn('soap_id', array_column($existeSoap, 'id'))
|
|
->get(['id', 'turno_id', 'data_usuario_responsavel', 'usuario_id']);
|
|
|
|
$atIndId = null;
|
|
|
|
foreach ($atIndividual as $individual) {
|
|
if ($individual->turno_id == $soap->turno_id &&
|
|
$individual->data_usuario_responsavel == $soap->created_at->format('Y-m-d') &&
|
|
$individual->usuario_id == $soap->createdLotacao->usuario_id) {
|
|
|
|
$atIndId = $individual->id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$problemasCondicoes = $soap->problemasCondicoes()
|
|
->where(fn ($q) => $q
|
|
->doesntHave('ciap')
|
|
->orWhereHas('ciap', fn ($q) => $q
|
|
->whereNotIn('codigo', [Ciap::GRAVIDEZ, Ciap::MEDICINA_PREVENTIVA_MANUTENCAO_DA_SAUDE])
|
|
)
|
|
)
|
|
->get()
|
|
->map(function ($problemaCondicao) use ($atIndId) {
|
|
$problemaCondicaoAnteriorId = null;
|
|
|
|
if ($problemaCondicao->problema_condicao_anterior_id) {
|
|
$problemaCondicaoAnteriorId = self::getProblemaCondicaoAnteriorId($problemaCondicao->problema_condicao_anterior_id, $atIndId);
|
|
}
|
|
|
|
return [
|
|
'id' => null,
|
|
'automatico' => $problemaCondicao->automatico,
|
|
'soap_problema_condicao_id' => $problemaCondicao->id,
|
|
'problema_condicao_anterior_id' => $problemaCondicaoAnteriorId,
|
|
'ciap_id' => $problemaCondicao->ciap_id,
|
|
'cid_id' => $problemaCondicao->cid_id,
|
|
'situacao_id' => $problemaCondicao->situacao_id,
|
|
'inicio' => $problemaCondicao->inicio
|
|
? $problemaCondicao->inicio->format('d/m/Y')
|
|
: null,
|
|
'fim' => $problemaCondicao->fim
|
|
? $problemaCondicao->fim->format('d/m/Y')
|
|
: null,
|
|
'observacao' => $problemaCondicao->observacao,
|
|
];
|
|
})
|
|
->toArray();
|
|
|
|
$tipoAtendimentoId = $soap->atendimento_tipo_id;
|
|
|
|
$procedimentos = [
|
|
SigtapProcedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA,
|
|
SigtapProcedimento::TELECONSULTA_POR_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_ESPECIALIZADA_EXCETO_MEDICO,
|
|
SigtapProcedimento::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA,
|
|
];
|
|
|
|
$soap->procedimentos()
|
|
->get()
|
|
->each(function ($soapProcedimento) use (&$tipoAtendimentoId, $procedimentos) {
|
|
if (in_array($soapProcedimento->procedimento->codigo, $procedimentos)) {
|
|
$tipoAtendimentoId = TipoAtendimento::CONSULTA_AGENDADA;
|
|
}
|
|
});
|
|
|
|
AtendimentoIndividualService::saveStore([
|
|
'soap_id' => $soap->id,
|
|
'paciente_id' => $soap->atendimento->paciente->id,
|
|
'complemento' => null,
|
|
'procedimentos' => $getProcedimentos($soap),
|
|
'condicao' => [
|
|
'gestante' => AtendimentoService::isPacienteGestante($soap),
|
|
],
|
|
'cadastro' => [
|
|
'data_usuario_responsavel' => $soap->created_at->format('Y-m-d'),
|
|
'unidade_id' => $soap->equipe->unidade_id,
|
|
'usuario_id' => $soap->createdLotacao->usuario_id,
|
|
'equipe_id' => $soap->equipe_id,
|
|
'ocupacao_id' => $soap->createdLotacao->ocupacao_id,
|
|
'usuario_auxiliar_id' => null,
|
|
'equipe_auxiliar_id' => null,
|
|
'ocupacao_auxiliar_id' => null,
|
|
],
|
|
'atendimento' => [
|
|
'id' => $atIndId,
|
|
'turno_id' => $soap->turno_id,
|
|
'local_atendimento_id' => $soap->atencao_basica_local_atendimento_id,
|
|
'tipo_atendimento_id' => $tipoAtendimentoId,
|
|
'perimetro_cefalico' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_cefalico ?? null,
|
|
'circunferencia_abdominal' => $soap->objetivoAntropometria->atendimentoAntropometria->circunferencia_abdominal ?? null,
|
|
'perimetro_panturrilha' => $soap->objetivoAntropometria->atendimentoAntropometria->perimetro_panturrilha ?? null,
|
|
'peso' => $soap->objetivoAntropometria->atendimentoAntropometria->peso ?? null,
|
|
'altura' => $soap->objetivoAntropometria->atendimentoAntropometria->altura ?? null,
|
|
'temperatura' => $soap->objetivoSinalVital->atendimentoSinalVital->temperatura ?? null,
|
|
'pressao_arterial' => $soap->objetivoSinalVital->atendimentoSinalVital->pressao_arterial ?? null,
|
|
'frequencia_respiratoria' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_respiratoria ?? null,
|
|
'frequencia_cardiaca' => $soap->objetivoSinalVital->atendimentoSinalVital->frequencia_cardiaca ?? null,
|
|
'saturacao_o2' => $soap->objetivoSinalVital->atendimentoSinalVital->saturacao_o2 ?? null,
|
|
'glicemia' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->valor ?? null,
|
|
'momento_coleta_id' => $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->momento_coleta_id ?? null,
|
|
'vacinacao' => $soap->vacinacao_em_dia,
|
|
'modalidade_atencao_domiciliar_id' => null,
|
|
'aleitamento_materno_id' => $soap->puericultura_aleitamento_tipo_id,
|
|
'racionalidade_saude_id' => $soap->racionalidade_saude_id,
|
|
'dum' => $soap->dum ? $soap->dum->format('Y-m-d') : null,
|
|
'idade_gestacional_semanas' => $idadeGestacional['semanas'],
|
|
'idade_gestacional_dias' => $idadeGestacional['dias'],
|
|
'data_possivel_parto' => $getDpp($soap),
|
|
'gravidez_planejada' => $soap->pre_natal_gravidez_planejada,
|
|
'gestacao_previa' => $soap->antecedente->gestas_previas ?? null,
|
|
'parto' => $soap->antecedente->partos_realizados ?? null,
|
|
'problemas_condicoes' => $problemasCondicoes,
|
|
'observacao' => null,
|
|
'condicao_avaliada' => $getCondicoesAvaliadas(),
|
|
'doenca_transmissivel' => $soap->doencasTransmissiveis->pluck('id')->all(),
|
|
'rastreamento' => $soap->rastreamentos->pluck('id')->all(),
|
|
'exame_solicitado_avaliado' => $getExamesAvaliados(),
|
|
'triagem_neonatal' => $getTriagensNeonatal(),
|
|
'outros_exames' => $getOutrosExames(),
|
|
'nasf' => [],
|
|
'conduta' => $soap->condutas->pluck('id')->all(),
|
|
'encaminhamento' => $soap->encaminhamentos->pluck('tipo_id')->all(),
|
|
'ivcf' => array_merge(
|
|
[
|
|
'deseja_preencher' => $soap->ivcf ? true : false,
|
|
],
|
|
$soap->ivcf ? $soap->ivcf->toArray() : [],
|
|
),
|
|
],
|
|
]);
|
|
}
|
|
|
|
private static function getProblemaCondicaoAnteriorId($soapProblemaCondicaoAnteriorId, $atendimentoIndividualId = null)
|
|
{
|
|
$problemaCondicaoAnteriorId = null;
|
|
$problemaCondicaoAnterior = self::getProblemaCondicaoAtendendimentoIndividual($soapProblemaCondicaoAnteriorId, $atendimentoIndividualId);
|
|
|
|
if (!is_null($problemaCondicaoAnterior)) {
|
|
$problemaCondicaoAnteriorId = self::getLastProblemaCondicaoId($problemaCondicaoAnterior->id, $problemaCondicaoAnterior->situacao_id, $atendimentoIndividualId);
|
|
}
|
|
|
|
return $problemaCondicaoAnteriorId;
|
|
}
|
|
|
|
private static function getProblemaCondicaoAtendendimentoIndividual($soapProblemaCondicaoId, $atendimentoIndividualId = null)
|
|
{
|
|
$problemaCondicaoAtendimentoIndividual = DB::table('atencao_basica_atendimento_individual_problema_condicao')
|
|
->when($atendimentoIndividualId, fn ($q) => $q->where('atendimento_individual_id', '<>', $atendimentoIndividualId))
|
|
->where('soap_problema_condicao_id', $soapProblemaCondicaoId)
|
|
->select('id', 'situacao_id')
|
|
->first();
|
|
|
|
if (is_null($problemaCondicaoAtendimentoIndividual)) {
|
|
$problemaCondicaoSoap = DB::table('ambulatorio_atendimento_soap_problema_condicao')
|
|
->where('id', $soapProblemaCondicaoId)
|
|
->select('problema_condicao_anterior_id')
|
|
->first();
|
|
|
|
if (isset($problemaCondicaoSoap->problema_condicao_anterior_id)) {
|
|
return self::getProblemaCondicaoAtendendimentoIndividual($problemaCondicaoSoap->problema_condicao_anterior_id, $atendimentoIndividualId);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
return $problemaCondicaoAtendimentoIndividual;
|
|
}
|
|
|
|
private static function getLastProblemaCondicaoId($id, $situacaoId, $atendimentoIndividualId = null)
|
|
{
|
|
$proximo = DB::table('atencao_basica_atendimento_individual_problema_condicao')
|
|
->when($atendimentoIndividualId, fn ($q) => $q->where('atendimento_individual_id', '<>', $atendimentoIndividualId))
|
|
->where('problema_condicao_anterior_id', $id)
|
|
->select('id', 'situacao_id')
|
|
->first();
|
|
|
|
if (is_null($proximo)) {
|
|
if ($situacaoId == ProblemaCondicaoSituacao::RESOLVIDO) {
|
|
return null;
|
|
}
|
|
else {
|
|
return $id;
|
|
}
|
|
}
|
|
|
|
return self::getLastProblemaCondicaoId($proximo->id, $proximo->situacao_id, $atendimentoIndividualId);
|
|
}
|
|
|
|
public static function storeAtendimentoDomiciliar($soap, $data)
|
|
{
|
|
if (!self::criaFicha($soap, 'atendimento-domiciliar')) {
|
|
|
|
return;
|
|
}
|
|
|
|
$atendimentos = [];
|
|
$problemas_condicoes = [];
|
|
|
|
foreach ($data['problemas_condicoes'] as $problemaCondicao) {
|
|
$problemas_condicoes[] = [
|
|
'id' => $problemaCondicao['id'],
|
|
'ciap' => ['id' => $problemaCondicao['ciap_id']],
|
|
'cid' => ['id' => $problemaCondicao['cid_id']],
|
|
];
|
|
}
|
|
|
|
$atendimentos[] = [
|
|
'data' => $soap->created_at->format('Y-m-d'),
|
|
'paciente_id' => $soap->atendimento->paciente->id,
|
|
'local_atendimento_id' => $soap->atencao_basica_local_atendimento_id,
|
|
'tipo_atendimento_id' => $soap->emad_tipo_atendimento_id,
|
|
'modalidade_id' => $soap->emad_modalidade_id,
|
|
'turno_id' => $soap->turno_id,
|
|
'conduta_desfecho_id' => $soap->emad_conduta_desfecho_id,
|
|
'codigo_cid' => $soap->cid ?? null,
|
|
'codigo_ciap' => $soap->ciap ?? null,
|
|
'procedimentos' => $data['procedimentos_emad'],
|
|
'condicoes' => $data['condicoes_emad'],
|
|
'problemas_condicoes' => $problemas_condicoes,
|
|
'condicao_avaliada' => $data['condicoes_avaliadas'],
|
|
'doenca_transmissivel' => $data['doencas_transmissiveis'],
|
|
'rastreamento' => $data['rastreamentos'],
|
|
'observacao_perfil_epidemiologico' => $soap->observacao_perfil_epidemiologico,
|
|
'perfis_epidemiologicos' => $soap->perfisEpidemiologicos->pluck('id'),
|
|
'ivcf' => array_merge(
|
|
[
|
|
'deseja_preencher' => $soap->ivcf ? true : false,
|
|
],
|
|
$soap->ivcf ? $soap->ivcf->toArray() : [],
|
|
),
|
|
];
|
|
|
|
AtendimentoDomiciliarService::saveStore([
|
|
'soap_id' => $soap->id,
|
|
'data' => $soap->created_at->format('Y-m-d'),
|
|
'usuario_id' => $soap->createdLotacao->usuario_id,
|
|
'equipe_id' => $soap->equipe_id,
|
|
'ocupacao_id' => $soap->createdLotacao->ocupacao_id,
|
|
'usuario_auxiliar_id' => null,
|
|
'equipe_auxiliar_id' => null,
|
|
'ocupacao_auxiliar_id' => null,
|
|
'atendimentos' => $atendimentos,
|
|
]);
|
|
}
|
|
|
|
public static function storeAvaliacao($soap, $data)
|
|
{
|
|
|
|
$hasAvaliacao = Avaliacao::where('paciente_id', $soap->atendimento->paciente->id)->first() ? true : false;
|
|
|
|
if (!self::criaFicha($soap, 'avaliacao') || $hasAvaliacao || !$data['ficha_avaliacao']) {
|
|
|
|
return;
|
|
}
|
|
|
|
AvaliacaoService::saveStore([
|
|
'soap_id' => $soap->id,
|
|
'data' => $soap->created_at->format('Y-m-d'),
|
|
'usuario_id' => $soap->createdLotacao->usuario_id,
|
|
'equipe_id' => $soap->equipe_id,
|
|
'unidade_id' => $soap->createdLotacao->infraestrutura->unidade_id,
|
|
'infraestrutura_id' => $soap->createdLotacao->infraestrutura->id,
|
|
'ocupacao_id' => $soap->createdLotacao->ocupacao_id,
|
|
'usuario_auxiliar_id' => null,
|
|
'equipe_auxiliar_id' => null,
|
|
'ocupacao_auxiliar_id' => null,
|
|
'condicoes' => $data['condicoes_emad'],
|
|
'condicao_avaliada' => $data['condicoes_avaliadas'],
|
|
'data' => $soap->created_at->format('Y-m-d'),
|
|
'paciente_id' => $soap->atendimento->paciente->id,
|
|
'turno_id' => $soap->turno_id,
|
|
'cid_primario' => $soap->emad_cid_primario_id,
|
|
'conclusao_id' => $soap->emad_conclusao_id,
|
|
'procedencia_id' => $soap->emad_procedencia_id,
|
|
'cuidador_id' => $soap->emad_cuidador_id,
|
|
'cpf_cuidador' => $soap->emad_cpf_cuidador,
|
|
'cns_cuidador' => $soap->emad_cns_cuidador,
|
|
'justificativa' => $data['emad_conclusao_justificativa'],
|
|
]);
|
|
}
|
|
|
|
public static function storeMarcadorConsumoAlimentar($soap, $data)
|
|
{
|
|
if (!self::criaFicha($soap, 'marcador-consumo-alimentar')) {
|
|
|
|
return;
|
|
}
|
|
|
|
$existeSoap = AtendimentoSoap::where('atendimento_id', $soap->atendimento_id)
|
|
->get(['id', 'turno_id'])
|
|
->toArray();
|
|
|
|
$mConsumo = MarcadorConsumoAlimentar::whereIn('soap_id', array_column($existeSoap, 'id'))
|
|
->get(['id', 'soap_id','data_atendimento'])
|
|
->map(function ($item) use ($existeSoap) {
|
|
$soap = collect($existeSoap)->firstWhere('id', $item->soap_id);
|
|
$item->turno_id = $soap['turno_id'] ?? null;
|
|
return $item;
|
|
});
|
|
|
|
$marCon = null;
|
|
|
|
foreach ($mConsumo as $marConsumo) {
|
|
if ($marConsumo->turno_id == $soap->turno_id
|
|
&& $marConsumo->data_atendimento == $soap->created_at->format('Y-m-d')) {
|
|
|
|
$marCon = $marConsumo->id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$respostaUnica = array_filter($data['pergunta_unica'], fn ($valor) => $valor !== null);
|
|
$respostaMultipla = array_filter($data['pergunta_multipla'], fn ($valor) => $valor !== null);
|
|
|
|
if ((!empty($respostaUnica) || !empty($respostaMultipla)) && empty($marCon)) {
|
|
|
|
MarcadorConsumoAlimentarService::saveStore([
|
|
'soap_id' => $soap->id,
|
|
'data_atendimento' => $soap->created_at->format('Y-m-d'),
|
|
'local_atendimento' => $soap->atencao_basica_local_atendimento_id,
|
|
'paciente' => $soap->atendimento->paciente->id,
|
|
'usuario' => $soap->createdLotacao->usuario_id,
|
|
'cbo_codigo' => $soap->createdLotacao->ocupacao_id,
|
|
'unidade' => $soap->createdLotacao->infraestrutura->unidade_id,
|
|
'equipe' => $soap->equipe_id,
|
|
'pergunta' => [
|
|
'resposta_unica' => $respostaUnica,
|
|
'resposta_multipla' => $respostaMultipla,
|
|
],
|
|
]);
|
|
}elseif((!empty($respostaUnica) || !empty($respostaMultipla)) && !empty($marCon)) {
|
|
|
|
MarcadorConsumoAlimentarService::update($marCon,[
|
|
'soap_id' => $soap->id,
|
|
'data_atendimento' => $soap->created_at->format('Y-m-d'),
|
|
'local_atendimento' => $soap->atencao_basica_local_atendimento_id,
|
|
'paciente' => $soap->atendimento->paciente->id,
|
|
'usuario' => $soap->createdLotacao->usuario_id,
|
|
'cbo_codigo' => $soap->createdLotacao->ocupacao_id,
|
|
'unidade' => $soap->createdLotacao->infraestrutura->unidade_id,
|
|
'equipe' => $soap->equipe_id,
|
|
'pergunta' => [
|
|
'resposta_unica' => $respostaUnica,
|
|
'resposta_multipla' => $respostaMultipla,
|
|
],
|
|
]);
|
|
}
|
|
}
|
|
|
|
private static function criaFicha($soap, $funcionalidadeIdentificador)
|
|
{
|
|
return ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q
|
|
->where('infraestrutura_id', $soap->createdLotacao->infraestrutura_id)
|
|
)
|
|
->where('ocupacao_id', $soap->createdLotacao->ocupacao_id)
|
|
->whereHas('fichasAtb', fn ($q) => $q
|
|
->where('funcionalidade_id', self::getAtencaoBasicaFuncionalidadeId($funcionalidadeIdentificador))
|
|
)
|
|
->exists();
|
|
}
|
|
|
|
private static function getAtencaoBasicaFuncionalidadeId($identificador)
|
|
{
|
|
return Funcionalidade::whereHas('modulo', fn ($q) => $q
|
|
->where('identificador', 'atencao-basica')
|
|
)
|
|
->where('identificador', $identificador)
|
|
->first('id')->id;
|
|
}
|
|
}
|