join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->leftJoin('cadastro_grupo as grupo', 'grupo.id', 'servico.grupo_id') ->leftJoin('cadastro_subgrupo as subgrupo', 'subgrupo.id', 'solicitacao.subgrupo_id') ->leftJoin('manutencao_parametrizacao_status as parametrizacao_status', 'parametrizacao_status.id', 'solicitacao.status_id') ->leftJoin('manutencao_status_tipo as status', 'status.id', 'parametrizacao_status.tipo_id') ->leftJoin('manutencao_prioridade_tipo as prioridade', 'prioridade.id', 'servico.prioridade_id') ->leftJoin('cadastro_infraestrutura as infraestrutura_executante', 'infraestrutura_executante.id', 'solicitacao.prestador_id') ->leftJoin('cadastro_unidade as unidade_executante', 'unidade_executante.id', 'infraestrutura_executante.unidade_id') ->join('cadastro_usuario as usuario', 'usuario.id', 'solicitacao.usuario_solicitante_id') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->select( DB::raw('COALESCE(( SELECT DATE_FORMAT(status_historico_reaberto.created_at, "%d/%m/%Y") FROM manutencao_solicitacao_status_historico as status_historico_reaberto JOIN manutencao_parametrizacao_status as parametrizacao_status_reaberto ON parametrizacao_status_reaberto.id = status_historico_reaberto.status_id JOIN manutencao_status_tipo as status_tipo_reaberto ON status_tipo_reaberto.id = parametrizacao_status_reaberto.tipo_id WHERE status_tipo_reaberto.id = ' . StatusTipo::REABERTO . ' AND status_historico_reaberto.solicitacao_id = solicitacao.id LIMIT 1 ), DATE_FORMAT(solicitacao.created_at, "%d/%m/%Y")) as data_abertura'), DB::raw('COALESCE(( SELECT DATE_FORMAT(MAX(status_historico.created_at), "%d/%m/%Y") FROM manutencao_solicitacao_status_historico as status_historico JOIN manutencao_parametrizacao_status as parametrizacao_status ON parametrizacao_status.id = status_historico.status_id JOIN manutencao_status_tipo as status_tipo ON status_tipo.id = parametrizacao_status.tipo_id WHERE status_tipo.id = ' . StatusTipo::FINALIZADO . ' AND status_historico.solicitacao_id = solicitacao.id LIMIT 1 ), "NÃO FINALIZADO") as data_finalizacao'), 'prioridade.nome as prioridade', DB::raw('COALESCE(( SELECT CONCAT(DATEDIFF( (SELECT MAX(status_historico.created_at) FROM manutencao_solicitacao_status_historico as status_historico JOIN manutencao_parametrizacao_status as parametrizacao_status ON parametrizacao_status.id = status_historico.status_id JOIN manutencao_status_tipo as status_tipo ON status_tipo.id = parametrizacao_status.tipo_id WHERE status_tipo.id = ' . StatusTipo::FINALIZADO . ' AND status_historico.solicitacao_id = solicitacao.id ), solicitacao.created_at ), " DIAS") ), CONCAT(DATEDIFF(CURDATE(), solicitacao.created_at), " DIAS")) as dias_abertura'), 'parametrizacao_status.nome as status', 'cidadao.nome as usuario_solicitante', 'unidade.nome_fantasia as unidade', 'grupo.nome as grupo', 'solicitacao.codigo as codigo', 'servico.nome as servico', 'solicitacao.id as id', 'status.id as status_id', 'solicitacao.prestador_id as prestador_id', DB::raw('COALESCE(unidade_executante.nome_fantasia, "-") as unidade_executante'), ) ->distinct(); $solicitacoes = self::getQueryParams($solicitacoes); $solicitacoes = $solicitacoes ->orderBy('solicitacao.created_at', 'asc') ->get(); $totalGeral = $solicitacoes->count(); $abertoCount = $solicitacoes ->where('status_id', StatusTipo::EM_ABERTO) ->count(); $emAtendimentoCount = $solicitacoes ->where('status_id', StatusTipo::EM_ATENDIMENTO) ->count(); $finalizadoCount = $solicitacoes ->where('status_id', StatusTipo::FINALIZADO) ->count(); $reabertoCount = $solicitacoes ->where('status_id', StatusTipo::REABERTO) ->count(); $canceladoCount = $solicitacoes ->where('status_id', StatusTipo::CANCELADO) ->count(); $solicitacoes = collect($solicitacoes)->map(function ($solicitacao) { $causasProvaveisIds = SolicitacaoCausaProvavel::where('solicitacao_id', $solicitacao->id)->get(); $causasProvaveis = $causasProvaveisIds->map(function ($causaProvavel) { $causa = ServicoManutencaoCausasProvaveis::find($causaProvavel->causa_provavel_id); return $causa ? $causa->nome : null; })->filter(); $causasProvaveisNomes = $causasProvaveis->isNotEmpty() ? $causasProvaveis->implode(', ') : 'NÃO INFORMADO'; $prestador = DB::table('cadastro_servico_manutencao_prestador_fornecedor') ->leftJoin('cadastro_unidade_executante_manutencao as unidade_executante_prestador', 'unidade_executante_prestador.id', 'cadastro_servico_manutencao_prestador_fornecedor.unidade_executante_manutencao_id') ->leftJoin('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'unidade_executante_prestador.infraestrutura_id') ->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('cadastro_servico_manutencao_prestador_fornecedor.id', $solicitacao->prestador_id) ->select('cadastro_unidade.nome_fantasia as unidade_executante') ->first(); return [ 'id' => $solicitacao->id, 'codigo' => $solicitacao->codigo, 'data_abertura' => $solicitacao->data_abertura, 'data_finalizacao' => $solicitacao->data_finalizacao, 'dias_abertura' => $solicitacao->dias_abertura, 'grupo' => $solicitacao->grupo, 'prioridade' => $solicitacao->prioridade, 'servico' => $solicitacao->servico, 'status' => $solicitacao->status, 'unidade' => $solicitacao->unidade, 'usuario_solicitante' => $solicitacao->usuario_solicitante, 'causas_provaveis' => $causasProvaveisNomes, 'unidade_executante' => $prestador ? $prestador->unidade_executante : '-', 'custo' => "R$ " . number_format(Solicitacao::find($solicitacao->id)->custo, 2, ',', '.'), ]; }); return [ 'solicitacoes' => $solicitacoes, 'total_geral' => $totalGeral, 'solicitacoes_status' => [ 'aberto' => $abertoCount, 'em_atendimento' => $emAtendimentoCount, 'finalizado' => $finalizadoCount, 'reaberto' => $reabertoCount, 'cancelado' => $canceladoCount, ] ]; } private static function getCausaProvavel($solicitacaoId) { $causasProvaveisIds = SolicitacaoCausaProvavel::where('solicitacao_id', $solicitacaoId)->get(); $causasProvaveis = []; foreach ($causasProvaveisIds as $causaProvavel) { $causasProvaveis[] = ServicoManutencaoCausasProvaveis::find($causaProvavel->causa_provavel_id); } return $causasProvaveis; } public static function create() { return [ 'additionals' => [ 'data_atual' => Carbon::today()->format('d/m/Y'), ], 'form' => [ 'grupos' => self::getGrupos(), 'infraestruturas' => self::getInfraestruturas(), 'prioridades' => self::getPrioridade(), 'servicos' => self::getServicos(), 'status' => self::getStatus(), 'subgrupos' => self::getSubgrupos(), 'unidades' => self::getUnidades(), ], 'model' => [ 'grupos_id' => null, 'infraestruturas_id' => null, 'periodo' => ['start' => null, 'end' => null], 'prioridades_id' => null, 'servicos_id' => null, 'status_id' => null, 'subgrupos_id' => null, 'unidades_id' => null, 'usuario_id' => null, ], ]; } public static function list() { switch (request()->listar) { case 'unidades': { return ['unidades' => self::getUnidades()]; } case 'infraestruturas': { return ['infraestruturas' => self::getInfraestruturas()]; } case 'grupos': { return ['grupos' => self::getGrupos()]; } case 'subgrupos': { return ['subgrupos' => self::getSubgrupos()]; } case 'servicos': { return ['servicos' => self::getServicos()]; } case 'status': { return ['status' => self::getStatus()]; } case 'prioridades': { return ['prioridades' => self::getPrioridade()]; } default: { return []; } } } private static function getQueryParams($query) { $params = request()->all(); if (isset($params['usuario_solicitante_id']) && !empty($params['usuario_solicitante_id'])) { $query->where('solicitacao.usuario_solicitante_id', $params['usuario_solicitante_id'] ?? $params['usuario_solicitante_id']['id']); } if (isset($params['servicos_id']) && is_array($params['servicos_id'])) { $query->whereIn('solicitacao.servico_id', $params['servicos_id']); } if (isset($params['unidades_solicitantes_id']) && is_array($params['unidades_solicitantes_id'])) { $query->whereIn('infraestrutura.unidade_id', $params['unidades_solicitantes_id']); } if (isset($params['infraestruturas_id']) && is_array($params['infraestruturas_id'])) { $query->whereIn('solicitacao.infraestrutura_solicitante_id', $params['infraestruturas_id']); } if (isset($params['grupos_id']) && is_array($params['grupos_id'])) { $query->whereIn('servico.grupo_id', $params['grupos_id']); } if (isset($params['subgrupos_id']) && is_array($params['subgrupos_id'])) { $query->whereIn('solicitacao.subgrupo_id', $params['subgrupos_id']); } if (isset($params['status_id']) && is_array($params['status_id'])) { $query->whereIn('solicitacao.status_id', $params['status_id']); } if (isset($params['prioridade_id']) && is_array($params['prioridade_id'])) { $query->whereIn('servico.prioridade_id', $params['prioridade_id']); } return $query; } public static function autocompleteUsuarioSolicitante() { $periodo = self::getPeriodo(); $usuarios = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_usuario as usuario', 'usuario.id', 'solicitacao.usuario_solicitante_id') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->distinct() ->selectRaw(' usuario.id as id, cidadao.nome as nome_usuario_solicitante '); return $usuarios; } private static function getPeriodo() { $periodo = request()->get('periodo') ?? null; if ($periodo && $periodo['start'] && $periodo['end']) { $dataInicial = Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(); $dataFinal = Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(); } else { $dataInicial = Carbon::today()->startOfDay(); $dataFinal = Carbon::today()->endOfDay(); } return [ 'data_inicial' => $dataInicial, 'data_final' => $dataFinal, ]; } private static function getUnidades() { $periodo = self::getPeriodo(); $unidades = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' unidade.id as id, unidade.nome_fantasia as nome_fantasia '); $unidades = self::getQueryParams($unidades); $unidades = $unidades ->distinct() ->get() ->toArray(); $form = array_map(function ($unidade) { return [ 'id' => $unidade->id, 'nome_fantasia' => $unidade->nome_fantasia, ]; }, $unidades); return $form; } private static function getInfraestruturas() { $periodo = self::getPeriodo(); $infraestruturas = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' infraestrutura.id as id, COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome '); $infraestruturas = self::getQueryParams($infraestruturas); $infraestruturas = $infraestruturas ->distinct() ->get() ->toArray(); $form = array_map(function ($infraestrutura) { return [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, ]; }, $infraestruturas); return $form; } private static function getGrupos() { $periodo = self::getPeriodo(); $grupos = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->join('cadastro_grupo as grupo', 'grupo.id', 'servico.grupo_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' grupo.id as id, grupo.nome as nome '); $grupos = self::getQueryParams($grupos); $grupos = $grupos ->distinct() ->get() ->toArray(); $form = array_map(function ($grupo) { return [ 'id' => $grupo->id, 'nome' => $grupo->nome, ]; }, $grupos); return $form; } private static function getSubgrupos() { $periodo = self::getPeriodo(); $subgrupos = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_subgrupo as subgrupo', 'subgrupo.id', 'solicitacao.subgrupo_id') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' subgrupo.id as id, subgrupo.nome as nome '); $subgrupos = self::getQueryParams($subgrupos); $subgrupos = $subgrupos ->distinct() ->get() ->toArray(); $form = array_map(function ($subgrupo) { return [ 'id' => $subgrupo->id, 'nome' => $subgrupo->nome, ]; }, $subgrupos); return $form; } private static function getServicos() { $periodo = self::getPeriodo(); $servicos = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' servico.id as id, servico.nome as nome '); $servicos = self::getQueryParams($servicos); $servicos = $servicos ->distinct() ->get() ->toArray(); $form = array_map(function ($servico) { return [ 'id' => $servico->id, 'nome' => $servico->nome, ]; }, $servicos); return $form; } private static function getStatus() { $periodo = self::getPeriodo(); $status = DB::table('manutencao_solicitacao as solicitacao') ->join('manutencao_parametrizacao_status', 'manutencao_parametrizacao_status.id', 'solicitacao.status_id') ->join('manutencao_status_tipo as status', 'status.id', 'manutencao_parametrizacao_status.tipo_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' manutencao_parametrizacao_status.id as id, manutencao_parametrizacao_status.nome as nome '); $status = self::getQueryParams($status); $status = $status ->distinct() ->get() ->toArray(); $form = array_map(function ($status) { return [ 'id' => $status->id, 'nome' => $status->nome, ]; }, $status); return $form; } private static function getPrioridade() { $periodo = self::getPeriodo(); $prioridades = DB::table('manutencao_solicitacao as solicitacao') ->join('cadastro_servico_manutencao as servico', 'servico.id', 'solicitacao.servico_id') ->join('manutencao_prioridade_tipo as prioridade', 'prioridade.id', 'servico.prioridade_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitacao.infraestrutura_solicitante_id') ->where('solicitacao.created_at', '>=', $periodo['data_inicial']) ->where('solicitacao.created_at', '<=', $periodo['data_final']) ->selectRaw(' prioridade.id as id, prioridade.nome as nome '); $prioridades = self::getQueryParams($prioridades); $prioridades = $prioridades ->distinct() ->get() ->toArray(); $form = array_map(function ($prioridade) { return [ 'id' => $prioridade->id, 'nome' => $prioridade->nome, ]; }, $prioridades); return $form; } }