Files
rkm-conectasus-ci-sandbox/api/app/Services/AtencaoBasica/Exportacao/FichaAtividadeColetivaService.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

353 lines
16 KiB
PHP

<?php
namespace App\Services\AtencaoBasica\Exportacao;
use App\Enums\AtencaoBasica\AtividadeColetiva\PraticasEmSaude;
use App\Enums\AtencaoBasica\AtividadeColetiva\Pse;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeColetiva;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Rules\Cns;
use App\Services\Service;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class FichaAtividadeColetivaService extends Service
{
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
{
$mes_ano = request()->mes_ano;
foreach (self::getFichasAtividade($mes_ano) as $fichaAtividade) {
$dadosExportacao = self::getDadosExportacao($fichaAtividade, $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, 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
$zip->close();
unlink($xmlPath);
}
}
public static function gerarExportacoes($mesAnoInicial)
{
$exportacoes = collect();
foreach (self::getFichasAtividade($mesAnoInicial, false) as $fichaAtividade) {
$dadosExportacao = self::getDadosExportacao($fichaAtividade);
$exportacoes->push([
'exportacao_id' => $dadosExportacao['exportacao']->id,
'data_atendimento' => $fichaAtividade->data_usuario_responsavel,
'usuario_id' => $fichaAtividade->usuario->id,
'ocupacao_id' => $fichaAtividade->ocupacao->id,
'equipe_id' => $fichaAtividade->equipe->id,
'atividade_coletiva_id' => $fichaAtividade->id,
'atividade_coletiva_participantes' => $dadosExportacao['atividade_coletiva_participantes'],
'xml' => [
'nome_arquivo' => 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
'conteudo' => $dadosExportacao['dom']->saveXml(),
]
]);
}
return $exportacoes;
}
private static function getFichasAtividade($mes_ano, $somenteMesAno = true)
{
return AtividadeColetiva::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($fichaAtividade, $exportacaoArquivoId = null, $usuarioId = null)
{
$atividadeColetivaParticipantesPosicoes = collect();
$uuid = ExportacaoService::getUuid($fichaAtividade->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/fichaatividadecoletiva');
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATIVIDADE_COLETIVA));
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAtividade->equipe->unidade->cnes));
if ($fichaAtividade->equipe->area->numero_ine) {
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAtividade->equipe->area->numero_ine));
}
$fichaAtividadeColetivaTransport = $dom->createElement('ns4:fichaAtividadeColetivaTransport');
$dadoTransporteTransportXml->appendChild($fichaAtividadeColetivaTransport);
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('uuidFicha', $uuid));
if ($fichaAtividade->inep == null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('outraLocalidade', $fichaAtividade->local_atividade));
}
if ($fichaAtividade->inep != null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('inep', $fichaAtividade->inep));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numParticipantes', $fichaAtividade->total_participantes));
if($fichaAtividade->avaliacoes_alteradas != null){
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numAvaliacoesAlteradas', $fichaAtividade->avaliacoes_alteradas));
}
if ($fichaAtividade->pse_id == Pse::SAUDE) {
$profissionais = $dom->createElement('profissionais');
$fichaAtividadeColetivaTransport->appendChild($profissionais);
$profissionais->appendChild($dom->createElement('cnsProfissional', $fichaAtividade->usuario->cidadao->cns ?? ''));
$profissionais->appendChild($dom->createElement('codigoCbo2002', $fichaAtividade->ocupacao->codigo ?? ''));
self::getProfissionais($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('atividadeTipo', $fichaAtividade->atividadeTipo->id ?? ''));
if ($fichaAtividade->pse_id != Pse::EDUCACAO && $fichaAtividade->atividadeTipo->id <= 3) {
self::getTemasReuniao($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
}
self::getPublicoAlvo($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
foreach ($fichaAtividade->participantes as $i => $participante) {
$atividadeColetivaParticipantesPosicoes->push([
'posicao' => $i + 1,
'id' => $participante->id,
]);
$participantes = $dom->createElement('participantes');
$fichaAtividadeColetivaTransport->appendChild($participantes);
if (Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
$participantes->appendChild($dom->createElement('cnsParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cns ?? ''));
}
if (!Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
$participantes->appendChild($dom->createElement('cpfParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cpf ?? ''));
}
$participantes->appendChild($dom->createElement('dataNascimento', strtotime($participante->paciente()->withTrashed()->first()->cidadao->data_nascimento->format('Y-m-d')) * 1000));
$participantes->appendChild($dom->createElement('avaliacaoAlterada', $participante->avaliacao_alterada ? 'true' : 'false'));
if($participante->peso != null){
$participantes->appendChild($dom->createElement('peso', $participante->peso));
}
if($participante->altura != null){
$participantes->appendChild($dom->createElement('altura', $participante->altura));
}
$ids = [
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_1,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_2,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_3,
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_4
];
$existe = array_intersect( $fichaAtividade->saudePratica->all(), $ids);
if (!empty($existe)) {
$participantes->appendChild($dom->createElement('cessouHabitoFumar', $participante->parou_de_fumar ? 'true' : 'false'));
$participantes->appendChild($dom->createElement('abandonouGrupo', $participante->abandonou_grupo ? 'true' : 'false'));
}
$participantes->appendChild($dom->createElement('sexo', self::sexo($participante->paciente->cidadao->sexo->id ?? null)));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('tbCdsOrigem', '3'));
if ($fichaAtividade->inep == null && $fichaAtividade->local_atividade == null) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('cnesLocalAtividade', $fichaAtividade->cnes));
}
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('turno', $fichaAtividade->turno_id));
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseEducacao', $fichaAtividade->pse_id == Pse::EDUCACAO ? 'true' : 'false'));
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseSaude', $fichaAtividade->pse_id == Pse::SAUDE ? 'true' : 'false'));
$headerTransport = $dom->createElement('headerTransport');
$fichaAtividadeColetivaTransport->appendChild($headerTransport);
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaAtividade->usuario->cidadao->cns ?? ''));
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaAtividade->ocupacao->codigo));
$headerTransport->appendChild($dom->createElement('cnes', $fichaAtividade->equipe->unidade->cnes));
if ($fichaAtividade->equipe->area->numero_ine) {
$headerTransport->appendChild($dom->createElement('ine', $fichaAtividade->equipe->area->numero_ine));
}
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAtividade->data_usuario_responsavel) * 1000));
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
self::getTemasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
self::getPraticasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
$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();
$fichaAtividade->uuid_ficha = $uuid;
$fichaAtividade->exportacao_id = $exportacao->id;
$fichaAtividade->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
$fichaAtividade->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
$fichaAtividade->save();
return [
'exportacao' => $exportacao,
'dom' => $dom,
'atividade_coletiva_participantes' => $atividadeColetivaParticipantesPosicoes,
];
}
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 getPublicoAlvo(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$publicoAlvo = DB::table('atencao_basica_atividade_coletiva_publico_alvo')
->select([
'atencao_basica_atividade_coletiva_publico_alvo.publico_alvo_id',
])
->where('atencao_basica_atividade_coletiva_publico_alvo.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($publicoAlvo as $publico) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('publicoAlvo', $publico->publico_alvo_id));
}
}
private static function getTemasReuniao(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$temasReuniao = DB::table('atencao_basica_atividade_coletiva_reuniao_tema')
->select([
'atencao_basica_atividade_coletiva_reuniao_tema.reuniao_tema_id',
])
->where('atencao_basica_atividade_coletiva_reuniao_tema.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($temasReuniao as $tema) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaReuniao', $tema->reuniao_tema_id));
}
}
private static function getTemasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$temasSaude = DB::table('atencao_basica_atividade_coletiva_saude_tema')
->select([
'atencao_basica_atividade_coletiva_saude_tema.saude_tema_id',
])
->where('atencao_basica_atividade_coletiva_saude_tema.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($temasSaude as $tema) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaSaude', $tema->saude_tema_id));
}
}
private static function getPraticasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$praticasSaude = DB::table('atencao_basica_atividade_coletiva_saude_pratica')
->select([
'atencao_basica_atividade_coletiva_saude_pratica.saude_pratica_id',
])
->where('atencao_basica_atividade_coletiva_saude_pratica.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($praticasSaude as $pratica) {
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('praticasEmSaude', $pratica->saude_pratica_id));
}
}
private static function getProfissionais(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
$profissionais = DB::table('atencao_basica_atividade_coletiva_profissional')
->select([
'cadastro_cidadao.cns',
'sigtap.ocupacao.codigo',
])
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'atencao_basica_atividade_coletiva_profissional.usuario_ocupacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atividade_coletiva_profissional.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->where('atencao_basica_atividade_coletiva_profissional.atividade_coletiva_id', $fichaAtividade->id)
->get();
foreach ($profissionais as $profissional) {
$profissionais = $dom->createElement('profissionais');
$fichaAtividadeColetivaTransport->appendChild($profissionais);
$profissionais->appendChild($dom->createElement('cnsProfissional', $profissional->cns));
$profissionais->appendChild($dom->createElement('codigoCbo2002', $profissional->codigo));
}
}
}