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

448 lines
17 KiB
PHP

<?php
namespace App\Services\ProntoAtendimento;
use App\Models\ProntoAtendimento\ClassificacaoRisco\ClassificacaoRisco;
use App\Models\Sigtap\Procedimento;
use App\Services\Service;
use App\Utils\Format;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioClassificacaoRiscoService extends Service
{
public static function index()
{
$params = request()->all();
self::adjustPeriod($params);
$classificacoesRisco = DB::table('pronto_atendimento_atendimento_classificacao_risco')
->select(
DB::raw('count(pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id) totalClassificacoesRisco'),
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id',
'cadastro_infraestrutura.unidade_id',
'cadastro_infraestrutura.id as infraestrutura_id',
'cadastro_unidade.nome_fantasia as unidade',
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL
THEN cadastro_infraestrutura.nome
ELSE cadastro_unidade.nome_fantasia
END AS infraestrutura"
),
)
->groupBy('pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id')
->groupBy('cadastro_infraestrutura.id')
->groupBy('cadastro_infraestrutura.unidade_id')
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_faa.created_lotacao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->where('pronto_atendimento_atendimento_classificacao_risco.id', function ($query) {
$query->select(
'pronto_atendimento_atendimento_classificacao_risco.id'
)
->from('pronto_atendimento_atendimento_classificacao_risco')
->whereColumn(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->orderByDesc('pronto_atendimento_atendimento_classificacao_risco.created_at')
->limit(1);
})
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'classificacao_risco_id')) {
$classificacoesRisco->where(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id',
$params['classificacao_risco_id']
);
}
if (self::hasParamId($params, 'unidade_id')) {
$classificacoesRisco->where(
'cadastro_infraestrutura.unidade_id',
$params['unidade_id']
);
}
if (self::hasParamId($params, 'local_atendimento_id')) {
$classificacoesRisco->where(
'cadastro_infraestrutura.id',
$params['local_atendimento_id']
);
}
$results = [];
$totalGeral = 0;
$classificacoesRisco->get()
->map(function ($classRisco) use (&$results, &$totalGeral) {
$totalGeral += $classRisco->totalClassificacoesRisco;
if (!isset($results[$classRisco->unidade_id][$classRisco->infraestrutura_id]['total'])) {
$results[$classRisco->unidade_id][$classRisco->infraestrutura_id]['total'] = 0;
}
$results[$classRisco->unidade_id][$classRisco->infraestrutura_id]['unidade'] = $classRisco->unidade;
$results[$classRisco->unidade_id][$classRisco->infraestrutura_id]['infraestrutura'] = $classRisco->infraestrutura;
$results[$classRisco->unidade_id][$classRisco->infraestrutura_id][$classRisco->classificacao_risco_id] = $classRisco->totalClassificacoesRisco;
$results[$classRisco->unidade_id][$classRisco->infraestrutura_id]['total'] += $classRisco->totalClassificacoesRisco;
});
$classificacoes = [];
foreach ($results as $unidadeId => $infras) {
$columns = self::getColumns();
foreach ($infras as $infraId => $classRiscos) {
$columns['unidade'] = $classRiscos['unidade'];
$columns['infraestrutura'] = $classRiscos['infraestrutura'];
$columns['total'] = $classRiscos['total'];
unset($classRiscos['unidade']);
unset($classRiscos['infraestrutura']);
unset($classRiscos['total']);
$keys = array_keys($classRiscos);
foreach ($keys as $key) {
$columns["_{$key}"] = $classRiscos[$key];
}
$classificacoes[] = $columns;
}
}
return [
'classificacoes_risco' => $classificacoes,
'total_geral' => $totalGeral,
];
}
private static function getColumns()
{
$classificacoesRiscoCadastradas = self::getClassificacoesRiscoCadastradas();
$columns = [];
$classificacoesRiscoCadastradas->map(function ($classificacoesRiscoCadastradas) use (&$columns) {
$columns["{$classificacoesRiscoCadastradas['value']}"] = 0;
});
return $columns;
}
public static function list()
{
return [
'form' => self::getForm(),
'model' => self::getModel(),
'additionals' => [
'data_atual' => Carbon::today()->format('d/m/Y'),
]
];
}
private static function getForm()
{
$params = request()->all();
self::adjustPeriod($params);
return [
'columns' => array_merge(
[['value' => 'infraestrutura', 'text' => 'Local de atendimento']],
self::getClassificacoesRiscoCadastradas()->toArray()
),
'classificacoes_risco' => self::getClassificacoesRisco($params),
'unidades' => self::getUnidades($params),
'locais_atendimento' => self::getLocaisAtendimento($params),
];
return $result;
}
private static function adjustPeriod(&$params)
{
if (!is_null($params['periodo']['date']['start'] ?? null) && $params['periodo']['date']['end']) {
$params['periodo']['date']['start'] =
(Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['start']}"))->startOfDay();
$params['periodo']['date']['end'] =
(Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['end']}"))->endOfDay();
}
}
private static function getClassificacoesRiscoCadastradas()
{
return ClassificacaoRisco::select('id', 'nome')->get()->map(function ($classificacaoRisco) {
return [
'value' => "_{$classificacaoRisco->id}",
'text' => $classificacaoRisco->nome
];
});
}
private static function getClassificacoesRisco($params)
{
return DB::table('pronto_atendimento_classificacao_risco')
->select(
'pronto_atendimento_classificacao_risco.id',
'pronto_atendimento_classificacao_risco.nome',
)
->whereExists(function($query) use ($params) {
$query->select(DB::raw(1))
->from('pronto_atendimento_faa')
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.faa_id',
'pronto_atendimento_faa.id'
)
->join(
'pronto_atendimento_atendimento_classificacao_risco',
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
)
->where('pronto_atendimento_classificacao_risco.id', function ($query) {
$query->select(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id'
)
->from('pronto_atendimento_atendimento_classificacao_risco')
->whereColumn(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->orderByDesc('pronto_atendimento_atendimento_classificacao_risco.created_at')
->limit(1);
});
})
->orderBy('pronto_atendimento_classificacao_risco.nome')
->get();
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select(
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia',
)
->whereExists(function($query) use ($params) {
$query->select(DB::raw(1))
->from('pronto_atendimento_faa')
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_faa.created_lotacao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.faa_id',
'pronto_atendimento_faa.id'
)
->join('pronto_atendimento_atendimento_classificacao_risco', function ($join) {
$join->on(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'=',
'pronto_atendimento_atendimento.id'
)
->where('pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id', function ($query) {
$query->select(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id'
)
->from('pronto_atendimento_atendimento_classificacao_risco')
->whereColumn(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->orderByDesc('pronto_atendimento_atendimento_classificacao_risco.created_at')
->limit(1);
});
})
->whereColumn(
'cadastro_infraestrutura.unidade_id',
'cadastro_unidade.id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'classificacao_risco_id')) {
$query->where(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id',
$params['classificacao_risco_id']
);
}
})
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getLocaisAtendimento($params)
{
$locaisAtendimento = DB::table('cadastro_infraestrutura')
->select(
'cadastro_infraestrutura.id',
DB::raw(
"CASE WHEN cadastro_infraestrutura.nome IS NOT NULL
THEN cadastro_infraestrutura.nome
ELSE cadastro_unidade.nome_fantasia END AS nome"
),
)
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereExists(function($query) use ($params) {
$query->select(DB::raw(1))
->from('pronto_atendimento_faa')
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_faa.created_lotacao_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.faa_id',
'pronto_atendimento_faa.id'
)
->join('pronto_atendimento_atendimento_classificacao_risco', function ($join) {
$join->on(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'=',
'pronto_atendimento_atendimento.id'
)
->where('pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id', function ($query) {
$query->select(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id'
)
->from('pronto_atendimento_atendimento_classificacao_risco')
->whereColumn(
'pronto_atendimento_atendimento_classificacao_risco.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->orderByDesc('pronto_atendimento_atendimento_classificacao_risco.created_at')
->limit(1);
});
})
->whereColumn(
'cadastro_lotacao.infraestrutura_id',
'cadastro_infraestrutura.id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'classificacao_risco_id')) {
$query->where(
'pronto_atendimento_atendimento_classificacao_risco.classificacao_risco_id',
$params['classificacao_risco_id']
);
}
if (self::hasParamId($params, 'unidade_id')) {
$query->where(
'cadastro_unidade.id',
$params['unidade_id']
);
}
});
if (!is_null($params['unidade_id'] ?? null)) {
$locaisAtendimento->where('cadastro_unidade.id', $params['unidade_id']);
}
return $locaisAtendimento->orderBy(
DB::raw(
"CASE WHEN cadastro_infraestrutura.nome IS NOT NULL
THEN cadastro_infraestrutura.nome
ELSE cadastro_unidade.nome_fantasia END"
))
->get();
}
private static function hasParamId($params, $param)
{
return isset($params[$param]) && $params[$param] > 0;
}
private static function getModel()
{
return [
'periodo' => [
'date' => [
'start' => $params['periodo']['date']['start'] ?? null,
'end' => $params['periodo']['date']['end'] ?? null,
],
],
'classificacao_risco_id' => null,
'unidade_id' => null,
'localAtendimento_id' => null,
];
}
}