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