// (C) Copyright 2015 Moodle Pty Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import { Injectable } from '@angular/core'; import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; import { CoreSite } from '@classes/sites/site'; import { CoreCommentsArea } from '@features/comments/services/comments'; import { CoreCourseSummary } from '@features/course/services/course'; import { CoreUserSummary } from '@features/user/services/user'; import { CoreSites } from '@services/sites'; import { CoreUtils } from '@services/utils/utils'; import { makeSingleton } from '@singletons'; const ROOT_CACHE_KEY = 'mmaCompetency:'; /** * Service to handle caompetency learning plans. */ @Injectable( { providedIn: 'root' }) export class AddonCompetencyProvider { // Learning plan status. static readonly STATUS_DRAFT = 0; static readonly STATUS_ACTIVE = 1; static readonly STATUS_COMPLETE = 2; static readonly STATUS_WAITING_FOR_REVIEW = 3; static readonly STATUS_IN_REVIEW = 4; // Competency status. static readonly REVIEW_STATUS_IDLE = 0; static readonly REVIEW_STATUS_WAITING_FOR_REVIEW = 1; static readonly REVIEW_STATUS_IN_REVIEW = 2; /** * Check if all competencies features are disabled. * * @param siteId Site ID. If not defined, current site. * @returns Promise resolved with boolean: whether all competency features are disabled. */ async allCompetenciesDisabled(siteId?: string): Promise { const site = await CoreSites.getSite(siteId); return site.isFeatureDisabled('CoreMainMenuDelegate_AddonCompetency') && site.isFeatureDisabled('CoreCourseOptionsDelegate_AddonCompetency') && site.isFeatureDisabled('CoreUserDelegate_AddonCompetency'); } /** * Returns whether current user can see another user competencies in a course. * * @param courseId Course ID. * @param userId User ID. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved with boolean: whether the user can view the competencies. */ async canViewUserCompetenciesInCourse(courseId: number, userId?: number, siteId?: string): Promise { if (!CoreSites.isLoggedIn()) { return false; } try { const response = await this.getCourseCompetenciesPage(courseId, siteId); if (!response.competencies.length) { // No competencies. return false; } if (!userId || userId == CoreSites.getCurrentSiteUserId()) { // Current user. return true; } // Check if current user can view any competency of the user. await this.getCompetencyInCourse(courseId, response.competencies[0].competency.id, userId, siteId); return true; } catch { return false; } } /** * Get cache key for user learning plans data WS calls. * * @param userId User ID. * @returns Cache key. */ protected getLearningPlansCacheKey(userId: number): string { return ROOT_CACHE_KEY + 'userplans:' + userId; } /** * Get cache key for learning plan data WS calls. * * @param planId Plan ID. * @returns Cache key. */ protected getLearningPlanCacheKey(planId: number): string { return ROOT_CACHE_KEY + 'learningplan:' + planId; } /** * Get cache key for competency in plan data WS calls. * * @param planId Plan ID. * @param competencyId Competency ID. * @returns Cache key. */ protected getCompetencyInPlanCacheKey(planId: number, competencyId: number): string { return ROOT_CACHE_KEY + 'plancompetency:' + planId + ':' + competencyId; } /** * Get cache key for competency in course data WS calls. * * @param courseId Course ID. * @param competencyId Competency ID. * @param userId User ID. * @returns Cache key. */ protected getCompetencyInCourseCacheKey(courseId: number, competencyId: number, userId: number): string { return ROOT_CACHE_KEY + 'coursecompetency:' + userId + ':' + courseId + ':' + competencyId; } /** * Get cache key for competency summary data WS calls. * * @param competencyId Competency ID. * @param userId User ID. * @returns Cache key. */ protected getCompetencySummaryCacheKey(competencyId: number, userId: number): string { return ROOT_CACHE_KEY + 'competencysummary:' + userId + ':' + competencyId; } /** * Get cache key for course competencies data WS calls. * * @param courseId Course ID. * @returns Cache key. */ protected getCourseCompetenciesCacheKey(courseId: number): string { return ROOT_CACHE_KEY + 'coursecompetencies:' + courseId; } /** * Returns whether competencies are enabled. * * @param courseId Course ID. * @param siteId Site ID. If not defined, current site. * @returns competencies if enabled for the given course, false otherwise. */ async isPluginForCourseEnabled(courseId: number, siteId?: string): Promise { if (!CoreSites.isLoggedIn()) { return false; } return CoreUtils.promiseWorks(this.getCourseCompetencies(courseId, undefined, siteId)); } /** * Get plans for a certain user. * * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise to be resolved when the plans are retrieved. */ async getLearningPlans(userId?: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); const params: AddonCompetencyDataForPlansPageWSParams = { userid: userId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getLearningPlansCacheKey(userId), updateFrequency: CoreSite.FREQUENCY_RARELY, }; const response = await site.read('tool_lp_data_for_plans_page', params, preSets); return response.plans; } /** * Get a certain plan. * * @param planId ID of the plan. * @param siteId Site ID. If not defined, current site. * @returns Promise to be resolved when the plan is retrieved. */ async getLearningPlan(planId: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); const params: AddonCompetencyDataForPlanPageWSParams = { planid: planId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getLearningPlanCacheKey(planId), updateFrequency: CoreSite.FREQUENCY_RARELY, }; return site.read('tool_lp_data_for_plan_page', params, preSets); } /** * Get a certain competency in a plan. * * @param planId ID of the plan. * @param competencyId ID of the competency. * @param siteId Site ID. If not defined, current site. * @returns Promise to be resolved when the competency is retrieved. */ async getCompetencyInPlan( planId: number, competencyId: number, siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); const params: AddonCompetencyDataForUserCompetencySummaryInPlanWSParams = { planid: planId, competencyid: competencyId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getCompetencyInPlanCacheKey(planId, competencyId), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, }; return site.read( 'tool_lp_data_for_user_competency_summary_in_plan', params, preSets, ); } /** * Get a certain competency in a course. * * @param courseId ID of the course. * @param competencyId ID of the competency. * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @param ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @returns Promise to be resolved when the competency is retrieved. */ async getCompetencyInCourse( courseId: number, competencyId: number, userId?: number, siteId?: string, ignoreCache = false, ): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); const params: AddonCompetencyDataForUserCompetencySummaryInCourseWSParams = { courseid: courseId, competencyid: competencyId, userid: userId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getCompetencyInCourseCacheKey(courseId, competencyId, userId), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, }; if (ignoreCache) { preSets.getFromCache = false; preSets.emergencyCache = false; } return site.read('tool_lp_data_for_user_competency_summary_in_course', params, preSets); } /** * Get a certain competency summary. * * @param competencyId ID of the competency. * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @param ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @returns Promise to be resolved when the competency summary is retrieved. */ async getCompetencySummary( competencyId: number, userId?: number, siteId?: string, ignoreCache = false, ): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); const params: AddonCompetencyDataForUserCompetencySummaryWSParams = { competencyid: competencyId, userid: userId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getCompetencySummaryCacheKey(competencyId, userId), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, }; if (ignoreCache) { preSets.getFromCache = false; preSets.emergencyCache = false; } return site.read('tool_lp_data_for_user_competency_summary', params, preSets); } /** * Get all competencies in a course for a certain user. * * @param courseId ID of the course. * @param userId ID of the user. * @param siteId Site ID. If not defined, current site. * @param ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @returns Promise to be resolved when the course competencies are retrieved. */ async getCourseCompetencies( courseId: number, userId?: number, siteId?: string, ignoreCache = false, ): Promise { const courseCompetencies = await this.getCourseCompetenciesPage(courseId, siteId, ignoreCache); if (!userId || userId == CoreSites.getCurrentSiteUserId()) { return courseCompetencies; } const userCompetenciesSumaries: AddonCompetencyDataForUserCompetencySummaryInCourseWSResponse[] = await Promise.all(courseCompetencies.competencies.map((competency) => this.getCompetencyInCourse(courseId, competency.competency.id, userId, siteId))); userCompetenciesSumaries.forEach((userCompetenciesSumary, index) => { courseCompetencies.competencies[index].usercompetencycourse = userCompetenciesSumary.usercompetencysummary.usercompetencycourse; }); return courseCompetencies; } /** * Get all competencies in a course. * * @param courseId ID of the course. * @param siteId Site ID. If not defined, current site. * @param ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @returns Promise to be resolved when the course competencies are retrieved. */ async getCourseCompetenciesPage( courseId: number, siteId?: string, ignoreCache = false, ): Promise { const site = await CoreSites.getSite(siteId); const params: AddonCompetencyDataForCourseCompetenciesPageWSParams = { courseid: courseId, }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getCourseCompetenciesCacheKey(courseId), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, }; if (ignoreCache) { preSets.getFromCache = false; preSets.emergencyCache = false; } return site.read( 'tool_lp_data_for_course_competencies_page', params, preSets, ); } /** * Invalidates User Learning Plans data. * * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateLearningPlans(userId?: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); await site.invalidateWsCacheForKey(this.getLearningPlansCacheKey(userId)); } /** * Invalidates Learning Plan data. * * @param planId ID of the plan. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateLearningPlan(planId: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); await site.invalidateWsCacheForKey(this.getLearningPlanCacheKey(planId)); } /** * Invalidates Competency in Plan data. * * @param planId ID of the plan. * @param competencyId ID of the competency. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateCompetencyInPlan(planId: number, competencyId: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); await site.invalidateWsCacheForKey(this.getCompetencyInPlanCacheKey(planId, competencyId)); } /** * Invalidates Competency in Course data. * * @param courseId ID of the course. * @param competencyId ID of the competency. * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); await site.invalidateWsCacheForKey(this.getCompetencyInCourseCacheKey(courseId, competencyId, userId)); } /** * Invalidates Competency Summary data. * * @param competencyId ID of the competency. * @param userId ID of the user. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); await site.invalidateWsCacheForKey(this.getCompetencySummaryCacheKey(competencyId, userId)); } /** * Invalidates Course Competencies data. * * @param courseId ID of the course. * @param userId ID of the user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the data is invalidated. */ async invalidateCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); await site.invalidateWsCacheForKey(this.getCourseCompetenciesCacheKey(courseId)); if (!userId || userId == CoreSites.getCurrentSiteUserId()) { return; } const competencies = await this.getCourseCompetencies(courseId, 0, siteId); const promises = competencies.competencies.map((competency) => this.invalidateCompetencyInCourse(courseId, competency.competency.id, userId, siteId)); await Promise.all(promises); } /** * Report the competency as being viewed in plan. * * @param planId ID of the plan. * @param competencyId ID of the competency. * @param planStatus Current plan Status to decide what action should be logged. * @param name Deprecated, not used anymore. * @param userId User ID. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the WS call is successful. */ async logCompetencyInPlanView( planId: number, competencyId: number, planStatus: number, name?: string, userId?: number, siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); const params: AddonCompetencyUserCompetencyPlanViewedWSParams = { planid: planId, competencyid: competencyId, userid: userId, }; const preSets: CoreSiteWSPreSets = { typeExpected: 'boolean', }; const wsName = planStatus == AddonCompetencyProvider.STATUS_COMPLETE ? 'core_competency_user_competency_plan_viewed' : 'core_competency_user_competency_viewed_in_plan'; await site.write(wsName, params, preSets); } /** * Report the competency as being viewed in course. * * @param courseId ID of the course. * @param competencyId ID of the competency. * @param name Deprecated, not used anymore. * @param userId User ID. If not defined, current user. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the WS call is successful. */ async logCompetencyInCourseView( courseId: number, competencyId: number, name?: string, userId?: number, siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); const params: AddonCompetencyUserCompetencyViewedInCourseWSParams = { courseid: courseId, competencyid: competencyId, userid: userId, }; const preSets: CoreSiteWSPreSets = { typeExpected: 'boolean', }; await site.write('core_competency_user_competency_viewed_in_course', params, preSets); } /** * Report the competency as being viewed. * * @param competencyId ID of the competency. * @param name Name of the competency. * @param siteId Site ID. If not defined, current site. * @returns Promise resolved when the WS call is successful. */ async logCompetencyView(competencyId: number, name?: string, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); const params: AddonCompetencyCompetencyViewedWSParams = { id: competencyId, }; const preSets: CoreSiteWSPreSets = { typeExpected: 'boolean', }; await site.write('core_competency_competency_viewed', params, preSets); } } export const AddonCompetency = makeSingleton(AddonCompetencyProvider); /** * Data returned by competency's plan_exporter. */ export type AddonCompetencyPlan = { name: string; // Name. description: string; // Description. descriptionformat?: number; // Description format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). userid: number; // Userid. templateid: number; // Templateid. origtemplateid: number; // Origtemplateid. status: number; // Status. duedate: number; // Duedate. reviewerid: number; // Reviewerid. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. statusname: string; // Statusname. isbasedontemplate: boolean; // Isbasedontemplate. canmanage: boolean; // Canmanage. canrequestreview: boolean; // Canrequestreview. canreview: boolean; // Canreview. canbeedited: boolean; // Canbeedited. isactive: boolean; // Isactive. isdraft: boolean; // Isdraft. iscompleted: boolean; // Iscompleted. isinreview: boolean; // Isinreview. iswaitingforreview: boolean; // Iswaitingforreview. isreopenallowed: boolean; // Isreopenallowed. iscompleteallowed: boolean; // Iscompleteallowed. isunlinkallowed: boolean; // Isunlinkallowed. isrequestreviewallowed: boolean; // Isrequestreviewallowed. iscancelreviewrequestallowed: boolean; // Iscancelreviewrequestallowed. isstartreviewallowed: boolean; // Isstartreviewallowed. isstopreviewallowed: boolean; // Isstopreviewallowed. isapproveallowed: boolean; // Isapproveallowed. isunapproveallowed: boolean; // Isunapproveallowed. duedateformatted: string; // Duedateformatted. commentarea: CoreCommentsArea; reviewer?: CoreUserSummary; template?: AddonCompetencyTemplate; url: string; // Url. }; /** * Data returned by competency's template_exporter. */ export type AddonCompetencyTemplate = { shortname: string; // Shortname. description: string; // Description. descriptionformat?: number; // Description format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). duedate: number; // Duedate. visible: boolean; // Visible. contextid: number; // Contextid. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. duedateformatted: string; // Duedateformatted. cohortscount: number; // Cohortscount. planscount: number; // Planscount. canmanage: boolean; // Canmanage. canread: boolean; // Canread. contextname: string; // Contextname. contextnamenoprefix: string; // Contextnamenoprefix. }; /** * Data returned by competency's competency_exporter. */ export type AddonCompetencyCompetency = { shortname: string; // Shortname. idnumber: string; // Idnumber. description: string; // Description. descriptionformat: number; // Description format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). sortorder: number; // Sortorder. parentid: number; // Parentid. path: string; // Path. ruleoutcome: number; // Ruleoutcome. ruletype: string; // Ruletype. ruleconfig: string; // Ruleconfig. scaleid: number; // Scaleid. scaleconfiguration: string; // Scaleconfiguration. competencyframeworkid: number; // Competencyframeworkid. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. }; /** * Data returned by competency's competency_path_exporter. */ export type AddonCompetencyPath = { ancestors: AddonCompetencyPathNode[]; // Ancestors. framework: AddonCompetencyPathNode; pluginbaseurl: string; // Pluginbaseurl. pagecontextid: number; // Pagecontextid. showlinks: boolean; // @since 3.7. Showlinks. }; /** * Data returned by competency's path_node_exporter. */ export type AddonCompetencyPathNode = { id: number; // Id. name: string; // Name. first: boolean; // First. last: boolean; // Last. position: number; // Position. }; /** * Data returned by competency's user_competency_exporter. */ export type AddonCompetencyUserCompetency = { userid: number; // Userid. competencyid: number; // Competencyid. status: number; // Status. reviewerid: number; // Reviewerid. proficiency: boolean; // Proficiency. grade: number; // Grade. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. canrequestreview: boolean; // Canrequestreview. canreview: boolean; // Canreview. gradename: string; // Gradename. isrequestreviewallowed: boolean; // Isrequestreviewallowed. iscancelreviewrequestallowed: boolean; // Iscancelreviewrequestallowed. isstartreviewallowed: boolean; // Isstartreviewallowed. isstopreviewallowed: boolean; // Isstopreviewallowed. isstatusidle: boolean; // Isstatusidle. isstatusinreview: boolean; // Isstatusinreview. isstatuswaitingforreview: boolean; // Isstatuswaitingforreview. proficiencyname: string; // Proficiencyname. reviewer?: CoreUserSummary; statusname: string; // Statusname. url: string; // Url. }; /** * Data returned by competency's user_competency_plan_exporter. */ export type AddonCompetencyUserCompetencyPlan = { userid: number; // Userid. competencyid: number; // Competencyid. proficiency: boolean; // Proficiency. grade: number; // Grade. planid: number; // Planid. sortorder: number; // Sortorder. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. gradename: string; // Gradename. proficiencyname: string; // Proficiencyname. }; /** * Params of tool_lp_data_for_user_competency_summary_in_plan WS. */ type AddonCompetencyDataForUserCompetencySummaryInPlanWSParams = { competencyid: number; // Data base record id for the competency. planid: number; // Data base record id for the plan. }; /** * Data returned by competency's user_competency_summary_in_plan_exporter. */ export type AddonCompetencyDataForUserCompetencySummaryInPlanWSResponse = { usercompetencysummary: AddonCompetencyDataForUserCompetencySummaryWSResponse; plan: AddonCompetencyPlan; }; /** * Params of tool_lp_data_for_user_competency_summary WS. */ type AddonCompetencyDataForUserCompetencySummaryWSParams = { userid: number; // Data base record id for the user. competencyid: number; // Data base record id for the competency. }; /** * Data returned by competency's user_competency_summary_exporter. */ export type AddonCompetencyDataForUserCompetencySummaryWSResponse = { showrelatedcompetencies: boolean; // Showrelatedcompetencies. cangrade: boolean; // Cangrade. competency: AddonCompetencySummary; user: CoreUserSummary; usercompetency?: AddonCompetencyUserCompetency; usercompetencyplan?: AddonCompetencyUserCompetencyPlan; usercompetencycourse?: AddonCompetencyUserCompetencyCourse; evidence: AddonCompetencyEvidence[]; // Evidence. commentarea?: CoreCommentsArea; }; /** * Data returned by competency's competency_summary_exporter. */ export type AddonCompetencySummary = { linkedcourses: CoreCourseSummary; // Linkedcourses. relatedcompetencies: AddonCompetencyCompetency[]; // Relatedcompetencies. competency: AddonCompetencyCompetency; framework: AddonCompetencyFramework; hascourses: boolean; // Hascourses. hasrelatedcompetencies: boolean; // Hasrelatedcompetencies. scaleid: number; // Scaleid. scaleconfiguration: string; // Scaleconfiguration. taxonomyterm: string; // Taxonomyterm. comppath: AddonCompetencyPath; pluginbaseurl: string; // @since 3.7. Pluginbaseurl. }; /** * Data returned by competency's competency_framework_exporter. */ export type AddonCompetencyFramework = { shortname: string; // Shortname. idnumber: string; // Idnumber. description: string; // Description. descriptionformat: number; // Description format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). visible: boolean; // Visible. scaleid: number; // Scaleid. scaleconfiguration: string; // Scaleconfiguration. contextid: number; // Contextid. taxonomies: string; // Taxonomies. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. canmanage: boolean; // Canmanage. competenciescount: number; // Competenciescount. contextname: string; // Contextname. contextnamenoprefix: string; // Contextnamenoprefix. }; /** * Data returned by competency's user_competency_course_exporter. */ export type AddonCompetencyUserCompetencyCourse = { userid: number; // Userid. courseid: number; // Courseid. competencyid: number; // Competencyid. proficiency: boolean; // Proficiency. grade: number; // Grade. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. gradename: string; // Gradename. proficiencyname: string; // Proficiencyname. }; /** * Data returned by competency's evidence_exporter. */ export type AddonCompetencyEvidence = { usercompetencyid: number; // Usercompetencyid. contextid: number; // Contextid. action: number; // Action. actionuserid: number; // Actionuserid. descidentifier: string; // Descidentifier. desccomponent: string; // Desccomponent. desca: string; // Desca. url: string; // Url. grade: number; // Grade. note: string; // Note. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. actionuser?: CoreUserSummary; description: string; // Description. gradename: string; // Gradename. userdate: string; // Userdate. candelete: boolean; // Candelete. }; /** * Params of tool_lp_data_for_user_competency_summary_in_course WS. */ type AddonCompetencyDataForUserCompetencySummaryInCourseWSParams = { userid: number; // Data base record id for the user. competencyid: number; // Data base record id for the competency. courseid: number; // Data base record id for the course. }; /** * Data returned by tool_lp_data_for_user_competency_summary_in_course WS. * * WS Description: Load a summary of a user competency. */ export type AddonCompetencyDataForUserCompetencySummaryInCourseWSResponse = { usercompetencysummary: AddonCompetencyDataForUserCompetencySummaryWSResponse; course: CoreCourseSummary; coursemodules: AddonCompetencyCourseModuleInfo[]; // Coursemodules. plans: AddonCompetencyPlan[]; // @since 3.7. Plans. pluginbaseurl: string; // @since 3.7. Pluginbaseurl. }; /** * Data returned by competency's course_competency_settings_exporter. */ export type AddonCompetencyCourseCompetencySettings = { courseid: number; // Courseid. pushratingstouserplans: boolean; // Pushratingstouserplans. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. }; /** * Data returned by competency's course_competency_statistics_exporter. */ export type AddonCompetencyCourseCompetencyStatistics = { competencycount: number; // Competencycount. proficientcompetencycount: number; // Proficientcompetencycount. proficientcompetencypercentage: number; // Proficientcompetencypercentage. proficientcompetencypercentageformatted: string; // Proficientcompetencypercentageformatted. leastproficient: AddonCompetencyCompetency[]; // Leastproficient. leastproficientcount: number; // Leastproficientcount. canbegradedincourse: boolean; // Canbegradedincourse. canmanagecoursecompetencies: boolean; // Canmanagecoursecompetencies. }; /** * Data returned by competency's course_competency_exporter. */ export type AddonCompetencyCourseCompetency = { courseid: number; // Courseid. competencyid: number; // Competencyid. sortorder: number; // Sortorder. ruleoutcome: number; // Ruleoutcome. id: number; // Id. timecreated: number; // Timecreated. timemodified: number; // Timemodified. usermodified: number; // Usermodified. }; /** * Params of tool_lp_data_for_plans_page WS. */ type AddonCompetencyDataForPlansPageWSParams = { userid: number; // The user id. }; /** * Data returned by tool_lp_data_for_plans_page WS. */ export type AddonCompetencyDataForPlansPageWSResponse = { userid: number; // The learning plan user id. plans: AddonCompetencyPlan[]; pluginbaseurl: string; // Url to the tool_lp plugin folder on this Moodle site. navigation: string[]; canreaduserevidence: boolean; // Can the current user view the user's evidence. canmanageuserplans: boolean; // Can the current user manage the user's plans. }; /** * Params of tool_lp_data_for_plan_page WS. */ type AddonCompetencyDataForPlanPageWSParams = { planid: number; // The plan id. }; /** * Data returned by tool_lp_data_for_plan_page WS. */ export type AddonCompetencyDataForPlanPageWSResponse = { plan: AddonCompetencyPlan; contextid: number; // Context ID. pluginbaseurl: string; // Plugin base URL. competencies: AddonCompetencyDataForPlanPageCompetency[]; competencycount: number; // Count of competencies. proficientcompetencycount: number; // Count of proficientcompetencies. proficientcompetencypercentage: number; // Percentage of competencies proficient. proficientcompetencypercentageformatted: string; // Displayable percentage. }; /** * Competency data returned by tool_lp_data_for_plan_page. */ export type AddonCompetencyDataForPlanPageCompetency = { competency: AddonCompetencyCompetency; comppath: AddonCompetencyPath; usercompetency?: AddonCompetencyUserCompetency; usercompetencyplan?: AddonCompetencyUserCompetencyPlan; }; /** * Params of tool_lp_data_for_course_competencies_page WS. */ type AddonCompetencyDataForCourseCompetenciesPageWSParams = { courseid: number; // The course id. moduleid?: number; // The module id. }; /** * Data returned by tool_lp_data_for_course_competencies_page WS. */ export type AddonCompetencyDataForCourseCompetenciesPageWSResponse = { courseid: number; // The current course id. pagecontextid: number; // The current page context ID. gradableuserid?: number; // Current user id, if the user is a gradable user. canmanagecompetencyframeworks: boolean; // User can manage competency frameworks. canmanagecoursecompetencies: boolean; // User can manage linked course competencies. canconfigurecoursecompetencies: boolean; // User can configure course competency settings. cangradecompetencies: boolean; // User can grade competencies. settings: AddonCompetencyCourseCompetencySettings; statistics: AddonCompetencyCourseCompetencyStatistics; competencies: AddonCompetencyDataForCourseCompetenciesPageCompetency[]; manageurl: string; // Url to the manage competencies page. pluginbaseurl: string; // @since 3.6. Url to the course competencies page. }; /** * Competency data returned by tool_lp_data_for_course_competencies_page. */ export type AddonCompetencyDataForCourseCompetenciesPageCompetency = { competency: AddonCompetencyCompetency; coursecompetency: AddonCompetencyCourseCompetency; coursemodules: AddonCompetencyCourseModuleInfo[]; usercompetencycourse?: AddonCompetencyUserCompetencyCourse; ruleoutcomeoptions: { value: number; // The option value. text: string; // The name of the option. selected: boolean; // If this is the currently selected option. }[]; comppath: AddonCompetencyPath; plans: AddonCompetencyPlan[]; // @since 3.7. }; type AddonCompetencyCourseModuleInfo = { id: number; // Id. name: string; // Name. url?: string; // Url. iconurl: string; // Iconurl. }; /** * Params of core_competency_user_competency_plan_viewed and core_competency_user_competency_viewed_in_plan WS. */ type AddonCompetencyUserCompetencyPlanViewedWSParams = { competencyid: number; // The competency id. userid: number; // The user id. planid: number; // The plan id. }; /** * Params of core_competency_user_competency_viewed_in_course WS. */ type AddonCompetencyUserCompetencyViewedInCourseWSParams = { competencyid: number; // The competency id. userid: number; // The user id. courseid: number; // The course id. }; /** * Params of core_competency_competency_viewed WS. */ type AddonCompetencyCompetencyViewedWSParams = { id: number; // The competency id. };