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

1180 lines
54 KiB
PHP

<?php
namespace App\Services\AtencaoBasica;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\CondicaoAvaliada;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\CondutaDesfecho;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\Modalidade;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\PerfilEpidemiologico;
use App\Enums\AtencaoBasica\AtendimentoIndividual\LocalAtendimento;
use App\Enums\AtencaoBasica\Avaliacao\Conclusao;
use App\Enums\AtencaoBasica\Avaliacao\JustificativaConclusao;
use App\Enums\AtencaoBasica\Avaliacao\Procedencia;
use App\Enums\Sigtap\Ocupacao;
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioIndicadorSadService extends Service
{
public static function index()
{
$params = self::getParams();
return [
'levantamento_quantitativo' => self::getLevantamentoQuantitativoData($params),
'admissao' => self::getAdmissaoData($params),
'pacientes_em_atendimento' => self::getPacientesEmAtendimentoData($params),
'servicoes_origem' => self::getServicoesOrigemData($params),
'media_permanencia' => self::getMediaPermanenciaData($params),
'alta' => self::getAltaData($params),
'visitas' => self::getVisitasData($params),
'perfil_epidemiologico' => self::getPerfilEpidemiologicoData($params),
'atendimentos_por_categoria' => self::getAtendimentosPorCategoriaData($params),
'dados_epidemiologicos_gerais' => self::getDadosEpidemiologicosGeraisData($params),
];
}
private static function getLevantamentoQuantitativoData($params)
{
$get = function ($ano, $mes) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $ano)
->whereMonth('atendimento_domiciliar.data', $mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$periodoAnterior = Carbon::create($params->ano, $params->mes)->subMonth();
return [
'titulo' => 'Levantamento quantitativo',
'itens' => [
[
'descricao' => 'Nº de pacientes total em atendimento no período anterior',
'quantidade' => $get($periodoAnterior->format('Y'), $periodoAnterior->format('m'))
],
[
'descricao' => 'Nº de pacientes total em atendimento no período vigente',
'quantidade' => $get($params->ano, $params->mes)
],
],
'rodape' => 'Obs.: Quantidade = contagem de pacientes em atendimento no período anterior e contagem de pacientes '
. 'em atendimento no período vigente',
];
}
private static function getAdmissaoData($params)
{
$get = function ($conclusaoId) use ($params) {
return DB::table('atencao_basica_avaliacao AS avaliacao')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'avaliacao.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('avaliacao.data', $params->ano)
->whereMonth('avaliacao.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('avaliacao.equipe_id', $id))
->where('avaliacao.conclusao_id', $conclusaoId)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_avaliacao_justificativa AS justificativa')
->whereColumn('justificativa.avaliacao_id', 'avaliacao.id')
->where('justificativa.justificativa_id', JustificativaConclusao::ADMISSAO_NA_PROPRIA_EMAD)
)
->selectRaw('COUNT(DISTINCT avaliacao.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeAd1 = $get(Conclusao::ELEGIVEL_AD1);
$quantidadeAd2 = $get(Conclusao::ELEGIVEL_AD2);
$quantidadeAd3 = $get(Conclusao::ELEGIVEL_AD3);
$quantidadeGeral = $quantidadeAd1 + $quantidadeAd2 + $quantidadeAd3;
return [
'titulo' => 'Admissão',
'itens' => [
[
'descricao' => 'Total de pacientes admitidos no período',
'quantidade' => $quantidadeGeral,
'percentual' => self::getPercentual($quantidadeGeral, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes classificados em AD1 admitidos no período',
'quantidade' => $quantidadeAd1,
'percentual' => self::getPercentual($quantidadeAd1, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes classificados em AD2 admitidos no período',
'quantidade' => $quantidadeAd2,
'percentual' => self::getPercentual($quantidadeAd2, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes classificados em AD3 admitidos no período',
'quantidade' => $quantidadeAd3,
'percentual' => self::getPercentual($quantidadeAd3, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por modalidade = (Nº de pacientes classificados na modalidade AD1 ou AD2 ou AD3 x 100) ÷ '
. '(Total de pacientes admitidos no período)'
];
}
private static function getPacientesEmAtendimentoData($params)
{
$get = function ($modalidadeId) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->where('atendimento.modalidade_id', $modalidadeId)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeAd1 = $get(Modalidade::AD_1);
$quantidadeAd2 = $get(Modalidade::AD_2);
$quantidadeAd3 = $get(Modalidade::AD_3);
$quantidadeGeral = $quantidadeAd1 + $quantidadeAd2 + $quantidadeAd3;
return [
'titulo' => 'Pacientes em atendimento',
'itens' => [
[
'descricao' => 'Total de pacientes AD1',
'quantidade' => $quantidadeAd1,
'percentual' => self::getPercentual($quantidadeAd1, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes AD2',
'quantidade' => $quantidadeAd2,
'percentual' => self::getPercentual($quantidadeAd2, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes AD3',
'quantidade' => $quantidadeAd3,
'percentual' => self::getPercentual($quantidadeAd3, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por modalidade = (Nº de pacientes na modalidade AD1 ou AD2 ou AD3 x 100) ÷ '
. '(Total de pacientes em atendimento no período)'
];
}
private static function getServicoesOrigemData($params)
{
$get = function ($procedenciaId = null, $outrasProcedencias = false) use ($params) {
return DB::table('atencao_basica_avaliacao AS avaliacao')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'avaliacao.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('avaliacao.data', $params->ano)
->whereMonth('avaliacao.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('avaliacao.equipe_id', $id))
->when($outrasProcedencias,
fn ($q) => $q->whereNotIn('avaliacao.procedencia_id', [
Procedencia::ATENCAO_BASICA,
Procedencia::INTERNACAO_HOSPITALAR,
Procedencia::URGENCIA_E_EMERGENCIA,
]),
fn ($q) => $q->where('avaliacao.procedencia_id', $procedenciaId)
)
->selectRaw('COUNT(DISTINCT avaliacao.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeAtencaoBasica = $get(Procedencia::ATENCAO_BASICA);
$quantidadeHospitais = $get(Procedencia::INTERNACAO_HOSPITALAR);
$quantidadeUrgenciaEmergencia = $get(Procedencia::URGENCIA_E_EMERGENCIA);
$quantidadeOutras = $get(null, true);
$quantidadeGeral = $quantidadeAtencaoBasica
+ $quantidadeHospitais
+ $quantidadeUrgenciaEmergencia
+ $quantidadeOutras;
return [
'titulo' => 'Serviços de origem',
'itens' => [
[
'descricao' => 'Total de pacientes admitidos no período na atenção básica',
'quantidade' => $quantidadeAtencaoBasica,
'percentual' => self::getPercentual($quantidadeAtencaoBasica, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes admitidos no período provenientes de hospitais',
'quantidade' => $quantidadeHospitais,
'percentual' => self::getPercentual($quantidadeHospitais, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes admitidos no período provenientes de urgência/emergência',
'quantidade' => $quantidadeUrgenciaEmergencia,
'percentual' => self::getPercentual($quantidadeUrgenciaEmergencia, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes admitidos no período de outras demandas',
'quantidade' => $quantidadeOutras,
'percentual' => self::getPercentual($quantidadeOutras, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por origem = (Nº de pacientes admitidos por origem x 100) ÷ '
. '(Total de pacientes admitidos no SAD no período)'
];
}
private static function getMediaPermanenciaData($params)
{
$datasPermanencia = [];
$totalDiasPermanencia = 0;
$pacientesComAlta = collect();
DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->whereIn('atendimento.conduta_desfecho_id', [
CondutaDesfecho::PERMANENCIA,
CondutaDesfecho::ALTA_ADMINISTRATIVA,
CondutaDesfecho::ALTA_CLINICA,
CondutaDesfecho::OBITO,
])
->select(
'atendimento.paciente_id',
'atendimento_domiciliar.data',
'atendimento.conduta_desfecho_id',
)
->orderBy('atendimento_domiciliar.data')
->get()
->each(function ($atendimento) use (&$datasPermanencia, &$totalDiasPermanencia, $pacientesComAlta) {
if ($atendimento->conduta_desfecho_id === CondutaDesfecho::PERMANENCIA) {
if (!isset($datasPermanencia[$atendimento->paciente_id])) {
$datasPermanencia[$atendimento->paciente_id] = $atendimento->data;
}
}
else {
if (!$pacientesComAlta->contains($atendimento->paciente_id)) {
$pacientesComAlta->push($atendimento->paciente_id);
}
if (isset($datasPermanencia[$atendimento->paciente_id])) {
$totalDiasPermanencia += Carbon::create($datasPermanencia[$atendimento->paciente_id])
->diff(Carbon::create($atendimento->data))
->days;
unset($datasPermanencia[$atendimento->paciente_id]);
}
}
});
return [
'titulo' => 'Média de Permanência',
'itens' => [
[
'descricao' => 'Total de dias de permanência dos pacientes que tiveram alta do SAD no período',
'quantidade' => $totalDiasPermanencia,
],
[
'descricao' => 'Total de pacientes que tiveram alta do SAD no período',
'quantidade' => $pacientesComAlta->count(),
],
],
'rodape' => null
];
}
private static function getAltaData($params)
{
$get = function ($condutaDesfechoId) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->where('atendimento.conduta_desfecho_id', $condutaDesfechoId)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeAtencaoBasicaAd1 = $get(CondutaDesfecho::ATENCAO_BASICA_AD1);
$quantidadeAltaClinica = $get(CondutaDesfecho::ALTA_CLINICA);
$quantidadeAltaAdministrativa = $get(CondutaDesfecho::ALTA_ADMINISTRATIVA);
$quantidadeServicoInternacaoHospitalar = $get(CondutaDesfecho::SERVICO_DE_INTERNACAO_HOSPITALAR);
$quantidadeObito = $get(CondutaDesfecho::OBITO);
$quantidadeGeral = $quantidadeAtencaoBasicaAd1
+ $quantidadeAltaClinica
+ $quantidadeAltaAdministrativa
+ $quantidadeServicoInternacaoHospitalar
+ $quantidadeObito;
return [
'titulo' => 'Alta',
'itens' => [
[
'descricao' => 'Total de pacientes que tiveram alta do SAD no período',
'quantidade' => $quantidadeGeral,
'percentual' => self::getPercentual($quantidadeGeral, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes com desfecho de encaminhamento para AD1',
'quantidade' => $quantidadeAtencaoBasicaAd1,
'percentual' => self::getPercentual($quantidadeAtencaoBasicaAd1, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes com desfecho de alta clínica',
'quantidade' => $quantidadeAltaClinica,
'percentual' => self::getPercentual($quantidadeAltaClinica, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes com desfecho de alta administrativa',
'quantidade' => $quantidadeAltaAdministrativa,
'percentual' => self::getPercentual($quantidadeAltaAdministrativa, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes com desfecho de alta por internação hospitalar',
'quantidade' => $quantidadeServicoInternacaoHospitalar,
'percentual' => self::getPercentual($quantidadeServicoInternacaoHospitalar, $quantidadeGeral),
],
[
'descricao' => 'Total de pacientes com desfecho de óbito',
'quantidade' => $quantidadeObito,
'percentual' => self::getPercentual($quantidadeObito, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por desfecho = (Nº de pacientes com alta naquele desfecho x 100) ÷ '
. '(Total de pacientes que tiveram alta no período)'
];
}
private static function getVisitasData($params)
{
$quantidadeVisitas = DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->where('atendimento.local_atendimento_id', LocalAtendimento::DOMICILIO)
->count();
return [
'titulo' => 'Visitas',
'itens' => [
[
'descricao' => 'Total de número de visitas realizadas pelo SAD no período',
'quantidade' => $quantidadeVisitas,
],
],
'rodape' => null
];
}
private static function getPerfilEpidemiologicoData($params)
{
$get = function ($perfilEpidemiologicoId) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar_aten_perfil_epidemiologico AS atendimento_perfil')
->whereColumn('atendimento_perfil.atendimento_domiciliar_atendimento_id', 'atendimento.id')
->where('atendimento_perfil.perfil_epidemiologico_id', $perfilEpidemiologicoId)
)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeSistemaNeurologico = $get(PerfilEpidemiologico::SISTEMA_NEUROLOGICO);
$quantidadeSistemaCardiologico = $get(PerfilEpidemiologico::SISTEMA_CARDIOLOGICO);
$quantidadeSistemaRespiratorio = $get(PerfilEpidemiologico::SISTEMA_RESPIRATORIO);
$quantidadeSistemaOsteoMioArticular = $get(PerfilEpidemiologico::SISTEMA_OSTEO_MIO_ARTICULAR);
$quantidadeSistemaEndocrino = $get(PerfilEpidemiologico::SISTEMA_ENDOCRINO);
$quantidadeSistemaTegumentar = $get(PerfilEpidemiologico::SISTEMA_TEGUMENTAR);
$quantidadeSistemaGeniturinario = $get(PerfilEpidemiologico::SISTEMA_GENITURINARIO);
$quantidadeOutros = $get(PerfilEpidemiologico::OUTROS);
$quantidadeGeral = $quantidadeSistemaNeurologico
+ $quantidadeSistemaCardiologico
+ $quantidadeSistemaRespiratorio
+ $quantidadeSistemaOsteoMioArticular
+ $quantidadeSistemaEndocrino
+ $quantidadeSistemaTegumentar
+ $quantidadeSistemaGeniturinario
+ $quantidadeOutros;
return [
'titulo' => 'Perfil epidemiológico',
'itens' => [
[
'descricao' => 'Sistema neurológico',
'quantidade' => $quantidadeSistemaNeurologico,
'percentual' => self::getPercentual($quantidadeSistemaNeurologico, $quantidadeGeral),
],
[
'descricao' => 'Sistema cardiológico',
'quantidade' => $quantidadeSistemaCardiologico,
'percentual' => self::getPercentual($quantidadeSistemaCardiologico, $quantidadeGeral),
],
[
'descricao' => 'Sistema respiratório',
'quantidade' => $quantidadeSistemaRespiratorio,
'percentual' => self::getPercentual($quantidadeSistemaRespiratorio, $quantidadeGeral),
],
[
'descricao' => 'Sistema osteo-mio-articular',
'quantidade' => $quantidadeSistemaOsteoMioArticular,
'percentual' => self::getPercentual($quantidadeSistemaOsteoMioArticular, $quantidadeGeral),
],
[
'descricao' => 'Sistema endócrino',
'quantidade' => $quantidadeSistemaEndocrino,
'percentual' => self::getPercentual($quantidadeSistemaEndocrino, $quantidadeGeral),
],
[
'descricao' => 'Sistema tegumentar',
'quantidade' => $quantidadeSistemaTegumentar,
'percentual' => self::getPercentual($quantidadeSistemaTegumentar, $quantidadeGeral),
],
[
'descricao' => 'Sistema geniturinário',
'quantidade' => $quantidadeSistemaGeniturinario,
'percentual' => self::getPercentual($quantidadeSistemaGeniturinario, $quantidadeGeral),
],
[
'descricao' => 'Outros',
'quantidade' => $quantidadeOutros,
'percentual' => self::getPercentual($quantidadeOutros, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por sistema = (Somatório de pacientes marcados naquele sistema no período x 100) ÷ '
. '(Nº de pacientes admitidos no período no SAD)'
];
}
private static function getAtendimentosPorCategoriaData($params)
{
$get = function ($ocupacoesCodigos) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'atendimento_domiciliar.ocupacao_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->whereIn('ocupacao.codigo', $ocupacoesCodigos)
->count();
};
$quantidadeMedica = $get(self::getCbosCategoriaMedica());
$quantidadeEnfermagem = $get(self::getCbosCategoriaEnfermagem());
$quantidadeFisioterapia = $get(self::getCbosCategoriaFisioterapia());
$quantidadeNutricao = $get(self::getCbosCategoriaNutricao());
$quantidadeFonoaudiologia = $get(self::getCbosCategoriaFonoaudiologia());
$quantidadePsicologia = $get(self::getCbosCategoriaPsicologia());
$quantidadeAssistenciaSocial = $get(self::getCbosCategoriaAssistenciaSocial());
$quantidadeGeral = $quantidadeMedica
+ $quantidadeEnfermagem
+ $quantidadeFisioterapia
+ $quantidadeNutricao
+ $quantidadeFonoaudiologia
+ $quantidadePsicologia
+ $quantidadeAssistenciaSocial;
return [
'titulo' => 'Atendimentos por categoria',
'itens' => [
[
'descricao' => 'Médica',
'quantidade' => $quantidadeMedica,
'percentual' => self::getPercentual($quantidadeMedica, $quantidadeGeral),
],
[
'descricao' => 'Enfermagem',
'quantidade' => $quantidadeEnfermagem,
'percentual' => self::getPercentual($quantidadeEnfermagem, $quantidadeGeral),
],
[
'descricao' => 'Fisioterapia',
'quantidade' => $quantidadeFisioterapia,
'percentual' => self::getPercentual($quantidadeFisioterapia, $quantidadeGeral),
],
[
'descricao' => 'Nutrição',
'quantidade' => $quantidadeNutricao,
'percentual' => self::getPercentual($quantidadeNutricao, $quantidadeGeral),
],
[
'descricao' => 'Fonoaudiologia',
'quantidade' => $quantidadeFonoaudiologia,
'percentual' => self::getPercentual($quantidadeFonoaudiologia, $quantidadeGeral),
],
[
'descricao' => 'Psicologia',
'quantidade' => $quantidadePsicologia,
'percentual' => self::getPercentual($quantidadePsicologia, $quantidadeGeral),
],
[
'descricao' => 'Assistência social',
'quantidade' => $quantidadeAssistenciaSocial,
'percentual' => self::getPercentual($quantidadeAssistenciaSocial, $quantidadeGeral),
],
],
'rodape' => 'Obs.: % por categoria = (Nº de atendimentos realizados pela categoria x 100) ÷ '
. '(Nº de atendimentos total no período)'
];
}
private static function getCbosCategoriaMedica()
{
return [
Ocupacao::MEDICO_ACUPUNTURISTA,
Ocupacao::MEDICO_ANGIOLOGISTA,
Ocupacao::MEDICO_ANTROPOSOFICO,
Ocupacao::MEDICO_CARDIOLOGISTA,
Ocupacao::MEDICO_CIRURGIAO_CARDIOVASCULAR,
Ocupacao::MEDICO_CIRURGIAO_GERAL,
Ocupacao::MEDICO_CIRURGIAO_PEDIATRICO,
Ocupacao::MEDICO_CLINICO,
Ocupacao::MEDICO_DA_ESTRATEGIA_DE_SAUDE_DA_FAMILIA,
Ocupacao::MEDICO_DE_FAMILIA_E_COMUNIDADE,
Ocupacao::MEDICO_DERMATOLOGISTA,
Ocupacao::MEDICO_DO_TRABALHO,
Ocupacao::MEDICO_EM_CIRURGIA_VASCULAR,
Ocupacao::MEDICO_EM_MEDICINA_INTENSIVA,
Ocupacao::MEDICO_EM_MEDICINA_PREVENTIVA_E_SOCIAL,
Ocupacao::MEDICO_EM_RADIOLOGIA_E_DIAGNOSTICO_POR_IMAGEM,
Ocupacao::MEDICO_ENDOCRINOLOGISTA_E_METABOLOGISTA,
Ocupacao::MEDICO_FISIATRA,
Ocupacao::MEDICO_GASTROENTEROLOGISTA,
Ocupacao::MEDICO_GENERALISTA,
Ocupacao::MEDICO_GERIATRA,
Ocupacao::MEDICO_GINECOLOGISTA_E_OBSTETRA,
Ocupacao::MEDICO_HANSENOLOGISTA,
Ocupacao::MEDICO_HOMEOPATA,
Ocupacao::MEDICO_INFECTOLOGISTA,
Ocupacao::MEDICO_MASTOLOGISTA,
Ocupacao::MEDICO_NEUROCIRURGIAO,
Ocupacao::MEDICO_NEUROFISIOLOGISTA_CLINICO,
Ocupacao::MEDICO_NEFROLOGISTA,
Ocupacao::MEDICO_NEUROLOGISTA,
Ocupacao::MEDICO_OFTALMOLOGISTA,
Ocupacao::MEDICO_ORTOPEDISTA_E_TRAUMATOLOGISTA,
Ocupacao::MEDICO_OTORRINOLARINGOLOGISTA,
Ocupacao::MEDICO_PEDIATRA,
Ocupacao::MEDICO_PNEUMOLOGISTA,
Ocupacao::MEDICO_PSIQUIATRA,
Ocupacao::MEDICO_REUMATOLOGISTA,
Ocupacao::MEDICO_RESIDENTE,
Ocupacao::MEDICO_SANITARISTA,
Ocupacao::MEDICO_UROLOGISTA,
];
}
private static function getCbosCategoriaEnfermagem()
{
return [
Ocupacao::ENFERMEIRO,
Ocupacao::ENFERMEIRO_AUDITOR,
Ocupacao::ENFERMEIRO_DA_ESTRATEGIA_DE_SAUDE_DA_FAMILIA,
Ocupacao::ENFERMEIRO_DO_TRABALHO,
Ocupacao::ENFERMEIRO_OBSTETRICO,
Ocupacao::ENFERMEIRO_PSIQUIATRICO,
Ocupacao::ENFERMEIRO_PUERICULTOR_E_PEDIATRICO,
Ocupacao::ENFERMEIRO_SANITARISTA,
];
}
private static function getCbosCategoriaFisioterapia()
{
return [
Ocupacao::FISIOTERAPEUTA_ACUPUNTURISTA,
Ocupacao::FISIOTERAPEUTA_DO_TRABALHO,
Ocupacao::FISIOTERAPEUTA_ESPORTIVO,
Ocupacao::FISIOTERAPEUTA_GERAL,
Ocupacao::FISIOTERAPEUTA_NEUROFUNCIONAL,
Ocupacao::FISIOTERAPEUTA_TRAUMATOORTOPEDICA_FUNCIONAL,
];
}
private static function getCbosCategoriaNutricao()
{
return [
Ocupacao::NUTRICIONISTA,
];
}
private static function getCbosCategoriaFonoaudiologia()
{
return [
Ocupacao::FONOAUDIOLOGO,
Ocupacao::FONOAUDIOLOGO_EDUCACIONAL,
Ocupacao::FONOAUDIOLOGO_EM_LINGUAGEM,
Ocupacao::FONOAUDIOLOGO_EM_SAUDE_COLETIVA,
];
}
private static function getCbosCategoriaPsicologia()
{
return [
Ocupacao::PSICOLOGO_ACUPUNTURISTA,
Ocupacao::PSICOLOGO_CLINICO,
Ocupacao::PSICOLOGO_DO_TRABALHO,
Ocupacao::PSICOLOGO_EDUCACIONAL,
Ocupacao::PSICOLOGO_HOSPITALAR,
Ocupacao::PSICOLOGO_JURIDICO,
Ocupacao::PSICOLOGO_SOCIAL,
];
}
private static function getCbosCategoriaAssistenciaSocial()
{
return [
Ocupacao::ASSISTENTE_SOCIAL,
];
}
private static function getDadosEpidemiologicosGeraisData($params)
{
$get = function ($perfilEpidemiologicoId) use ($params) {
return DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar_aten_perfil_epidemiologico AS atendimento_perfil')
->whereColumn('atendimento_perfil.atendimento_domiciliar_atendimento_id', 'atendimento.id')
->where('atendimento_perfil.perfil_epidemiologico_id', $perfilEpidemiologicoId)
)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
};
$quantidadeOxigenoterapiaDomiciliar = DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar_condicao AS atendimento_condicao')
->whereColumn('atendimento_condicao.atendimento_id', 'atendimento.id')
->where('atendimento_condicao.condicao_id', CondicaoAvaliada::OXIGENOTERAPIA_DOMICILIAR)
)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
$quantidadeInternacaoHospitalar = DB::table('atencao_basica_atendimento_domiciliar_atendimento AS atendimento')
->join(
'atencao_basica_atendimento_domiciliar AS atendimento_domiciliar',
'atendimento_domiciliar.id',
'atendimento.atendimento_domiciliar_id'
)
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'atendimento_domiciliar.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereYear('atendimento_domiciliar.data', $params->ano)
->whereMonth('atendimento_domiciliar.data', $params->mes)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_domiciliar.equipe_id', $id))
->where('atendimento.conduta_desfecho_id', CondutaDesfecho::SERVICO_DE_INTERNACAO_HOSPITALAR)
->selectRaw('COUNT(DISTINCT atendimento.paciente_id) AS quantidade')
->first()->quantidade ?? 0;
$quantidadeFazendoUsoDietasEspeciais = $get(PerfilEpidemiologico::USO_DE_DIETAS_ESPECIAIS);
$quantidadeFazendoUsoEspessante = $get(PerfilEpidemiologico::USO_DE_ESPESSANTE);
$quantidadeSeEntregaMaterial = $get(PerfilEpidemiologico::ENTREGA_DE_MATERIAIS);
$quantidadeApenasSeEntregaMateriais = $get(PerfilEpidemiologico::ENTREGA_DE_MATERIAIS);
$quantidadeAvaliacaoProcesso = $get(PerfilEpidemiologico::AVALIACAO_DE_PROCESSO);
$quantidadeAdquiriramInfecaoDomiciliar = $get(PerfilEpidemiologico::ADQUIRIU_INFECCAO_DOMICILIAR);
$quantidadeAreaRisco = $get(PerfilEpidemiologico::RESIDENTE_EM_AREA_DE_RISCO);
return [
'titulo' => 'Dados epidemiológicos gerais',
'itens' => [
[
'descricao' => 'Nº de pacientes fazendo uso de dietas especiais',
'quantidade' => $quantidadeFazendoUsoDietasEspeciais,
],
[
'descricao' => 'Nº de pacientes fazendo uso de espessante',
'quantidade' => $quantidadeFazendoUsoEspessante,
],
[
'descricao' => 'Nº de pacientes aos quais se entrega material',
'quantidade' => $quantidadeSeEntregaMaterial,
],
[
'descricao' => 'Nº de pacientes aos quais apenas se entrega materiais',
'quantidade' => $quantidadeApenasSeEntregaMateriais,
],
[
'descricao' => 'Nº de pacientes de avaliação de processo',
'quantidade' => $quantidadeAvaliacaoProcesso,
],
[
'descricao' => 'Nº de pacientes de oxigenoterapia domiciliar',
'quantidade' => $quantidadeOxigenoterapiaDomiciliar,
],
[
'descricao' => 'Nº de internação hospitalar',
'quantidade' => $quantidadeInternacaoHospitalar,
],
[
'descricao' => 'Nº de pacientes que adquiriram infecção domiciliar',
'quantidade' => $quantidadeAdquiriramInfecaoDomiciliar,
],
[
'descricao' => 'Nº de pacientes residentes em área de risco',
'quantidade' => $quantidadeAreaRisco,
],
],
'rodape' => 'Obs.: Quantidade = contagem total de marcações por item no período'
];
}
private static function getPercentual($quantidade, $quantidadeGeral)
{
if ($quantidadeGeral === 0) {
return 0;
}
$percentual = ($quantidade * 100) / $quantidadeGeral;
if (is_int($percentual)) {
return $percentual;
}
$percentualTruncado = floor($percentual * 10) / 10;
if (fmod($percentualTruncado, 1) == 0) {
return (int) $percentualTruncado;
}
return number_format($percentualTruncado, 1, ',', '.');
}
public static function list()
{
$data = (object) [
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'ano' => function () use ($data, $params) {
$anosData = self::getAnosData();
$data->form['anos'] = $anosData['form'];
$data->model['ano'] = $anosData['model'];
$params->ano = $data->model['ano'];
},
'mes' => function () use ($data, $params) {
$mesesData = self::getMesesData($params);
$data->form['meses'] = $mesesData['form'];
$data->model['mes'] = $mesesData['model'];
$params->mes = $data->model['mes'];
},
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $unidadesData['model'];
$params->unidade_id = $data->model['unidade_id'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
$params->infraestrutura_id = $data->model['infraestrutura_id'];
},
'equipe' => function () use ($data, $params) {
$equipesData = self::getEquipesData($params);
$data->form['equipes'] = $equipesData['form'];
$data->model['equipe_id'] = $equipesData['model'];
$params->equipe_id = $data->model['equipe_id'];
},
];
$load = is_null(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
return (object) request()->only([
'ano',
'mes',
'unidade_id',
'infraestrutura_id',
'equipe_id',
]);
}
private static function getAnosData()
{
$anos = DB::table('atencao_basica_atendimento_domiciliar AS atendimento_domiciliar')
->select(
DB::raw('EXTRACT(YEAR FROM atendimento_domiciliar.data) AS ano')
)
->distinct()
->union(DB::table('atencao_basica_avaliacao AS avaliacao')
->select(
DB::raw('EXTRACT(YEAR FROM avaliacao.data) AS ano')
)
->distinct()
)
->orderByDesc('ano')
->get()
->map(fn ($a) => (object) ['value' => $a->ano, 'text' => $a->ano]);
return ['form' => $anos, 'model' => null];
}
private static function getMesesData($params)
{
$meses = collect();
if (!is_null($params->ano)) {
$meses = DB::table('atencao_basica_atendimento_domiciliar AS atendimento_domiciliar')
->whereRaw('EXTRACT(YEAR FROM atendimento_domiciliar.data) = ?', [$params->ano])
->select(
DB::raw('EXTRACT(MONTH FROM atendimento_domiciliar.data) AS mes')
)
->distinct()
->union(DB::table('atencao_basica_avaliacao AS avaliacao')
->whereRaw('EXTRACT(YEAR FROM avaliacao.data) = ?', [$params->ano])
->select(
DB::raw('EXTRACT(MONTH FROM avaliacao.data) AS mes')
)
->distinct()
)
->orderBy('mes')
->get()
->map(fn ($mes) => (object) [
'value' => $mes->mes,
'text' => Str::ucfirst(Carbon::create()->month((int) $mes->mes)->translatedFormat('F')),
]);
}
return ['form' => $meses, 'model' => null];
}
private static function getUnidadesData($params)
{
$unidades = collect();
if (!is_null($params->mes)) {
$unidades = DB::table('cadastro_unidade AS unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_infraestrutura AS infraestrutura')
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
->whereNull('infraestrutura.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_parametrizacao_equipe AS equipe')
->whereColumn('equipe.infraestrutura_id', 'infraestrutura.id')
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar AS atendimento_domiciliar')
->whereColumn('atendimento_domiciliar.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM atendimento_domiciliar.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM atendimento_domiciliar.data) = ?', [$params->mes])
)
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_avaliacao AS avaliacao')
->whereColumn('avaliacao.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM avaliacao.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM avaliacao.data) = ?', [$params->mes])
)
)
)
)
->select(
'unidade.id',
'unidade.nome_fantasia'
)
->orderBy('unidade.nome_fantasia')
->get();
}
return ['form' => $unidades, 'model' => null];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
if (!is_null($params->unidade_id)) {
$infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->whereNull('unidade.deleted_at')
->where('infraestrutura.unidade_id', $params->unidade_id)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_parametrizacao_equipe AS equipe')
->whereColumn('equipe.infraestrutura_id', 'infraestrutura.id')
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar AS atendimento_domiciliar')
->whereColumn('atendimento_domiciliar.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM atendimento_domiciliar.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM atendimento_domiciliar.data) = ?', [$params->mes])
)
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_avaliacao AS avaliacao')
->whereColumn('avaliacao.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM avaliacao.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM avaliacao.data) = ?', [$params->mes])
)
)
)
->select(
'infraestrutura.id',
DB::raw('COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome')
)
->orderByRaw('COALESCE(infraestrutura.nome, unidade.nome_fantasia)')
->get();
}
return ['form' => $infraestruturas, 'model' => null];
}
private static function getEquipesData($params)
{
$equipes = collect();
if (!is_null($params->infraestrutura_id)) {
$equipes = DB::table('atencao_basica_parametrizacao_equipe AS equipe')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $params->unidade_id)
->where('equipe.infraestrutura_id', $params->infraestrutura_id)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_atendimento_domiciliar AS atendimento_domiciliar')
->whereColumn('atendimento_domiciliar.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM atendimento_domiciliar.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM atendimento_domiciliar.data) = ?', [$params->mes])
)
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_avaliacao AS avaliacao')
->whereColumn('avaliacao.equipe_id', 'equipe.id')
->whereRaw('EXTRACT(YEAR FROM avaliacao.data) = ?', [$params->ano])
->whereRaw('EXTRACT(MONTH FROM avaliacao.data) = ?', [$params->mes])
)
)
->select(
'equipe.id',
DB::raw("CONCAT(
IF(area.numero_ine IS NULL, '', CONCAT('INE: ', area.numero_ine)),
IF(area.descricao IS NULL, '', CONCAT(' - Área: ', area.descricao)),
IF(microarea.descricao IS NULL, '', CONCAT(' - Microárea: ', microarea.descricao))
) AS descricao")
)
->orderByRaw('descricao')
->get();
$equipes->each(function ($equipe) {
$equipe->descricao = trim(trim($equipe->descricao), '-');
});
}
return ['form' => $equipes, 'model' => null];
}
public static function getPrintExportData()
{
$resultado = self::index();
$params = self::getParams();
$unidade = is_null($params->unidade_id) ? null : Unidade::find($params->unidade_id);
$infraestrutura = is_null($params->infraestrutura_id) ? null : Infraestrutura::find($params->infraestrutura_id);
$equipe = is_null($params->equipe_id) ? null : Equipe::find($params->equipe_id);
return [
'ano' => $params->ano,
'mes' => Str::ucfirst(Carbon::create()->month((int) $params->mes)->translatedFormat('F')),
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'equipe' => is_null($equipe) ? 'Todas' : self::getDescricaoEquipe($equipe),
'resultado' => $resultado,
];
}
private static function getDescricaoEquipe($equipe)
{
$descricao = '';
if (!empty($equipe->area->numero_ine)) {
$descricao .= "INE: {$equipe->area->numero_ine}";
}
if (!empty($equipe->area->descricao)) {
$descricao .= " - Área: {$equipe->area->descricao}";
}
if (!empty($equipe->microarea->descricao)) {
$descricao .= " - Microárea: {$equipe->microarea->descricao}";
}
return trim(trim($descricao), '-');
}
}