214 lines
7.4 KiB
PHP
214 lines
7.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Parametrizacao;
|
|
|
|
use App\Services\Service;
|
|
use App\Utils\DataUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class RelatorioExameCadastradoService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
$itens = DB::table('parametrizacao_exame')
|
|
->select([
|
|
'parametrizacao_exame.id',
|
|
'parametrizacao_exame.nome AS nome_exame',
|
|
'parametrizacao_exame_tipo.nome AS nome_tipo',
|
|
'cadastro_grupo.nome as nome_grupo',
|
|
'sigtap.procedimento.nome as nome_procedimento',
|
|
'sigtap.procedimento.codigo AS codigo_sigtap',
|
|
'parametrizacao_exame.valor_sigtap as valor_id',
|
|
DB::raw("CASE
|
|
WHEN parametrizacao_exame.valor_sigtap = 1 THEN 'Sim'
|
|
ELSE 'Não'
|
|
END AS valor_sigtap"),
|
|
DB::raw("CASE
|
|
WHEN parametrizacao_exame.valor_sigtap = 1
|
|
THEN CONCAT('R$ ', REPLACE(FORMAT(sigtap.procedimento.valor_servico_ambilatorial, 2, 'de_DE'), '.', 'X'))
|
|
ELSE CONCAT('R$ ', REPLACE(FORMAT(parametrizacao_exame.valor, 2, 'de_DE'), '.', 'X'))
|
|
END AS valor_exame"),
|
|
DB::raw("CONCAT(parametrizacao_exame.validade, ' dias') AS validade_exame"),
|
|
])
|
|
->leftJoin(
|
|
'parametrizacao_exame_tipo',
|
|
'parametrizacao_exame_tipo.id',
|
|
'parametrizacao_exame.tipo_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_grupo',
|
|
'cadastro_grupo.id',
|
|
'parametrizacao_exame.grupo_tipo_id'
|
|
)
|
|
->leftJoin('sigtap.procedimento', function ($join) {
|
|
|
|
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
|
|
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
|
|
|
|
$query->select('sigtap.competencia.id')
|
|
->from('sigtap.competencia')
|
|
->orderByDesc('sigtap.competencia.valor')
|
|
->limit(1);
|
|
});
|
|
})
|
|
->when($params->tipo_id, fn($q) => $q->where('parametrizacao_exame_tipo.id', $params->tipo_id))
|
|
->when($params->grupo_id, fn($q) => $q->where('cadastro_grupo.id', $params->grupo_id))
|
|
->when($params->valor_id !== null, function ($q) use ($params) {
|
|
return $q->where('parametrizacao_exame.valor_sigtap', $params->valor_id);
|
|
});
|
|
|
|
self::setOrderBy($itens);
|
|
|
|
$itens = $itens->get();
|
|
|
|
return [
|
|
'itens' => $itens,
|
|
];
|
|
}
|
|
|
|
public static function create()
|
|
{
|
|
return [
|
|
'additionals' => [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
],
|
|
'form' => [
|
|
'tipos' => self::getTipos(),
|
|
'grupos' => [],
|
|
'valores' => [],
|
|
],
|
|
'model' => [
|
|
'tipo_id' => null,
|
|
'grupo_id' => null,
|
|
'valor_id' => null,
|
|
],
|
|
];
|
|
}
|
|
|
|
public static function list()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
switch (request()->listar) {
|
|
case 'tipos': {
|
|
return [
|
|
'tipos' => self::getTipos($params),
|
|
'grupos' => self::getGrupos($params),
|
|
'valores' => self::getValores($params),
|
|
];
|
|
}
|
|
case 'grupos': {
|
|
return [
|
|
'grupos' => self::getGrupos($params),
|
|
'valores' => self::getValores($params),
|
|
];
|
|
}
|
|
case 'valores': {
|
|
return [
|
|
'valores' => self::getValores($params),
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function getParams()
|
|
{
|
|
return (object) [
|
|
'tipo_id' => request()->get('tipo_id'),
|
|
'grupo_id' => request()->get('grupo_id'),
|
|
'valor_id' => request()->get('valor_id'),
|
|
];
|
|
}
|
|
|
|
private static function getTipos()
|
|
{
|
|
return DB::table('parametrizacao_exame_tipo')
|
|
->select([
|
|
DB::raw('MIN(parametrizacao_exame_tipo.id) as id'),
|
|
'parametrizacao_exame_tipo.nome',
|
|
])
|
|
->groupBy('parametrizacao_exame_tipo.nome')
|
|
->orderBy('parametrizacao_exame_tipo.nome')
|
|
->get();
|
|
}
|
|
|
|
private static function getGrupos($params)
|
|
{
|
|
|
|
return DB::table('cadastro_grupo')
|
|
->select([
|
|
'cadastro_grupo.id',
|
|
'cadastro_grupo.nome',
|
|
])
|
|
->whereExists(function ($q) use ($params) {
|
|
return $q->select(DB::raw(1))
|
|
->from('parametrizacao_exame')
|
|
->whereColumn('parametrizacao_exame.grupo_tipo_id', 'cadastro_grupo.id')
|
|
->when($params->tipo_id, function ($q) use ($params) {
|
|
$q->where('parametrizacao_exame.tipo_id', $params->tipo_id);
|
|
});
|
|
})
|
|
->orderBy('cadastro_grupo.nome')
|
|
->get();
|
|
}
|
|
|
|
private static function getValores($params)
|
|
{
|
|
|
|
return DB::table('parametrizacao_exame')
|
|
->select([
|
|
'parametrizacao_exame.id',
|
|
'parametrizacao_exame.valor_sigtap as valor_id',
|
|
DB::raw("CASE
|
|
WHEN parametrizacao_exame.valor_sigtap = 1 THEN 'Sim'
|
|
ELSE 'Não'
|
|
END AS valor_sigtap"),
|
|
])
|
|
->when(isset($params->valor_id), function ($q) use ($params) {
|
|
$q->where('parametrizacao_exame.valor_sigtap', $params->valor_id);
|
|
})
|
|
->when(isset($params->tipo_id), function ($q) use ($params) {
|
|
$q->where('parametrizacao_exame.tipo_id', $params->tipo_id);
|
|
})
|
|
|
|
->groupBy('parametrizacao_exame.valor_sigtap')
|
|
->orderBy('parametrizacao_exame.valor_sigtap')
|
|
->get();
|
|
}
|
|
|
|
private static function setOrderBy($builder)
|
|
{
|
|
$columns = [
|
|
'nome_exame' => 'parametrizacao_exame.nome',
|
|
'nome_tipo' => 'parametrizacao_exame_tipo.nome',
|
|
'nome_grupo' => 'cadastro_grupo.nome',
|
|
'codigo_sigtap' => 'sigtap.procedimento.codigo',
|
|
'valor_sigtap' => "CASE WHEN parametrizacao_exame.valor_sigtap = 1 THEN 'Sim' ELSE 'Não'END",
|
|
'nome_procedimento' => 'sigtap.procedimento.nome',
|
|
'valor_exame' => 'parametrizacao_exame.valor',
|
|
'validade_exame' => 'parametrizacao_exame.validade'
|
|
];
|
|
|
|
if (is_null(request()->sort_by)) {
|
|
$builder->orderByRaw(implode(', ', $columns));
|
|
return;
|
|
}
|
|
|
|
$column = $columns[request()->sort_by];
|
|
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC';
|
|
|
|
unset($columns[request()->sort_by]);
|
|
|
|
$orderByList = [];
|
|
$orderByList[] = "{$column} {$direction}";
|
|
|
|
if (!empty($columns)) {
|
|
$orderByList[] = implode(', ', $columns);
|
|
}
|
|
|
|
$builder->orderByRaw(implode(', ', $orderByList));
|
|
}
|
|
} |