all(); $agendamentosBuilder = self::getAgendamentosBuilder(); if (!$agendamentosBuilder) { return []; } $agendamentosBuilder = $agendamentosBuilder ->select( 'exame_imagem_jornada.id', 'exame_imagem_jornada.vagas', 'exame_imagem_jornada.status_id AS status_jornada', 'exame_imagem_jornada.unidade_id', 'exame_imagem_jornada_status.nome AS status_nome', 'exame_imagem_jornada_semana.nome AS nome_semana', 'exame_imagem_jornada.semana_id AS semana_id', 'exame_imagem_jornada.controle_jornada_id AS tipo_jornada', 'exame_imagem_jornada.usuario_id', 'cadastro_grupo.nome AS grupo', 'cadastro_grupo.id AS grupo_exame_id', 'profissional.nome AS profissional_nome', 'ocupacao.nome AS ocupacao_nome', DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'), DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'), DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"), DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"), ); return $agendamentosBuilder ->orderBy('exame_imagem_jornada.data') ->get() ->map(function ($jornada) { return [ 'data' => $jornada->data, 'profissional_nome' => $jornada->profissional_nome, 'grupo' => $jornada->grupo, 'nome_semana' => $jornada->nome_semana, 'hora_inicial' => $jornada->hora_inicial, 'hora_fim' => $jornada->hora_fim, 'status_nome' => $jornada->status_nome, 'jornada_id' => $jornada->id, 'vagas' => $jornada->vagas, 'tipo_jornada' => $jornada->tipo_jornada, 'agendamentos' => Agendamento::where('jornada_id', $jornada->id) ->get() ->map(function ($query) use ($jornada) { return [ 'jornada_id' => $query->jornada_id, 'profissional_id' => $query->profissional_id, 'profissional' => $jornada->profissional_nome, ]; }), 'soma' => Agendamento::where('jornada_id', $jornada->id) ->get() ->map(function ($query) use ($jornada) { return [ 'jornada_id' => $query->jornada_id, 'profissional_id' => $query->profissional_id, 'profissional' => $jornada->profissional_nome, ]; }) ->count(), ]; }); } private static function getAgendamentosBuilder() { if (!request()->get('periodo')) { return null; } $params = request()->all(); $agendamentos = DB::table('exame_imagem_jornada') ->join( 'exame_imagem_jornada_status', 'exame_imagem_jornada_status.id', 'exame_imagem_jornada.status_id' ) ->join( 'exame_imagem_jornada_semana', 'exame_imagem_jornada_semana.id', 'exame_imagem_jornada.semana_id' ) ->join( 'cadastro_grupo', 'cadastro_grupo.id', 'exame_imagem_jornada.exame_id' ) ->join( 'cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_jornada.usuario_id' ) ->join( 'cadastro_cidadao AS profissional', 'profissional.id', 'cadastro_usuario.cidadao_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id' ) ->join( 'sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id' ) ->orderBy('exame_imagem_jornada.data') ->whereBetween('exame_imagem_jornada.data', [ Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0), Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59) ]) ->where(function ($query) use ($params) { if (!is_null($params['unidade_id'])) { $query->where('exame_imagem_jornada.unidade_id', $params['unidade_id']); } }) ->where(function ($query) use ($params) { if (!is_null($params['grupo_exame_id'])) { $query->where('exame_imagem_jornada.exame_id', $params['grupo_exame_id']); } }) ->where(function ($query) use ($params) { if (!is_null($params['profissional_id'])) { $query->where('exame_imagem_jornada.usuario_id', $params['profissional_id']); } }); return $agendamentos; } public static function list() { $now = Carbon::now(); $currentDate = $now->format('d/m/Y'); $currentLotacao = self::getCurrentLotacao(); return [ 'form' => self::getForm(), 'model' => [ 'periodo' => [ 'start' => $currentDate, 'end' => $currentDate, ], 'atendimento' => null, 'prontuario' => null, 'lancamentos' => [], 'paciente' => null, 'exame' => null, 'relatorioCotaProfissional' => self::getCotaProfissional(), ], 'additionals' => [ 'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'), 'current_date' => $now->format('d/m/Y') ] ]; } public static function datatable(Request $request) { $agendamentos = DB::table('exame_imagem_jornada') ->select( 'exame_imagem_jornada.id', 'exame_imagem_jornada.status_id AS status_jornada', 'exame_imagem_jornada.unidade_id', 'exame_imagem_jornada.vagas', 'exame_imagem_jornada_status.nome AS status_nome', 'exame_imagem_jornada_semana.nome AS nome_semana', 'exame_imagem_jornada.semana_id AS semana_id', 'exame_imagem_jornada.controle_jornada_id AS tipo_jornada', 'exame_imagem_jornada.usuario_id', 'cadastro_grupo.nome AS grupo', 'cadastro_grupo.id AS grupo_id', 'profissional.nome AS profissional_nome', 'ocupacao.nome AS ocupacao_nome', DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'), DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'), DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"), DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"), ) ->join( 'exame_imagem_jornada_status', 'exame_imagem_jornada_status.id', 'exame_imagem_jornada.status_id' ) ->join( 'exame_imagem_jornada_semana', 'exame_imagem_jornada_semana.id', 'exame_imagem_jornada.semana_id' ) ->join( 'cadastro_grupo', 'cadastro_grupo.id', 'exame_imagem_jornada.exame_id' ) ->join( 'cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_jornada.usuario_id' ) ->join( 'cadastro_cidadao AS profissional', 'profissional.id', 'cadastro_usuario.cidadao_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id' ) ->join( 'sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id' ) ->whereBetween('exame_imagem_jornada.data', [ Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0), Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59) ]) ->when($request->unidade_id, function ($query, $value) { $query->where('exame_imagem_jornada.unidade_id', $value); }) ->when($request->grupo_exame_id, function ($query, $value) { $query->where('exame_imagem_jornada.exame_id', $value); }) ->when($request->profissional_id, function ($query, $value) { $query->where('exame_imagem_jornada.usuario_id', $value); }) ->when($request->status_id, function ($query, $value) { $query->where('exame_imagem_jornada.status_id', $value); }); $agendamentos = $agendamentos->get(); return $agendamentos ->map(function ($jornada) { return [ 'data' => $jornada->data, 'grupo' => $jornada->grupo, 'status_nome' => $jornada->status_nome, 'nome_semana' => $jornada->nome_semana, 'profissional_nome' => $jornada->profissional_nome, 'hora_inicial' => $jornada->hora_inicial, 'hora_fim' => $jornada->hora_fim, 'jornada' => $jornada->id, 'vagas' => $jornada->vagas, 'tipo_jornada' => $jornada->tipo_jornada, 'agendamentos' => Agendamento::where('jornada_id', $jornada->id) ->get() ->map(function ($query) use ($jornada){ return [ 'jornada_id' => $query->jornada_id, 'profissional_id' => $query->profissional_id, 'profissional' => $jornada->profissional_nome, ]; }), 'soma' => Agendamento::where('jornada_id', $jornada->id) ->get() ->count(), ]; }); } private static function getCotaProfissional() { $agendamentos = DB::table('exame_imagem_jornada') ->select( 'exame_imagem_jornada.id', 'exame_imagem_jornada.status_id AS status_jornada', 'exame_imagem_jornada.unidade_id', 'exame_imagem_jornada_status.id AS status_id', 'exame_imagem_jornada_status.nome AS status_nome', 'exame_imagem_jornada_semana.nome AS nome_semana', 'exame_imagem_jornada.semana_id AS semana_id', 'exame_imagem_jornada.controle_jornada_id AS tipo_jornada', 'exame_imagem_jornada.usuario_id AS profissional_id', 'cadastro_grupo.nome AS grupo', 'cadastro_grupo.id AS grupo_exame_id', 'profissional.nome AS profissional_nome', 'ocupacao.nome AS ocupacao_nome', 'cadastro_unidade.nome_fantasia', DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'), DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'), DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"), DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"), ) ->join( 'exame_imagem_jornada_status', 'exame_imagem_jornada_status.id', 'exame_imagem_jornada.status_id' ) ->join( 'exame_imagem_jornada_semana', 'exame_imagem_jornada_semana.id', 'exame_imagem_jornada.semana_id' ) ->join( 'cadastro_grupo', 'cadastro_grupo.id', 'exame_imagem_jornada.exame_id' ) ->join( 'cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_jornada.usuario_id' ) ->join( 'cadastro_cidadao AS profissional', 'profissional.id', 'cadastro_usuario.cidadao_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id' ) ->join( 'sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id' ) ->join( 'cadastro_unidade', 'cadastro_unidade.id', 'exame_imagem_jornada.unidade_id' ); $agendamentos = $agendamentos->get(); return $agendamentos; } private static function getForm() { return [ 'unidades' => self::getUnidadesExecutantes(), 'grupos' => self::getGrupos(), 'status' => self::getStatus(), 'profissionais' => self::getProfissionais(), ]; } private static function getUnidadesExecutantes() { return Unidade::orderBy('nome_fantasia') ->get() ->map(function ($query) { return [ 'id' => $query->id, 'nome_fantasia' => $query->nome_fantasia, 'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, 'principal' => $infraestrutura->principal, ])->values() ]; }); } private static function getGrupos() { return Exame::whereNotNull('grupo_tipo_id') ->groupBy('grupo_tipo_id') ->get() ->map(function ($query) { return [ 'id' => $query->grupo->id, 'nome' => $query->grupo->nome, ]; }) ->values(); } private static function getStatus() { return StatusJornada::orderBy('id') ->get() ->map(fn ($statusJornadas) => [ 'id' => $statusJornadas->id, 'nome' => $statusJornadas->nome ]) ->values(); } private static function getProfissionais() { return Usuario::orderBy('cidadao_id') ->get() ->map(function ($query) { return [ 'id' => $query->id, 'nome' => $query->cidadao->nome, ]; }) ->values(); } }