init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,148 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexoEnum;
use App\Enums\Cadastro\SujeitoAtencao\Sexo as SexoEnum;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Utils\DataUtil;
use Carbon\Carbon;
use DOMDocument;
use DOMXPath;
use Exception;
use stdClass;
abstract class Ficha
{
protected $domx;
protected $inconsistenciaModel;
protected $inconsistencias;
protected $ficha;
public function __construct($xmlEnvio, $inconsistenciaModel)
{
$this->setDomx($xmlEnvio);
$this->inconsistenciaModel = $inconsistenciaModel;
$this->inconsistencias = json_decode($inconsistenciaModel->inconsistencia);
$this->ficha = new stdClass;
}
private function setDomx($xml)
{
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($xml);
$this->domx = new DOMXPath($dom);
}
protected function getFirstNodeValue($xmlPath, $context = null)
{
return $this->domx->query($xmlPath, $context)[0]->nodeValue ?? null;
}
protected function getDateString($date)
{
if (is_null($date)) {
return null;
}
return Carbon::createFromTimestamp($date / 1000)->format('d/m/Y');
}
protected function getDateTimeString($date)
{
if (is_null($date)) {
return null;
}
return Carbon::createFromTimestamp($date / 1000)->format('d/m/Y H:i:s');
}
protected function getSimNaoNaoInformado($value)
{
return $value ? DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($value)) : 'Não informado';
}
protected function getSexo($exportacaoSexoId)
{
$sexoId = null;
if ($exportacaoSexoId == ExportacaoSexoEnum::MASCULINO) {
$sexoId = SexoEnum::MASCULINO;
}
else if ($exportacaoSexoId == ExportacaoSexoEnum::FEMININO) {
$sexoId = SexoEnum::FEMININO;
}
else if ($exportacaoSexoId == ExportacaoSexoEnum::INDETERMINADO) {
$sexoId = SexoEnum::INDETERMINADO;
}
else {
return null;
}
return Sexo::find($sexoId)->descricao;
}
protected function getInconsistencias($callbacks)
{
$inconsistencias = [];
foreach ($callbacks as $item) {
$prefix = null;
$inconsistencia = null;
if (is_array($item)) {
$prefix = $item[0];
$inconsistencia = $this->getSafeString($item[1]);
}
else if (is_callable($item)) {
$inconsistencia = $this->getSafeString($item);
}
if (is_null($inconsistencia)) {
continue;
}
if (!is_null($prefix)) {
$inconsistencias[] = "{$prefix}: {$inconsistencia}";
}
else {
$inconsistencias[] = $inconsistencia;
}
}
return $inconsistencias;
}
private function getSafeString($callback)
{
try {
$value = $callback();
if (is_string($value)) {
return $value;
}
}
catch (Exception $_) {
return null;
}
return null;
}
}

View File

@@ -0,0 +1,322 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarCondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\CondutaDesfecho;
use App\Models\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentodomiciliarmaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoDomiciliarMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoDomiciliarMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->atendimentoDomiciliar->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoDomiciliarMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentoDomiciliar->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoDomiciliarMasterTransportPath)
{
$path = "{$fichaAtendimentoDomiciliarMasterTransportPath}/atendimentosDomiciliares";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoModel = $this->inconsistenciaModel->atendimentoDomiciliarAtendimentos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosDomiciliares->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoModel, $inconsistencias);
$this->setCondicoesAvaliadas($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$this->setOutro($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosDomiciliares,
]),
];
}
private function setPaciente($atendimento, $atendimentoDomiciliarContext, $atendimentoModel, $inconsistencias)
{
$campos = (object) [
'nomeCidadao' => $atendimentoModel->paciente->cidadao->nome,
'turno' => $this->getFirstNodeValue('turno', $atendimentoDomiciliarContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoDomiciliarContext))->nome
: null,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoDomiciliarContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoDomiciliarContext)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $atendimentoDomiciliarContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoDomiciliarContext)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoDomiciliarContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoDomiciliarContext))->descricao
: null,
'atencaoDomiciliarModalidade' => $this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoDomiciliarContext)
? ModalidadeAtencaoDomiciliar::where(
'codigo_esus',
$this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoDomiciliarContext)
)->first()->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoDomiciliarContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoDomiciliarContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Modalidade', fn () => $inconsistencias->atencaoDomiciliarModalidade],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setOutro($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$campos = (object) [
'condutaDesfecho' => $this->getFirstNodeValue('condutaDesfecho', $atendimentoDomiciliarContext)
? trim(CondutaDesfecho::where(
'codigo',
$this->getFirstNodeValue('condutaDesfecho', $atendimentoDomiciliarContext)
)->first()->descricao)
: null,
];
$inconsistencias = $this->getInconsistencias([
['Conduta/Desfecho', fn () => $inconsistencias->condutaDesfecho],
]);
$atendimento->outro = (object) compact('campos', 'inconsistencias');
}
private function setCondicoesAvaliadas($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$condicoesAvaliadas = [];
foreach ($this->domx->query('condicoesAvaliadas', $atendimentoDomiciliarContext) as $context) {
$condicoesAvaliadas[] = trim(AtendimentoDomiciliarCondicaoAvaliada::where('codigo', $context->nodeValue)->first()->nome);
}
$atendimento->condicoesAvaliadas = (object) [
'lista' => $condicoesAvaliadas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->condicoesAvaliadas,
]),
];
}
private function setProblemasCondicoes($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoDomiciliarContext) as $i => $context) {
$inconsistenciasProblemaCondicao = [];
if (isset($inconsistencias->problemasCondicoes)) {
if (is_array($inconsistencias->problemasCondicoes)) {
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes[$i] ?? [];
}
else {
$posicao = $i + 1;
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes->{$posicao} ?? [];
}
}
$ciap = $this->getFirstNodeValue('ciap', $context)
? Ciap::where('codigo', $this->getFirstNodeValue('ciap', $context))->first()
: null;
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'campos' => (object) [
'ciap' => $ciap ? "{$ciap->codigo} - {$ciap->descricao}" : null,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['CIAP', fn () => $inconsistenciasProblemaCondicao->ciap],
['CID', fn () => $inconsistenciasProblemaCondicao->cid10],
['Avaliado', fn () => $inconsistenciasProblemaCondicao->isAvaliado],
]),
];
}
$atendimento->problemasCondicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setProcedimentos($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentos', $atendimentoDomiciliarContext) as $context) {
$procedimento = Procedimento::where('codigo', $context->nodeValue)->orderByDesc('competencia_id')->first();
$procedimentos[] = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->procedimentos,
]),
];
}
private function setIvcf($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoDomiciliarContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoDomiciliarContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoDomiciliarContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoDomiciliarContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoDomiciliarContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoDomiciliarContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoDomiciliarContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoDomiciliarContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoDomiciliarContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoDomiciliarContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoDomiciliarContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoDomiciliarContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoDomiciliarContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoDomiciliarContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoDomiciliarContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,550 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\Ambulatorio\ProblemaCondicaoSituacao;
use App\Models\AtencaoBasica\AtendimentoIndividual\AleitamentoMaterno;
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\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\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Parametrizacao\Exame\Exame;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoIndividual extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentoindividualmaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoIndividualMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoIndividualMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoIndividualMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/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("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoIndividualMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoIndividualMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$cns = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS");
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentosIndividuais()
->whereHas('usuarioAuxiliar', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q->where('cns', $cns))
)
->first()->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($cns),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoIndividualMasterTransportPath)
{
$path = "{$fichaAtendimentoIndividualMasterTransportPath}/atendimentosIndividuais";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoIndividualModel = $this->inconsistenciaModel->atendimentosIndividuais()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosIndividuais->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoIndividualModel, $inconsistencias);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setMedicoes($atendimento, $context, $inconsistencias);
$this->setGestante($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setExames($atendimento, $context, $inconsistencias);
$this->setObservacao($atendimento, $context, $inconsistencias);
$this->setEmulti($atendimento, $context, $inconsistencias);
$this->setConduta($atendimento, $context, $inconsistencias);
$this->setSolicitacoesOci($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosIndividuais,
]),
];
}
private function setPaciente($atendimento, $atendimentoIndividualContext, $atendimentoIndividualModel, $inconsistencias)
{
$campos = (object) [
'is_sexo_feminino' => $atendimentoIndividualModel->paciente->cidadao->sexo_id === Sexo::FEMININO,
'nomeCidadao' => $atendimentoIndividualModel->paciente->cidadao->nome,
'numeroProntuario' => $this->getFirstNodeValue('numeroProntuario', $atendimentoIndividualContext),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoIndividualContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoIndividualContext)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $atendimentoIndividualContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoIndividualContext)),
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numeroProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Sexo', fn () => $inconsistencias->sexo],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoIndividualContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoIndividualContext))->nome
: null,
'localDeAtendimento' => $this->getFirstNodeValue('localDeAtendimento', $atendimentoIndividualContext)
? LocalAtendimento::find($this->getFirstNodeValue('localDeAtendimento', $atendimentoIndividualContext))->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoIndividualContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoIndividualContext)
)->first()->descricao
: null,
'vacinaEmDia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('vacinaEmDia', $atendimentoIndividualContext))),
'atencaoDomiciliarModalidade' => $this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoIndividualContext)
? ModalidadeAtencaoDomiciliar::where(
'codigo_esus',
$this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoIndividualContext)
)->first()->descricao
: null,
'aleitamentoMaterno' => $this->getFirstNodeValue('aleitamentoMaterno', $atendimentoIndividualContext)
? AleitamentoMaterno::where(
'codigo_esus',
$this->getFirstNodeValue('aleitamentoMaterno', $atendimentoIndividualContext)
)->first()->descricao
: null,
'racionalidadeSaude' => $this->getFirstNodeValue('racionalidadeSaude', $atendimentoIndividualContext)
? RacionalidadeSaude::where(
'codigo_esus',
$this->getFirstNodeValue('racionalidadeSaude', $atendimentoIndividualContext)
)->first()->descricao
: null,
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoIndividualContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoIndividualContext)),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
['Vacinação em dia', fn () => $inconsistencias->vacinaEmDia],
['Atenção domiciliar', fn () => $inconsistencias->atencaoDomiciliarModalidade],
['Criança - Aleitamento materno', fn () => $inconsistencias->aleitamentoMaterno],
['Racionalidade em saúde (Exceto alopatia / convencional)', fn () => $inconsistencias->racionalidadeSaude],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setMedicoes($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoIndividualContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->medicoes = (object) compact('campos', 'inconsistencias');
}
private function setGestante($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'dumDaGestante' => $this->getDateString(
$this->getFirstNodeValue('dumDaGestante', $atendimentoIndividualContext)),
'idadeGestacional' => $this->getFirstNodeValue('idadeGestacional', $atendimentoIndividualContext),
'stGravidezPlanejada' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stGravidezPlanejada', $atendimentoIndividualContext))),
'nuGestasPrevias' => $this->getFirstNodeValue('nuGestasPrevias', $atendimentoIndividualContext),
'nuPartos' => $this->getFirstNodeValue('nuPartos', $atendimentoIndividualContext),
];
$inconsistencias = $this->getInconsistencias([
['DUM', fn () => $inconsistencias->dumDaGestante],
['Idade gestacional', fn () => $inconsistencias->idadeGestacional],
['Gravidez planejada', fn () => $inconsistencias->stGravidezPlanejada],
['Gestações prévias', fn () => $inconsistencias->nuGestasPrevias],
['Partos', fn () => $inconsistencias->nuPartos],
]);
$atendimento->gestante = (object) compact('campos', 'inconsistencias');
}
private function setProblemasCondicoes($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoIndividualContext) as $i => $context) {
$inconsistenciasProblemaCondicao = [];
if (isset($inconsistencias->problemasCondicoes)) {
if (is_array($inconsistencias->problemasCondicoes)) {
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes[$i] ?? [];
}
else {
$posicao = $i + 1;
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes->{$posicao} ?? [];
}
}
$ciap = null;
if ($this->getFirstNodeValue('ciap', $context)) {
$codigo = $this->getFirstNodeValue('ciap', $context);
if ($ciap = Ciap::where('codigo', $codigo)->first()) {
$ciap = "{$ciap->codigo} - {$ciap->descricao}";
}
else if ($condicaoAvaliada = CondicaoAvaliada::where('codigo_esus', $codigo)->first()) {
$ciap = $condicaoAvaliada->descricao;
}
else if ($doencaTransmissivel = DoencaTransmissivel::where('codigo_esus', $codigo)->first()) {
$ciap = $doencaTransmissivel->descricao;
}
else if ($rastreamento = Rastreamento::where('codigo_esus', $codigo)->first()) {
$ciap = $rastreamento->descricao;
}
}
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'campos' => (object) [
'ciap' => $ciap,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'situacao' => !is_null($this->getFirstNodeValue('situacao', $context))
? ProblemaCondicaoSituacao::where('codigo_esus', $this->getFirstNodeValue('situacao', $context))->first()->nome
: null,
'dataInicioProblema' => $this->getFirstNodeValue('dataInicioProblema', $context)
? $this->getDateString($this->getFirstNodeValue('dataInicioProblema', $context))
: null,
'dataFimProblema' => $this->getFirstNodeValue('dataFimProblema', $context)
? $this->getDateString($this->getFirstNodeValue('dataFimProblema', $context))
: null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['CIAP', fn () => $inconsistenciasProblemaCondicao->ciap],
['CID', fn () => $inconsistenciasProblemaCondicao->cid10],
['Situação', fn () => $inconsistenciasProblemaCondicao->situacao],
['Início', fn () => $inconsistenciasProblemaCondicao->dataInicioProblema],
['Fim', fn () => $inconsistenciasProblemaCondicao->dataFimProblema],
['Avaliado', fn () => $inconsistenciasProblemaCondicao->isAvaliado],
]),
];
}
$atendimento->problemas_condicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setExames($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$exames = [];
foreach ($this->domx->query('exame', $atendimentoIndividualContext) as $context) {
$codigo = $this->getFirstNodeValue('codigoExame', $context);
$exame = (object) [
'is_solicitado' => 'Não',
'is_avaliado' => 'Não',
];
if ($exameSolicitadoAvaliado = ExameSolicitadoAvaliado::where('codigo_esus', $codigo)
->orWhere('codigo_procedimento', $codigo)->first()
) {
$exame->nome = $exameSolicitadoAvaliado->descricao;
}
else {
$parametrizacaoExame = Exame::where('codigo', $codigo)->first();
$exame->nome = $parametrizacaoExame->nome;
}
foreach ($this->domx->query('solicitadoAvaliado', $context) as $contextSolicitadoAvaliado) {
if ($contextSolicitadoAvaliado->nodeValue === 'S') {
$exame->is_solicitado = 'Sim';
}
else if ($contextSolicitadoAvaliado->nodeValue === 'A') {
$exame->is_avaliado = 'Sim';
}
}
$exames[] = $exame;
}
$atendimento->exames = (object) [
'lista' => $exames,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->exame,
]),
];
}
private function setObservacao($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'ficouEmObservacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('ficouEmObservacao', $atendimentoIndividualContext))),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->ficouEmObservacao,
]);
$atendimento->observacao = (object) compact('campos', 'inconsistencias');
}
private function setEmulti($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$emultis = [];
foreach ($this->domx->query('emultis', $atendimentoIndividualContext) as $context) {
$emultis[] = Nasf::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$atendimento->emultis = (object) [
'lista' => $emultis,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->emultis,
]),
];
}
private function setConduta($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$condutas = [];
foreach ($this->domx->query('condutas', $atendimentoIndividualContext) as $context) {
if ($conduta = Conduta::where('codigo_esus', $context->nodeValue)->first()) {
$condutas[] = $conduta->descricao;
}
else if ($encaminhamento = Encaminhamento::where('codigo_esus', $context->nodeValue)->first()) {
$condutas[] = $encaminhamento->descricao;
}
}
$atendimento->condutas = (object) [
'lista' => $condutas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->condutas,
]),
];
}
private function setSolicitacoesOci($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$solicitacoesOci = [];
foreach ($this->domx->query('solicitacoesOci', $atendimentoIndividualContext) as $context) {
$solicitacoesOci[] = (object) [
'codigoSigtap' => MaskUtil::getProcedimentoMasked($this->getFirstNodeValue('codigoSigtap', $context)),
];
}
$atendimento->solicitacoes_oci = (object) [
'lista' => $solicitacoesOci,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->solicitacoesOci,
]),
];
}
private function setIvcf($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoIndividualContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoIndividualContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoIndividualContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoIndividualContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoIndividualContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoIndividualContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoIndividualContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoIndividualContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoIndividualContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoIndividualContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoIndividualContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoIndividualContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoIndividualContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoIndividualContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoIndividualContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,564 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\CondutaEncaminhamento;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\Fornecimento;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\VigilanciaBucal;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Integracao\Esus\Procedimentos as ProcedimentoEsus;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\AtendimentoOdontologico\TipoConsulta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoOdontologico extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentoodontologicomaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoOdontologicoMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoOdontologicoMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoOdontologicoMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/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("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoOdontologicoMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoOdontologicoMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$cns = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS");
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentosOdontologicos()
->whereHas('usuarioAuxiliar', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q->where('cns', $cns))
)
->first()->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($cns),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoOdontologicoMasterTransportPath)
{
$path = "{$fichaAtendimentoOdontologicoMasterTransportPath}/atendimentosOdontologicos";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoOdontologicoModel = $this->inconsistenciaModel->atendimentosOdontologicos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosOdontologicos->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoOdontologicoModel, $inconsistencias);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setVigilancia($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setMedicoes($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$this->setFornecimento($atendimento, $context, $inconsistencias);
$this->setConduta($atendimento, $context, $inconsistencias);
$this->setSolicitacoesOci($atendimento, $context, $inconsistencias);
$this->setExames($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosOdontologicos,
]),
];
}
private function setPaciente($atendimento, $atendimentoOdontologicoContext, $atendimentoOdontologicoModel, $inconsistencias)
{
$campos = (object) [
'is_sexo_feminino' => $atendimentoOdontologicoModel->paciente->cidadao->sexo_id === Sexo::FEMININO,
'nomeCidadao' => $atendimentoOdontologicoModel->paciente->cidadao->nome,
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoOdontologicoContext),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoOdontologicoContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoOdontologicoContext)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $atendimentoOdontologicoContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoOdontologicoContext)),
];
$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],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoOdontologicoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoOdontologicoContext))->nome
: null,
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoOdontologicoContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoOdontologicoContext))->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoOdontologicoContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoOdontologicoContext)
)->first()->descricao
: null,
'tiposConsultaOdonto' => $this->getFirstNodeValue('tiposConsultaOdonto', $atendimentoOdontologicoContext)
? TipoConsulta::where(
'codigo_esus',
$this->getFirstNodeValue('tiposConsultaOdonto', $atendimentoOdontologicoContext)
)->first()->descricao
: null,
'gestante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('gestante', $atendimentoOdontologicoContext))),
'necessidadesEspeciais' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('necessidadesEspeciais', $atendimentoOdontologicoContext))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoOdontologicoContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoOdontologicoContext)),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
['Tipo de consulta', fn () => $inconsistencias->tiposConsultaOdonto],
['Gestante', fn () => $inconsistencias->gestante],
['Necessidades especiais', fn () => $inconsistencias->necessidadesEspeciais],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setVigilancia($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$vigilancias = [];
$getNome = function ($id) {
switch ($id) {
case VigilanciaBucal::ABSCESSO_DENTO_ALVEOLAR: {
return 'Abscesso Dento Alveolar';
}
case VigilanciaBucal::ALTERACAO_EM_TECIDOS_MOLES: {
return 'Alteração em Tecidos Moles';
}
case VigilanciaBucal::DOR_DE_DENTE: {
return 'Dor De Dente';
}
case VigilanciaBucal::FENDAS_FISSURAS_LABIO_PALATAIS: {
return 'Fendas ou Fissuras Lábio Palatais';
}
case VigilanciaBucal::FLUOROSE_DENTARIA_MODERADA_SEVERA: {
return 'Fluorose Dentária Moderada ou Sevéra';
}
case VigilanciaBucal::TRAUMATISMO_DENTO_ALVEOLAR: {
return 'Traumatismo Dento Alveolar';
}
case VigilanciaBucal::NAO_IDENTIFICADO: {
return 'Não Identificado';
}
}
};
foreach ($this->domx->query('tiposVigilanciaSaudeBucal', $atendimentoOdontologicoContext) as $context) {
$vigilancias[] = $getNome($context->nodeValue);
}
$atendimento->vigilancias = (object) [
'lista' => $vigilancias,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposVigilanciaSaudeBucal,
]),
];
}
private function setProblemasCondicoes($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoOdontologicoContext) as $context) {
$ciap = $this->getFirstNodeValue('ciap', $context)
? Ciap::where('codigo', $this->getFirstNodeValue('ciap', $context))->first()
: null;
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'ciap' => $ciap ? "{$ciap->codigo} - {$ciap->descricao}" : null,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
];
}
$atendimento->problemas_condicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setMedicoes($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoOdontologicoContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->medicoes = (object) compact('campos', 'inconsistencias');
}
private function setProcedimentos($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentosRealizados', $atendimentoOdontologicoContext) as $context) {
$codigo = $this->getFirstNodeValue('coMsProcedimento', $context);
if ($codigo === ProcedimentoEsus::ORIENTACAO_EM_SAUDE) {
$descricao = $codigo . " - Orientação Individual em Saúde";
} else {
$procedimento = Procedimento::where('codigo', $codigo)
->orderByDesc('competencia_id')
->first();
$descricao = $procedimento->codigo . " - {$procedimento->nome}";
}
$procedimentos[] = (object) [
'descricao' => $descricao,
'quantidade' => $this->getFirstNodeValue('quantidade', $context),
];
}
$procedimentosCallbacks = [];
$procedimentosRealizados = is_object($inconsistencias) ? ($inconsistencias->procedimentosRealizados ?? null) : null;
if (!empty($procedimentosRealizados)) {
foreach ($procedimentosRealizados as $item) {
foreach ((array) $item as $msg) {
$mensagem = $msg;
$procedimentosCallbacks[] = function () use ($mensagem) {
return $mensagem;
};
}
}
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias($procedimentosCallbacks),
];
}
private function setFornecimento($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$fornecimentos = [];
$getNome = function ($id) {
switch ($id) {
case Fornecimento::ESCOVA_DENTAL: {
return 'Escova Dental';
}
case Fornecimento::CREME_DENTAL: {
return 'Creme Dental';
}
case Fornecimento::FIO_DENTAL: {
return 'Fio Dental';
}
}
};
foreach ($this->domx->query('tiposFornecimOdonto', $atendimentoOdontologicoContext) as $context) {
$fornecimentos[] = $getNome($context->nodeValue);
}
$atendimento->fornecimentos = (object) [
'lista' => $fornecimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposFornecimOdonto,
]),
];
}
private function setConduta($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$condutas = [];
$getNome = function ($id) {
switch ($id) {
case CondutaEncaminhamento::ALTA_EPISODIO: {
return 'Alta do episódio';
}
case CondutaEncaminhamento::RETORNO_CONSULTA_AGENDADA: {
return 'Retorno para Consulta Agendada';
}
case CondutaEncaminhamento::AGENDAMENTO_OUTROS_PROFISSIONAIS: {
return 'Agendamento para Outros Profissionais AB';
}
case CondutaEncaminhamento::AGENDAMENTO_PARA_E_MULTI: {
return 'Agendamento para eMulti';
}
case CondutaEncaminhamento::AGENDAMENTO_GRUPOS: {
return 'Agendamento para Grupos';
}
case CondutaEncaminhamento::TRATAMENTO_CONCLUIDO: {
return 'Tratamento Concluído';
}
case CondutaEncaminhamento::ATENDIMENTO_PACIENTES_NECESSIDADES_ESPECIAIS: {
return 'Encaminhamento: Atendimento à Pacientes com Necessidades Especiais';
}
case CondutaEncaminhamento::CIRURGIA_BMF: {
return 'Encaminhamento: Cirurgia BMF';
}
case CondutaEncaminhamento::ENDODONTIA: {
return 'Encaminhamento: Endodontia';
}
case CondutaEncaminhamento::ESTOMATOLOGIA: {
return 'Encaminhamento: Estomatologia';
}
case CondutaEncaminhamento::IMPLANTODONTIA: {
return 'Encaminhamento: Implantodontia';
}
case CondutaEncaminhamento::ODONTOPEDIATRIA: {
return 'Encaminhamento: Odontopediatria';
}
case CondutaEncaminhamento::ORTODONTIA_ORTOPEDIA: {
return 'Encaminhamento: Ortodontia/Ortopedia';
}
case CondutaEncaminhamento::PERIDONTIA: {
return 'Encaminhamento: Peridontia';
}
case CondutaEncaminhamento::PROTESE_DENTARIA: {
return 'Encaminhamento: Prótese Dentária';
}
case CondutaEncaminhamento::RADIOLOGIA: {
return 'Encaminhamento: Radiologia';
}
case CondutaEncaminhamento::OUTROS: {
return 'Encaminhamento: Outros';
}
}
};
foreach ($this->domx->query('tiposEncamOdonto', $atendimentoOdontologicoContext) as $context) {
$condutas[] = $getNome($context->nodeValue);
}
$atendimento->condutas = (object) [
'lista' => $condutas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposEncamOdonto,
]),
];
}
private function setSolicitacoesOci($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$solicitacoesOci = [];
foreach ($this->domx->query('solicitacoesOci', $atendimentoOdontologicoContext) as $context) {
$solicitacoesOci[] = (object) [
'codigoSigtap' => MaskUtil::getProcedimentoMasked($this->getFirstNodeValue('codigoSigtap', $context)),
];
}
$atendimento->solicitacoes_oci = (object) [
'lista' => $solicitacoesOci,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->solicitacoesOci,
]),
];
}
private function setExames($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$exames = [];
foreach ($this->domx->query('exame', $atendimentoOdontologicoContext) as $context) {
$exames[] = (object) [
'codigoExame' => $this->getFirstNodeValue('codigoExame', $context),
'solicitadoAvaliado' => $this->getFirstNodeValue('solicitadoAvaliado', $context) === 'S' ? 'Solicitado' : 'Avaliado',
];
}
$atendimento->exames = (object) [
'lista' => $exames,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->exame,
]),
];
}
private function setIvcf($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoOdontologicoContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoOdontologicoContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoOdontologicoContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoOdontologicoContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoOdontologicoContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoOdontologicoContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoOdontologicoContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoOdontologicoContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoOdontologicoContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoOdontologicoContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoOdontologicoContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoOdontologicoContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoOdontologicoContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoOdontologicoContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoOdontologicoContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,310 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\AtividadeColetiva\AtividadeTipo as AtividadeColetivaAtividadeTipo;
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeTipo;
use App\Models\AtencaoBasica\AtividadeColetiva\Profissional;
use App\Models\AtencaoBasica\AtividadeColetiva\PublicoAlvo;
use App\Models\AtencaoBasica\AtividadeColetiva\ReuniaoTema;
use App\Models\AtencaoBasica\AtividadeColetiva\SaudePratica;
use App\Models\AtencaoBasica\AtividadeColetiva\SaudeTema;
use App\Models\AtencaoBasica\AtividadeColetiva\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaAtividadeColetiva extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatividadecoletiva');
}
public function __invoke()
{
$path = '//ns4:fichaAtividadeColetivaTransport';
$this->setCadastro($path);
$this->setProfissionalResponsavel($path);
$this->setOutrosProfissionais($path);
$this->setAtividade($path);
$this->setTemasReuniao($path);
$this->setPublicoAlvo($path);
$this->setTemasSaude($path);
$this->setPraticasSaude($path);
$this->setParticipantes($path);
return $this->ficha;
}
private function setCadastro($fichaAtividadeColetivaTransportPath)
{
$headerTransportPath = "{$fichaAtividadeColetivaTransportPath}/headerTransport";
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'pseEducacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/pseEducacao"))),
'pseSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/pseSaude"))),
'inep' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/inep"),
'outraLocalidade' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/outraLocalidade"),
'cnesLocalAtividade' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/cnesLocalAtividade"),
'turno' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/turno")
? Turno::find($this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/turno"))->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['PSE educação', fn () => $this->inconsistencias->pseEducacao],
['PSE saúde', fn () => $this->inconsistencias->pseSaude],
['INEP', fn () => $this->inconsistencias->inep],
['Outra localidade', fn () => $this->inconsistencias->outraLocalidade],
['CNES', fn () => $this->inconsistencias->cnesLocalAtividade],
['Turno', fn () => $this->inconsistencias->turno],
]);
$this->ficha->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalResponsavel($fichaAtividadeColetivaTransportPath)
{
$headerTransportPath = "{$fichaAtividadeColetivaTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->atividadeColetiva->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"),
];
$profissionalInconsistencia = collect($this->inconsistencias->profissionais ?? [])
->pluck('cnsProfissional')
->filter()
->first();
$inconsistencias = $this->getInconsistencias([
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $profissionalInconsistencia],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setOutrosProfissionais($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$profissionais = [];
foreach ($this->domx->query("{$path}/profissionais") as $context) {
$ocupacao = $this->getFirstNodeValue('codigoCbo2002', $context)
? Ocupacao::where('codigo', $this->getFirstNodeValue('codigoCbo2002', $context))->first()
: null;
$profissionais[] = (object) [
'nomeProfissional' => Profissional::where('atividade_coletiva_id', $this->inconsistenciaModel->atividadeColetiva->id)
->whereHas('usuario', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q
->where('cns', $this->getFirstNodeValue('cnsProfissional', $context))
)
)
->first()->usuario->cidadao->nome
?? ($this->inconsistenciaModel->atividadeColetiva->usuario->cidadao->cns
=== $this->getFirstNodeValue('cnsProfissional', $context)
? $this->inconsistenciaModel->atividadeColetiva->usuario->cidadao->nome : null),
'cnsProfissional' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsProfissional', $context)),
'codigoCbo2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
];
}
$this->ficha->outros_profissionais = (object) [
'lista' => $profissionais,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->profissionais,
]),
];
}
private function setAtividade($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$atividadeTipoId = $this->getFirstNodeValue("{$path}/atividadeTipo");
$campos = (object) [
'showTemasReuniao' => collect([
AtividadeColetivaAtividadeTipo::REUNIAO_COM_OUTRAS_EQUIPES_DE_SAUDE,
AtividadeColetivaAtividadeTipo::REUNIAO_DE_EQUIPE,
AtividadeColetivaAtividadeTipo::REUNIAO_INTERSETORIAL_CONSELHO_LOCAL_DE_SAUDE_CONTROLE_SOCIAL,
])->contains($atividadeTipoId),
'showPublicoAlvoTemasSaude' => collect([
AtividadeColetivaAtividadeTipo::EDUCACAO_EM_SAUDE,
AtividadeColetivaAtividadeTipo::ATENDIMENTO_EM_GRUPO,
AtividadeColetivaAtividadeTipo::AVALIACAO_PROCEDIMENTO_COLETIVO,
AtividadeColetivaAtividadeTipo::MOBILIZACAO_SOCIAL,
])->contains($atividadeTipoId),
'showPraticasSaude' => collect([
AtividadeColetivaAtividadeTipo::ATENDIMENTO_EM_GRUPO,
AtividadeColetivaAtividadeTipo::AVALIACAO_PROCEDIMENTO_COLETIVO,
])->contains($atividadeTipoId),
'atividadeTipo' => $atividadeTipoId
? AtividadeTipo::find($atividadeTipoId)->descricao
: null,
'numParticipantes' => $this->getFirstNodeValue("{$path}/numParticipantes"),
'numAvaliacoesAlteradas' => $this->getFirstNodeValue("{$path}/numAvaliacoesAlteradas"),
];
$inconsistencias = $this->getInconsistencias([
['Atividade', fn () => $this->inconsistencias->atividadeTipo],
['Participantes', fn () => $this->inconsistencias->numParticipantes],
['Avaliações alteradas', fn () => $this->inconsistencias->numAvaliacoesAlteradas],
]);
$this->ficha->atividade = (object) compact('campos', 'inconsistencias');
}
private function setTemasReuniao($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$temas = [];
foreach ($this->domx->query("{$path}/temasParaReuniao") as $context) {
$temas[] = ReuniaoTema::find($context->nodeValue)->descricao;
}
$this->ficha->temas_reuniao = (object) [
'lista' => $temas,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->temasParaReuniao,
]),
];
}
private function setPublicoAlvo($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$publicosAlvos = [];
foreach ($this->domx->query("{$path}/publicoAlvo") as $context) {
$publicosAlvos[] = PublicoAlvo::find($context->nodeValue)->descricao;
}
$this->ficha->publico_alvo = (object) [
'lista' => $publicosAlvos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->publicoAlvo,
]),
];
}
private function setTemasSaude($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$temasSaude = [];
foreach ($this->domx->query("{$path}/temasParaSaude") as $context) {
$temasSaude[] = SaudeTema::find($context->nodeValue)->descricao;
}
$this->ficha->temas_saude = (object) [
'lista' => $temasSaude,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->temasParaSaude,
]),
];
}
private function setPraticasSaude($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$praticasSaude = [];
foreach ($this->domx->query("{$path}/praticasEmSaude") as $context) {
$praticasSaude[] = SaudePratica::find($context->nodeValue)->descricao;
}
$this->ficha->praticas_saude = (object) [
'lista' => $praticasSaude,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->praticasEmSaude,
]),
];
}
private function setParticipantes($fichaAtividadeColetivaTransportPath)
{
$path = "{$fichaAtividadeColetivaTransportPath}/participantes";
$participantes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$participanteModel = $this->inconsistenciaModel->atividadeColetivaParticipantes()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->participantes->{$posicao} ?? [];
$participantes[] = (object) [
'campos' => (object) [
'nomeParticipante' => $participanteModel->paciente->cidadao->nome,
'cnsParticipante' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsParticipante', $context)),
'cpfParticipante' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfParticipante', $context)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $context)),
'avaliacaoAlterada' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('avaliacaoAlterada', $context))),
'peso' => $this->getFirstNodeValue('peso', $context),
'altura' => $this->getFirstNodeValue('altura', $context),
'cessouHabitoFumar' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('cessouHabitoFumar', $context))),
'abandonouGrupo' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('abandonouGrupo', $context))),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $context)),
],
'inconsistencias' => $this->getInconsistencias([
['CNS', fn () => $inconsistencias->cnsParticipante],
['CPF', fn () => $inconsistencias->cpfParticipante],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Alterada', fn () => $inconsistencias->avaliacaoAlterada],
['Peso', fn () => $inconsistencias->peso],
['Altura', fn () => $inconsistencias->altura],
['Parou de fumar', fn () => $inconsistencias->cessouHabitoFumar],
['Abandonou grupo', fn () => $inconsistencias->abandonouGrupo],
['Sexo', fn () => $inconsistencias->sexo],
]),
];
}
$this->ficha->participantes = (object) [
'lista' => $participantes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->participantes,
]),
];
}
}

View File

@@ -0,0 +1,311 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Avaliacao\Conclusao as AvaliacaoConclusao;
use App\Enums\AtencaoBasica\Avaliacao\Cuidador as AvaliacaoCuidador;
use App\Models\AtencaoBasica\Avaliacao\Conclusao;
use App\Models\AtencaoBasica\Avaliacao\CondicaoAvaliada;
use App\Models\AtencaoBasica\Avaliacao\Cuidador;
use App\Models\AtencaoBasica\Avaliacao\JustificativaConclusao;
use App\Models\AtencaoBasica\Avaliacao\Procedencia;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\SujeitoAtencao\EtniaIndigena;
use App\Models\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Models\Cadastro\SujeitoAtencao\RacaCor;
use App\Models\Geral\Turno;
use App\Models\Intranet\Estado;
use App\Models\Intranet\Pais;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaAvaliacao extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaavaliacaoelegibilidade');
}
public function __invoke()
{
$path = '//ns4:fichaAvaliacaoElegibilidadeTransport';
$this->setPaciente($path);
$this->setProfissional($path);
$this->setCondicoesAvalidas($path);
$this->setCid($path);
$this->setConclusao($path);
$this->setCuidador($path);
return $this->ficha;
}
private function setPaciente($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$campos = (object) [
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'dataNascimentoCidadao' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimentoCidadao")),
'sexoCidadao' => $this->getSexo($this->getFirstNodeValue("{$path}/sexoCidadao")),
'nomeCidadao' => $this->getFirstNodeValue("{$path}/nomeCidadao"),
'racaCorCidadao' => $this->getFirstNodeValue("{$path}/racaCorCidadao")
? RacaCor::where('codigo_esus', $this->getFirstNodeValue("{$path}/racaCorCidadao"))->first()->descricao
: null,
'nomeSocialCidadao' => $this->getFirstNodeValue("{$path}/nomeSocialCidadao"),
'nomeMaeCidadao' => $this->getFirstNodeValue("{$path}/nomeMaeCidadao"),
'desconheceNomeMae' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/desconheceNomeMae"))),
'codigoIbgeMunicipioNascimento' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipioNascimento"),
'nacionalidadeCidadao' => $this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
? Nacionalidade::where(
'codigo_esus',
$this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
)->first()->descricao
: null,
'emailCidadao' => $this->getFirstNodeValue("{$path}/emailCidadao"),
'numeroNisPisPasep' => $this->getFirstNodeValue("{$path}/numeroNisPisPasep"),
'nomePaiCidadao' => $this->getFirstNodeValue("{$path}/nomePaiCidadao"),
'desconheceNomePai' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/desconheceNomePai"))),
'dtNaturalizacao' => $this->getDateString($this->getFirstNodeValue("{$path}/dtNaturalizacao")),
'portariaNaturalizacao' => $this->getFirstNodeValue("{$path}/portariaNaturalizacao"),
'dtEntradaBrasil' => $this->getDateString($this->getFirstNodeValue("{$path}/dtEntradaBrasil")),
'paisNascimento' => $this->getFirstNodeValue("{$path}/paisNascimento")
? Pais::where('codigo_esus', $this->getFirstNodeValue("{$path}/paisNascimento"))->first()->nome
: null,
'etnia' => $this->getFirstNodeValue("{$path}/etnia")
? EtniaIndigena::where('codigo_cadsus', $this->getFirstNodeValue("{$path}/etnia"))->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $this->inconsistencias->dataNascimentoCidadao],
['Sexo', fn () => $this->inconsistencias->sexoCidadao],
['Nome', fn () => $this->inconsistencias->nomeCidadao],
['Raça/cor', fn () => $this->inconsistencias->racaCorCidadao],
['Nome social', fn () => $this->inconsistencias->nomeSocialCidadao],
['Nome da mãe', fn () => $this->inconsistencias->nomeMaeCidadao],
['Desconhece mãe', fn () => $this->inconsistencias->desconheceNomeMae],
['IBGE (Nascimento)', fn () => $this->inconsistencias->codigoIbgeMunicipioNascimento],
['Nacionalidade', fn () => $this->inconsistencias->nacionalidadeCidadao],
['E-mail', fn () => $this->inconsistencias->emailCidadao],
['PIS / PASEP | NIS', fn () => $this->inconsistencias->numeroNisPisPasep],
['Nome do pai', fn () => $this->inconsistencias->nomePaiCidadao],
['Desconhece pai', fn () => $this->inconsistencias->desconheceNomePai],
['Data de naturalização', fn () => $this->inconsistencias->dtNaturalizacao],
['Portaria de naturalização', fn () => $this->inconsistencias->portariaNaturalizacao],
['Data de entrada no Brasil', fn () => $this->inconsistencias->dtEntradaBrasil],
['País de nascimento', fn () => $this->inconsistencias->paisNascimento],
['Etnia', fn () => $this->inconsistencias->etnia],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
$this->setPacienteEndereco($path);
}
private function setPacienteEndereco($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = "{$fichaAvaliacaoElegibilidadeTransportPath}/endereco";
$campos = (object) [
'bairro' => $this->getFirstNodeValue("{$path}/bairro"),
'cep' => MaskUtil::getCepMasked($this->getFirstNodeValue("{$path}/cep")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipio"),
'complemento' => $this->getFirstNodeValue("{$path}/complemento"),
'nomeLogradouro' => $this->getFirstNodeValue("{$path}/nomeLogradouro"),
'numero' => $this->getFirstNodeValue("{$path}/numero"),
'numeroDneUf' => $this->getFirstNodeValue("{$path}/numeroDneUf")
? Estado::where('codigo', $this->getFirstNodeValue("{$path}/numeroDneUf"))->first()->uf
: null,
'telefoneContato' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneContato")),
'tipoLogradouroNumeroDne' => $this->getFirstNodeValue("{$path}/tipoLogradouroNumeroDne")
? LogradouroTipo::where(
'codigo',
$this->getFirstNodeValue("{$path}/tipoLogradouroNumeroDne")
)->first()->descricao
: null,
'stSemNumero' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/stSemNumero"))),
'pontoReferencia' => $this->getFirstNodeValue("{$path}/pontoReferencia"),
];
$inconsistencias = $this->getInconsistencias([
fn () => $this->inconsistencias->endereco,
['Bairro', fn () => $this->inconsistencias->endereco->bairro],
['CEP', fn () => $this->inconsistencias->endereco->cep],
['IBGE', fn () => $this->inconsistencias->endereco->codigoIbgeMunicipio],
['Complemento', fn () => $this->inconsistencias->endereco->complemento],
['Logradouro', fn () => $this->inconsistencias->endereco->nomeLogradouro],
['Número', fn () => $this->inconsistencias->endereco->numero],
['UF', fn () => $this->inconsistencias->endereco->numeroDneUf],
['Telefone', fn () => $this->inconsistencias->endereco->telefoneContato],
['Tipo de logradouro', fn () => $this->inconsistencias->endereco->tipoLogradouroNumeroDne],
['Sem número', fn () => $this->inconsistencias->endereco->stSemNumero],
['Ponto de referência', fn () => $this->inconsistencias->endereco->pontoReferencia],
]);
$this->ficha->paciente->campos->endereco = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($fichaAvaliacaoElegibilidadeTransportPath)
{
$headerTransportPath = "{$fichaAvaliacaoElegibilidadeTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'turno' => $this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/turno")
? Turno::find($this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/turno"))->nome
: null,
'atencaoDomiciliarProcedencia' => $this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/atencaoDomiciliarProcedencia")
? Procedencia::find($this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/atencaoDomiciliarProcedencia"))->descricao
: null,
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->avaliacao->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $this->inconsistencias->turno],
['Procedência', fn () => $this->inconsistencias->atencaoDomiciliarProcedencia],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setCondicoesAvalidas($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = "{$fichaAvaliacaoElegibilidadeTransportPath}/condicoesAvaliadas";
$condicoesAvaliadas = [];
foreach ($this->domx->query($path) as $context) {
$condicoesAvaliadas[] = CondicaoAvaliada::find($context->nodeValue)->descricao;
}
$this->ficha->condicoesAvaliadas = (object) [
'lista' => $condicoesAvaliadas,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->condicoesAvaliadas
]),
];
}
private function setCid($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$cidPrincipal = $this->getFirstNodeValue("{$path}/cid10Principal")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10Principal"))->first()
: null;
$cidSecundarioUm = $this->getFirstNodeValue("{$path}/cid10SecundarioUm")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10SecundarioUm"))->first()
: null;
$cidSecundarioDois = $this->getFirstNodeValue("{$path}/cid10SecundarioDois")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10SecundarioDois"))->first()
: null;
$campos = (object) [
'cid10Principal' => $cidPrincipal
? MaskUtil::getCidMasked($cidPrincipal->codigo) . " - {$cidPrincipal->nome}"
: null,
'cid10SecundarioUm' => $cidSecundarioUm
? MaskUtil::getCidMasked($cidSecundarioUm->codigo) . " - {$cidSecundarioUm->nome}"
: null,
'cid10SecundarioDois' => $cidSecundarioDois
? MaskUtil::getCidMasked($cidSecundarioDois->codigo) . " - {$cidSecundarioDois->nome}"
: null,
];
$inconsistencias = $this->getInconsistencias([
['CID Primário', fn () => $this->inconsistencias->cid10Principal],
['CID Secundário', fn () => $this->inconsistencias->cid10SecundarioUm],
['CID Terciário', fn () => $this->inconsistencias->cid10SecundarioDois],
]);
$this->ficha->cid = (object) compact('campos', 'inconsistencias');
}
private function setConclusao($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$conclusao = $this->getFirstNodeValue("{$path}/atencaoDomiciliarModalidade")
? Conclusao::find($this->getFirstNodeValue("{$path}/atencaoDomiciliarModalidade"))
: null;
$campos = (object) [
'atencaoDomiciliarModalidade' => $conclusao->descricao ?? null,
'elegivel' => ($conclusao->id ?? null) !== AvaliacaoConclusao::INELEGIVEL,
'conclusaoDestinoInelegivel' => $this->getFirstNodeValue("{$path}/conclusaoDestinoInelegivel")
? JustificativaConclusao::where(
'codigo',
$this->getFirstNodeValue("{$path}/conclusaoDestinoInelegivel")
)->first()->descricao
: null,
'conclusaoDestinoElegivel' => $this->getFirstNodeValue("{$path}/conclusaoDestinoElegivel")
? JustificativaConclusao::where(
'codigo',
$this->getFirstNodeValue("{$path}/conclusaoDestinoElegivel")
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Conclusão', fn () => $this->inconsistencias->atencaoDomiciliarModalidade],
fn () => $this->inconsistencias->conclusaoDestinoInelegivel,
fn () => $this->inconsistencias->conclusaoDestinoElegivel,
]);
$this->ficha->conclusao = (object) compact('campos', 'inconsistencias');
}
private function setCuidador($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$cuidador = $this->getFirstNodeValue("{$path}/cuidadorCidadao")
? Cuidador::find($this->getFirstNodeValue("{$path}/cuidadorCidadao"))
: null;
$campos = (object) [
'cuidadorCidadao' => $cuidador->descricao ?? null,
'possuiCuidador' => ($cuidador->id ?? null) !== AvaliacaoCuidador::NAO_POSSUI,
'cnsCuidador' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCuidador")),
'cpfCuidador' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCuidador")),
];
$inconsistencias = $this->getInconsistencias([
['Cuidador', fn () => $this->inconsistencias->cuidadorCidadao],
['CNS', fn () => $this->inconsistencias->cnsCuidador],
['CPF', fn () => $this->inconsistencias->cpfCuidador],
]);
$this->ficha->cuidador = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,377 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\CadastroDomiciliar\ImovelTipo as CadastroDomiciliarImovelTipo;
use App\Enums\AtencaoBasica\Exportacao\SalarioMinimo;
use App\Models\AtencaoBasica\CadastroDomiciliar\Abastecimento;
use App\Models\AtencaoBasica\CadastroDomiciliar\Animal;
use App\Models\AtencaoBasica\CadastroDomiciliar\DestinoLixo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipoAcesso;
use App\Models\AtencaoBasica\CadastroDomiciliar\FormaEscoamento;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\MaterialPredominante;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoDomicilio;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoRural;
use App\Models\AtencaoBasica\CadastroDomiciliar\Tratamento;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\Localizacao\Zona;
use App\Models\Intranet\Estado;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaCadastroDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/cadastrodomiciliar');
}
public function __invoke()
{
$path = '//ns4:cadastroDomiciliarTransport';
$this->setEndereco($path);
$this->setRecusaCadastro($path);
$this->setResidencia($path);
$this->setProfissional($path);
$this->setResidentes($path);
$this->setInstituicaoPermanencia($path);
return $this->ficha;
}
private function setEndereco($cadastroDomiciliarTransportPath)
{
$enderecoLocalPermanenciaPath = "{$cadastroDomiciliarTransportPath}/enderecoLocalPermanencia";
$campos = (object) [
'latitude' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/latitude"),
'longitude' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/longitude"),
'bairro' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/bairro"),
'cep' => MaskUtil::getCepMasked($this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/cep")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/codigoIbgeMunicipio"),
'complemento' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/complemento"),
'nomeLogradouro' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/nomeLogradouro"),
'numero' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numero"),
'numeroDneUf' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numeroDneUf")
? Estado::where('codigo', $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numeroDneUf"))
->first()->uf
: null,
'telefoneContato' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/telefoneContato")),
'tipoLogradouroNumeroDne' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/tipoLogradouroNumeroDne")
? LogradouroTipo::where('codigo', $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/tipoLogradouroNumeroDne"))
->first()->descricao
: null,
'stSemNumero' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/stSemNumero"))),
'pontoReferencia' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/pontoReferencia"),
'microArea' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/microArea"),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/stForaArea"))),
];
$inconsistencias = $this->getInconsistencias([
['Latitude', fn () => $this->inconsistencias->latitude],
['Longitude', fn () => $this->inconsistencias->longitude],
['Bairro', fn () => $this->inconsistencias->enderecoLocalPermanencia->bairro],
['CEP', fn () => $this->inconsistencias->enderecoLocalPermanencia->cep],
['IBGE', fn () => $this->inconsistencias->enderecoLocalPermanencia->codigoIbgeMunicipio],
['Complemento', fn () => $this->inconsistencias->enderecoLocalPermanencia->complemento],
['Logradouro', fn () => $this->inconsistencias->enderecoLocalPermanencia->nomeLogradouro],
['Número', fn () => $this->inconsistencias->enderecoLocalPermanencia->numero],
['UF', fn () => $this->inconsistencias->enderecoLocalPermanencia->numeroDneUf],
['Telefone', fn () => $this->inconsistencias->enderecoLocalPermanencia->telefoneContato],
['Tipo de logradouro', fn () => $this->inconsistencias->enderecoLocalPermanencia->tipoLogradouroNumeroDne],
['Sem número', fn () => $this->inconsistencias->enderecoLocalPermanencia->stSemNumero],
['Ponto de referência', fn () => $this->inconsistencias->enderecoLocalPermanencia->pontoReferencia],
['Microárea', fn () => $this->inconsistencias->enderecoLocalPermanencia->microArea],
['Fora de área', fn () => $this->inconsistencias->enderecoLocalPermanencia->stForaArea],
]);
$this->ficha->endereco = (object) compact('campos', 'inconsistencias');
}
private function setRecusaCadastro($cadastroDomiciliarTransportPath)
{
$path = $cadastroDomiciliarTransportPath;
$campos = (object) [
'statusTermoRecusa' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTermoRecusa"))),
];
$inconsistencias = $this->getInconsistencias([
[
'Usuário recusou o cadastro por meio do termo de Recusa do Cadastro',
fn () => $this->inconsistencias->statusTermoRecusa
],
]);
$this->ficha->recusa_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setResidencia($cadastroDomiciliarTransportPath)
{
$condicaoMoradiaPath = "{$cadastroDomiciliarTransportPath}/condicaoMoradia";
$tipoImovel = $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/tipoDeImovel")
? ImovelTipo::where('codigo_esus', $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/tipoDeImovel"))
->first()
: null;
$campos = (object) [
'showInstituicaoPermanencia' => collect([
CadastroDomiciliarImovelTipo::ABRIGO,
CadastroDomiciliarImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS,
CadastroDomiciliarImovelTipo::UNIDADE_PRISIONAL,
CadastroDomiciliarImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA,
CadastroDomiciliarImovelTipo::DELEGACIA
])->contains($tipoImovel->id ?? null),
'showResidentes' => ($tipoImovel->id ?? null) === CadastroDomiciliarImovelTipo::DOMICILIO,
'tipoDeImovel' => $tipoImovel->descricao ?? null,
'quantosAnimaisNoDomicilio' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/quantosAnimaisNoDomicilio"),
'stAnimaisNoDomicilio' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/stAnimaisNoDomicilio"))),
'abastecimentoAgua' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/abastecimentoAgua")
? Abastecimento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/abastecimentoAgua"))
->first()->descricao
: null,
'areaProducaoRural' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/areaProducaoRural")
? SituacaoRural::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/areaProducaoRural"))
->first()->descricao
: null,
'destinoLixo' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/destinoLixo")
? DestinoLixo::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/destinoLixo"))
->first()->descricao
: null,
'formaEscoamentoBanheiro' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/formaEscoamentoBanheiro")
? FormaEscoamento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/formaEscoamentoBanheiro"))
->first()->descricao
: null,
'localizacao' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/localizacao")
? Zona::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/localizacao"))->first()->descricao
: null,
'materialPredominanteParedesExtDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/materialPredominanteParedesExtDomicilio")
? MaterialPredominante::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/materialPredominanteParedesExtDomicilio"))
->first()->descricao
: null,
'nuComodos' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/nuComodos"),
'nuMoradores' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/nuMoradores"),
'situacaoMoradiaPosseTerra' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/situacaoMoradiaPosseTerra")
? SituacaoDomicilio::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/situacaoMoradiaPosseTerra"))
->first()->descricao
: null,
'stDisponibilidadeEnergiaEletrica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$condicaoMoradiaPath}/stDisponibilidadeEnergiaEletrica"))),
'tipoAcessoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoAcessoDomicilio")
? DomicilioTipoAcesso::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoAcessoDomicilio"))
->first()->descricao
: null,
'tipoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoDomicilio")
? DomicilioTipo::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoDomicilio"))
->first()->descricao
: null,
'aguaConsumoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/aguaConsumoDomicilio")
? Tratamento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/aguaConsumoDomicilio"))
->first()->descricao
: null,
];
$animaisNoDomicilio = [];
foreach ($this->domx->query("{$cadastroDomiciliarTransportPath}/animaisNoDomicilio") as $context) {
$animaisNoDomicilio[] = Animal::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->animaisNoDomicilio = collect($animaisNoDomicilio)->join(', ');
$inconsistencias = $this->getInconsistencias([
['Tipo do imóvel', fn () => $this->inconsistencias->tipoDeImovel],
['Animais', fn () => $this->inconsistencias->animaisNoDomicilio],
['Quantidade', fn () => $this->inconsistencias->quantosAnimaisNoDomicilio],
['Possui animais?', fn () => $this->inconsistencias->stAnimaisNoDomicilio],
['Abastecimento de água', fn () => $this->inconsistencias->condicaoMoradia->abastecimentoAgua],
['Situação rural', fn () => $this->inconsistencias->condicaoMoradia->areaProducaoRural],
['Destino do lixo', fn () => $this->inconsistencias->condicaoMoradia->destinoLixo],
['Forma de escoamento sanitário', fn () => $this->inconsistencias->condicaoMoradia->formaEscoamentoBanheiro],
['Zona', fn () => $this->inconsistencias->condicaoMoradia->localizacao],
['Material predominante - paredes externas', fn () => $this->inconsistencias->condicaoMoradia->materialPredominanteParedesExtDomicilio],
['Cômodos', fn () => $this->inconsistencias->condicaoMoradia->nuComodos],
['Moradores', fn () => $this->inconsistencias->condicaoMoradia->nuMoradores],
['Situação', fn () => $this->inconsistencias->condicaoMoradia->situacaoMoradiaPosseTerra],
['Disponibilidade de energia elétrica', fn () => $this->inconsistencias->condicaoMoradia->stDisponibilidadeEnergiaEletrica],
['Tipo de acesso ao domicílio', fn () => $this->inconsistencias->condicaoMoradia->tipoAcessoDomicilio],
['Tipo de domicílio', fn () => $this->inconsistencias->condicaoMoradia->tipoDomicilio],
['Tratamento de água', fn () => $this->inconsistencias->condicaoMoradia->aguaConsumoDomicilio],
]);
$this->ficha->residencia = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($cadastroDomiciliarTransportPath)
{
$headerTransportPath = "{$cadastroDomiciliarTransportPath}/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->cadastroDomiciliar->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 setResidentes($cadastroDomiciliarTransportPath)
{
$path = "{$cadastroDomiciliarTransportPath}/familias";
$residentes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$paciente = $this->inconsistenciaModel->cadastroDomiciliarPacientes()
->wherePivot('posicao', $posicao)
->first();
$residentes[] = (object) [
'nome' => $paciente->cidadao->nome,
'dataNascimentoResponsavel' => $this->getDateString($this->getFirstNodeValue('dataNascimentoResponsavel', $context)),
'numeroCnsResponsavel' => MaskUtil::getCnsMasked($this->getFirstNodeValue('numeroCnsResponsavel', $context)),
'cpfResponsavel' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfResponsavel', $context)),
'numeroMembrosFamilia' => $this->getFirstNodeValue('numeroMembrosFamilia', $context),
'numeroProntuario' => $this->getFirstNodeValue('numeroProntuario', $context),
'rendaFamiliar' => $this->getRendaFamiliar($this->getFirstNodeValue('rendaFamiliar', $context)),
];
}
$this->ficha->residentes = (object) [
'lista' => $residentes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->familias,
])
];
}
private function getRendaFamiliar($rendaId)
{
switch ($rendaId) {
case SalarioMinimo::UM_QUARTO_SALARIO_MINIMO: {
return 'Um quarto do salário mínimo';
}
case SalarioMinimo::MEIO_SALARIO_MINIMO: {
return 'Meio salário mínimo';
}
case SalarioMinimo::UM_QUARTO_SALARIO_MINIMO: {
return 'Um quarto do salário mínimo';
}
case SalarioMinimo::DOIS_SALARIO_MINIMO: {
return 'Dois salários mínimos';
}
case SalarioMinimo::TRES_SALARIO_MINIMO: {
return 'Três salários mínimos';
}
case SalarioMinimo::QUATRO_SALARIO_MINIMO: {
return 'Quatro salários mínimos';
}
case SalarioMinimo::ACIMA_QUATRO_SALARIO_MINIMO: {
return 'Acima de quatro salários mínimos';
}
default: {
return null;
}
}
}
private function setInstituicaoPermanencia($cadastroDomiciliarTransportPath)
{
$path = "{$cadastroDomiciliarTransportPath}/instituicaoPermanencia";
$campos = (object) [
'nomeInstituicaoPermanencia' => $this->getFirstNodeValue("{$path}/nomeInstituicaoPermanencia"),
'stOutrosProfissionaisVinculados' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/stOutrosProfissionaisVinculados"))),
];
$inconsistencias = $this->getInconsistencias([
[
'Nome da instituição de permanência',
fn () => $this->inconsistencias->instituicaoPermanencia->nomeInstituicaoPermanencia
],
[
'Existem outros profissionais de saúde vinculados à instituição (não inclui profissionais da rede pública de saúde)?',
fn () => $this->inconsistencias->instituicaoPermanencia->stOutrosProfissionaisVinculados
],
]);
$this->ficha->instituicao_permanencia = (object) compact('campos', 'inconsistencias');
$this->setIdentificacaoResponsavelTecnico($path);
}
private function setIdentificacaoResponsavelTecnico($instituicaoPermanenciaPath)
{
$path = $instituicaoPermanenciaPath;
$campos = (object) [
'nomeResponsavelTecnico' => $this->getFirstNodeValue("{$path}/nomeResponsavelTecnico"),
'cnsResponsavelTecnico' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsResponsavelTecnico")),
'cargoInstituicao' => $this->getFirstNodeValue("{$path}/cargoInstituicao"),
'telefoneResponsavelTecnico' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneResponsavelTecnico")),
];
$inconsistencias = $this->getInconsistencias([
[
'Responsável técnico pela instituição',
fn () => $this->inconsistencias->instituicaoPermanencia->nomeResponsavelTecnico
],
[
'CNS do responsável',
fn () => $this->inconsistencias->instituicaoPermanencia->cnsResponsavelTecnico
],
[
'Cargo na instituição',
fn () => $this->inconsistencias->instituicaoPermanencia->cargoInstituicao
],
[
'Telefone de contato',
fn () => $this->inconsistencias->instituicaoPermanencia->telefoneResponsavelTecnico
],
]);
$this->ficha->instituicao_permanencia->campos->identificacao_responsavel_tecnico = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,644 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao as CadastroIndividualSaidaCidadao;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\CadastroIndividual\AcompanhamentoInfantil;
use App\Models\AtencaoBasica\CadastroIndividual\AlimentacaoDiaria;
use App\Models\AtencaoBasica\CadastroIndividual\ComunidadeTradicional;
use App\Models\AtencaoBasica\CadastroIndividual\Curso;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaCardiaca;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaRespiratoria;
use App\Models\AtencaoBasica\CadastroIndividual\HigienePessoal;
use App\Models\AtencaoBasica\CadastroIndividual\OrientacaoSexual;
use App\Models\AtencaoBasica\CadastroIndividual\OrigemAlimentacao;
use App\Models\AtencaoBasica\CadastroIndividual\Parentesco;
use App\Models\AtencaoBasica\CadastroIndividual\Peso;
use App\Models\AtencaoBasica\CadastroIndividual\ProblemasRins;
use App\Models\AtencaoBasica\CadastroIndividual\SaidaCidadao;
use App\Models\AtencaoBasica\CadastroIndividual\SituacaoMercadoTrabalho;
use App\Models\AtencaoBasica\CadastroIndividual\SituacaoRua;
use App\Models\Cadastro\SujeitoAtencao\DeficienciaBase;
use App\Models\Cadastro\SujeitoAtencao\EtniaIndigena;
use App\Models\Cadastro\SujeitoAtencao\IdentidadeGenero;
use App\Models\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Models\Cadastro\SujeitoAtencao\RacaCor;
use App\Models\Intranet\Pais;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaCadastroIndividual extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/cadastroindividual');
}
public function __invoke()
{
$path = '//ns4:cadastroIndividualTransport';
$this->setProfissional($path);
$this->setPaciente($path);
$this->setInformacaoSociodemografica($path);
$this->setInformacaoSocioeconomica($path);
$this->setRecusaCadastro($path);
$this->setCondicaoSaudeGeral($path);
$this->setSituacaoRua($path);
return $this->ficha;
}
private function setProfissional($cadastroIndividualTransportPath)
{
$headerTransportPath = "{$cadastroIndividualTransportPath}/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->cadastroIndividual->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 setPaciente($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/identificacaoUsuarioCidadao";
$campos = (object) [
'nomeSocial' => $this->getFirstNodeValue("{$path}/nomeSocial"),
'codigoIbgeMunicipioNascimento' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipioNascimento"),
'dataNascimentoCidadao' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimentoCidadao")),
'desconheceNomeMae' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/desconheceNomeMae"))),
'emailCidadao' => $this->getFirstNodeValue("{$path}/emailCidadao"),
'nacionalidadeCidadao' => $this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
? Nacionalidade::where('codigo_esus', $this->getFirstNodeValue("{$path}/nacionalidadeCidadao"))
->first()->descricao
: null,
'nomeCidadao' => $this->getFirstNodeValue("{$path}/nomeCidadao"),
'nomeMaeCidadao' => $this->getFirstNodeValue("{$path}/nomeMaeCidadao"),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'telefoneCelular' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneCelular")),
'numeroNisPisPasep' => $this->getFirstNodeValue("{$path}/numeroNisPisPasep"),
'paisNascimento' => $this->getFirstNodeValue("{$path}/paisNascimento")
? Pais::where('codigo_esus', $this->getFirstNodeValue("{$path}/paisNascimento"))->first()->nome
: null,
'racaCorCidadao' => $this->getFirstNodeValue("{$path}/racaCorCidadao")
? RacaCor::where('codigo_esus', $this->getFirstNodeValue("{$path}/racaCorCidadao"))->first()->descricao
: null,
'sexoCidadao' => $this->getSexo($this->getFirstNodeValue("{$path}/sexoCidadao")),
'statusEhResponsavel' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhResponsavel"))),
'etnia' => $this->getFirstNodeValue("{$path}/etnia")
? EtniaIndigena::where('codigo_cadsus', $this->getFirstNodeValue("{$path}/etnia"))->first()->descricao
: null,
'nomePaiCidadao' => $this->getFirstNodeValue("{$path}/nomePaiCidadao"),
'desconheceNomePai' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/desconheceNomePai"))),
'dtNaturalizacao' => $this->getDateString($this->getFirstNodeValue("{$path}/dtNaturalizacao")),
'portariaNaturalizacao' => $this->getFirstNodeValue("{$path}/portariaNaturalizacao"),
'dtEntradaBrasil' => $this->getDateString($this->getFirstNodeValue("{$path}/dtEntradaBrasil")),
'microArea' => $this->getFirstNodeValue("{$path}/microArea"),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/stForaArea"))),
];
$inconsistencias = $this->getInconsistencias([
['Nome social', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeSocial],
['IBGE (Nascimento)', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->codigoIbgeMunicipioNascimento],
['Data de nascimento', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dataNascimentoCidadao],
['Desconhece mãe', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->desconheceNomeMae],
['E-mail', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->emailCidadao],
['Nacionalidade', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nacionalidadeCidadao],
['Nome', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeCidadao],
['Nome da mãe', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeMaeCidadao],
['CNS', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->cnsCidadao],
['CPF', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->cpfCidadao],
['Telefone', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->telefoneCelular],
['PIS / PASEP | NIS', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->numeroNisPisPasep],
['País de nascimento', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->paisNascimento],
['Raça/cor', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->racaCorCidadao],
['Sexo', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->sexoCidadao],
['É responsável', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->statusEhResponsavel],
['Etnia', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->etnia],
['Nome do pai', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomePaiCidadao],
['Desconhece pai', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->desconheceNomePai],
['Data de naturalização', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dtNaturalizacao],
['Portaria de naturalização', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->portariaNaturalizacao],
['Data de entrada no Brasil', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dtEntradaBrasil],
['Microárea', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->microArea],
['Fora de área', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->stForaArea],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setInformacaoSociodemografica($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/informacoesSocioDemograficas";
$ocupacao = $this->getFirstNodeValue("{$path}/ocupacaoCodigoCbo2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$path}/ocupacaoCodigoCbo2002"))->first()
: null;
$campos = (object) [
'grauInstrucaoCidadao' => $this->getFirstNodeValue("{$path}/grauInstrucaoCidadao")
? Curso::where('codigo_esus', $this->getFirstNodeValue("{$path}/grauInstrucaoCidadao"))->first()->descricao
: null,
'ocupacaoCodigoCbo2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'orientacaoSexualCidadao' => $this->getFirstNodeValue("{$path}/orientacaoSexualCidadao")
? OrientacaoSexual::where('codigo_esus', $this->getFirstNodeValue("{$path}/orientacaoSexualCidadao"))
->first()->descricao
: null,
'relacaoParentescoCidadao' => $this->getFirstNodeValue("{$path}/relacaoParentescoCidadao")
? Parentesco::where('codigo_esus', $this->getFirstNodeValue("{$path}/relacaoParentescoCidadao"))->first()->descricao
: null,
'situacaoMercadoTrabalhoCidadao' => $this->getFirstNodeValue("{$path}/situacaoMercadoTrabalhoCidadao")
? SituacaoMercadoTrabalho::where('codigo_esus', $this->getFirstNodeValue("{$path}/situacaoMercadoTrabalhoCidadao"))
->first()->descricao
: null,
'statusDesejaInformarOrientacaoSexual' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDesejaInformarOrientacaoSexual"))),
'statusFrequentaBenzedeira' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusFrequentaBenzedeira"))),
'statusFrequentaEscola' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusFrequentaEscola"))),
'statusMembroPovoComunidadeTradicional' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusMembroPovoComunidadeTradicional"))),
'statusParticipaGrupoComunitario' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusParticipaGrupoComunitario"))),
'statusPossuiPlanoSaudePrivado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusPossuiPlanoSaudePrivado"))),
'statusTemAlgumaDeficiencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemAlgumaDeficiencia"))),
'identidadeGeneroCidadao' => $this->getFirstNodeValue("{$path}/identidadeGeneroCidadao")
? IdentidadeGenero::where('codigo_esus', $this->getFirstNodeValue("{$path}/identidadeGeneroCidadao"))
->first()->descricao
: null,
'statusDesejaInformarIdentidadeGenero' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDesejaInformarIdentidadeGenero"))),
'coPovoComunidadeTradicional' => $this->getFirstNodeValue("{$path}/coPovoComunidadeTradicional")
? ComunidadeTradicional::where('codigo_esus', $this->getFirstNodeValue("{$path}/coPovoComunidadeTradicional"))
->first()->descricao
: null,
];
$deficienciasCidadao = [];
$responsaveisPorCrianca = [];
foreach ($this->domx->query("{$path}/deficienciasCidadao") as $context) {
$deficienciasCidadao[] = DeficienciaBase::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/responsavelPorCrianca") as $context) {
$responsaveisPorCrianca[] = AcompanhamentoInfantil::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->deficienciasCidadao = collect($deficienciasCidadao)->join(', ');
$campos->responsaveisPorCrianca = collect($responsaveisPorCrianca)->join(', ');
$inconsistencias = $this->getInconsistencias([
[
'Deficiências',
fn () => $this->inconsistencias->informacoesSocioDemograficas->deficienciasCidadao
],
[
'Qual é o curso mais elevado que frequenta ou frequentou?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->grauInstrucaoCidadao
],
[
'Ocupação',
fn () => $this->inconsistencias->informacoesSocioDemograficas->ocupacaoCodigoCbo2002
],
[
'Orientação sexual',
fn () => $this->inconsistencias->informacoesSocioDemograficas->orientacaoSexualCidadao
],
[
'Relação de parentesco com o responsável familiar',
fn () => $this->inconsistencias->informacoesSocioDemograficas->relacaoParentescoCidadao
],
[
'Situação no mercado de trabalho',
fn () => $this->inconsistencias->informacoesSocioDemograficas->situacaoMercadoTrabalhoCidadao
],
[
'Deseja informar orientação sexual?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusDesejaInformarOrientacaoSexual
],
[
'Frequenta cuidador tradicional?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusFrequentaBenzedeira
],
[
'Frequenta escola ou creche?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusFrequentaEscola
],
[
'É membro de povo ou comunidade tradicional?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusMembroPovoComunidadeTradicional
],
[
'Participa de grupo comunitário?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusParticipaGrupoComunitario
],
[
'Possui plano de saúde privado?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusPossuiPlanoSaudePrivado
],
[
'Tem alguma deficiência?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusTemAlgumaDeficiencia
],
[
'Identidade de gênero',
fn () => $this->inconsistencias->informacoesSocioDemograficas->identidadeGeneroCidadao
],
[
'Deseja informar identidade de gênero?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusDesejaInformarIdentidadeGenero
],
[
'Crianças de 0 a 9 anos, com quem fica?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->responsavelPorCrianca
],
[
'Povo ou comunidade tradicional',
fn () => $this->inconsistencias->informacoesSocioDemograficas->coPovoComunidadeTradicional
],
]);
$this->ficha->informacao_sociodemografica = (object) compact('campos', 'inconsistencias');
$this->setSaidaCidadaoCadastro($cadastroIndividualTransportPath);
}
private function setSaidaCidadaoCadastro($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/saidaCidadaoCadastro";
$motivo = $this->getFirstNodeValue("{$path}/motivoSaidaCidadao")
? SaidaCidadao::where('codigo_esus', $this->getFirstNodeValue("{$path}/motivoSaidaCidadao"))->first()
: null;
$campos = (object) [
'is_motivo_saida_obito' => ($motivo->id ?? null) === CadastroIndividualSaidaCidadao::OBITO,
'motivoSaidaCidadao' => $motivo->descricao ?? null,
'dataObito' => $this->getDateString($this->getFirstNodeValue("{$path}/dataObito")),
'numeroDO' => $this->getFirstNodeValue("{$path}/numeroDO"),
];
$inconsistencias = $this->getInconsistencias([
['Motivo', fn () => $this->inconsistencias->saidaCidadaoCadastro->motivoSaidaCidadao],
['Data de óbito', fn () => $this->inconsistencias->saidaCidadaoCadastro->dataObito],
['Número da declaração de óbito', fn () => $this->inconsistencias->saidaCidadaoCadastro->numeroDO],
]);
$this->ficha->informacao_sociodemografica->campos->saida_cidadao_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setInformacaoSocioeconomica($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/informacoesSocioEconomicas";
$campos = (object) [
'alimentosAcabaramAntesTerDinheiroComprarMais' => $this->getSimNaoNaoInformado(
$this->getFirstNodeValue("{$path}/alimentosAcabaramAntesTerDinheiroComprarMais")),
'comeuAlgunsAlimentosQueTinhaDinheiroAcabou' => $this->getSimNaoNaoInformado(
$this->getFirstNodeValue("{$path}/comeuAlgunsAlimentosQueTinhaDinheiroAcabou")),
];
$inconsistencias = $this->getInconsistencias([
[
'Nos últimos três meses, os alimentos acabaram antes que você tivesse dinheiro para comprar mais comida?',
fn () => $this->inconsistencias->informacoesSocioEconomicas->alimentosAcabaramAntesTerDinheiroComprarMais
],
[
'Nos últimos três meses, você comeu apenas alguns alimentos que ainda tinha, porque o dinheiro acabou?',
fn () => $this->inconsistencias->informacoesSocioEconomicas->comeuAlgunsAlimentosQueTinhaDinheiroAcabou
],
]);
$this->ficha->informacao_socioeconomica = (object) compact('campos', 'inconsistencias');
}
private function setRecusaCadastro($cadastroIndividualTransportPath)
{
$path = $cadastroIndividualTransportPath;
$campos = (object) [
'statusTermoRecusaCadastroIndividualAtencaoBasica' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTermoRecusaCadastroIndividualAtencaoBasica")
)
)
];
$inconsistencias = $this->getInconsistencias([
[
'Usuário recusou o cadastro por meio do termo de Recusa do Cadastro',
fn () => $this->inconsistencias->statusTermoRecusaCadastroIndividualAtencaoBasica
],
]);
$this->ficha->recusa_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setCondicaoSaudeGeral($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/condicoesDeSaude";
$campos = (object) [
'descricaoCausaInternacaoEm12Meses' => $this->getFirstNodeValue("{$path}/descricaoCausaInternacaoEm12Meses"),
'descricaoOutraCondicao1' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao1"),
'descricaoOutraCondicao2' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao2"),
'descricaoOutraCondicao3' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao3"),
'descricaoPlantasMedicinaisUsadas' => $this->getFirstNodeValue("{$path}/descricaoPlantasMedicinaisUsadas"),
'maternidadeDeReferencia' => $this->getFirstNodeValue("{$path}/maternidadeDeReferencia"),
'situacaoPeso' => $this->getFirstNodeValue("{$path}/situacaoPeso")
? Peso::where('codigo_esus', $this->getFirstNodeValue("{$path}/situacaoPeso"))->first()->descricao
: null,
'statusEhDependenteAlcool' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhDependenteAlcool"))),
'statusEhDependenteOutrasDrogas' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhDependenteOutrasDrogas"))),
'statusEhFumante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhFumante"))),
'statusEhGestante' => $this->inconsistenciaModel->cadastroIndividual->paciente->cidadao->sexo_id === Sexo::FEMININO
? DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhGestante")))
: 'Não se aplica',
'statusEstaAcamado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEstaAcamado"))),
'statusEstaDomiciliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEstaDomiciliado"))),
'statusTemDiabetes' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemDiabetes"))),
'statusTemDoencaRespiratoria' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemDoencaRespiratoria"))),
'statusTemHanseniase' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemHanseniase"))),
'statusTemHipertensaoArterial' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemHipertensaoArterial"))),
'statusTemTeveCancer' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTeveCancer"))),
'statusTemTeveDoencasRins' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTeveDoencasRins"))),
'statusTemTuberculose' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTuberculose"))),
'statusTeveAvcDerrame' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveAvcDerrame"))),
'statusTeveDoencaCardiaca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveDoencaCardiaca"))),
'statusTeveInfarto' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveInfarto"))),
'statusTeveInternadoEm12Meses' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveInternadoEm12Meses"))),
'statusUsaOutrasPraticasIntegrativasOuComplementares' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusUsaOutrasPraticasIntegrativasOuComplementares"))),
'statusUsaPlantaMedicinais' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusUsaPlantaMedicinais"))),
'statusDiagnosticoMental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDiagnosticoMental"))),
];
$doencasCardiacas = [];
$doencasRespiratorias = [];
$doencasRins = [];
foreach ($this->domx->query("{$path}/doencaCardiaca") as $context) {
$doencasCardiacas[] = DoencaCardiaca::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/doencaRespiratoria") as $context) {
$doencasRespiratorias[] = DoencaRespiratoria::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/doencaRins") as $context) {
$doencasRins[] = ProblemasRins::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->doencasCardiacas = collect($doencasCardiacas)->join(', ');
$campos->doencasRespiratorias = collect($doencasRespiratorias)->join(', ');
$campos->doencasRins = collect($doencasRins)->join(', ');
$inconsistencias = $this->getInconsistencias([
[
'Motivo internação nos últimos 12 meses',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoCausaInternacaoEm12Meses
],
[
'Outra condição de saúde 1',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao1
],
[
'Outra condição de saúde 2',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao2
],
[
'Outra condição de saúde 3',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao3
],
[
'Quais plantas medicinais?',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoPlantasMedicinaisUsadas
],
[
'Quais doenças cardíacas?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaCardiaca
],
[
'Quais doenças respiratórias?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaRespiratoria
],
[
'Quais problemas nos rins?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaRins
],
[
'Qual é a maternidade de referência?',
fn () => $this->inconsistencias->condicoesDeSaude->maternidadeDeReferencia
],
[
'Peso',
fn () => $this->inconsistencias->condicoesDeSaude->situacaoPeso
],
[
'Usa álcool',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhDependenteAlcool
],
[
'Outras drogas',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhDependenteOutrasDrogas
],
[
'Fumante',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhFumante
],
[
'Gestante',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhGestante
],
[
'Está acamado?',
fn () => $this->inconsistencias->condicoesDeSaude->statusEstaAcamado
],
[
'Está domiciliado?',
fn () => $this->inconsistencias->condicoesDeSaude->statusEstaDomiciliado
],
[
'Diabetes',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemDiabetes
],
[
'Tem doença respiratória/no pulmão?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemDoencaRespiratoria
],
[
'Está com hanseníase',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemHanseniase
],
[
'Hipertensão',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemHipertensaoArterial
],
[
'Tem ou teve câncer',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTeveCancer
],
[
'Tem ou teve problemas nos rins?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTeveDoencasRins
],
[
'Está com tuberculose',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTuberculose
],
[
'Teve AVC/Derrame',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveAvcDerrame
],
[
'Teve doença cardíaca/do coração?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveDoencaCardiaca
],
[
'Teve infarto',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveInfarto
],
[
'Teve internação nos últimos 12 meses?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveInternadoEm12Meses
],
[
'Usa práticas integrativas e complementares?',
fn () => $this->inconsistencias->condicoesDeSaude->statusUsaOutrasPraticasIntegrativasOuComplementares
],
[
'Usa plantas medicinais?',
fn () => $this->inconsistencias->condicoesDeSaude->statusUsaPlantaMedicinais
],
[
'Fez ou faz tratamento psiquiátrico ou teve internação por problema de saúde mental?',
fn () => $this->inconsistencias->condicoesDeSaude->statusDiagnosticoMental
],
]);
$this->ficha->condicao_saude_geral = (object) compact('campos', 'inconsistencias');
}
private function setSituacaoRua($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/emSituacaoDeRua";
$campos = (object) [
'grauParentescoFamiliarFrequentado' => $this->getFirstNodeValue("{$path}/grauParentescoFamiliarFrequentado"),
'outraInstituicaoQueAcompanha' => $this->getFirstNodeValue("{$path}/outraInstituicaoQueAcompanha"),
'quantidadeAlimentacoesAoDiaSituacaoRua' => $this->getFirstNodeValue("{$path}/quantidadeAlimentacoesAoDiaSituacaoRua")
? AlimentacaoDiaria::where(
'codigo_esus',
$this->getFirstNodeValue("{$path}/quantidadeAlimentacoesAoDiaSituacaoRua")
)->first()->descricao
: null,
'statusAcompanhadoPorOutraInstituicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusAcompanhadoPorOutraInstituicao"))),
'statusPossuiReferenciaFamiliar' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusPossuiReferenciaFamiliar"))),
'statusRecebeBeneficio' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusRecebeBeneficio"))),
'em_situacao_rua' => !is_null($this->getFirstNodeValue("{$path}/statusSituacaoRua")),
'statusSituacaoRua' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusSituacaoRua"))),
'statusTemAcessoHigienePessoalSituacaoRua' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemAcessoHigienePessoalSituacaoRua"))),
'statusVisitaFamiliarFrequentemente' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusVisitaFamiliarFrequentemente"))),
'tempoSituacaoRua' => $this->getFirstNodeValue("{$path}/tempoSituacaoRua")
? SituacaoRua::where('codigo_esus', $this->getFirstNodeValue("{$path}/tempoSituacaoRua"))->first()->descricao
: null,
];
$higienePessoal = [];
$origemAlimentos = [];
foreach ($this->domx->query("{$path}/higienePessoalSituacaoRua") as $context) {
$higienePessoal[] = HigienePessoal::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/origemAlimentoSituacaoRua") as $context) {
$origemAlimentos[] = OrigemAlimentacao::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->higienePessoal = collect($higienePessoal)->join(', ');
$campos->origemAlimentos = collect($origemAlimentos)->join(', ');
$inconsistencias = $this->getInconsistencias([
['Parentesco', fn () => $this->inconsistencias->emSituacaoDeRua->grauParentescoFamiliarFrequentado],
['Higiene pessoal', fn () => $this->inconsistencias->emSituacaoDeRua->higienePessoalSituacaoRua],
['Origem da alimentação', fn () => $this->inconsistencias->emSituacaoDeRua->origemAlimentoSituacaoRua],
['Outra instituição', fn () => $this->inconsistencias->emSituacaoDeRua->outraInstituicaoQueAcompanha],
['Alimentação diária', fn () => $this->inconsistencias->emSituacaoDeRua->quantidadeAlimentacoesAoDiaSituacaoRua],
['Acompanhado por outra instituição?', fn () => $this->inconsistencias->emSituacaoDeRua->statusAcompanhadoPorOutraInstituicao],
['Possui referência familiar?', fn () => $this->inconsistencias->emSituacaoDeRua->statusPossuiReferenciaFamiliar],
['Recebe algum benefício?', fn () => $this->inconsistencias->emSituacaoDeRua->statusRecebeBeneficio],
['Em situação de rua?', fn () => $this->inconsistencias->emSituacaoDeRua->statusSituacaoRua],
['Acesso a higiene pessoal?', fn () => $this->inconsistencias->emSituacaoDeRua->statusTemAcessoHigienePessoalSituacaoRua],
['Visita algum familiar com frequência?', fn () => $this->inconsistencias->emSituacaoDeRua->statusVisitaFamiliarFrequentemente],
['Tempo em situação de rua', fn () => $this->inconsistencias->emSituacaoDeRua->tempoSituacaoRua],
]);
$this->ficha->situacao_rua = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,169 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarFundoOlho;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarRessonanciaMagnetica;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTesteOlho;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTesteOrelha;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTomografiaComputadorizada;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarUsTransfontanela;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\MaskUtil;
class FichaComplementar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichacomplementarzikamicrocefalia');
}
public function __invoke()
{
$path = '//ns4:fichaComplementarZikaMicrocefaliaTransport';
$this->setCadastro($path);
$this->setPaciente($path);
$this->setExames($path);
return $this->ficha;
}
private function setCadastro($fichaComplementarZikaMicrocefaliaTransportPath)
{
$headerTransportPath = "{$fichaComplementarZikaMicrocefaliaTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'turno' => $this->getFirstNodeValue("{$fichaComplementarZikaMicrocefaliaTransportPath}/turno")
? Turno::find($this->getFirstNodeValue("{$fichaComplementarZikaMicrocefaliaTransportPath}/turno"))->nome
: null,
'profissionalNome' => $this->inconsistenciaModel->fichaComplementar->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"),
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $this->inconsistencias->turno],
['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],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
]);
$this->ficha->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setPaciente($fichaComplementarZikaMicrocefaliaTransportPath)
{
$path = $fichaComplementarZikaMicrocefaliaTransportPath;
$campos = (object) [
'nomeCidadao' => $this->inconsistenciaModel->fichaComplementar->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'nomeResponsavelFamiliar' => CadastroIndividual::where(
'paciente_id',
$this->inconsistenciaModel->fichaComplementar->paciente_id
)->first()->responsavelCidadao->nome ?? null,
'cnsResponsavelFamiliar' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsResponsavelFamiliar")),
'cpfResponsavelFamiliar' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfResponsavelFamiliar")),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['CNS (Responsável familiar)', fn () => $this->inconsistencias->cnsResponsavelFamiliar],
['CPF (Responsável familiar)', fn () => $this->inconsistencias->cpfResponsavelFamiliar],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setExames($fichaComplementarZikaMicrocefaliaTransportPath)
{
$path = $fichaComplementarZikaMicrocefaliaTransportPath;
$campos = (object) [
'dataRealizacaoTesteOlhinho' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTesteOlhinho")),
'coResultadoTesteOlhinho' => $this->getFirstNodeValue("{$path}/coResultadoTesteOlhinho")
? FichaComplementarTesteOlho::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTesteOlhinho")
)->first()->descricao
: null,
'dataRealizacaoExameFundoOlho' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoExameFundoOlho")),
'coResultadoExameFundoOlho' => $this->getFirstNodeValue("{$path}/coResultadoExameFundoOlho")
? FichaComplementarFundoOlho::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoExameFundoOlho")
)->first()->descricao
: null,
'dataRealizacaoTesteOrelhinha' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTesteOrelhinha")),
'coResultadoTesteOrelhinha' => $this->getFirstNodeValue("{$path}/coResultadoTesteOrelhinha")
? FichaComplementarTesteOrelha::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTesteOrelhinha")
)->first()->descricao
: null,
'dataRealizacaoUSTransfontanela' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoUSTransfontanela")),
'coResultadoUsTransfontanela' => $this->getFirstNodeValue("{$path}/coResultadoUsTransfontanela")
? FichaComplementarUsTransfontanela::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoUsTransfontanela")
)->first()->descricao
: null,
'dataRealizacaoTomografiaComputadorizada' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTomografiaComputadorizada")),
'coResultadoTomografiaComputadorizada' => $this->getFirstNodeValue("{$path}/coResultadoTomografiaComputadorizada")
? FichaComplementarTomografiaComputadorizada::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTomografiaComputadorizada")
)->first()->descricao
: null,
'dataRealizacaoRessonanciaMagnetica' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoRessonanciaMagnetica")),
'coResultadoRessonanciaMagnetica' => $this->getFirstNodeValue("{$path}/coResultadoRessonanciaMagnetica")
? FichaComplementarRessonanciaMagnetica::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoRessonanciaMagnetica")
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
fn () => $this->inconsistencias->{"Resultados de exames"},
['Teste do Olhinho', fn () => $this->inconsistencias->dataRealizacaoTesteOlhinho],
['Resultado - Teste do Olhinho', fn () => $this->inconsistencias->coResultadoTesteOlhinho],
['Fundo de olho', fn () => $this->inconsistencias->dataRealizacaoExameFundoOlho],
['Resultado - Fundo de olho', fn () => $this->inconsistencias->coResultadoExameFundoOlho],
['Teste da Orelhinha', fn () => $this->inconsistencias->dataRealizacaoTesteOrelhinha],
['Resultado - Teste da Orelhinha', fn () => $this->inconsistencias->coResultadoTesteOrelhinha],
['US Transfontanela', fn () => $this->inconsistencias->dataRealizacaoUSTransfontanela],
['Resultado - US Transfontanela', fn () => $this->inconsistencias->coResultadoUsTransfontanela],
['Tomografia Computadorizada', fn () => $this->inconsistencias->dataRealizacaoTomografiaComputadorizada],
['Resultado - Tomografia Computadorizada', fn () => $this->inconsistencias->coResultadoTomografiaComputadorizada],
['Ressonância Magnética', fn () => $this->inconsistencias->dataRealizacaoRessonanciaMagnetica],
['Resultado - Ressonância Magnética', fn () => $this->inconsistencias->coResultadoRessonanciaMagnetica],
]);
$this->ficha->exames = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,169 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPergunta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarResposta;
use App\Models\Sigtap\Ocupacao;
use App\Utils\MaskUtil;
class FichaConsumoAlimentar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaconsumoalimentar');
}
public function __invoke()
{
$path = '//ns4:fichaConsumoAlimentarTransport';
$this->setPaciente($path);
$this->setProfissional($path);
$this->setQuestionario($path);
return $this->ficha;
}
private function setPaciente($fichaConsumoAlimentarTransportPath)
{
$path = $fichaConsumoAlimentarTransportPath;
$campos = (object) [
'nomeCidadao' => $this->inconsistenciaModel->consumoAlimentar->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimento")),
'sexo' => $this->getSexo($this->getFirstNodeValue("{$path}/sexo")),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $this->inconsistencias->dataNascimento],
['Sexo', fn () => $this->inconsistencias->sexo],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($fichaConsumoAlimentarTransportPath)
{
$headerTransportPath = "{$fichaConsumoAlimentarTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'localAtendimento' => $this->getFirstNodeValue("{$fichaConsumoAlimentarTransportPath}/localAtendimento")
? LocalAtendimento::find($this->getFirstNodeValue("{$fichaConsumoAlimentarTransportPath}/localAtendimento"))->descricao
: null,
'profissionalNome' => $this->inconsistenciaModel->consumoAlimentar->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"),
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
];
$inconsistencias = $this->getInconsistencias([
['Local de atendimento', fn () => $this->inconsistencias->localAtendimento],
['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],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setQuestionario($fichaConsumoAlimentarTransportPath)
{
$path = $fichaConsumoAlimentarTransportPath;
$inconsistenciaQuestionario = null;
$titulo = null;
$tituloConsumiu = null;
if ($this->domx->query("{$path}/perguntasQuestionarioCriancasDeSeisVinteTresMeses")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasDeSeisVinteTresMeses";
$titulo = 'Crianças de 6 a 23 meses';
$tituloConsumiu = 'Ontem a criança consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasDeSeisVinteTresMeses;
}
else if ($this->domx->query("{$path}/perguntasQuestionarioCriancasComMaisDoisAnos")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasComMaisDoisAnos";
$titulo = 'Crianças com 2 anos ou mais, adolescentes, adultos, gestantes e idosos';
$tituloConsumiu = 'Ontem você consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasComMaisDoisAnos;
}
else if ($this->domx->query("{$path}/perguntasQuestionarioCriancasMenoresSeisMeses")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasMenoresSeisMeses";
$titulo = 'Crianças menores de 6 meses';
$tituloConsumiu = 'Ontem a criança consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasMenoresSeisMeses;
}
$perguntas = [];
$getResposta = function ($descricaoEsus) {
return MarcadorConsumoAlimentarResposta::where('descricao_esus', $descricaoEsus)
->first()
->descricao;
};
foreach ($this->domx->query($path) as $context) {
$perguntaModel = MarcadorConsumoAlimentarPergunta::where(
'descricao_esus',
$this->getFirstNodeValue('pergunta', $context)
)->first();
$pergunta = (object) [
'pergunta' => $perguntaModel->descricao,
'area_ontem_consumiu' => $perguntaModel->area_ontem_consumiu,
];
if ($resposta = $this->getFirstNodeValue('respostaUnicaEscolha', $context)) {
$pergunta->respostas = [$getResposta($resposta)];
}
else {
$pergunta->respostas = [];
foreach ($this->domx->query('respostaMultiplaEscolha', $context) as $context) {
$pergunta->respostas[] = $getResposta($context->nodeValue);
}
}
$perguntas[] = $pergunta;
}
$this->ficha->questionario = (object) [
'titulo' => $titulo,
'titulo_consumiu' => $tituloConsumiu,
'lista' => $perguntas,
'inconsistencias' => $this->getInconsistencias([
$inconsistenciaQuestionario,
]),
];
}
}

View File

@@ -0,0 +1,247 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\Procedimento\PequenaCirurgia;
use App\Models\AtencaoBasica\Procedimento\TesteRapido;
use App\Models\AtencaoBasica\Procedimento\ViaAdministracao;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaProcedimento extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaprocedimentomaster');
}
public function __invoke()
{
$path = '//ns4:fichaProcedimentoMasterTransport';
$this->setProfissional($path);
$this->setAtendimentos($path);
$this->setProcedimentosConsolidados($path);
return $this->ficha;
}
private function setProfissional($fichaProcedimentoMasterTransportPath)
{
$headerTransportPath = "{$fichaProcedimentoMasterTransportPath}/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->procedimento->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($fichaProcedimentoMasterTransportPath)
{
$path = "{$fichaProcedimentoMasterTransportPath}/atendProcedimentos";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoModel = $this->inconsistenciaModel->procedimentoAtendimentos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendProcedimentos->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setAtendimento($atendimento, $context, $atendimentoModel, $inconsistencias);
$this->setInformacoesGerais($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendProcedimentos,
]),
];
}
private function setAtendimento($atendimento, $atendimentoContext, $atendimentoModel, $inconsistencias)
{
$campos = (object) [
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoContext),
'nomeCidadao' => $atendimentoModel->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)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoContext))->descricao
: null,
'turno' => $this->getFirstNodeValue('turno', $atendimentoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoContext))->nome
: null,
'statusEscutaInicialOrientacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('statusEscutaInicialOrientacao', $atendimentoContext))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoContext)),
];
$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],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Turno', fn () => $inconsistencias->turno],
['Escuta Inicial/Orientação', fn () => $inconsistencias->statusEscutaInicialOrientacao],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setInformacoesGerais($atendimento, $atendimentoContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->informacoes_gerais = (object) compact('campos', 'inconsistencias');
}
private function setProcedimentos($atendimento, $atendimentoContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentos', $atendimentoContext) as $context) {
$codigo = $context->nodeValue;
if ($pequenaCirurgia = PequenaCirurgia::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Pequena cirurgia: {$pequenaCirurgia->descricao}";
}
else if ($testeRapido = TesteRapido::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Teste rápido: {$testeRapido->descricao}";
}
else if ($viaAdmnistracao = ViaAdministracao::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Administração de medicamento: {$viaAdmnistracao->descricao}";
}
else {
$procedimento = Procedimento::where('codigo', $codigo)->orderByDesc('competencia_id')->first();
$procedimentos[] = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
}
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->procedimentos,
]),
];
}
private function setProcedimentosConsolidados($fichaProcedimentoMasterTransportPath)
{
$path = $fichaProcedimentoMasterTransportPath;
$campos = (object) [
'numTotalAfericaoPa' => $this->getFirstNodeValue("{$path}/numTotalAfericaoPa"),
'numTotalAfericaoTemperatura' => $this->getFirstNodeValue("{$path}/numTotalAfericaoTemperatura"),
'numTotalCurativoSimples' => $this->getFirstNodeValue("{$path}/numTotalCurativoSimples"),
'numTotalColetaMaterialParaExameLaboratorial' => $this->getFirstNodeValue("{$path}/numTotalColetaMaterialParaExameLaboratorial"),
'numTotalGlicemiaCapilar' => $this->getFirstNodeValue("{$path}/numTotalGlicemiaCapilar"),
'numTotalMedicaoAltura' => $this->getFirstNodeValue("{$path}/numTotalMedicaoAltura"),
'numTotalMedicaoPeso' => $this->getFirstNodeValue("{$path}/numTotalMedicaoPeso"),
];
$inconsistencias = $this->getInconsistencias([
['Aferição de PA', fn () => $this->inconsistencias->numTotalAfericaoPa],
['Temperatura', fn () => $this->inconsistencias->numTotalAfericaoTemperatura],
['Curativo', fn () => $this->inconsistencias->numTotalCurativoSimples],
['Coleta de material para Exame Laboratorial', fn () => $this->inconsistencias->numTotalColetaMaterialParaExameLaboratorial],
['Glicemia Capilar', fn () => $this->inconsistencias->numTotalGlicemiaCapilar],
['Altura', fn () => $this->inconsistencias->numTotalMedicaoAltura],
['Peso', fn () => $this->inconsistencias->numTotalMedicaoPeso],
]);
$this->ficha->procedimentos_consolidados = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,272 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Exportacao\EstrategiaVacinacao;
use App\Enums\Imunizacao\Estrategia;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Cadastro\Vacina;
use App\Models\Geral\Turno;
use App\Models\Imunizacao\Dose;
use App\Models\Imunizacao\Estrategia as ImunizacaoEstrategia;
use App\Models\Imunizacao\GrupoAtendimento;
use App\Models\Imunizacao\Parametrizacao;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaVacinacao extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichavacinacaomaster');
}
public function __invoke()
{
$path = '//ns4:fichaVacinacaoMasterTransport';
$this->setCadastro($path);
$this->setVacinacoes($path);
return $this->ficha;
}
private function setCadastro($fichaVacinacaoMasterTransportPath)
{
$headerTransportPath = "{$fichaVacinacaoMasterTransportPath}/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->fichaVacinacao->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 da aplicação', 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->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setVacinacoes($fichaVacinacaoMasterTransportPath)
{
$path = "{$fichaVacinacaoMasterTransportPath}/vacinacoes";
$vacinacoes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$vacinacaoModel = $this->inconsistenciaModel->fichaVacinacaoPacientes()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->vacinacoes->{$posicao} ?? [];
$vacinacao = (object) [
'campos' => (object) [
'turno' => $this->getFirstNodeValue('turno', $context)
? Turno::find($this->getFirstNodeValue('turno', $context))->nome
: null,
'numProntuario' => $this->getFirstNodeValue('numProntuario', $context),
'nomeCidadao' => $vacinacaoModel->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $context)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $context)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $context)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $context)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $context)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $context))->descricao
: null,
'viajante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('viajante', $context))),
'comunicanteHanseniase' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('comunicanteHanseniase', $context))),
'gestante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('gestante', $context))),
'puerpera' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('puerpera', $context))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $context)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $context)),
],
'inconsistencias' => $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Viajante', fn () => $inconsistencias->viajante],
['Comunicante hanseníase', fn () => $inconsistencias->comunicanteHanseniase],
['Gestante', fn () => $inconsistencias->gestante],
['Puérpera', fn () => $inconsistencias->puerpera],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]),
];
$this->setVacinas($vacinacao, $context, $inconsistencias);
$vacinacoes[] = $vacinacao;
}
$this->ficha->vacinacoes = (object) [
'lista' => $vacinacoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->vacinacoes,
]),
];
}
private function setVacinas($vacinacao, $atendimentoContext, $inconsistencias)
{
$vacinas = [];
foreach ($this->domx->query('vacinas', $atendimentoContext) as $i => $context) {
$inconsistencias = $inconsistencias->vacinas->{$i + 1} ?? [];
$vacinas[] = [
'campos' => (object) [
'imunobiologico' => $this->getFirstNodeValue('imunobiologico', $context)
? $this->getDescricaoVacina(
Vacina::where('codigo', $this->getFirstNodeValue('imunobiologico', $context))->first())
: null,
'estrategiaVacinacao' => $this->getFirstNodeValue('estrategiaVacinacao', $context)
? $this->getEstrategia($this->getFirstNodeValue('estrategiaVacinacao', $context))
: null,
'dose' => $this->getFirstNodeValue('dose', $context)
? Dose::where('codigo_esus', $this->getFirstNodeValue('dose', $context))->first()->nome
: null,
'lote' => $this->getFirstNodeValue('lote', $context),
'fabricante' => $this->getFirstNodeValue('fabricante', $context),
'grupoAtendimento' => $this->getFirstNodeValue('grupoAtendimento', $context)
? GrupoAtendimento::where('codigo_esus', $this->getFirstNodeValue('grupoAtendimento', $context))
->first()->nome
: null,
'stRegistroAnterior' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stRegistroAnterior', $context))),
'dataRegistroAnterior' => $this->getDateString($this->getFirstNodeValue('dataRegistroAnterior', $context)),
'stAplicadoExterior' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stAplicadoExterior', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['Imunobiológico', fn () => $inconsistencias->imunobiologico],
['Estratégia', fn () => $inconsistencias->estrategiaVacinacao],
['Dose', fn () => $inconsistencias->dose],
['Lote', fn () => $inconsistencias->lote],
['Fabricante', fn () => $inconsistencias->fabricante],
['Grupo de atendimento', fn () => $inconsistencias->grupoAtendimento],
['Registro Anterior', fn () => $inconsistencias->stRegistroAnterior],
['Data do registro anterior', fn () => $inconsistencias->dataRegistroAnterior],
['Aplicado exterior', fn () => $inconsistencias->stAplicadoExterior],
]),
];
}
$vacinacao->campos->vacinas = (object) [
'lista' => $vacinas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->vacinas,
]),
];
}
private function getDescricaoVacina($vacina)
{
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO: {
return $vacina->nome;
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
return $vacina->abreviacao;
}
case ParametrizacaoDescricaoVacina::SIGLA: {
return $vacina->sigla;
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
return "$vacina->sigla - $vacina->nome";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
return "$vacina->sigla - $vacina->abreviacao";
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
return "$vacina->abreviacao - $vacina->nome";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
return "$vacina->sigla - $vacina->abreviacao - $vacina->nome";
}
default: {
return $vacina->nome;
}
}
}
private function getEstrategia($exportacaoEstrategiaId)
{
$estrategiaId = null;
switch ($exportacaoEstrategiaId) {
case EstrategiaVacinacao::PESQUISA: {
$exportacaoEstrategiaId = Estrategia::PESQUISA;
break;
}
case EstrategiaVacinacao::PRE_EXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::PRE_EXPOSICAO;
break;
}
case EstrategiaVacinacao::POS_EXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::POS_EXPOSICAO;
break;
}
case EstrategiaVacinacao::REEXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::REEXPOSICAO;
break;
}
default: {
$estrategiaId = $exportacaoEstrategiaId;
}
}
return ImunizacaoEstrategia::find($estrategiaId)->nome;
}
}

View File

@@ -0,0 +1,339 @@
<?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');
}
}

View File

@@ -0,0 +1,586 @@
<?php
namespace App\Services\Integracao\Esus;
use App\Enums\Integracao\Esus\Origem;
use App\Models\Integracao\Esus\Inconsistencia;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoDomiciliar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoIndividual;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoOdontologico;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtividadeColetiva;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAvaliacao;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaCadastroDomiciliar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaCadastroIndividual;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaComplementar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaConsumoAlimentar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaProcedimento;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaVacinacao;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaVisitaDomiciliar;
use App\Services\Integracao\EsusService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class GerenciamentoEnvioService extends Service
{
public static function index()
{
$params = self::getParams();
$inconsistencias = DB::table('integracao_esus_inconsistencia AS inconsistencia')
->join('integracao_esus_origem AS origem', 'origem.id', 'inconsistencia.origem_id')
->leftJoin('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->leftJoin('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'inconsistencia.ocupacao_id')
->leftJoin('cadastro_usuario AS usuario', 'usuario.id', 'inconsistencia.usuario_id')
->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('inconsistencia.ocupacao_id', $id))
->when($params->usuario_id, fn ($q, $id) => $q->where('inconsistencia.usuario_id', $id))
->select(
'inconsistencia.id',
'inconsistencia.data_atendimento',
'origem.id AS origem_id',
'origem.nome AS origem_nome',
'unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS infraestrutura_nome"),
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS ocupacao_descricao"),
'usuario_cidadao.nome AS usuario_nome',
'inconsistencia.inconsistencia',
DB::raw('COUNT(*) OVER (PARTITION BY origem.id) AS total_origem')
)
->get();
$fichasEnviadas = self::getFichasEnviadas($params);
return [
'inconsistencias' => $inconsistencias,
'fichas_enviadas' => $fichasEnviadas
];
}
public static function list()
{
$data = (object) [
'additionals' => [],
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'periodo' => function () use ($data, $params) {
$data->model['periodo'] = ['start' => null, 'end' => null];
$params->periodo = $data->model['periodo'];
},
'origem' => function () use ($data, $params) {
$origensData = self::getOrigensData($params);
$data->form['origens'] = $origensData['form'];
$data->model['origem_id'] = $origensData['model'];
$params->origem_id = $data->model['origem_id'];
},
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $unidadesData['model'];
$params->unidade_id = $data->model['unidade_id'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
$params->infraestrutura_id = $data->model['infraestrutura_id'];
},
'ocupacao' => function () use ($data, $params) {
$ocupacoesData = self::getOcupacoesData($params);
$data->form['ocupacoes'] = $ocupacoesData['form'];
$data->model['ocupacao_id'] = $ocupacoesData['model'];
$params->ocupacao_id = $data->model['ocupacao_id'];
},
'usuario' => function () use ($data, $params) {
$usuariosData = self::getUsuariosData($params);
$data->form['usuarios'] = $usuariosData['form'];
$data->model['usuario_id'] = $usuariosData['model'];
$params->usuario_id = $data->model['usuario_id'];
},
];
$load = is_null(request()->load_from);
if ($load) {
$data->additionals = [
'data_atual' => Carbon::today()->format('d/m/Y')
];
}
foreach ($sets as $field => $set) {
if ($load) {
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
$params = (object) request()->only([
'periodo',
'origem_id',
'unidade_id',
'infraestrutura_id',
'ocupacao_id',
'usuario_id',
]);
if (isset($params->periodo)
&& !is_null($params->periodo['start'])
&& !is_null($params->periodo['end'])
) {
$start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->startOfDay();
$end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->endOfDay();
$params->periodo['start'] = $start;
$params->periodo['end'] = $end;
}
else {
$params->periodo = null;
}
return $params;
}
private static function getFichasEnviadas($params){
return DB::query()
->fromSub(
DB::table('atencao_basica_atendimento_domiciliar')
->selectRaw("
1 as origem_id,
'Atendimento Domiciliar' AS ficha,
data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
->unionAll(
DB::table('atencao_basica_atendimento_individual')
->selectRaw("
2 as origem_id,
'Atendimento Individual' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_atendimento_odontologico')
->selectRaw("
3 as origem_id,
'Atendimento Odontologico' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_atividade_coletiva')
->selectRaw("
4 as origem_id,
'Atividade Coletiva' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_avaliacao')
->selectRaw("
5 as origem_id,
'Avaliação' AS ficha,
data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_cadastro_domiciliar')
->selectRaw("
6 as origem_id,
'Cadastro Domiciliar' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_cadastro_individual')
->selectRaw("
7 as origem_id,
'Cadastro Individual' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_ficha_complementar')
->selectRaw("
8 as origem_id,
'Ficha Complementar' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
cbo_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_consumo_alimentar')
->selectRaw("
9 as origem_id,
'Consumo Alimentar' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
cbo_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_procedimento')
->selectRaw("
10 as origem_id,
'Procedimento' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_ficha_vacinacao')
->selectRaw("
11 as origem_id,
'Ficha de vacinação' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_visita_domiciliar')
->selectRaw("
12 as origem_id,
'Visita Domiciliar' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
),
'totalizadores'
)
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'totalizadores.equipe_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id')
->whereBetween('totalizadores.data', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('totalizadores.origem_id', $id))
->when($params->usuario_id, fn ($q, $id) => $q->where('totalizadores.usuario_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('totalizadores.ocupacao_id', $id))
->select('origem_id', 'ficha', DB::raw('COUNT(*) AS quantidade', 'data','usuario_id', 'ocupacao_id'))
->groupBy('ficha')
->get();
}
private static function getOrigensData($params)
{
$origens = collect();
$id = null;
if (!is_null($params->periodo)) {
$origens = DB::table('integracao_esus_origem AS origem')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->whereColumn('inconsistencia.origem_id', 'origem.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
)
->select(
'origem.id',
'origem.nome'
)
->orderBy('origem.nome')
->get();
}
return ['form' => $origens, 'model' => $id];
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->periodo)) {
$unidades = DB::table('cadastro_unidade AS unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
)
->select('unidade.id', 'unidade.nome_fantasia')
->orderBy('unidade.nome_fantasia')
->get();
}
return ['form' => $unidades, 'model' => $id];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $params->unidade_id)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->whereColumn('equipe.infraestrutura_id', 'infraestrutura.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
)
->select(
'infraestrutura.id',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome")
)
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
return ['form' => $infraestruturas, 'model' => $id];
}
private static function getOcupacoesData($params)
{
$ocupacoes = collect();
$id = null;
if (!is_null($params->periodo)) {
$ocupacoes = DB::table('sigtap.ocupacao AS ocupacao')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('inconsistencia.ocupacao_id', 'ocupacao.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
)
->select(
'ocupacao.id',
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS descricao")
)
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
->get();
}
return ['form' => $ocupacoes, 'model' => $id];
}
private static function getUsuariosData($params)
{
$usuarios = collect();
$id = null;
if (!is_null($params->periodo)) {
$usuarios = DB::table('cadastro_usuario AS usuario')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'usuario.cidadao_id')
->whereNull('usuario.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('inconsistencia.usuario_id', 'usuario.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('inconsistencia.ocupacao_id', $id))
)
->select(
'usuario.id',
'cidadao.nome'
)
->orderBy('cidadao.nome')
->get();
}
return ['form' => $usuarios, 'model' => $id];
}
public static function getInconsistencia($id)
{
$inconsistencia = Inconsistencia::findOrFail($id);
$xmlEnvio = Storage::disk('local')
->get(EsusService::INCONSISTENCIA_XML_ENVIO_PATH
. DIRECTORY_SEPARATOR . app('config')->get('database.default')
. DIRECTORY_SEPARATOR . "{$inconsistencia->id}.xml");
switch ($inconsistencia->origem_id) {
case Origem::ATENDIMENTO_DOMICILIAR: {
return (new FichaAtendimentoDomiciliar($xmlEnvio, $inconsistencia))();
}
case Origem::FICHA_COMPLEMENTAR: {
return (new FichaComplementar($xmlEnvio, $inconsistencia))();
}
case Origem::AVALIACAO: {
return (new FichaAvaliacao($xmlEnvio, $inconsistencia))();
}
case Origem::AVALIACAO: {
return (new FichaAvaliacao($xmlEnvio, $inconsistencia))();
}
case Origem::CONSUMO_ALIMENTAR: {
return (new FichaConsumoAlimentar($xmlEnvio, $inconsistencia))();
}
case Origem::PROCEDIMENTO: {
return (new FichaProcedimento($xmlEnvio, $inconsistencia))();
}
case Origem::VISITA_DOMICILIAR: {
return (new FichaVisitaDomiciliar($xmlEnvio, $inconsistencia))();
}
case Origem::ATENDIMENTO_INDIVIDUAL: {
return (new FichaAtendimentoIndividual($xmlEnvio, $inconsistencia))();
}
case Origem::ATENDIMENTO_ODONTOLOGICO: {
return (new FichaAtendimentoOdontologico($xmlEnvio, $inconsistencia))();
}
case Origem::ATIVIDADE_COLETIVA: {
return (new FichaAtividadeColetiva($xmlEnvio, $inconsistencia))();
}
case Origem::FICHA_VACINACAO: {
return (new FichaVacinacao($xmlEnvio, $inconsistencia))();
}
case Origem::CADASTRO_INDIVIDUAL: {
return (new FichaCadastroIndividual($xmlEnvio, $inconsistencia))();
}
case Origem::CADASTRO_DOMICILIAR: {
return (new FichaCadastroDomiciliar($xmlEnvio, $inconsistencia))();
}
}
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Services\Integracao\Esus;
use App\Models\Integracao\Esus\Parametrizacao;
use App\Services\Service;
class ParametrizacaoService extends Service
{
public static function create()
{
$parametrizacao = Parametrizacao::first();
return [
'model' => [
'ativo' => $parametrizacao->ativo ?? false,
'url_instalacao' => $parametrizacao->url_instalacao ?? null,
'usuario' => $parametrizacao->usuario ?? null,
'senha' => $parametrizacao->senha ?? null,
'confirmacao_senha' => $parametrizacao->senha ?? null,
],
];
}
public static function store($request)
{
self::validate($request);
$parametrizacao = Parametrizacao::first();
if (is_null($parametrizacao)) {
$parametrizacao = Parametrizacao::create($request->all());
}
else {
$parametrizacao->update($request->all());
}
return $parametrizacao->fresh();
}
private static function validate($request)
{
$request->validate([
'ativo' => [
'required',
'boolean'
],
'url_instalacao' => [
'nullable',
'required_if:ativo,true',
'string',
'max:255',
],
'usuario' => [
'nullable',
'required_if:ativo,true',
'string',
'max:100',
],
'senha' => [
'nullable',
'required_if:ativo,true',
'string',
'max:100',
],
]);
}
}