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