init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,445 @@
<?php
namespace App\Services\AtencaoBasica;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class RelatorioEstatisticoAtendimentoService extends Service
{
public static function index() {
$dataAtual = Carbon::now()->format('d/m/Y');
$anoAtual = Carbon::now()->year;
return [
"form" => [
"competencias" => [
"anos" => [],
"meses" => []
],
"unidades" => [],
"profissionais" => [],
"locaisAtendimento" => [],
"sexos" => self::getSexos(),
"hipertensos" => self::getOptionsBoolean(),
"gestantes" => self::getOptionsBoolean(),
"diabeticos" => self::getOptionsBoolean(),
"condicoesAvaliadas" => self::getCondicoesAvaliadas(),
"doencasTransmissiveis" => self::getDoencasTransmissiveis(),
"rastreamentos" => self::getRastreamentos(),
"vacinas" => self::getOptionsBoolean(),
"aleitamentosMaterno" => self::getAleitamentosMaterno(),
],
"model" => [
"competencia" => [
"ano" => $anoAtual,
"mes" => null
],
"unidade" => null,
"profissional" => null,
"localAtendimento" => null,
"prontuario" => null,
"idadeMinima" => null,
"idadeMaxima" => null,
"sexo" => null,
"hipertenso" => null,
"gestante" => null,
"diabetico" => null,
"condicaoAvaliada" => null,
"doencaTransmissivel" => null,
"rastreamento" => null,
"vacina" => null,
"aleitamentoMaterno" => null,
'ciap2' => null,
'cid' => null,
],
"data_atual" => $dataAtual
];
}
public static function list() {
$params = request()->all();
$tipoListagem = $params['listar'];
switch ($tipoListagem) {
case 'ano':
return self::getAnosCompetencia();
case 'mes':
return self::getMesesCompetencia($params['competencia']['ano']);
case 'unidade':
return self::getUnidades($params);
case 'profissional':
return self::getProfissionais($params);
case 'localAtendimento':
return self::getLocaisAtendimento($params);
default:
return response()->json(["error" => "Informe o tipo de listagem através do listar"], Response::HTTP_NOT_ACCEPTABLE);
}
}
public static function search() {
$params = request()->all();
$ano = $params['competencia']['ano'];
$mes = $params['competencia']['mes'];
$unidade = $params['unidade'];
$prontuario = $params['prontuario'];
$idadeMinima = $params['idade_minima'];
$idadeMaxima = $params['idade_maxima'];
$sexo = $params['sexo'];
$profissional = $params['profissional'];
$hipertenso = $params['hipertenso'];
$condicaoAvaliadaParametro = $params['condicao_avaliada'];
$doencaTransmissivel = $params['doenca_transmissivel'];
$rastreamento = $params['rastreamento'];
$ciap2 = $params['ciap2'];
$cid = $params['cid'];
$diabetico = $params['diabetico'];
$gestante = $params['gestante'];
$aleitamentoMaterno = $params['aleitamento_materno'];
$localAtendimento = $params['local_atendimento'];
$vacina = $params['vacina'];
$totalizadores = [
"unidades" => [],
"profissionais" => [],
"locaisAtendimento" => [],
];
$registros = DB::table('atencao_basica_atendimento_individual')
->select(
'atencao_basica_atendimento_individual.id as atendimento_individual_id',
'atencao_basica_atendimento_individual.paciente_id as paciente_id',
DB::raw("DATE_FORMAT(atencao_basica_atendimento_individual.data_usuario_responsavel, '%d/%m/%Y') AS data"),
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cidadao_paciente.nome as paciente',
'cadastro_paciente.prontuario as prontuario',
DB::raw("DATE_FORMAT(cidadao_paciente.data_nascimento, '%d/%m/%Y') AS data_nascimento"),
'cadastro_sexo.descricao as sexo',
'cidadao_usuario.nome as profissional',
'atencao_basica_cadastro_individual.hipertensao as hipertenso',
'atencao_basica_cadastro_individual.diabetes as diabetico',
'atencao_basica_cadastro_individual.gestante as gestante',
'atencao_basica_cadastro_aleitamento_materno.descricao as aleitamento_materno',
'atencao_basica_local_atendimento.descricao as local_atendimento',
'atencao_basica_atendimento_individual.vacinacao as vacina',
DB::raw("
(
SELECT GROUP_CONCAT(c.descricao SEPARATOR '#')
FROM atencao_basica_atendimento_individual_problema_condicao pc
INNER JOIN geral_ciap c ON c.id = pc.ciap_id
WHERE pc.atendimento_individual_id = atencao_basica_atendimento_individual.id
) AS ciap
"),
DB::raw("
(
SELECT GROUP_CONCAT(c.nome SEPARATOR '#')
FROM atencao_basica_atendimento_individual_problema_condicao pc
INNER JOIN sigtap.cid c ON c.id = pc.cid_id
WHERE pc.atendimento_individual_id = atencao_basica_atendimento_individual.id
) AS cid
")
)
->whereYear('atencao_basica_atendimento_individual.data_usuario_responsavel', $ano)
->whereMonth('atencao_basica_atendimento_individual.data_usuario_responsavel', $mes)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cidadao_paciente.sexo_id', $sexo) : $q)
->where(fn($q) => isset($profissional) ? $q->where('cadastro_usuario.id', $profissional) : $q)
->where(fn($q) => isset($hipertenso) ? $q->where('atencao_basica_cadastro_individual.hipertensao', DataUtil::getBooleanValueFromStringBoolean($hipertenso)) : $q)
->where(fn($q) => isset($diabetico) ? $q->where('atencao_basica_cadastro_individual.diabetes', DataUtil::getBooleanValueFromStringBoolean($diabetico)) : $q)
->where(fn($q) => isset($gestante) ? $q->where('atencao_basica_cadastro_individual.gestante', DataUtil::getBooleanValueFromStringBoolean($gestante)) : $q)
->where(fn($q) => isset($aleitamentoMaterno) ? $q->where('atencao_basica_atendimento_individual.aleitamento_materno_id', $aleitamentoMaterno) : $q)
->where(fn($q) => isset($localAtendimento) ? $q->where('atencao_basica_atendimento_individual.local_atendimento_id', $localAtendimento) : $q)
->where(fn($q) => isset($vacina) ? $q->where('atencao_basica_atendimento_individual.vacinacao', DataUtil::getBooleanValueFromStringBoolean($vacina)) : $q)
->where(fn($q) => isset($ciap2) ?
$q->whereExists(function($query) use ($ciap2) {
$query->select(DB::raw(1))
->from('atencao_basica_atendimento_individual_problema_condicao')
->whereRaw('atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id = atencao_basica_atendimento_individual.id')
->where('atencao_basica_atendimento_individual_problema_condicao.ciap_id', $ciap2['id']);
})
: $q
)
->where(fn($q) => isset($cid) ?
$q->whereExists(function($query) use ($cid) {
$query->select(DB::raw(1))
->from('atencao_basica_atendimento_individual_problema_condicao')
->whereRaw('atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id = atencao_basica_atendimento_individual.id')
->where('atencao_basica_atendimento_individual_problema_condicao.cid_id', $cid['id']);
})
: $q
)
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_atendimento_individual.paciente_id')
->join('cadastro_cidadao as cidadao_paciente', 'cidadao_paciente.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atendimento_individual.usuario_id')
->join('cadastro_cidadao as cidadao_usuario', 'cidadao_usuario.id', 'cadastro_usuario.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cidadao_paciente.sexo_id')
->leftJoin('atencao_basica_cadastro_individual', 'atencao_basica_cadastro_individual.paciente_id', 'atencao_basica_atendimento_individual.paciente_id')
->leftJoin('atencao_basica_cadastro_aleitamento_materno', 'atencao_basica_cadastro_aleitamento_materno.id', 'atencao_basica_atendimento_individual.aleitamento_materno_id')
->join('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_atendimento_individual.local_atendimento_id')
->get();
$registros = $registros->map(function($item) use ($idadeMinima, $idadeMaxima) {
$idade = self::getIdadeCalculada($item->data_nascimento);
$item->ciap = collect(explode('#', $item->ciap))->filter();
$item->cid = collect(explode('#', $item->cid))->filter();
if (isset($idadeMinima) && ($idade->y < $idadeMinima)) {
return null;
}
if (isset($idadeMaxima) && ($idade->y > $idadeMaxima)) {
return null;
}
$item->idade = "{$idade->y} (A) {$idade->m} (M) {$idade->d} (D)";
$item->hipertenso = self::getValorBoleano($item->hipertenso);
$item->diabetico = self::getValorBoleano($item->diabetico);
$item->gestante = self::getValorBoleano($item->gestante);
$item->vacina = self::getValorBoleano($item->vacina);
$item->condicaoAvaliada = $item->ciap->merge($item->cid);
return $item;
})->filter();
$idsAtendimentoIndividual = $registros->pluck('atendimento_individual_id');
$condicoes = self::getCondicoesDoencasRastreamentosOutros($params, $idsAtendimentoIndividual,);
$registros = $registros->map(function($item) use($condicoes, $condicaoAvaliadaParametro, $doencaTransmissivel, $rastreamento, &$totalizadores) {
$condicoesFiltradas = $condicoes->where('atendimento_individual_id', $item->atendimento_individual_id);
$unidadeId = $item->unidade_id;
$exibirRegistroComCondicaoAvaliada = isset($condicaoAvaliadaParametro) ? $condicoesFiltradas->contains('condicao_avaliada_id', $condicaoAvaliadaParametro['id']) : true;
$exibirRegistroComDoencaTransmissivel = isset($doencaTransmissivel) ? $condicoesFiltradas->contains('doenca_transmissivel_id', $doencaTransmissivel['id']) : true;
$exibirRegistroComRastreamento = isset($rastreamento) ? $condicoesFiltradas->contains('rastreamento_id', $rastreamento['id']) : true;
if(in_array(false, [$exibirRegistroComCondicaoAvaliada, $exibirRegistroComDoencaTransmissivel, $exibirRegistroComRastreamento])) {
return null;
}
if (!isset($totalizadores['unidades'][$unidadeId])) {
$totalizadores['unidades'][$unidadeId] = 1;
} else {
$totalizadores['unidades'][$unidadeId]++;
}
if (!isset($totalizadores['profissionais'][$item->profissional])) {
$totalizadores['profissionais'][$item->profissional] = 1;
} else {
$totalizadores['profissionais'][$item->profissional]++;
}
if (!isset($totalizadores['locaisAtendimento'][$item->local_atendimento])) {
$totalizadores['locaisAtendimento'][$item->local_atendimento] = 1;
} else {
$totalizadores['locaisAtendimento'][$item->local_atendimento]++;
}
$item->condicaoAvaliada = $item->condicaoAvaliada->merge($condicoesFiltradas->pluck('descricao'));
$item->condicaoAvaliada = $item->condicaoAvaliada->isNotEmpty() ? $item->condicaoAvaliada->implode(', ') : '-';
return $item;
})->filter();
return [
"registros" => [...$registros],
"totalizadores" => [
"registros" => count($registros),
"unidades" => count($totalizadores["unidades"]),
"profissionais" => count($totalizadores["profissionais"]),
"locaisAtendimento" => count($totalizadores["locaisAtendimento"]),
]
];
}
private static function getSexos() {
return DB::table('cadastro_sexo')
->orderBy('descricao')
->get();
}
private static function getCondicoesDoencasRastreamentosOutros($params, $idsAtendimentoIndividual) {
$registros = collect([]);
$condicoesAvaliadas = DB::table('atencao_basica_atendimento_individual_condicao_avaliada')
->select(
'atencao_basica_atendimento_individual.id as atendimento_individual_id',
'atencao_basica_cadastro_condicao_avaliada.descricao',
'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id',
)
->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual)
->leftJoin('atencao_basica_cadastro_condicao_avaliada', 'atencao_basica_cadastro_condicao_avaliada.id', 'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id')
->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_condicao_avaliada.atendimento_individual_id')
->get();
$doencasTransmissiveis = DB::table('atencao_basica_atendimento_individual_doenca_transmissivel')
->select(
'atencao_basica_atendimento_individual.id as atendimento_individual_id',
'atencao_basica_cadastro_doenca_transmissivel.descricao',
'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id'
)
->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual)
->leftJoin('atencao_basica_cadastro_doenca_transmissivel', 'atencao_basica_cadastro_doenca_transmissivel.id', 'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id')
->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_doenca_transmissivel.atendimento_individual_id')
->get();
$rastreamentos = DB::table('atencao_basica_atendimento_individual_rastreamento')
->select(
'atencao_basica_atendimento_individual.id as atendimento_individual_id',
'atencao_basica_cadastro_rastreamento.descricao',
'atencao_basica_atendimento_individual_rastreamento.rastreamento_id'
)
->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual)
->leftJoin('atencao_basica_cadastro_rastreamento', 'atencao_basica_cadastro_rastreamento.id', 'atencao_basica_atendimento_individual_rastreamento.rastreamento_id')
->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_rastreamento.atendimento_individual_id')
->get();
$registros->push(...$condicoesAvaliadas, ...$doencasTransmissiveis, ...$rastreamentos);
return $registros;
}
private static function getIdadeCalculada($dataNascimento) {
$dataNascimento = Carbon::createFromFormat('d/m/Y', $dataNascimento);
$dataAtual = Carbon::now();
return $dataAtual->diff($dataNascimento);
}
private static function getValorBoleano($valor) {
if(!isset($valor)) {
return '-';
}
return $valor ? 'Sim' : 'Não';
}
private static function getOptionsBoolean() {
return [
[
"descricao" => "Sim",
"valor" => true,
],
[
"descricao" => "Não",
"valor" => false,
],
];
}
private static function getCondicoesAvaliadas() {
return DB::table('atencao_basica_cadastro_condicao_avaliada')
->orderBy('descricao')
->get();
}
private static function getDoencasTransmissiveis() {
return DB::table('atencao_basica_cadastro_doenca_transmissivel')
->orderBy('descricao')
->get();
}
private static function getRastreamentos() {
return DB::table('atencao_basica_cadastro_rastreamento')
->orderBy('descricao')
->get();
}
private static function getAleitamentosMaterno() {
return DB::table('atencao_basica_cadastro_aleitamento_materno')
->orderBy('descricao')
->get();
}
private static function getAnosCompetencia() {
$anosAtendimento = DB::table('atencao_basica_atendimento_individual')
->selectRaw('YEAR(data_usuario_responsavel) as ano')
->distinct('ano')
->pluck('ano')
->filter();
return $anosAtendimento;
}
private static function getMesesCompetencia($ano) {
$meses = [];
$registros = DB::table('atencao_basica_atendimento_individual')
->selectRaw('MONTH(data_usuario_responsavel) as mes')
->whereYear('data_usuario_responsavel', $ano)
->distinct('mes')
->pluck('mes')
->filter();
foreach ($registros as $mes) {
$meses[] = $mes;
}
return $meses;
}
private static function getUnidades($params) {
return DB::table('atencao_basica_atendimento_individual')
->select(
'cadastro_unidade.id as id',
'cadastro_unidade.nome_fantasia as descricao'
)
->whereYear('data_usuario_responsavel', $params['competencia']['ano'])
->whereMonth('data_usuario_responsavel', $params['competencia']['mes'])
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->distinct('cadastro_unidade.id')
->orderBy('descricao')
->get();
}
private static function getProfissionais($params) {
$unidade = $params['unidade'];
return DB::table('atencao_basica_atendimento_individual')
->select(
'atencao_basica_atendimento_individual.usuario_id as id',
'cadastro_cidadao.nome as descricao'
)
->whereYear('data_usuario_responsavel', $params['competencia']['ano'])
->whereMonth('data_usuario_responsavel', $params['competencia']['mes'])
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atendimento_individual.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->groupBy('id')
->orderBy('descricao')
->get();
}
private static function getLocaisAtendimento($params) {
$unidade = $params['unidade'];
$profissional = $params['profissional'];
return DB::table('atencao_basica_atendimento_individual')
->select(
'atencao_basica_atendimento_individual.local_atendimento_id as id',
'atencao_basica_local_atendimento.descricao as descricao',
)
->whereYear('data_usuario_responsavel', $params['competencia']['ano'])
->whereMonth('data_usuario_responsavel', $params['competencia']['mes'])
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($profissional) ? $q->where('usuario_id', $profissional) : $q)
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->join('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_atendimento_individual.local_atendimento_id')
->groupBy('id')
->orderBy('descricao')
->get();
}
}