Загрузка данных


@Query("""
            SELECT DISTINCT m2.userName
                        FROM Member m1 JOIN Member m2 ON m1.questionId = m2.questionId
                                        JOIN QuestionCreditcom q ON q.id = m1.questionId
                        WHERE m1.userName = :userName AND m2.role = 'INITIATOR' AND q.type IN :types
            """)
    Set<String> findInitiatorUserNamesForMemberAndTypes(@Param("userName") String userName, @Param("types") Set<QuestionType> types);


AvailableCommitteesResponse getAvailableCommittees(Set<QuestionStage> stages, Set<QuestionType> types);

    List<CollectionInitiatorResponse.Initiator> getAvailableInitiators();

    /**
     * То же самое, что {@link #getAvailableInitiators()}, но дополнительно ограничивает вопросы,
     * из которых берутся инициаторы, заданным набором типов вопроса.
     *
     * @param types типы вопросов, среди которых ищутся инициаторы; {@code null}/пусто — без ограничения по типу.
     */
    List<CollectionInitiatorResponse.Initiator> getAvailableInitiators(Set<QuestionType> types);


if (actualStatuses == null) {
            committees = CollectionUtils.isEmpty(types)
                    ? questionCreditcomRepository.findDistinctCommitteesByQuestionIds(currentUserQuestions, checkStrict810)
                    : questionCreditcomRepository.findDistinctCommitteesByQuestionIdsAndTypes(currentUserQuestions, types, checkStrict810);
        } else if (actualStatuses.isEmpty()) {
            committees = Collections.emptyList();
        } else {
            committees = CollectionUtils.isEmpty(types)
                    ? questionCreditcomRepository.findDistinctCommitteesByQuestionIdsAndStatuses(currentUserQuestions,
                            actualStatuses, checkStrict810)
                    : questionCreditcomRepository.findDistinctCommitteesByQuestionIdsAndStatusesAndTypes(currentUserQuestions,
                            actualStatuses, types, checkStrict810);
        }

@Query("""
            SELECT DISTINCT new ru.vtb.dc.question.api.v1.dto.CommitteeInfoDto(
                q.committeeCode,
                q.committeeShortName,
                q.committee
            )
            FROM QuestionCreditcom q
            WHERE q.id IN :questionIds
              AND q.type IN :types
              AND q.isDeleted = FALSE
              AND q.committeeShortName IS NOT NULL
              AND (:checkStrict810 = FALSE OR q.isStrict810 = FALSE)
            ORDER BY q.committeeShortName
            """)
    List<CommitteeInfoDto> findDistinctCommitteesByQuestionIdsAndTypes(
            @Param("questionIds") Set<UUID> questionIds,
            @Param("types") Set<QuestionType> types,
            @Param("checkStrict810") boolean checkStrict810
    );

    @Query("""
            SELECT DISTINCT new ru.vtb.dc.question.api.v1.dto.CommitteeInfoDto(
                q.committeeCode,
                q.committeeShortName,
                q.committee
            )
            FROM QuestionCreditcom q
            WHERE q.id IN :questionIds
              AND q.type IN :types
              AND q.isDeleted = FALSE
              AND q.committeeShortName IS NOT NULL
              AND q.status IN :statuses
              AND (:checkStrict810 = FALSE OR q.isStrict810 = FALSE)
            ORDER BY q.committeeShortName
            """)
    List<CommitteeInfoDto> findDistinctCommitteesByQuestionIdsAndStatusesAndTypes(
            @Param("questionIds") Set<UUID> questionIds,
            @Param("statuses") Set<String> statuses,
            @Param("types") Set<QuestionType> types,
            @Param("checkStrict810") boolean checkStrict810
    );

@PreAuthorize("isAuthenticated()")
    @GetMapping("v1/questions/smb/committees")
    public AvailableCommitteesResponse getAvailableCommittees(
            @RequestParam(value = "stages", required = false) Set<QuestionStage> stages) {
        getCounter.increment();
        return questionSmbService.getAvailableCommittees(stages);
    }

    @PreAuthorize("isAuthenticated()")
    @GetMapping("v1/questions/smb/initiators")
    public CollectionInitiatorResponse getAvailableInitiators() {
        getCounter.increment();
        return CollectionInitiatorResponse.builder()
                .initiators(questionSmbService.getAvailableInitiators())
                .build();
    }

/**
     * Список уникальных комитетов из SMB-вопросов, доступных текущему пользователю. В отличие от
     * {@code CreditcomWorkSpaceService.getAvailableCommittees}, не включает комитеты из КИБ-вопросов,
     * недоступных на дашборде ФРКК.
     */
    AvailableCommitteesResponse getAvailableCommittees(Set<QuestionStage> stages);

    /**
     * Список уникальных инициаторов из SMB-вопросов, доступных текущему пользователю.
     */
    List<CollectionInitiatorResponse.Initiator> getAvailableInitiators();

@Override
    public AvailableCommitteesResponse getAvailableCommittees(Set<QuestionStage> stages) {
        return creditcomWorkSpaceService.getAvailableCommittees(stages, SMB_TYPES);
    }

    @Override
    public List<CollectionInitiatorResponse.Initiator> getAvailableInitiators() {
        return creditcomWorkSpaceService.getAvailableInitiators(SMB_TYPES);
    }