Files
rkm-conectasus-ci-sandbox/api/app/Services/Integracao/Esus/GerenciamentoEnvio/Ficha/FichaCadastroDomiciliar.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

378 lines
20 KiB
PHP

<?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');
}
}