2732 lines
152 KiB
PHP
2732 lines
152 KiB
PHP
<?php
|
|
|
|
namespace App\Services\AtencaoBasica;
|
|
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
|
|
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao;
|
|
use App\Enums\AtencaoBasica\Parametrizacao\AreaTipo;
|
|
use App\Enums\AtencaoBasica\ProcedimentoPequenaCirurgia;
|
|
use App\Enums\Cadastro\SujeitoAtencao\IdentidadeGenero;
|
|
use App\Enums\Cadastro\SujeitoAtencao\Sexo as SujeitoAtencaoSexo;
|
|
use App\Enums\Cadastro\VacinaCodigo;
|
|
use App\Enums\Sigtap\Procedimento;
|
|
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
|
|
use App\Models\Cadastro\Estabelecimento\Unidade;
|
|
use App\Models\Cadastro\SujeitoAtencao\IdentidadeGenero as SujeitoAtencaoIdentidadeGenero;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Cadastro\SujeitoAtencao\Sexo;
|
|
use App\Services\Geral\AgeService;
|
|
use App\Services\Service;
|
|
use App\Utils\DataUtil;
|
|
use App\Utils\MaskUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
class RelatorioCuidadoMulherPrevencaoCancerService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
$resultadoEquipes = self::getResultadoPorEquipes($params);
|
|
$equipes = $resultadoEquipes->equipes;
|
|
$totalizadores = $resultadoEquipes->totalizadores;
|
|
$pacientes = $params->busca_ativa ? self::getResultadoPorPacientes($params) : collect();
|
|
|
|
return (object) [
|
|
'equipes' => $equipes,
|
|
'pacientes' => $pacientes,
|
|
'totalizadores' => $totalizadores,
|
|
];
|
|
}
|
|
|
|
private static function getResultadoPorEquipes(object $params)
|
|
{
|
|
$builderBoaPraticaA = DB::table('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'A' AS boa_pratica"),
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'microarea.id AS microarea_id',
|
|
'cadastro_individual.equipe_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
DB::raw("COUNT(DISTINCT (cadastro_individual.paciente_id)) AS denominador"),
|
|
DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"),
|
|
DB::raw("SUM(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_outro_exame abaioe
|
|
INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id
|
|
WHERE abaioe.atendimento_individual_id = abai.id
|
|
AND pe.codigo IN (
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "',
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "',
|
|
'" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "'
|
|
)
|
|
AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1)
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM atencao_basica_procedimento_atendimento abpa
|
|
INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id
|
|
WHERE abpa.paciente_id = paciente.id
|
|
AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR)
|
|
AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH)
|
|
AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR)
|
|
AND abp.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND (
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_pequena_cirurgia abpapc
|
|
WHERE abpapc.procedimento_atendimento_id = abpa.id
|
|
AND abpapc.pequena_cirurgia_id = " . ProcedimentoPequenaCirurgia::COLETA_DE_CITOPATOLOGICO_DE_COLO_UTERINO . "
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_procedimento abpap
|
|
INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id
|
|
WHERE abpap.procedimento_atendimento_id = abpa.id
|
|
AND p.codigo IN (
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "',
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "',
|
|
'" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "'
|
|
)
|
|
)
|
|
)
|
|
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS numerador")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 25", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 64", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
))
|
|
->groupBy([
|
|
'boa_pratica',
|
|
'unidade.nome_fantasia',
|
|
'microarea.id',
|
|
'cadastro_individual.equipe_id',
|
|
'equipe_descricao'
|
|
]);
|
|
|
|
$builderBoaPraticaB = DB::table('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'B' AS boa_pratica"),
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'microarea.id AS microarea_id',
|
|
'cadastro_individual.equipe_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
DB::raw("COUNT(DISTINCT (cadastro_individual.paciente_id)) AS denominador"),
|
|
DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"),
|
|
DB::raw("SUM(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM imunizacao_registro_aplicacao ra
|
|
INNER JOIN imunizacao_entrada_vacina ev ON ev.id = ra.entrada_vacina_id
|
|
INNER JOIN cadastro_vacina v ON v.id = ev.vacina_id
|
|
WHERE ra.paciente_id = paciente.id
|
|
AND ra.data_aplicacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR)
|
|
AND ra.data_aplicacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . "
|
|
OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . "
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM imunizacao_registro_atualizacao ra
|
|
INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id
|
|
WHERE ra.paciente_id = paciente.id
|
|
AND ra.data_atualizacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR)
|
|
AND ra.data_atualizacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . "
|
|
OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . "
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS numerador")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 14", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
))
|
|
->groupBy([
|
|
'boa_pratica',
|
|
'unidade.nome_fantasia',
|
|
'microarea.id',
|
|
'cadastro_individual.equipe_id',
|
|
'equipe_descricao'
|
|
]);
|
|
|
|
$builderBoaPraticaC = DB::table('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'C' AS boa_pratica"),
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'microarea.id AS microarea_id',
|
|
'cadastro_individual.equipe_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
DB::raw("COUNT(DISTINCT (cadastro_individual.paciente_id)) AS denominador"),
|
|
DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"),
|
|
DB::raw("SUM(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 12 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND (
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_condicao_avaliada abaica
|
|
WHERE abaica.atendimento_individual_id = abai.id
|
|
AND abaica.condicao_avaliada_id = " . CondicaoAvaliada::SAUDE_SEXUAL_E_REPRODUTIVA . "
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_rastreamento abair
|
|
WHERE abair.atendimento_individual_id = abai.id
|
|
AND abair.rastreamento_id IN (
|
|
" . Rastreamento::CANCER_COLO_UTERO . ",
|
|
" . Rastreamento::CANCER_MAMA . "
|
|
)
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_problema_condicao abaipc
|
|
LEFT JOIN geral_ciap gc ON gc.id = abaipc.ciap_id
|
|
LEFT JOIN sigtap.cid c ON c.id = abaipc.cid_id
|
|
WHERE abaipc.atendimento_individual_id = abai.id
|
|
AND (
|
|
gc.codigo IN (
|
|
'B25', 'W02', 'W10', 'W11', 'W12', 'W13', 'W14', 'W15', 'W79',
|
|
'W82', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08',
|
|
'X09', 'X10', 'X11', 'X12', 'X13', 'X23', 'X24', 'X82', 'X89', 'Y14'
|
|
)
|
|
OR c.codigo IN (
|
|
'N80', 'N800', 'N801', 'N802', 'N803', 'N804', 'N805', 'N806',
|
|
'N808', 'N809', 'N91', 'N910', 'N911', 'N912', 'N913', 'N914',
|
|
'N915', 'N92', 'N920', 'N921', 'N922', 'N923', 'N924', 'N925',
|
|
'N926', 'N93', 'N930', 'N938', 'N939', 'N94', 'N940', 'N941',
|
|
'N942', 'N943', 'N944', 'N945', 'N946', 'N948', 'N949', 'N95',
|
|
'N950', 'N951', 'N952', 'N953', 'N958', 'N959', 'N96', 'N97',
|
|
'N970', 'N971', 'N972', 'N973', 'N974', 'N978', 'N979', 'O03',
|
|
'O04', 'R102', 'T742', 'Y050', 'Y051', 'Y052', 'Y053', 'Y054',
|
|
'Y055', 'Y056', 'Y057', 'Y058', 'Y059', 'Z123', 'Z124', 'Z205',
|
|
'Z206', 'Z30', 'Z300', 'Z301', 'Z302', 'Z303', 'Z304', 'Z305',
|
|
'Z308', 'Z309', 'Z31', 'Z310', 'Z311', 'Z312', 'Z313', 'Z314',
|
|
'Z315', 'Z316', 'Z318', 'Z319', 'Z320', 'Z600', 'Z630', 'Z640',
|
|
'Z70', 'Z700', 'Z701', 'Z702', 'Z703', 'Z708', 'Z709', 'Z717', 'Z725'
|
|
)
|
|
)
|
|
)
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS numerador")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 14", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
))
|
|
->groupBy([
|
|
'boa_pratica',
|
|
'unidade.nome_fantasia',
|
|
'microarea.id',
|
|
'cadastro_individual.equipe_id',
|
|
'equipe_descricao'
|
|
]);
|
|
|
|
$builderBoaPraticaD = DB::table('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'D' AS boa_pratica"),
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'microarea.id AS microarea_id',
|
|
'cadastro_individual.equipe_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
DB::raw("COUNT(DISTINCT (cadastro_individual.paciente_id)) AS denominador"),
|
|
DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"),
|
|
DB::raw("SUM(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_outro_exame abaioe
|
|
INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id
|
|
WHERE abaioe.atendimento_individual_id = abai.id
|
|
AND pe.codigo IN (
|
|
'" . Procedimento::MAMOGRAFIA . "',
|
|
'" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "'
|
|
)
|
|
AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1)
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM atencao_basica_procedimento_atendimento abpa
|
|
INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id
|
|
WHERE abpa.paciente_id = paciente.id
|
|
AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR)
|
|
AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH)
|
|
AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abp.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_procedimento abpap
|
|
INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id
|
|
WHERE abpap.procedimento_atendimento_id = abpa.id
|
|
AND p.codigo IN (
|
|
'" . Procedimento::MAMOGRAFIA . "',
|
|
'" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "'
|
|
)
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS numerador")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 50", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
))
|
|
->groupBy([
|
|
'boa_pratica',
|
|
'unidade.nome_fantasia',
|
|
'microarea.id',
|
|
'cadastro_individual.equipe_id',
|
|
'equipe_descricao'
|
|
]);
|
|
|
|
$builder = $builderBoaPraticaA
|
|
->unionAll($builderBoaPraticaB)
|
|
->unionAll($builderBoaPraticaC)
|
|
->unionAll($builderBoaPraticaD);
|
|
|
|
self::setOrderByEquipe($builder);
|
|
|
|
$itens = $builder->get();
|
|
$equipes = collect();
|
|
|
|
$pacientesIds = [];
|
|
$microareasIds = [];
|
|
|
|
$itens->each(function ($item) use (&$pacientesIds, &$microareasIds, $equipes) {
|
|
$equipe = $equipes->where('equipe_id', $item->equipe_id)->first();
|
|
|
|
if (is_null($equipe)) {
|
|
$equipe = (object) [
|
|
'equipe_id' => $item->equipe_id,
|
|
'unidade_nome_fantasia' => $item->unidade_nome_fantasia,
|
|
'equipe_descricao' => $item->equipe_descricao,
|
|
'denominador_boa_pratica_a' => 0,
|
|
'denominador_boa_pratica_b' => 0,
|
|
'denominador_boa_pratica_c' => 0,
|
|
'denominador_boa_pratica_d' => 0,
|
|
'numerador_boa_pratica_a' => 0,
|
|
'numerador_boa_pratica_b' => 0,
|
|
'numerador_boa_pratica_c' => 0,
|
|
'numerador_boa_pratica_d' => 0,
|
|
];
|
|
|
|
$equipes->push($equipe);
|
|
}
|
|
|
|
$equipe->{'denominador_boa_pratica_' . Str::lower($item->boa_pratica)} = $item->denominador;
|
|
$equipe->{'numerador_boa_pratica_' . Str::lower($item->boa_pratica)} = $item->numerador;
|
|
|
|
$pacientesIds = array_merge($pacientesIds, explode('#', $item->pacientes));
|
|
|
|
if (!is_null($item->microarea_id)) {
|
|
$microareasIds[] = $item->microarea_id;
|
|
}
|
|
});
|
|
|
|
$equipes->each(function ($equipe) use ($params) {
|
|
$a = 0;
|
|
$b = 0;
|
|
$c = 0;
|
|
$d = 0;
|
|
$pontuacao = 0;
|
|
|
|
if (in_array('A', $params->boas_praticas)) {
|
|
$aux = $equipe->denominador_boa_pratica_a === 0
|
|
? 0 : ($equipe->numerador_boa_pratica_a / $equipe->denominador_boa_pratica_a);
|
|
|
|
$equipe->percentual_boa_pratica_a = self::round($aux * 100);
|
|
$a = $aux * 20;
|
|
|
|
if ($equipe->numerador_boa_pratica_a > 0) {
|
|
$pontuacao += 20;
|
|
}
|
|
}
|
|
|
|
if (in_array('B', $params->boas_praticas)) {
|
|
$aux = $equipe->denominador_boa_pratica_b === 0
|
|
? 0 : ($equipe->numerador_boa_pratica_b / $equipe->denominador_boa_pratica_b);
|
|
|
|
$equipe->percentual_boa_pratica_b = self::round($aux * 100);
|
|
$b = $aux * 30;
|
|
|
|
if ($equipe->numerador_boa_pratica_b > 0) {
|
|
$pontuacao += 30;
|
|
}
|
|
}
|
|
|
|
if (in_array('C', $params->boas_praticas)) {
|
|
$aux = $equipe->denominador_boa_pratica_c === 0
|
|
? 0 : ($equipe->numerador_boa_pratica_c / $equipe->denominador_boa_pratica_c);
|
|
|
|
$equipe->percentual_boa_pratica_c = self::round($aux * 100);
|
|
$c = $aux * 30;
|
|
|
|
if ($equipe->numerador_boa_pratica_c > 0) {
|
|
$pontuacao += 30;
|
|
}
|
|
}
|
|
|
|
if (in_array('D', $params->boas_praticas)) {
|
|
$aux = $equipe->denominador_boa_pratica_d === 0
|
|
? 0 : ($equipe->numerador_boa_pratica_d / $equipe->denominador_boa_pratica_d);
|
|
|
|
$equipe->percentual_boa_pratica_d = self::round($aux * 100);
|
|
$d = $aux * 20;
|
|
|
|
if ($equipe->numerador_boa_pratica_d > 0) {
|
|
$pontuacao += 20;
|
|
}
|
|
}
|
|
|
|
$equipe->resultado = self::round($a + $b + $c + $d);
|
|
|
|
$classificacao = self::getClassificacao($pontuacao);
|
|
$equipe->classificacao_resultado_ordenacao = $classificacao['ordenacao'];
|
|
$equipe->classificacao_resultado = $classificacao['texto'];
|
|
});
|
|
|
|
$columnsSortBy = collect([
|
|
'denominador_boa_pratica_a',
|
|
'denominador_boa_pratica_b',
|
|
'denominador_boa_pratica_c',
|
|
'denominador_boa_pratica_d',
|
|
'numerador_boa_pratica_a',
|
|
'numerador_boa_pratica_b',
|
|
'numerador_boa_pratica_c',
|
|
'numerador_boa_pratica_d',
|
|
'resultado',
|
|
'classificacao_resultado',
|
|
'percentual_boa_pratica_a',
|
|
'percentual_boa_pratica_b',
|
|
'percentual_boa_pratica_c',
|
|
'percentual_boa_pratica_d',
|
|
]);
|
|
|
|
if ($columnsSortBy->contains(request()->equipe_sort_by)) {
|
|
$sortBy = request()->equipe_sort_by === 'classificacao_resultado'
|
|
? 'classificacao_resultado_ordenacao'
|
|
: request()->equipe_sort_by;
|
|
|
|
$equipes = (DataUtil::getBooleanValueFromStringBoolean(request()->equipe_sort_desc)
|
|
? $equipes->sortByDesc($sortBy)
|
|
: $equipes->sortBy($sortBy)
|
|
)->values();
|
|
}
|
|
|
|
$totalPacientes = collect($pacientesIds)->unique()->count();
|
|
$totalEquipes = $equipes->count();
|
|
$totalMicroareas = collect($microareasIds)->unique()->count();
|
|
|
|
$denominadorBoaPraticaA = $equipes->sum('denominador_boa_pratica_a');
|
|
$denominadorBoaPraticaB = $equipes->sum('denominador_boa_pratica_b');
|
|
$denominadorBoaPraticaC = $equipes->sum('denominador_boa_pratica_c');
|
|
$denominadorBoaPraticaD = $equipes->sum('denominador_boa_pratica_d');
|
|
|
|
$numeradorBoaPraticaA = $equipes->sum('numerador_boa_pratica_a');
|
|
$numeradorBoaPraticaB = $equipes->sum('numerador_boa_pratica_b');
|
|
$numeradorBoaPraticaC = $equipes->sum('numerador_boa_pratica_c');
|
|
$numeradorBoaPraticaD = $equipes->sum('numerador_boa_pratica_d');
|
|
|
|
$resultado = 0;
|
|
$percentualBoaPraticaA = 0;
|
|
$percentualBoaPraticaB = 0;
|
|
$percentualBoaPraticaC = 0;
|
|
$percentualBoaPraticaD = 0;
|
|
|
|
$a = 0;
|
|
$b = 0;
|
|
$c = 0;
|
|
$d = 0;
|
|
|
|
if (in_array('A', $params->boas_praticas) && $denominadorBoaPraticaA > 0) {
|
|
$aux = $numeradorBoaPraticaA / $denominadorBoaPraticaA;
|
|
$percentualBoaPraticaA = self::round($aux * 100);
|
|
$a = $aux * 20;
|
|
}
|
|
|
|
if (in_array('B', $params->boas_praticas) && $denominadorBoaPraticaB > 0) {
|
|
$aux = $numeradorBoaPraticaB / $denominadorBoaPraticaB;
|
|
$percentualBoaPraticaB = self::round($aux * 100);
|
|
$b = $aux * 30;
|
|
}
|
|
|
|
if (in_array('C', $params->boas_praticas) && $denominadorBoaPraticaC > 0) {
|
|
$aux = $numeradorBoaPraticaC / $denominadorBoaPraticaC;
|
|
$percentualBoaPraticaC = self::round($aux * 100);
|
|
$c = $aux * 30;
|
|
}
|
|
|
|
if (in_array('D', $params->boas_praticas) && $denominadorBoaPraticaD > 0) {
|
|
$aux = $numeradorBoaPraticaD / $denominadorBoaPraticaD;
|
|
$percentualBoaPraticaD = self::round($aux * 100);
|
|
$d = $aux * 20;
|
|
}
|
|
|
|
$resultado = self::round($a + $b + $c + $d);
|
|
|
|
return (object) [
|
|
'equipes' => $equipes,
|
|
'totalizadores' => (object) [
|
|
'total_pacientes' => $totalPacientes,
|
|
'total_equipes' => $totalEquipes,
|
|
'total_microareas' => $totalMicroareas,
|
|
'denominador_boa_pratica_a' => $denominadorBoaPraticaA,
|
|
'denominador_boa_pratica_b' => $denominadorBoaPraticaB,
|
|
'denominador_boa_pratica_c' => $denominadorBoaPraticaC,
|
|
'denominador_boa_pratica_d' => $denominadorBoaPraticaD,
|
|
'numerador_boa_pratica_a' => $numeradorBoaPraticaA,
|
|
'numerador_boa_pratica_b' => $numeradorBoaPraticaB,
|
|
'numerador_boa_pratica_c' => $numeradorBoaPraticaC,
|
|
'numerador_boa_pratica_d' => $numeradorBoaPraticaD,
|
|
'resultado' => $resultado,
|
|
'percentual_boa_pratica_a' => $percentualBoaPraticaA,
|
|
'percentual_boa_pratica_b' => $percentualBoaPraticaB,
|
|
'percentual_boa_pratica_c' => $percentualBoaPraticaC,
|
|
'percentual_boa_pratica_d' => $percentualBoaPraticaD,
|
|
],
|
|
];
|
|
}
|
|
|
|
private static function getClassificacao(int $pontuacao)
|
|
{
|
|
if ($pontuacao > 75 && $pontuacao <= 100) {
|
|
return ['ordenacao' => 'otimo', 'texto' => 'Ótimo'];
|
|
}
|
|
else if ($pontuacao > 50 && $pontuacao <= 75) {
|
|
return ['ordenacao' => 'bom', 'texto' => 'Bom'];
|
|
}
|
|
else if ($pontuacao > 25 && $pontuacao <= 50) {
|
|
return ['ordenacao' => 'suficiente', 'texto' => 'Suficiente'];
|
|
}
|
|
|
|
return ['ordenacao' => 'regular', 'texto' => 'Regular'];
|
|
}
|
|
|
|
private static function setOrderByEquipe($builder)
|
|
{
|
|
$columns = [
|
|
'unidade_nome_fantasia' => 'unidade_nome_fantasia',
|
|
'equipe_descricao' => 'equipe_descricao',
|
|
];
|
|
|
|
if (is_null(request()->equipe_sort_by) || !isset($columns[request()->equipe_sort_by])) {
|
|
$builder->orderByRaw(join(', ', $columns));
|
|
return;
|
|
}
|
|
|
|
$column = $columns[request()->equipe_sort_by];
|
|
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->equipe_sort_desc) ? 'DESC' : 'ASC';
|
|
|
|
unset($columns[request()->equipe_sort_by]);
|
|
|
|
$builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns));
|
|
}
|
|
|
|
private static function getResultadoPorPacientes($params)
|
|
{
|
|
$builderBoaPraticaA = DB::table('cadastro_paciente as paciente')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', 'paciente.id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
|
|
->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j
|
|
->on('telefone.cidadao_id', 'cidadao.id')
|
|
->where('telefone.id', fn ($q) => $q
|
|
->select('telefone2.id')
|
|
->from('cadastro_cidadao_telefone AS telefone2')
|
|
->whereColumn('telefone2.cidadao_id', 'cidadao.id')
|
|
->where('telefone2.principal', true)
|
|
->limit(1)
|
|
)
|
|
)
|
|
->leftJoin('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
|
|
->leftJoin('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
|
|
->leftJoin('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id')
|
|
->leftJoin('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id')
|
|
->leftJoin('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id')
|
|
->leftJoin('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
|
|
->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', 'paciente_responsavel.paciente_id', 'paciente.id')
|
|
->leftJoin('cadastro_usuario AS usuario_responsavel', 'usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id')
|
|
->leftJoin('cadastro_cidadao AS cidadao_responsavel', 'cidadao_responsavel.id', 'usuario_responsavel.cidadao_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS cadastro_domiciliar_microarea', 'cadastro_domiciliar_microarea.id', 'cadastro_domiciliar.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS cadastro_domiciliar_area', 'cadastro_domiciliar_area.id', 'cadastro_domiciliar_microarea.area_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'cidadao.id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'A' AS boa_pratica"),
|
|
'cadastro_individual.id AS cadastro_individual_id',
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
'cidadao.nome AS paciente_nome',
|
|
'sexo.id AS sexo_id',
|
|
'sexo.descricao AS sexo_descricao',
|
|
'cidadao.identidade_genero_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_area.descricao, ''),
|
|
CASE
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL
|
|
AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_microarea.descricao, '')
|
|
) AS microarea_descricao"),
|
|
DB::raw("
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NULL
|
|
AND area_fora_area.descricao IS NULL
|
|
AND microarea_fora_area.descricao IS NULL THEN 'Não informada'
|
|
ELSE CONCAT(
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area_fora_area.descricao, ''),
|
|
CASE
|
|
WHEN microarea_fora_area.descricao IS NOT NULL
|
|
AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea_fora_area.descricao, '')
|
|
)
|
|
END AS area_microarea_domicilio
|
|
"),
|
|
'cidadao_responsavel.nome AS usuario_cadastro_nome',
|
|
'cidadao.data_nascimento',
|
|
'telefone.numero AS telefone_principal',
|
|
DB::raw("CONCAT(
|
|
logradouro_tipo.descricao,
|
|
' ',
|
|
logradouro.nome,
|
|
', ',
|
|
IF(endereco.numero IS NULL, 'S/N', endereco.numero),
|
|
' - ',
|
|
bairro.nome,
|
|
', ',
|
|
municipio.nome,
|
|
' - ',
|
|
estado.uf
|
|
) AS endereco"),
|
|
DB::raw("(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_outro_exame abaioe
|
|
INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id
|
|
WHERE abaioe.atendimento_individual_id = abai.id
|
|
AND pe.codigo IN (
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "',
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "',
|
|
'" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "'
|
|
)
|
|
AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1)
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM atencao_basica_procedimento_atendimento abpa
|
|
INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id
|
|
WHERE abpa.paciente_id = paciente.id
|
|
AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR)
|
|
AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH)
|
|
AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR)
|
|
AND abp.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND (
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_pequena_cirurgia abpapc
|
|
WHERE abpapc.procedimento_atendimento_id = abpa.id
|
|
AND abpapc.pequena_cirurgia_id = " . ProcedimentoPequenaCirurgia::COLETA_DE_CITOPATOLOGICO_DE_COLO_UTERINO . "
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_procedimento abpap
|
|
INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id
|
|
WHERE abpap.procedimento_atendimento_id = abpa.id
|
|
AND p.codigo IN (
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "',
|
|
'" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "',
|
|
'" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "',
|
|
'" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "'
|
|
)
|
|
)
|
|
)
|
|
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS has_boa_pratica")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 25", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 64", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
));
|
|
|
|
$builderBoaPraticaB = DB::table('cadastro_paciente as paciente')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', 'paciente.id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
|
|
->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j
|
|
->on('telefone.cidadao_id', 'cidadao.id')
|
|
->where('telefone.id', fn ($q) => $q
|
|
->select('telefone2.id')
|
|
->from('cadastro_cidadao_telefone AS telefone2')
|
|
->whereColumn('telefone2.cidadao_id', 'cidadao.id')
|
|
->where('telefone2.principal', true)
|
|
->limit(1)
|
|
)
|
|
)
|
|
->leftJoin('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
|
|
->leftJoin('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
|
|
->leftJoin('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id')
|
|
->leftJoin('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id')
|
|
->leftJoin('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id')
|
|
->leftJoin('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
|
|
->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', 'paciente_responsavel.paciente_id', 'paciente.id')
|
|
->leftJoin('cadastro_usuario AS usuario_responsavel', 'usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id')
|
|
->leftJoin('cadastro_cidadao AS cidadao_responsavel', 'cidadao_responsavel.id', 'usuario_responsavel.cidadao_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS cadastro_domiciliar_microarea', 'cadastro_domiciliar_microarea.id', 'cadastro_domiciliar.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS cadastro_domiciliar_area', 'cadastro_domiciliar_area.id', 'cadastro_domiciliar_microarea.area_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'cidadao.id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'B' AS boa_pratica"),
|
|
'cadastro_individual.id AS cadastro_individual_id',
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
'cidadao.nome AS paciente_nome',
|
|
'sexo.id AS sexo_id',
|
|
'sexo.descricao AS sexo_descricao',
|
|
'cidadao.identidade_genero_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_area.descricao, ''),
|
|
CASE
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL
|
|
AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_microarea.descricao, '')
|
|
) AS microarea_descricao"),
|
|
DB::raw("
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NULL
|
|
AND area_fora_area.descricao IS NULL
|
|
AND microarea_fora_area.descricao IS NULL THEN 'Não informada'
|
|
ELSE CONCAT(
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area_fora_area.descricao, ''),
|
|
CASE
|
|
WHEN microarea_fora_area.descricao IS NOT NULL
|
|
AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea_fora_area.descricao, '')
|
|
)
|
|
END AS area_microarea_domicilio
|
|
"),
|
|
'cidadao_responsavel.nome AS usuario_cadastro_nome',
|
|
'cidadao.data_nascimento',
|
|
'telefone.numero AS telefone_principal',
|
|
DB::raw("CONCAT(
|
|
logradouro_tipo.descricao,
|
|
' ',
|
|
logradouro.nome,
|
|
', ',
|
|
IF(endereco.numero IS NULL, 'S/N', endereco.numero),
|
|
' - ',
|
|
bairro.nome,
|
|
', ',
|
|
municipio.nome,
|
|
' - ',
|
|
estado.uf
|
|
) AS endereco"),
|
|
DB::raw("(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM imunizacao_registro_aplicacao ra
|
|
INNER JOIN imunizacao_entrada_vacina ev ON ev.id = ra.entrada_vacina_id
|
|
INNER JOIN cadastro_vacina v ON v.id = ev.vacina_id
|
|
WHERE ra.paciente_id = paciente.id
|
|
AND ra.data_aplicacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR)
|
|
AND ra.data_aplicacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . "
|
|
OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . "
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM imunizacao_registro_atualizacao ra
|
|
INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id
|
|
WHERE ra.paciente_id = paciente.id
|
|
AND ra.data_atualizacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR)
|
|
AND ra.data_atualizacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . "
|
|
OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . "
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS has_boa_pratica")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 14", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
));
|
|
|
|
$builderBoaPraticaC = DB::table('cadastro_paciente as paciente')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', 'paciente.id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
|
|
->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j
|
|
->on('telefone.cidadao_id', 'cidadao.id')
|
|
->where('telefone.id', fn ($q) => $q
|
|
->select('telefone2.id')
|
|
->from('cadastro_cidadao_telefone AS telefone2')
|
|
->whereColumn('telefone2.cidadao_id', 'cidadao.id')
|
|
->where('telefone2.principal', true)
|
|
->limit(1)
|
|
)
|
|
)
|
|
->leftJoin('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
|
|
->leftJoin('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
|
|
->leftJoin('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id')
|
|
->leftJoin('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id')
|
|
->leftJoin('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id')
|
|
->leftJoin('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
|
|
->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', 'paciente_responsavel.paciente_id', 'paciente.id')
|
|
->leftJoin('cadastro_usuario AS usuario_responsavel', 'usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id')
|
|
->leftJoin('cadastro_cidadao AS cidadao_responsavel', 'cidadao_responsavel.id', 'usuario_responsavel.cidadao_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS cadastro_domiciliar_microarea', 'cadastro_domiciliar_microarea.id', 'cadastro_domiciliar.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS cadastro_domiciliar_area', 'cadastro_domiciliar_area.id', 'cadastro_domiciliar_microarea.area_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'cidadao.id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'C' AS boa_pratica"),
|
|
'cadastro_individual.id AS cadastro_individual_id',
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
'cidadao.nome AS paciente_nome',
|
|
'sexo.id AS sexo_id',
|
|
'sexo.descricao AS sexo_descricao',
|
|
'cidadao.identidade_genero_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_area.descricao, ''),
|
|
CASE
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL
|
|
AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_microarea.descricao, '')
|
|
) AS microarea_descricao"),
|
|
DB::raw("
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NULL
|
|
AND area_fora_area.descricao IS NULL
|
|
AND microarea_fora_area.descricao IS NULL THEN 'Não informada'
|
|
ELSE CONCAT(
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area_fora_area.descricao, ''),
|
|
CASE
|
|
WHEN microarea_fora_area.descricao IS NOT NULL
|
|
AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea_fora_area.descricao, '')
|
|
)
|
|
END AS area_microarea_domicilio
|
|
"),
|
|
'cidadao_responsavel.nome AS usuario_cadastro_nome',
|
|
'cidadao.data_nascimento',
|
|
'telefone.numero AS telefone_principal',
|
|
DB::raw("CONCAT(
|
|
logradouro_tipo.descricao,
|
|
' ',
|
|
logradouro.nome,
|
|
', ',
|
|
IF(endereco.numero IS NULL, 'S/N', endereco.numero),
|
|
' - ',
|
|
bairro.nome,
|
|
', ',
|
|
municipio.nome,
|
|
' - ',
|
|
estado.uf
|
|
) AS endereco"),
|
|
DB::raw("(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 12 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND (
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_condicao_avaliada abaica
|
|
WHERE abaica.atendimento_individual_id = abai.id
|
|
AND abaica.condicao_avaliada_id = " . CondicaoAvaliada::SAUDE_SEXUAL_E_REPRODUTIVA . "
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_rastreamento abair
|
|
WHERE abair.atendimento_individual_id = abai.id
|
|
AND abair.rastreamento_id IN (
|
|
" . Rastreamento::CANCER_COLO_UTERO . ",
|
|
" . Rastreamento::CANCER_MAMA . "
|
|
)
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_problema_condicao abaipc
|
|
LEFT JOIN geral_ciap gc ON gc.id = abaipc.ciap_id
|
|
LEFT JOIN sigtap.cid c ON c.id = abaipc.cid_id
|
|
WHERE abaipc.atendimento_individual_id = abai.id
|
|
AND (
|
|
gc.codigo IN (
|
|
'B25', 'W02', 'W10', 'W11', 'W12', 'W13', 'W14', 'W15', 'W79',
|
|
'W82', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08',
|
|
'X09', 'X10', 'X11', 'X12', 'X13', 'X23', 'X24', 'X82', 'X89', 'Y14'
|
|
)
|
|
OR c.codigo IN (
|
|
'N80', 'N800', 'N801', 'N802', 'N803', 'N804', 'N805', 'N806',
|
|
'N808', 'N809', 'N91', 'N910', 'N911', 'N912', 'N913', 'N914',
|
|
'N915', 'N92', 'N920', 'N921', 'N922', 'N923', 'N924', 'N925',
|
|
'N926', 'N93', 'N930', 'N938', 'N939', 'N94', 'N940', 'N941',
|
|
'N942', 'N943', 'N944', 'N945', 'N946', 'N948', 'N949', 'N95',
|
|
'N950', 'N951', 'N952', 'N953', 'N958', 'N959', 'N96', 'N97',
|
|
'N970', 'N971', 'N972', 'N973', 'N974', 'N978', 'N979', 'O03',
|
|
'O04', 'R102', 'T742', 'Y050', 'Y051', 'Y052', 'Y053', 'Y054',
|
|
'Y055', 'Y056', 'Y057', 'Y058', 'Y059', 'Z123', 'Z124', 'Z205',
|
|
'Z206', 'Z30', 'Z300', 'Z301', 'Z302', 'Z303', 'Z304', 'Z305',
|
|
'Z308', 'Z309', 'Z31', 'Z310', 'Z311', 'Z312', 'Z313', 'Z314',
|
|
'Z315', 'Z316', 'Z318', 'Z319', 'Z320', 'Z600', 'Z630', 'Z640',
|
|
'Z70', 'Z700', 'Z701', 'Z702', 'Z703', 'Z708', 'Z709', 'Z717', 'Z725'
|
|
)
|
|
)
|
|
)
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS has_boa_pratica")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 14", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
));
|
|
|
|
$builderBoaPraticaD = DB::table('cadastro_paciente as paciente')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', 'paciente.id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->join('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
|
|
->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j
|
|
->on('telefone.cidadao_id', 'cidadao.id')
|
|
->where('telefone.id', fn ($q) => $q
|
|
->select('telefone2.id')
|
|
->from('cadastro_cidadao_telefone AS telefone2')
|
|
->whereColumn('telefone2.cidadao_id', 'cidadao.id')
|
|
->where('telefone2.principal', true)
|
|
->limit(1)
|
|
)
|
|
)
|
|
->leftJoin('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
|
|
->leftJoin('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
|
|
->leftJoin('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id')
|
|
->leftJoin('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id')
|
|
->leftJoin('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id')
|
|
->leftJoin('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
|
|
->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', 'paciente_responsavel.paciente_id', 'paciente.id')
|
|
->leftJoin('cadastro_usuario AS usuario_responsavel', 'usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id')
|
|
->leftJoin('cadastro_cidadao AS cidadao_responsavel', 'cidadao_responsavel.id', 'usuario_responsavel.cidadao_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS cadastro_domiciliar_microarea', 'cadastro_domiciliar_microarea.id', 'cadastro_domiciliar.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS cadastro_domiciliar_area', 'cadastro_domiciliar_area.id', 'cadastro_domiciliar_microarea.area_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'cidadao.id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
DB::raw("'D' AS boa_pratica"),
|
|
'cadastro_individual.id AS cadastro_individual_id',
|
|
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS equipe_descricao"),
|
|
'cidadao.nome AS paciente_nome',
|
|
'sexo.id AS sexo_id',
|
|
'sexo.descricao AS sexo_descricao',
|
|
'cidadao.identidade_genero_id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_area.descricao, ''),
|
|
CASE
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL
|
|
AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(cadastro_domiciliar_microarea.descricao, '')
|
|
) AS microarea_descricao"),
|
|
DB::raw("
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NULL
|
|
AND area_fora_area.descricao IS NULL
|
|
AND microarea_fora_area.descricao IS NULL THEN 'Não informada'
|
|
ELSE CONCAT(
|
|
CASE
|
|
WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area_fora_area.descricao, ''),
|
|
CASE
|
|
WHEN microarea_fora_area.descricao IS NOT NULL
|
|
AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea_fora_area.descricao, '')
|
|
)
|
|
END AS area_microarea_domicilio
|
|
"),
|
|
'cidadao_responsavel.nome AS usuario_cadastro_nome',
|
|
'cidadao.data_nascimento',
|
|
'telefone.numero AS telefone_principal',
|
|
DB::raw("CONCAT(
|
|
logradouro_tipo.descricao,
|
|
' ',
|
|
logradouro.nome,
|
|
', ',
|
|
IF(endereco.numero IS NULL, 'S/N', endereco.numero),
|
|
' - ',
|
|
bairro.nome,
|
|
', ',
|
|
municipio.nome,
|
|
' - ',
|
|
estado.uf
|
|
) AS endereco"),
|
|
DB::raw("(
|
|
IF(
|
|
(
|
|
SELECT TRUE
|
|
FROM atencao_basica_atendimento_individual abai
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id
|
|
WHERE abai.paciente_id = paciente.id
|
|
AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR)
|
|
AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH)
|
|
AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_atendimento_individual_outro_exame abaioe
|
|
INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id
|
|
WHERE abaioe.atendimento_individual_id = abai.id
|
|
AND pe.codigo IN (
|
|
'" . Procedimento::MAMOGRAFIA . "',
|
|
'" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "'
|
|
)
|
|
AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1)
|
|
)
|
|
LIMIT 1
|
|
) OR (
|
|
SELECT TRUE
|
|
FROM atencao_basica_procedimento_atendimento abpa
|
|
INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id
|
|
INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id
|
|
WHERE abpa.paciente_id = paciente.id
|
|
AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR)
|
|
AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH)
|
|
AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR)
|
|
AND abp.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}'
|
|
AND (
|
|
o.codigo LIKE '2235%'
|
|
OR o.codigo LIKE '2231%'
|
|
OR o.codigo LIKE '2251%'
|
|
OR o.codigo LIKE '2252%'
|
|
OR o.codigo LIKE '2253%'
|
|
)
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM atencao_basica_procedimento_atendimento_procedimento abpap
|
|
INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id
|
|
WHERE abpap.procedimento_atendimento_id = abpa.id
|
|
AND p.codigo IN (
|
|
'" . Procedimento::MAMOGRAFIA . "',
|
|
'" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "'
|
|
)
|
|
)
|
|
LIMIT 1
|
|
),
|
|
1,
|
|
0
|
|
)
|
|
) AS has_boa_pratica")
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 50", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id))
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
));
|
|
|
|
$builder = $builderBoaPraticaA
|
|
->unionAll($builderBoaPraticaB)
|
|
->unionAll($builderBoaPraticaC)
|
|
->unionAll($builderBoaPraticaD);
|
|
|
|
self::setOrderByPaciente($builder);
|
|
|
|
$itens = $builder->get();
|
|
$pacientes = collect();
|
|
|
|
$itens->each(function ($item) use ($pacientes) {
|
|
$paciente = $pacientes->where('cadastro_individual_id', $item->cadastro_individual_id)->first();
|
|
|
|
if (is_null($paciente)) {
|
|
$idadeAnos = AgeService::getAge(Carbon::create($item->data_nascimento)->toDate())->years;
|
|
|
|
$boaPraticaAAplica = $idadeAnos >= 25 && $idadeAnos <= 64 && (
|
|
($item->sexo_id === SujeitoAtencaoSexo::FEMININO
|
|
&& (
|
|
is_null($item->identidade_genero_id)
|
|
|| $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO
|
|
)
|
|
) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
);
|
|
|
|
$boaPraticaBAplica = $idadeAnos >= 9 && $idadeAnos <= 14 && (
|
|
($item->sexo_id === SujeitoAtencaoSexo::FEMININO
|
|
&& (
|
|
is_null($item->identidade_genero_id)
|
|
|| $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO
|
|
)
|
|
)
|
|
);
|
|
|
|
$boaPraticaCAplica = $idadeAnos >= 14 && $idadeAnos <= 69 && (
|
|
($item->sexo_id === SujeitoAtencaoSexo::FEMININO
|
|
&& (
|
|
is_null($item->identidade_genero_id)
|
|
|| $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO
|
|
)
|
|
) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
);
|
|
|
|
$boaPraticaDAplica = $idadeAnos >= 50 && $idadeAnos <= 69 && (
|
|
($item->sexo_id === SujeitoAtencaoSexo::FEMININO
|
|
&& (
|
|
is_null($item->identidade_genero_id)
|
|
|| $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO
|
|
)
|
|
) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
);
|
|
|
|
$paciente = (object) [
|
|
'cadastro_individual_id' => $item->cadastro_individual_id,
|
|
'unidade_nome_fantasia' => $item->unidade_nome_fantasia,
|
|
'equipe_descricao' => $item->equipe_descricao,
|
|
'paciente_nome' => $item->paciente_nome,
|
|
'sexo_descricao' => $item->sexo_descricao,
|
|
'microarea_descricao' => $item->microarea_descricao,
|
|
'area_microarea_domicilio' => $item->area_microarea_domicilio,
|
|
'usuario_cadastro_nome' => $item->usuario_cadastro_nome,
|
|
'data_nascimento' => $item->data_nascimento,
|
|
'telefone_principal' => $item->telefone_principal,
|
|
'endereco' => $item->endereco,
|
|
'boa_pratica_a' => false,
|
|
'boa_pratica_b' => false,
|
|
'boa_pratica_c' => false,
|
|
'boa_pratica_d' => false,
|
|
'boa_pratica_a_aplica' => $boaPraticaAAplica,
|
|
'boa_pratica_b_aplica' => $boaPraticaBAplica,
|
|
'boa_pratica_c_aplica' => $boaPraticaCAplica,
|
|
'boa_pratica_d_aplica' => $boaPraticaDAplica,
|
|
];
|
|
|
|
$pacientes->push($paciente);
|
|
}
|
|
|
|
$paciente->{'boa_pratica_' . Str::lower($item->boa_pratica)} = (bool) $item->has_boa_pratica;
|
|
});
|
|
|
|
$pacientes->each(function ($paciente) use ($params) {
|
|
$paciente->idade = $paciente->data_nascimento
|
|
? AgeService::getFormattedAge(Carbon::create($paciente->data_nascimento)->toDate())
|
|
: null;
|
|
|
|
if ($paciente->telefone_principal) {
|
|
$paciente->telefone_principal = MaskUtil::getPhoneMasked($paciente->telefone_principal);
|
|
}
|
|
|
|
$paciente->pontuacao_total = 0;
|
|
|
|
if (in_array('A', $params->boas_praticas) && $paciente->boa_pratica_a) $paciente->pontuacao_total += 20;
|
|
if (in_array('B', $params->boas_praticas) && $paciente->boa_pratica_b) $paciente->pontuacao_total += 30;
|
|
if (in_array('C', $params->boas_praticas) && $paciente->boa_pratica_c) $paciente->pontuacao_total += 30;
|
|
if (in_array('D', $params->boas_praticas) && $paciente->boa_pratica_d) $paciente->pontuacao_total += 20;
|
|
|
|
if (!$paciente->boa_pratica_a_aplica) $paciente->boa_pratica_a = true;
|
|
if (!$paciente->boa_pratica_b_aplica) $paciente->boa_pratica_b = true;
|
|
if (!$paciente->boa_pratica_c_aplica) $paciente->boa_pratica_c = true;
|
|
if (!$paciente->boa_pratica_d_aplica) $paciente->boa_pratica_d = true;
|
|
});
|
|
|
|
$pacientes = $pacientes->filter(function ($paciente) use ($params) {
|
|
foreach ($params->boas_praticas as $boaPratica) {
|
|
if (!$paciente->{'boa_pratica_' . Str::lower($boaPratica)}) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
})->values();
|
|
|
|
$columnsSortBy = collect([
|
|
'pontuacao_total'
|
|
]);
|
|
|
|
if ($columnsSortBy->contains(request()->paciente_sort_by)) {
|
|
$pacientes = (DataUtil::getBooleanValueFromStringBoolean(request()->paciente_sort_desc)
|
|
? $pacientes->sortByDesc(request()->paciente_sort_by)
|
|
: $pacientes->sortBy(request()->paciente_sort_by)
|
|
)->values();
|
|
}
|
|
|
|
return $pacientes;
|
|
}
|
|
|
|
private static function setOrderByPaciente($builder)
|
|
{
|
|
$columns = [
|
|
'unidade_nome_fantasia' => 'unidade_nome_fantasia',
|
|
'equipe_descricao' => 'equipe_descricao',
|
|
'paciente_nome' => 'paciente_nome',
|
|
'sexo_descricao' => 'sexo_descricao',
|
|
'idade' => 'data_nascimento',
|
|
'microarea_descricao' => 'microarea_descricao',
|
|
'area_microarea_domicilio' => 'area_microarea_domicilio',
|
|
'usuario_cadastro_nome' => 'usuario_cadastro_nome',
|
|
'data_nascimento' => 'data_nascimento',
|
|
'telefone_principal' => 'telefone_principal',
|
|
'endereco' => 'endereco',
|
|
];
|
|
|
|
if (is_null(request()->paciente_sort_by) || !isset($columns[request()->paciente_sort_by])) {
|
|
$builder->orderByRaw(join(', ', $columns));
|
|
return;
|
|
}
|
|
|
|
$column = $columns[request()->paciente_sort_by];
|
|
$sortDesc = DataUtil::getBooleanValueFromStringBoolean(request()->paciente_sort_desc);
|
|
|
|
if (request()->paciente_sort_by === 'idade') {
|
|
$sortDesc = !$sortDesc;
|
|
}
|
|
|
|
$direction = $sortDesc ? 'DESC' : 'ASC';
|
|
|
|
unset($columns[request()->paciente_sort_by]);
|
|
|
|
$builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns));
|
|
}
|
|
|
|
private static function round($value)
|
|
{
|
|
if (fmod($value, 1) === 0.0) {
|
|
return $value;
|
|
}
|
|
|
|
return round($value, 2);
|
|
}
|
|
|
|
public static function create()
|
|
{
|
|
$boasPraticas = self::getBoasPraticas();
|
|
|
|
return [
|
|
'additionals' => [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
],
|
|
'form' => [
|
|
'quadrimestres_anos' => self::getQuadrimestres(),
|
|
'unidades' => [],
|
|
'equipes' => [],
|
|
'boas_praticas' => $boasPraticas,
|
|
'sexos' => [],
|
|
'identidades_genero' => [],
|
|
],
|
|
'model' => [
|
|
'periodo' => ['start' => null, 'end' => null],
|
|
'quadrimestre_ano' => null,
|
|
'quadrimestre' => null,
|
|
'unidade_id' => null,
|
|
'equipe_id' => null,
|
|
'boas_praticas' => $boasPraticas->pluck('value')->toArray(),
|
|
'sexo_id' => null,
|
|
'identidade_genero_id' => null,
|
|
'idade_minima_anos' => null,
|
|
'idade_minima_meses' => null,
|
|
'idade_minima_dias' => null,
|
|
'idade_maxima_anos' => null,
|
|
'idade_maxima_meses' => null,
|
|
'idade_maxima_dias' => null,
|
|
'paciente' => null,
|
|
'busca_ativa' => false,
|
|
'fora_area' => false,
|
|
],
|
|
];
|
|
}
|
|
|
|
public static function list()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
switch (request()->listar) {
|
|
case 'unidades': {
|
|
return [
|
|
'unidades' => self::getUnidades($params),
|
|
'equipes' => self::getEquipes($params),
|
|
'sexos' => self::getSexos($params),
|
|
'identidades_genero' => self::getIdentidadesGenero($params),
|
|
];
|
|
}
|
|
case 'equipes': {
|
|
return [
|
|
'equipes' => self::getEquipes($params),
|
|
'sexos' => self::getSexos($params),
|
|
'identidades_genero' => self::getIdentidadesGenero($params),
|
|
];
|
|
}
|
|
case 'sexos': {
|
|
return [
|
|
'sexos' => self::getSexos($params),
|
|
'identidades_genero' => self::getIdentidadesGenero($params),
|
|
];
|
|
}
|
|
case 'identidades_genero': {
|
|
return [
|
|
'identidades_genero' => self::getIdentidadesGenero($params),
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function getParams()
|
|
{
|
|
$params = (object) [
|
|
'unidade_id' => request()->get('unidade_id'),
|
|
'equipe_id' => request()->get('equipe_id'),
|
|
'boas_praticas' => request()->get('boas_praticas', []),
|
|
'sexo_id' => request()->get('sexo_id'),
|
|
'identidade_genero_id' => request()->get('identidade_genero_id'),
|
|
'idade_minima_anos' => request()->get('idade_minima_anos'),
|
|
'idade_minima_meses' => request()->get('idade_minima_meses'),
|
|
'idade_minima_dias' => request()->get('idade_minima_dias'),
|
|
'idade_maxima_anos' => request()->get('idade_maxima_anos'),
|
|
'idade_maxima_meses' => request()->get('idade_maxima_meses'),
|
|
'idade_maxima_dias' => request()->get('idade_maxima_dias'),
|
|
'paciente_id' => request()->get('paciente_id'),
|
|
'busca_ativa' => DataUtil::getBooleanValueFromStringBoolean(request()->get('busca_ativa', 'false')),
|
|
'fora_area' => DataUtil::getBooleanValueFromStringBoolean(request()->get('fora_area', 'false')),
|
|
];
|
|
|
|
if (is_null(request()->get('periodo'))) {
|
|
$ano = request()->get('quadrimestre_ano');
|
|
$quadrimestre = request()->get('quadrimestre');
|
|
|
|
if ($quadrimestre == 1) {
|
|
$mesInicial = 1;
|
|
$mesFinal = 4;
|
|
}
|
|
else if ($quadrimestre == 2) {
|
|
$mesInicial = 5;
|
|
$mesFinal = 8;
|
|
}
|
|
else {
|
|
$mesInicial = 9;
|
|
$mesFinal = 12;
|
|
}
|
|
|
|
$params->periodo = [
|
|
'start' => Carbon::create($ano, $mesInicial, 1)->setTime(0, 0, 0),
|
|
'end' => Carbon::create($ano, $mesFinal)->endOfMonth()->setTime(23, 59, 59)
|
|
];
|
|
}
|
|
else {
|
|
$params->periodo = [
|
|
'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0),
|
|
'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59)
|
|
];
|
|
}
|
|
|
|
$params->has_idade_minima = !is_null($params->idade_minima_anos)
|
|
|| !is_null($params->idade_minima_meses)
|
|
|| !is_null($params->idade_minima_dias);
|
|
|
|
|
|
$params->has_idade_maxima = !is_null($params->idade_maxima_anos)
|
|
|| !is_null($params->idade_maxima_meses)
|
|
|| !is_null($params->idade_maxima_dias);
|
|
|
|
return $params;
|
|
}
|
|
|
|
private static function getQuadrimestres()
|
|
{
|
|
$anos = collect();
|
|
|
|
$anoInicial = 2020;
|
|
$anoAtual = Carbon::now()->year;
|
|
$mesAtual = Carbon::now()->month;
|
|
$ano = $anoAtual;
|
|
|
|
while ($ano >= $anoInicial) {
|
|
for ($i = 1; $i <= 3; $i++) {
|
|
$meses = null;
|
|
|
|
if ($i === 1) {
|
|
$meses = 'Janeiro - Abril';
|
|
}
|
|
else if ($i === 2) {
|
|
$meses = 'Maio - Agosto';
|
|
}
|
|
else {
|
|
$meses = 'Setembro - Dezembro';
|
|
}
|
|
|
|
if ($ano === $anoAtual && (
|
|
($i === 2 && $mesAtual <= 4)
|
|
|| ($i === 3 && $mesAtual <= 8)
|
|
)) {
|
|
continue;
|
|
}
|
|
|
|
$anoQuadrimenstre = $anos->firstWhere('value', $ano);
|
|
|
|
if (is_null($anoQuadrimenstre)) {
|
|
$anoQuadrimenstre = (object) [
|
|
'value' => $ano,
|
|
'text' => $ano,
|
|
'quadrimestres' => collect(),
|
|
];
|
|
|
|
$anos->push($anoQuadrimenstre);
|
|
}
|
|
|
|
$anoQuadrimenstre->quadrimestres->push((object) [
|
|
'value' => $i,
|
|
'text' => "{$i}º ({$meses})"
|
|
]);
|
|
}
|
|
|
|
$ano--;
|
|
}
|
|
|
|
return $anos;
|
|
}
|
|
|
|
private static function getUnidades(object $params)
|
|
{
|
|
return DB::table('cadastro_unidade AS unidade')
|
|
->select([
|
|
'unidade.id',
|
|
'unidade.nome_fantasia',
|
|
])
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->whereColumn('equipe.unidade_id', 'unidade.id')
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
)
|
|
->orderBy('unidade.nome_fantasia')
|
|
->get();
|
|
}
|
|
|
|
private static function getEquipes(object $params)
|
|
{
|
|
return DB::table('atencao_basica_parametrizacao_equipe AS equipe')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id')
|
|
->select([
|
|
'equipe.id AS id',
|
|
DB::raw("CONCAT(
|
|
CASE
|
|
WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(area.descricao, ''),
|
|
CASE
|
|
WHEN microarea.descricao IS NOT NULL
|
|
AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(microarea.descricao, '')
|
|
) AS descricao"),
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->whereColumn('cadastro_individual.equipe_id', 'equipe.id')
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
)
|
|
->orderBy('descricao')
|
|
->get();
|
|
}
|
|
|
|
private static function getBoasPraticas()
|
|
{
|
|
return collect([
|
|
(object) ['value' => 'A', 'text' => 'A - Rastreamento de câncer do colo do útero'],
|
|
(object) ['value' => 'B', 'text' => 'B - Vacina HPV'],
|
|
(object) ['value' => 'C', 'text' => 'C - Atendimento em saúde sexual e reprodutiva'],
|
|
(object) ['value' => 'D', 'text' => 'D - Rastreamento de câncer de mama'],
|
|
]);
|
|
}
|
|
|
|
private static function getSexos(object $params)
|
|
{
|
|
return DB::table('cadastro_sexo AS sexo')
|
|
->select([
|
|
'sexo.id',
|
|
'sexo.descricao',
|
|
])
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->whereColumn('cidadao.sexo_id', 'sexo.id')
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
)
|
|
->orderBy('sexo.descricao')
|
|
->get();
|
|
}
|
|
|
|
private static function getIdentidadesGenero(object $params)
|
|
{
|
|
return DB::table('cadastro_identidade_genero AS identidade_genero')
|
|
->select([
|
|
'identidade_genero.id',
|
|
'identidade_genero.descricao',
|
|
])
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('atencao_basica_cadastro_individual AS cadastro_individual')
|
|
->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->whereColumn('cidadao.identidade_genero_id', 'identidade_genero.id')
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
)
|
|
->orderBy('identidade_genero.descricao')
|
|
->get();
|
|
}
|
|
|
|
public static function autocompletePaciente()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
return DB::table('cadastro_paciente as paciente')
|
|
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
|
->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', 'paciente.id')
|
|
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id')
|
|
->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id')
|
|
->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id')
|
|
->leftJoin('cadastro_obito AS obito', fn ($j) => $j
|
|
->on('obito.cidadao_id', 'paciente.cidadao_id')
|
|
->whereNull('obito.deleted_at')
|
|
)
|
|
->select([
|
|
'paciente.id',
|
|
'cidadao.nome'
|
|
])
|
|
->whereIn('area.tipo_id', self::getTiposEquipes())
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')])
|
|
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')])
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('cadastro_individual.saida_cidadao_id')
|
|
->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO)
|
|
->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d'))
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->whereNull('obito.obito_em')
|
|
->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s'))
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO)
|
|
->where(fn ($q) => $q
|
|
->whereNull('cidadao.identidade_genero_id')
|
|
->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO)
|
|
->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO)
|
|
)
|
|
)
|
|
->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
|
|
->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id))
|
|
->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id))
|
|
->when($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id))
|
|
->when($params->has_idade_minima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada(
|
|
$params->idade_minima_anos,
|
|
$params->idade_minima_meses,
|
|
$params->idade_minima_dias
|
|
))
|
|
)
|
|
->when($params->has_idade_maxima, fn ($q) => $q
|
|
->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada(
|
|
$params->idade_maxima_anos,
|
|
$params->idade_maxima_meses,
|
|
$params->idade_maxima_dias
|
|
))
|
|
)
|
|
->when(!$params->fora_area, fn ($q) => $q
|
|
->whereNotNull('domiciliar_fora_area.id')
|
|
->where(fn ($sub) => $sub
|
|
->whereNull('domiciliar_fora_area.fora_area')
|
|
->orWhere('domiciliar_fora_area.fora_area', 0)
|
|
))
|
|
->distinct();
|
|
}
|
|
|
|
public static function getPrintExportData()
|
|
{
|
|
$data = self::index();
|
|
|
|
$data->pacientes->each(function ($paciente) {
|
|
if (!is_null($paciente->data_nascimento)) {
|
|
$paciente->data_nascimento = Carbon::create($paciente->data_nascimento)->format('d/m/Y');
|
|
}
|
|
});
|
|
|
|
$quadrimestre = '';
|
|
|
|
if (request()->quadrimestre == 1) {
|
|
$quadrimestre = "1º (Janeiro - Abril)";
|
|
}
|
|
else if (request()->quadrimestre == 2) {
|
|
$quadrimestre = "2º (Maio - Agosto)";
|
|
}
|
|
else if (request()->quadrimestre == 3) {
|
|
$quadrimestre = "3º (Setembro - Dezembro)";
|
|
}
|
|
|
|
$unidade = request()->unidade_id
|
|
? Unidade::findOrFail(request()->unidade_id)->nome_fantasia
|
|
: 'Todas';
|
|
|
|
$equipe = 'Todas';
|
|
|
|
if (request()->equipe_id) {
|
|
$equipeModel = Equipe::findOrFail(request()->equipe_id);
|
|
$equipe = '';
|
|
|
|
if (!is_null($equipeModel->area->numero_ine)) {
|
|
$equipe .= "INE: {$equipeModel->area->numero_ine}";
|
|
}
|
|
|
|
if (!is_null($equipeModel->area->descricao) && !is_null($equipeModel->area->numero_ine)) {
|
|
$equipe .= ' - Área: ';
|
|
}
|
|
else if (!is_null($equipeModel->area->descricao)) {
|
|
$equipe .= 'Área: ';
|
|
}
|
|
|
|
if (!is_null($equipeModel->area->descricao)) {
|
|
$equipe .= $equipeModel->area->descricao;
|
|
}
|
|
|
|
if (isset($equipeModel->microarea->descricao)
|
|
&& (!is_null($equipeModel->area->numero_ine) || !is_null($equipeModel->area->descricao))
|
|
) {
|
|
$equipe .= ' - Microárea: ';
|
|
}
|
|
else if (isset($equipeModel->microarea->descricao)) {
|
|
$equipe .= 'Microárea: ';
|
|
}
|
|
|
|
if (isset($equipeModel->microarea->descricao)) {
|
|
$equipe .= $equipeModel->microarea->descricao;
|
|
}
|
|
}
|
|
|
|
$boasPraticas = 'Todas';
|
|
|
|
if (count(request()->boas_praticas) === 1) {
|
|
$boasPraticas = self::getBoasPraticas()->where('value', request()->boas_praticas[0])->first()->text;
|
|
}
|
|
else if (count(request()->boas_praticas) < self::getBoasPraticas()->count()) {
|
|
$boasPraticas = count(request()->boas_praticas) . ' selecionadas';
|
|
}
|
|
|
|
$sexo = request()->sexo_id
|
|
? Sexo::findOrFail(request()->sexo_id)->descricao
|
|
: 'Todos';
|
|
|
|
$identidadeGenero = request()->identidade_genero_id
|
|
? SujeitoAtencaoIdentidadeGenero::findOrFail(request()->identidade_genero_id)->descricao
|
|
: 'Todas';
|
|
|
|
$paciente = request()->paciente_id
|
|
? Paciente::findOrFail(request()->paciente_id)->cidadao->nome
|
|
: '';
|
|
|
|
$isBuscaAtiva = DataUtil::isStringTrue(request()->busca_ativa);
|
|
$isForaArea = DataUtil::isStringTrue(request()->fora_area);
|
|
|
|
return [
|
|
'periodoDe' => request()->periodo['start'] ?? '',
|
|
'periodoAte' => request()->periodo['end'] ?? '',
|
|
'quadrimestreAno' => request()->quadrimestre_ano,
|
|
'quadrimestre' => $quadrimestre,
|
|
'unidade' => $unidade,
|
|
'equipe' => $equipe,
|
|
'boasPraticas' => $boasPraticas,
|
|
'buscaAtiva' => $isBuscaAtiva ? 'Sim' : 'Não',
|
|
'isBuscaAtiva' => $isBuscaAtiva,
|
|
'foraArea' => $isForaArea ? 'Sim' : 'Não',
|
|
'sexo' => $sexo,
|
|
'identidadeGenero' => $identidadeGenero,
|
|
'idadeMinimaAnos' => request()->idade_minima_anos,
|
|
'idadeMinimaMeses' => request()->idade_minima_meses,
|
|
'idadeMinimaDias' => request()->idade_minima_dias,
|
|
'idadeMaximaAnos' => request()->idade_maxima_anos,
|
|
'idadeMaximaMeses' => request()->idade_maxima_meses,
|
|
'idadeMaximaDias' => request()->idade_maxima_dias,
|
|
'paciente' => $paciente,
|
|
'equipes' => $data->equipes,
|
|
'pacientes' => $data->pacientes,
|
|
'totalizadores' => $data->totalizadores,
|
|
'colunasEquipes' => collect(request()->colunas_equipes),
|
|
'colunasPacientes' => collect(request()->colunas_pacientes),
|
|
'boasPraticasSelecionadas' => collect(request()->boas_praticas)
|
|
];
|
|
}
|
|
|
|
private static function getTiposEquipes()
|
|
{
|
|
return [
|
|
AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA,
|
|
AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA,
|
|
];
|
|
}
|
|
|
|
private static function getIdadeCalculada($anos = null, $meses = null, $dias = null)
|
|
{
|
|
$data = Carbon::now();
|
|
|
|
if (!is_null($anos)) {
|
|
$data->subYears($anos);
|
|
}
|
|
|
|
if (!is_null($meses)) {
|
|
$data->subMonths($meses);
|
|
}
|
|
|
|
if (!is_null($dias)) {
|
|
$data->subDays($dias);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|