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, ]; } }