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)); } }