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

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

View File

@@ -0,0 +1,520 @@
<?php
namespace App\Services\Bpa;
use App\Enums\Sigtap\Registro;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Sigtap\Competencia;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioBpaConsolidadoService extends Service
{
public static function index()
{
$totalizadores = (object) [
'quantidade' => 0,
];
$params = self::getParams();
$procedimentosBuilder = DB::table('bpa_procedimento as bpa_procedimento')
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'bpa_procedimento.unidade_id')
->leftJoin('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'bpa_procedimento.ocupacao_id')
->where('bpa_procedimento.competencia_id', $params->competencia_id)
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id))
->when($params->procedimento_codigo, fn ($q, $codigo) => $q->where('procedimento.codigo', $codigo))
->when($params->com_inconsistencia === true, fn ($q) => $q->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia')
->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id')
))
->when($params->com_inconsistencia === false, fn ($q) => $q->whereNotExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia')
->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id')
))
->when(isset($params->idade['de']), fn ($q) => $q->where(fn ($q) => $q
->whereRaw("bpa_procedimento.idade >= {$params->idade['de']}")
))
->when(isset($params->idade['ate']), fn ($q) => $q->where(fn ($q) => $q
->whereRaw("bpa_procedimento.idade <= {$params->idade['ate']}")
))
->selectRaw("
procedimento.id as procedimento_id,
procedimento.codigo as procedimento_codigo,
procedimento.nome as procedimento_nome,
unidade.id as unidade_id,
CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))) as unidade_descricao,
ocupacao.id as ocupacao_id,
ocupacao.codigo as ocupacao_codigo,
ocupacao.nome as ocupacao_nome,
bpa_procedimento.idade,
IF (EXISTS(
SELECT 1
FROM bpa_procedimento_inconsistencia as procedimento_inconsistencia
WHERE procedimento_inconsistencia.procedimento_id = bpa_procedimento.id
),
1,
0
) as com_inconsistencia,
bpa_procedimento.origem as origem,
SUM(bpa_procedimento.quantidade) as quantidade
")
->groupByRaw("
procedimento.id,
procedimento.codigo,
procedimento.nome,
unidade.id,
CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))),
ocupacao.id,
ocupacao.codigo,
ocupacao.nome,
bpa_procedimento.idade,
com_inconsistencia,
origem
");
self::setOrderBy($procedimentosBuilder);
$procedimentos = $procedimentosBuilder->get();
$procedimentos->each(function ($item) use ($totalizadores) {
$item->procedimento_codigo = MaskUtil::getProcedimentoMasked($item->procedimento_codigo);
$item->procedimento_descricao = "{$item->procedimento_codigo} - {$item->procedimento_nome}";
$item->ocupacao_descricao = "{$item->ocupacao_codigo} - {$item->ocupacao_nome}";
$item->com_inconsistencia_value = (bool) $item->com_inconsistencia;
$item->com_inconsistencia = $item->com_inconsistencia_value ? 'SIM' : 'NÃO';
unset(
$item->procedimento_codigo,
$item->procedimento_nome,
$item->ocupacao_codigo,
$item->ocupacao_nome,
);
$totalizadores->quantidade += $item->quantidade;
});
return compact('procedimentos', 'totalizadores');
}
private static function setOrderBy($builder)
{
$columns = [
'procedimento_descricao' => "CONCAT(procedimento.codigo, ' - ', procedimento.nome)",
'unidade_descricao' => "CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes)))",
'ocupacao_descricao' => "CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)",
'idade' => 'bpa_procedimento.idade',
'com_inconsistencia' => 'com_inconsistencia',
'origem' => 'bpa_procedimento.origem',
'quantidade' => 'quantidade'
];
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 = [
'ano' => function () use ($data, $params) {
$anosData = self::getAnosData();
$data->form['anos'] = $anosData['form'];
$data->model['ano'] = $anosData['model'];
$params->ano = $data->model['ano'];
},
'competencia' => function () use ($data, $params) {
$competenciasData = self::getCompetenciasData($params);
$data->form['competencias'] = $competenciasData['form'];
$data->model['competencia_id'] = $competenciasData['model'];
$params->competencia_id = $data->model['competencia_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'];
},
'ocupacao' => function () use ($data, $params) {
$ocupacoesData = self::getOcupacoesData($params);
$data->form['ocupacoes'] = $ocupacoesData['form'];
$data->model['ocupacao_id'] = $ocupacoesData['model'];
$params->ocupacao_id = $data->model['ocupacao_id'];
},
'procedimento' => function () use ($data, $params) {
$procedimentosData = self::getProcedimentosData($params);
$data->form['procedimentos'] = $procedimentosData['form'];
$data->model['procedimento_codigo'] = $procedimentosData['model'];
$params->procedimento_codigo = $data->model['procedimento_codigo'];
},
'inconsistencia' => function () use ($data, $params) {
$inconsistenciasData = self::getInconsistenciasData($params);
$data->form['inconsistencias'] = $inconsistenciasData['form'];
$data->model['com_inconsistencia'] = $inconsistenciasData['model'];
$params->com_inconsistencia = $data->model['com_inconsistencia'];
},
'idade' => function () use ($data, $params) {
$data->model['idade'] = ['de' => null, 'ate' => null];
$params->idade = $data->model['idade'];
},
];
$firstLoad = $load = is_null(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
if (!$firstLoad && collect(['idade'])->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([
'ano',
'competencia_id',
'unidade_id',
'ocupacao_id',
'procedimento_codigo',
'com_inconsistencia',
'idade',
]);
if (isset($params->com_inconsistencia)) {
$params->com_inconsistencia = DataUtil::isStringBoolean($params->com_inconsistencia)
? DataUtil::getBooleanValueFromStringBoolean($params->com_inconsistencia)
: null;
}
return $params;
}
private static function getAnosData()
{
$anos = DB::table('sigtap.competencia as competencia')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->whereColumn('bpa_procedimento.competencia_id', 'competencia.id')
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
)
->selectRaw("
SUBSTRING(competencia.valor, 1, 4) as ano
")
->orderByRaw("SUBSTRING(competencia.valor, 1, 4) DESC")
->distinct()
->get();
$ano = null;
return ['form' => $anos, 'model' => $ano];
}
private static function getCompetenciasData($params)
{
$competencias = collect();
$id = null;
if (!is_null($params->ano)) {
$competencias = DB::table('sigtap.competencia as competencia')
->whereRaw("SUBSTRING(competencia.valor, 1, 4) = '{$params->ano}'")
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->whereColumn('bpa_procedimento.competencia_id', 'competencia.id')
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
)
->selectRaw("
competencia.id,
SUBSTRING(competencia.valor, 5, 7) as mes
")
->orderByRaw("SUBSTRING(competencia.valor, 5, 7)")
->get();
}
return ['form' => $competencias, 'model' => $id];
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->competencia_id)) {
$unidades = DB::table('cadastro_unidade as unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->whereColumn('bpa_procedimento.unidade_id', 'unidade.id')
->where('bpa_procedimento.competencia_id', $params->competencia_id)
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
)
->selectRaw("
unidade.id,
CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))) as descricao
")
->orderByRaw("CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes)))")
->get();
}
return ['form' => $unidades, 'model' => $id];
}
private static function getOcupacoesData($params)
{
$ocupacoes = collect();
$id = null;
if (!is_null($params->competencia_id)) {
$ocupacoes = DB::table('sigtap.ocupacao as ocupacao')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->whereColumn('bpa_procedimento.ocupacao_id', 'ocupacao.id')
->where('bpa_procedimento.competencia_id', $params->competencia_id)
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id))
)
->selectRaw("
ocupacao.id,
CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as descricao
")
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
->get();
}
return ['form' => $ocupacoes, 'model' => $id];
}
private static function getProcedimentosData($params)
{
$procedimentos = collect();
$codigo = null;
if (!is_null($params->competencia_id)) {
$procedimentos = DB::table('sigtap.procedimento as procedimento')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->whereColumn('bpa_procedimento.procedimento_id', 'procedimento.id')
->where('bpa_procedimento.competencia_id', $params->competencia_id)
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id))
)
->selectRaw("
procedimento.codigo,
procedimento.nome
")
->orderByRaw("CONCAT(procedimento.codigo, ' - ', procedimento.nome)")
->distinct()
->get()
->map(fn ($procedimento) => (object) [
'codigo' => $procedimento->codigo,
'descricao' => MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}",
]);
}
return ['form' => $procedimentos, 'model' => $codigo];
}
private static function getInconsistenciasData($params)
{
$inconsistencias = collect();
$value = null;
if (!is_null($params->competencia_id)) {
$exists = function ($comInconsistencia) use ($params) {
return DB::table('bpa_procedimento as bpa_procedimento')
->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id')
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id')
->where('bpa_procedimento.competencia_id', $params->competencia_id)
->where('registro.codigo', Registro::BPA_CONSOLIDADO)
->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id))
->when($params->procedimento_codigo, fn ($q, $codigo) => $q->where('procedimento.codigo', $codigo))
->when($comInconsistencia,
fn ($q) => $q->whereExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia')
->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id')
),
fn ($q) => $q->whereNotExists(fn ($q) => $q
->selectRaw(1)
->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia')
->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id')
)
)
->exists();
};
if ($exists(false)) {
$inconsistencias->push((object) ['value' => false, 'text' => 'NÃO']);
}
if ($exists(true)) {
$inconsistencias->push((object) ['value' => true, 'text' => 'SIM']);
}
}
return ['form' => $inconsistencias->sortBy('text')->values(), 'model' => $value];
}
public static function getInconsistencias()
{
return DB::table('bpa_inconsistencia as inconsistencia')
->join(
'bpa_procedimento_inconsistencia as procedimento_inconsistencia',
'procedimento_inconsistencia.inconsistencia_id',
'inconsistencia.id'
)
->join(
'bpa_procedimento as bpa_procedimento',
'bpa_procedimento.id',
'procedimento_inconsistencia.procedimento_id'
)
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id')
->where('bpa_procedimento.competencia_id', request()->competencia_id)
->where('bpa_procedimento.unidade_id', request()->unidade_id)
->where('procedimento.codigo', request()->procedimento_codigo)
->where('bpa_procedimento.ocupacao_id', request()->ocupacao_id)
->where('bpa_procedimento.idade', request()->idade)
->where('bpa_procedimento.origem', request()->origem)
->selectRaw("
inconsistencia.id,
inconsistencia.descricao
")
->orderBy('inconsistencia.descricao')
->distinct()
->get();
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['procedimentos'];
$params = self::getParams();
$competencia = Competencia::find($params->competencia_id);
$unidade = $params->unidade_id ? Unidade::find($params->unidade_id) : null;
$ocupacao = $params->ocupacao_id ? Ocupacao::find($params->ocupacao_id) : null;
$procedimento = $params->procedimento_codigo
? Procedimento::where('competencia_id', '<=', $params->competencia_id)
->where('codigo', $params->procedimento_codigo)
->orderByDesc('competencia_id')
->first()
: null;
return [
'ano' => Str::substr($competencia->valor, 0, 4),
'mes' => Str::substr($competencia->valor, 4, 2),
'unidade' => $unidade
? ($unidade->nome_fantasia . ($unidade->cnes ? " - {$unidade->cnes}": ''))
: 'Todas',
'ocupacao' => $ocupacao
? "{$ocupacao->codigo} - {$ocupacao->nome}"
: 'Todas',
'procedimento' => $procedimento
? MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}"
: 'Todos',
'comInconsistencia' => $params->com_inconsistencia === null
? 'Todas'
: ($params->com_inconsistencia ? 'SIM' : 'NÃO'),
'idadeDe' => $params->idade['de'],
'idadeAte' => $params->idade['ate'],
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
];
}
}