446 lines
23 KiB
PHP
446 lines
23 KiB
PHP
<?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();
|
|
}
|
|
}
|