select( 'cadastro_usuario.id', 'cadastro_usuario.cidadao_id', 'cadastro_cidadao.nome', 'cadastro_cidadao.cpf', 'cadastro_usuario.bloqueado', 'cadastro_lotacao.usuario_id', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'ocupacao.nome AS ocupacao_nome', DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") as data_nascimento') ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.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( 'exame_imagem_parametrizacao_ocupacao', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id' ) ->where('cadastro_usuario.bloqueado', '=', '0') ->whereNull('cadastro_lotacao.deleted_at') ->whereNull('exame_imagem_parametrizacao_ocupacao.deleted_at') ->groupBy('cadastro_usuario.id'); return $gerenciamentoJornadas; } public static function show($id) { $usuario = Usuario::findOrFail($id); $controleJornada = ControleJornada::select('tipo_controle')->first(); $integracaoAplicativo = IntegracaoAplicativo::first(); return [ 'form' => [ 'habilita_agendamento_app' => $integracaoAplicativo->habilita_agendamento_conectasus_cidadao ?? false, 'unidadesParametrizadas' => Parametrizacao::where('executante', true) ->orderBy('unidade_id') ->get() ->unique('unidade_id') ->map(fn($query) => [ 'id' => $query->id, 'unidade_id' => $query->unidade_id, 'nome_fantasia' => $query->unidade->nome_fantasia, 'infraestruturas' => $query->unidade->infraestruturas ->sortBy('nome') ->map(fn($infraestrutura) => [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, 'principal' => $infraestrutura->principal, ]) ->values() ]) ->values(), 'feriados' => Feriado::orderBy('id') ->get() ->map(fn ($feriado) => [ 'id' => $feriado->id, 'data' => (new Carbon($feriado->data))->format('d/m/Y') ?? null, 'tipo_id' => $feriado->tipo_id, 'tipo_nome' => $feriado->tipo->descricao, 'observacao' => $feriado->observacao, 'modulos' => $feriado->modulos->pluck('id'), ]), 'exames' => Exame::whereNotNull('grupo_tipo_id') ->where('tipo_id', Tipo::IMAGEM) ->groupBy('grupo_tipo_id') ->get() ->map(function ($query) { return [ 'id' => $query->grupo->id, 'nome' => $query->grupo->nome, ]; }) ->values(), 'dias_semana' => SemanaJornada::orderBy('id') ->get() ->map(fn ($semanaJornadas) => [ 'id' => $semanaJornadas->id, 'nome' => $semanaJornadas->nome, 'disabled' => true, ]), 'status' => StatusJornada::orderBy('id') ->get() ->map(fn ($statusJornadas) => [ 'id' => $statusJornadas->id, 'nome' => $statusJornadas->nome ]), 'prestadores' => Unidade::whereHas('parametrizacaoExameImagem', function ($query) { $query->where('prestador', true); }) ->orderBy('nome_fantasia') ->get() ->map(fn ($unidade) => [ 'unidade_id' => $unidade->id, 'nome_fantasia' => $unidade->nome_fantasia, 'prestador' => $unidade->parametrizacaoExameImagem->prestador, 'prestador_id' => $unidade->parametrizacaoExameImagem->id, ]) ->unique('unidade_id') ->values(), 'tipos' => TipoJornada::orderBy('id') ->get() ->map(fn ($tipo) => [ 'id' => $tipo->id, 'nome' => $tipo->nome ]), 'controleJornada' => $controleJornada->tipo_controle, 'min_date' => Carbon::now()->subDays(90)->format('d/m/Y'), 'max_date' => Carbon::now()->addYear()->format('d/m/Y'), 'profissional' => [ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome, 'data_nascimento' => is_null($usuario->cidadao->data_nascimento) ? null : (new Carbon($usuario->cidadao->data_nascimento))->format('d/m/Y'), 'cns' => MaskUtil::getCnsMasked($usuario->cidadao->cns), 'cpf' => MaskUtil::getCpfMasked($usuario->cidadao->cpf), ], ], 'model' => [ 'data_atual' => Carbon::now()->format('Y-m-d'), 'jornadas' => DB::table('exame_imagem_jornada as jornadas') ->leftJoin('cadastro_unidade as unidades', 'jornadas.unidade_id', '=', 'unidades.id') ->leftJoin('exame_imagem_jornada_tipo as tipos', 'jornadas.tipo_id', '=', 'tipos.id') ->leftJoin('exame_imagem_jornada_status as status', 'jornadas.status_id', '=', 'status.id') ->leftJoin('cadastro_infraestrutura as infraestruturas', 'jornadas.infraestrutura_id', '=', 'infraestruturas.id') ->leftJoin('exame_imagem_parametrizacao_unidade as prestador', 'jornadas.prestador_id', '=', 'prestador.id') ->leftJoin('cadastro_unidade as prestador_unidade', 'prestador.unidade_id', '=', 'prestador_unidade.id') ->leftJoin('cadastro_grupo', 'jornadas.exame_id', '=', 'cadastro_grupo.id') ->where('jornadas.usuario_id', $id) ->select([ '*', 'jornadas.id as jornada_id', 'jornadas.unidade_id', 'unidades.nome_fantasia as unidade_nome', 'prestador_unidade.nome_fantasia as prestador_nome', 'jornadas.infraestrutura_id', 'infraestruturas.nome as infraestrutura_nome', 'infraestruturas.principal as infraestrutura_principal', 'jornadas.usuario_id', 'jornadas.exame_id', 'jornadas.semana_id', 'jornadas.status_id', 'jornadas.prestador_id', 'status.nome as status_nome', 'cadastro_grupo.nome as exame_nome', 'jornadas.tipo_id', 'tipos.nome as tipo_nome' ]) ->get() ->map(function ($jornada) { $agendamentos = DB::table('exame_imagem_agendamento as agendamento') ->leftJoin('exame_imagem_agendamento_exame as agendamento_exame', 'agendamento_exame.agendamento_id', '=', 'agendamento.id') ->where('agendamento.jornada_id', $jornada->jornada_id) ->where(function ($query) { $query->whereNotIn('agendamento_exame.status_id', [Status::CANCELADO, Status::REAGENDADO]) ->orWhereNull('agendamento_exame.status_id'); }) ->count(); $vinculos = DB::table('exame_imagem_agendamento as agendamento') ->join('exame_imagem_agendamento_exame as agendamento_exame', 'agendamento_exame.agendamento_id', '=', 'agendamento.id') ->where('agendamento.jornada_id', $jornada->jornada_id) ->exists(); $primeiroHorario = DB::table('exame_imagem_agendamento')->where('jornada_id', $jornada->jornada_id) ->orderBy('hora_exame', 'asc') ->value('hora_exame'); $ultimoHorario = DB::table('exame_imagem_agendamento')->where('jornada_id', $jornada->jornada_id) ->orderBy('hora_exame', 'desc') ->value('hora_exame'); return [ 'jornada_id' => $jornada->jornada_id, 'unidade_id' => $jornada->unidade_id, 'unidade_nome' => $jornada->unidade_nome, 'infraestrutura_id' => $jornada->infraestrutura_id, 'infraestrutura_nome' => $jornada->infraestrutura_principal ? $jornada->unidade_nome : $jornada->infraestrutura_nome, 'usuario_id' => $jornada->usuario_id, 'usuario_nome' => $jornada->usuario->nome ?? null, 'exame_id' => $jornada->exame_id, 'exame_nome' => $jornada->exame_nome ?? null, 'semana_id' => $jornada->semana_id, 'dias_semana' => [$jornada->semana_id], 'status_id' => $jornada->status_id, 'status_nome' => $jornada->status_nome ?? null, 'tipo_id' => $jornada->tipo_id, 'tipo_nome' => $jornada->tipo_nome ?? null, 'data' => (new Carbon($jornada->data))->format('Y-m-d') ?? null, 'periodo' => [ 'start' => (new Carbon($jornada->data))->format('d/m/Y') ?? null, 'end' => (new Carbon($jornada->data))->format('d/m/Y') ?? null, ], 'prestador_id' => $jornada->prestador_id ?? null, 'prestador_nome' => $jornada->prestador_id ? $jornada->prestador_nome : null, 'hora_inicial' => (new Carbon($jornada->hora_inicial))->format('H:i') ?? null, 'hora_fim' => (new Carbon($jornada->hora_fim))->format('H:i') ?? null, 'vagas' => $jornada->vagas ?? null, 'vagas_app' => $jornada->vagas_app ?? null, 'tempo_atendimento' => $jornada->tempo_atendimento ?? null, 'selecionado' => false, 'seleciona_agendamento' => false, 'controle_jornada_id' => $jornada->controle_jornada_id, 'agendamentos' => $agendamentos, 'primeiro_horario' => $primeiroHorario, 'ultimo_horario' => $ultimoHorario, 'vagas_disponiveis' => (($jornada->vagas + ($jornada->vagas_app ?? 0)) - $agendamentos) >= 0 ? (($jornada->vagas + ($jornada->vagas_app ?? 0)) - $agendamentos) : 0, 'vinculos' => $vinculos, ]; }), 'jornadasNotSave' => [], 'periodo' => [ 'start' => Carbon::now()->format('d/m/Y'), 'end' => Carbon::now()->format('d/m/Y'), ], 'usuario_id' => $usuario->id ], ]; } public static function store(Request $request) { DB::transaction(function () use ($request) { self::validate($request); self::saveJornada($request); }); } private static function saveJornada($request) { $ids = []; foreach ($request->jornadas as $params) { $tipo = Jornada::find($params['jornada_id']) ?? new Jornada(); $tipo->fill($params); $tipo->save(); $ids[] = $tipo->id; } if(!empty($request->jornadas_delete)){ Jornada::whereIn('id', $request->jornadas_delete)->delete(); } } public static function getSupervisores($request) { return [ 'supervisores' => Supervisor::where('usuario_id', $request->supervisor_id) ->get() ->map(fn ($supervisor) => [ 'id' => $supervisor->id, 'usuario_id' => $supervisor->usuario_id, 'nome' => $supervisor->usuario->cidadao->nome, 'cpf' => $supervisor->usuario->cidadao->cpf, ]), ]; } private static function validate($request) { $validations = [ 'jornadas.*.vagas' => [ 'min:1', ], 'jornadas.*.hora_inicial' => [ 'required', ], 'jornadas.*.hora_fim' => [ 'required', ] ]; $messages = [ 'jornadas.*.vagas.min' => 'Há jornadas sem quantidade necessário de vagas.', 'jornadas.*.hora_inicial.required' => 'Há jornadas sem horário inicial preenchido.', 'jornadas.*.hora_fim.required' => 'Há jornadas sem horário final preenchido.', ]; return $request->validate($validations, $messages); } }