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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,566 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
use App\Enums\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
use App\Enums\AtencaoBasica\TipoAtendimento;
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\AtendimentoDomiciliar\AtendimentoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimento;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimentoIvcf;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\Geral\Ciap;
use App\Models\Sigtap\Cid;
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 FichaAtendimentoDomiciliarService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasAtendimentoDomiciliar($mes_ano) as $fichaAtendimentoDomiciliar) {
$dadosExportacao = self::getDadosExportacao($fichaAtendimentoDomiciliar, $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, 'AD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
if (file_exists($xmlPath)) {
unlink($xmlPath);
}
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasAtendimentoDomiciliar($mesAnoInicial, false) as $fichaAtendimentoDomiciliar) {
$dadosExportacao = self::getDadosExportacao($fichaAtendimentoDomiciliar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaAtendimentoDomiciliar->data,
'usuario_id' => $fichaAtendimentoDomiciliar->usuario->id,
'ocupacao_id' => $fichaAtendimentoDomiciliar->ocupacao->id,
'equipe_id' => $fichaAtendimentoDomiciliar->equipe->id,
'atendimento_domiciliar_id' => $fichaAtendimentoDomiciliar->id,
'atendimento_domiciliar_atendimentos' => $dadosExportacao['atendimento_domiciliar_atendimentos'],
'xml' => [
'nome_arquivo' => 'AD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasAtendimentoDomiciliar($mes_ano, $somenteMesAno = true)
{
return AtendimentoDomiciliar::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', '>=', substr($mes_ano, 0, 2));
});
})
)
->get();
}
private static function getDadosExportacao($fichaAtendimentoDomiciliar, $exportacaoArquivoId = null, $usuarioId = null)
{
$atendimentoDomiciliarAtendimentosPosicoes = collect();
$uuid = ExportacaoService::getUuid($fichaAtendimentoDomiciliar->equipe->unidade->cnes);
$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/fichaatendimentodomiciliarmaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_DOMICILIAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAtendimentoDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAtendimentoDomiciliar->equipe->unidade->cnes));
if($fichaAtendimentoDomiciliar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAtendimentoDomiciliar->equipe->area->numero_ine));
}
$fichaAtendimentoDomiciliarMasterTransport = $dom->createElement('ns4:fichaAtendimentoDomiciliarMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaAtendimentoDomiciliarMasterTransport);
$fichaAtendimentoDomiciliarMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaAtendimentoDomiciliarMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$headerTransport = $dom->createElement('headerTransport');
$fichaAtendimentoDomiciliarMasterTransport->appendChild($headerTransport);
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
$headerTransport->appendChild($lotacaoFormPrincipal);
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaAtendimentoDomiciliar->usuario->cidadao->cns ?? ''));
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaAtendimentoDomiciliar->ocupacao->codigo ));
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaAtendimentoDomiciliar->equipe->unidade->cnes));
if($fichaAtendimentoDomiciliar->equipe->area->numero_ine){
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaAtendimentoDomiciliar->equipe->area->numero_ine));
}
if($fichaAtendimentoDomiciliar->usuario_auxiliar_id){
$lotacaoFormAtendimentoCompartilhado = $dom->createElement('lotacaoFormAtendimentoCompartilhado');
$headerTransport->appendChild($lotacaoFormAtendimentoCompartilhado);
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('profissionalCNS', $fichaAtendimentoDomiciliar->usuarioAuxiliar->cidadao->cns ?? ''));
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cboCodigo_2002', $fichaAtendimentoDomiciliar->ocupacaoAuxiliar->codigo ));
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cnes', $fichaAtendimentoDomiciliar->equipeAuxiliar->unidade->cnes));
if($fichaAtendimentoDomiciliar->equipeAuxiliar->area->numero_ine){
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('ine', $fichaAtendimentoDomiciliar->equipeAuxiliar->area->numero_ine));
}
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAtendimentoDomiciliar->data) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAtendimentoDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$atendimentos = AtendimentoDomiciliarAtendimento::where('atendimento_domiciliar_id', $fichaAtendimentoDomiciliar->id)
->get();
foreach ($atendimentos as $i => $atendimento) {
$atendimentoDomiciliarAtendimentosPosicoes->push([
'posicao' => $i + 1,
'id' => $atendimento->id,
]);
$atendimentosDomiciliares = $dom->createElement('atendimentosDomiciliares');
$fichaAtendimentoDomiciliarMasterTransport->appendChild($atendimentosDomiciliares);
$atendimentosDomiciliares->appendChild($dom->createElement('turno', $atendimento->turno_id));
if (Cns::isValid($atendimento->paciente->cidadao->cns)) {
$atendimentosDomiciliares->appendChild($dom->createElement('cnsCidadao', $atendimento->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($atendimento->paciente->cidadao->cns)) {
$atendimentosDomiciliares->appendChild($dom->createElement('cpfCidadao', $atendimento->paciente->cidadao->cpf ?? ''));
}
$atendimentosDomiciliares->appendChild($dom->createElement('dataNascimento', strtotime($atendimento->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$atendimentosDomiciliares->appendChild($dom->createElement('sexo', self::sexo($atendimento->paciente->cidadao->sexo->id)));
$atendimentosDomiciliares->appendChild($dom->createElement('localAtendimento', $atendimento->local_atendimento_id));
if($atendimento->tipoAtendimento->id != TipoAtendimento::VISITA_DOMICILIAR_POS_OBITO){
$atendimentosDomiciliares->appendChild($dom->createElement('atencaoDomiciliarModalidade', $atendimento->modalidade->codigo_esus));
}
$atendimentosDomiciliares->appendChild($dom->createElement('tipoAtendimento', $atendimento->tipoAtendimento->codigo_esus));
if (count($atendimento->condicoes) > 0) {
foreach ($atendimento->condicoes as $condicoes) {
$atendimentosDomiciliares->appendChild($dom->createElement('condicoesAvaliadas', $condicoes->condicao->codigo));
}
}
self::getCondicaoAvaliada($dom, $atendimento, $atendimentosDomiciliares);
self::getIvcf($dom, $atendimento, $atendimentosDomiciliares);
if (count($atendimento->procedimentos) > 0) {
foreach ($atendimento->procedimentos as $procedimento) {
$atendimentosDomiciliares->appendChild($dom->createElement('procedimentos', $procedimento->codigo_procedimento));
}
}
if($atendimento->conduta_desfecho_id){
$atendimentosDomiciliares->appendChild($dom->createElement('condutaDesfecho', $atendimento->condutaDesfecho->codigo));
}
}
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaAtendimentoDomiciliar->uuid_ficha = $uuid;
$fichaAtendimentoDomiciliar->exportacao_id = $exportacao->id;
$fichaAtendimentoDomiciliar->data_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAtendimentoDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAtendimentoDomiciliar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'atendimento_domiciliar_atendimentos' => $atendimentoDomiciliarAtendimentosPosicoes,
];
}
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 getCondicaoAvaliada(&$dom, $atendimento, &$atendimentosDomiciliares){
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_domiciliar_atend_condicao_avaliada')
->select([
'atencao_basica_cadastro_condicao_avaliada.id',
])
->join(
'atencao_basica_cadastro_condicao_avaliada',
'atencao_basica_cadastro_condicao_avaliada.id',
'atencao_basica_atendimento_domiciliar_atend_condicao_avaliada.condicao_avaliada_id'
)
->where('atencao_basica_atendimento_domiciliar_atend_condicao_avaliada.atendimento_domiciliar_atendimento_id', $atendimento->id)
->get();
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
if ($ciap) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel')
->select([
'atencao_basica_cadastro_doenca_transmissivel.id',
])
->join(
'atencao_basica_cadastro_doenca_transmissivel',
'atencao_basica_cadastro_doenca_transmissivel.id',
'atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel.doenca_transmissivel_id'
)
->where('atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel.atendimento_domiciliar_atendimento_id', $atendimento->id)
->get();
foreach ($atendimentosDoencaTransmissivel as $doenca) {
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doenca->id))->first() ?? null;
if ($ciap) {
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($doencaTransmissivel);
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosRastreamento = DB::table('atencao_basica_atendimento_domiciliar_atend_rastreamento')
->select([
'atencao_basica_cadastro_rastreamento.id',
])
->join(
'atencao_basica_cadastro_rastreamento',
'atencao_basica_cadastro_rastreamento.id',
'atencao_basica_atendimento_domiciliar_atend_rastreamento.rastreamento_id'
)
->where('atencao_basica_atendimento_domiciliar_atend_rastreamento.atendimento_domiciliar_atendimento_id', $atendimento->id)
->get();
foreach ($atendimentosRastreamento as $doenca) {
$ciap = Ciap::where('id', self::getCiapFromRastreamento($doenca->id))->first() ?? null;
if ($ciap) {
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($doencaTransmissivel);
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_domiciliar_atend_problema_condicao')
->select([
'atencao_basica_atendimento_domiciliar_atend_problema_condicao.ciap_id',
'atencao_basica_atendimento_domiciliar_atend_problema_condicao.cid_id',
])
->where('atencao_basica_atendimento_domiciliar_atend_problema_condicao.atendimento_domiciliar_atendimento_id', $atendimento->id)
->get();
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
if ($condicaoAvaliada->ciap_id) {
$ciap = Ciap::where('id', $condicaoAvaliada->ciap_id)->first() ?? null;
if ($ciap) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
if ($condicaoAvaliada->cid_id) {
$cid = Cid::where('id', $condicaoAvaliada->cid_id)->first() ?? null;
if ($cid) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $cid->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
}
if($atendimento->codigo_cid){
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $atendimento->codigo_cid));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
if($atendimento->codigo_ciap){
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $atendimento->codigo_ciap));
$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($condicaoAvaliada)
{
$map = [
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
];
return $map[$condicaoAvaliada] ?? null;
}
private static function getCiapFromRastreamento($condicaoAvaliada)
{
$map = [
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
];
return $map[$condicaoAvaliada] ?? null;
}
private static function getIvcf(&$dom, $atendimento, &$atendimentosDomiciliares)
{
$atendimentoDomiciliarAtendimentoIvcf = AtendimentoDomiciliarAtendimentoIvcf::where('atendimento_domiciliar_atendimento_id', $atendimento->id)->first();
if ($atendimentoDomiciliarAtendimentoIvcf) {
$pacienteIdade = $atendimentoDomiciliarAtendimentoIvcf->atendimentoDomiciliarAtendimento->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($atendimentoDomiciliarAtendimentoIvcf->updated_at) * 1000;
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
$resultado += 1;
}
else if ($pacienteIdade >= 85) {
$resultado += 3;
}
if ($atendimentoDomiciliarAtendimentoIvcf->estado_saude_geral === 'regular_ou_ruim') {
$resultado += 1;
$hasSgPercepcaoSaude = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_compras || $atendimentoDomiciliarAtendimentoIvcf->limitacao_gestao_financeira || $atendimentoDomiciliarAtendimentoIvcf->limitacao_tarefas_domesticas) {
$resultado += 4;
$hasSgAvdInstrumental = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->banho_independencia) {
$resultado += 6;
$hasSgAvdBasica = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->relato_esquecimento_por_terceiros) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->esquecimento_piorando) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->esquecimento_impacta_atividades) {
$resultado += 2;
$hasSgCognicao = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->humor_tristeza_desanimo) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->perda_interesse_atividades) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_elevar_bracos) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_motricidade_fina) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->perda_peso_nao_intencional || $atendimentoDomiciliarAtendimentoIvcf->imc_abaixo_22 || $atendimentoDomiciliarAtendimentoIvcf->panturrilha_abaixo_31 || $atendimentoDomiciliarAtendimentoIvcf->marcha_lenta_4m_maior_5s) {
$resultado += 2;
$hasSgCapAerobicaMuscular = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->dificuldade_caminhar_impacto_atividades) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->quedas_recorrentes) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->incontinencia) {
$resultado += 2;
$hasSgContinencia = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->problema_visao_impacto_atividades) {
$resultado += 2;
$hasSgVisao = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->problema_audicao_impacto_atividades) {
$resultado += 2;
$hasSgAudicao = true;
}
if ($atendimentoDomiciliarAtendimentoIvcf->doencas_cronicas_multiplas || $atendimentoDomiciliarAtendimentoIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoDomiciliarAtendimentoIvcf->internacao_ultimos_6_meses) {
$resultado += 4;
$hasSgComorbidade = true;
}
$ivcf = $dom->createElement('ivcf');
$atendimentosDomiciliares->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));
}
}
}

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

View File

@@ -0,0 +1,919 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
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\Enums\Sigtap\Procedimento as ProcedimentoEnum;
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologico;
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologicoIvcf;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\Geral\Ciap;
use App\Models\Sigtap\Cid;
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 FichaAtendimentoOdontologicoService 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);
if ($dadosExportacao === null) {
continue;
}
$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, 'AO_' . $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);
if ($dadosExportacao === null) {
continue;
}
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaProfissional->data_atendimento,
'usuario_id' => $fichaProfissional->usuario->id,
'ocupacao_id' => $fichaProfissional->ocupacao->id,
'equipe_id' => $fichaProfissional->equipe->id,
'atendimentos_odontologicos' => $dadosExportacao['atendimentos_odontologicos'],
'xml' => [
'nome_arquivo' => 'AO_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
}
return $exportacoes;
}
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
{
return AtendimentoOdontologico::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->groupBy([
'usuario_id',
'equipe_id',
'ocupacao_id',
'data_atendimento',
])
->get();
}
private static function getIteracoesCount($fichaProfissional, $mes_ano = null)
{
$count = AtendimentoOdontologico::when($mes_ano, fn ($q) => $q
->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2))
)
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('ocupacao_id', $fichaProfissional->ocupacao_id)
->whereNull('exportacao_id')
->count();
return ceil($count / 99);
}
private static function getDadosExportacao($fichaProfissional, $exportacaoArquivoId = null, $usuarioId = null)
{
$atendimentosOdontologicosPosicoes = 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/fichaatendimentoodontologicomaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_ODONTOLOGICO));
$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));
}
$fichaAtendimentoOdontologicoMasterTransport = $dom->createElement('ns4:fichaAtendimentoOdontologicoMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaAtendimentoOdontologicoMasterTransport);
$fichaAtendimentoOdontologicoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaAtendimentoOdontologicoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$fichasAtendimentoOdontologico = AtendimentoOdontologico::whereNull('exportacao_id')
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('ocupacao_id', $fichaProfissional->ocupacao_id)
->where('data_atendimento', $fichaProfissional->data_atendimento)
->take(99)
->get();
if ($fichasAtendimentoOdontologico->isEmpty()) {
$exportacao->delete();
return null;
}
foreach ($fichasAtendimentoOdontologico as $i => $fichaAtendimentoOdontologico) {
$atendimentosOdontologicosPosicoes->push([
'posicao' => $i + 1,
'id' => $fichaAtendimentoOdontologico->id,
]);
$atendimentosOdontologicos = $dom->createElement('atendimentosOdontologicos');
$fichaAtendimentoOdontologicoMasterTransport->appendChild($atendimentosOdontologicos);
if($fichaAtendimentoOdontologico->paciente->prontuario){
$atendimentosOdontologicos->appendChild($dom->createElement('numProntuario', $fichaAtendimentoOdontologico->paciente->prontuario));
}
if (Cns::isValid($fichaAtendimentoOdontologico->paciente->cidadao->cns)) {
$atendimentosOdontologicos->appendChild($dom->createElement('cnsCidadao', $fichaAtendimentoOdontologico->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaAtendimentoOdontologico->paciente->cidadao->cns)) {
$atendimentosOdontologicos->appendChild($dom->createElement('cpfCidadao', $fichaAtendimentoOdontologico->paciente->cidadao->cpf ?? ''));
}
$atendimentosOdontologicos->appendChild($dom->createElement('dtNascimento', strtotime($fichaAtendimentoOdontologico->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$atendimentosOdontologicos->appendChild($dom->createElement('localAtendimento', $fichaAtendimentoOdontologico->local_atendimento_id));
if($fichaAtendimentoOdontologico->paciente->cidadao->sexo->id === Sexo::FEMININO){
if($fichaAtendimentoOdontologico->gestante){
$atendimentosOdontologicos->appendChild($dom->createElement('gestante', $fichaAtendimentoOdontologico->gestante ? 'true' : 'false'));
}
}
$atendimentosOdontologicos->appendChild($dom->createElement('necessidadesEspeciais', $fichaAtendimentoOdontologico->necessidades_especiais ? 'true' : 'false'));
$atendimentosOdontologicos->appendChild($dom->createElement('tipoAtendimento', $fichaAtendimentoOdontologico->tipoAtendimento->codigo_esus));
if (count($fichaAtendimentoOdontologico->condutaEncaminhamento) > 0) {
foreach ($fichaAtendimentoOdontologico->condutaEncaminhamento as $condutaEncaminhamento) {
$atendimentosOdontologicos->appendChild($dom->createElement('tiposEncamOdonto', $condutaEncaminhamento->conduta_encaminhamento_id));
}
}
if (count($fichaAtendimentoOdontologico->fornecimento) > 0) {
foreach ($fichaAtendimentoOdontologico->fornecimento as $fornecimento) {
$atendimentosOdontologicos->appendChild($dom->createElement('tiposFornecimOdonto', $fornecimento->fornecimento_id));
}
}
if (count($fichaAtendimentoOdontologico->vigilancia) > 0) {
foreach ($fichaAtendimentoOdontologico->vigilancia as $vigilancia) {
$atendimentosOdontologicos->appendChild($dom->createElement('tiposVigilanciaSaudeBucal', $vigilancia->vigilancia_bucal_id));
}
}
if ($fichaAtendimentoOdontologico->tipoConsulta) {
$atendimentosOdontologicos->appendChild($dom->createElement('tiposConsultaOdonto', $fichaAtendimentoOdontologico->tipoConsulta->codigo_esus));
}
$procedimentos = $fichaAtendimentoOdontologico->procedimento()
->select('codigo_procedimento', 'quantidade')
->where('codigo_procedimento', 'NOT LIKE', '09%')
->get();
$procedimentosOci = $fichaAtendimentoOdontologico->procedimento()
->select('codigo_procedimento')
->where('codigo_procedimento', 'LIKE', '09%')
->get();
if ($procedimentos->count() > 0) {
$listaDeProcedimentosEsus = [
ProcedimentoEnum::RADIOGRAFIA_OCLUSAL,
ProcedimentoEnum::COLOCACAO_DE_PLACA_DE_MORDIDA,
ProcedimentoEnum::MANUTENCAO_CONSERTO_DE_APARELHO_ORTODONTICO_ORTOPEDICO,
ProcedimentoEnum::MOLDAGEM_DENTO_GENGIVAL_COM_FINALIDADE_ORTODONTICA,
ProcedimentoEnum::EXERESE_DE_CISTO_ODONTOGENICO_E_NAO_ODONTOGENICO,
ProcedimentoEnum::TRATAMENTO_CIRURGICO_DE_FISTULA_INTRA_EXTRAORAL,
ProcedimentoEnum::CORRECAO_DE_BRIDAS_MUSCULARES,
ProcedimentoEnum::CORRECAO_DE_IRREGULARIDADES_DE_REBORDO_ALVEOLAR,
ProcedimentoEnum::REMOCAO_DE_TORUS_E_EXOSTOSES,
ProcedimentoEnum::CONTENCAO_DE_DENTES_POR_SPLINTAGEM,
ProcedimentoEnum::REDUCAO_DE_LUXACAO_TEMPORO_MANDIBULAR,
ProcedimentoEnum::RETIRADA_DE_MATERIAL_DE_SINTESE_OSSEA_DENTARIA,
ProcedimentoEnum::MANTENEDOR_DE_ESPACO,
ProcedimentoEnum::PLACA_OCLUSAL,
ProcedimentoEnum::PLANO_INCLINADO,
ProcedimentoEnum::PROTESE_PARCIAL_MANDIBULAR_REMOVIVEL,
ProcedimentoEnum::PROTESE_PARCIAL_MAXILAR_REMOVIVEL,
ProcedimentoEnum::PROTESE_TEMPORARIA,
ProcedimentoEnum::PROTESE_TOTAL_MANDIBULAR,
ProcedimentoEnum::PROTESE_TOTAL_MAXILAR,
ProcedimentoEnum::APARELHO_FIXO_BILATERAL_PARA_FECHAMENTO_DE_DIASTEMA,
ProcedimentoEnum::APARELHO_ORTODONTICO_FIXO,
ProcedimentoEnum::APARELHO_ORTOPEDICO_E_ORTODONTICO_REMOVIVEL,
ProcedimentoEnum::APARELHO_ORTOPEDICO_FIXO,
ProcedimentoEnum::APARELHO_P_BLOQUEIO_MAXILO_MANDIBULAR,
ProcedimentoEnum::APLICACAO_DE_CARIOSTATICO_POR_DENTE,
ProcedimentoEnum::APLICACAO_DE_SELANTE_POR_DENTE,
ProcedimentoEnum::SELAMENTO_PROVISORIO_DE_CAVIDADE_DENTARIA,
ProcedimentoEnum::RADIOGRAFIA_INTERPROXIMAL_BITE_WING,
ProcedimentoEnum::RADIOGRAFIA_PERIAPICAL,
ProcedimentoEnum::CAPEAMENTO_PULPAR,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_ANTERIOR_COM_RESINA_COMPOSTA,
ProcedimentoEnum::TRATAMENTO_INICIAL_DO_DENTE_TRAUMATIZADO,
ProcedimentoEnum::TRATAMENTO_RESTAURADOR_ATRAUMATICO_TRA_ART,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_RESINA_COMPOSTA,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_AMALGAMA,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_IONOMERO_DE_VIDRO,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_ANTERIOR_COM_RESINA_COMPOSTA,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_POSTERIOR_COM_RESINA_COMPOSTA,
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_POSTERIOR_COM_AMALGAMA,
ProcedimentoEnum::ACESSO_A_POLPA_DENTARIA_E_MEDICACAO_POR_DENTE,
ProcedimentoEnum::CURATIVO_DE_DEMORA_C_OU_S_PREPARO_BIOMECANICO,
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_DECIDUO,
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_BIRRADICULAR,
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_COM_TRES_OU_MAIS_RAIZES,
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_UNIRRADICULAR,
ProcedimentoEnum::PULPOTOMIA_DENTARIA,
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_BI_RADICULAR,
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_COM_3_OU_MAIS_RAIZES,
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_UNI_RADICULAR,
ProcedimentoEnum::SELAMENTO_DE_PERFURACAO_RADICULAR,
ProcedimentoEnum::MOLDAGEM_DENTO_GENGIVAL_P_CONSTRUCAO_DE_PROTESE_DENTARIA,
ProcedimentoEnum::REEMBASAMENTO_E_CONSERTO_DE_PROTESE_DENTARIA,
ProcedimentoEnum::CIMENTACAO_DE_PROTESE_DENTARIA,
ProcedimentoEnum::ADAPTACAO_DE_PROTESE_DENTARIA,
ProcedimentoEnum::AJUSTE_OCLUSAL,
ProcedimentoEnum::INSTALACAO_DE_PROTESE_DENTARIA,
ProcedimentoEnum::APICECTOMIA_COM_OU_SEM_OBTURACAO_RETROGRADA,
ProcedimentoEnum::CURETAGEM_PERIAPICAL,
ProcedimentoEnum::EXODONTIA_DE_DENTE_DECIDUO,
ProcedimentoEnum::EXODONTIA_DE_DENTE_PERMANENTE,
ProcedimentoEnum::ODONTOSECCAO_RADILECTOMIA_TUNELIZACAO,
ProcedimentoEnum::REIMPLANTE_E_TRANSPLANTE_DENTAL_POR_ELEMENTO,
ProcedimentoEnum::REMOCAO_DE_DENTE_RETIDO_INCLUSO_IMPACTADO,
ProcedimentoEnum::TRATAMENTO_CIRURGICO_PARA_TRACIONAMENTO_DENTAL,
ProcedimentoEnum::TRATAMENTO_DE_ALVEOLITE,
ProcedimentoEnum::ULOTOMIA_ULECTOMIA,
ProcedimentoEnum::COROA_PROVISORIA,
ProcedimentoEnum::PROTESES_CORONARIAS_INTRA_RADICULARES_FIXAS_ADESIVAS_POR_ELEMENTO,
ProcedimentoEnum::COROA_DE_ACO_E_POLICARBOXILATO,
ProcedimentoEnum::PROTESE_DENTARIA_SOBRE_IMPLANTE,
ProcedimentoEnum::RASPAGEM_ALISAMENTO_SUBGENGIVAIS_POR_SEXTANTE,
ProcedimentoEnum::RASPAGEM_CORONO_RADICULAR_POR_SEXTANTE,
ProcedimentoEnum::RASPAGEM_ALISAMENTO_E_POLIMENTO_SUPRAGENGIVAIS_POR_SEXTANTE,
ProcedimentoEnum::APROFUNDAMENTO_DE_VESTIBULO_ORAL_POR_SEXTANTE,
ProcedimentoEnum::GENGIVECTOMIA_POR_SEXTANTE,
ProcedimentoEnum::EXODONTIA_MULTIPLA_COM_ALVEOLOPLASTIA_POR_SEXTANTE,
ProcedimentoEnum::GENGIVOPLASTIA_POR_SEXTANTE,
ProcedimentoEnum::TRATAMENTO_CIRURGICO_PERIODONTAL_POR_SEXTANTE,
];
$procedimentosComQuantidadeLimitada = [
ProcedimentoEnum::PRIMEIRA_CONSULTA_ODONTOLOGICA_PROGRAMATICA,
ProcedimentoEnum::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO,
ProcedimentoEnum::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_ESPECIALIZADA_EXCETO_MEDICO,
ProcedimentoEnum::ATENDIMENTO_DE_URGENCIA_EM_ATENCAO_ESPECIALIZADA,
ProcedimentoEnum::ATENDIMENTO_DE_URGENCIA_EM_ATENCAO_PRIMARIA,
ProcedimentoEnum::RETIRADA_DE_PONTOS_DE_CIRURGIAS_POR_PACIENTE,
ProcedimentoEnum::PROFILAXIA_REMOCAO_DA_PLACA_BACTERIANA,
ProcedimentoEnum::ORIENTACAO_DE_HIGIENE_BUCAL,
ProcedimentoEnum::APLICACAO_TOPICA_DE_FLUOR_INDIVIDUAL_POR_SESSAO,
ProcedimentoEnum::DRENAGEM_DE_ABSCESSO_DA_BOCA_E_ANEXOS,
];
$procedimentosComLimiteDeSeis = [
ProcedimentoEnum::RASPAGEM_ALISAMENTO_SUBGENGIVAIS_POR_SEXTANTE,
ProcedimentoEnum::RASPAGEM_CORONO_RADICULAR_POR_SEXTANTE,
ProcedimentoEnum::RASPAGEM_ALISAMENTO_E_POLIMENTO_SUPRAGENGIVAIS_POR_SEXTANTE,
ProcedimentoEnum::APROFUNDAMENTO_DE_VESTÍBULO_ORAL_POR_SEXTANTE,
ProcedimentoEnum::GENGIVECTOMIA_POR_SEXTANTE,
ProcedimentoEnum::EXODONTIA_MÚLTIPLA_COM_ALVEOLOPLASTIA_POR_SEXTANTE,
ProcedimentoEnum::GENGIVOPLASTIA_POR_SEXTANTE,
ProcedimentoEnum::TRATAMENTO_CIRÚRGICO_PERIODONTAL_POR_SEXTANTE,
];
$procedimentosAgrupados = [];
foreach ($procedimentos as $procedimento) {
$codigo = $procedimento->codigo_procedimento;
$quantidade = $procedimento->quantidade;
if (in_array($codigo, $procedimentosComQuantidadeLimitada) || !in_array($codigo, $listaDeProcedimentosEsus)) {
$procedimentosAgrupados[$codigo] = 1;
} elseif (in_array($codigo, $procedimentosComLimiteDeSeis)) {
if (isset($procedimentosAgrupados[$codigo])) {
$procedimentosAgrupados[$codigo] += $quantidade;
} else {
$procedimentosAgrupados[$codigo] = $quantidade;
}
}
else {
if (isset($procedimentosAgrupados[$codigo])) {
$procedimentosAgrupados[$codigo] += $quantidade;
} else {
$procedimentosAgrupados[$codigo] = $quantidade;
}
}
}
foreach ($procedimentosAgrupados as $codigo => &$quantidade) {
if (in_array($codigo, $procedimentosComLimiteDeSeis)) {
$quantidade = (int) ceil($quantidade / 6);
}
}
unset($quantidade);
foreach ($procedimentosAgrupados as $codigo => $quantidade) {
$procedimentosRealizados = $dom->createElement('procedimentosRealizados');
$atendimentosOdontologicos->appendChild($procedimentosRealizados);
$procedimentosRealizados->appendChild($dom->createElement('coMsProcedimento', $codigo));
$procedimentosRealizados->appendChild($dom->createElement('quantidade', $quantidade));
}
}
$atendimentosOdontologicos->appendChild($dom->createElement('turno', $fichaAtendimentoOdontologico->turno_id));
$atendimentosOdontologicos->appendChild($dom->createElement('sexo', self::sexo($fichaAtendimentoOdontologico->paciente->cidadao->sexo->id)));
self::getExames($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
self::getIvcf($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
$atendimentosOdontologicos->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaAtendimentoOdontologico->created_at) * 1000));
$timestamp = strtotime($fichaAtendimentoOdontologico->created_at);
$timestamp += 5 * 60;
$timestampMillis = $timestamp * 1000;
$dataHoraFinalAtendimento = $dom->createElement('dataHoraFinalAtendimento', $timestampMillis);
$atendimentosOdontologicos->appendChild($dataHoraFinalAtendimento);
self::getMedicoes($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
self::getCondicaoAvaliada($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
if ($procedimentosOci->count() > 0) {
foreach ($procedimentosOci as $procedimento) {
$solicitacoesOci = $dom->createElement('solicitacoesOci');
$atendimentosOdontologicos->appendChild($solicitacoesOci);
$solicitacoesOci->appendChild($dom->createElement('codigoSigtap', $procedimento->codigo_procedimento));
}
}
$fichaAtendimentoOdontologico->uuid_ficha = $uuid;
$fichaAtendimentoOdontologico->exportacao_id = $exportacao->id;
$fichaAtendimentoOdontologico->data_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAtendimentoOdontologico->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAtendimentoOdontologico->save();
}
$headerTransport = $dom->createElement('headerTransport');
$fichaAtendimentoOdontologicoMasterTransport->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 &&
$fichaProfissional->usuarioAuxiliarEquipe->area &&
$fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine
) {
$lotacaoFormAtendimentoCompartilhado->appendChild(
$dom->createElement('ine', $fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine)
);
}
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProfissional->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
return [
'exportacao' => $exportacao,
'dom' => $dom,
'atendimentos_odontologicos' => $atendimentosOdontologicosPosicoes,
];
}
private static function getMedicoes(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos){
$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($fichaAtendimentoOdontologico->$campo)) {
$existeMedicao = true;
break;
}
}
if ($existeMedicao) {
$medicoes = $dom->createElement('medicoes');
$atendimentosOdontologicos->appendChild($medicoes);
if (!empty($fichaAtendimentoOdontologico->circunferencia_abdominal)) {
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $fichaAtendimentoOdontologico->circunferencia_abdominal));
}
if (!empty($fichaAtendimentoOdontologico->perimetro_panturrilha)) {
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $fichaAtendimentoOdontologico->perimetro_panturrilha));
}
if (!empty($fichaAtendimentoOdontologico->pressao_arterial)) {
$pressao = explode('/', $fichaAtendimentoOdontologico->pressao_arterial);
if (count($pressao) === 2) {
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
}
}
if (!empty($fichaAtendimentoOdontologico->frequencia_respiratoria)) {
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $fichaAtendimentoOdontologico->frequencia_respiratoria));
}
if (!empty($fichaAtendimentoOdontologico->frequencia_cardiaca)) {
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $fichaAtendimentoOdontologico->frequencia_cardiaca));
}
if (!empty($fichaAtendimentoOdontologico->temperatura)) {
$medicoes->appendChild($dom->createElement('temperatura', $fichaAtendimentoOdontologico->temperatura));
}
if (!empty($fichaAtendimentoOdontologico->saturacao_o2)) {
$medicoes->appendChild($dom->createElement('saturacaoO2', $fichaAtendimentoOdontologico->saturacao_o2));
}
if (!empty($fichaAtendimentoOdontologico->glicemia)) {
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $fichaAtendimentoOdontologico->glicemia));
}
if (!empty($fichaAtendimentoOdontologico->momento_coleta_id)) {
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $fichaAtendimentoOdontologico->momentoColeta->codigo_esus));
}
if (!empty($fichaAtendimentoOdontologico->peso)) {
$medicoes->appendChild($dom->createElement('peso', $fichaAtendimentoOdontologico->peso));
}
if (!empty($fichaAtendimentoOdontologico->altura)) {
$medicoes->appendChild($dom->createElement('altura', $fichaAtendimentoOdontologico->altura));
}
if (!empty($fichaAtendimentoOdontologico->perimetro_cefalico)) {
$medicoes->appendChild($dom->createElement('perimetroCefalico', $fichaAtendimentoOdontologico->perimetro_cefalico));
}
}
}
private static function getCondicaoAvaliada(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos){
$ciapsAdicionados = [];
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_odontologico_condicao_avaliada')
->select([
'atencao_basica_cadastro_condicao_avaliada.id',
])
->join(
'atencao_basica_cadastro_condicao_avaliada',
'atencao_basica_cadastro_condicao_avaliada.id',
'atencao_basica_atendimento_odontologico_condicao_avaliada.condicao_avaliada_id'
)
->where('atencao_basica_atendimento_odontologico_condicao_avaliada.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
->get();
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
if ($ciap) {
$ciapsAdicionados[] = $ciap->id; // ou $ciap->codigo, dependendo do que você quer evitar duplicar
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_odontologico_doenca_transmissivel')
->select([
'atencao_basica_cadastro_doenca_transmissivel.id',
])
->join(
'atencao_basica_cadastro_doenca_transmissivel',
'atencao_basica_cadastro_doenca_transmissivel.id',
'atencao_basica_atendimento_odontologico_doenca_transmissivel.doenca_transmissivel_id'
)
->where('atencao_basica_atendimento_odontologico_doenca_transmissivel.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
->get();
foreach ($atendimentosDoencaTransmissivel as $doenca) {
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doenca->id))->first() ?? null;
if ($ciap) {
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
$atendimentosOdontologicos->appendChild($doencaTransmissivel);
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosRastreamento = DB::table('atencao_basica_atendimento_odontologico_rastreamento')
->select([
'atencao_basica_cadastro_rastreamento.id',
])
->join(
'atencao_basica_cadastro_rastreamento',
'atencao_basica_cadastro_rastreamento.id',
'atencao_basica_atendimento_odontologico_rastreamento.rastreamento_id'
)
->where('atencao_basica_atendimento_odontologico_rastreamento.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
->get();
foreach ($atendimentosRastreamento as $doenca) {
$ciap = Ciap::where('id', self::getCiapFromRastreamento($doenca->id))->first() ?? null;
if ($ciap) {
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
$atendimentosOdontologicos->appendChild($doencaTransmissivel);
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_odontologico_problema_condicao')
->select([
'atencao_basica_atendimento_odontologico_problema_condicao.ciap_id',
'atencao_basica_atendimento_odontologico_problema_condicao.cid_id',
])
->where('atencao_basica_atendimento_odontologico_problema_condicao.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
->get();
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
if ($condicaoAvaliada->ciap_id && !in_array($condicaoAvaliada->ciap_id, $ciapsAdicionados)) {
$ciap = Ciap::where('id', $condicaoAvaliada->ciap_id)->first() ?? null;
if ($ciap) {
$ciapsAdicionados[] = $ciap->id;
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
if ($condicaoAvaliada->cid_id) {
$cid = Cid::where('id', $condicaoAvaliada->cid_id)->first() ?? null;
if ($cid) {
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $cid->codigo));
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
}
}
}
}
private static function getExames(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos)
{
$exames = DB::table('atencao_basica_atendimento_odontologico_exame')
->select([
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_esus',
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento',
'atencao_basica_atendimento_odontologico_exame.solicitado',
'atencao_basica_atendimento_odontologico_exame.avaliado',
])
->join('atencao_basica_cadastro_exame_solicitado_avaliado', 'atencao_basica_cadastro_exame_solicitado_avaliado.id', 'atencao_basica_atendimento_odontologico_exame.exame_id')
->where('atencao_basica_atendimento_odontologico_exame.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
->limit(1)
->get();
foreach ($exames as $value) {
$codigoExame = null;
if ($value->codigo_procedimento && $value->codigo_procedimento !== '') {
$codigoExame = $value->codigo_procedimento;
} else {
$codigoExame = $value->codigo_esus;
}
$exame = $dom->createElement('exame');
$atendimentosOdontologicos->appendChild($exame);
$exame->appendChild($dom->createElement('codigoExame', $codigoExame));
if ($value->solicitado) {
$exame->appendChild($dom->createElement('solicitadoAvaliado', 'S'));
}
if ($value->avaliado) {
$exame->appendChild($dom->createElement('solicitadoAvaliado', 'A'));
}
}
}
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($condicaoAvaliada)
{
$map = [
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
];
return $map[$condicaoAvaliada] ?? null;
}
private static function getCiapFromRastreamento($condicaoAvaliada)
{
$map = [
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
];
return $map[$condicaoAvaliada] ?? null;
}
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, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos)
{
$atendimentoOdontologicoIvcf = AtendimentoOdontologicoIvcf::where('atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)->first();
if ($atendimentoOdontologicoIvcf) {
$pacienteIdade = $atendimentoOdontologicoIvcf->atendimentoOdontologico->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($atendimentoOdontologicoIvcf->updated_at) * 1000;
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
$resultado += 1;
}
else if ($pacienteIdade >= 85) {
$resultado += 3;
}
if ($atendimentoOdontologicoIvcf->estado_saude_geral === 'regular_ou_ruim') {
$resultado += 1;
$hasSgPercepcaoSaude = true;
}
if ($atendimentoOdontologicoIvcf->limitacao_compras || $atendimentoOdontologicoIvcf->limitacao_gestao_financeira || $atendimentoOdontologicoIvcf->limitacao_tarefas_domesticas) {
$resultado += 4;
$hasSgAvdInstrumental = true;
}
if ($atendimentoOdontologicoIvcf->banho_independencia) {
$resultado += 6;
$hasSgAvdBasica = true;
}
if ($atendimentoOdontologicoIvcf->relato_esquecimento_por_terceiros) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoOdontologicoIvcf->esquecimento_piorando) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($atendimentoOdontologicoIvcf->esquecimento_impacta_atividades) {
$resultado += 2;
$hasSgCognicao = true;
}
if ($atendimentoOdontologicoIvcf->humor_tristeza_desanimo) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoOdontologicoIvcf->perda_interesse_atividades) {
$resultado += 2;
$hasSgHumor = true;
}
if ($atendimentoOdontologicoIvcf->limitacao_elevar_bracos) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoOdontologicoIvcf->limitacao_motricidade_fina) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($atendimentoOdontologicoIvcf->perda_peso_nao_intencional || $atendimentoOdontologicoIvcf->imc_abaixo_22 || $atendimentoOdontologicoIvcf->panturrilha_abaixo_31 || $atendimentoOdontologicoIvcf->marcha_lenta_4m_maior_5s) {
$resultado += 2;
$hasSgCapAerobicaMuscular = true;
}
if ($atendimentoOdontologicoIvcf->dificuldade_caminhar_impacto_atividades) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoOdontologicoIvcf->quedas_recorrentes) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($atendimentoOdontologicoIvcf->incontinencia) {
$resultado += 2;
$hasSgContinencia = true;
}
if ($atendimentoOdontologicoIvcf->problema_visao_impacto_atividades) {
$resultado += 2;
$hasSgVisao = true;
}
if ($atendimentoOdontologicoIvcf->problema_audicao_impacto_atividades) {
$resultado += 2;
$hasSgAudicao = true;
}
if ($atendimentoOdontologicoIvcf->doencas_cronicas_multiplas || $atendimentoOdontologicoIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoOdontologicoIvcf->internacao_ultimos_6_meses) {
$resultado += 4;
$hasSgComorbidade = true;
}
$ivcf = $dom->createElement('ivcf');
$atendimentosOdontologicos->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));
}
}
}

View File

@@ -0,0 +1,352 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\AtividadeColetiva\PraticasEmSaude;
use App\Enums\AtencaoBasica\AtividadeColetiva\Pse;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeColetiva;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
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 FichaAtividadeColetivaService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasAtividade($mes_ano) as $fichaAtividade) {
$dadosExportacao = self::getDadosExportacao($fichaAtividade, $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, 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasAtividade($mesAnoInicial, false) as $fichaAtividade) {
$dadosExportacao = self::getDadosExportacao($fichaAtividade);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaAtividade->data_usuario_responsavel,
'usuario_id' => $fichaAtividade->usuario->id,
'ocupacao_id' => $fichaAtividade->ocupacao->id,
'equipe_id' => $fichaAtividade->equipe->id,
'atividade_coletiva_id' => $fichaAtividade->id,
'atividade_coletiva_participantes' => $dadosExportacao['atividade_coletiva_participantes'],
'xml' => [
'nome_arquivo' => 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasAtividade($mes_ano, $somenteMesAno = true)
{
return AtividadeColetiva::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));
});
})
)
->get();
}
private static function getDadosExportacao($fichaAtividade, $exportacaoArquivoId = null, $usuarioId = null)
{
$atividadeColetivaParticipantesPosicoes = collect();
$uuid = ExportacaoService::getUuid($fichaAtividade->equipe->unidade->cnes);
$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/fichaatividadecoletiva');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATIVIDADE_COLETIVA));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAtividade->equipe->unidade->cnes));
if ($fichaAtividade->equipe->area->numero_ine) {
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAtividade->equipe->area->numero_ine));
}
$fichaAtividadeColetivaTransport = $dom->createElement('ns4:fichaAtividadeColetivaTransport');
$dadoTransporteTransportXml->appendChild($fichaAtividadeColetivaTransport);
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('uuidFicha', $uuid));
if ($fichaAtividade->inep == null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('outraLocalidade', $fichaAtividade->local_atividade));
}
if ($fichaAtividade->inep != null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('inep', $fichaAtividade->inep));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numParticipantes', $fichaAtividade->total_participantes));
if($fichaAtividade->avaliacoes_alteradas != null){
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numAvaliacoesAlteradas', $fichaAtividade->avaliacoes_alteradas));
}
if ($fichaAtividade->pse_id == Pse::SAUDE) {
$profissionais = $dom->createElement('profissionais');
$fichaAtividadeColetivaTransport->appendChild($profissionais);
$profissionais->appendChild($dom->createElement('cnsProfissional', $fichaAtividade->usuario->cidadao->cns ?? ''));
$profissionais->appendChild($dom->createElement('codigoCbo2002', $fichaAtividade->ocupacao->codigo ?? ''));
self::getProfissionais($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('atividadeTipo', $fichaAtividade->atividadeTipo->id ?? ''));
if ($fichaAtividade->pse_id != Pse::EDUCACAO && $fichaAtividade->atividadeTipo->id <= 3) {
self::getTemasReuniao($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
}
self::getPublicoAlvo($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
foreach ($fichaAtividade->participantes as $i => $participante) {
$atividadeColetivaParticipantesPosicoes->push([
'posicao' => $i + 1,
'id' => $participante->id,
]);
$participantes = $dom->createElement('participantes');
$fichaAtividadeColetivaTransport->appendChild($participantes);
if (Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
$participantes->appendChild($dom->createElement('cnsParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cns ?? ''));
}
if (!Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
$participantes->appendChild($dom->createElement('cpfParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cpf ?? ''));
}
$participantes->appendChild($dom->createElement('dataNascimento', strtotime($participante->paciente()->withTrashed()->first()->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$participantes->appendChild($dom->createElement('avaliacaoAlterada', $participante->avaliacao_alterada ? 'true' : 'false'));
if($participante->peso != null){
$participantes->appendChild($dom->createElement('peso', $participante->peso));
}
if($participante->altura != null){
$participantes->appendChild($dom->createElement('altura', $participante->altura));
}
$ids = [
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_1,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_2,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_3,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_4
];
$existe = array_intersect( $fichaAtividade->saudePratica->all(), $ids);
if (!empty($existe)) {
$participantes->appendChild($dom->createElement('cessouHabitoFumar', $participante->parou_de_fumar ? 'true' : 'false'));
$participantes->appendChild($dom->createElement('abandonouGrupo', $participante->abandonou_grupo ? 'true' : 'false'));
}
$participantes->appendChild($dom->createElement('sexo', self::sexo($participante->paciente->cidadao->sexo->id ?? null)));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('tbCdsOrigem', '3'));
if ($fichaAtividade->inep == null && $fichaAtividade->local_atividade == null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('cnesLocalAtividade', $fichaAtividade->cnes));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('turno', $fichaAtividade->turno_id));
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseEducacao', $fichaAtividade->pse_id == Pse::EDUCACAO ? 'true' : 'false'));
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseSaude', $fichaAtividade->pse_id == Pse::SAUDE ? 'true' : 'false'));
$headerTransport = $dom->createElement('headerTransport');
$fichaAtividadeColetivaTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaAtividade->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaAtividade->ocupacao->codigo));
$headerTransport->appendChild($dom->createElement('cnes', $fichaAtividade->equipe->unidade->cnes));
if ($fichaAtividade->equipe->area->numero_ine) {
$headerTransport->appendChild($dom->createElement('ine', $fichaAtividade->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAtividade->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
self::getTemasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
self::getPraticasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaAtividade->uuid_ficha = $uuid;
$fichaAtividade->exportacao_id = $exportacao->id;
$fichaAtividade->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAtividade->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAtividade->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'atividade_coletiva_participantes' => $atividadeColetivaParticipantesPosicoes,
];
}
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 getPublicoAlvo(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$publicoAlvo = DB::table('atencao_basica_atividade_coletiva_publico_alvo')
->select([
'atencao_basica_atividade_coletiva_publico_alvo.publico_alvo_id',
])
->where('atencao_basica_atividade_coletiva_publico_alvo.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($publicoAlvo as $publico) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('publicoAlvo', $publico->publico_alvo_id));
}
}
private static function getTemasReuniao(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$temasReuniao = DB::table('atencao_basica_atividade_coletiva_reuniao_tema')
->select([
'atencao_basica_atividade_coletiva_reuniao_tema.reuniao_tema_id',
])
->where('atencao_basica_atividade_coletiva_reuniao_tema.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($temasReuniao as $tema) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaReuniao', $tema->reuniao_tema_id));
}
}
private static function getTemasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$temasSaude = DB::table('atencao_basica_atividade_coletiva_saude_tema')
->select([
'atencao_basica_atividade_coletiva_saude_tema.saude_tema_id',
])
->where('atencao_basica_atividade_coletiva_saude_tema.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($temasSaude as $tema) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaSaude', $tema->saude_tema_id));
}
}
private static function getPraticasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$praticasSaude = DB::table('atencao_basica_atividade_coletiva_saude_pratica')
->select([
'atencao_basica_atividade_coletiva_saude_pratica.saude_pratica_id',
])
->where('atencao_basica_atividade_coletiva_saude_pratica.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($praticasSaude as $pratica) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('praticasEmSaude', $pratica->saude_pratica_id));
}
}
private static function getProfissionais(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$profissionais = DB::table('atencao_basica_atividade_coletiva_profissional')
->select([
'cadastro_cidadao.cns',
'sigtap.ocupacao.codigo',
])
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'atencao_basica_atividade_coletiva_profissional.usuario_ocupacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atividade_coletiva_profissional.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->where('atencao_basica_atividade_coletiva_profissional.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($profissionais as $profissional) {
$profissionais = $dom->createElement('profissionais');
$fichaAtividadeColetivaTransport->appendChild($profissionais);
$profissionais->appendChild($dom->createElement('cnsProfissional', $profissional->cns));
$profissionais->appendChild($dom->createElement('codigoCbo2002', $profissional->codigo));
}
}
}

View File

@@ -0,0 +1,360 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Avaliacao\Conclusao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Avaliacao\Avaliacao;
use App\Models\AtencaoBasica\Avaliacao\Justificativa;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\Sigtap\Cid;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use ZipArchive;
class FichaAvaliacaoElegibilidadeService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasAvaliacao($mes_ano) as $fichaAvaliacao) {
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao, $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, 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasAvaliacao($mesAnoInicial, false) as $fichaAvaliacao) {
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaAvaliacao->data,
'usuario_id' => $fichaAvaliacao->usuario->id,
'ocupacao_id' => $fichaAvaliacao->ocupacao->id,
'equipe_id' => $fichaAvaliacao->equipe->id,
'avaliacao_id' => $fichaAvaliacao->id,
'xml' => [
'nome_arquivo' => 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasAvaliacao($mes_ano, $somenteMesAno = true)
{
return Avaliacao::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', '>=', substr($mes_ano, 0, 2));
});
})
)
->get();
}
private static function getDadosExportacao($fichaAvaliacao, $exportacaoArquivoId = null, $usuarioId = null)
{
$desconheceNomeMae = $fichaAvaliacao->paciente->cidadao->nome_mae == null ? 'true' : 'false';
$desconheceNomePai = $fichaAvaliacao->paciente->cidadao->nome_pai == null ? 'true' : 'false';
$semNumero = (isset($fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) && $fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) ? 'true' : 'false';
$telefone = $fichaAvaliacao->paciente->cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
$uuid = ExportacaoService::getUuid($fichaAvaliacao->equipe->unidade->cnes);
$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/fichaavaliacaoelegibilidade');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::AVALIACAO_ELEGIBILIDADE_ADMISSAO));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAvaliacao->equipe->unidade->cnes));
if($fichaAvaliacao->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAvaliacao->equipe->area->numero_ine));
}
$fichaAvaliacaoElegibilidadeTransport = $dom->createElement('ns4:fichaAvaliacaoElegibilidadeTransport');
$dadoTransporteTransportXml->appendChild($fichaAvaliacaoElegibilidadeTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaAvaliacaoElegibilidadeTransport->appendChild($headerTransport);
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
$headerTransport->appendChild($lotacaoFormPrincipal);
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaAvaliacao->usuario->cidadao->cns ?? ''));
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaAvaliacao->ocupacao->codigo));
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaAvaliacao->equipe->unidade->cnes));
if($fichaAvaliacao->equipe->area->numero_ine){
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaAvaliacao->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAvaliacao->data) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('turno', $fichaAvaliacao->turno_id));
if (Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCidadao', $fichaAvaliacao->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCidadao', $fichaAvaliacao->paciente->cidadao->cpf ?? ''));
}
$racaCorEsus = $fichaAvaliacao->paciente->cidadao->racaCor && $fichaAvaliacao->paciente->cidadao->racaCor->id
? ($fichaAvaliacao->paciente->cidadao->racaCor->id != RacaCor::SEM_INFORMACAO
? $fichaAvaliacao->paciente->cidadao->racaCor->codigo_esus : NULL)
: NULL;
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dataNascimentoCidadao', strtotime($fichaAvaliacao->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('sexoCidadao', self::sexo($fichaAvaliacao->paciente->cidadao->sexo->id)));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeCidadao', $fichaAvaliacao->paciente->cidadao->nome));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('racaCorCidadao', $racaCorEsus));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeSocialCidadao', $fichaAvaliacao->paciente->cidadao->nome_social));
if ($desconheceNomeMae == 'false') {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeMaeCidadao', $fichaAvaliacao->paciente->cidadao->nome_mae));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomeMae', $desconheceNomeMae));
if ($fichaAvaliacao->paciente->cidadao->municipioNascimento && $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('codigoIbgeMunicipioNascimento', $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nacionalidadeCidadao', $fichaAvaliacao->paciente->cidadao->nacionalidade->codigo_esus));
if ($fichaAvaliacao->paciente->email !== null) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('emailCidadao', $fichaAvaliacao->paciente->email));
}
if ($fichaAvaliacao->paciente->cidadao->carteiraTrabalho &&
$fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('numeroNisPisPasep', $fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cuidadorCidadao', $fichaAvaliacao->cuidador->id));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarProcedencia', $fichaAvaliacao->procedencia->id));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarModalidade', $fichaAvaliacao->conclusao->id));
self::getCondicoesAvaliadas($dom, $fichaAvaliacao, $fichaAvaliacaoElegibilidadeTransport);
if ($fichaAvaliacao->cid_primario) {
$cid = Cid::find($fichaAvaliacao->cid_primario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10Principal', $cid->codigo));
}
}
if($fichaAvaliacao->cid_secundario){
$cid = Cid::find($fichaAvaliacao->cid_secundario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioUm', $cid->codigo));
}
}
if ($fichaAvaliacao->cid_terciario){
$cid = Cid::find($fichaAvaliacao->cid_terciario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioDois', $cid->codigo));
}
}
if ($fichaAvaliacao->conclusao->id == Conclusao::INELEGIVEL) {
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
if ($conclusao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoInelegivel', $conclusao->justificativa->codigo));
}
} else {
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
if ($conclusao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoElegivel', $conclusao->justificativa->codigo));
}
}
$endereco = $dom->createElement('endereco');
$fichaAvaliacaoElegibilidadeTransport->appendChild($endereco);
$endereco->appendChild($dom->createElement('bairro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null));
$endereco->appendChild($dom->createElement('cep', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->cep ?? null));
$endereco->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null));
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento ?? false) {
$endereco->appendChild($dom->createElement('complemento', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento));
}
$endereco->appendChild($dom->createElement('nomeLogradouro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->nome ?? null));
if($semNumero == 'false'){
$endereco->appendChild($dom->createElement('numero', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->numero ?? null));
}
$endereco->appendChild($dom->createElement('numeroDneUf', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->codigo ?? null));
$endereco->appendChild($dom->createElement('telefoneContato', $telefone ?? null));
$endereco->appendChild($dom->createElement('tipoLogradouroNumeroDne', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->tipo->codigo ?? null));
$endereco->appendChild($dom->createElement('stSemNumero', $semNumero));
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia ?? false) {
$endereco->appendChild($dom->createElement('pontoReferencia', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia));
}
if ($desconheceNomePai == 'false') {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomePaiCidadao', $fichaAvaliacao->paciente->cidadao->nome_pai));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomePai', $desconheceNomePai));
if ($fichaAvaliacao->paciente->cidadao->nacionalidade->id == Nacionalidade::NATURALIZADO_BRASILEIRO) {
if ($fichaAvaliacao->paciente->cidadao->data_naturalizacao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtNaturalizacao', strtotime($fichaAvaliacao->paciente->cidadao->data_naturalizacao->format('Y-m-d')) * 1000));
}
if ($fichaAvaliacao->paciente->cidadao->portaria_naturalizacao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('portariaNaturalizacao', $fichaAvaliacao->paciente->cidadao->portaria_naturalizacao));
}
if ($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtEntradaBrasil', strtotime($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d')) * 1000));
}
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('paisNascimento', $fichaAvaliacao->paciente->cidadao->paisNascimento->codigo_esus));
if ($fichaAvaliacao->paciente->cidadao->racaCor->id === RacaCor::INDIGENA) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('etnia', $fichaAvaliacao->paciente->cidadao->etniaIndigena->codigo_cadsus));
}
if (Cns::isValid($fichaAvaliacao->cns_cuidador)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCuidador', $fichaAvaliacao->cns_cuidador ?? ''));
}
if (!Cns::isValid($fichaAvaliacao->cns_cuidador)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCuidador', $fichaAvaliacao->cpf_cuidador ?? ''));
}
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaAvaliacao->uuid_ficha = $uuid;
$fichaAvaliacao->exportacao_id = $exportacao->id;
$fichaAvaliacao->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAvaliacao->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAvaliacao->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
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 getCondicoesAvaliadas(&$dom, $fichaAvaliacao, &$fichaAvaliacaoElegibilidadeTransport){
$condicoesAvaliadas = DB::table('atencao_basica_avaliacao_condicao')
->select([
'atencao_basica_avaliacao_condicao.condicao_id',
])
->where('atencao_basica_avaliacao_condicao.avaliacao_id', $fichaAvaliacao->id)
->get();
foreach ($condicoesAvaliadas as $condicaoAvaliada) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('condicoesAvaliadas', $condicaoAvaliada->condicao_id));
}
}
}

View File

@@ -0,0 +1,494 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Enums\AtencaoBasica\CadastroDomiciliar\Zona;
use App\Enums\AtencaoBasica\Exportacao\SalarioMinimo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use ZipArchive;
class FichaCadastroDomiciliarService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasCadastroDomiciliar($mes_ano) as $fichaCadastroDomiciliar) {
$dadosExportacao = self::getDadosExportacao($fichaCadastroDomiciliar, $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, 'CD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasCadastroDomiciliar($mesAnoInicial, false) as $fichaCadastroDomiciliar) {
$dadosExportacao = self::getDadosExportacao($fichaCadastroDomiciliar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaCadastroDomiciliar->data_usuario_responsavel,
'usuario_id' => $fichaCadastroDomiciliar->usuario->id,
'ocupacao_id' => $fichaCadastroDomiciliar->ocupacao->id,
'equipe_id' => $fichaCadastroDomiciliar->equipe->id,
'cadastro_domiciliar_id' => $fichaCadastroDomiciliar->id,
'pacientes' => $dadosExportacao['pacientes'],
'xml' => [
'nome_arquivo' => 'CD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasCadastroDomiciliar($mes_ano, $somenteMesAno = true)
{
return CadastroDomiciliar::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));
});
})
)
->get();
}
private static function getDadosExportacao($fichaCadastroDomiciliar, $exportacaoArquivoId = null, $usuarioId = null)
{
$pacientesPosicoes = collect();
$uuid = ExportacaoService::getUuid($fichaCadastroDomiciliar->equipe->unidade->cnes);
$instituicaoOutrosProfissionais = $fichaCadastroDomiciliar->instituicao_outros_profissionais ? 'true' : 'false';
$possuiAnimais = $fichaCadastroDomiciliar->possui_animais ? 'true' : 'false';
$recusaCadastro = $fichaCadastroDomiciliar->recusa_cadastro ? 'true' : 'false';
$foraArea = $fichaCadastroDomiciliar->fora_area ? 'true' : 'false';
$energiaEletrica = $fichaCadastroDomiciliar->energia_eletrica ? 'true' : 'false';
$fichaAtualizada = $fichaCadastroDomiciliar->uuid_ficha != null ? 'true' : 'false';
$semNumero = $fichaCadastroDomiciliar->domicilio->endereco->sem_numero ? 'true' : 'false';
$cidadao = $fichaCadastroDomiciliar->domicilio->cidadaos()->first();
if ($cidadao) {
$telefone = $cidadao->telefones->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
}
$residentes = self::getResidentes($fichaCadastroDomiciliar->domicilio_id);
$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/cadastrodomiciliar');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::CADASTRO_DOMICILIAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaCadastroDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaCadastroDomiciliar->equipe->unidade->cnes));
if($fichaCadastroDomiciliar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaCadastroDomiciliar->equipe->area->numero_ine));
}
$cadastroDomiciliarTransport = $dom->createElement('ns4:cadastroDomiciliarTransport');
$dadoTransporteTransportXml->appendChild($cadastroDomiciliarTransport);
if ($recusaCadastro == 'false') {
if ($possuiAnimais == 'true' && optional($fichaCadastroDomiciliar->imovelTipo)->codigo_esus == ImovelTipo::DOMICILIO) {
self::getAnimais($dom, $fichaCadastroDomiciliar, $cadastroDomiciliarTransport);
}
$codigoImovel = $fichaCadastroDomiciliar->imovelTipo->codigo_esus ?? null;
if (self::handleTipoImovelPermitido($codigoImovel)) {
$condicaoMoradia = $dom->createElement('condicaoMoradia');
$cadastroDomiciliarTransport->appendChild($condicaoMoradia);
if ($fichaCadastroDomiciliar->abastecimento) {
$condicaoMoradia->appendChild($dom->createElement('abastecimentoAgua', $fichaCadastroDomiciliar->abastecimento->codigo_esus));
}
if (self::handleTipoImovelPermitidoRural($codigoImovel)
&& (($fichaCadastroDomiciliar->domicilioZona->codigo_esus ?? null) == Zona::RURAL)
) {
$condicaoMoradia->appendChild($dom->createElement('areaProducaoRural', $fichaCadastroDomiciliar->situacaoRural->codigo_esus ?? null));
}
if ($fichaCadastroDomiciliar->destinoLixo) {
$condicaoMoradia->appendChild($dom->createElement('destinoLixo', $fichaCadastroDomiciliar->destinoLixo->codigo_esus));
}
if ($fichaCadastroDomiciliar->formaEscoamento) {
$condicaoMoradia->appendChild($dom->createElement('formaEscoamentoBanheiro', $fichaCadastroDomiciliar->formaEscoamento->codigo_esus));
}
if ($fichaCadastroDomiciliar->domicilioZona) {
$condicaoMoradia->appendChild($dom->createElement('localizacao', $fichaCadastroDomiciliar->domicilioZona->codigo_esus));
}
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
if ($fichaCadastroDomiciliar->materialPredominante) {
$condicaoMoradia->appendChild($dom->createElement('materialPredominanteParedesExtDomicilio', $fichaCadastroDomiciliar->materialPredominante->codigo_esus));
}
$condicaoMoradia->appendChild($dom->createElement('nuComodos', $fichaCadastroDomiciliar->quantidade_comodos));
}
if ($residentes->sum('total_residentes') > 0) {
$condicaoMoradia->appendChild($dom->createElement('nuMoradores',$residentes->sum('total_residentes')));
}
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
if ($fichaCadastroDomiciliar->SituacaoDomicilio) {
$condicaoMoradia->appendChild($dom->createElement('situacaoMoradiaPosseTerra', $fichaCadastroDomiciliar->SituacaoDomicilio->codigo_esus));
}
}
$condicaoMoradia->appendChild($dom->createElement('stDisponibilidadeEnergiaEletrica', $energiaEletrica));
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
if ($fichaCadastroDomiciliar->domicilioTipoAcesso) {
$condicaoMoradia->appendChild($dom->createElement('tipoAcessoDomicilio', $fichaCadastroDomiciliar->domicilioTipoAcesso->codigo_esus));
}
if ($fichaCadastroDomiciliar->domicilioTipo) {
$condicaoMoradia->appendChild($dom->createElement('tipoDomicilio', $fichaCadastroDomiciliar->domicilioTipo->codigo_esus));
}
}
if ($fichaCadastroDomiciliar->tratamento) {
$condicaoMoradia->appendChild($dom->createElement('aguaConsumoDomicilio', $fichaCadastroDomiciliar->tratamento->codigo_esus));
}
}
$cadastroDomiciliarTransport->appendChild($dom->createElement('tipoEndereco', 3));
$enderecoLocalPermanencia = $dom->createElement('enderecoLocalPermanencia');
$cadastroDomiciliarTransport->appendChild($enderecoLocalPermanencia);
$enderecoLocalPermanencia->appendChild($dom->createElement('bairro', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->bairro->nome));
$enderecoLocalPermanencia->appendChild($dom->createElement('cep', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->cep));
$enderecoLocalPermanencia->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->municipio->ibge));
if ($fichaCadastroDomiciliar->domicilio->endereco->complemento) {
$enderecoLocalPermanencia->appendChild($dom->createElement('complemento', $fichaCadastroDomiciliar->domicilio->endereco->complemento));
}
$enderecoLocalPermanencia->appendChild($dom->createElement('nomeLogradouro', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->nome));
if($semNumero == 'false'){
$enderecoLocalPermanencia->appendChild($dom->createElement('numero', $fichaCadastroDomiciliar->domicilio->endereco->numero));
}
$enderecoLocalPermanencia->appendChild($dom->createElement('numeroDneUf', str_pad($fichaCadastroDomiciliar->domicilio->endereco->logradouro->municipio->estado->codigo,2 ,'0', STR_PAD_LEFT)));
if (isset($telefone)) {
$enderecoLocalPermanencia->appendChild($dom->createElement('telefoneContato', $telefone));
}
$enderecoLocalPermanencia->appendChild($dom->createElement('tipoLogradouroNumeroDne', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->tipo->codigo));
$enderecoLocalPermanencia->appendChild($dom->createElement('stSemNumero', $semNumero));
if ($fichaCadastroDomiciliar->domicilio->endereco->referencia) {
$enderecoLocalPermanencia->appendChild($dom->createElement('pontoReferencia', $fichaCadastroDomiciliar->domicilio->endereco->referencia));
}
if ($foraArea == 'false' && $fichaCadastroDomiciliar->microarea) {
$enderecoLocalPermanencia->appendChild($dom->createElement('microArea', str_pad($fichaCadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
}
$enderecoLocalPermanencia->appendChild($dom->createElement('stForaArea', $foraArea));
}
if ($fichaCadastroDomiciliar->domicilio->endereco->latitude) {
$cadastroDomiciliarTransport->appendChild($dom->createElement('latitude', $fichaCadastroDomiciliar->domicilio->endereco->latitude));
}
if ($fichaCadastroDomiciliar->domicilio->endereco->longitude) {
$cadastroDomiciliarTransport->appendChild($dom->createElement('longitude', $fichaCadastroDomiciliar->domicilio->endereco->longitude));
}
if ($recusaCadastro == 'false' && $fichaCadastroDomiciliar->imovelTipo && $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
foreach ($residentes as $i => $residente) {
$pacientesPosicoes->push([
'posicao' => $i + 1,
'id' => $residente->paciente_id,
]);
$familias = $dom->createElement('familias');
$cadastroDomiciliarTransport->appendChild($familias);
$familias->appendChild($dom->createElement('dataNascimentoResponsavel', strtotime($residente->data_nascimento) * 1000));
if (Cns::isValid($residente->cns)) {
$familias->appendChild($dom->createElement('numeroCnsResponsavel', $residente->cns ?? ''));
}
if (!Cns::isValid($residente->cns)) {
$familias->appendChild($dom->createElement('cpfResponsavel', $residente->cpf ?? ''));
}
$familias->appendChild($dom->createElement('numeroMembrosFamilia', $residente->total_residentes));
$familias->appendChild($dom->createElement('numeroProntuario', $residente->prontuario));
if ($residente->total_renda && $residente->salario_minimo) {
$familias->appendChild($dom->createElement('rendaFamiliar', self::getRendaMensal($residente)));
}
}
}
$cadastroDomiciliarTransport->appendChild($dom->createElement('fichaAtualizada', $fichaAtualizada));
if ($recusaCadastro == 'false' && $possuiAnimais == 'true' && $fichaCadastroDomiciliar->quantidade_animais
&& $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
$cadastroDomiciliarTransport->appendChild($dom->createElement('quantosAnimaisNoDomicilio', $fichaCadastroDomiciliar->quantidade_animais));
}
if ($recusaCadastro == 'false' && $fichaCadastroDomiciliar->imovelTipo && $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
$cadastroDomiciliarTransport->appendChild($dom->createElement('stAnimaisNoDomicilio', $possuiAnimais));
}
$cadastroDomiciliarTransport->appendChild($dom->createElement('statusTermoRecusa', $recusaCadastro));
$cadastroDomiciliarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuid', $uuid));
if ($fichaAtualizada == 'true') {
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuidFichaOriginadora', $fichaCadastroDomiciliar->uuid_ficha));
} else {
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuidFichaOriginadora', $uuid));
}
$codigoEsus = $fichaCadastroDomiciliar->imovelTipo->codigo_esus ?? null;
$cadastroDomiciliarTransport->appendChild($dom->createElement('tipoDeImovel', $codigoEsus ?? ''));
if ($recusaCadastro == 'false' && $codigoEsus !== null && self::handleTipoImovelPermanencia($codigoEsus)) {
$instituicaoPermanencia = $dom->createElement('instituicaoPermanencia');
$cadastroDomiciliarTransport->appendChild($instituicaoPermanencia);
$instituicaoPermanencia->appendChild($dom->createElement('nomeInstituicaoPermanencia', $fichaCadastroDomiciliar->instituicao_nome));
$instituicaoPermanencia->appendChild($dom->createElement('stOutrosProfissionaisVinculados', $instituicaoOutrosProfissionais));
$instituicaoPermanencia->appendChild($dom->createElement('nomeResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_nome_responsavel_tecnico));
$instituicaoPermanencia->appendChild($dom->createElement('cnsResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_cns_responsavel_tecnico));
$instituicaoPermanencia->appendChild($dom->createElement('cargoInstituicao', $fichaCadastroDomiciliar->instituicao_cargo_responsavel_tecnico));
$instituicaoPermanencia->appendChild($dom->createElement('telefoneResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_telefone_responsavel_tecnico));
}
$headerTransport = $dom->createElement('headerTransport');
$cadastroDomiciliarTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaCadastroDomiciliar->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaCadastroDomiciliar->ocupacao->codigo));
$headerTransport->appendChild($dom->createElement('cnes', $fichaCadastroDomiciliar->equipe->unidade->cnes));
if($fichaCadastroDomiciliar->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaCadastroDomiciliar->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaCadastroDomiciliar->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaCadastroDomiciliar->uuid_ficha = $uuid;
$fichaCadastroDomiciliar->exportacao_id = $exportacao->id;
$fichaCadastroDomiciliar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaCadastroDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaCadastroDomiciliar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'pacientes' => $pacientesPosicoes,
];
}
private static function getResidentes($id)
{
return DB::table('cadastro_cidadao')
->select([
'cadastro_paciente.id AS paciente_id',
'atencao_basica_cadastro_individual.responsavel AS responsavel',
'atencao_basica_cadastro_individual.responsavel_cidadao_id AS responsavel_cidadao_id',
'cadastro_cidadao.data_nascimento',
'cadastro_cidadao.cns',
'cadastro_cidadao.cpf',
'atencao_basica_cadastro_individual.renda_mensal as renda_responsavel',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('(
SELECT COUNT(*) + 1
FROM atencao_basica_cadastro_individual
WHERE responsavel_cidadao_id = cadastro_cidadao.id
) AS total_residentes'),
DB::raw('(
SELECT salario_minimo
FROM atencao_basica_parametrizacao_outros
) AS salario_minimo'),
DB::raw('(atencao_basica_cadastro_individual.renda_mensal + COALESCE((
SELECT SUM(ci.renda_mensal)
FROM atencao_basica_cadastro_individual as ci
WHERE ci.responsavel_cidadao_id = cadastro_cidadao.id
), 0)) AS total_renda')
])
->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id')
->leftJoin('atencao_basica_cadastro_individual', 'atencao_basica_cadastro_individual.paciente_id', 'cadastro_paciente.id')
->where('cadastro_cidadao.domicilio_id', $id)
->where('atencao_basica_cadastro_individual.responsavel', true)
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('cadastro_obito')
->whereColumn('cadastro_obito.cidadao_id', 'cadastro_cidadao.id');
})
->get();
}
private static function getAnimais(&$dom, $fichaCadastroDomiciliar, &$cadastroDomiciliarTransport){
$animais = DB::table('atencao_basica_cadastro_domiciliar_animal')
->select([
'atencao_basica_cadastro_animal.codigo_esus',
])
->join(
'atencao_basica_cadastro_animal',
'atencao_basica_cadastro_animal.id',
'atencao_basica_cadastro_domiciliar_animal.animal_id'
)
->where('atencao_basica_cadastro_domiciliar_animal.cadastro_domiciliar_id', $fichaCadastroDomiciliar->id)
->get();
foreach ($animais as $animal) {
$cadastroDomiciliarTransport->appendChild($dom->createElement('animaisNoDomicilio', $animal->codigo_esus));
}
}
private static function handleTipoImovelPermitido($tipoImovel) {
return $tipoImovel == ImovelTipo::DOMICILIO
|| $tipoImovel == ImovelTipo::ABRIGO
|| $tipoImovel == ImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS
|| $tipoImovel == ImovelTipo::UNIDADE_PRISIONAL
|| $tipoImovel == ImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA
|| $tipoImovel == ImovelTipo::DELEGACIA ? true : false;
}
private static function handleTipoImovelPermanencia($tipoImovel) {
return $tipoImovel == ImovelTipo::ABRIGO
|| $tipoImovel == ImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS
|| $tipoImovel == ImovelTipo::UNIDADE_PRISIONAL
|| $tipoImovel == ImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA
|| $tipoImovel == ImovelTipo::DELEGACIA ? true : false;
}
private static function handleTipoImovelPermitidoRural($tipoImovel) {
return $tipoImovel == ImovelTipo::DOMICILIO
|| $tipoImovel == ImovelTipo::COMERCIO
|| $tipoImovel == ImovelTipo::TERRENO_BALDIO
|| $tipoImovel == ImovelTipo::PONTO_ESTRATEGICO
|| $tipoImovel == ImovelTipo::ESCOLA
|| $tipoImovel == ImovelTipo::CRECHE
|| $tipoImovel == ImovelTipo::ESTABELECIMENTO_RELIGIOSO
|| $tipoImovel == ImovelTipo::OUTROS ? true : false;
}
private static function getRendaMensal($residente) {
$renda = $residente->total_renda;
$salarioMinimo = $residente->salario_minimo;
if ($renda <= 0.25 * $salarioMinimo) {
return SalarioMinimo::UM_QUARTO_SALARIO_MINIMO;
} elseif ($renda <= 0.5 * $salarioMinimo) {
return SalarioMinimo::MEIO_SALARIO_MINIMO;
} elseif ($renda <= $salarioMinimo) {
return SalarioMinimo::UM_QUARTO_SALARIO_MINIMO;
} elseif ($renda <= 2 * $salarioMinimo) {
return SalarioMinimo::DOIS_SALARIO_MINIMO;
} elseif ($renda <= 3 * $salarioMinimo) {
return SalarioMinimo::TRES_SALARIO_MINIMO;
} elseif ($renda <= 4 * $salarioMinimo) {
return SalarioMinimo::QUATRO_SALARIO_MINIMO;
} else {
return SalarioMinimo::ACIMA_QUATRO_SALARIO_MINIMO;
}
}
}

View File

@@ -0,0 +1,701 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Deficiencia;
use App\Enums\Cadastro\SujeitoAtencao\FatorRisco;
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DateTime;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use ZipArchive;
class FichaCadastroIndividualService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasCadastroIndividual($mes_ano) as $fichaCadastroIndividual) {
$dadosExportacao = self::getDadosExportacao($fichaCadastroIndividual, $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, 'CI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasCadastroIndividual($mesAnoInicial, false) as $fichaCadastroIndividual) {
$dadosExportacao = self::getDadosExportacao($fichaCadastroIndividual);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaCadastroIndividual->data_usuario_responsavel,
'usuario_id' => optional($fichaCadastroIndividual->usuario)->id,
'ocupacao_id' => optional($fichaCadastroIndividual->usuarioOcupacao)->id,
'equipe_id' => optional($fichaCadastroIndividual->equipe)->id,
'cadastro_individual_id' => $fichaCadastroIndividual->id,
'xml' => [
'nome_arquivo' => 'CI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasCadastroIndividual($mes_ano, $somenteMesAno = true)
{
return CadastroIndividual::with(['paciente' => function ($query) {
$query->withTrashed();
}])
->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));
});
})
)
->whereNull('exportacao_id')
->get();
}
private static function getDadosExportacao($fichaCadastroIndividual, $exportacaoArquivoId = null, $usuarioId = null)
{
$internacao = $fichaCadastroIndividual->internacao ? 'true' : 'false';
$plantasMedicinais = $fichaCadastroIndividual->plantas_medicinais ? 'true' : 'false';
$comunidadeTradicional = $fichaCadastroIndividual->comunidade_tradicional ? 'true' : 'false';
$orientacaoSexual = $fichaCadastroIndividual->orientacao_sexual ? 'true' : 'false';
$identidadeGenero = $fichaCadastroIndividual->identidade_genero ? 'true' : 'false';
$cuidadorTradicional = $fichaCadastroIndividual->frequenta_cuidador_tradicional ? 'true' : 'false';
$grupoComunitario = $fichaCadastroIndividual->participa_grupo_comunitario ? 'true' : 'false';
$deficiente = $fichaCadastroIndividual->deficiente ? 'true' : 'false';
$planoSaude = $fichaCadastroIndividual->plano_saude ? 'true' : 'false';
$escola = $fichaCadastroIndividual->frequenta_escola_creche ? 'true' : 'false';
$recusaCadastro = $fichaCadastroIndividual->recusa_cadastro ? 'true' : 'false';
$gestante = $fichaCadastroIndividual->gestante ? 'true' : 'false';
$fumante = $fichaCadastroIndividual->fumante ? 'true' : 'false';
$usaAlcool = $fichaCadastroIndividual->usa_alcool ? 'true' : 'false';
$outrasDrogas = $fichaCadastroIndividual->outras_drogas ? 'true' : 'false';
$hipertensao = $fichaCadastroIndividual->hipertensao ? 'true' : 'false';
$diabetes = $fichaCadastroIndividual->diabetes ? 'true' : 'false';
$avcDerrame = $fichaCadastroIndividual->avc_derrame ? 'true' : 'false';
$infarto = $fichaCadastroIndividual->infarto ? 'true' : 'false';
$hanseniase = $fichaCadastroIndividual->hanseniase ? 'true' : 'false';
$tuberculose = $fichaCadastroIndividual->tuberculose ? 'true' : 'false';
$cancer = $fichaCadastroIndividual->cancer ? 'true' : 'false';
$internacao = $fichaCadastroIndividual->internacao ? 'true' : 'false';
$doencaCardiaca = $fichaCadastroIndividual->doenca_cardiaca ? 'true' : 'false';
$problemasRins = $fichaCadastroIndividual->problemas_rins ? 'true' : 'false';
$doencaRespiratoria = $fichaCadastroIndividual->doenca_respiratoria ? 'true' : 'false';
$acamado = $fichaCadastroIndividual->acamado ? 'true' : 'false';
$domiciliado = $fichaCadastroIndividual->domiciliado ? 'true' : 'false';
$praticasIntegrativas = $fichaCadastroIndividual->praticas_integrativas ? 'true' : 'false';
$outraInstituicao = $fichaCadastroIndividual->outra_instituicao ? 'true' : 'false';
$recebeBeneficio = $fichaCadastroIndividual->recebe_beneficio ? 'true' : 'false';
$referenciaFamiliar = $fichaCadastroIndividual->referencia_familiar ? 'true' : 'false';
$visitaFamiliar = $fichaCadastroIndividual->visita_familiar ? 'true' : 'false';
$responsavel = $fichaCadastroIndividual->responsavel ? 'true' : 'false';
$alimentosAcabaram = $fichaCadastroIndividual->alimentos_acabaram === null
? null
: ($fichaCadastroIndividual->alimentos_acabaram ? 'true' : 'false');
$comeuAlgunsAlimentos = $fichaCadastroIndividual->comeu_alguns_alimentos === null
? null
: ($fichaCadastroIndividual->comeu_alguns_alimentos ? 'true' : 'false');
$higienePessoal = $fichaCadastroIndividual->higiene_pessoal ? 'true' : 'false';
$tratamentoSaudeMental = $fichaCadastroIndividual->tratamento_saude_mental ? 'true' : 'false';
$situacaoRua = $fichaCadastroIndividual->situacao_rua_id != null ? 'true' : 'false';
$fichaAtualizada = $fichaCadastroIndividual->uuid_ficha != null ? 'true' : 'false';
$desconheceNomePai = $fichaCadastroIndividual->paciente->cidadao->nome_pai == null ? 'true' : 'false';
$desconheceNomeMae = $fichaCadastroIndividual->paciente->cidadao->nome_mae == null ? 'true' : 'false';
$uuid = ExportacaoService::getUuid($fichaCadastroIndividual->equipe->unidade->cnes ?? '9999999');
$telefoneCelular = $fichaCadastroIndividual->paciente->cidadao->telefones
->filter(fn ($t) => in_array(Str::length($t->numero), [10,11]))->first()->numero ?? null;
$dataNascimento = new DateTime($fichaCadastroIndividual->paciente->cidadao->data_nascimento);
$dataResponsavel = new DateTime($fichaCadastroIndividual->data_usuario_responsavel);
$idade = $dataNascimento->diff($dataResponsavel)->y;
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $fichaCadastroIndividual->paciente->cidadao->domicilio_id)->first();
if ($cadastroDomiciliar) {
$foraArea = $cadastroDomiciliar->fora_area ? 'true' : 'false';
}
$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/cadastroindividual');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::CADASTRO_INDIVIDUAL));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaCadastroIndividual->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? '9999999'));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaCadastroIndividual->equipe->unidade->cnes ?? '9999999'));
if($fichaCadastroIndividual->equipe->area->numero_ine ?? false){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaCadastroIndividual->equipe->area->numero_ine));
}
$cadastroIndividualTransport = $dom->createElement('ns4:cadastroIndividualTransport');
$dadoTransporteTransportXml->appendChild($cadastroIndividualTransport);
if ($recusaCadastro == 'false') {
$condicoesDeSaude = $dom->createElement('condicoesDeSaude');
$cadastroIndividualTransport->appendChild($condicoesDeSaude);
if ($internacao == 'true') {
$condicoesDeSaude->appendChild($dom->createElement('descricaoCausaInternacaoEm12Meses', $fichaCadastroIndividual->internacao_motivo));
}
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao1', $fichaCadastroIndividual->outras_condicoes_primaria));
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao2', $fichaCadastroIndividual->outras_condicoes_secundaria));
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao3', $fichaCadastroIndividual->outras_condicoes_terciaria));
if ($plantasMedicinais == 'true') {
$condicoesDeSaude->appendChild($dom->createElement('descricaoPlantasMedicinaisUsadas', $fichaCadastroIndividual->plantas_medicinais_quais));
}
if ($doencaCardiaca == 'true') {
self::getDoencasCardiacas($dom, $fichaCadastroIndividual, $condicoesDeSaude);
}
if ($doencaRespiratoria == 'true') {
self::getDoencasRespiratoria($dom, $fichaCadastroIndividual, $condicoesDeSaude);
}
if ($problemasRins == 'true') {
self::getProblemasRins($dom, $fichaCadastroIndividual, $condicoesDeSaude);
}
if ($gestante == 'true' && $fichaCadastroIndividual->maternidade_referencia) {
$condicoesDeSaude->appendChild($dom->createElement('maternidadeDeReferencia', $fichaCadastroIndividual->maternidade_referencia));
}
if ($fichaCadastroIndividual->peso) {
$condicoesDeSaude->appendChild($dom->createElement('situacaoPeso', $fichaCadastroIndividual->peso->codigo_esus));
}
$condicoesDeSaude->appendChild($dom->createElement('statusEhDependenteAlcool', $usaAlcool));
$condicoesDeSaude->appendChild($dom->createElement('statusEhDependenteOutrasDrogas', $outrasDrogas));
$condicoesDeSaude->appendChild($dom->createElement('statusEhFumante', $fumante));
if(optional($fichaCadastroIndividual->paciente->cidadao->sexo)->id === Sexo::FEMININO && ($idade >= 9 && $idade <= 60)){
$condicoesDeSaude->appendChild($dom->createElement('statusEhGestante', $gestante));
}
$condicoesDeSaude->appendChild($dom->createElement('statusEstaAcamado', $acamado));
$condicoesDeSaude->appendChild($dom->createElement('statusEstaDomiciliado', $domiciliado));
$condicoesDeSaude->appendChild($dom->createElement('statusTemDiabetes', $diabetes));
$condicoesDeSaude->appendChild($dom->createElement('statusTemDoencaRespiratoria', $doencaRespiratoria));
$condicoesDeSaude->appendChild($dom->createElement('statusTemHanseniase', $hanseniase));
$condicoesDeSaude->appendChild($dom->createElement('statusTemHipertensaoArterial', $hipertensao));
$condicoesDeSaude->appendChild($dom->createElement('statusTemTeveCancer', $cancer));
$condicoesDeSaude->appendChild($dom->createElement('statusTemTeveDoencasRins', $problemasRins));
$condicoesDeSaude->appendChild($dom->createElement('statusTemTuberculose', $tuberculose));
$condicoesDeSaude->appendChild($dom->createElement('statusTeveAvcDerrame', $avcDerrame));
$condicoesDeSaude->appendChild($dom->createElement('statusTeveDoencaCardiaca', $doencaCardiaca));
$condicoesDeSaude->appendChild($dom->createElement('statusTeveInfarto', $infarto));
$condicoesDeSaude->appendChild($dom->createElement('statusTeveInternadoEm12Meses', $internacao));
$condicoesDeSaude->appendChild($dom->createElement('statusUsaOutrasPraticasIntegrativasOuComplementares', $praticasIntegrativas));
$condicoesDeSaude->appendChild($dom->createElement('statusUsaPlantaMedicinais', $plantasMedicinais));
$condicoesDeSaude->appendChild($dom->createElement('statusDiagnosticoMental', $tratamentoSaudeMental));
$emSituacaoDeRua = $dom->createElement('emSituacaoDeRua');
$cadastroIndividualTransport->appendChild($emSituacaoDeRua);
if ($situacaoRua == 'true') {
$emSituacaoDeRua->appendChild($dom->createElement('grauParentescoFamiliarFrequentado', $fichaCadastroIndividual->parentesco));
self::getHigienePessoal($dom, $fichaCadastroIndividual, $emSituacaoDeRua);
self::getOrigemAlimentos($dom, $fichaCadastroIndividual, $emSituacaoDeRua);
if ($outraInstituicao == 'true') {
$emSituacaoDeRua->appendChild($dom->createElement('outraInstituicaoQueAcompanha', $fichaCadastroIndividual->outra_instituicao_quais));
}
$emSituacaoDeRua->appendChild($dom->createElement('quantidadeAlimentacoesAoDiaSituacaoRua', $fichaCadastroIndividual->alimentacaoDiaria->codigo_esus));
$emSituacaoDeRua->appendChild($dom->createElement('statusAcompanhadoPorOutraInstituicao', $outraInstituicao));
$emSituacaoDeRua->appendChild($dom->createElement('statusPossuiReferenciaFamiliar', $referenciaFamiliar));
$emSituacaoDeRua->appendChild($dom->createElement('statusRecebeBeneficio', $recebeBeneficio));
}
$emSituacaoDeRua->appendChild($dom->createElement('statusSituacaoRua', $situacaoRua));
if ($situacaoRua == 'true') {
$emSituacaoDeRua->appendChild($dom->createElement('statusTemAcessoHigienePessoalSituacaoRua', $higienePessoal));
$emSituacaoDeRua->appendChild($dom->createElement('statusVisitaFamiliarFrequentemente', $visitaFamiliar));
$emSituacaoDeRua->appendChild($dom->createElement('tempoSituacaoRua', $fichaCadastroIndividual->situacaoRua->codigo_esus));
}
}
$cadastroIndividualTransport->appendChild($dom->createElement('fichaAtualizada', $fichaAtualizada));
$identificacaoUsuarioCidadao = $dom->createElement('identificacaoUsuarioCidadao');
$cadastroIndividualTransport->appendChild($identificacaoUsuarioCidadao);
if ($fichaCadastroIndividual->paciente->cidadao->nome_social) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeSocial', $fichaCadastroIndividual->paciente->cidadao->nome_social));
}
if ($fichaCadastroIndividual->paciente->cidadao->municipioNascimento && $fichaCadastroIndividual->paciente->cidadao->municipioNascimento->ibge) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('codigoIbgeMunicipioNascimento', $fichaCadastroIndividual->paciente->cidadao->municipioNascimento->ibge));
}
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dataNascimentoCidadao', strtotime($fichaCadastroIndividual->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$identificacaoUsuarioCidadao->appendChild($dom->createElement('desconheceNomeMae', $desconheceNomeMae));
if ($fichaCadastroIndividual->paciente->email !== null) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('emailCidadao', $fichaCadastroIndividual->paciente->email));
}
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nacionalidadeCidadao', $fichaCadastroIndividual->paciente->cidadao->nacionalidade->codigo_esus));
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeCidadao', $fichaCadastroIndividual->paciente->cidadao->nome));
if ($desconheceNomeMae == 'false') {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeMaeCidadao', $fichaCadastroIndividual->paciente->cidadao->nome_mae));
}
if (Cns::isValid($fichaCadastroIndividual->paciente->cidadao->cns)) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('cnsCidadao', $fichaCadastroIndividual->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaCadastroIndividual->paciente->cidadao->cns)) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('cpfCidadao', $fichaCadastroIndividual->paciente->cidadao->cpf ?? ''));
}
if ($telefoneCelular) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('telefoneCelular', $telefoneCelular));
}
if ($fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho &&
$fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho->nis_pis_pasep) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('numeroNisPisPasep', $fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho->nis_pis_pasep));
}
$racaCorEsus = $fichaCadastroIndividual->paciente->cidadao->racaCor && $fichaCadastroIndividual->paciente->cidadao->racaCor->id
? ($fichaCadastroIndividual->paciente->cidadao->racaCor->id != RacaCor::SEM_INFORMACAO
? $fichaCadastroIndividual->paciente->cidadao->racaCor->codigo_esus : NULL)
: NULL;
$paisNascimento = optional(optional(optional($fichaCadastroIndividual->paciente)->cidadao)->paisNascimento)->codigo_esus;
if ($paisNascimento) {
$identificacaoUsuarioCidadao
->appendChild($dom->createElement('paisNascimento', $paisNascimento));
}
$identificacaoUsuarioCidadao->appendChild($dom->createElement('racaCorCidadao', $racaCorEsus));
$identificacaoUsuarioCidadao->appendChild($dom->createElement('sexoCidadao', self::sexo(optional($fichaCadastroIndividual->paciente->cidadao->sexo)->id)));
$identificacaoUsuarioCidadao->appendChild($dom->createElement('statusEhResponsavel', $responsavel));
if (optional($fichaCadastroIndividual->paciente->cidadao->racaCor)->id === RacaCor::INDIGENA) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('etnia', $fichaCadastroIndividual->paciente->cidadao->etniaIndigena->codigo_cadsus));
}
if ($desconheceNomePai == 'false') {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomePaiCidadao', $fichaCadastroIndividual->paciente->cidadao->nome_pai));
}
$identificacaoUsuarioCidadao->appendChild($dom->createElement('desconheceNomePai', $desconheceNomePai));
if ($fichaCadastroIndividual->paciente->cidadao->nacionalidade->id == Nacionalidade::NATURALIZADO_BRASILEIRO
|| $fichaCadastroIndividual->paciente->cidadao->nacionalidade->id == Nacionalidade::ESTRANGEIRO) {
if ($fichaCadastroIndividual->paciente->cidadao->data_naturalizacao) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dtNaturalizacao', strtotime($fichaCadastroIndividual->paciente->cidadao->data_naturalizacao->format('Y-m-d')) * 1000));
}
if ($fichaCadastroIndividual->paciente->cidadao->portaria_naturalizacao) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('portariaNaturalizacao', $fichaCadastroIndividual->paciente->cidadao->portaria_naturalizacao));
}
if ($fichaCadastroIndividual->paciente->cidadao->estrangeiroEntradaBrasil) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dtEntradaBrasil', strtotime($fichaCadastroIndividual->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d')) * 1000));
}
}
if ($cadastroDomiciliar) {
if ($foraArea == 'false' && $cadastroDomiciliar->microarea) {
$identificacaoUsuarioCidadao->appendChild($dom->createElement('microArea', str_pad($cadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
}
$identificacaoUsuarioCidadao->appendChild($dom->createElement('stForaArea', $foraArea));
}
if ($recusaCadastro == 'false') {
$informacoesSocioDemograficas = $dom->createElement('informacoesSocioDemograficas');
$cadastroIndividualTransport->appendChild($informacoesSocioDemograficas);
self::getDeficiencias($dom, $fichaCadastroIndividual, $informacoesSocioDemograficas);
if ($fichaCadastroIndividual->curso) {
$informacoesSocioDemograficas->appendChild($dom->createElement('grauInstrucaoCidadao', $fichaCadastroIndividual->curso->codigo_esus));
}
if ( $fichaCadastroIndividual->ocupacao) {
$informacoesSocioDemograficas->appendChild($dom->createElement('ocupacaoCodigoCbo2002', $fichaCadastroIndividual->ocupacao->codigo));
}
if ($orientacaoSexual == 'true' && $fichaCadastroIndividual->orientacaoSexual) {
$informacoesSocioDemograficas->appendChild($dom->createElement('orientacaoSexualCidadao', $fichaCadastroIndividual->orientacaoSexual->codigo_esus));
}
if ($fichaCadastroIndividual->parentescoResponsavel) {
$informacoesSocioDemograficas->appendChild($dom->createElement('relacaoParentescoCidadao', $fichaCadastroIndividual->parentescoResponsavel->codigo_esus));
}
if ($fichaCadastroIndividual->situacaoMercadoTrabalho) {
$informacoesSocioDemograficas->appendChild($dom->createElement('situacaoMercadoTrabalhoCidadao', $fichaCadastroIndividual->situacaoMercadoTrabalho->codigo_esus));
}
$informacoesSocioDemograficas->appendChild($dom->createElement('statusDesejaInformarOrientacaoSexual', $orientacaoSexual));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusFrequentaBenzedeira', $cuidadorTradicional));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusFrequentaEscola', $escola));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusMembroPovoComunidadeTradicional', $comunidadeTradicional));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusParticipaGrupoComunitario', $grupoComunitario));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusPossuiPlanoSaudePrivado', $planoSaude));
$informacoesSocioDemograficas->appendChild($dom->createElement('statusTemAlgumaDeficiencia', $deficiente));
if ($identidadeGenero == 'true' && $fichaCadastroIndividual->paciente->cidadao->identidadeGenero) {
$informacoesSocioDemograficas->appendChild($dom->createElement('identidadeGeneroCidadao', $fichaCadastroIndividual->paciente->cidadao->identidadeGenero->codigo_esus));
}
$informacoesSocioDemograficas->appendChild($dom->createElement('statusDesejaInformarIdentidadeGenero', $identidadeGenero));
if ($idade <= 9) {
self::getResponsavelPorCrianca($dom, $fichaCadastroIndividual, $informacoesSocioDemograficas);
}
if ($fichaCadastroIndividual->comunidadeTradicionalQual) {
$informacoesSocioDemograficas->appendChild($dom->createElement('coPovoComunidadeTradicional', $fichaCadastroIndividual->comunidadeTradicionalQual->codigo_esus));
}
if ($fichaCadastroIndividual->alimentos_acabaram !== null || $fichaCadastroIndividual->comeu_alguns_alimentos !== null) {
$informacoesSocioEconomicas = $dom->createElement('informacoesSocioEconomicas');
$cadastroIndividualTransport->appendChild($informacoesSocioEconomicas);
if ($alimentosAcabaram !== null) {
$informacoesSocioEconomicas->appendChild($dom->createElement('alimentosAcabaramAntesTerDinheiroComprarMais', $alimentosAcabaram));
}
if ($comeuAlgunsAlimentos !== null) {
$informacoesSocioEconomicas->appendChild($dom->createElement('comeuAlgunsAlimentosQueTinhaDinheiroAcabou', $comeuAlgunsAlimentos));
}
}
if ($fichaCadastroIndividual->saidaCidadao) {
$saidaCidadaoCadastro = $dom->createElement('saidaCidadaoCadastro');
$cadastroIndividualTransport->appendChild($saidaCidadaoCadastro);
if ($fichaCadastroIndividual->saidaCidadao) {
$saidaCidadaoCadastro->appendChild($dom->createElement('motivoSaidaCidadao', $fichaCadastroIndividual->saidaCidadao->codigo_esus));
}
if ($fichaCadastroIndividual->saidaCidadao->id == SaidaCidadao::OBITO) {
$dataObito = $fichaCadastroIndividual->paciente->cidadao->obito->obito_em ?? null;
$dataObitoMs = $dataObito ? strtotime($dataObito) * 1000 : '';
$numeroDO = $fichaCadastroIndividual->paciente->cidadao->obito->declaracao ?? '';
$saidaCidadaoCadastro->appendChild(
$dom->createElement('dataObito', $dataObitoMs)
);
$saidaCidadaoCadastro->appendChild(
$dom->createElement('numeroDO', $numeroDO)
);
}
}
}
$cadastroIndividualTransport->appendChild($dom->createElement('statusTermoRecusaCadastroIndividualAtencaoBasica', $recusaCadastro));
$cadastroIndividualTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$cadastroIndividualTransport->appendChild($dom->createElement('uuid', $uuid));
if ($fichaAtualizada == 'true') {
$cadastroIndividualTransport->appendChild($dom->createElement('uuidFichaOriginadora', $fichaCadastroIndividual->uuid_ficha));
}else{
$cadastroIndividualTransport->appendChild($dom->createElement('uuidFichaOriginadora', $uuid));
}
$headerTransport = $dom->createElement('headerTransport');
$cadastroIndividualTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaCadastroIndividual->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaCadastroIndividual->usuarioOcupacao->codigo ?? null));
$headerTransport->appendChild($dom->createElement('cnes', $fichaCadastroIndividual->equipe->unidade->cnes ?? null));
if($fichaCadastroIndividual->equipe->area->numero_ine ?? false){
$headerTransport->appendChild($dom->createElement('ine', $fichaCadastroIndividual->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaCadastroIndividual->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroIndividual->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaCadastroIndividual->uuid_ficha = $uuid;
$fichaCadastroIndividual->exportacao_id = $exportacao->id;
$fichaCadastroIndividual->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaCadastroIndividual->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaCadastroIndividual->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
private static function getDoencasCardiacas(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
$doencasCardiaca = DB::table('atencao_basica_cadastro_individual_doenca_cardiaca')
->select([
'atencao_basica_cadastro_doenca_cardiaca.codigo_esus',
])
->join(
'atencao_basica_cadastro_doenca_cardiaca',
'atencao_basica_cadastro_doenca_cardiaca.id',
'atencao_basica_cadastro_individual_doenca_cardiaca.doenca_cardiaca_id'
)
->where('atencao_basica_cadastro_individual_doenca_cardiaca.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($doencasCardiaca as $doencaCardiaca) {
$condicoesDeSaude->appendChild($dom->createElement('doencaCardiaca', $doencaCardiaca->codigo_esus));
}
}
private static function getDeficiencias(&$dom, $fichaCadastroIndividual, &$informacoesSocioDemograficas)
{
$deficiencias = DB::table('atencao_basica_cadastro_individual_deficiencia_base')
->select([
'cadastro_deficiencia_base.codigo_esus',
])
->join(
'cadastro_deficiencia_base',
'cadastro_deficiencia_base.id',
'atencao_basica_cadastro_individual_deficiencia_base.deficiencia_base_id'
)
->where('atencao_basica_cadastro_individual_deficiencia_base.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
$fatoresRisco = $fichaCadastroIndividual->paciente->cidadao->fatoresRisco->pluck('id');
$transtornoEspectroAutista = $fatoresRisco->contains(FatorRisco::TEA);
if ($transtornoEspectroAutista && !$deficiencias->pluck('codigo_esus')->contains('232')) {
$deficiencias->push((object)['codigo_esus' => '232']);
}
foreach ($deficiencias as $deficiencia) {
$informacoesSocioDemograficas->appendChild(
$dom->createElement('deficienciasCidadao', $deficiencia->codigo_esus)
);
}
}
private static function getResponsavelPorCrianca(&$dom, $fichaCadastroIndividual, &$informacoesSocioDemograficas){
$acompanhamentos = DB::table('atencao_basica_cadastro_individual_acompanhamento_infantil')
->select([
'atencao_basica_cadastro_acompanhamento_infantil.codigo_esus',
])
->join(
'atencao_basica_cadastro_acompanhamento_infantil',
'atencao_basica_cadastro_acompanhamento_infantil.id',
'atencao_basica_cadastro_individual_acompanhamento_infantil.acompanhamento_infantil_id'
)
->where('atencao_basica_cadastro_individual_acompanhamento_infantil.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($acompanhamentos as $acompanhamento) {
$informacoesSocioDemograficas->appendChild($dom->createElement('responsavelPorCrianca', $acompanhamento->codigo_esus));
}
}
private static function getDoencasRespiratoria(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
$doencasRespiratoria = DB::table('atencao_basica_cadastro_individual_doenca_respiratoria')
->select([
'atencao_basica_cadastro_doenca_respiratoria.codigo_esus',
])
->join(
'atencao_basica_cadastro_doenca_respiratoria',
'atencao_basica_cadastro_doenca_respiratoria.id',
'atencao_basica_cadastro_individual_doenca_respiratoria.doenca_respiratoria_id'
)
->where('atencao_basica_cadastro_individual_doenca_respiratoria.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($doencasRespiratoria as $doencaRespiratoria) {
$condicoesDeSaude->appendChild($dom->createElement('doencaRespiratoria', $doencaRespiratoria->codigo_esus));
}
}
private static function getProblemasRins(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
$doencasRins = DB::table('atencao_basica_cadastro_individual_problemas_rins')
->select([
'atencao_basica_cadastro_problemas_rins.codigo_esus',
])
->join(
'atencao_basica_cadastro_problemas_rins',
'atencao_basica_cadastro_problemas_rins.id',
'atencao_basica_cadastro_individual_problemas_rins.problemas_rins_id'
)
->where('atencao_basica_cadastro_individual_problemas_rins.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($doencasRins as $doencaRins) {
$condicoesDeSaude->appendChild($dom->createElement('doencaRins', $doencaRins->codigo_esus));
}
}
private static function getOrigemAlimentos(&$dom, $fichaCadastroIndividual, &$emSituacaoDeRua){
$origemAlimentos = DB::table('atencao_basica_cadastro_individual_origem_alimentacao')
->select([
'atencao_basica_cadastro_origem_alimentacao.codigo_esus',
])
->join(
'atencao_basica_cadastro_origem_alimentacao',
'atencao_basica_cadastro_origem_alimentacao.id',
'atencao_basica_cadastro_individual_origem_alimentacao.origem_alimentacao_id'
)
->where('atencao_basica_cadastro_individual_origem_alimentacao.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($origemAlimentos as $origemAlimento) {
$emSituacaoDeRua->appendChild($dom->createElement('origemAlimentoSituacaoRua', $origemAlimento->codigo_esus));
}
}
private static function getHigienePessoal(&$dom, $fichaCadastroIndividual, &$emSituacaoDeRua){
$higienesPessoal = DB::table('atencao_basica_cadastro_individual_higiene_pessoal')
->select([
'atencao_basica_cadastro_higiene_pessoal.codigo_esus',
])
->join(
'atencao_basica_cadastro_higiene_pessoal',
'atencao_basica_cadastro_higiene_pessoal.id',
'atencao_basica_cadastro_individual_higiene_pessoal.higiene_pessoal_id'
)
->where('atencao_basica_cadastro_individual_higiene_pessoal.cadastro_individual_id', $fichaCadastroIndividual->id)
->get();
foreach ($higienesPessoal as $higienePessoal) {
$emSituacaoDeRua->appendChild($dom->createElement('higienePessoalSituacaoRua', $higienePessoal->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;
}
}

View File

@@ -0,0 +1,208 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementar;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaComplementarService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasComplementar($mes_ano) as $fichaComplementar) {
$dadosExportacao = self::getDadosExportacao($fichaComplementar, $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, 'FC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasComplementar($mesAnoInicial, false) as $fichaComplementar) {
$dadosExportacao = self::getDadosExportacao($fichaComplementar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaComplementar->data_atendimento,
'usuario_id' => $fichaComplementar->usuario->id,
'ocupacao_id' => $fichaComplementar->ocupacao->id,
'equipe_id' => $fichaComplementar->equipe->id,
'ficha_complementar_id' => $fichaComplementar->id,
'xml' => [
'nome_arquivo' => 'FC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasComplementar($mes_ano, $somenteMesAno = true)
{
return FichaComplementar::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->get();
}
private static function getDadosExportacao($fichaComplementar, $exportacaoArquivoId = null, $usuarioId = null)
{
$uuid = ExportacaoService::getUuid($fichaComplementar->equipe->unidade->cnes);
$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/fichacomplementarzikamicrocefalia');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::FICHA_COMPLEMENTAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaComplementar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaComplementar->equipe->unidade->cnes));
if($fichaComplementar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaComplementar->equipe->area->numero_ine));
}
$fichaComplementarZikaMicrocefaliaTransport = $dom->createElement('ns4:fichaComplementarZikaMicrocefaliaTransport');
$dadoTransporteTransportXml->appendChild($fichaComplementarZikaMicrocefaliaTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaComplementarZikaMicrocefaliaTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaComplementar->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaComplementar->ocupacao->codigo));
$headerTransport->appendChild($dom->createElement('cnes', $fichaComplementar->equipe->unidade->cnes));
if($fichaComplementar->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaComplementar->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaComplementar->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaComplementar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('turno', $fichaComplementar->turno_id));
if (Cns::isValid($fichaComplementar->paciente->cidadao->cns)) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cnsCidadao', $fichaComplementar->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaComplementar->paciente->cidadao->cns)) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cpfCidadao', $fichaComplementar->paciente->cidadao->cpf ?? ''));
}
$responsavelFamiliar = self::responsavelFamiliar($fichaComplementar);
if ($responsavelFamiliar) {
if (Cns::isValid($responsavelFamiliar->cns)) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cnsResponsavelFamiliar', $responsavelFamiliar->cns ?? ''));
}
if (!Cns::isValid($responsavelFamiliar->cns)) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cpfResponsavelFamiliar', $responsavelFamiliar->cpf ?? ''));
}
}
if ($fichaComplementar->data_realizacao_teste_olhinho) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTesteOlhinho', strtotime($fichaComplementar->data_realizacao_teste_olhinho) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTesteOlhinho', $fichaComplementar->fichaComplementarTesteOlho->codigo));
}
if ($fichaComplementar->data_realizacao_fundo_olho) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoExameFundoOlho', strtotime($fichaComplementar->data_realizacao_fundo_olho) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoExameFundoOlho', $fichaComplementar->fichaComplementarFundoOlho->codigo));
}
if ($fichaComplementar->data_realizacao_teste_orelhinha) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTesteOrelhinha', strtotime($fichaComplementar->data_realizacao_teste_orelhinha) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTesteOrelhinha', $fichaComplementar->fichaComplementarTesteOrelha->codigo));
}
if ($fichaComplementar->data_realizacao_us_transfontanela) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoUSTransfontanela', strtotime($fichaComplementar->data_realizacao_us_transfontanela) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoUsTransfontanela', $fichaComplementar->fichaComplementarUsTransfontanela->codigo));
}
if ($fichaComplementar->data_realizacao_tomografia_computadorizada) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTomografiaComputadorizada', strtotime($fichaComplementar->data_realizacao_tomografia_computadorizada) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTomografiaComputadorizada', $fichaComplementar->fichaComplementarTomografiaComputadorizada->codigo));
}
if ($fichaComplementar->data_realizacao_ressonancia_magnetica) {
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoRessonanciaMagnetica', strtotime($fichaComplementar->data_realizacao_ressonancia_magnetica) * 1000));
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoRessonanciaMagnetica', $fichaComplementar->fichaComplementarRessonanciaMagnetica->codigo));
}
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaComplementar->uuid_ficha = $uuid;
$fichaComplementar->exportacao_id = $exportacao->id;
$fichaComplementar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaComplementar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaComplementar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
private static function responsavelFamiliar($fichaComplementar) {
return CadastroIndividual::where('paciente_id', $fichaComplementar->paciente_id)
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'atencao_basica_cadastro_individual.responsavel_cidadao_id')
->select('cadastro_cidadao.cns', 'cadastro_cidadao.cpf')
->first();
}
}

View File

@@ -0,0 +1,202 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaConsumoAlimentarDeSeisAVinteTresMesesService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
'xml' => [
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
{
return MarcadorConsumoAlimentar::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->with('paciente.cidadao')
->whereHas('paciente.cidadao', function ($query) {
$query->whereRaw('TIMESTAMPDIFF(
MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento
) >= 6 AND TIMESTAMPDIFF(
MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento
) <= 23');
})
->get();
}
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
{
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->equipe->unidade->cnes);
$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/fichaconsumoalimentar');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
$perguntasRespostas = MarcadorConsumoAlimentarPerguntaResposta::where(
'marcador_consumo_alimentar_id',
$fichaConsumoAlimentar->id
)->get();
foreach ($perguntasRespostas as $perguntaResposta) {
$perguntas = $dom->createElement('perguntasQuestionarioCriancasDeSeisVinteTresMeses');
$fichaConsumoAlimentarTransport->appendChild($perguntas);
$perguntas->appendChild($dom->createElement('pergunta', $perguntaResposta->pergunta->descricao_esus));
$perguntas->appendChild($dom->createElement('respostaUnicaEscolha', $perguntaResposta->resposta->descricao_esus));
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaConsumoAlimentar->uuid_ficha = $uuid;
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaConsumoAlimentar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
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;
}
}

View File

@@ -0,0 +1,202 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaConsumoAlimentarMaisDoisAnosService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
'xml' => [
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
{
return MarcadorConsumoAlimentar::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->with('paciente.cidadao')
->whereHas('paciente.cidadao', function ($query) {
$query->whereRaw('TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento) >= 2');
})
->get();
}
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
{
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->equipe->unidade->cnes);
$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/fichaconsumoalimentar');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
$perguntasERespostas = MarcadorConsumoAlimentarPerguntaResposta::where('marcador_consumo_alimentar_id', $fichaConsumoAlimentar->id)
->with('pergunta', 'resposta')
->get()
->groupBy('pergunta_id');
foreach ($perguntasERespostas as $respostas) {
$elementoPerguntas = $dom->createElement('perguntasQuestionarioCriancasComMaisDoisAnos');
$fichaConsumoAlimentarTransport->appendChild($elementoPerguntas);
$elementoPerguntas->appendChild($dom->createElement('pergunta', $respostas->first()->pergunta->descricao_esus));
if ($respostas->count() == 1) {
$elementoPerguntas->appendChild($dom->createElement('respostaUnicaEscolha', $respostas->first()->resposta->descricao_esus));
} else {
foreach ($respostas as $resposta) {
$elementoPerguntas->appendChild($dom->createElement('respostaMultiplaEscolha', $resposta->resposta->descricao_esus));
}
}
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaConsumoAlimentar->uuid_ficha = $uuid;
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaConsumoAlimentar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
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;
}
}

View File

@@ -0,0 +1,198 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaConsumoAlimentarMenosSeisMesesService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
'xml' => [
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
{
return MarcadorConsumoAlimentar::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->with('paciente.cidadao')
->whereHas('paciente.cidadao', function ($query) {
$query->whereRaw('TIMESTAMPDIFF(MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento) < 6');
})
->get();
}
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
{
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->equipe->unidade->cnes);
$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/fichaconsumoalimentar');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
if($fichaConsumoAlimentar->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
$perguntasRespostas = MarcadorConsumoAlimentarPerguntaResposta::where(
'marcador_consumo_alimentar_id',
$fichaConsumoAlimentar->id
)->get();
foreach ($perguntasRespostas as $perguntaResposta) {
$perguntas = $dom->createElement('perguntasQuestionarioCriancasMenoresSeisMeses');
$fichaConsumoAlimentarTransport->appendChild($perguntas);
$perguntas->appendChild($dom->createElement('pergunta', $perguntaResposta->pergunta->descricao_esus));
$perguntas->appendChild($dom->createElement('respostaUnicaEscolha', $perguntaResposta->resposta->descricao_esus));
}
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$dom->appendChild($dadoTransporteTransportXml);
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaConsumoAlimentar->uuid_ficha = $uuid;
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaConsumoAlimentar->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
];
}
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;
}
}

View File

@@ -0,0 +1,607 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\Procedimento\Procedimento;
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimento;
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimentoIvcf;
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 FichaProcedimentoService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasProcedimento($mes_ano) as $fichaProcedimento) {
$dadosExportacao = self::getDadosExportacao($fichaProcedimento, $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, 'PR_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasProcedimento($mesAnoInicial, false) as $fichaProcedimento) {
$dadosExportacao = self::getDadosExportacao($fichaProcedimento);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaProcedimento->data_usuario_responsavel,
'usuario_id' => $fichaProcedimento->usuario->id,
'ocupacao_id' => $fichaProcedimento->ocupacao->id,
'equipe_id' => $fichaProcedimento->equipe->id,
'procedimento_id' => $fichaProcedimento->id,
'procedimento_atendimentos' => $dadosExportacao['procedimento_atendimentos'],
'xml' => [
'nome_arquivo' => 'PR_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasProcedimento($mes_ano, $somenteMesAno = true)
{
return Procedimento::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));
});
})
)
->get();
}
private static function getDadosExportacao($fichaProcedimento, $exportacaoArquivoId = null, $usuarioId = null)
{
$uuid = ExportacaoService::getUuid($fichaProcedimento->equipe->unidade->cnes);
$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/fichaprocedimentomaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::PROCEDIMENTOS));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProcedimento->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProcedimento->equipe->unidade->cnes));
if($fichaProcedimento->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProcedimento->equipe->area->numero_ine));
}
$fichaProcedimentoMasterTransport = $dom->createElement('ns4:fichaProcedimentoMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaProcedimentoMasterTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaProcedimentoMasterTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaProcedimento->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaProcedimento->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaProcedimento->equipe->unidade->cnes));
if($fichaProcedimento->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaProcedimento->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProcedimento->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProcedimento->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dom->appendChild($dadoTransporteTransportXml);
$retorno = self::getPacientes($dom, $fichaProcedimento, $fichaProcedimentoMasterTransport);
$procedimentoAtendimentos = $retorno['procedimento_atendimentos'];
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
if($fichaProcedimento->afericao_pa){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalAfericaoPa', $fichaProcedimento->afericao_pa ?? ''));
}
if($fichaProcedimento->afericao_temperatura){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalAfericaoTemperatura', $fichaProcedimento->afericao_temperatura ?? ''));
}
if($fichaProcedimento->curativo_simples){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalCurativoSimples', $fichaProcedimento->curativo_simples ?? ''));
}
if($fichaProcedimento->coleta_material_exame_laboratorial){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalColetaMaterialParaExameLaboratorial', $fichaProcedimento->coleta_material_exame_laboratorial ?? ''));
}
if($fichaProcedimento->glicemia_capilar){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalGlicemiaCapilar', $fichaProcedimento->glicemia_capilar ?? ''));
}
if($fichaProcedimento->medicao_altura){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalMedicaoAltura', $fichaProcedimento->medicao_altura ?? ''));
}
if($fichaProcedimento->medicao_peso){
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalMedicaoPeso', $fichaProcedimento->medicao_peso ?? ''));
}
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
$exportacao->save();
$fichaProcedimento->uuid_ficha = $uuid;
$fichaProcedimento->exportacao_id = $exportacao->id;
$fichaProcedimento->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaProcedimento->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaProcedimento->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'procedimento_atendimentos' => $procedimentoAtendimentos,
];
}
private static function getPacientes(&$dom, $fichaProcedimento, &$fichaProcedimentoMasterTransport){
$procedimentoAtendimentosPosicoes = collect();
$procedimentoPaciente = ProcedimentoAtendimento::where('procedimento_id', $fichaProcedimento->id)
->get();
foreach ($procedimentoPaciente as $i => $procedimento) {
$procedimentoAtendimentosPosicoes->push([
'posicao' => $i + 1,
'id' => $procedimento->id,
]);
$atendProcedimentos = $dom->createElement('atendProcedimentos');
$fichaProcedimentoMasterTransport->appendChild($atendProcedimentos);
if($procedimento->paciente) {
if($procedimento->paciente->prontuario){
$atendProcedimentos->appendChild($dom->createElement('numProntuario', $procedimento->paciente->prontuario));
}
if (Cns::isValid($procedimento->paciente->cidadao->cns)) {
$atendProcedimentos->appendChild($dom->createElement('cnsCidadao', $procedimento->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($procedimento->paciente->cidadao->cns)) {
$atendProcedimentos->appendChild($dom->createElement('cpfCidadao', $procedimento->paciente->cidadao->cpf ?? ''));
}
$atendProcedimentos->appendChild($dom->createElement('dtNascimento', strtotime($procedimento->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$atendProcedimentos->appendChild($dom->createElement('sexo', self::sexo($procedimento->paciente->cidadao->sexo->id)));
}
$atendProcedimentos->appendChild($dom->createElement('localAtendimento', $procedimento->local_atendimento_id));
$atendProcedimentos->appendChild($dom->createElement('turno', $procedimento->turno_id));
$atendProcedimentos->appendChild($dom->createElement('statusEscutaInicialOrientacao', $procedimento->escuta_inicial ? 'true' : 'false'));
self::getProcedimentos($dom, $procedimento, $atendProcedimentos);
$dataHoraInicialAtendimento = strtotime($fichaProcedimento->data_usuario_responsavel . ' ' . Carbon::parse($procedimento->created_at)->format('H:i:s'));
$atendProcedimentos->appendChild($dom->createElement('dataHoraInicialAtendimento', $dataHoraInicialAtendimento * 1000));
$dataHoraFinalAtendimento = $dataHoraInicialAtendimento;
$dataHoraFinalAtendimento += 5 * 60;
$atendProcedimentos->appendChild($dom->createElement('dataHoraFinalAtendimento', $dataHoraFinalAtendimento * 1000));
self::getMedicoes($dom, $procedimento, $atendProcedimentos);
self::getIvcf($dom, $procedimento, $atendProcedimentos);
}
return [
'procedimento_atendimentos' => $procedimentoAtendimentosPosicoes,
];
}
private static function getMedicoes(&$dom, $procedimento, &$atendProcedimento){
$medicoesNecessarias = [
'circunferencia_abdominal',
'perimetro_panturrilha',
'afericao_pa',
'frequencia_respiratoria',
'frequencia_cardiaca',
'temperatura',
'saturacao_o2',
'glicemia_capilar',
'momento_coleta_id',
'peso',
'altura',
'perimetro_cefalico'
];
$existeMedicao = false;
foreach ($medicoesNecessarias as $campo) {
if (!empty($procedimento->$campo)) {
$existeMedicao = true;
break;
}
}
if ($existeMedicao) {
$medicoes = $dom->createElement('medicoes');
$atendProcedimento->appendChild($medicoes);
if (!empty($fichaAtendimentoIndividual->circunferencia_abdominal)) {
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $procedimento->circunferencia_abdominal));
}
if (!empty($procedimento->perimetro_panturrilha)) {
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $procedimento->perimetro_panturrilha));
}
if (!empty($procedimento->afericao_pa)) {
$pressao = explode('/', $procedimento->afericao_pa);
if (count($pressao) === 2) {
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
}
}
if (!empty($procedimento->frequencia_respiratoria)) {
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $procedimento->frequencia_respiratoria));
}
if (!empty($procedimento->frequencia_cardiaca)) {
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $procedimento->frequencia_cardiaca));
}
if (!empty($procedimento->temperatura)) {
$medicoes->appendChild($dom->createElement('temperatura', $procedimento->temperatura));
}
if (!empty($procedimento->saturacao_o2)) {
$medicoes->appendChild($dom->createElement('saturacaoO2', $procedimento->saturacao_o2));
}
if (!empty($procedimento->glicemia_capilar)) {
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $procedimento->glicemia_capilar));
}
if (!empty($procedimento->momento_coleta_id)) {
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $procedimento->momentoColeta->codigo_esus));
}
if (!empty($procedimento->peso)) {
$medicoes->appendChild($dom->createElement('peso', $procedimento->peso));
}
if (!empty($procedimento->altura)) {
$medicoes->appendChild($dom->createElement('altura', $procedimento->altura));
}
if (!empty($procedimento->perimetro_cefalico)) {
$medicoes->appendChild($dom->createElement('perimetroCefalico', $procedimento->perimetro_cefalico));
}
}
}
private static function getIvcf(&$dom, $procedimento, &$atendProcedimentos)
{
$procedimentoAtendimentoIvcf = ProcedimentoAtendimentoIvcf::where('procedimento_atendimento_id', $procedimento->id)->first();
if ($procedimentoAtendimentoIvcf) {
$pacienteIdade = $procedimentoAtendimentoIvcf->procedimentoAtendimento->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($procedimentoAtendimentoIvcf->updated_at) * 1000;
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
$resultado += 1;
}
else if ($pacienteIdade >= 85) {
$resultado += 3;
}
if ($procedimentoAtendimentoIvcf->estado_saude_geral === 'regular_ou_ruim') {
$resultado += 1;
$hasSgPercepcaoSaude = true;
}
if ($procedimentoAtendimentoIvcf->limitacao_compras || $procedimentoAtendimentoIvcf->limitacao_gestao_financeira || $procedimentoAtendimentoIvcf->limitacao_tarefas_domesticas) {
$resultado += 4;
$hasSgAvdInstrumental = true;
}
if ($procedimentoAtendimentoIvcf->banho_independencia) {
$resultado += 6;
$hasSgAvdBasica = true;
}
if ($procedimentoAtendimentoIvcf->relato_esquecimento_por_terceiros) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($procedimentoAtendimentoIvcf->esquecimento_piorando) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($procedimentoAtendimentoIvcf->esquecimento_impacta_atividades) {
$resultado += 2;
$hasSgCognicao = true;
}
if ($procedimentoAtendimentoIvcf->humor_tristeza_desanimo) {
$resultado += 2;
$hasSgHumor = true;
}
if ($procedimentoAtendimentoIvcf->perda_interesse_atividades) {
$resultado += 2;
$hasSgHumor = true;
}
if ($procedimentoAtendimentoIvcf->limitacao_elevar_bracos) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($procedimentoAtendimentoIvcf->limitacao_motricidade_fina) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($procedimentoAtendimentoIvcf->perda_peso_nao_intencional || $procedimentoAtendimentoIvcf->imc_abaixo_22 || $procedimentoAtendimentoIvcf->panturrilha_abaixo_31 || $procedimentoAtendimentoIvcf->marcha_lenta_4m_maior_5s) {
$resultado += 2;
$hasSgCapAerobicaMuscular = true;
}
if ($procedimentoAtendimentoIvcf->dificuldade_caminhar_impacto_atividades) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($procedimentoAtendimentoIvcf->quedas_recorrentes) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($procedimentoAtendimentoIvcf->incontinencia) {
$resultado += 2;
$hasSgContinencia = true;
}
if ($procedimentoAtendimentoIvcf->problema_visao_impacto_atividades) {
$resultado += 2;
$hasSgVisao = true;
}
if ($procedimentoAtendimentoIvcf->problema_audicao_impacto_atividades) {
$resultado += 2;
$hasSgAudicao = true;
}
if ($procedimentoAtendimentoIvcf->doencas_cronicas_multiplas || $procedimentoAtendimentoIvcf->polifarmacia_5_ou_mais_medicamentos || $procedimentoAtendimentoIvcf->internacao_ultimos_6_meses) {
$resultado += 4;
$hasSgComorbidade = true;
}
$ivcf = $dom->createElement('ivcf');
$atendProcedimentos->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));
}
}
private static function getProcedimentos(&$dom, $procedimento, &$atendProcedimento){
$atendimentoProcedimentosPequenaCirurgia = DB::table('atencao_basica_procedimento_atendimento_pequena_cirurgia')
->select([
'atencao_basica_cadastro_procedimento_pequena_cirurgia.codigo_esus',
'atencao_basica_cadastro_procedimento_pequena_cirurgia.codigo_procedimento',
])
->join(
'atencao_basica_cadastro_procedimento_pequena_cirurgia',
'atencao_basica_cadastro_procedimento_pequena_cirurgia.id',
'atencao_basica_procedimento_atendimento_pequena_cirurgia.pequena_cirurgia_id'
)
->where('atencao_basica_procedimento_atendimento_pequena_cirurgia.procedimento_atendimento_id', $procedimento->id)
->get();
foreach ($atendimentoProcedimentosPequenaCirurgia as $procedimentosPequenaCirurgia) {
if (isset($procedimentosPequenaCirurgia->codigo_procedimento)
&& !empty(trim($procedimentosPequenaCirurgia->codigo_procedimento))
) {
$codigoPequenaCirurgia = $procedimentosPequenaCirurgia->codigo_procedimento;
}
else {
$codigoPequenaCirurgia = $procedimentosPequenaCirurgia->codigo_esus;
}
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoPequenaCirurgia ));
}
$atendimentoProcedimentosTesteRapido = DB::table('atencao_basica_procedimento_atendimento_teste_rapido')
->select([
'atencao_basica_cadastro_teste_rapido.codigo_esus',
'atencao_basica_cadastro_teste_rapido.codigo_procedimento',
])
->join(
'atencao_basica_cadastro_teste_rapido',
'atencao_basica_cadastro_teste_rapido.id',
'atencao_basica_procedimento_atendimento_teste_rapido.teste_rapido_id'
)
->where('atencao_basica_procedimento_atendimento_teste_rapido.procedimento_atendimento_id', $procedimento->id)
->get();
foreach ($atendimentoProcedimentosTesteRapido as $procedimentosTesteRapido) {
if (isset($procedimentosTesteRapido->codigo_procedimento)
&& !empty(trim($procedimentosTesteRapido->codigo_procedimento))
) {
$codigoTesteRapido = $procedimentosTesteRapido->codigo_procedimento;
}
else {
$codigoTesteRapido = $procedimentosTesteRapido->codigo_esus;
}
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoTesteRapido));
}
$atendimentoProcedimentosViaAdministracao = DB::table('atencao_basica_procedimento_via_administracao')
->select([
'atencao_basica_cadastro_via_administracao.codigo_esus',
'atencao_basica_cadastro_via_administracao.codigo_procedimento',
])
->join(
'atencao_basica_cadastro_via_administracao',
'atencao_basica_cadastro_via_administracao.id',
'atencao_basica_procedimento_via_administracao.via_administracao_id'
)
->where('atencao_basica_procedimento_via_administracao.procedimento_atendimento_id', $procedimento->id)
->get();
foreach ($atendimentoProcedimentosViaAdministracao as $procedimentosViaAdministracao) {
if (isset($procedimentosViaAdministracao->codigo_procedimento)
&& !empty(trim($procedimentosViaAdministracao->codigo_procedimento))
) {
$codigoViaAdministracao = $procedimentosViaAdministracao->codigo_procedimento;
}
else {
$codigoViaAdministracao = $procedimentosViaAdministracao->codigo_esus;
}
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoViaAdministracao));
}
$codigoProcedimentoPequenaCirurgia = $atendimentoProcedimentosPequenaCirurgia->pluck('codigo_procedimento')->toArray();
$codigoProcedimentoTesteRapido = $atendimentoProcedimentosTesteRapido->pluck('codigo_procedimento')->toArray();
$codigoProcedimentoViaAdministracao = $atendimentoProcedimentosViaAdministracao->pluck('codigo_procedimento')->toArray();
$atendimentoProcedimentos = DB::table('atencao_basica_procedimento_atendimento_procedimento')
->select([
'procedimento.codigo',
])
->join(
'sigtap.procedimento as 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_procedimento.procedimento_atendimento_id', $procedimento->id)
->whereNotIn('procedimento.codigo', $codigoProcedimentoPequenaCirurgia)
->whereNotIn('procedimento.codigo', $codigoProcedimentoTesteRapido)
->whereNotIn('procedimento.codigo', $codigoProcedimentoViaAdministracao)
->where(function ($query) {
$query->whereNull('atencao_basica_procedimento_atendimento.atendimento_individual_id')
->orWhere(function($query) {
$query->whereNotNull('atencao_basica_procedimento_atendimento.atendimento_individual_id')
->where('procedimento.codigo', 'NOT LIKE', '09%');
});
})
->get();
foreach ($atendimentoProcedimentos as $procedimento) {
$atendProcedimento->appendChild($dom->createElement('procedimentos', $procedimento->codigo));
}
}
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;
}
}

View File

@@ -0,0 +1,300 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\EstrategiaVacinacao;
use App\Enums\AtencaoBasica\Exportacao\Imunobiologico;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Exportacao\VacinaAplicadaExterior;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Imunizacao\Estrategia;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\FichaVacinacao\FichaVacinacao;
use App\Models\AtencaoBasica\FichaVacinacao\PacienteItem;
use App\Models\AtencaoBasica\FichaVacinacao\VacinacaoPaciente;
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 FichaVacinacaoService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasVacinacao($mes_ano) as $fichaVacinacao) {
$dadosExportacao = self::getDadosExportacao($fichaVacinacao);
$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, 'VA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasVacinacao($mesAnoInicial, false) as $fichaVacinacao) {
$dadosExportacao = self::getDadosExportacao($fichaVacinacao);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaVacinacao->data_atendimento,
'usuario_id' => $fichaVacinacao->usuario->id,
'ocupacao_id' => $fichaVacinacao->ocupacao->id,
'equipe_id' => $fichaVacinacao->equipe->id,
'ficha_vacinacao_id' => $fichaVacinacao->id,
'ficha_vacinacao_pacientes' => $dadosExportacao['ficha_vacinacao_pacientes'],
'xml' => [
'nome_arquivo' => 'VA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasVacinacao($mes_ano, $somenteMesAno = true)
{
return FichaVacinacao::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data_atendimento', substr($mes_ano, 2))
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
});
})
)
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('atencao_basica_vacinacao_paciente')
->whereColumn('vacinacao_id', 'atencao_basica_ficha_vacinacao.id')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('atencao_basica_vacinacao_paciente_item')
->whereColumn('vacinacao_paciente_id', 'atencao_basica_vacinacao_paciente.id');
});
})
->get();
}
private static function getDadosExportacao($fichaVacinacao)
{
$uuid = ExportacaoService::getUuid($fichaVacinacao->equipe->unidade->cnes);
$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/fichavacinacaomaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::FICHA_DE_VACINACAO));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaVacinacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaVacinacao->equipe->unidade->cnes));
if($fichaVacinacao->equipe->area->numero_ine) {
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', str_pad($fichaVacinacao->equipe->area->numero_ine, 10, '0', STR_PAD_LEFT)));
}
$fichaVacinacaoMasterTransport = $dom->createElement('ns4:fichaVacinacaoMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaVacinacaoMasterTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaVacinacaoMasterTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaVacinacao->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaVacinacao->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaVacinacao->equipe->unidade->cnes));
if($fichaVacinacao->equipe->area->numero_ine) {
$headerTransport->appendChild($dom->createElement('ine', str_pad($fichaVacinacao->equipe->area->numero_ine, 10, '0', STR_PAD_LEFT)));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaVacinacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dom->appendChild($dadoTransporteTransportXml);
$fichaVacinacaoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaVacinacaoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$retorno = self::getVacinacao($dom, $fichaVacinacao, $fichaVacinacaoMasterTransport);
$fichaVacinacaoPacientesPosicoes = $retorno['ficha_vacinacao_pacientes'];
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
$exportacao = new Exportacao();
$exportacao->uuid = $uuid;
$exportacao->save();
$fichaVacinacao->uuid_ficha = $uuid;
$fichaVacinacao->exportacao_id = $exportacao->id;
$fichaVacinacao->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaVacinacao->usuario_exportacao_id = self::getCurrentLotacao()->usuario_id ?? null;
$fichaVacinacao->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'ficha_vacinacao_pacientes' => $fichaVacinacaoPacientesPosicoes,
];
}
private static function getVacinacao(&$dom, $fichaVacinacao, &$fichaVacinacaoMasterTransport) {
$fichaVacinacaoPacientesPosicoes = collect();
$vacinacaoPaciente = VacinacaoPaciente::has('paciente')
->where('vacinacao_id', $fichaVacinacao->id)
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('atencao_basica_vacinacao_paciente_item')
->whereColumn('vacinacao_paciente_id', 'atencao_basica_vacinacao_paciente.id');
})
->get();
foreach ($vacinacaoPaciente as $i => $vacinacao) {
$fichaVacinacaoPacientesPosicoes->push([
'posicao' => $i + 1,
'id' => $vacinacao->id,
]);
$vacinacoes = $dom->createElement('vacinacoes');
$fichaVacinacaoMasterTransport->appendChild($vacinacoes);
$vacinacoes->appendChild($dom->createElement('turno', $vacinacao->turno_id));
$vacinacoes->appendChild($dom->createElement('numProntuario', $vacinacao->paciente->prontuario));
if (Cns::isValid($vacinacao->paciente->cidadao->cns)) {
$vacinacoes->appendChild($dom->createElement('cnsCidadao', $vacinacao->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($vacinacao->paciente->cidadao->cns)) {
$vacinacoes->appendChild($dom->createElement('cpfCidadao', $vacinacao->paciente->cidadao->cpf ?? ''));
}
$vacinacoes->appendChild($dom->createElement('dtNascimento', strtotime($vacinacao->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$vacinacoes->appendChild($dom->createElement('sexo', self::sexo($vacinacao->paciente->cidadao->sexo->id)));
$vacinacoes->appendChild($dom->createElement('localAtendimento', $vacinacao->local_atendimento_id));
$vacinacoes->appendChild($dom->createElement('viajante', $vacinacao->viajante ? 'true' : 'false'));
if (self::handleComunicanteHanseniase($vacinacao)) {
$vacinacoes->appendChild($dom->createElement('comunicanteHanseniase', $vacinacao->hanseniase ? 'true' : 'false'));
}
$vacinacoes->appendChild($dom->createElement('gestante', $vacinacao->gestante ? 'true' : 'false'));
$vacinacoes->appendChild($dom->createElement('puerpera', $vacinacao->puerpera ? 'true' : 'false'));
$pacienteItem = PacienteItem::where('vacinacao_paciente_id', $vacinacao->id)->get();
foreach ($pacienteItem as $item) {
$vacinas = $dom->createElement('vacinas');
$vacinacoes->appendChild($vacinas);
$vacinas->appendChild($dom->createElement('imunobiologico', $item->vacina->codigo));
if($item->estrategia_id) {
$vacinas->appendChild($dom->createElement('estrategiaVacinacao', self::getEstrategia($item->estrategia_id)));
}
$vacinas->appendChild($dom->createElement('dose', $item->dose->codigo_esus));
if ($item->entrada && $item->entrada->lote) {
$vacinas->appendChild($dom->createElement('lote', str_replace(' ', '', $item->entrada->lote) ?? ''));
}
if ($item->produtor){
$vacinas->appendChild($dom->createElement('fabricante', $item->produtor ? htmlspecialchars($item->produtor->nome) : ''));
}
if (!$item->registro_anterior && $item->grupo && $item->grupo->codigo_esus) {
$vacinas->appendChild($dom->createElement('grupoAtendimento', $item->grupo->codigo_esus ?? ''));
}
$vacinas->appendChild($dom->createElement('stRegistroAnterior', $item->registro_anterior ? 'true' : 'false'));
if ($item->registro_anterior) {
$vacinas->appendChild($dom->createElement('dataRegistroAnterior', strtotime($item->data) * 1000));
}
if (self::handleVacinaAplicadaExterior($item)) {
$vacinas->appendChild($dom->createElement('stAplicadoExterior', $item->aplicado_exterior ? 'true' : 'false'));
}
}
$vacinacoes->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
$vacinacoes->appendChild($dom->createElement('dataHoraFinalAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
}
return [
'ficha_vacinacao_pacientes' => $fichaVacinacaoPacientesPosicoes,
];
}
private static function getEstrategia($id) {
switch ($id) {
case Estrategia::PESQUISA:
return EstrategiaVacinacao::PESQUISA;
case Estrategia::PRE_EXPOSICAO:
return EstrategiaVacinacao::PRE_EXPOSICAO;
case Estrategia::POS_EXPOSICAO:
return EstrategiaVacinacao::POS_EXPOSICAO;
case Estrategia::REEXPOSICAO:
return EstrategiaVacinacao::REEXPOSICAO;
default:
return $id;
}
}
private static function handleVacinaAplicadaExterior($item) {
return $item->registro_anterior && in_array($item->vacina->codigo, VacinaAplicadaExterior::getConstants());
}
private static function handleComunicanteHanseniase($vacinacao) {
return PacienteItem::where('vacinacao_paciente_id', $vacinacao->id)
->whereHas('vacina', function ($query) {
$query->where('codigo', Imunobiologico::BCG);
})
->first();
}
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;
}
}

View File

@@ -0,0 +1,519 @@
<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\AtencaoBasica\VisitaDomiciliar\Desfecho as VisitaDomiciliarDesfecho;
use App\Enums\AtencaoBasica\VisitaDomiciliar\TipoImovel;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliar;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliarIvcf;
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 FichaVisitaDomiciliarService 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, $mes_ano);
for ($i = 0; $i < $iteracoes; $i++) {
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $mes_ano, true, $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, 'VD_' . $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, $mesAnoInicial, false);
for ($i = 0; $i < $iteracoes; $i++) {
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $mesAnoInicial, false);
$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,
'visitas_domiciliares' => $dadosExportacao['visitas_domiciliares'],
'xml' => [
'nome_arquivo' => 'VD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
}
return $exportacoes;
}
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
{
return VisitaDomiciliar::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([
DB::raw('DATE(data_usuario_responsavel)'),
'usuario_id',
'equipe_id',
'usuario_ocupacao_id',
])
->get();
}
private static function getIteracoesCount($fichaProfissional, $mes_ano, $somenteMesAno = true)
{
$count = VisitaDomiciliar::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));
});
})
)
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
->whereDate('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
->count();
return ceil($count / 99);
}
private static function getDadosExportacao($fichaProfissional, $mes_ano, $somenteMesAno = true, $exportacaoArquivoId = null, $usuarioId = null)
{
$visitasDomiciliaresPosicoes = 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/fichavisitadomiciliarmaster');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::VISITA_DOMICILIAR));
$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));
}
$fichaVisitaDomiciliarMasterTransport = $dom->createElement('ns4:fichaVisitaDomiciliarMasterTransport');
$dadoTransporteTransportXml->appendChild($fichaVisitaDomiciliarMasterTransport);
$fichaVisitaDomiciliarMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaVisitaDomiciliarMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$headerTransport = $dom->createElement('headerTransport');
$fichaVisitaDomiciliarMasterTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->ocupacao->codigo ));
$headerTransport->appendChild($dom->createElement('cnes', $fichaProfissional->equipe->unidade->cnes));
if($fichaProfissional->equipe->area->numero_ine){
$headerTransport->appendChild($dom->createElement('ine', $fichaProfissional->equipe->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);
$fichasVisitaDomiciliar = VisitaDomiciliar::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));
});
})
)
->where('usuario_id', $fichaProfissional->usuario_id)
->where('equipe_id', $fichaProfissional->equipe_id)
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
->whereDate('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
->take(99)
->get();
foreach ($fichasVisitaDomiciliar as $i => $fichaVisitaDomiciliar) {
$visitasDomiciliaresPosicoes->push([
'posicao' => $i + 1,
'id' => $fichaVisitaDomiciliar->id,
]);
$visitasDomiciliares = $dom->createElement('visitasDomiciliares');
$fichaVisitaDomiciliarMasterTransport->appendChild($visitasDomiciliares);
$visitasDomiciliares->appendChild($dom->createElement('turno', $fichaVisitaDomiciliar->turno_id));
$cadastroDomiciliar = null;
$foraArea = null;
if (isset($fichaVisitaDomiciliar->paciente)){
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $fichaVisitaDomiciliar->paciente->cidadao->domicilio_id)->first();
if ($cadastroDomiciliar) {
$foraArea = $cadastroDomiciliar->fora_area ? 'true' : 'false';
}
}
if (isset($fichaVisitaDomiciliar->paciente)
&& $fichaVisitaDomiciliar->paciente->prontuario
&& !in_array($fichaVisitaDomiciliar->imovel_tipo_id, [
TipoImovel::COMERCIO,
TipoImovel::TERRENO_BALDIO,
TipoImovel::PONTO_ESTRATEGICO,
TipoImovel::ESCOLA,
TipoImovel::CRECHE,
TipoImovel::ESTABELECIMENTO_RELIGIOSO
])
) {
$visitasDomiciliares->appendChild($dom->createElement('numProntuario', $fichaVisitaDomiciliar->paciente->prontuario));
}
if(isset($fichaVisitaDomiciliar->paciente->cidadao)
&& !in_array($fichaVisitaDomiciliar->imovel_tipo_id, [
TipoImovel::COMERCIO,
TipoImovel::TERRENO_BALDIO,
TipoImovel::PONTO_ESTRATEGICO,
TipoImovel::ESCOLA,
TipoImovel::CRECHE,
TipoImovel::ESTABELECIMENTO_RELIGIOSO
])
){
if (Cns::isValid($fichaVisitaDomiciliar->paciente->cidadao->cns)) {
$visitasDomiciliares->appendChild($dom->createElement('cnsCidadao', $fichaVisitaDomiciliar->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaVisitaDomiciliar->paciente->cidadao->cns)) {
$visitasDomiciliares->appendChild($dom->createElement('cpfCidadao', $fichaVisitaDomiciliar->paciente->cidadao->cpf ?? ''));
}
if ($fichaVisitaDomiciliar->paciente->cidadao->data_nascimento) {
$visitasDomiciliares->appendChild($dom->createElement('dtNascimento', strtotime($fichaVisitaDomiciliar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
}
if ($fichaVisitaDomiciliar->paciente->cidadao->sexo->id) {
$visitasDomiciliares->appendChild($dom->createElement('sexo', self::sexo($fichaVisitaDomiciliar->paciente->cidadao->sexo->id)));
}
}
if ($fichaVisitaDomiciliar->visita_compartilhada) {
$visitasDomiciliares->appendChild($dom->createElement('statusVisitaCompartilhadaOutroProfissional', $fichaVisitaDomiciliar->visita_compartilhada ? 'true' : 'false'));
}
if($fichaVisitaDomiciliar->desfecho_id == VisitaDomiciliarDesfecho::VISITA_REALIZADA){
self::getMotivoVisita($dom, $fichaVisitaDomiciliar, $visitasDomiciliares);
}
$visitasDomiciliares->appendChild($dom->createElement('desfecho', $fichaVisitaDomiciliar->desfecho->codigo_esus));
if ($cadastroDomiciliar) {
if ($foraArea == 'false' && $cadastroDomiciliar->microarea) {
$visitasDomiciliares->appendChild($dom->createElement('microArea', str_pad($cadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
}
$visitasDomiciliares->appendChild($dom->createElement('stForaArea', $foraArea));
}
$visitasDomiciliares->appendChild($dom->createElement('tipoDeImovel', $fichaVisitaDomiciliar->imovelTipo->codigo_esus));
if ($fichaVisitaDomiciliar->peso) {
$visitasDomiciliares->appendChild($dom->createElement('pesoAcompanhamentoNutricional', $fichaVisitaDomiciliar->peso));
}
if ($fichaVisitaDomiciliar->altura) {
$visitasDomiciliares->appendChild($dom->createElement('alturaAcompanhamentoNutricional', $fichaVisitaDomiciliar->altura));
}
if ($fichaVisitaDomiciliar->afericao_pa) {
$visitasDomiciliares->appendChild($dom->createElement('pressaoSistolica', substr($fichaVisitaDomiciliar->afericao_pa, 0, 3)));
}
if ($fichaVisitaDomiciliar->afericao_pa) {
$visitasDomiciliares->appendChild($dom->createElement('pressaoDiastolica', substr($fichaVisitaDomiciliar->afericao_pa, -3)));
}
if ($fichaVisitaDomiciliar->temperatura) {
$visitasDomiciliares->appendChild($dom->createElement('temperatura', $fichaVisitaDomiciliar->temperatura));
}
if ($fichaVisitaDomiciliar->glicemia) {
$visitasDomiciliares->appendChild($dom->createElement('glicemia', $fichaVisitaDomiciliar->glicemia));
}
if ($fichaVisitaDomiciliar->momento_coleta_id) {
$visitasDomiciliares->appendChild($dom->createElement('tipoGlicemia', $fichaVisitaDomiciliar->momentoColeta->codigo_esus));
}
if ($fichaVisitaDomiciliar->latitude) {
$visitasDomiciliares->appendChild($dom->createElement('latitude', $fichaVisitaDomiciliar->latitude));
}
if ($fichaVisitaDomiciliar->longitude) {
$visitasDomiciliares->appendChild($dom->createElement('longitude', $fichaVisitaDomiciliar->longitude));
}
self::getIvcf($dom, $fichaVisitaDomiciliar, $visitasDomiciliares);
$fichaVisitaDomiciliar->uuid_ficha = $uuid;
$fichaVisitaDomiciliar->exportacao_id = $exportacao->id;
$fichaVisitaDomiciliar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaVisitaDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
retry(3, function() use ($fichaVisitaDomiciliar) {
$fichaVisitaDomiciliar->save();
}, 200);
}
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
return [
'exportacao' => $exportacao,
'dom' => $dom,
'visitas_domiciliares' => $visitasDomiciliaresPosicoes,
];
}
private static function getMotivoVisita($dom, $fichaVisitaDomiciliar, $visitasDomiciliares) {
$fichaVisitaDomiciliarMotivoVisita = DB::table('atencao_basica_visita_domiciliar_motivo_visita')
->select([
'atencao_basica_cadastro_motivo_visita.codigo_esus',
])
->join(
'atencao_basica_cadastro_motivo_visita',
'atencao_basica_cadastro_motivo_visita.id',
'atencao_basica_visita_domiciliar_motivo_visita.motivo_visita_id'
)
->where('atencao_basica_visita_domiciliar_motivo_visita.visita_domiciliar_id', $fichaVisitaDomiciliar->id)
->first();
if($fichaVisitaDomiciliarMotivoVisita){
$visitasDomiciliares->appendChild($dom->createElement('motivosVisita', $fichaVisitaDomiciliarMotivoVisita->codigo_esus));
}
}
private static function sexo($sexo_id)
{
return $sexo_id
? ($sexo_id == Sexo::MASCULINO ? ExportacaoSexo::MASCULINO : ExportacaoSexo::FEMININO)
: ExportacaoSexo::IGNORADO;
}
private static function getIvcf(&$dom, $atendimento, &$visitasDomiciliares)
{
$visitaDomiciliarIvcf = VisitaDomiciliarIvcf::where('visita_domiciliar_id', $atendimento->id)->first();
if ($visitaDomiciliarIvcf) {
$pacienteIdade = $visitaDomiciliarIvcf->visitaDomiciliar->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;
$dataAtendimento = strtotime($atendimento->data_usuario_responsavel) * 1000;
$dataResultado = min(strtotime($visitaDomiciliarIvcf->updated_at) * 1000, $dataAtendimento);
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
$resultado += 1;
}
else if ($pacienteIdade >= 85) {
$resultado += 3;
}
if ($visitaDomiciliarIvcf->estado_saude_geral === 'regular_ou_ruim') {
$resultado += 1;
$hasSgPercepcaoSaude = true;
}
if ($visitaDomiciliarIvcf->limitacao_compras || $visitaDomiciliarIvcf->limitacao_gestao_financeira || $visitaDomiciliarIvcf->limitacao_tarefas_domesticas) {
$resultado += 4;
$hasSgAvdInstrumental = true;
}
if ($visitaDomiciliarIvcf->banho_independencia) {
$resultado += 6;
$hasSgAvdBasica = true;
}
if ($visitaDomiciliarIvcf->relato_esquecimento_por_terceiros) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($visitaDomiciliarIvcf->esquecimento_piorando) {
$resultado += 1;
$hasSgCognicao = true;
}
if ($visitaDomiciliarIvcf->esquecimento_impacta_atividades) {
$resultado += 2;
$hasSgCognicao = true;
}
if ($visitaDomiciliarIvcf->humor_tristeza_desanimo) {
$resultado += 2;
$hasSgHumor = true;
}
if ($visitaDomiciliarIvcf->perda_interesse_atividades) {
$resultado += 2;
$hasSgHumor = true;
}
if ($visitaDomiciliarIvcf->limitacao_elevar_bracos) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($visitaDomiciliarIvcf->limitacao_motricidade_fina) {
$resultado += 1;
$hasSgAlcancePreensaoPinca = true;
}
if ($visitaDomiciliarIvcf->perda_peso_nao_intencional || $visitaDomiciliarIvcf->imc_abaixo_22 || $visitaDomiciliarIvcf->panturrilha_abaixo_31 || $visitaDomiciliarIvcf->marcha_lenta_4m_maior_5s) {
$resultado += 2;
$hasSgCapAerobicaMuscular = true;
}
if ($visitaDomiciliarIvcf->dificuldade_caminhar_impacto_atividades) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($visitaDomiciliarIvcf->quedas_recorrentes) {
$resultado += 2;
$hasSgMarcha = true;
}
if ($visitaDomiciliarIvcf->incontinencia) {
$resultado += 2;
$hasSgContinencia = true;
}
if ($visitaDomiciliarIvcf->problema_visao_impacto_atividades) {
$resultado += 2;
$hasSgVisao = true;
}
if ($visitaDomiciliarIvcf->problema_audicao_impacto_atividades) {
$resultado += 2;
$hasSgAudicao = true;
}
if ($visitaDomiciliarIvcf->doencas_cronicas_multiplas || $visitaDomiciliarIvcf->polifarmacia_5_ou_mais_medicamentos || $visitaDomiciliarIvcf->internacao_ultimos_6_meses) {
$resultado += 4;
$hasSgComorbidade = true;
}
$ivcf = $dom->createElement('ivcf');
$visitasDomiciliares->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));
}
}
}