Files
rkm-conectasus-ci-sandbox/api/app/Services/AtencaoBasica/Exportacao/FichaAvaliacaoElegibilidadeService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

361 lines
18 KiB
PHP

<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\Avaliacao\Conclusao;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\Avaliacao\Avaliacao;
use App\Models\AtencaoBasica\Avaliacao\Justificativa;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\Sigtap\Cid;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use ZipArchive;
class FichaAvaliacaoElegibilidadeService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasAvaliacao($mes_ano) as $fichaAvaliacao) {
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao, $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, 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasAvaliacao($mesAnoInicial, false) as $fichaAvaliacao) {
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaAvaliacao->data,
'usuario_id' => $fichaAvaliacao->usuario->id,
'ocupacao_id' => $fichaAvaliacao->ocupacao->id,
'equipe_id' => $fichaAvaliacao->equipe->id,
'avaliacao_id' => $fichaAvaliacao->id,
'xml' => [
'nome_arquivo' => 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasAvaliacao($mes_ano, $somenteMesAno = true)
{
return Avaliacao::whereNull('exportacao_id')
->when($somenteMesAno,
fn ($q) => $q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', substr($mes_ano, 0, 2)),
fn ($q) => $q->where(function ($q) use ($mes_ano) {
$q->whereYear('data', '>', substr($mes_ano, 2))
->orWhere(function ($q) use ($mes_ano) {
$q->whereYear('data', substr($mes_ano, 2))
->whereMonth('data', '>=', substr($mes_ano, 0, 2));
});
})
)
->get();
}
private static function getDadosExportacao($fichaAvaliacao, $exportacaoArquivoId = null, $usuarioId = null)
{
$desconheceNomeMae = $fichaAvaliacao->paciente->cidadao->nome_mae == null ? 'true' : 'false';
$desconheceNomePai = $fichaAvaliacao->paciente->cidadao->nome_pai == null ? 'true' : 'false';
$semNumero = (isset($fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) && $fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) ? 'true' : 'false';
$telefone = $fichaAvaliacao->paciente->cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
$uuid = ExportacaoService::getUuid($fichaAvaliacao->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/fichaavaliacaoelegibilidade');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::AVALIACAO_ELEGIBILIDADE_ADMISSAO));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAvaliacao->equipe->unidade->cnes));
if($fichaAvaliacao->equipe->area->numero_ine){
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAvaliacao->equipe->area->numero_ine));
}
$fichaAvaliacaoElegibilidadeTransport = $dom->createElement('ns4:fichaAvaliacaoElegibilidadeTransport');
$dadoTransporteTransportXml->appendChild($fichaAvaliacaoElegibilidadeTransport);
$headerTransport = $dom->createElement('headerTransport');
$fichaAvaliacaoElegibilidadeTransport->appendChild($headerTransport);
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
$headerTransport->appendChild($lotacaoFormPrincipal);
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaAvaliacao->usuario->cidadao->cns ?? ''));
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaAvaliacao->ocupacao->codigo));
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaAvaliacao->equipe->unidade->cnes));
if($fichaAvaliacao->equipe->area->numero_ine){
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaAvaliacao->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAvaliacao->data) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('uuidFicha', $uuid));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('turno', $fichaAvaliacao->turno_id));
if (Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCidadao', $fichaAvaliacao->paciente->cidadao->cns ?? ''));
}
if (!Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCidadao', $fichaAvaliacao->paciente->cidadao->cpf ?? ''));
}
$racaCorEsus = $fichaAvaliacao->paciente->cidadao->racaCor && $fichaAvaliacao->paciente->cidadao->racaCor->id
? ($fichaAvaliacao->paciente->cidadao->racaCor->id != RacaCor::SEM_INFORMACAO
? $fichaAvaliacao->paciente->cidadao->racaCor->codigo_esus : NULL)
: NULL;
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dataNascimentoCidadao', strtotime($fichaAvaliacao->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('sexoCidadao', self::sexo($fichaAvaliacao->paciente->cidadao->sexo->id)));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeCidadao', $fichaAvaliacao->paciente->cidadao->nome));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('racaCorCidadao', $racaCorEsus));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeSocialCidadao', $fichaAvaliacao->paciente->cidadao->nome_social));
if ($desconheceNomeMae == 'false') {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeMaeCidadao', $fichaAvaliacao->paciente->cidadao->nome_mae));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomeMae', $desconheceNomeMae));
if ($fichaAvaliacao->paciente->cidadao->municipioNascimento && $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('codigoIbgeMunicipioNascimento', $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nacionalidadeCidadao', $fichaAvaliacao->paciente->cidadao->nacionalidade->codigo_esus));
if ($fichaAvaliacao->paciente->email !== null) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('emailCidadao', $fichaAvaliacao->paciente->email));
}
if ($fichaAvaliacao->paciente->cidadao->carteiraTrabalho &&
$fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('numeroNisPisPasep', $fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cuidadorCidadao', $fichaAvaliacao->cuidador->id));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarProcedencia', $fichaAvaliacao->procedencia->id));
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarModalidade', $fichaAvaliacao->conclusao->id));
self::getCondicoesAvaliadas($dom, $fichaAvaliacao, $fichaAvaliacaoElegibilidadeTransport);
if ($fichaAvaliacao->cid_primario) {
$cid = Cid::find($fichaAvaliacao->cid_primario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10Principal', $cid->codigo));
}
}
if($fichaAvaliacao->cid_secundario){
$cid = Cid::find($fichaAvaliacao->cid_secundario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioUm', $cid->codigo));
}
}
if ($fichaAvaliacao->cid_terciario){
$cid = Cid::find($fichaAvaliacao->cid_terciario);
if ($cid) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioDois', $cid->codigo));
}
}
if ($fichaAvaliacao->conclusao->id == Conclusao::INELEGIVEL) {
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
if ($conclusao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoInelegivel', $conclusao->justificativa->codigo));
}
} else {
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
if ($conclusao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoElegivel', $conclusao->justificativa->codigo));
}
}
$endereco = $dom->createElement('endereco');
$fichaAvaliacaoElegibilidadeTransport->appendChild($endereco);
$endereco->appendChild($dom->createElement('bairro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null));
$endereco->appendChild($dom->createElement('cep', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->cep ?? null));
$endereco->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null));
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento ?? false) {
$endereco->appendChild($dom->createElement('complemento', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento));
}
$endereco->appendChild($dom->createElement('nomeLogradouro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->nome ?? null));
if($semNumero == 'false'){
$endereco->appendChild($dom->createElement('numero', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->numero ?? null));
}
$endereco->appendChild($dom->createElement('numeroDneUf', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->codigo ?? null));
$endereco->appendChild($dom->createElement('telefoneContato', $telefone ?? null));
$endereco->appendChild($dom->createElement('tipoLogradouroNumeroDne', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->tipo->codigo ?? null));
$endereco->appendChild($dom->createElement('stSemNumero', $semNumero));
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia ?? false) {
$endereco->appendChild($dom->createElement('pontoReferencia', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia));
}
if ($desconheceNomePai == 'false') {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomePaiCidadao', $fichaAvaliacao->paciente->cidadao->nome_pai));
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomePai', $desconheceNomePai));
if ($fichaAvaliacao->paciente->cidadao->nacionalidade->id == Nacionalidade::NATURALIZADO_BRASILEIRO) {
if ($fichaAvaliacao->paciente->cidadao->data_naturalizacao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtNaturalizacao', strtotime($fichaAvaliacao->paciente->cidadao->data_naturalizacao->format('Y-m-d')) * 1000));
}
if ($fichaAvaliacao->paciente->cidadao->portaria_naturalizacao) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('portariaNaturalizacao', $fichaAvaliacao->paciente->cidadao->portaria_naturalizacao));
}
if ($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtEntradaBrasil', strtotime($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d')) * 1000));
}
}
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('paisNascimento', $fichaAvaliacao->paciente->cidadao->paisNascimento->codigo_esus));
if ($fichaAvaliacao->paciente->cidadao->racaCor->id === RacaCor::INDIGENA) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('etnia', $fichaAvaliacao->paciente->cidadao->etniaIndigena->codigo_cadsus));
}
if (Cns::isValid($fichaAvaliacao->cns_cuidador)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCuidador', $fichaAvaliacao->cns_cuidador ?? ''));
}
if (!Cns::isValid($fichaAvaliacao->cns_cuidador)) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCuidador', $fichaAvaliacao->cpf_cuidador ?? ''));
}
$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();
$fichaAvaliacao->uuid_ficha = $uuid;
$fichaAvaliacao->exportacao_id = $exportacao->id;
$fichaAvaliacao->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAvaliacao->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAvaliacao->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;
}
private static function getCondicoesAvaliadas(&$dom, $fichaAvaliacao, &$fichaAvaliacaoElegibilidadeTransport){
$condicoesAvaliadas = DB::table('atencao_basica_avaliacao_condicao')
->select([
'atencao_basica_avaliacao_condicao.condicao_id',
])
->where('atencao_basica_avaliacao_condicao.avaliacao_id', $fichaAvaliacao->id)
->get();
foreach ($condicoesAvaliadas as $condicaoAvaliada) {
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('condicoesAvaliadas', $condicaoAvaliada->condicao_id));
}
}
}