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