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