Files
rkm-conectasus-ci-sandbox/api/app/Services/Cadastro/RelatorioPacienteBairroService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

854 lines
40 KiB
PHP

<?php
namespace App\Services\Cadastro;
use App\Enums\Cadastro\SujeitoAtencao\Classificacao;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Intranet\Sistema;
use App\Models\AtencaoBasica\Parametrizacao\Area;
use App\Models\AtencaoBasica\Parametrizacao\Microarea;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Localizacao\Bairro;
use App\Models\Cadastro\Localizacao\Logradouro;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\PacienteClassificacao;
use App\Models\Intranet\Cliente;
use App\Models\Intranet\Municipio;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Illuminate\Support\Facades\DB;
class RelatorioPacienteBairroService extends Service
{
public static function index()
{
$itens = collect();
$totalizadores = (object) [];
$params = self::getParams();
if ($params->modelo_resultado === 'sintetico') {
$totalizadores = (object) [
'total_pacientes' => 0,
'total_sexo_masculino' => 0,
'total_sexo_feminino' => 0,
'total_sexo_indeterminado' => 0,
'total_idade_zero_doze' => 0,
'total_idade_treze_dezessete' => 0,
'total_idade_dezoito_cinquenta_nove' => 0,
'total_idade_sessenta_setenta_nove' => 0,
'total_idade_oitenta_mais' => 0,
];
$itensBuilder = DB::table('cadastro_bairro AS bairro')
->join('cadastro_logradouro AS logradouro', 'logradouro.bairro_id', 'bairro.id')
->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id')
->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereNull('bairro.deleted_at')
->whereNull('logradouro.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id))
->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->when($params->fora_area,
fn ($q) => $q->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id')
->where('cadastro_domiciliar.fora_area', true)
)
->orWhereNotExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id')
)
),
fn ($q) => $q->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->join(
'atencao_basica_parametrizacao_microarea AS microarea',
'microarea.id',
'cadastro_domiciliar.microarea_id'
)
->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id')
->when($params->area_id, fn ($q, $id) => $q->where('microarea.area_id', $id))
->when($params->microarea_id, fn ($q, $id) => $q->where('cadastro_domiciliar.microarea_id', $id))
)
->when(is_null($params->area_id) && is_null($params->microarea_id), fn ($q) => $q
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id')
->where('cadastro_domiciliar.fora_area', true)
)
->orWhereNotExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id')
)
)
)
)
->select(
'bairro.nome AS bairro_nome',
DB::raw("COUNT(*) AS total_pacientes"),
DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::MASCULINO . ", 1, 0)) AS total_sexo_masculino"),
DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::FEMININO . ", 1, 0)) AS total_sexo_feminino"),
DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::INDETERMINADO . ", 1, 0)) AS total_sexo_indeterminado"),
DB::raw("SUM(
IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 0
AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 12,
1, 0)
) AS total_idade_zero_doze"),
DB::raw("SUM(
IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 13
AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 17,
1, 0)
) AS total_idade_treze_dezessete"),
DB::raw("SUM(
IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 18
AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 59,
1, 0)
) AS total_idade_dezoito_cinquenta_nove"),
DB::raw("SUM(
IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 60
AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 79,
1, 0)
) AS total_idade_sessenta_setenta_nove"),
DB::raw("SUM(
IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 80, 1, 0)
) AS total_idade_oitenta_mais")
)
->groupBy(
'bairro.nome'
);
self::setOrderBy($params->modelo_resultado, $itensBuilder);
$itens = $itensBuilder->get();
$itens->each(function ($item) use ($totalizadores) {
$totalizadores->total_pacientes += $item->total_pacientes;
$totalizadores->total_sexo_masculino += $item->total_sexo_masculino;
$totalizadores->total_sexo_feminino += $item->total_sexo_feminino;
$totalizadores->total_sexo_indeterminado += $item->total_sexo_indeterminado;
$totalizadores->total_idade_zero_doze += $item->total_idade_zero_doze;
$totalizadores->total_idade_treze_dezessete += $item->total_idade_treze_dezessete;
$totalizadores->total_idade_dezoito_cinquenta_nove += $item->total_idade_dezoito_cinquenta_nove;
$totalizadores->total_idade_sessenta_setenta_nove += $item->total_idade_sessenta_setenta_nove;
$totalizadores->total_idade_oitenta_mais += $item->total_idade_oitenta_mais;
});
}
else {
$itensBuilder = DB::table('cadastro_paciente AS paciente')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
->join('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
->join('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id')
->join('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id')
->join('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id')
->join('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j
->on('telefone.cidadao_id', 'cidadao.id')
->where('telefone.id', fn ($q) => $q
->selectRaw('telefone2.id')
->from('cadastro_cidadao_telefone AS telefone2')
->whereColumn('telefone2.cidadao_id', 'cidadao.id')
->whereNull('telefone2.deleted_at')
->where('telefone2.principal', true)
->limit(1)
)
)
->leftJoin(
'atencao_basica_cadastro_domiciliar AS cadastro_domiciliar',
'cadastro_domiciliar.domicilio_id',
'domicilio.id'
)
->leftJoin(
'atencao_basica_parametrizacao_microarea AS microarea',
'microarea.id',
'cadastro_domiciliar.microarea_id'
)
->leftJoin(
'atencao_basica_parametrizacao_area AS area',
'area.id',
'microarea.area_id'
)
->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', fn ($j) => $j
->on('paciente_responsavel.paciente_id', 'paciente.id')
->whereNull('paciente_responsavel.deleted_at')
)
->leftJoin('cadastro_usuario AS usuario_responsavel', fn ($j) => $j
->on('usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id')
->whereNull('usuario_responsavel.deleted_at')
)
->leftJoin('cadastro_cidadao AS usuario_responsavel_cidadao', fn ($j) => $j
->on('usuario_responsavel_cidadao.id', 'usuario_responsavel.cidadao_id')
->whereNull('usuario_responsavel_cidadao.deleted_at')
)
->whereNull('paciente.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('logradouro.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id))
->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->when($params->fora_area,
fn ($q) => $q->where(fn ($q) => $q
->where(fn ($q) => $q
->whereNotNull('cadastro_domiciliar.id')
->where('cadastro_domiciliar.fora_area', true)
)
->orWhereNull('cadastro_domiciliar.id')
),
fn ($q) => $q->where(fn ($q) => $q
->where(fn ($q) => $q
->whereNotNull('cadastro_domiciliar.id')
->when($params->area_id, fn ($q, $id) => $q->where('microarea.area_id', $id))
->when($params->microarea_id, fn ($q, $id) => $q->where('cadastro_domiciliar.microarea_id', $id))
)
->when(is_null($params->area_id) && is_null($params->microarea_id), fn ($q) => $q
->orWhere(fn ($q) => $q
->where(fn ($q) => $q
->whereNotNull('cadastro_domiciliar.id')
->where('cadastro_domiciliar.fora_area', true)
)
->orWhereNull('cadastro_domiciliar.id')
)
)
)
)
->select(
DB::raw("LPAD(paciente.prontuario, 7, 0) AS paciente_prontuario"),
'cidadao.cns AS paciente_cns',
'cidadao.cpf AS paciente_cpf',
'cidadao.nome AS paciente_nome',
DB::raw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) AS paciente_idade"),
'sexo.descricao AS sexo_descricao',
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"),
'telefone.numero AS telefone_numero',
'area.descricao AS area',
'microarea.descricao AS microarea',
'usuario_responsavel_cidadao.nome AS usuario_responsavel_nome'
);
self::setOrderBy($params->modelo_resultado, $itensBuilder);
$itens = $itensBuilder->get();
$itens->each(function ($item) {
$item->paciente_cns = MaskUtil::getCnsMasked($item->paciente_cns);
$item->paciente_cpf = MaskUtil::getCpfMasked($item->paciente_cpf);
$item->telefone_numero = MaskUtil::getPhoneMasked($item->telefone_numero);
});
}
return compact('itens', 'totalizadores');
}
private static function setOrderBy($modeloResultado, $builder)
{
$columns = $modeloResultado === 'sintetico' ? [
'bairro_nome' => 'bairro.nome',
'total_pacientes' => 'total_pacientes',
'total_sexo_masculino' => 'total_sexo_masculino',
'total_sexo_feminino' => 'total_sexo_feminino',
'total_sexo_indeterminado' => 'total_sexo_indeterminado',
'total_idade_zero_doze' => 'total_idade_zero_doze',
'total_idade_treze_dezessete' => 'total_idade_treze_dezessete',
'total_idade_dezoito_cinquenta_nove' => 'total_idade_dezoito_cinquenta_nove',
'total_idade_sessenta_setenta_nove' => 'total_idade_sessenta_setenta_nove',
'total_idade_oitenta_mais' => 'total_idade_oitenta_mais',
] : [
'paciente_prontuario' => 'paciente.prontuario',
'paciente_cns' => 'cidadao.cns',
'paciente_cpf' => 'cidadao.cpf',
'paciente_nome' => 'cidadao.nome',
'paciente_idade' => 'paciente_idade',
'sexo_descricao' => 'sexo.descricao',
'endereco' => 'endereco',
'telefone_numero' => 'telefone.numero',
'area' => 'area.descricao',
'microarea' => 'microarea.descricao',
'usuario_responsavel_nome' => 'usuario_responsavel_cidadao.nome',
];
if (is_null(request()->sortBy)) {
$builder->orderByRaw(join(', ', $columns));
return;
}
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
unset($columns[request()->sortBy]);
$builder->orderByRaw(
"{$column} {$direction}, " . join(', ', $columns)
);
}
public static function list()
{
$data = (object) [
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'modelo_resultado' => function () use ($data, $params) {
$modelosResultadoData = self::getModelosResultadoData();
$data->form['modelos_resultado'] = $modelosResultadoData['form'];
$data->model['modelo_resultado'] = $modelosResultadoData['model'];
$params->modelo_resultado = $data->model['modelo_resultado'];
},
'classificacao' => function () use ($data, $params) {
$classificacoesData = self::getClassificacoesData();
$data->form['classificacoes'] = $classificacoesData['form'];
$data->model['classificacao_id'] = $classificacoesData['model'];
$params->classificacao_id = $data->model['classificacao_id'];
},
'municipio' => function () use ($data, $params) {
$municipiosData = self::getMunicipiosData($params);
$data->form['municipios'] = $municipiosData['form'];
$data->model['municipio_id'] = $municipiosData['model'];
$params->municipio_id = $data->model['municipio_id'];
},
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $unidadesData['model'];
$params->unidade_id = $data->model['unidade_id'];
},
'bairro' => function () use ($data, $params) {
$bairrosData = self::getBairrosData($params);
$data->form['bairros'] = $bairrosData['form'];
$data->model['bairro_id'] = $bairrosData['model'];
$params->bairro_id = $data->model['bairro_id'];
},
'tipo_logradouro' => function () use ($data, $params) {
$tiposLogradouroData = self::getTiposLogradouroData($params);
$data->form['tipos_logradouro'] = $tiposLogradouroData['form'];
$data->model['tipo_logradouro_id'] = $tiposLogradouroData['model'];
$params->tipo_logradouro_id = $data->model['tipo_logradouro_id'];
},
'logradouro' => function () use ($data, $params) {
$data->model['logradouro'] = null;
$params->logradouro_id = null;
},
'paciente' => function () use ($data, $params) {
$data->model['paciente'] = null;
$params->paciente_id = null;
},
'fora_area' => function () use ($data, $params) {
$data->model['fora_area'] = false;
$params->fora_area = false;
},
'area' => function () use ($data, $params) {
$areasData = self::getAreasData($params);
$data->form['areas'] = $areasData['form'];
$data->model['area_id'] = $areasData['model'];
$params->area_id = $data->model['area_id'];
},
'microarea' => function () use ($data, $params) {
$microareasData = self::getMicroareasData($params);
$data->form['microareas'] = $microareasData['form'];
$data->model['microarea_id'] = $microareasData['model'];
$params->microarea_id = $data->model['microarea_id'];
},
];
$firstLoad = $load = is_null(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
if (!$firstLoad && collect(['fora_area', 'modelo_resultado'])->contains($field)) {
continue;
}
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
$params = (object) request()->only([
'classificacao_id',
'municipio_id',
'unidade_id',
'bairro_id',
'tipo_logradouro_id',
'logradouro_id',
'paciente_id',
'area_id',
'microarea_id',
'fora_area',
'modelo_resultado',
]);
if (isset($params->fora_area) && DataUtil::isStringBoolean($params->fora_area)) {
$params->fora_area = DataUtil::getBooleanValueFromStringBoolean($params->fora_area);
}
return $params;
}
private static function getModelosResultadoData()
{
$modeloesResultado = collect([
(object) ['value' => 'analitico', 'text' => 'Analítico'],
(object) ['value' => 'sintetico', 'text' => 'Sintético'],
]);
return ['form' => $modeloesResultado, 'model' => 'analitico'];
}
private static function getClassificacoesData()
{
$classificacoes = DB::table('cadastro_paciente_classificacao AS classificacao')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_paciente AS paciente')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
->whereColumn('paciente.classificacao_id', 'classificacao.id')
->whereNull('paciente.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNotNull('cidadao.domicilio_id')
)
->select(
'classificacao.id',
'classificacao.descricao'
)
->orderBy('classificacao.descricao')
->get();
$id = $classificacoes->where('id', Classificacao::MUNICIPE)->isNotEmpty() ? Classificacao::MUNICIPE : null;
return ['form' => $classificacoes, 'model' => $id];
}
private static function getMunicipiosData($params)
{
$municipios = DB::table('intranet.cadastro_municipio AS municipio')
->join('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_logradouro AS logradouro')
->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id')
->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereColumn('logradouro.municipio_id', 'municipio.id')
->whereNull('logradouro.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
)
->select(
'municipio.id',
DB::raw("CONCAT(municipio.nome, ' - ', estado.uf) AS nome")
)
->orderByRaw("CONCAT(municipio.nome, ' - ', estado.uf)")
->get();
$id = null;
$municipioClienteId = Cliente::where('link', config('database.default'))
->where('sistema_id', Sistema::CONECTASUS)
->firstOrFail()
->municipio_id;
if ($municipios->where('id', $municipioClienteId)->isNotEmpty()) {
if ($params->classificacao_id == Classificacao::MUNICIPE || $municipios->count() === 1) {
$id = $municipioClienteId;
}
}
return ['form' => $municipios, 'model' => $id];
}
private static function getUnidadesData($params)
{
$unidades = collect();
if ($params->modelo_resultado === 'sintetico'
|| ($params->modelo_resultado === 'analitico' && !is_null($params->municipio_id))
) {
$unidades = DB::table('cadastro_unidade AS unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_paciente AS paciente')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
->whereColumn('paciente.unidade_id', 'unidade.id')
->whereNull('paciente.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('logradouro.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
)
->select(
'unidade.id',
'unidade.nome_fantasia'
)
->orderBy('unidade.nome_fantasia')
->get();
}
return ['form' => $unidades, 'model' => null];
}
private static function getBairrosData($params)
{
$bairros = collect();
if ($params->modelo_resultado === 'sintetico'
|| ($params->modelo_resultado === 'analitico' && !is_null($params->municipio_id))
) {
$bairros = DB::table('cadastro_bairro AS bairro')
->whereNull('bairro.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_logradouro AS logradouro')
->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id')
->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereColumn('logradouro.bairro_id', 'bairro.id')
->whereNull('logradouro.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
)
->select(
'bairro.id',
'bairro.nome'
)
->orderBy('bairro.nome')
->get();
}
return ['form' => $bairros, 'model' => null];
}
private static function getTiposLogradouroData($params)
{
$tiposLogradouro = collect();
if ($params->modelo_resultado === 'sintetico'
|| ($params->modelo_resultado === 'analitico' && !is_null($params->bairro_id))
) {
$tiposLogradouro = DB::table('cadastro_logradouro_tipo AS logradouro_tipo')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_logradouro AS logradouro')
->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id')
->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereColumn('logradouro.tipo_id', 'logradouro_tipo.id')
->whereNull('logradouro.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
)
->select(
'logradouro_tipo.id',
'logradouro_tipo.descricao'
)
->orderBy('logradouro_tipo.descricao')
->get();
}
return ['form' => $tiposLogradouro, 'model' => null];
}
public static function autocompleteLogradouro()
{
$params = self::getParams();
return DB::table('cadastro_logradouro AS logradouro')
->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id')
->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereNull('logradouro.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->select(
'logradouro.id',
'logradouro.nome'
)
->distinct();
}
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('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id')
->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
->whereNull('paciente.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('domicilio.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('logradouro.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id))
->select(
'paciente.id',
'cidadao.nome'
);
}
private static function getAreasData($params)
{
$areas = collect();
if (!$params->fora_area && ($params->modelo_resultado === 'sintetico'
|| ($params->modelo_resultado === 'analitico' && !is_null($params->bairro_id))
)) {
$areas = DB::table('atencao_basica_parametrizacao_area AS area')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_parametrizacao_microarea AS microarea')
->join(
'atencao_basica_cadastro_domiciliar AS cadastro_domiciliar',
'cadastro_domiciliar.microarea_id',
'microarea.id'
)
->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cadastro_domiciliar.domicilio_id')
->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereColumn('microarea.area_id', 'area.id')
->whereNull('domicilio.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('logradouro.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id))
->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
)
->select(
'area.id',
'area.descricao'
)
->orderBy('area.descricao')
->get();
}
return ['form' => $areas, 'model' => null];
}
private static function getMicroareasData($params)
{
$microareas = collect();
if (!is_null($params->area_id)) {
$microareas = DB::table('atencao_basica_parametrizacao_microarea AS microarea')
->where('microarea.area_id', $params->area_id)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar')
->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cadastro_domiciliar.domicilio_id')
->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id')
->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id')
->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id')
->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id')
->whereColumn('cadastro_domiciliar.microarea_id', 'microarea.id')
->whereNull('domicilio.deleted_at')
->whereNull('endereco.deleted_at')
->whereNull('logradouro.deleted_at')
->whereNull('cidadao.deleted_at')
->whereNull('paciente.deleted_at')
->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id))
->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id))
->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id))
->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id))
->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id))
->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
)
->select(
'microarea.id',
'microarea.descricao'
)
->orderBy('microarea.descricao')
->get();
}
return ['form' => $microareas, 'model' => null];
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['itens'];
$params = self::getParams();
$classificacao = is_null($params->classificacao_id) ? null : PacienteClassificacao::find($params->classificacao_id);
$municipio = is_null($params->municipio_id) ? null : Municipio::find($params->municipio_id);
$unidade = is_null($params->unidade_id) ? null : Unidade::find($params->unidade_id);
$bairro = is_null($params->bairro_id) ? null : Bairro::find($params->bairro_id);
$tipoLogradouro = is_null($params->tipo_logradouro_id) ? null : LogradouroTipo::find($params->tipo_logradouro_id);
$logradouro = is_null($params->logradouro_id) ? null : Logradouro::find($params->logradouro_id);
$paciente = is_null($params->paciente_id) ? null : Paciente::find($params->paciente_id);
$foraArea = DataUtil::getBooleanValueFromStringBoolean($params->fora_area) ? 'SIM' : 'NÃO';
$area = is_null($params->area_id) ? null : Area::find($params->area_id);
$microarea = is_null($params->microarea_id) ? null : Microarea::find($params->microarea_id);
return [
'classificacao' => $classificacao->descricao ?? 'Todas',
'municipio' => is_null($municipio) ? 'Todos' : "{$municipio->nome} - {$municipio->estado->uf}",
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'bairro' => $bairro->nome ?? 'Todos',
'tipoLogradouro' => $tipoLogradouro->descricao ?? 'Todos',
'logradouro' => $logradouro->nome ?? 'Todos',
'paciente' => $paciente->cidadao->nome ?? 'Todos',
'foraArea' => $foraArea,
'area' => $area->descricao ?? 'Todas',
'microarea' => $microarea->descricao ?? 'Todas',
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
'isModeloSintetico' => $params->modelo_resultado === 'sintetico',
];
}
}