This commit is contained in:
@@ -0,0 +1,447 @@
|
||||
<?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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user