Files
rkm-conectasus-ci-sandbox/api/app/Services/Integracao/Esus/GerenciamentoEnvio/Ficha/FichaVisitaDomiciliar.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

340 lines
14 KiB
PHP

<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\VisitaDomiciliar\MotivoVisita as MotivoVisitaEnum;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\VisitaDomiciliar\Desfecho;
use App\Models\AtencaoBasica\VisitaDomiciliar\MomentoColeta;
use App\Models\AtencaoBasica\VisitaDomiciliar\MotivoVisita;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaVisitaDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichavisitadomiciliarmaster');
}
public function __invoke()
{
$path = '//ns4:fichaVisitaDomiciliarMasterTransport';
$this->setProfissional($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissional($fichaVisitaDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaVisitaDomiciliarMasterTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaVisitaDomiciliarMasterTransportPath)
{
$path = "{$fichaVisitaDomiciliarMasterTransportPath}/visitasDomiciliares";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$visitaDomiciliarModel = $this->inconsistenciaModel->visitasDomiciliares()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->visitasDomiciliares->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $visitaDomiciliarModel, $inconsistencias, $posicao);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setAvaliacaoAntropometriza($atendimento, $context, $inconsistencias);
$this->setMotivosVisita($atendimento, $context, $inconsistencias);
$this->setSinaisVitais($atendimento, $context, $inconsistencias);
$this->setGlicemia($atendimento, $context, $inconsistencias);
$this->setDesfecho($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->visitasDomiciliares,
]),
];
}
private function setPaciente($atendimento, $atendimentoContext, $visitaDomiciliarModel, $inconsistencias, $posicao)
{
$campos = (object) [
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoContext),
'nomeCidadao' => $visitaDomiciliarModel->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoContext)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $atendimentoContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoContext)),
'microArea' => $this->getFirstNodeValue('microArea', $atendimentoContext),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stForaArea', $atendimentoContext))),
'posicao' => $posicao
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Microárea', fn () => $inconsistencias->microArea],
['Fora de área', fn () => $inconsistencias->stForaArea],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoContext))->nome
: null,
'tipoDeImovel' => $this->getFirstNodeValue('tipoDeImovel', $atendimentoContext)
? ImovelTipo::where(
'codigo_esus',
$this->getFirstNodeValue('tipoDeImovel', $atendimentoContext)
)->first()->descricao
: null,
'latitude' => $this->getFirstNodeValue('latitude', $atendimentoContext),
'longitude' => $this->getFirstNodeValue('longitude', $atendimentoContext),
'statusVisitaCompartilhadaOutroProfissional' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('statusVisitaCompartilhadaOutroProfissional', $atendimentoContext)
)
),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Tipo de imóvel', fn () => $inconsistencias->tipoDeImovel],
['Latitude', fn () => $inconsistencias->latitude],
['Longitude', fn () => $inconsistencias->longitude],
['Visita compartilhada com outro profissional', fn () => $inconsistencias->statusVisitaCompartilhadaOutroProfissional],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setAvaliacaoAntropometriza($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'pesoAcompanhamentoNutricional' => $this->getFirstNodeValue('pesoAcompanhamentoNutricional', $atendimentoContext),
'alturaAcompanhamentoNutricional' => $this->getFirstNodeValue('alturaAcompanhamentoNutricional', $atendimentoContext),
];
$inconsistencias = $this->getInconsistencias([
['Peso', fn () => $inconsistencias->pesoAcompanhamentoNutricional],
['Altura', fn () => $inconsistencias->alturaAcompanhamentoNutricional],
]);
$atendimento->avaliacao_antropometrica = (object) compact('campos', 'inconsistencias');
}
private function setMotivosVisita($atendimento, $atendimentoContext, $inconsistencias)
{
$motivosVisita = [];
foreach ($this->domx->query('motivosVisita', $atendimentoContext) as $context) {
$motivoVisita = MotivoVisita::where('codigo_esus', $context->nodeValue)->first();
$descricao = null;
if ($this->isMotivoVisitaTipo($motivoVisita->id)) {
$descricao = 'Tipo de visita';
}
else if ($this->isMotivoVisitaBuscaAtiva($motivoVisita->id)) {
$descricao = 'Busca ativa';
}
else if ($this->isMotivoVisitaControleAmbientalVetorial($motivoVisita->id)) {
$descricao = 'Controle ambiental/vetorial';
}
else if ($this->isMotivoVisitaAcompanhamento($motivoVisita->id)) {
$descricao = 'Acompanhamento';
}
else if ($this->isOutroMotivoVisita($motivoVisita->id)) {
$descricao = 'Outros';
}
$motivosVisita[] = "{$descricao}: {$motivoVisita->descricao}";
}
$atendimento->motivos_visita = (object) [
'lista' => $motivosVisita,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->motivosVisita,
]),
];
}
private function isMotivoVisitaTipo($id)
{
return collect([
MotivoVisitaEnum::CADASTRAMENTO_ATUALIZACAO,
MotivoVisitaEnum::VISITA_PERIODICA,
])->contains($id);
}
private function isMotivoVisitaBuscaAtiva($id)
{
return collect([
MotivoVisitaEnum::CONSULTA,
MotivoVisitaEnum::EXAME,
MotivoVisitaEnum::VACINA,
MotivoVisitaEnum::CONDICIONALIDADES_DO_BOLSA_FAMILIA,
])->contains($id);
}
private function isMotivoVisitaControleAmbientalVetorial($id)
{
return collect([
MotivoVisitaEnum::ACAO_EDUCATIVA,
MotivoVisitaEnum::IMOVEL_COM_FOCO,
MotivoVisitaEnum::ACAO_MECANICA,
MotivoVisitaEnum::TRATAMENTO_FOCAL,
])->contains($id);
}
private function isMotivoVisitaAcompanhamento($id)
{
return collect([
MotivoVisitaEnum::GESTANTE,
MotivoVisitaEnum::PUERPERA,
MotivoVisitaEnum::RECEM_NASCIDO,
MotivoVisitaEnum::CRIANCA,
MotivoVisitaEnum::PESSOA_COM_DESNUTRICAO,
MotivoVisitaEnum::PESSOA_EM_REABILITACAO_OU_COM_DEFICIENCIA,
MotivoVisitaEnum::PESSOA_COM_HIPERTENSAO,
MotivoVisitaEnum::PESSOA_COM_DIABETES,
MotivoVisitaEnum::PESSOA_COM_ASMA,
MotivoVisitaEnum::PESSOA_COM_DPOC_ENFISEMA,
MotivoVisitaEnum::PESSOA_COM_CANCER,
MotivoVisitaEnum::PESSOA_COM_OUTRAS_DOENCAS_CRONICAS,
MotivoVisitaEnum::PESSOA_COM_HANSENIASE,
MotivoVisitaEnum::PESSOA_COM_TUBERCULOSE,
MotivoVisitaEnum::SINTOMATICOS_RESPIRATORIOS,
MotivoVisitaEnum::TABAGISTA,
MotivoVisitaEnum::DOMICILIADOS_ACAMADOS,
MotivoVisitaEnum::CONDICOES_DE_VULNERABILIDADE_SOCIAL,
MotivoVisitaEnum::ACOMPANHAMENTO_CONDICIONALIDADES_DO_BOLSA_FAMILIA,
MotivoVisitaEnum::SAUDE_MENTAL,
MotivoVisitaEnum::USUARIO_DE_ALCOOL,
MotivoVisitaEnum::USUARIO_DE_OUTRAS_DROGAS,
])->contains($id);
}
private function isOutroMotivoVisita($id)
{
return collect([
MotivoVisitaEnum::EGRESSO_DE_INTERNACAO,
MotivoVisitaEnum::CONVITE_PARA_ATIVIDADES_COLETIVAS_CAMPANHA_DE_SAUDE,
MotivoVisitaEnum::ORIENTACAO_PREVENCAO,
MotivoVisitaEnum::OUTROS,
])->contains($id);
}
private function setSinaisVitais($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoSistolica', $atendimentoContext)
. '/' . $this->getFirstNodeValue('pressaoDiastolica', $atendimentoContext), '/'),
'temperatura' => $this->getFirstNodeValue('temperatura', $atendimentoContext),
];
$inconsistencias = $this->getInconsistencias([
['Aferição de PA sistólica', fn () => $inconsistencias->pressaoSistolica],
['Aferição de PA diastólica', fn () => $inconsistencias->pressaoDiastolica],
['Temperatura', fn () => $inconsistencias->temperatura],
]);
$atendimento->sinais_vitais = (object) compact('campos', 'inconsistencias');
}
private function setGlicemia($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'glicemia' => $this->getFirstNodeValue('glicemia', $atendimentoContext),
'tipoGlicemia' => !is_null($this->getFirstNodeValue('tipoGlicemia', $atendimentoContext))
? MomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemia', $atendimentoContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Glicemia', fn () => $inconsistencias->glicemia],
['Momento da coleta', fn () => $inconsistencias->tipoGlicemia],
]);
$atendimento->glicemia = (object) compact('campos', 'inconsistencias');
}
private function setDesfecho($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'desfecho' => $this->getFirstNodeValue('desfecho', $atendimentoContext)
? Desfecho::where(
'codigo_esus',
$this->getFirstNodeValue('desfecho', $atendimentoContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Desfecho', fn () => $inconsistencias->desfecho],
]);
$atendimento->desfecho = (object) compact('campos', 'inconsistencias');
}
}