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