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,920 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\Ambulatorio\SituacaoCodigoEsus;
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
use App\Enums\AtencaoBasica\AtendimentoIndividual\Conduta as AtendimentoIndividualConduta;
use App\Enums\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Geral\CiapCondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividual;
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualIvcf;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\Geral\Ciap;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaAtendimentoIndividualService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasProfissional($mes_ano) as $fichaProfissional) {
$iteracoes = self::getIteracoesCount($fichaProfissional);
for ($i = 0; $i < $iteracoes; $i++) {
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $exportacaoArquivoId, $usuarioId);
$xmlPath = Storage::path($arquivo_caminho . 'xml_temp.xml');
$dadosExportacao['dom']->save($xmlPath);
$zip = new ZipArchive;
$zip->open(Storage::path($arquivo_caminho . $arquivo_nome), ZipArchive::CREATE);
$zip->addFile($xmlPath, 'AI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasProfissional($mesAnoInicial, false) as $fichaProfissional) {
$iteracoes = self::getIteracoesCount($fichaProfissional);
for ($i = 0; $i < $iteracoes; $i++) {
$dadosExportacao = self::getDadosExportacao($fichaProfissional);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaProfissional->data_usuario_responsavel,
'usuario_id' => $fichaProfissional->usuario->id,
'ocupacao_id' => $fichaProfissional->ocupacao->id,
'equipe_id' => $fichaProfissional->equipe->id,
'atendimentos_individuais' => $dadosExportacao['atendimentos_individuais'],
'xml' => [
'nome_arquivo' => 'AI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
],
]);
}
}
return $exportacoes;
}
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
{
return AtendimentoIndividual::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
});
})
)
->groupBy([
'usuario_id',
'equipe_id',
'usuario_ocupacao_id',
'data_usuario_responsavel'
])
->get();
}
private static function getIteracoesCount($fichaProfissional)
{
$count = AtendimentoIndividual::where('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
->whereNull('exportacao_id')
->count();
return ceil($count / 99);
}
public static function getDadosExportacao($fichaProfissional, $exportacaoArquivoId = null, $usuarioId = null)
{
$atendimentosIndividuaisPosicoes = collect();
$uuid = ExportacaoService::getUuid($fichaProfissional->equipe->unidade->cnes);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$dom = new DOMDocument('1.0', 'UTF-8');
$dadoTransporteTransportXml = $dom->createElementNS('http://esus.ufsc.br/dadotransporte', 'ns3:dadoTransporteTransportXml');
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns2', 'http://esus.ufsc.br/dadoinstalacao');
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns3', 'http://esus.ufsc.br/dadotransporte');
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns4', 'http://esus.ufsc.br/fichaatendimentoindividualmaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_INDIVIDUAL));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProfissional->equipe->unidade->cnes));
if($fichaProfissional->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProfissional->equipe->area->numero_ine));
}
$fichaAtendimentoIndividualMasterTransport = $dom->createElement('ns4:fichaAtendimentoIndividualMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaAtendimentoIndividualMasterTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaAtendimentoIndividualMasterTransport->appendChild($headerTransport);
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
$headerTransport->appendChild($lotacaoFormPrincipal);
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuario->cidadao->cns ?? ''));
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->ocupacao->codigo ));
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaProfissional->equipe->unidade->cnes));
if($fichaProfissional->equipe->area->numero_ine){
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaProfissional->equipe->area->numero_ine));
}
if($fichaProfissional->usuario_auxiliar_id){
$lotacaoFormAtendimentoCompartilhado = $dom->createElement('lotacaoFormAtendimentoCompartilhado');
$headerTransport->appendChild($lotacaoFormAtendimentoCompartilhado);
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuarioAuxiliar->cidadao->cns ?? ''));
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->usuarioAuxiliarOcupacao->codigo ?? ''));
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cnes', $fichaProfissional->usuarioAuxiliarEquipe->unidade->cnes));
if($fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine){
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('ine', $fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine));
}
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProfissional->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dom->appendChild($dadoTransporteTransportXml);
$fichasAtendimentoIndividual = AtendimentoIndividual::where('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
->whereNull('exportacao_id')
->take(99)
->get();
foreach ($fichasAtendimentoIndividual as $i => $fichaAtendimentoIndividual) {
if(!$fichaAtendimentoIndividual->paciente){
continue;
}
$atendimentosIndividuaisPosicoes->push([
'posicao' => $i + 1,
'id' => $fichaAtendimentoIndividual->id,
]);
$atendimentosIndividuais = $dom->createElement('atendimentosIndividuais');
$fichaAtendimentoIndividualMasterTransport->appendChild($atendimentosIndividuais);
if($fichaAtendimentoIndividual->paciente->prontuario){
$atendimentosIndividuais->appendChild($dom->createElement('numeroProntuario', $fichaAtendimentoIndividual->paciente->prontuario));
}
if (Cns::isValid($fichaAtendimentoIndividual->paciente->cidadao->cns)) {
$atendimentosIndividuais->appendChild($dom->createElement('cnsCidadao', $fichaAtendimentoIndividual->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaAtendimentoIndividual->paciente->cidadao->cns)) {
$atendimentosIndividuais->appendChild($dom->createElement('cpfCidadao', $fichaAtendimentoIndividual->paciente->cidadao->cpf ?? ''));
}
$atendimentosIndividuais->appendChild($dom->createElement('dataNascimento', strtotime($fichaAtendimentoIndividual->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$atendimentosIndividuais->appendChild($dom->createElement('localDeAtendimento', $fichaAtendimentoIndividual->local_atendimento_id));
$atendimentosIndividuais->appendChild($dom->createElement('sexo', self::sexo($fichaAtendimentoIndividual->paciente->cidadao->sexo->id)));
$atendimentosIndividuais->appendChild($dom->createElement('turno', $fichaAtendimentoIndividual->turno_id));
$atendimentosIndividuais->appendChild($dom->createElement('tipoAtendimento', $fichaAtendimentoIndividual->tipoAtendimento->codigo_esus));
self::getMedicoes($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
if($fichaAtendimentoIndividual->aleitamento_materno_id){
$atendimentosIndividuais->appendChild($dom->createElement('aleitamentoMaterno', $fichaAtendimentoIndividual->aleitamentoMaterno->codigo_esus));
}
if($fichaAtendimentoIndividual->paciente && $fichaAtendimentoIndividual->paciente->cidadao->sexo->id === Sexo::FEMININO){
if($fichaAtendimentoIndividual->data_ultima_menstruacao){
$atendimentosIndividuais->appendChild($dom->createElement('dumDaGestante', strtotime($fichaAtendimentoIndividual->data_ultima_menstruacao) * 1000));
}
if($fichaAtendimentoIndividual->idade_gestacional_semanas){
$atendimentosIndividuais->appendChild($dom->createElement('idadeGestacional', $fichaAtendimentoIndividual->idade_gestacional_semanas));
}
}
if($fichaAtendimentoIndividual->modalidade_atencao_domiciliar_id){
$atendimentosIndividuais->appendChild($dom->createElement('atencaoDomiciliarModalidade', $fichaAtendimentoIndividual->modalidadeAtencaoDomiciliar->codigo_esus));
}
self::getExame($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
if($fichaAtendimentoIndividual->vacinacao){
$atendimentosIndividuais->appendChild($dom->createElement('vacinaEmDia', $fichaAtendimentoIndividual->vacinacao ? 'true' : 'false'));
}
if($fichaAtendimentoIndividual->observacao){
$atendimentosIndividuais->appendChild($dom->createElement('ficouEmObservacao', $fichaAtendimentoIndividual->observacao ? 'true' : 'false'));
}
self::getEmultis($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
self::getConduta($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
if($fichaAtendimentoIndividual->paciente && $fichaAtendimentoIndividual->paciente->cidadao->sexo->id === Sexo::FEMININO){
if($fichaAtendimentoIndividual->gravidez_planejada){
$atendimentosIndividuais->appendChild($dom->createElement('stGravidezPlanejada', $fichaAtendimentoIndividual->gravidez_planejada ? 'true' : 'false'));
}
if($fichaAtendimentoIndividual->gestacao_previa){
$atendimentosIndividuais->appendChild($dom->createElement('nuGestasPrevias', $fichaAtendimentoIndividual->gestacao_previa));
}
if($fichaAtendimentoIndividual->parto){
$atendimentosIndividuais->appendChild($dom->createElement('nuPartos', $fichaAtendimentoIndividual->parto));
}
}
if($fichaAtendimentoIndividual->racionalidade_saude_id){
$atendimentosIndividuais->appendChild($dom->createElement('racionalidadeSaude', $fichaAtendimentoIndividual->racionalidadeSaude->codigo_esus));
}
$atendimentosIndividuais->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaAtendimentoIndividual->created_at) * 1000));
$timestamp = strtotime($fichaAtendimentoIndividual->created_at);
$timestamp += 5 * 60;
$timestampMillis = $timestamp * 1000;
$dataHoraFinalAtendimento = $dom->createElement('dataHoraFinalAtendimento', $timestampMillis);
$atendimentosIndividuais->appendChild($dataHoraFinalAtendimento);
self::getCondicaoAvaliada($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
self::getSolicitacoesOci($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
self::getIvcf($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
$fichaAtendimentoIndividual->uuid_ficha = $uuid;
$fichaAtendimentoIndividual->exportacao_id = $exportacao->id;
$fichaAtendimentoIndividual->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAtendimentoIndividual->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
retry(3, function() use ($fichaAtendimentoIndividual) {
$fichaAtendimentoIndividual->save();
}, 200);
}
$fichaAtendimentoIndividualMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$fichaAtendimentoIndividualMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
return [
'exportacao' => $exportacao,
'dom' => $dom,
'atendimentos_individuais' => $atendimentosIndividuaisPosicoes,
];
}
private static function getMedicoes(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
$medicoesNecessarias = [
'circunferencia_abdominal',
'perimetro_panturrilha',
'pressao_arterial',
'frequencia_respiratoria',
'frequencia_cardiaca',
'temperatura',
'saturacao_o2',
'glicemia',
'momento_coleta_id',
'peso',
'altura',
'perimetro_cefalico'
];
$existeMedicao = false;
foreach ($medicoesNecessarias as $campo) {
if (!empty($fichaAtendimentoIndividual->$campo)) {
$existeMedicao = true;
break;
}
}
if ($existeMedicao) {
$medicoes = $dom->createElement('medicoes');
$atendimentosIndividuais->appendChild($medicoes);
if (!empty($fichaAtendimentoIndividual->circunferencia_abdominal)) {
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $fichaAtendimentoIndividual->circunferencia_abdominal));
}
if (!empty($fichaAtendimentoIndividual->perimetro_panturrilha)) {
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $fichaAtendimentoIndividual->perimetro_panturrilha));
}
if (!empty($fichaAtendimentoIndividual->pressao_arterial)) {
$pressao = explode('/', $fichaAtendimentoIndividual->pressao_arterial);
if (count($pressao) === 2) {
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
}
}
if (!empty($fichaAtendimentoIndividual->frequencia_respiratoria)) {
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $fichaAtendimentoIndividual->frequencia_respiratoria));
}
if (!empty($fichaAtendimentoIndividual->frequencia_cardiaca)) {
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $fichaAtendimentoIndividual->frequencia_cardiaca));
}
if (!empty($fichaAtendimentoIndividual->temperatura)) {
$medicoes->appendChild($dom->createElement('temperatura', $fichaAtendimentoIndividual->temperatura));
}
if (!empty($fichaAtendimentoIndividual->saturacao_o2)) {
$medicoes->appendChild($dom->createElement('saturacaoO2', $fichaAtendimentoIndividual->saturacao_o2));
}
if (!empty($fichaAtendimentoIndividual->glicemia)) {
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $fichaAtendimentoIndividual->glicemia));
}
if (!empty($fichaAtendimentoIndividual->momento_coleta_id)) {
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $fichaAtendimentoIndividual->momentoColeta->codigo_esus));
}
if (!empty($fichaAtendimentoIndividual->peso)) {
$medicoes->appendChild($dom->createElement('peso', $fichaAtendimentoIndividual->peso));
}
if (!empty($fichaAtendimentoIndividual->altura)) {
$medicoes->appendChild($dom->createElement('altura', $fichaAtendimentoIndividual->altura));
}
if (!empty($fichaAtendimentoIndividual->perimetro_cefalico)) {
$medicoes->appendChild($dom->createElement('perimetroCefalico', $fichaAtendimentoIndividual->perimetro_cefalico));
}
}
}
private static function getCondicaoAvaliada(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_individual_condicao_avaliada')
->select([
'atencao_basica_cadastro_condicao_avaliada.id',
'atencao_basica_cadastro_condicao_avaliada.codigo_esus',
'atencao_basica_cadastro_condicao_avaliada.ativo',
])
->join(
'atencao_basica_cadastro_condicao_avaliada',
'atencao_basica_cadastro_condicao_avaliada.id',
'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id'
)
->where('atencao_basica_atendimento_individual_condicao_avaliada.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
if ($condicaoAvaliada->ativo === 1) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $condicaoAvaliada->codigo_esus));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
else {
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
if ($ciap) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
}
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_individual_doenca_transmissivel')
->select([
'atencao_basica_cadastro_doenca_transmissivel.id',
'atencao_basica_cadastro_doenca_transmissivel.codigo_esus',
'atencao_basica_cadastro_doenca_transmissivel.ativo',
])
->join(
'atencao_basica_cadastro_doenca_transmissivel',
'atencao_basica_cadastro_doenca_transmissivel.id',
'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id'
)
->where('atencao_basica_atendimento_individual_doenca_transmissivel.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosDoencaTransmissivel as $doencaTransmisivel) {
if ($doencaTransmisivel->ativo === 1) {
$problemaDoencaTransmisivel = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaDoencaTransmisivel);
$problemaDoencaTransmisivel->appendChild($dom->createElement('ciap', $doencaTransmisivel->codigo_esus));
$problemaDoencaTransmisivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
else {
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doencaTransmisivel->id))->first() ?? null;
if ($ciap) {
$problemaDoencaTransmisivel = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaDoencaTransmisivel);
$problemaDoencaTransmisivel->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaDoencaTransmisivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
}
$atendimentosRastreamentos = DB::table('atencao_basica_atendimento_individual_rastreamento')
->select([
'atencao_basica_cadastro_rastreamento.id',
'atencao_basica_cadastro_rastreamento.codigo_esus',
'atencao_basica_cadastro_rastreamento.ativo',
])
->join(
'atencao_basica_cadastro_rastreamento',
'atencao_basica_cadastro_rastreamento.id',
'atencao_basica_atendimento_individual_rastreamento.rastreamento_id'
)
->where('atencao_basica_atendimento_individual_rastreamento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosRastreamentos as $rastreamento) {
if ($rastreamento->ativo === 1) {
$problemaRastreamento = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaRastreamento);
$problemaRastreamento->appendChild($dom->createElement('ciap', $rastreamento->codigo_esus));
$problemaRastreamento->appendChild($dom->createElement('isAvaliado', 'true'));
}
else {
$ciap = Ciap::where('id', self::getCiapFromRastreamento($rastreamento->id))->first() ?? null;
if ($ciap) {
$problemaRastreamento = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaRastreamento);
$problemaRastreamento->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaRastreamento->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
}
DB::table('atencao_basica_atendimento_individual_problema_condicao')
->select([
DB::raw('COALESCE(uuid_inicial_problema_condicao, uuid_evolucao) AS uuid_inicial_problema_condicao'),
'uuid_evolucao',
'sequencial_evolucao',
'geral_ciap.codigo AS ciap_codigo',
'cid.codigo AS cid_codigo',
'ambulatorio_problema_condicao_situacao.codigo_esus AS situacao_codigo',
'inicio',
'fim',
])
->leftJoin('ambulatorio_problema_condicao_situacao', 'ambulatorio_problema_condicao_situacao.id', 'atencao_basica_atendimento_individual_problema_condicao.situacao_id')
->leftJoin('geral_ciap', 'geral_ciap.id', 'atencao_basica_atendimento_individual_problema_condicao.ciap_id')
->leftJoin('sigtap.cid', 'cid.id', 'atencao_basica_atendimento_individual_problema_condicao.cid_id')
->where('atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get()
->each(function ($problemaCondicao) use ($dom, &$atendimentosIndividuais) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
if (!is_null($problemaCondicao->situacao_codigo)) {
$problemaCondicaoAvaliada->appendChild($dom->createElement('uuidProblema', $problemaCondicao->uuid_inicial_problema_condicao));
$problemaCondicaoAvaliada->appendChild($dom->createElement('uuidEvolucaoProblema', $problemaCondicao->uuid_evolucao));
$problemaCondicaoAvaliada->appendChild($dom->createElement('coSequencialEvolucao', $problemaCondicao->sequencial_evolucao));
}
if (!is_null($problemaCondicao->ciap_codigo)) {
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $problemaCondicao->ciap_codigo));
}
if (!is_null($problemaCondicao->cid_codigo)) {
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $problemaCondicao->cid_codigo));
}
if (!is_null($problemaCondicao->situacao_codigo)) {
$problemaCondicaoAvaliada->appendChild($dom->createElement('situacao', $problemaCondicao->situacao_codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('dataInicioProblema', strtotime($problemaCondicao->inicio) * 1000));
if ($problemaCondicao->situacao_codigo === SituacaoCodigoEsus::LATENTE || $problemaCondicao->situacao_codigo === SituacaoCodigoEsus::RESOLVIDO) {
$problemaCondicaoAvaliada->appendChild($dom->createElement('dataFimProblema', strtotime($problemaCondicao->fim) * 1000));
}
}
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
});
}
private static function getCiapFromCondicaoAvaliada($condicaoAvaliada)
{
$map = [
CondicaoAvaliada::ASMA => CiapCondicaoAvaliada::ASMA,
CondicaoAvaliada::DESNUTRICAO => CiapCondicaoAvaliada::DESNUTRICAO,
CondicaoAvaliada::DIABETES => CiapCondicaoAvaliada::DIABETES,
CondicaoAvaliada::DPOC => CiapCondicaoAvaliada::DPOC,
CondicaoAvaliada::HIPERTENSAO_ARTERIAL => CiapCondicaoAvaliada::HIPERTENSAO_ARTERIAL,
CondicaoAvaliada::OBESIDADE => CiapCondicaoAvaliada::OBESIDADE,
CondicaoAvaliada::PRE_NATAL => CiapCondicaoAvaliada::PRE_NATAL,
CondicaoAvaliada::PUERICULTURA => CiapCondicaoAvaliada::PUERICULTURA,
CondicaoAvaliada::PUERPERIO_ATE_42_DIAS => CiapCondicaoAvaliada::PUERPERIO,
CondicaoAvaliada::REABILITACAO => CiapCondicaoAvaliada::REABILITACAO,
CondicaoAvaliada::TABAGISMO => CiapCondicaoAvaliada::TABAGISMO,
CondicaoAvaliada::USUARIO_DE_ALCOOL => CiapCondicaoAvaliada::USUARIO_DE_ALCOOL,
CondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS => CiapCondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS,
];
return $map[$condicaoAvaliada] ?? null;
}
private static function getCiapFromDoencaTransmissivel($doencaTransmissivel)
{
$map = [
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
];
return $map[$doencaTransmissivel] ?? null;
}
private static function getCiapFromRastreamento($rastreamento)
{
$map = [
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
];
return $map[$rastreamento] ?? null;
}
private static function getSolicitacoesOci(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais)
{
$atendimentoIndividualProcedimentos = DB::table('atencao_basica_procedimento_atendimento_procedimento')
->select(['procedimento.codigo'])
->join('sigtap.procedimento', 'procedimento.id', 'atencao_basica_procedimento_atendimento_procedimento.procedimento_id')
->join('atencao_basica_procedimento_atendimento', 'atencao_basica_procedimento_atendimento.id', 'atencao_basica_procedimento_atendimento_procedimento.procedimento_atendimento_id')
->where('atencao_basica_procedimento_atendimento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->where('procedimento.codigo', 'LIKE', '09%')
->get();
foreach ($atendimentoIndividualProcedimentos as $procedimento) {
$solicitacoesOci = $dom->createElement('solicitacoesOci');
$atendimentosIndividuais->appendChild($solicitacoesOci);
$solicitacoesOci->appendChild($dom->createElement('codigoSigtap', $procedimento->codigo));
}
}
private static function getOutroCiap($ciap_primario_id){
$ciap_primario_id = DB::table('geral_ciap')
->select(
'geral_ciap.codigo',
)
->where('geral_ciap.id', $ciap_primario_id)
->first();
return $ciap_primario_id->codigo;
}
private static function getExame(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
$atendimentosExame = DB::table('atencao_basica_atendimento_individual_exame_solicitado_avaliado')
->select([
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_esus',
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento',
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.solicitado',
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.avaliado',
])
->join(
'atencao_basica_cadastro_exame_solicitado_avaliado',
'atencao_basica_cadastro_exame_solicitado_avaliado.id',
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.exame_solicitado_avaliado_id'
)
->where('atencao_basica_atendimento_individual_exame_solicitado_avaliado.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosExame as $examesSolicitadosAvaliados) {
if($examesSolicitadosAvaliados->codigo_esus){
$codigoExameSolicitado = $examesSolicitadosAvaliados->codigo_esus;
}else{
$codigoExameSolicitado = $examesSolicitadosAvaliados->codigo_procedimento;
}
if($codigoExameSolicitado){
$exame = $dom->createElement('exame');
$atendimentosIndividuais->appendChild($exame);
$exame->appendChild($dom->createElement('codigoExame', $codigoExameSolicitado));
if($examesSolicitadosAvaliados->avaliado === 1){
$exame->appendChild($dom->createElement('solicitadoAvaliado', "A"));
}
if($examesSolicitadosAvaliados->solicitado === 1){
$exame->appendChild($dom->createElement('solicitadoAvaliado', "S"));
}
}
}
$codigoProcedimento = $atendimentosExame->pluck('codigo_procedimento')->toArray();
$atendimentosOutrosExame = DB::table('atencao_basica_atendimento_individual_outro_exame')
->select([
'parametrizacao_exame.codigo',
'atencao_basica_atendimento_individual_outro_exame.solicitado',
'atencao_basica_atendimento_individual_outro_exame.avaliado',
])
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'atencao_basica_atendimento_individual_outro_exame.exame_id')
->where('atencao_basica_atendimento_individual_outro_exame.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->whereNotIn('parametrizacao_exame.codigo', $codigoProcedimento)
->distinct()
->get();
foreach ($atendimentosOutrosExame as $outrosExamesSolicitadosAvaliados) {
if($outrosExamesSolicitadosAvaliados->codigo){
$exame = $dom->createElement('exame');
$atendimentosIndividuais->appendChild($exame);
$exame->appendChild($dom->createElement('codigoExame', $outrosExamesSolicitadosAvaliados->codigo));
if($outrosExamesSolicitadosAvaliados->avaliado){
$exame->appendChild($dom->createElement('solicitadoAvaliado', "A"));
}
if($outrosExamesSolicitadosAvaliados->solicitado){
$exame->appendChild($dom->createElement('solicitadoAvaliado', "S"));
}
}
}
}
private static function getConduta(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
$atendimentosConduta = DB::table('atencao_basica_atendimento_individual_conduta')
->select([
'atencao_basica_cadastro_conduta.codigo_esus',
])
->join('atencao_basica_cadastro_conduta', 'atencao_basica_cadastro_conduta.id', 'atencao_basica_atendimento_individual_conduta.conduta_id')
->where('atencao_basica_atendimento_individual_conduta.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->whereNotIn('atencao_basica_cadastro_conduta.id', [
AtendimentoIndividualConduta::AGENDAMENTO_PARA_NASF,
AtendimentoIndividualConduta::TRATAMENTO_CONCLUIDO,
])
->get();
foreach ($atendimentosConduta as $conduta) {
$atendimentosIndividuais->appendChild($dom->createElement('condutas', $conduta->codigo_esus));
}
$atendimentosEcaminhamento = DB::table('atencao_basica_atendimento_individual_encaminhamento')
->select([
'atencao_basica_cadastro_encaminhamento.codigo_esus',
])
->join('atencao_basica_cadastro_encaminhamento', 'atencao_basica_cadastro_encaminhamento.id', 'atencao_basica_atendimento_individual_encaminhamento.encaminhamento_id')
->where('atencao_basica_atendimento_individual_encaminhamento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosEcaminhamento as $encaminhamento) {
$atendimentosIndividuais->appendChild($dom->createElement('condutas', $encaminhamento->codigo_esus));
}
}
private static function getEmultis(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
$atendimentosEmultis = DB::table('atencao_basica_atendimento_individual_nasf')
->select([
'atencao_basica_cadastro_nasf.codigo_esus',
])
->join('atencao_basica_cadastro_nasf', 'atencao_basica_cadastro_nasf.id', 'atencao_basica_atendimento_individual_nasf.nasf_id')
->where('atencao_basica_atendimento_individual_nasf.atendimento_individual_id', $fichaAtendimentoIndividual->id)
->get();
foreach ($atendimentosEmultis as $emulti) {
$atendimentosIndividuais->appendChild($dom->createElement('emultis', $emulti->codigo_esus));
}
}
private static function sexo($sexo_id) {
$sexo = null;
if ($sexo_id === Sexo::MASCULINO) {
$sexo = ExportacaoSexo::MASCULINO;
}
else if ($sexo_id === Sexo::FEMININO) {
$sexo = ExportacaoSexo::FEMININO;
}
else if ($sexo_id === Sexo::INDETERMINADO) {
$sexo = ExportacaoSexo::INDETERMINADO;
}
else {
$sexo = ExportacaoSexo::IGNORADO;
}
return $sexo;
}
private static function getIvcf(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais)
{
$atendimentoIndividualIvcf = AtendimentoIndividualIvcf::where('atendimento_individual_id', $fichaAtendimentoIndividual->id)->first();
if ($atendimentoIndividualIvcf) {
$pacienteIdade = $atendimentoIndividualIvcf->atendimentoIndividual->paciente->cidadao->idade['anos'] ?? null;
$resultado = null;
$hasSgIdade = true;
$hasSgPercepcaoSaude = false;
$hasSgAvdInstrumental = false;
$hasSgAvdBasica = false;
$hasSgCognicao = false;
$hasSgHumor = false;
$hasSgAlcancePreensaoPinca = false;
$hasSgCapAerobicaMuscular = false;
$hasSgMarcha = false;
$hasSgContinencia = false;
$hasSgVisao = false;
$hasSgAudicao = false;
$hasSgComorbidade = false;
$dataResultado = strtotime($atendimentoIndividualIvcf->updated_at) * 1000;
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
$resultado += 1;
}
else if ($pacienteIdade >= 85) {
$resultado += 3;
}
if ($atendimentoIndividualIvcf->estado_saude_geral === 'regular_ou_ruim') {
$resultado += 1;
$hasSgPercepcaoSaude = true;
}
if ($atendimentoIndividualIvcf->limitacao_compras || $atendimentoIndividualIvcf->limitacao_gestao_financeira || $atendimentoIndividualIvcf->limitacao_tarefas_domesticas) {
$resultado += 4;
$hasSgAvdInstrumental = true;
}
if ($atendimentoIndividualIvcf->banho_independencia) {
$resultado += 6;
$hasSgAvdBasica = true;
}
if ($atendimentoIndividualIvcf->relato_esquecimento_por_terceiros) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoIndividualIvcf->esquecimento_piorando) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoIndividualIvcf->esquecimento_impacta_atividades) {
$resultado += 2;
$hasSgCognicao = true;
}
if ($atendimentoIndividualIvcf->humor_tristeza_desanimo) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoIndividualIvcf->perda_interesse_atividades) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoIndividualIvcf->limitacao_elevar_bracos) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoIndividualIvcf->limitacao_motricidade_fina) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoIndividualIvcf->perda_peso_nao_intencional || $atendimentoIndividualIvcf->imc_abaixo_22 || $atendimentoIndividualIvcf->panturrilha_abaixo_31 || $atendimentoIndividualIvcf->marcha_lenta_4m_maior_5s) {
$resultado += 2;
$hasSgCapAerobicaMuscular = true;
}
if ($atendimentoIndividualIvcf->dificuldade_caminhar_impacto_atividades) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoIndividualIvcf->quedas_recorrentes) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoIndividualIvcf->incontinencia) {
$resultado += 2;
$hasSgContinencia = true;
}
if ($atendimentoIndividualIvcf->problema_visao_impacto_atividades) {
$resultado += 2;
$hasSgVisao = true;
}
if ($atendimentoIndividualIvcf->problema_audicao_impacto_atividades) {
$resultado += 2;
$hasSgAudicao = true;
}
if ($atendimentoIndividualIvcf->doencas_cronicas_multiplas || $atendimentoIndividualIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoIndividualIvcf->internacao_ultimos_6_meses) {
$resultado += 4;
$hasSgComorbidade = true;
}
$ivcf = $dom->createElement('ivcf');
$atendimentosIndividuais->appendChild($ivcf);
$ivcf->appendChild($dom->createElement('resultado', $resultado));
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
}
}
}