Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402] [Versions 401 and 402]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * External API.
  19   *
  20   * @package    core_competency
  21   * @copyright  2016 Frédéric Massart - FMCorz.net
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace core_competency;
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  require_once("$CFG->libdir/grade/grade_scale.php");
  29  
  30  use context_course;
  31  use context_module;
  32  use context_system;
  33  use context_user;
  34  use core_competency\external\competency_exporter;
  35  use core_competency\external\competency_framework_exporter;
  36  use core_competency\external\course_competency_exporter;
  37  use core_competency\external\course_module_competency_exporter;
  38  use core_competency\external\evidence_exporter;
  39  use core_competency\external\performance_helper;
  40  use core_competency\external\plan_exporter;
  41  use core_competency\external\template_exporter;
  42  use core_competency\external\user_competency_exporter;
  43  use core_competency\external\user_competency_plan_exporter;
  44  use core_competency\external\user_evidence_competency_exporter;
  45  use core_competency\external\user_evidence_exporter;
  46  use core_external\external_api;
  47  use core_external\external_function_parameters;
  48  use core_external\external_multiple_structure;
  49  use core_external\external_single_structure;
  50  use core_external\external_value;
  51  use grade_scale;
  52  use invalid_parameter_exception;
  53  
  54  /**
  55   * External API class.
  56   *
  57   * @package    core_competency
  58   * @copyright  2016 Frédéric Massart - FMCorz.net
  59   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  60   */
  61  class external extends external_api {
  62  
  63      /**
  64       * Returns a prepared structure to use a context parameters.
  65       * @return external_single_structure
  66       */
  67      protected static function get_context_parameters() {
  68          $id = new external_value(
  69              PARAM_INT,
  70              'Context ID. Either use this value, or level and instanceid.',
  71              VALUE_DEFAULT,
  72              0
  73          );
  74          $level = new external_value(
  75              PARAM_ALPHA,
  76              'Context level. To be used with instanceid.',
  77              VALUE_DEFAULT,
  78              ''
  79          );
  80          $instanceid = new external_value(
  81              PARAM_INT,
  82              'Context instance ID. To be used with level',
  83              VALUE_DEFAULT,
  84              0
  85          );
  86          return new external_single_structure(array(
  87              'contextid' => $id,
  88              'contextlevel' => $level,
  89              'instanceid' => $instanceid,
  90          ));
  91      }
  92  
  93      /**
  94       * Returns description of create_competency_framework() parameters.
  95       *
  96       * @return external_function_parameters
  97       */
  98      public static function create_competency_framework_parameters() {
  99          $structure = competency_framework_exporter::get_create_structure();
 100          $params = array('competencyframework' => $structure);
 101          return new external_function_parameters($params);
 102      }
 103  
 104      /**
 105       * Create a new competency framework
 106       *
 107       * @param array $competencyframework A single param with all the fields for a competency framework.
 108       * @return \stdClass The new record
 109       */
 110      public static function create_competency_framework($competencyframework) {
 111          global $PAGE;
 112  
 113          $params = self::validate_parameters(self::create_competency_framework_parameters(), array(
 114              'competencyframework' => $competencyframework
 115          ));
 116          $params = $params['competencyframework'];
 117  
 118          $context = self::get_context_from_params($params);
 119          self::validate_context($context);
 120          $output = $PAGE->get_renderer('core');
 121  
 122          unset($params['contextlevel']);
 123          unset($params['instanceid']);
 124          $params['contextid'] = $context->id;
 125  
 126          $params = (object) $params;
 127          $result = api::create_framework($params);
 128          $exporter = new competency_framework_exporter($result);
 129          $record = $exporter->export($output);
 130          return $record;
 131      }
 132  
 133      /**
 134       * Returns description of create_competency_framework() result value.
 135       *
 136       * @return external_description
 137       */
 138      public static function create_competency_framework_returns() {
 139          return competency_framework_exporter::get_read_structure();
 140      }
 141  
 142      /**
 143       * Returns description of read_competency_framework() parameters.
 144       *
 145       * @return external_function_parameters
 146       */
 147      public static function read_competency_framework_parameters() {
 148          $id = new external_value(
 149              PARAM_INT,
 150              'Data base record id for the framework',
 151              VALUE_REQUIRED
 152          );
 153  
 154          $params = array(
 155              'id' => $id,
 156          );
 157          return new external_function_parameters($params);
 158      }
 159  
 160      /**
 161       * Read a competency framework by id.
 162       *
 163       * @param int $id The id of the framework.
 164       * @return \stdClass
 165       */
 166      public static function read_competency_framework($id) {
 167          global $PAGE;
 168  
 169          $params = self::validate_parameters(self::read_competency_framework_parameters(), array(
 170              'id' => $id,
 171          ));
 172  
 173          $framework = api::read_framework($params['id']);
 174          self::validate_context($framework->get_context());
 175          $output = $PAGE->get_renderer('core');
 176          $exporter = new competency_framework_exporter($framework);
 177          $record = $exporter->export($output);
 178          return $record;
 179      }
 180  
 181      /**
 182       * Returns description of read_competency_framework() result value.
 183       *
 184       * @return external_description
 185       */
 186      public static function read_competency_framework_returns() {
 187          return competency_framework_exporter::get_read_structure();
 188      }
 189  
 190      /**
 191       * Returns description of competency_viewed() parameters.
 192       *
 193       * @return external_function_parameters
 194       */
 195      public static function competency_viewed_parameters() {
 196          $id = new external_value(
 197              PARAM_INT,
 198              'The competency id',
 199              VALUE_REQUIRED
 200          );
 201          $params = array(
 202              'id' => $id
 203          );
 204          return new external_function_parameters($params);
 205      }
 206  
 207      /**
 208       * Log event competency viewed.
 209       *
 210       * @param int $id The competency ID.
 211       * @return boolean
 212       */
 213      public static function competency_viewed($id) {
 214          $params = self::validate_parameters(self::competency_viewed_parameters(), array(
 215              'id' => $id
 216          ));
 217          return api::competency_viewed($params['id']);
 218      }
 219  
 220      /**
 221       * Returns description of competency_viewed() result value.
 222       *
 223       * @return external_description
 224       */
 225      public static function competency_viewed_returns() {
 226          return new external_value(PARAM_BOOL, 'True if the event competency viewed was logged');
 227      }
 228  
 229      /**
 230       * Returns description of duplicate_competency_framework() parameters.
 231       *
 232       * @return external_function_parameters
 233       */
 234      public static function duplicate_competency_framework_parameters() {
 235          $id = new external_value(
 236              PARAM_INT,
 237              'Data base record id for the framework',
 238              VALUE_REQUIRED
 239          );
 240  
 241          $params = array(
 242              'id' => $id,
 243          );
 244          return new external_function_parameters($params);
 245      }
 246  
 247      /**
 248       * Duplicate a competency framework
 249       *
 250       * @param int $id The competency framework id
 251       * @return boolean
 252       */
 253      public static function duplicate_competency_framework($id) {
 254          global $PAGE;
 255          $params = self::validate_parameters(self::duplicate_competency_framework_parameters(), array(
 256              'id' => $id,
 257          ));
 258  
 259          $framework = api::read_framework($params['id']);
 260          self::validate_context($framework->get_context());
 261  
 262          $output = $PAGE->get_renderer('core');
 263          $framework = api::duplicate_framework($params['id']);
 264          $exporter = new competency_framework_exporter($framework);
 265          $record = $exporter->export($output);
 266          return $record;
 267      }
 268  
 269      /**
 270       * Returns description of duplicate_competency_framework() result value.
 271       *
 272       * @return external_description
 273       */
 274      public static function duplicate_competency_framework_returns() {
 275          return competency_framework_exporter::get_read_structure();
 276      }
 277  
 278      /**
 279       * Returns description of delete_competency_framework() parameters.
 280       *
 281       * @return external_function_parameters
 282       */
 283      public static function delete_competency_framework_parameters() {
 284          $id = new external_value(
 285              PARAM_INT,
 286              'Data base record id for the framework',
 287              VALUE_REQUIRED
 288          );
 289  
 290          $params = array(
 291              'id' => $id,
 292          );
 293          return new external_function_parameters($params);
 294      }
 295  
 296      /**
 297       * Delete a competency framework
 298       *
 299       * @param int $id The competency framework id
 300       * @return boolean
 301       */
 302      public static function delete_competency_framework($id) {
 303          $params = self::validate_parameters(self::delete_competency_framework_parameters(), array(
 304              'id' => $id,
 305          ));
 306  
 307          $framework = api::read_framework($params['id']);
 308          self::validate_context($framework->get_context());
 309  
 310          return api::delete_framework($params['id']);
 311      }
 312  
 313      /**
 314       * Returns description of delete_competency_framework() result value.
 315       *
 316       * @return external_description
 317       */
 318      public static function delete_competency_framework_returns() {
 319          return new external_value(PARAM_BOOL, 'True if the delete was successful');
 320      }
 321  
 322      /**
 323       * Returns description of update_competency_framework() parameters.
 324       *
 325       * @return external_function_parameters
 326       */
 327      public static function update_competency_framework_parameters() {
 328          $structure = competency_framework_exporter::get_update_structure();
 329          $params = array('competencyframework' => $structure);
 330          return new external_function_parameters($params);
 331      }
 332  
 333      /**
 334       * Update an existing competency framework
 335       *
 336       * @param array $competencyframework An array with all the fields for a competency framework.
 337       * @return boolean
 338       */
 339      public static function update_competency_framework($competencyframework) {
 340  
 341          $params = self::validate_parameters(self::update_competency_framework_parameters(), array(
 342              'competencyframework' => $competencyframework
 343          ));
 344          $params = $params['competencyframework'];
 345  
 346          $framework = api::read_framework($params['id']);
 347          self::validate_context($framework->get_context());
 348  
 349          $params = (object) $params;
 350  
 351          return api::update_framework($params);
 352      }
 353  
 354      /**
 355       * Returns description of update_competency_framework() result value.
 356       *
 357       * @return external_description
 358       */
 359      public static function update_competency_framework_returns() {
 360          return new external_value(PARAM_BOOL, 'True if the update was successful');
 361      }
 362  
 363      /**
 364       * Returns description of list_competency_frameworks() parameters.
 365       *
 366       * @return external_function_parameters
 367       */
 368      public static function list_competency_frameworks_parameters() {
 369          $sort = new external_value(
 370              PARAM_ALPHANUMEXT,
 371              'Column to sort by.',
 372              VALUE_DEFAULT,
 373              'shortname'
 374          );
 375          $order = new external_value(
 376              PARAM_ALPHA,
 377              'Sort direction. Should be either ASC or DESC',
 378              VALUE_DEFAULT,
 379              ''
 380          );
 381          $skip = new external_value(
 382              PARAM_INT,
 383              'Skip this number of records before returning results',
 384              VALUE_DEFAULT,
 385              0
 386          );
 387          $limit = new external_value(
 388              PARAM_INT,
 389              'Return this number of records at most.',
 390              VALUE_DEFAULT,
 391              0
 392          );
 393          $includes = new external_value(
 394              PARAM_ALPHA,
 395              'What other contextes to fetch the frameworks from. (children, parents, self)',
 396              VALUE_DEFAULT,
 397              'children'
 398          );
 399          $onlyvisible = new external_value(
 400              PARAM_BOOL,
 401              'Only visible frameworks will be returned if visible true',
 402              VALUE_DEFAULT,
 403              false
 404          );
 405          $query = new external_value(
 406              PARAM_RAW,
 407              'A query string to filter the results',
 408              VALUE_DEFAULT,
 409              ''
 410          );
 411  
 412          $params = array(
 413              'sort' => $sort,
 414              'order' => $order,
 415              'skip' => $skip,
 416              'limit' => $limit,
 417              'context' => self::get_context_parameters(),
 418              'includes' => $includes,
 419              'onlyvisible' => $onlyvisible,
 420              'query' => $query,
 421          );
 422          return new external_function_parameters($params);
 423      }
 424  
 425      /**
 426       * List the existing competency frameworks
 427       *
 428       * @param int $sort
 429       * @param string $order
 430       * @param string $skip
 431       * @param int $limit
 432       * @param array $context
 433       * @param bool $includes
 434       * @param bool $onlyvisible
 435       * @param string $query
 436       *
 437       * @return array
 438       * @throws \required_capability_exception
 439       * @throws invalid_parameter_exception
 440       */
 441      public static function list_competency_frameworks($sort, $order, $skip, $limit, $context, $includes, $onlyvisible,
 442                                                        $query = '') {
 443          global $PAGE;
 444  
 445          $params = self::validate_parameters(self::list_competency_frameworks_parameters(), array(
 446              'sort' => $sort,
 447              'order' => $order,
 448              'skip' => $skip,
 449              'limit' => $limit,
 450              'context' => $context,
 451              'includes' => $includes,
 452              'onlyvisible' => $onlyvisible,
 453              'query' => $query,
 454          ));
 455  
 456          $context = self::get_context_from_params($params['context']);
 457          self::validate_context($context);
 458          $output = $PAGE->get_renderer('core');
 459  
 460          if ($params['order'] !== '' && $params['order'] !== 'ASC' && $params['order'] !== 'DESC') {
 461              throw new invalid_parameter_exception('Invalid order param. Must be ASC, DESC or empty.');
 462          }
 463  
 464          $results = api::list_frameworks($params['sort'],
 465                                         $params['order'],
 466                                         $params['skip'],
 467                                         $params['limit'],
 468                                         $context,
 469                                         $params['includes'],
 470                                         $params['onlyvisible'],
 471                                         $params['query']);
 472          $records = array();
 473          foreach ($results as $result) {
 474              $exporter = new competency_framework_exporter($result);
 475              $record = $exporter->export($output);
 476              array_push($records, $record);
 477          }
 478          return $records;
 479      }
 480  
 481      /**
 482       * Returns description of list_competency_frameworks() result value.
 483       *
 484       * @return external_description
 485       */
 486      public static function list_competency_frameworks_returns() {
 487          return new external_multiple_structure(competency_framework_exporter::get_read_structure());
 488      }
 489  
 490      /**
 491       * Returns description of count_competency_frameworks() parameters.
 492       *
 493       * @return external_function_parameters
 494       */
 495      public static function count_competency_frameworks_parameters() {
 496          $includes = new external_value(
 497              PARAM_ALPHA,
 498              'What other contextes to fetch the frameworks from. (children, parents, self)',
 499              VALUE_DEFAULT,
 500              'children'
 501          );
 502  
 503          $params = array(
 504              'context' => self::get_context_parameters(),
 505              'includes' => $includes
 506          );
 507          return new external_function_parameters($params);
 508      }
 509  
 510      /**
 511       * Count the existing competency frameworks
 512       *
 513       * @param array $context
 514       * @param string $includes
 515       * @return int
 516       */
 517      public static function count_competency_frameworks($context, $includes) {
 518          $params = self::validate_parameters(self::count_competency_frameworks_parameters(), array(
 519              'context' => $context,
 520              'includes' => $includes
 521          ));
 522  
 523          $context = self::get_context_from_params($params['context']);
 524          self::validate_context($context);
 525  
 526          return api::count_frameworks($context, $params['includes']);
 527      }
 528  
 529      /**
 530       * Returns description of count_competency_frameworks() result value.
 531       *
 532       * @return external_description
 533       */
 534      public static function count_competency_frameworks_returns() {
 535          return new external_value(PARAM_INT, 'The number of competency frameworks found.');
 536      }
 537  
 538      /**
 539       * Returns description of competency_framework_viewed() parameters.
 540       *
 541       * @return external_function_parameters
 542       */
 543      public static function competency_framework_viewed_parameters() {
 544          $id = new external_value(
 545              PARAM_INT,
 546              'The competency framework id',
 547              VALUE_REQUIRED
 548          );
 549  
 550          $params = array(
 551              'id' => $id
 552          );
 553          return new external_function_parameters($params);
 554      }
 555  
 556      /**
 557       * Log event competency framework viewed.
 558       *
 559       * @param int $id The competency framework ID.
 560       * @return boolean
 561       */
 562      public static function competency_framework_viewed($id) {
 563          $params = self::validate_parameters(self::competency_framework_viewed_parameters(), array(
 564              'id' => $id
 565          ));
 566          return api::competency_framework_viewed($params['id']);
 567  
 568      }
 569  
 570      /**
 571       * Returns description of competency_framework_viewed() result value.
 572       *
 573       * @return external_description
 574       */
 575      public static function competency_framework_viewed_returns() {
 576          return new external_value(PARAM_BOOL, 'True if the event competency framework was logged');
 577      }
 578  
 579      /**
 580       * Returns description of create_competency() parameters.
 581       *
 582       * @return external_function_parameters
 583       */
 584      public static function create_competency_parameters() {
 585          $structure = competency_exporter::get_create_structure();
 586          $params = array('competency' => $structure);
 587          return new external_function_parameters($params);
 588      }
 589  
 590      /**
 591       * Create a new competency
 592       *
 593       * @param array $competency All the fields for a competency record (including id)
 594       * @return array the competency
 595       */
 596      public static function create_competency($competency) {
 597          global $PAGE;
 598  
 599          $params = self::validate_parameters(self::create_competency_parameters(), array(
 600              'competency' => $competency
 601          ));
 602  
 603          $params = $params['competency'];
 604          $framework = api::read_framework($params['competencyframeworkid']);
 605          $context = $framework->get_context();
 606          self::validate_context($context);
 607          $output = $PAGE->get_renderer('core');
 608  
 609          $params = (object) $params;
 610          $result = api::create_competency($params);
 611          $exporter = new competency_exporter($result, array('context' => $context));
 612          $record = $exporter->export($output);
 613          return $record;
 614      }
 615  
 616      /**
 617       * Returns description of create_competency() result value.
 618       *
 619       * @return external_description
 620       */
 621      public static function create_competency_returns() {
 622          return competency_exporter::get_read_structure();
 623      }
 624  
 625      /**
 626       * Returns description of read_competency() parameters.
 627       *
 628       * @return external_function_parameters
 629       */
 630      public static function read_competency_parameters() {
 631          $id = new external_value(
 632              PARAM_INT,
 633              'Data base record id for the competency',
 634              VALUE_REQUIRED
 635          );
 636  
 637          $params = array(
 638              'id' => $id,
 639          );
 640          return new external_function_parameters($params);
 641      }
 642  
 643      /**
 644       * Read a competency by id.
 645       *
 646       * @param int $id The id of the competency
 647       * @return \stdClass
 648       */
 649      public static function read_competency($id) {
 650          global $PAGE;
 651  
 652          $params = self::validate_parameters(self::read_competency_parameters(), array(
 653              'id' => $id,
 654          ));
 655  
 656          $competency = api::read_competency($params['id']);
 657          $context = $competency->get_context();
 658          self::validate_context($context);
 659          $output = $PAGE->get_renderer('core');
 660          $exporter = new competency_exporter($competency, array('context' => $context));
 661          $record = $exporter->export($output);
 662          return $record;
 663      }
 664  
 665      /**
 666       * Returns description of read_competency() result value.
 667       *
 668       * @return external_description
 669       */
 670      public static function read_competency_returns() {
 671          return competency_exporter::get_read_structure();
 672      }
 673  
 674      /**
 675       * Returns description of delete_competency() parameters.
 676       *
 677       * @return external_function_parameters
 678       */
 679      public static function delete_competency_parameters() {
 680          $id = new external_value(
 681              PARAM_INT,
 682              'Data base record id for the competency',
 683              VALUE_REQUIRED
 684          );
 685  
 686          $params = array(
 687              'id' => $id,
 688          );
 689          return new external_function_parameters($params);
 690      }
 691  
 692      /**
 693       * Delete a competency
 694       *
 695       * @param int $id The competency id
 696       * @return boolean
 697       */
 698      public static function delete_competency($id) {
 699          $params = self::validate_parameters(self::delete_competency_parameters(), array(
 700              'id' => $id,
 701          ));
 702  
 703          $competency = api::read_competency($params['id']);
 704          $context = $competency->get_context();
 705          self::validate_context($context);
 706  
 707          return api::delete_competency($params['id']);
 708      }
 709  
 710      /**
 711       * Returns description of delete_competency() result value.
 712       *
 713       * @return external_description
 714       */
 715      public static function delete_competency_returns() {
 716          return new external_value(PARAM_BOOL, 'True if the delete was successful');
 717      }
 718  
 719      /**
 720       * Returns description of update_competency() parameters.
 721       *
 722       * @return external_function_parameters
 723       */
 724      public static function update_competency_parameters() {
 725          $structure = competency_exporter::get_update_structure();
 726          $params = array('competency' => $structure);
 727          return new external_function_parameters($params);
 728      }
 729  
 730      /**
 731       * Update an existing competency
 732       *
 733       * @param array $competency The array of competency fields (id is required).
 734       * @return boolean
 735       */
 736      public static function update_competency($competency) {
 737          $params = self::validate_parameters(self::update_competency_parameters(), array(
 738              'competency' => $competency
 739          ));
 740          $params = $params['competency'];
 741  
 742          $competency = api::read_competency($params['id']);
 743          self::validate_context($competency->get_context());
 744  
 745          $params = (object) $params;
 746  
 747          return api::update_competency($params);
 748      }
 749  
 750      /**
 751       * Returns description of update_competency_framework() result value.
 752       *
 753       * @return external_description
 754       */
 755      public static function update_competency_returns() {
 756          return new external_value(PARAM_BOOL, 'True if the update was successful');
 757      }
 758  
 759      /**
 760       * Returns description of list_competencies() parameters.
 761       *
 762       * @return external_function_parameters
 763       */
 764      public static function list_competencies_parameters() {
 765          $filters = new external_multiple_structure(new external_single_structure(
 766              array(
 767                  'column' => new external_value(PARAM_ALPHANUMEXT, 'Column name to filter by'),
 768                  'value' => new external_value(PARAM_TEXT, 'Value to filter by. Must be exact match')
 769              )
 770          ));
 771          $sort = new external_value(
 772              PARAM_ALPHANUMEXT,
 773              'Column to sort by.',
 774              VALUE_DEFAULT,
 775              ''
 776          );
 777          $order = new external_value(
 778              PARAM_ALPHA,
 779              'Sort direction. Should be either ASC or DESC',
 780              VALUE_DEFAULT,
 781              ''
 782          );
 783          $skip = new external_value(
 784              PARAM_INT,
 785              'Skip this number of records before returning results',
 786              VALUE_DEFAULT,
 787              0
 788          );
 789          $limit = new external_value(
 790              PARAM_INT,
 791              'Return this number of records at most.',
 792              VALUE_DEFAULT,
 793              0
 794          );
 795  
 796          $params = array(
 797              'filters' => $filters,
 798              'sort' => $sort,
 799              'order' => $order,
 800              'skip' => $skip,
 801              'limit' => $limit
 802          );
 803          return new external_function_parameters($params);
 804      }
 805  
 806      /**
 807       * List the existing competency.
 808       *
 809       * @param string $filters
 810       * @param int $sort
 811       * @param string $order
 812       * @param string $skip
 813       * @param int $limit
 814       *
 815       * @return array
 816       * @throws \required_capability_exception
 817       * @throws invalid_parameter_exception
 818       */
 819      public static function list_competencies($filters, $sort, $order, $skip, $limit) {
 820          global $PAGE;
 821  
 822          $params = self::validate_parameters(self::list_competencies_parameters(), array(
 823              'filters' => $filters,
 824              'sort' => $sort,
 825              'order' => $order,
 826              'skip' => $skip,
 827              'limit' => $limit
 828          ));
 829  
 830          if ($params['order'] !== '' && $params['order'] !== 'ASC' && $params['order'] !== 'DESC') {
 831              throw new invalid_parameter_exception('Invalid order param. Must be ASC, DESC or empty.');
 832          }
 833  
 834          $safefilters = array();
 835          $validcolumns = array('id', 'shortname', 'description', 'sortorder', 'idnumber',
 836              'parentid', 'competencyframeworkid');
 837          foreach ($params['filters'] as $filter) {
 838              if (!in_array($filter['column'], $validcolumns)) {
 839                  throw new invalid_parameter_exception('Filter column was invalid');
 840              }
 841              $safefilters[$filter['column']] = $filter['value'];
 842          }
 843  
 844          $context = null;
 845          if (isset($safefilters['competencyframeworkid'])) {
 846              $framework = api::read_framework($safefilters['competencyframeworkid']);
 847              $context = $framework->get_context();
 848          } else {
 849              $context = context_system::instance();
 850          }
 851  
 852          self::validate_context($context);
 853          $output = $PAGE->get_renderer('core');
 854  
 855          $results = api::list_competencies(
 856              $safefilters,
 857              $params['sort'],
 858              $params['order'],
 859              $params['skip'],
 860              $params['limit']
 861          );
 862  
 863          $records = array();
 864          foreach ($results as $result) {
 865              $exporter = new competency_exporter($result, array('context' => $context));
 866              $record = $exporter->export($output);
 867              array_push($records, $record);
 868          }
 869          return $records;
 870      }
 871  
 872      /**
 873       * Returns description of list_competencies() result value.
 874       *
 875       * @return external_description
 876       */
 877      public static function list_competencies_returns() {
 878          return new external_multiple_structure(competency_exporter::get_read_structure());
 879      }
 880  
 881      /**
 882       * Returns description of search_competencies() parameters.
 883       *
 884       * @return external_function_parameters
 885       */
 886      public static function search_competencies_parameters() {
 887          $searchtext = new external_value(
 888              PARAM_RAW,
 889              'Text to search for',
 890              VALUE_REQUIRED
 891          );
 892          $frameworkid = new external_value(
 893              PARAM_INT,
 894              'Competency framework id',
 895              VALUE_REQUIRED
 896          );
 897  
 898          $params = array(
 899              'searchtext' => $searchtext,
 900              'competencyframeworkid' => $frameworkid
 901          );
 902          return new external_function_parameters($params);
 903      }
 904  
 905      /**
 906       * List the existing competency frameworks
 907       *
 908       * @param string $searchtext Text to search.
 909       * @param int $competencyframeworkid Framework id.
 910       *
 911       * @return array
 912       */
 913      public static function search_competencies($searchtext, $competencyframeworkid) {
 914          global $PAGE;
 915  
 916          $params = self::validate_parameters(self::search_competencies_parameters(), array(
 917              'searchtext' => $searchtext,
 918              'competencyframeworkid' => $competencyframeworkid
 919          ));
 920  
 921          $framework = api::read_framework($params['competencyframeworkid']);
 922          $context = $framework->get_context();
 923          self::validate_context($context);
 924          $output = $PAGE->get_renderer('core');
 925  
 926          $results = api::search_competencies($params['searchtext'], $params['competencyframeworkid']);
 927          $records = array();
 928          foreach ($results as $result) {
 929              $exporter = new competency_exporter($result, array('context' => $context));
 930              $record = $exporter->export($output);
 931  
 932              array_push($records, $record);
 933          }
 934  
 935          return $records;
 936      }
 937  
 938      /**
 939       * Returns description of search_competencies() result value.
 940       *
 941       * @return external_description
 942       */
 943      public static function search_competencies_returns() {
 944          return new external_multiple_structure(competency_exporter::get_read_structure());
 945      }
 946  
 947      /**
 948       * Returns description of count_competencies() parameters.
 949       *
 950       * @return external_function_parameters
 951       */
 952      public static function count_competencies_parameters() {
 953          $filters = new external_multiple_structure(new external_single_structure(
 954              array(
 955                  'column' => new external_value(PARAM_ALPHANUMEXT, 'Column name to filter by'),
 956                  'value' => new external_value(PARAM_TEXT, 'Value to filter by. Must be exact match')
 957              )
 958          ));
 959  
 960          $params = array(
 961              'filters' => $filters,
 962          );
 963          return new external_function_parameters($params);
 964      }
 965  
 966      /**
 967       * Count the existing competency frameworks.
 968       *
 969       * @param string $filters Filters to use.
 970       * @return boolean
 971       */
 972      public static function count_competencies($filters) {
 973          $params = self::validate_parameters(self::count_competencies_parameters(), array(
 974              'filters' => $filters
 975          ));
 976  
 977          $safefilters = array();
 978          $validcolumns = array('id', 'shortname', 'description', 'sortorder', 'idnumber', 'parentid', 'competencyframeworkid');
 979          foreach ($params['filters'] as $filter) {
 980              if (!in_array($filter['column'], $validcolumns)) {
 981                  throw new invalid_parameter_exception('Filter column was invalid');
 982              }
 983              $safefilters[$filter['column']] = $filter['value'];
 984          }
 985  
 986          $context = null;
 987          if (isset($safefilters['competencyframeworkid'])) {
 988              $framework = api::read_framework($safefilters['competencyframeworkid']);
 989              $context = $framework->get_context();
 990          } else {
 991              $context = context_system::instance();
 992          }
 993  
 994          self::validate_context($context);
 995  
 996          return api::count_competencies($safefilters);
 997      }
 998  
 999      /**
1000       * Returns description of count_competencies() result value.
1001       *
1002       * @return external_description
1003       */
1004      public static function count_competencies_returns() {
1005          return new external_value(PARAM_INT, 'The number of competencies found.');
1006      }
1007  
1008      /**
1009       * Returns description of set_parent_competency() parameters.
1010       *
1011       * @return external_function_parameters
1012       */
1013      public static function set_parent_competency_parameters() {
1014          $competencyid = new external_value(
1015              PARAM_INT,
1016              'The competency id',
1017              VALUE_REQUIRED
1018          );
1019          $parentid = new external_value(
1020              PARAM_INT,
1021              'The new competency parent id',
1022              VALUE_REQUIRED
1023          );
1024          $params = array(
1025              'competencyid' => $competencyid,
1026              'parentid' => $parentid
1027          );
1028          return new external_function_parameters($params);
1029      }
1030  
1031      /**
1032       * Move the competency to a new parent.
1033       *
1034       * @param int $competencyid Competency id.
1035       * @param int $parentid Parent id.
1036       *
1037       * @return bool
1038       */
1039      public static function set_parent_competency($competencyid, $parentid) {
1040          $params = self::validate_parameters(self::set_parent_competency_parameters(), array(
1041              'competencyid' => $competencyid,
1042              'parentid' => $parentid
1043          ));
1044  
1045          $competency = api::read_competency($params['competencyid']);
1046          self::validate_context($competency->get_context());
1047  
1048          return api::set_parent_competency($params['competencyid'], $params['parentid']);
1049      }
1050  
1051      /**
1052       * Returns description of set_parent_competency() result value.
1053       *
1054       * @return external_description
1055       */
1056      public static function set_parent_competency_returns() {
1057          return new external_value(PARAM_BOOL, 'True if the update was successful');
1058      }
1059  
1060      /**
1061       * Returns description of move_up_competency() parameters.
1062       *
1063       * @return external_function_parameters
1064       */
1065      public static function move_up_competency_parameters() {
1066          $competencyid = new external_value(
1067              PARAM_INT,
1068              'The competency id',
1069              VALUE_REQUIRED
1070          );
1071          $params = array(
1072              'id' => $competencyid,
1073          );
1074          return new external_function_parameters($params);
1075      }
1076  
1077      /**
1078       * Change the sort order of a competency.
1079       *
1080       * @param int $competencyid Competency id.
1081       * @return boolean
1082       */
1083      public static function move_up_competency($competencyid) {
1084          $params = self::validate_parameters(self::move_up_competency_parameters(), array(
1085              'id' => $competencyid,
1086          ));
1087  
1088          $competency = api::read_competency($params['id']);
1089          self::validate_context($competency->get_context());
1090  
1091          return api::move_up_competency($params['id']);
1092      }
1093  
1094      /**
1095       * Returns description of move_up_competency() result value.
1096       *
1097       * @return external_description
1098       */
1099      public static function move_up_competency_returns() {
1100          return new external_value(PARAM_BOOL, 'True if the update was successful');
1101      }
1102  
1103      /**
1104       * Returns description of move_down_competency() parameters.
1105       *
1106       * @return external_function_parameters
1107       */
1108      public static function move_down_competency_parameters() {
1109          $competencyid = new external_value(
1110              PARAM_INT,
1111              'The competency id',
1112              VALUE_REQUIRED
1113          );
1114          $params = array(
1115              'id' => $competencyid,
1116          );
1117          return new external_function_parameters($params);
1118      }
1119  
1120      /**
1121       * Change the sort order of a competency.
1122       *
1123       * @param int $competencyid Competency id.
1124       * @return boolean
1125       */
1126      public static function move_down_competency($competencyid) {
1127          $params = self::validate_parameters(self::move_down_competency_parameters(), array(
1128              'id' => $competencyid,
1129          ));
1130  
1131          $competency = api::read_competency($params['id']);
1132          self::validate_context($competency->get_context());
1133  
1134          return api::move_down_competency($params['id']);
1135      }
1136  
1137      /**
1138       * Returns description of move_down_competency() result value.
1139       *
1140       * @return external_description
1141       */
1142      public static function move_down_competency_returns() {
1143          return new external_value(PARAM_BOOL, 'True if the update was successful');
1144      }
1145  
1146      /**
1147       * Returns description of count_courses_using_competency() parameters.
1148       *
1149       * @return external_function_parameters
1150       */
1151      public static function count_courses_using_competency_parameters() {
1152          $competencyid = new external_value(
1153              PARAM_INT,
1154              'The competency id',
1155              VALUE_REQUIRED
1156          );
1157          $params = array(
1158              'id' => $competencyid,
1159          );
1160          return new external_function_parameters($params);
1161      }
1162  
1163      /**
1164       * Count the courses (visible to this user) that use this competency.
1165       *
1166       * @param int $competencyid Competency id.
1167       * @return int
1168       */
1169      public static function count_courses_using_competency($competencyid) {
1170          $params = self::validate_parameters(self::count_courses_using_competency_parameters(), array(
1171              'id' => $competencyid,
1172          ));
1173  
1174          $competency = api::read_competency($params['id']);
1175          self::validate_context($competency->get_context());
1176  
1177          return api::count_courses_using_competency($params['id']);
1178      }
1179  
1180      /**
1181       * Returns description of count_courses_using_competency() result value.
1182       *
1183       * @return external_description
1184       */
1185      public static function count_courses_using_competency_returns() {
1186          return new external_value(PARAM_INT, 'The number of courses using this competency');
1187      }
1188  
1189      /**
1190       * Returns description of count_competencies_in_course() parameters.
1191       *
1192       * @return external_function_parameters
1193       */
1194      public static function count_competencies_in_course_parameters() {
1195          $courseid = new external_value(
1196              PARAM_INT,
1197              'The course id',
1198              VALUE_REQUIRED
1199          );
1200          $params = array(
1201              'id' => $courseid,
1202          );
1203          return new external_function_parameters($params);
1204      }
1205  
1206      /**
1207       * Count the competencies (visible to this user) in this course.
1208       *
1209       * @param int $courseid The course id to check.
1210       * @return int
1211       */
1212      public static function count_competencies_in_course($courseid) {
1213          $params = self::validate_parameters(self::count_competencies_in_course_parameters(), array(
1214              'id' => $courseid,
1215          ));
1216  
1217          self::validate_context(context_course::instance($params['id']));
1218  
1219          return api::count_competencies_in_course($params['id']);
1220      }
1221  
1222      /**
1223       * Returns description of count_competencies_in_course() result value.
1224       *
1225       * @return external_description
1226       */
1227      public static function count_competencies_in_course_returns() {
1228          return new external_value(PARAM_INT, 'The number of competencies in this course.');
1229      }
1230  
1231      /**
1232       * Returns description of list_course_module_competencies() parameters.
1233       *
1234       * @return external_function_parameters
1235       */
1236      public static function list_course_module_competencies_parameters() {
1237          $cmid = new external_value(
1238              PARAM_INT,
1239              'The course module id',
1240              VALUE_REQUIRED
1241          );
1242          $params = array(
1243              'cmid' => $cmid
1244          );
1245          return new external_function_parameters($params);
1246      }
1247  
1248      /**
1249       * List the course modules using this competency (visible to this user) in this course.
1250       *
1251       * @param int $cmid The course module id to check.
1252       * @return array
1253       */
1254      public static function list_course_module_competencies($cmid) {
1255          global $PAGE;
1256  
1257          $params = self::validate_parameters(self::list_course_module_competencies_parameters(), array(
1258              'cmid' => $cmid
1259          ));
1260  
1261          $context = context_module::instance($params['cmid']);
1262          self::validate_context($context);
1263  
1264          $output = $PAGE->get_renderer('core');
1265  
1266          $apiresult = api::list_course_module_competencies($params['cmid']);
1267          $result = array();
1268  
1269          foreach ($apiresult as $cmrecord) {
1270              $one = new \stdClass();
1271              $exporter = new competency_exporter($cmrecord['competency'], ['context' => $context]);
1272              $one->competency = $exporter->export($output);
1273              $exporter = new course_module_competency_exporter($cmrecord['coursemodulecompetency'], ['context' => $context]);
1274              $one->coursemodulecompetency = $exporter->export($output);
1275  
1276              $result[] = (array) $one;
1277          }
1278  
1279          return $result;
1280      }
1281  
1282      /**
1283       * Returns description of list_course_module_competencies() result value.
1284       *
1285       * @return external_description
1286       */
1287      public static function list_course_module_competencies_returns() {
1288          return new external_multiple_structure(
1289              new external_single_structure(array(
1290                  'competency' => competency_exporter::get_read_structure(),
1291                  'coursemodulecompetency' => course_module_competency_exporter::get_read_structure()
1292              ))
1293          );
1294      }
1295  
1296      /**
1297       * Returns description of list_course_competencies() parameters.
1298       *
1299       * @return external_function_parameters
1300       */
1301      public static function list_course_competencies_parameters() {
1302          $courseid = new external_value(
1303              PARAM_INT,
1304              'The course id',
1305              VALUE_REQUIRED
1306          );
1307          $params = array(
1308              'id' => $courseid,
1309          );
1310          return new external_function_parameters($params);
1311      }
1312  
1313      /**
1314       * Returns description of count_course_module_competencies() parameters.
1315       *
1316       * @return external_function_parameters
1317       */
1318      public static function count_course_module_competencies_parameters() {
1319          $cmid = new external_value(
1320              PARAM_INT,
1321              'The course module id',
1322              VALUE_REQUIRED
1323          );
1324          $params = array(
1325              'cmid' => $cmid
1326          );
1327          return new external_function_parameters($params);
1328      }
1329  
1330      /**
1331       * List the course modules using this competency (visible to this user) in this course.
1332       *
1333       * @param int $cmid The course module id to check.
1334       * @return array
1335       */
1336      public static function count_course_module_competencies($cmid) {
1337          $params = self::validate_parameters(self::count_course_module_competencies_parameters(), array(
1338              'cmid' => $cmid
1339          ));
1340  
1341          $context = context_module::instance($params['cmid']);
1342          self::validate_context($context);
1343  
1344          return api::count_course_module_competencies($params['cmid']);
1345      }
1346  
1347      /**
1348       * Returns description of count_course_module_competencies() result value.
1349       *
1350       * @return external_description
1351       */
1352      public static function count_course_module_competencies_returns() {
1353          return new external_value(PARAM_INT, 'The number of competencies found.');
1354      }
1355  
1356      /**
1357       * List the competencies (visible to this user) in this course.
1358       *
1359       * @param int $courseid The course id to check.
1360       * @return array
1361       */
1362      public static function list_course_competencies($courseid) {
1363          global $PAGE;
1364  
1365          $params = self::validate_parameters(self::list_course_competencies_parameters(), array(
1366              'id' => $courseid,
1367          ));
1368  
1369          $coursecontext = context_course::instance($params['id']);
1370          self::validate_context($coursecontext);
1371  
1372          $output = $PAGE->get_renderer('core');
1373  
1374          $competencies = api::list_course_competencies($params['id']);
1375          $result = array();
1376  
1377          $contextcache = array();
1378          $helper = new performance_helper();
1379          foreach ($competencies as $competency) {
1380              $context = $helper->get_context_from_competency($competency['competency']);
1381              $exporter = new competency_exporter($competency['competency'], array('context' => $context));
1382              $competencyrecord = $exporter->export($output);
1383              $exporter = new course_competency_exporter($competency['coursecompetency']);
1384              $coursecompetencyrecord = $exporter->export($output);
1385  
1386              $result[] = array(
1387                  'competency' => $competencyrecord,
1388                  'coursecompetency' => $coursecompetencyrecord
1389              );
1390          }
1391  
1392          return $result;
1393      }
1394  
1395      /**
1396       * Returns description of list_course_competencies() result value.
1397       *
1398       * @return external_description
1399       */
1400      public static function list_course_competencies_returns() {
1401          return new external_multiple_structure(
1402              new external_single_structure(array(
1403                  'competency' => competency_exporter::get_read_structure(),
1404                  'coursecompetency' => course_competency_exporter::get_read_structure()
1405              ))
1406          );
1407      }
1408  
1409      /**
1410       * Returns description of add_competency_to_course() parameters.
1411       *
1412       * @return external_function_parameters
1413       */
1414      public static function add_competency_to_course_parameters() {
1415          $courseid = new external_value(
1416              PARAM_INT,
1417              'The course id',
1418              VALUE_REQUIRED
1419          );
1420          $competencyid = new external_value(
1421              PARAM_INT,
1422              'The competency id',
1423              VALUE_REQUIRED
1424          );
1425          $params = array(
1426              'courseid' => $courseid,
1427              'competencyid' => $competencyid,
1428          );
1429          return new external_function_parameters($params);
1430      }
1431  
1432      /**
1433       * Count the competencies (visible to this user) in this course.
1434       *
1435       * @param int $courseid The course id to check.
1436       * @param int $competencyid Competency id.
1437       * @return int
1438       */
1439      public static function add_competency_to_course($courseid, $competencyid) {
1440          $params = self::validate_parameters(self::add_competency_to_course_parameters(), array(
1441              'courseid' => $courseid,
1442              'competencyid' => $competencyid,
1443          ));
1444          self::validate_context(context_course::instance($params['courseid']));
1445          return api::add_competency_to_course($params['courseid'], $params['competencyid']);
1446      }
1447  
1448      /**
1449       * Returns description of add_competency_to_course() result value.
1450       *
1451       * @return external_description
1452       */
1453      public static function add_competency_to_course_returns() {
1454          return new external_value(PARAM_BOOL, 'True if successful.');
1455      }
1456  
1457      /**
1458       * Returns description of remove_competency_from_course() parameters.
1459       *
1460       * @return external_function_parameters
1461       */
1462      public static function remove_competency_from_course_parameters() {
1463          $courseid = new external_value(
1464              PARAM_INT,
1465              'The course id',
1466              VALUE_REQUIRED
1467          );
1468          $competencyid = new external_value(
1469              PARAM_INT,
1470              'The competency id',
1471              VALUE_REQUIRED
1472          );
1473          $params = array(
1474              'courseid' => $courseid,
1475              'competencyid' => $competencyid,
1476          );
1477          return new external_function_parameters($params);
1478      }
1479  
1480      /**
1481       * Count the competencies (visible to this user) in this course.
1482       *
1483       * @param int $courseid The course id to check.
1484       * @param int $competencyid Competency id.
1485       * @return int
1486       */
1487      public static function remove_competency_from_course($courseid, $competencyid) {
1488          $params = self::validate_parameters(self::remove_competency_from_course_parameters(), array(
1489              'courseid' => $courseid,
1490              'competencyid' => $competencyid,
1491          ));
1492          self::validate_context(context_course::instance($params['courseid']));
1493          return api::remove_competency_from_course($params['courseid'], $params['competencyid']);
1494      }
1495  
1496      /**
1497       * Returns description of remove_competency_from_course() result value.
1498       *
1499       * @return external_description
1500       */
1501      public static function remove_competency_from_course_returns() {
1502          return new external_value(PARAM_BOOL, 'True if successful.');
1503      }
1504  
1505      /**
1506       * Returns description of reorder_course_competency() parameters.
1507       *
1508       * @return external_function_parameters
1509       */
1510      public static function reorder_course_competency_parameters() {
1511          $courseid = new external_value(
1512              PARAM_INT,
1513              'The course id',
1514              VALUE_REQUIRED
1515          );
1516          $competencyidfrom = new external_value(
1517              PARAM_INT,
1518              'The competency id we are moving',
1519              VALUE_REQUIRED
1520          );
1521          $competencyidto = new external_value(
1522              PARAM_INT,
1523              'The competency id we are moving to',
1524              VALUE_REQUIRED
1525          );
1526          $params = array(
1527              'courseid' => $courseid,
1528              'competencyidfrom' => $competencyidfrom,
1529              'competencyidto' => $competencyidto,
1530          );
1531          return new external_function_parameters($params);
1532      }
1533  
1534      /**
1535       * Change the order of course competencies.
1536       *
1537       * @param int $courseid The course id
1538       * @param int $competencyidfrom The competency to move.
1539       * @param int $competencyidto The competency to move to.
1540       * @return bool
1541       */
1542      public static function reorder_course_competency($courseid, $competencyidfrom, $competencyidto) {
1543          $params = self::validate_parameters(self::reorder_course_competency_parameters(), array(
1544              'courseid' => $courseid,
1545              'competencyidfrom' => $competencyidfrom,
1546              'competencyidto' => $competencyidto,
1547          ));
1548          self::validate_context(context_course::instance($params['courseid']));
1549          return api::reorder_course_competency($params['courseid'], $params['competencyidfrom'], $params['competencyidto']);
1550      }
1551  
1552      /**
1553       * Returns description of reorder_course_competency() result value.
1554       *
1555       * @return external_description
1556       */
1557      public static function reorder_course_competency_returns() {
1558          return new external_value(PARAM_BOOL, 'True if successful.');
1559      }
1560  
1561      /**
1562       * Returns description of reorder_template_competency() parameters.
1563       *
1564       * @return external_function_parameters
1565       */
1566      public static function reorder_template_competency_parameters() {
1567          $templateid = new external_value(
1568              PARAM_INT,
1569              'The template id',
1570              VALUE_REQUIRED
1571          );
1572          $competencyidfrom = new external_value(
1573              PARAM_INT,
1574              'The competency id we are moving',
1575              VALUE_REQUIRED
1576          );
1577          $competencyidto = new external_value(
1578              PARAM_INT,
1579              'The competency id we are moving to',
1580              VALUE_REQUIRED
1581          );
1582          $params = array(
1583              'templateid' => $templateid,
1584              'competencyidfrom' => $competencyidfrom,
1585              'competencyidto' => $competencyidto,
1586          );
1587          return new external_function_parameters($params);
1588      }
1589  
1590      /**
1591       * Change the order of template competencies.
1592       *
1593       * @param int $templateid The template id
1594       * @param int $competencyidfrom The competency to move.
1595       * @param int $competencyidto The competency to move to.
1596       * @return bool
1597       */
1598      public static function reorder_template_competency($templateid, $competencyidfrom, $competencyidto) {
1599          $params = self::validate_parameters(self::reorder_template_competency_parameters(), array(
1600              'templateid' => $templateid,
1601              'competencyidfrom' => $competencyidfrom,
1602              'competencyidto' => $competencyidto,
1603          ));
1604  
1605          $template = api::read_template($params['templateid']);
1606          self::validate_context($template->get_context());
1607  
1608          return api::reorder_template_competency($params['templateid'], $params['competencyidfrom'], $params['competencyidto']);
1609      }
1610  
1611      /**
1612       * Returns description of reorder_template_competency() result value.
1613       *
1614       * @return external_description
1615       */
1616      public static function reorder_template_competency_returns() {
1617          return new external_value(PARAM_BOOL, 'True if successful.');
1618      }
1619  
1620      /**
1621       * Returns description of create_template() parameters.
1622       *
1623       * @return external_function_parameters
1624       */
1625      public static function create_template_parameters() {
1626          $structure = template_exporter::get_create_structure();
1627          $params = array('template' => $structure);
1628          return new external_function_parameters($params);
1629      }
1630  
1631      /**
1632       * Create a new learning plan template
1633       *
1634       * @param array $template The list of fields for the template.
1635       * @return \stdClass Record of new template.
1636       */
1637      public static function create_template($template) {
1638          global $PAGE;
1639  
1640          $params = self::validate_parameters(self::create_template_parameters(), array('template' => $template));
1641          $params = $params['template'];
1642          $context = self::get_context_from_params($params);
1643          self::validate_context($context);
1644          $output = $PAGE->get_renderer('core');
1645  
1646          unset($params['contextlevel']);
1647          unset($params['instanceid']);
1648          $params = (object) $params;
1649          $params->contextid = $context->id;
1650  
1651          $result = api::create_template($params);
1652          $exporter = new template_exporter($result);
1653          $record = $exporter->export($output);
1654          return $record;
1655      }
1656  
1657      /**
1658       * Returns description of create_template() result value.
1659       *
1660       * @return external_description
1661       */
1662      public static function create_template_returns() {
1663          return template_exporter::get_read_structure();
1664      }
1665  
1666      /**
1667       * Returns description of read_template() parameters.
1668       *
1669       * @return external_function_parameters
1670       */
1671      public static function read_template_parameters() {
1672          $id = new external_value(
1673              PARAM_INT,
1674              'Data base record id for the template',
1675              VALUE_REQUIRED
1676          );
1677  
1678          $params = array(
1679              'id' => $id,
1680          );
1681          return new external_function_parameters($params);
1682      }
1683  
1684      /**
1685       * Read a learning plan template by id.
1686       *
1687       * @param int $id The id of the template.
1688       * @return \stdClass
1689       */
1690      public static function read_template($id) {
1691          global $PAGE;
1692  
1693          $params = self::validate_parameters(self::read_template_parameters(), array('id' => $id));
1694          $template = api::read_template($params['id']);
1695          self::validate_context($template->get_context());
1696          $output = $PAGE->get_renderer('core');
1697  
1698          $exporter = new template_exporter($template);
1699          $record = $exporter->export($output);
1700          return $record;
1701      }
1702  
1703      /**
1704       * Returns description of read_template() result value.
1705       *
1706       * @return external_description
1707       */
1708      public static function read_template_returns() {
1709          return template_exporter::get_read_structure();
1710      }
1711  
1712      /**
1713       * Returns description of delete_template() parameters.
1714       *
1715       * @return external_function_parameters
1716       */
1717      public static function delete_template_parameters() {
1718          $id = new external_value(
1719              PARAM_INT,
1720              'Data base record id for the template',
1721              VALUE_REQUIRED
1722          );
1723  
1724          $deleteplans = new external_value(
1725              PARAM_BOOL,
1726              'Boolean to indicate if plans must be deleted',
1727              VALUE_REQUIRED
1728          );
1729  
1730          $params = array(
1731              'id' => $id,
1732              'deleteplans' => $deleteplans
1733          );
1734          return new external_function_parameters($params);
1735      }
1736  
1737      /**
1738       * Delete a learning plan template
1739       *
1740       * @param int $id The learning plan template id
1741       * @param boolean $deleteplans True to delete the plans associated to template or false to unlink them
1742       * @return boolean
1743       */
1744      public static function delete_template($id, $deleteplans = true) {
1745          $params = self::validate_parameters(self::delete_template_parameters(), array(
1746              'id' => $id,
1747              'deleteplans' => $deleteplans,
1748          ));
1749  
1750          $template = api::read_template($params['id']);
1751          self::validate_context($template->get_context());
1752  
1753          return api::delete_template($params['id'], $params['deleteplans']);
1754      }
1755  
1756      /**
1757       * Returns description of delete_template() result value.
1758       *
1759       * @return external_description
1760       */
1761      public static function delete_template_returns() {
1762          return new external_value(PARAM_BOOL, 'True if the delete was successful');
1763      }
1764  
1765      /**
1766       * Returns description of update_template() parameters.
1767       *
1768       * @return external_function_parameters
1769       */
1770      public static function update_template_parameters() {
1771          $structure = template_exporter::get_update_structure();
1772          $params = array('template' => $structure);
1773          return new external_function_parameters($params);
1774      }
1775  
1776      /**
1777       * Update an existing learning plan template
1778       *
1779       * @param array $template The list of fields for the template.
1780       * @return boolean
1781       */
1782      public static function update_template($template) {
1783  
1784          $params = self::validate_parameters(self::update_template_parameters(), array('template' => $template));
1785          $params = $params['template'];
1786          $template = api::read_template($params['id']);
1787          self::validate_context($template->get_context());
1788  
1789          $params = (object) $params;
1790  
1791          return api::update_template($params);
1792      }
1793  
1794      /**
1795       * Returns description of update_template() result value.
1796       *
1797       * @return external_description
1798       */
1799      public static function update_template_returns() {
1800          return new external_value(PARAM_BOOL, 'True if the update was successful');
1801      }
1802  
1803      /**
1804       * Returns description of duplicate_template() parameters.
1805       *
1806       * @return external_function_parameters
1807       */
1808      public static function duplicate_template_parameters() {
1809          $templateid = new external_value(
1810              PARAM_INT,
1811              'The template id',
1812              VALUE_REQUIRED
1813          );
1814  
1815          $params = array(
1816              'id' => $templateid
1817          );
1818          return new external_function_parameters($params);
1819      }
1820  
1821      /**
1822       * Duplicate a learning plan template.
1823       *
1824       * @param int $id the id of the learning plan template to duplicate
1825       * @return boolean Record of new template.
1826       */
1827      public static function duplicate_template($id) {
1828          global $PAGE;
1829  
1830          $params = self::validate_parameters(self::duplicate_template_parameters(), array('id' => $id));
1831  
1832          $template = api::read_template($params['id']);
1833          self::validate_context($template->get_context());
1834          $output = $PAGE->get_renderer('core');
1835  
1836          $result = api::duplicate_template($params['id']);
1837          $exporter = new template_exporter($result);
1838          return $exporter->export($output);
1839      }
1840  
1841      /**
1842       * Returns description of duplicate_template() result value.
1843       *
1844       * @return external_description
1845       */
1846      public static function duplicate_template_returns() {
1847          return template_exporter::get_read_structure();
1848      }
1849  
1850      /**
1851       * Returns description of list_templates() parameters.
1852       *
1853       * @return external_function_parameters
1854       */
1855      public static function list_templates_parameters() {
1856          $sort = new external_value(
1857              PARAM_ALPHANUMEXT,
1858              'Column to sort by.',
1859              VALUE_DEFAULT,
1860              ''
1861          );
1862          $order = new external_value(
1863              PARAM_ALPHA,
1864              'Sort direction. Should be either ASC or DESC',
1865              VALUE_DEFAULT,
1866              ''
1867          );
1868          $skip = new external_value(
1869              PARAM_INT,
1870              'Skip this number of records before returning results',
1871              VALUE_DEFAULT,
1872              0
1873          );
1874          $limit = new external_value(
1875              PARAM_INT,
1876              'Return this number of records at most.',
1877              VALUE_DEFAULT,
1878              0
1879          );
1880          $includes = new external_value(
1881              PARAM_ALPHA,
1882              'What other contexts to fetch the templates from. (children, parents, self)',
1883              VALUE_DEFAULT,
1884              'children'
1885          );
1886          $onlyvisible = new external_value(
1887              PARAM_BOOL,
1888              'If should list only visible templates',
1889              VALUE_DEFAULT,
1890              false
1891          );
1892  
1893          $params = array(
1894              'sort' => $sort,
1895              'order' => $order,
1896              'skip' => $skip,
1897              'limit' => $limit,
1898              'context' => self::get_context_parameters(),
1899              'includes' => $includes,
1900              'onlyvisible' => $onlyvisible
1901          );
1902          return new external_function_parameters($params);
1903      }
1904  
1905      /**
1906       * List the existing learning plan templates
1907       *
1908       * @param string $sort Field to sort by.
1909       * @param string $order Sort order.
1910       * @param int $skip Limitstart.
1911       * @param int $limit Number of rows to return.
1912       * @param array $context
1913       * @param bool $includes
1914       * @param bool $onlyvisible
1915       *
1916       * @return array
1917       */
1918      public static function list_templates($sort, $order, $skip, $limit, $context, $includes, $onlyvisible) {
1919          global $PAGE;
1920  
1921          $params = self::validate_parameters(self::list_templates_parameters(), array(
1922              'sort' => $sort,
1923              'order' => $order,
1924              'skip' => $skip,
1925              'limit' => $limit,
1926              'context' => $context,
1927              'includes' => $includes,
1928              'onlyvisible' => $onlyvisible
1929          ));
1930  
1931          $context = self::get_context_from_params($params['context']);
1932          self::validate_context($context);
1933          $output = $PAGE->get_renderer('core');
1934  
1935          if ($params['order'] !== '' && $params['order'] !== 'ASC' && $params['order'] !== 'DESC') {
1936              throw new invalid_parameter_exception('Invalid order param. Must be ASC, DESC or empty.');
1937          }
1938  
1939          $results = api::list_templates($params['sort'],
1940                                         $params['order'],
1941                                         $params['skip'],
1942                                         $params['limit'],
1943                                         $context,
1944                                         $params['includes'],
1945                                         $params['onlyvisible']);
1946          $records = array();
1947          foreach ($results as $result) {
1948              $exporter = new template_exporter($result);
1949              $record = $exporter->export($output);
1950              array_push($records, $record);
1951          }
1952          return $records;
1953      }
1954  
1955      /**
1956       * Returns description of list_templates() result value.
1957       *
1958       * @return external_description
1959       */
1960      public static function list_templates_returns() {
1961          return new external_multiple_structure(template_exporter::get_read_structure());
1962      }
1963  
1964      /**
1965       * Returns description of count_templates() parameters.
1966       *
1967       * @return external_function_parameters
1968       */
1969      public static function count_templates_parameters() {
1970          $includes = new external_value(
1971              PARAM_ALPHA,
1972              'What other contextes to fetch the frameworks from. (children, parents, self)',
1973              VALUE_DEFAULT,
1974              'children'
1975          );
1976  
1977          $params = array(
1978              'context' => self::get_context_parameters(),
1979              'includes' => $includes
1980          );
1981          return new external_function_parameters($params);
1982      }
1983  
1984      /**
1985       * Count the existing learning plan templates
1986       *
1987       * @param array $context
1988       * @param string $includes
1989       * @return int
1990       */
1991      public static function count_templates($context, $includes) {
1992          $params = self::validate_parameters(self::count_templates_parameters(), array(
1993              'context' => $context,
1994              'includes' => $includes
1995          ));
1996          $context = self::get_context_from_params($params['context']);
1997          self::validate_context($context);
1998  
1999          return api::count_templates($context, $includes);
2000      }
2001  
2002      /**
2003       * Returns description of count_templates() result value.
2004       *
2005       * @return external_description
2006       */
2007      public static function count_templates_returns() {
2008          return new external_value(PARAM_INT, 'The number of learning plan templates found.');
2009      }
2010  
2011      /**
2012       * Returns description of count_templates_using_competency() parameters.
2013       *
2014       * @return external_function_parameters
2015       */
2016      public static function count_templates_using_competency_parameters() {
2017          $competencyid = new external_value(
2018              PARAM_INT,
2019              'The competency id',
2020              VALUE_REQUIRED
2021          );
2022          $params = array(
2023              'id' => $competencyid,
2024          );
2025          return new external_function_parameters($params);
2026      }
2027  
2028      /**
2029       * Count the learning plan templates (visible to this user) that use this competency.
2030       *
2031       * @param int $competencyid Competency id.
2032       * @return int
2033       */
2034      public static function count_templates_using_competency($competencyid) {
2035          $params = self::validate_parameters(self::count_templates_using_competency_parameters(), array(
2036              'id' => $competencyid,
2037          ));
2038  
2039          $competency = api::read_competency($params['id']);
2040          self::validate_context($competency->get_context());
2041  
2042          return api::count_templates_using_competency($params['id']);
2043      }
2044  
2045      /**
2046       * Returns description of count_templates_using_competency() result value.
2047       *
2048       * @return external_description
2049       */
2050      public static function count_templates_using_competency_returns() {
2051          return new external_value(PARAM_INT, 'The number of learning plan templates using this competency');
2052      }
2053  
2054      /**
2055       * Returns description of list_templates_using_competency() parameters.
2056       *
2057       * @return external_function_parameters
2058       */
2059      public static function list_templates_using_competency_parameters() {
2060          $competencyid = new external_value(
2061              PARAM_INT,
2062              'The competency id',
2063              VALUE_REQUIRED
2064          );
2065          $params = array(
2066              'id' => $competencyid,
2067          );
2068          return new external_function_parameters($params);
2069      }
2070  
2071      /**
2072       * List the learning plan templates (visible to this user) that use this competency.
2073       *
2074       * @param int $competencyid Competency id.
2075       * @return array
2076       */
2077      public static function list_templates_using_competency($competencyid) {
2078          global $PAGE;
2079  
2080          $params = self::validate_parameters(self::list_templates_using_competency_parameters(), array(
2081              'id' => $competencyid,
2082          ));
2083  
2084          $competency = api::read_competency($params['id']);
2085          self::validate_context($competency->get_context());
2086          $output = $PAGE->get_renderer('core');
2087  
2088          $templates = api::list_templates_using_competency($params['id']);
2089          $records = array();
2090  
2091          foreach ($templates as $template) {
2092              $exporter = new template_exporter($template);
2093              $record = $exporter->export($output);
2094              $records[] = $record;
2095          }
2096  
2097          return $records;
2098      }
2099  
2100      /**
2101       * Returns description of list_templates_using_competency() result value.
2102       *
2103       * @return external_description
2104       */
2105      public static function list_templates_using_competency_returns() {
2106          return new external_multiple_structure(template_exporter::get_read_structure());
2107      }
2108  
2109      /**
2110       * Returns description of count_competencies_in_template() parameters.
2111       *
2112       * @return external_function_parameters
2113       */
2114      public static function count_competencies_in_template_parameters() {
2115          $templateid = new external_value(
2116              PARAM_INT,
2117              'The template id',
2118              VALUE_REQUIRED
2119          );
2120          $params = array(
2121              'id' => $templateid,
2122          );
2123          return new external_function_parameters($params);
2124      }
2125  
2126      /**
2127       * Count the competencies (visible to this user) in this learning plan template.
2128       *
2129       * @param int $templateid The template id to check
2130       * @return int
2131       */
2132      public static function count_competencies_in_template($templateid) {
2133          $params = self::validate_parameters(self::count_competencies_in_template_parameters(), array(
2134              'id' => $templateid,
2135          ));
2136          $template = api::read_template($params['id']);
2137          self::validate_context($template->get_context());
2138  
2139          return api::count_competencies_in_template($params['id']);
2140      }
2141  
2142      /**
2143       * Returns description of count_competencies_in_template() result value.
2144       *
2145       * @return external_description
2146       */
2147      public static function count_competencies_in_template_returns() {
2148          return new external_value(PARAM_INT, 'The number of competencies in this learning plan template.');
2149      }
2150  
2151      /**
2152       * Returns description of list_competencies_in_template() parameters.
2153       *
2154       * @return external_function_parameters
2155       */
2156      public static function list_competencies_in_template_parameters() {
2157          $templateid = new external_value(
2158              PARAM_INT,
2159              'The template id',
2160              VALUE_REQUIRED
2161          );
2162          $params = array(
2163              'id' => $templateid,
2164          );
2165          return new external_function_parameters($params);
2166      }
2167  
2168      /**
2169       * List the competencies (visible to this user) in this learning plan template.
2170       *
2171       * @param int $templateid Template id.
2172       * @return array
2173       */
2174      public static function list_competencies_in_template($templateid) {
2175          global $PAGE;
2176  
2177          $params = self::validate_parameters(self::list_competencies_in_template_parameters(), array(
2178              'id' => $templateid,
2179          ));
2180  
2181          $template = api::read_template($params['id']);
2182          self::validate_context($template->get_context());
2183          $output = $PAGE->get_renderer('core');
2184  
2185          $competencies = api::list_competencies_in_template($params['id']);
2186          $results = array();
2187  
2188          $helper = new performance_helper();
2189          foreach ($competencies as $competency) {
2190              $context = $helper->get_context_from_competency($competency);
2191              $exporter = new competency_exporter($competency, array('context' => $context));
2192              $record = $exporter->export($output);
2193              array_push($results, $record);
2194          }
2195          return $results;
2196      }
2197  
2198      /**
2199       * Returns description of list_competencies_in_template() result value.
2200       *
2201       * @return external_description
2202       */
2203      public static function list_competencies_in_template_returns() {
2204          return new external_multiple_structure(competency_exporter::get_read_structure());
2205      }
2206  
2207      /**
2208       * Returns description of add_competency_to_template() parameters.
2209       *
2210       * @return external_function_parameters
2211       */
2212      public static function add_competency_to_template_parameters() {
2213          $templateid = new external_value(
2214              PARAM_INT,
2215              'The template id',
2216              VALUE_REQUIRED
2217          );
2218          $competencyid = new external_value(
2219              PARAM_INT,
2220              'The competency id',
2221              VALUE_REQUIRED
2222          );
2223          $params = array(
2224              'templateid' => $templateid,
2225              'competencyid' => $competencyid,
2226          );
2227          return new external_function_parameters($params);
2228      }
2229  
2230      /**
2231       * Count the competencies (visible to this user) in this template.
2232       *
2233       * @param int $templateid Template id.
2234       * @param int $competencyid Competency id.
2235       * @return int
2236       */
2237      public static function add_competency_to_template($templateid, $competencyid) {
2238          global $PAGE;
2239          $params = self::validate_parameters(self::add_competency_to_template_parameters(), array(
2240              'templateid' => $templateid,
2241              'competencyid' => $competencyid,
2242          ));
2243  
2244          $template = api::read_template($params['templateid']);
2245          self::validate_context($template->get_context());
2246  
2247          return api::add_competency_to_template($params['templateid'], $params['competencyid']);
2248      }
2249  
2250      /**
2251       * Returns description of add_competency_to_template() result value.
2252       *
2253       * @return external_description
2254       */
2255      public static function add_competency_to_template_returns() {
2256          return new external_value(PARAM_BOOL, 'True if successful.');
2257      }
2258  
2259      /**
2260       * Returns description of add_competency_to_plan() parameters.
2261       *
2262       * @return external_function_parameters
2263       */
2264      public static function add_competency_to_plan_parameters() {
2265          $planid = new external_value(
2266              PARAM_INT,
2267              'The plan id',
2268              VALUE_REQUIRED
2269          );
2270          $competencyid = new external_value(
2271              PARAM_INT,
2272              'The competency id',
2273              VALUE_REQUIRED
2274          );
2275          $params = array(
2276              'planid' => $planid,
2277              'competencyid' => $competencyid,
2278          );
2279          return new external_function_parameters($params);
2280      }
2281  
2282      /**
2283       * add competency to a learning plan.
2284       *
2285       * @param int $planid Plan id.
2286       * @param int $competencyid Competency id.
2287       * @return int
2288       */
2289      public static function add_competency_to_plan($planid, $competencyid) {
2290          $params = self::validate_parameters(self::add_competency_to_plan_parameters(), array(
2291              'planid' => $planid,
2292              'competencyid' => $competencyid,
2293          ));
2294  
2295          $plan = api::read_plan($params['planid']);
2296          self::validate_context($plan->get_context());
2297  
2298          return api::add_competency_to_plan($params['planid'], $params['competencyid']);
2299      }
2300  
2301      /**
2302       * Returns description of add_competency_to_plan() result value.
2303       *
2304       * @return external_description
2305       */
2306      public static function add_competency_to_plan_returns() {
2307          return new external_value(PARAM_BOOL, 'True if successful.');
2308      }
2309  
2310      /**
2311       * Returns description of remove_competency_from_plan() parameters.
2312       *
2313       * @return external_function_parameters
2314       */
2315      public static function remove_competency_from_plan_parameters() {
2316          $planid = new external_value(
2317              PARAM_INT,
2318              'The plan id',
2319              VALUE_REQUIRED
2320          );
2321          $competencyid = new external_value(
2322              PARAM_INT,
2323              'The competency id',
2324              VALUE_REQUIRED
2325          );
2326          $params = array(
2327              'planid' => $planid,
2328              'competencyid' => $competencyid,
2329          );
2330          return new external_function_parameters($params);
2331      }
2332  
2333      /**
2334       * Remove a competency from plan.
2335       *
2336       * @param int $planid Plan id.
2337       * @param int $competencyid Competency id.
2338       * @return int
2339       */
2340      public static function remove_competency_from_plan($planid, $competencyid) {
2341          $params = self::validate_parameters(self::remove_competency_from_plan_parameters(), array(
2342              'planid' => $planid,
2343              'competencyid' => $competencyid,
2344          ));
2345          $plan = api::read_plan($params['planid']);
2346          self::validate_context($plan->get_context());
2347  
2348          return api::remove_competency_from_plan($params['planid'], $params['competencyid']);
2349      }
2350  
2351      /**
2352       * Returns description of remove_competency_from_plan() result value.
2353       *
2354       * @return external_description
2355       */
2356      public static function remove_competency_from_plan_returns() {
2357          return new external_value(PARAM_BOOL, 'True if successful.');
2358      }
2359  
2360      /**
2361       * Returns description of remove_competency_from_template() parameters.
2362       *
2363       * @return external_function_parameters
2364       */
2365      public static function remove_competency_from_template_parameters() {
2366          $templateid = new external_value(
2367              PARAM_INT,
2368              'The template id',
2369              VALUE_REQUIRED
2370          );
2371          $competencyid = new external_value(
2372              PARAM_INT,
2373              'The competency id',
2374              VALUE_REQUIRED
2375          );
2376          $params = array(
2377              'templateid' => $templateid,
2378              'competencyid' => $competencyid,
2379          );
2380          return new external_function_parameters($params);
2381      }
2382  
2383      /**
2384       * Returns description of reorder_plan_competency() parameters.
2385       *
2386       * @return external_function_parameters
2387       */
2388      public static function reorder_plan_competency_parameters() {
2389          $planid = new external_value(
2390              PARAM_INT,
2391              'The plan id',
2392              VALUE_REQUIRED
2393          );
2394          $competencyidfrom = new external_value(
2395              PARAM_INT,
2396              'The competency id we are moving',
2397              VALUE_REQUIRED
2398          );
2399          $competencyidto = new external_value(
2400              PARAM_INT,
2401              'The competency id we are moving to',
2402              VALUE_REQUIRED
2403          );
2404          $params = array(
2405              'planid' => $planid,
2406              'competencyidfrom' => $competencyidfrom,
2407              'competencyidto' => $competencyidto,
2408          );
2409          return new external_function_parameters($params);
2410      }
2411  
2412      /**
2413       * Change the order of plan competencies.
2414       *
2415       * @param int $planid The plan id
2416       * @param int $competencyidfrom The competency to move.
2417       * @param int $competencyidto The competency to move to.
2418       * @return bool
2419       */
2420      public static function reorder_plan_competency($planid, $competencyidfrom, $competencyidto) {
2421          $params = self::validate_parameters(self::reorder_plan_competency_parameters(), array(
2422              'planid' => $planid,
2423              'competencyidfrom' => $competencyidfrom,
2424              'competencyidto' => $competencyidto,
2425          ));
2426  
2427          $plan = api::read_plan($params['planid']);
2428          self::validate_context($plan->get_context());
2429  
2430          return api::reorder_plan_competency($params['planid'], $params['competencyidfrom'], $params['competencyidto']);
2431      }
2432  
2433      /**
2434       * Returns description of reorder_plan_competency() result value.
2435       *
2436       * @return external_description
2437       */
2438      public static function reorder_plan_competency_returns() {
2439          return new external_value(PARAM_BOOL, 'True if successful.');
2440      }
2441  
2442      /**
2443       * Returns description of external function parameters.
2444       *
2445       * @return external_function_parameters
2446       */
2447      public static function user_competency_cancel_review_request_parameters() {
2448          return new external_function_parameters(array(
2449              'userid' => new external_value(PARAM_INT, 'The user ID'),
2450              'competencyid' => new external_value(PARAM_INT, 'The competency ID'),
2451          ));
2452      }
2453  
2454      /**
2455       * External function user_competency_cancel_review_request.
2456       *
2457       * @param int $userid The user ID.
2458       * @param int $competencyid The competency ID.
2459       * @return boolean
2460       */
2461      public static function user_competency_cancel_review_request($userid, $competencyid) {
2462          $params = self::validate_parameters(self::user_competency_cancel_review_request_parameters(), array(
2463              'userid' => $userid,
2464              'competencyid' => $competencyid
2465          ));
2466  
2467          $context = context_user::instance($params['userid']);
2468          self::validate_context($context);
2469  
2470          return api::user_competency_cancel_review_request($userid, $competencyid);
2471      }
2472  
2473      /**
2474       * Returns description of external function result value.
2475       *
2476       * @return external_function_parameters
2477       */
2478      public static function user_competency_cancel_review_request_returns() {
2479          return new external_value(PARAM_BOOL, 'The success');
2480      }
2481  
2482      /**
2483       * Returns description of external function parameters.
2484       *
2485       * @return external_function_parameters
2486       */
2487      public static function user_competency_request_review_parameters() {
2488          return new external_function_parameters(array(
2489              'userid' => new external_value(PARAM_INT, 'The user ID'),
2490              'competencyid' => new external_value(PARAM_INT, 'The competency ID'),
2491          ));
2492      }
2493  
2494      /**
2495       * External function user_competency_request_review.
2496       *
2497       * @param int $userid The user ID.
2498       * @param int $competencyid The competency ID.
2499       * @return boolean
2500       */
2501      public static function user_competency_request_review($userid, $competencyid) {
2502          $params = self::validate_parameters(self::user_competency_request_review_parameters(), array(
2503              'userid' => $userid,
2504              'competencyid' => $competencyid,
2505          ));
2506  
2507          $context = context_user::instance($params['userid']);
2508          self::validate_context($context);
2509  
2510          return api::user_competency_request_review($userid, $competencyid);
2511      }
2512  
2513      /**
2514       * Returns description of external function result value.
2515       *
2516       * @return external_function_parameters
2517       */
2518      public static function user_competency_request_review_returns() {
2519          return new external_value(PARAM_BOOL, 'The success');
2520      }
2521  
2522      /**
2523       * Returns description of external function parameters.
2524       *
2525       * @return external_function_parameters
2526       */
2527      public static function user_competency_start_review_parameters() {
2528          return new external_function_parameters(array(
2529              'userid' => new external_value(PARAM_INT, 'The user ID'),
2530              'competencyid' => new external_value(PARAM_INT, 'The competency ID'),
2531          ));
2532      }
2533  
2534      /**
2535       * External function user_competency_start_review.
2536       *
2537       * @param int $userid The user ID.
2538       * @param int $competencyid The competency ID.
2539       * @return boolean
2540       */
2541      public static function user_competency_start_review($userid, $competencyid) {
2542          $params = self::validate_parameters(self::user_competency_start_review_parameters(), array(
2543              'userid' => $userid,
2544              'competencyid' => $competencyid
2545          ));
2546  
2547          $context = context_user::instance($params['userid']);
2548          self::validate_context($context);
2549  
2550          return api::user_competency_start_review($userid, $competencyid);
2551      }
2552  
2553      /**
2554       * Returns description of external function result value.
2555       *
2556       * @return external_function_parameters
2557       */
2558      public static function user_competency_start_review_returns() {
2559          return new external_value(PARAM_BOOL, 'The success');
2560      }
2561  
2562      /**
2563       * Returns description of external function parameters.
2564       *
2565       * @return external_function_parameters
2566       */
2567      public static function user_competency_stop_review_parameters() {
2568          return new external_function_parameters(array(
2569              'userid' => new external_value(PARAM_INT, 'The user ID'),
2570              'competencyid' => new external_value(PARAM_INT, 'The competency ID'),
2571          ));
2572      }
2573  
2574      /**
2575       * External function user_competency_stop_review.
2576       *
2577       * @param int $userid The user ID.
2578       * @param int $competencyid The competency ID.
2579       * @return boolean
2580       */
2581      public static function user_competency_stop_review($userid, $competencyid) {
2582          $params = self::validate_parameters(self::user_competency_stop_review_parameters(), array(
2583              'userid' => $userid,
2584              'competencyid' => $competencyid
2585          ));
2586  
2587          $context = context_user::instance($params['userid']);
2588          self::validate_context($context);
2589  
2590          return api::user_competency_stop_review($userid, $competencyid);
2591      }
2592  
2593      /**
2594       * Returns description of external function result value.
2595       *
2596       * @return external_function_parameters
2597       */
2598      public static function user_competency_stop_review_returns() {
2599          return new external_value(PARAM_BOOL, 'The success');
2600      }
2601  
2602      /**
2603       * Returns description of template_has_related_data() parameters.
2604       *
2605       * @return external_function_parameters
2606       */
2607      public static function template_has_related_data_parameters() {
2608          $templateid = new external_value(
2609              PARAM_INT,
2610              'The template id',
2611              VALUE_REQUIRED
2612          );
2613          $params = array(
2614              'id' => $templateid,
2615          );
2616          return new external_function_parameters($params);
2617      }
2618  
2619      /**
2620       * Check if template has related data.
2621       *
2622       * @param int $templateid Template id.
2623       * @return boolean
2624       */
2625      public static function template_has_related_data($templateid) {
2626          $params = self::validate_parameters(self::template_has_related_data_parameters(), array(
2627              'id' => $templateid,
2628          ));
2629  
2630          $template = api::read_template($params['id']);
2631          self::validate_context($template->get_context());
2632  
2633          return api::template_has_related_data($params['id']);
2634      }
2635  
2636      /**
2637       * Returns description of template_has_related_data() result value.
2638       *
2639       * @return external_description
2640       */
2641      public static function template_has_related_data_returns() {
2642          return new external_value(PARAM_BOOL, 'True if the template has related data');
2643      }
2644  
2645      /**
2646       * Count the competencies (visible to this user) in this learning plan template.
2647       *
2648       * @param int $templateid Template id.
2649       * @param int $competencyid Competency id.
2650       * @return int
2651       */
2652      public static function remove_competency_from_template($templateid, $competencyid) {
2653          $params = self::validate_parameters(self::remove_competency_from_template_parameters(), array(
2654              'templateid' => $templateid,
2655              'competencyid' => $competencyid,
2656          ));
2657          $template = api::read_template($params['templateid']);
2658          self::validate_context($template->get_context());
2659  
2660          return api::remove_competency_from_template($params['templateid'], $params['competencyid']);
2661      }
2662  
2663      /**
2664       * Returns description of remove_competency_from_template() result value.
2665       *
2666       * @return external_description
2667       */
2668      public static function remove_competency_from_template_returns() {
2669          return new external_value(PARAM_BOOL, 'True if successful.');
2670      }
2671  
2672      /**
2673       * Returns description of create_plan() parameters.
2674       *
2675       * @return external_function_parameters
2676       */
2677      public static function create_plan_parameters() {
2678          $structure = plan_exporter::get_create_structure();
2679          $params = array('plan' => $structure);
2680          return new external_function_parameters($params);
2681      }
2682  
2683      /**
2684       * Create a new learning plan.
2685       *
2686       * @param array $plan List of fields for the plan.
2687       * @return array New plan record.
2688       */
2689      public static function create_plan($plan) {
2690          global $PAGE;
2691  
2692          $params = self::validate_parameters(self::create_plan_parameters(), array('plan' => $plan));
2693          $params = $params['plan'];
2694  
2695          $context = context_user::instance($params['userid']);
2696          self::validate_context($context);
2697          $output = $PAGE->get_renderer('core');
2698  
2699          $params = (object) $params;
2700  
2701          $result = api::create_plan($params);
2702          $exporter = new plan_exporter($result, array('template' => null));
2703          return $exporter->export($output);
2704      }
2705  
2706      /**
2707       * Returns description of create_plan() result value.
2708       *
2709       * @return external_description
2710       */
2711      public static function create_plan_returns() {
2712          return plan_exporter::get_read_structure();
2713      }
2714  
2715      /**
2716       * Returns description of update_plan() parameters.
2717       *
2718       * @return external_function_parameters
2719       */
2720      public static function update_plan_parameters() {
2721          $structure = plan_exporter::get_update_structure();
2722          $params = array('plan' => $structure);
2723          return new external_function_parameters($params);
2724      }
2725  
2726      /**
2727       * Updates a new learning plan.
2728       *
2729       * @param array $plan Fields for the plan (id is required)
2730       * @return mixed
2731       */
2732      public static function update_plan($plan) {
2733          global $PAGE;
2734  
2735          $params = self::validate_parameters(self::update_plan_parameters(), array('plan' => $plan));
2736  
2737          $params = $params['plan'];
2738  
2739          $plan = api::read_plan($params['id']);
2740          self::validate_context($plan->get_context());
2741          $output = $PAGE->get_renderer('core');
2742  
2743          $params = (object) $params;
2744          $result = api::update_plan($params);
2745          $exporter = new plan_exporter($result, ['template' => $plan->get_template()]);
2746          return $exporter->export($output);
2747      }
2748  
2749      /**
2750       * Returns description of update_plan() result value.
2751       *
2752       * @return external_description
2753       */
2754      public static function update_plan_returns() {
2755          return plan_exporter::get_read_structure();
2756      }
2757  
2758      /**
2759       * Returns description of complete_plan() parameters.
2760       *
2761       * @return external_function_parameters
2762       */
2763      public static function complete_plan_parameters() {
2764          $planid = new external_value(
2765              PARAM_INT,
2766              'The plan id',
2767              VALUE_REQUIRED
2768          );
2769          $params = array('planid' => $planid);
2770          return new external_function_parameters($params);
2771      }
2772  
2773      /**
2774       * Complete Learning plan.
2775       *
2776       * @param int $planid plan id (id is required)
2777       * @return boolean
2778       */
2779      public static function complete_plan($planid) {
2780          $params = self::validate_parameters(self::complete_plan_parameters(), array(
2781              'planid' => $planid
2782          ));
2783  
2784          return api::complete_plan($params['planid']);
2785      }
2786  
2787      /**
2788       * Returns description of complete_plan() result value.
2789       *
2790       * @return external_description
2791       */
2792      public static function complete_plan_returns() {
2793          return new external_value(PARAM_BOOL, 'True if completing learning plan was successful');
2794      }
2795  
2796      /**
2797       * Returns description of reopen_plan() parameters.
2798       *
2799       * @return external_function_parameters
2800       */
2801      public static function reopen_plan_parameters() {
2802          $planid = new external_value(
2803              PARAM_INT,
2804              'The plan id',
2805              VALUE_REQUIRED
2806          );
2807          $params = array('planid' => $planid);
2808          return new external_function_parameters($params);
2809      }
2810  
2811      /**
2812       * Reopen Learning plan.
2813       *
2814       * @param int $planid plan id (id is required)
2815       * @return boolean
2816       */
2817      public static function reopen_plan($planid) {
2818          $params = self::validate_parameters(self::reopen_plan_parameters(), array(
2819              'planid' => $planid
2820          ));
2821  
2822          return api::reopen_plan($params['planid']);
2823      }
2824  
2825      /**
2826       * Returns description of reopen_plan() result value.
2827       *
2828       * @return external_description
2829       */
2830      public static function reopen_plan_returns() {
2831          return new external_value(PARAM_BOOL, 'True if reopening learning plan was successful');
2832      }
2833  
2834      /**
2835       * Returns description of read_plan() parameters.
2836       *
2837       * @return external_function_parameters
2838       */
2839      public static function read_plan_parameters() {
2840          $id = new external_value(
2841              PARAM_INT,
2842              'Data base record id for the plan',
2843              VALUE_REQUIRED
2844          );
2845          return new external_function_parameters(array('id' => $id));
2846      }
2847  
2848      /**
2849       * Read a plan by id.
2850       *
2851       * @param int $id The id of the plan.
2852       * @return \stdClass
2853       */
2854      public static function read_plan($id) {
2855          global $PAGE;
2856  
2857          $params = self::validate_parameters(self::read_plan_parameters(), array(
2858              'id' => $id,
2859          ));
2860  
2861          $plan = api::read_plan($params['id']);
2862          self::validate_context($plan->get_context());
2863          $output = $PAGE->get_renderer('core');
2864  
2865          $exporter = new plan_exporter($plan, array('template' => $plan->get_template()));
2866          $record = $exporter->export($output);
2867          return external_api::clean_returnvalue(self::read_plan_returns(), $record);
2868      }
2869  
2870      /**
2871       * Returns description of read_plan() result value.
2872       *
2873       * @return external_description
2874       */
2875      public static function read_plan_returns() {
2876          return plan_exporter::get_read_structure();
2877      }
2878  
2879      /**
2880       * Returns description of delete_plan() parameters.
2881       *
2882       * @return external_function_parameters
2883       */
2884      public static function delete_plan_parameters() {
2885          $id = new external_value(
2886              PARAM_INT,
2887              'Data base record id for the learning plan',
2888              VALUE_REQUIRED
2889          );
2890  
2891          $params = array(
2892              'id' => $id,
2893          );
2894          return new external_function_parameters($params);
2895      }
2896  
2897      /**
2898       * Delete a plan.
2899       *
2900       * @param int $id The plan id
2901       * @return boolean
2902       */
2903      public static function delete_plan($id) {
2904          $params = self::validate_parameters(self::delete_plan_parameters(), array(
2905              'id' => $id,
2906          ));
2907  
2908          $plan = api::read_plan($params['id']);
2909          self::validate_context($plan->get_context());
2910  
2911          return external_api::clean_returnvalue(self::delete_plan_returns(), api::delete_plan($params['id']));
2912      }
2913  
2914      /**
2915       * Returns description of delete_plan() result value.
2916       *
2917       * @return external_description
2918       */
2919      public static function delete_plan_returns() {
2920          return new external_value(PARAM_BOOL, 'True if the delete was successful');
2921      }
2922  
2923      /**
2924       * Returns description of external function parameters.
2925       *
2926       * @return external_function_parameters
2927       */
2928      public static function plan_cancel_review_request_parameters() {
2929          return new external_function_parameters(array(
2930              'id' => new external_value(PARAM_INT, 'The plan ID'),
2931          ));
2932      }
2933  
2934      /**
2935       * External function plan_cancel_review_request.
2936       *
2937       * @param int $id The plan ID.
2938       * @return boolean
2939       */
2940      public static function plan_cancel_review_request($id) {
2941          $params = self::validate_parameters(self::plan_cancel_review_request_parameters(), array(
2942              'id' => $id
2943          ));
2944  
2945          $plan = api::read_plan($id);
2946          self::validate_context($plan->get_context());
2947  
2948          return api::plan_cancel_review_request($plan);
2949      }
2950  
2951      /**
2952       * Returns description of external function result value.
2953       *
2954       * @return external_function_parameters
2955       */
2956      public static function plan_cancel_review_request_returns() {
2957          return new external_value(PARAM_BOOL, 'The success');
2958      }
2959  
2960      /**
2961       * Returns description of external function parameters.
2962       *
2963       * @return external_function_parameters
2964       */
2965      public static function plan_request_review_parameters() {
2966          return new external_function_parameters(array(
2967              'id' => new external_value(PARAM_INT, 'The plan ID'),
2968          ));
2969      }
2970  
2971      /**
2972       * External function plan_request_review.
2973       *
2974       * @param int $id The plan ID.
2975       * @return boolean
2976       */
2977      public static function plan_request_review($id) {
2978          $params = self::validate_parameters(self::plan_request_review_parameters(), array(
2979              'id' => $id
2980          ));
2981  
2982          $plan = api::read_plan($id);
2983          self::validate_context($plan->get_context());
2984  
2985          return api::plan_request_review($plan);
2986      }
2987  
2988      /**
2989       * Returns description of external function result value.
2990       *
2991       * @return external_function_parameters
2992       */
2993      public static function plan_request_review_returns() {
2994          return new external_value(PARAM_BOOL, 'The success');
2995      }
2996  
2997      /**
2998       * Returns description of external function parameters.
2999       *
3000       * @return external_function_parameters
3001       */
3002      public static function plan_start_review_parameters() {
3003          return new external_function_parameters(array(
3004              'id' => new external_value(PARAM_INT, 'The plan ID'),
3005          ));
3006      }
3007  
3008      /**
3009       * External function plan_start_review.
3010       *
3011       * @param int $id The plan ID.
3012       * @return boolean
3013       */
3014      public static function plan_start_review($id) {
3015          $params = self::validate_parameters(self::plan_start_review_parameters(), array(
3016              'id' => $id
3017          ));
3018  
3019          $plan = api::read_plan($id);
3020          self::validate_context($plan->get_context());
3021  
3022          return api::plan_start_review($plan);
3023      }
3024  
3025      /**
3026       * Returns description of external function result value.
3027       *
3028       * @return external_function_parameters
3029       */
3030      public static function plan_start_review_returns() {
3031          return new external_value(PARAM_BOOL, 'The success');
3032      }
3033  
3034      /**
3035       * Returns description of external function parameters.
3036       *
3037       * @return external_function_parameters
3038       */
3039      public static function plan_stop_review_parameters() {
3040          return new external_function_parameters(array(
3041              'id' => new external_value(PARAM_INT, 'The plan ID'),
3042          ));
3043      }
3044  
3045      /**
3046       * External function plan_stop_review.
3047       *
3048       * @param int $id The plan ID.
3049       * @return boolean
3050       */
3051      public static function plan_stop_review($id) {
3052          $params = self::validate_parameters(self::plan_stop_review_parameters(), array(
3053              'id' => $id
3054          ));
3055  
3056          $plan = api::read_plan($id);
3057          self::validate_context($plan->get_context());
3058  
3059          return api::plan_stop_review($plan);
3060      }
3061  
3062      /**
3063       * Returns description of external function result value.
3064       *
3065       * @return external_function_parameters
3066       */
3067      public static function plan_stop_review_returns() {
3068          return new external_value(PARAM_BOOL, 'The success');
3069      }
3070  
3071      /**
3072       * Returns description of external function parameters.
3073       *
3074       * @return external_function_parameters
3075       */
3076      public static function approve_plan_parameters() {
3077          return new external_function_parameters(array(
3078              'id' => new external_value(PARAM_INT, 'The plan ID'),
3079          ));
3080      }
3081  
3082      /**
3083       * External function approve_plan.
3084       *
3085       * @param int $id The plan ID.
3086       * @return boolean
3087       */
3088      public static function approve_plan($id) {
3089          $params = self::validate_parameters(self::approve_plan_parameters(), array(
3090              'id' => $id,
3091          ));
3092  
3093          $plan = api::read_plan($id);
3094          self::validate_context($plan->get_context());
3095  
3096          return api::approve_plan($plan);
3097      }
3098  
3099      /**
3100       * Returns description of external function result value.
3101       *
3102       * @return external_function_parameters
3103       */
3104      public static function approve_plan_returns() {
3105          return new external_value(PARAM_BOOL, 'The success');
3106      }
3107  
3108      /**
3109       * Returns description of external function parameters.
3110       *
3111       * @return external_function_parameters
3112       */
3113      public static function unapprove_plan_parameters() {
3114          return new external_function_parameters(array(
3115              'id' => new external_value(PARAM_INT, 'The plan ID'),
3116          ));
3117      }
3118  
3119      /**
3120       * External function unapprove_plan.
3121       *
3122       * @param int $id The plan ID.
3123       * @return boolean
3124       */
3125      public static function unapprove_plan($id) {
3126          $params = self::validate_parameters(self::unapprove_plan_parameters(), array(
3127              'id' => $id,
3128          ));
3129  
3130          $plan = api::read_plan($id);
3131          self::validate_context($plan->get_context());
3132  
3133          return api::unapprove_plan($plan);
3134      }
3135  
3136      /**
3137       * Returns description of external function result value.
3138       *
3139       * @return external_function_parameters
3140       */
3141      public static function unapprove_plan_returns() {
3142          return new external_value(PARAM_BOOL, 'The success');
3143      }
3144  
3145      /**
3146       * External function parameters structure.
3147       *
3148       * @return external_description
3149       */
3150      public static function list_plan_competencies_parameters() {
3151          return new external_function_parameters(array(
3152              'id' => new external_value(PARAM_INT, 'The plan ID.')
3153          ));
3154      }
3155  
3156      /**
3157       * List plan competencies.
3158       * @param  int $id The plan ID.
3159       * @return array
3160       */
3161      public static function list_plan_competencies($id) {
3162          global $PAGE;
3163  
3164          $params = self::validate_parameters(self::list_plan_competencies_parameters(), array('id' => $id));
3165          $id = $params['id'];
3166          $plan = api::read_plan($id);
3167          $usercontext = $plan->get_context();
3168          self::validate_context($usercontext);
3169          $output = $PAGE->get_renderer('core');
3170  
3171          $result = api::list_plan_competencies($plan);
3172  
3173          if ($plan->get('status') == plan::STATUS_COMPLETE) {
3174              $ucproperty = 'usercompetencyplan';
3175          } else {
3176              $ucproperty = 'usercompetency';
3177          }
3178  
3179          $helper = new performance_helper();
3180          foreach ($result as $key => $r) {
3181              $context = $helper->get_context_from_competency($r->competency);
3182              $scale = $helper->get_scale_from_competency($r->competency);
3183  
3184              $exporter = new competency_exporter($r->competency, array('context' => $context));
3185              $r->competency = $exporter->export($output);
3186  
3187              if ($r->usercompetency) {
3188                  $exporter = new user_competency_exporter($r->usercompetency, array('scale' => $scale));
3189                  $r->usercompetency = $exporter->export($output);
3190                  unset($r->usercompetencyplan);
3191              } else {
3192                  $exporter = new user_competency_plan_exporter($r->usercompetencyplan, array('scale' => $scale));
3193                  $r->usercompetencyplan = $exporter->export($output);
3194                  unset($r->usercompetency);
3195              }
3196          }
3197          return $result;
3198      }
3199  
3200      /**
3201       * External function return structure.
3202       *
3203       * @return external_description
3204       */
3205      public static function list_plan_competencies_returns() {
3206          $uc = user_competency_exporter::get_read_structure();
3207          $ucp = user_competency_plan_exporter::get_read_structure();
3208  
3209          $uc->required = VALUE_OPTIONAL;
3210          $ucp->required = VALUE_OPTIONAL;
3211  
3212          return new external_multiple_structure(
3213              new external_single_structure(array(
3214                  'competency' => competency_exporter::get_read_structure(),
3215                  'usercompetency' => $uc,
3216                  'usercompetencyplan' => $ucp
3217              ))
3218          );
3219      }
3220  
3221      /**
3222       * Returns description of external function parameters.
3223       *
3224       * @return external_function_parameters
3225       */
3226      public static function list_user_plans_parameters() {
3227          return new external_function_parameters(array(
3228              'userid' => new external_value(PARAM_INT, 'The user ID'),
3229          ));
3230      }
3231  
3232      /**
3233       * External function list_user_plans.
3234       *
3235       * @param int $userid The user ID.
3236       * @return boolean
3237       */
3238      public static function list_user_plans($userid) {
3239          global $PAGE;
3240          $params = self::validate_parameters(self::list_user_plans_parameters(), array(
3241              'userid' => $userid
3242          ));
3243  
3244          $context = context_user::instance($params['userid']);
3245          self::validate_context($context);
3246          $output = $PAGE->get_renderer('core');
3247  
3248          $response = array();
3249          $plans = api::list_user_plans($params['userid']);
3250          foreach ($plans as $plan) {
3251              $exporter = new plan_exporter($plan, array('template' => $plan->get_template()));
3252              $response[] = $exporter->export($output);
3253          }
3254  
3255          return $response;
3256      }
3257  
3258      /**
3259       * Returns description of external function result value.
3260       *
3261       * @return external_function_parameters
3262       */
3263      public static function list_user_plans_returns() {
3264          return new external_multiple_structure(
3265              plan_exporter::get_read_structure()
3266          );
3267      }
3268  
3269      /**
3270       * Returns description of external function parameters.
3271       *
3272       * @return external_description
3273       */
3274      public static function read_user_evidence_parameters() {
3275          return new external_function_parameters(array(
3276              'id' => new external_value(PARAM_INT, 'The user evidence ID.'),
3277          ));
3278      }
3279  
3280      /**
3281       * Delete a user evidence.
3282       *
3283       * @param int $id The evidence id
3284       * @return boolean
3285       */
3286      public static function read_user_evidence($id) {
3287          global $PAGE;
3288          $params = self::validate_parameters(self::read_user_evidence_parameters(), array('id' => $id));
3289  
3290          $userevidence = api::read_user_evidence($params['id']);
3291          $context = $userevidence->get_context();
3292          self::validate_context($context);
3293          $output = $PAGE->get_renderer('core');
3294  
3295          $exporter = new user_evidence_exporter($userevidence, array('context' => $context,
3296              'competencies' => $userevidence->get_competencies()));
3297          return $exporter->export($output);
3298      }
3299  
3300      /**
3301       * Returns description of external function result value.
3302       *
3303       * @return external_description
3304       */
3305      public static function read_user_evidence_returns() {
3306          return user_evidence_exporter::get_read_structure();
3307      }
3308  
3309      /**
3310       * Returns description of external function parameters.
3311       *
3312       * @return external_function_parameters
3313       */
3314      public static function delete_user_evidence_parameters() {
3315          return new external_function_parameters(array(
3316              'id' => new external_value(PARAM_INT, 'The user evidence ID.'),
3317          ));
3318      }
3319  
3320      /**
3321       * Delete a user evidence.
3322       *
3323       * @param int $id The evidence id
3324       * @return boolean
3325       */
3326      public static function delete_user_evidence($id) {
3327          $params = self::validate_parameters(self::delete_user_evidence_parameters(), array('id' => $id));
3328  
3329          $userevidence = api::read_user_evidence($params['id']);
3330          self::validate_context($userevidence->get_context());
3331  
3332          return api::delete_user_evidence($userevidence->get('id'));
3333      }
3334  
3335      /**
3336       * Returns description of external function result value.
3337       *
3338       * @return external_description
3339       */
3340      public static function delete_user_evidence_returns() {
3341          return new external_value(PARAM_BOOL, 'True if the delete was successful');
3342      }
3343  
3344      /**
3345       * Returns description of external function parameters.
3346       *
3347       * @return external_function_parameters
3348       */
3349      public static function create_user_evidence_competency_parameters() {
3350          return new external_function_parameters(array(
3351              'userevidenceid' => new external_value(PARAM_INT, 'The user evidence ID.'),
3352              'competencyid' => new external_value(PARAM_INT, 'The competency ID.'),
3353          ));
3354      }
3355  
3356      /**
3357       * Delete a user evidence competency relationship.
3358       *
3359       * @param int $userevidenceid The user evidence id.
3360       * @param int $competencyid The competency id.
3361       * @return boolean
3362       */
3363      public static function create_user_evidence_competency($userevidenceid, $competencyid) {
3364          global $PAGE;
3365          $params = self::validate_parameters(self::create_user_evidence_competency_parameters(), array(
3366              'userevidenceid' => $userevidenceid,
3367              'competencyid' => $competencyid,
3368          ));
3369  
3370          $userevidence = api::read_user_evidence($params['userevidenceid']);
3371          self::validate_context($userevidence->get_context());
3372  
3373          $relation = api::create_user_evidence_competency($userevidence, $competencyid);
3374          $exporter = new user_evidence_competency_exporter($relation);
3375          return $exporter->export($PAGE->get_renderer('core'));
3376      }
3377  
3378      /**
3379       * Returns description of external function result value.
3380       *
3381       * @return external_description
3382       */
3383      public static function create_user_evidence_competency_returns() {
3384          return user_evidence_competency_exporter::get_read_structure();
3385      }
3386  
3387      /**
3388       * Returns description of external function parameters.
3389       *
3390       * @return external_function_parameters
3391       */
3392      public static function delete_user_evidence_competency_parameters() {
3393          return new external_function_parameters(array(
3394              'userevidenceid' => new external_value(PARAM_INT, 'The user evidence ID.'),
3395              'competencyid' => new external_value(PARAM_INT, 'The competency ID.'),
3396          ));
3397      }
3398  
3399      /**
3400       * Delete a user evidence competency relationship.
3401       *
3402       * @param int $userevidenceid The user evidence id.
3403       * @param int $competencyid The competency id.
3404       * @return boolean
3405       */
3406      public static function delete_user_evidence_competency($userevidenceid, $competencyid) {
3407          $params = self::validate_parameters(self::delete_user_evidence_competency_parameters(), array(
3408              'userevidenceid' => $userevidenceid,
3409              'competencyid' => $competencyid,
3410          ));
3411  
3412          $userevidence = api::read_user_evidence($params['userevidenceid']);
3413          self::validate_context($userevidence->get_context());
3414  
3415          return api::delete_user_evidence_competency($userevidence, $params['competencyid']);
3416      }
3417  
3418      /**
3419       * Returns description of external function result value.
3420       *
3421       * @return external_description
3422       */
3423      public static function delete_user_evidence_competency_returns() {
3424          return new external_value(PARAM_BOOL, 'True if the delete was successful');
3425      }
3426  
3427      /**
3428       * Returns description of external function parameters.
3429       *
3430       * @return external_function_parameters
3431       */
3432      public static function request_review_of_user_evidence_linked_competencies_parameters() {
3433          return new external_function_parameters(array(
3434              'id' => new external_value(PARAM_INT, 'The user evidence ID.')
3435          ));
3436      }
3437  
3438      /**
3439       * Send user evidence competencies to review.
3440       *
3441       * @param int $id The user evidence id.
3442       * @return boolean
3443       */
3444      public static function request_review_of_user_evidence_linked_competencies($id) {
3445          $params = self::validate_parameters(self::request_review_of_user_evidence_linked_competencies_parameters(), array(
3446              'id' => $id
3447          ));
3448  
3449          $userevidence = api::read_user_evidence($id);
3450          self::validate_context($userevidence->get_context());
3451  
3452          return api::request_review_of_user_evidence_linked_competencies($id);
3453      }
3454  
3455      /**
3456       * Returns description of external function result value.
3457       *
3458       * @return external_description
3459       */
3460      public static function request_review_of_user_evidence_linked_competencies_returns() {
3461          return new external_value(PARAM_BOOL, 'True if all competencies were send to review');
3462      }
3463  
3464  
3465      /**
3466       * Returns the description of the get_scale_values() parameters.
3467       *
3468       * @return external_function_parameters.
3469       */
3470      public static function get_scale_values_parameters() {
3471          $scaleid = new external_value(
3472              PARAM_INT,
3473              'The scale id',
3474              VALUE_REQUIRED
3475          );
3476          $params = array('scaleid' => $scaleid);
3477          return new external_function_parameters($params);
3478      }
3479  
3480      /**
3481       * Get the values associated with a scale.
3482       *
3483       * @param int $scaleid Scale ID
3484       * @return array Values for a scale.
3485       */
3486      public static function get_scale_values($scaleid) {
3487          global $DB;
3488          $params = self::validate_parameters(self::get_scale_values_parameters(),
3489              array(
3490                  'scaleid' => $scaleid,
3491              )
3492          );
3493          $context = context_system::instance();
3494          self::validate_context($context);
3495          // The following section is not learning plan specific and so has not been moved to the api.
3496          // Retrieve the scale value from the database.
3497          $scale = grade_scale::fetch(array('id' => $scaleid));
3498          $scalevalues = $scale->load_items();
3499          foreach ($scalevalues as $key => $value) {
3500              // Add a key (make the first value 1).
3501              $scalevalues[$key] = array(
3502                      'id' => $key + 1,
3503                      'name' => \core_external\util::format_string($value, $context->id)
3504                  );
3505          }
3506          return $scalevalues;
3507      }
3508  
3509      /**
3510       * Returns description of get_scale_values() result value.
3511       *
3512       * @return external_multiple_structure
3513       */
3514      public static function get_scale_values_returns() {
3515          return new external_multiple_structure(
3516              new external_single_structure(array(
3517                  'id' => new external_value(PARAM_INT, 'Scale value ID'),
3518                  'name' => new external_value(PARAM_RAW, 'Scale value name')
3519              ))
3520          );
3521      }
3522  
3523  
3524      /**
3525       * Returns the description of the add_related_competency_parameters() parameters.
3526       *
3527       * @return external_function_parameters.
3528       */
3529      public static function add_related_competency_parameters() {
3530          $competencyid = new external_value(
3531              PARAM_INT,
3532              'The competency id',
3533              VALUE_REQUIRED
3534          );
3535          $relatedcompetencyid = new external_value(
3536              PARAM_INT,
3537              'The related competency id',
3538              VALUE_REQUIRED
3539          );
3540          $params = array(
3541              'competencyid' => $competencyid,
3542              'relatedcompetencyid' => $relatedcompetencyid
3543          );
3544          return new external_function_parameters($params);
3545      }
3546  
3547      /**
3548       * Adds a related competency.
3549       *
3550       * @param int $competencyid
3551       * @param int $relatedcompetencyid
3552       * @return bool
3553       */
3554      public static function add_related_competency($competencyid, $relatedcompetencyid) {
3555          $params = self::validate_parameters(self::add_related_competency_parameters(), array(
3556              'competencyid' => $competencyid,
3557              'relatedcompetencyid' => $relatedcompetencyid
3558          ));
3559          $competency = api::read_competency($params['competencyid']);
3560          self::validate_context($competency->get_context());
3561  
3562          return api::add_related_competency($params['competencyid'], $params['relatedcompetencyid']);
3563      }
3564  
3565      /**
3566       * Returns description of add_related_competency_returns() result value.
3567       *
3568       * @return \core_external\external_description
3569       */
3570      public static function add_related_competency_returns() {
3571          return new external_value(PARAM_BOOL, 'True if successful.');
3572      }
3573  
3574      /**
3575       * Returns the description of the remove_related_competency_parameters() parameters.
3576       *
3577       * @return external_function_parameters.
3578       */
3579      public static function remove_related_competency_parameters() {
3580          $competencyid = new external_value(
3581              PARAM_INT,
3582              'The competency id',
3583              VALUE_REQUIRED
3584          );
3585          $relatedcompetencyid = new external_value(
3586              PARAM_INT,
3587              'The related competency id',
3588              VALUE_REQUIRED
3589          );
3590          $params = array(
3591              'competencyid' => $competencyid,
3592              'relatedcompetencyid' => $relatedcompetencyid
3593          );
3594          return new external_function_parameters($params);
3595      }
3596  
3597      /**
3598       * Removes a related competency.
3599       *
3600       * @param int $competencyid
3601       * @param int $relatedcompetencyid
3602       * @return bool
3603       */
3604      public static function remove_related_competency($competencyid, $relatedcompetencyid) {
3605          $params = self::validate_parameters(self::remove_related_competency_parameters(), array(
3606              'competencyid' => $competencyid,
3607              'relatedcompetencyid' => $relatedcompetencyid
3608          ));
3609          $competency = api::read_competency($params['competencyid']);
3610          self::validate_context($competency->get_context());
3611  
3612          return api::remove_related_competency($params['competencyid'], $params['relatedcompetencyid']);
3613      }
3614  
3615      /**
3616       * Returns description of remove_related_competency_returns() result value.
3617       *
3618       * @return \core_external\external_description
3619       */
3620      public static function remove_related_competency_returns() {
3621          return new external_value(PARAM_BOOL, 'True if successful.');
3622      }
3623  
3624      /**
3625       * Returns description of update_ruleoutcome_course_competency() parameters.
3626       *
3627       * @return external_function_parameters
3628       */
3629      public static function set_course_competency_ruleoutcome_parameters() {
3630          $coursecompetencyid = new external_value(
3631              PARAM_INT,
3632              'Data base record id for the course competency',
3633              VALUE_REQUIRED
3634          );
3635  
3636          $ruleoutcome = new external_value(
3637              PARAM_INT,
3638              'Ruleoutcome value',
3639              VALUE_REQUIRED
3640          );
3641  
3642          $params = array(
3643              'coursecompetencyid' => $coursecompetencyid,
3644              'ruleoutcome' => $ruleoutcome,
3645          );
3646          return new external_function_parameters($params);
3647      }
3648  
3649      /**
3650       * Change the ruleoutcome of a course competency.
3651       *
3652       * @param int $coursecompetencyid The course competency id
3653       * @param int $ruleoutcome The ruleoutcome value
3654       * @return bool
3655       */
3656      public static function set_course_competency_ruleoutcome($coursecompetencyid, $ruleoutcome) {
3657          $params = self::validate_parameters(self::set_course_competency_ruleoutcome_parameters(), array(
3658              'coursecompetencyid' => $coursecompetencyid,
3659              'ruleoutcome' => $ruleoutcome,
3660          ));
3661  
3662          $coursecompetency = new course_competency($params['coursecompetencyid']);
3663          self::validate_context(context_course::instance($coursecompetency->get('courseid')));
3664  
3665          return api::set_course_competency_ruleoutcome($coursecompetency, $params['ruleoutcome']);
3666      }
3667  
3668      /**
3669       * Returns description of update_ruleoutcome_course_competency() result value.
3670       *
3671       * @return external_value
3672       */
3673      public static function set_course_competency_ruleoutcome_returns() {
3674          return new external_value(PARAM_BOOL, 'True if the update was successful');
3675      }
3676  
3677  
3678      /**
3679       * Returns description of external function parameters.
3680       *
3681       * @return external_function_parameters
3682       */
3683      public static function grade_competency_parameters() {
3684          $userid = new external_value(
3685              PARAM_INT,
3686              'User ID',
3687              VALUE_REQUIRED
3688          );
3689          $competencyid = new external_value(
3690              PARAM_INT,
3691              'Competency ID',
3692              VALUE_REQUIRED
3693          );
3694          $grade = new external_value(
3695              PARAM_INT,
3696              'New grade',
3697              VALUE_REQUIRED
3698          );
3699          $note = new external_value(
3700              PARAM_NOTAGS,
3701              'A note to attach to the evidence',
3702              VALUE_DEFAULT
3703          );
3704  
3705          $params = array(
3706              'userid' => $userid,
3707              'competencyid' => $competencyid,
3708              'grade' => $grade,
3709              'note' => $note,
3710          );
3711          return new external_function_parameters($params);
3712      }
3713  
3714      /**
3715       * Grade a competency.
3716       *
3717       * @param int $userid The user ID.
3718       * @param int $competencyid The competency id
3719       * @param int $grade The new grade value
3720       * @param string $note A note to attach to the evidence
3721       * @return bool
3722       */
3723      public static function grade_competency($userid, $competencyid, $grade, $note = null) {
3724          global $USER, $PAGE;
3725          $params = self::validate_parameters(self::grade_competency_parameters(), array(
3726              'userid' => $userid,
3727              'competencyid' => $competencyid,
3728              'grade' => $grade,
3729              'note' => $note
3730          ));
3731  
3732          $uc = api::get_user_competency($params['userid'], $params['competencyid']);
3733          self::validate_context($uc->get_context());
3734  
3735          $output = $PAGE->get_renderer('core');
3736          $evidence = api::grade_competency(
3737                  $uc->get('userid'),
3738                  $uc->get('competencyid'),
3739                  $params['grade'],
3740                  $params['note']
3741          );
3742  
3743          $scale = $uc->get_competency()->get_scale();
3744          $exporter = new evidence_exporter($evidence, [
3745              'actionuser' => $USER,
3746              'scale' => $scale,
3747              'usercompetency' => $uc,
3748              'usercompetencyplan' => null,
3749              'context' => $evidence->get_context()
3750          ]);
3751          return $exporter->export($output);
3752      }
3753  
3754      /**
3755       * Returns description of external function result value.
3756       *
3757       * @return external_value
3758       */
3759      public static function grade_competency_returns() {
3760          return evidence_exporter::get_read_structure();
3761      }
3762  
3763      /**
3764       * Returns description of grade_competency_in_plan() parameters.
3765       *
3766       * @return external_function_parameters
3767       */
3768      public static function grade_competency_in_plan_parameters() {
3769          $planid = new external_value(
3770              PARAM_INT,
3771              'Plan id',
3772              VALUE_REQUIRED
3773          );
3774          $competencyid = new external_value(
3775              PARAM_INT,
3776              'Competency id',
3777              VALUE_REQUIRED
3778          );
3779          $grade = new external_value(
3780              PARAM_INT,
3781              'New grade',
3782              VALUE_REQUIRED
3783          );
3784          $note = new external_value(
3785              PARAM_NOTAGS,
3786              'A note to attach to the evidence',
3787              VALUE_DEFAULT
3788          );
3789  
3790          $params = array(
3791              'planid' => $planid,
3792              'competencyid' => $competencyid,
3793              'grade' => $grade,
3794              'note' => $note
3795          );
3796          return new external_function_parameters($params);
3797      }
3798  
3799      /**
3800       * Grade a competency in a plan.
3801       *
3802       * @param int $planid The plan id
3803       * @param int $competencyid The competency id
3804       * @param int $grade The new grade value
3805       * @param string $note A note to add to the evidence
3806       * @return bool
3807       */
3808      public static function grade_competency_in_plan($planid, $competencyid, $grade, $note = null) {
3809          global $USER, $PAGE;
3810  
3811          $params = self::validate_parameters(self::grade_competency_in_plan_parameters(), array(
3812              'planid' => $planid,
3813              'competencyid' => $competencyid,
3814              'grade' => $grade,
3815              'note' => $note
3816          ));
3817  
3818          $plan = new plan($params['planid']);
3819          $context = $plan->get_context();
3820          self::validate_context($context);
3821          $output = $PAGE->get_renderer('core');
3822  
3823          $evidence = api::grade_competency_in_plan(
3824                  $plan->get('id'),
3825                  $params['competencyid'],
3826                  $params['grade'],
3827                  $params['note']
3828          );
3829          $competency = api::read_competency($params['competencyid']);
3830          $scale = $competency->get_scale();
3831          $exporter = new evidence_exporter($evidence, [
3832              'actionuser' => $USER,
3833              'scale' => $scale,
3834              'usercompetency' => null,
3835              'usercompetencyplan' => null,
3836              'context' => $evidence->get_context()
3837          ]);
3838          return $exporter->export($output);
3839      }
3840  
3841      /**
3842       * Returns description of grade_competency_in_plan() result value.
3843       *
3844       * @return external_value
3845       */
3846      public static function grade_competency_in_plan_returns() {
3847          return evidence_exporter::get_read_structure();
3848      }
3849  
3850      /**
3851       * Returns description of user_competency_viewed() parameters.
3852       *
3853       * @return external_function_parameters
3854       */
3855      public static function user_competency_viewed_parameters() {
3856          $usercompetencyid = new external_value(
3857              PARAM_INT,
3858              'The user competency id',
3859              VALUE_REQUIRED
3860          );
3861          $params = array(
3862              'usercompetencyid' => $usercompetencyid
3863          );
3864          return new external_function_parameters($params);
3865      }
3866  
3867      /**
3868       * Log user competency viewed event.
3869       *
3870       * @param int $usercompetencyid The user competency ID.
3871       * @return boolean
3872       */
3873      public static function user_competency_viewed($usercompetencyid) {
3874          $params = self::validate_parameters(self::user_competency_viewed_parameters(), array(
3875              'usercompetencyid' => $usercompetencyid
3876          ));
3877  
3878          $uc = api::get_user_competency_by_id($params['usercompetencyid']);
3879          $result = api::user_competency_viewed($uc);
3880  
3881          return $result;
3882      }
3883  
3884      /**
3885       * Returns description of user_competency_viewed() result value.
3886       *
3887       * @return external_description
3888       */
3889      public static function user_competency_viewed_returns() {
3890          return new external_value(PARAM_BOOL, 'True if the event user competency viewed was logged');
3891      }
3892  
3893      /**
3894       * Returns description of user_competency_viewed_in_plan() parameters.
3895       *
3896       * @return external_function_parameters
3897       */
3898      public static function user_competency_viewed_in_plan_parameters() {
3899          $competencyid = new external_value(
3900              PARAM_INT,
3901              'The competency id',
3902              VALUE_REQUIRED
3903          );
3904          $userid = new external_value(
3905              PARAM_INT,
3906              'The user id',
3907              VALUE_REQUIRED
3908          );
3909          $planid = new external_value(
3910              PARAM_INT,
3911              'The plan id',
3912              VALUE_REQUIRED
3913          );
3914          $params = array(
3915              'competencyid' => $competencyid,
3916              'userid' => $userid,
3917              'planid' => $planid
3918          );
3919          return new external_function_parameters($params);
3920      }
3921  
3922      /**
3923       * Log user competency viewed in plan event.
3924       *
3925       * @param int $competencyid The competency ID.
3926       * @param int $userid The user ID.
3927       * @param int $planid The plan ID.
3928       * @return boolean
3929       */
3930      public static function user_competency_viewed_in_plan($competencyid, $userid, $planid) {
3931          $params = self::validate_parameters(self::user_competency_viewed_in_plan_parameters(), array(
3932              'competencyid' => $competencyid,
3933              'userid' => $userid,
3934              'planid' => $planid
3935          ));
3936          $pl = api::get_plan_competency($params['planid'], $params['competencyid']);
3937          $result = api::user_competency_viewed_in_plan($pl->usercompetency, $params['planid']);
3938  
3939          return $result;
3940      }
3941  
3942      /**
3943       * Returns description of user_competency_viewed_in_plan() result value.
3944       *
3945       * @return external_description
3946       */
3947      public static function user_competency_viewed_in_plan_returns() {
3948          return new external_value(PARAM_BOOL, 'True if the event user competency viewed in plan was logged');
3949      }
3950  
3951      /**
3952       * Returns description of user_competency_viewed_in_course() parameters.
3953       *
3954       * @return external_function_parameters
3955       */
3956      public static function user_competency_viewed_in_course_parameters() {
3957          $competencyid = new external_value(
3958              PARAM_INT,
3959              'The competency id',
3960              VALUE_REQUIRED
3961          );
3962          $userid = new external_value(
3963              PARAM_INT,
3964              'The user id',
3965              VALUE_REQUIRED
3966          );
3967          $courseid = new external_value(
3968              PARAM_INT,
3969              'The course id',
3970              VALUE_REQUIRED
3971          );
3972          $params = array(
3973              'competencyid' => $competencyid,
3974              'userid' => $userid,
3975              'courseid' => $courseid
3976          );
3977          return new external_function_parameters($params);
3978      }
3979  
3980      /**
3981       * Log user competency viewed in course event.
3982       *
3983       * @param int $competencyid The competency ID.
3984       * @param int $userid The user ID.
3985       * @param int $courseid The course ID.
3986       * @return boolean
3987       */
3988      public static function user_competency_viewed_in_course($competencyid, $userid, $courseid) {
3989          $params = self::validate_parameters(self::user_competency_viewed_in_course_parameters(), array(
3990              'competencyid' => $competencyid,
3991              'userid' => $userid,
3992              'courseid' => $courseid
3993          ));
3994          $ucc = api::get_user_competency_in_course($params['courseid'], $params['userid'], $params['competencyid']);
3995          $result = api::user_competency_viewed_in_course($ucc);
3996  
3997          return $result;
3998      }
3999  
4000      /**
4001       * Returns description of user_competency_viewed_in_course() result value.
4002       *
4003       * @return external_description
4004       */
4005      public static function user_competency_viewed_in_course_returns() {
4006          return new external_value(PARAM_BOOL, 'True if the event user competency viewed in course was logged');
4007      }
4008  
4009      /**
4010       * Returns description of user_competency_plan_viewed() parameters.
4011       *
4012       * @return external_function_parameters
4013       */
4014      public static function user_competency_plan_viewed_parameters() {
4015          $competencyid = new external_value(
4016              PARAM_INT,
4017              'The competency id',
4018              VALUE_REQUIRED
4019          );
4020          $userid = new external_value(
4021              PARAM_INT,
4022              'The user id',
4023              VALUE_REQUIRED
4024          );
4025          $planid = new external_value(
4026              PARAM_INT,
4027              'The plan id',
4028              VALUE_REQUIRED
4029          );
4030          $params = array(
4031              'competencyid' => $competencyid,
4032              'userid' => $userid,
4033              'planid' => $planid
4034          );
4035          return new external_function_parameters($params);
4036      }
4037  
4038      /**
4039       * Log user competency plan viewed event.
4040       *
4041       * @param int $competencyid The competency ID.
4042       * @param int $userid The user ID.
4043       * @param int $planid The plan ID.
4044       * @return boolean
4045       */
4046      public static function user_competency_plan_viewed($competencyid, $userid, $planid) {
4047          $params = self::validate_parameters(self::user_competency_viewed_in_plan_parameters(), array(
4048              'competencyid' => $competencyid,
4049              'userid' => $userid,
4050              'planid' => $planid
4051          ));
4052          $pl = api::get_plan_competency($params['planid'], $params['competencyid']);
4053          $result = api::user_competency_plan_viewed($pl->usercompetencyplan);
4054  
4055          return $result;
4056      }
4057  
4058      /**
4059       * Returns description of user_competency_plan_viewed() result value.
4060       *
4061       * @return external_description
4062       */
4063      public static function user_competency_plan_viewed_returns() {
4064          return new external_value(PARAM_BOOL, 'True if the event user competency plan viewed was logged');
4065      }
4066  
4067      /**
4068       * Returns description of grade_competency_in_course() parameters.
4069       *
4070       * @return external_function_parameters
4071       */
4072      public static function grade_competency_in_course_parameters() {
4073          $courseid = new external_value(
4074              PARAM_INT,
4075              'Course id',
4076              VALUE_REQUIRED
4077          );
4078          $userid = new external_value(
4079              PARAM_INT,
4080              'User id',
4081              VALUE_REQUIRED
4082          );
4083          $competencyid = new external_value(
4084              PARAM_INT,
4085              'Competency id',
4086              VALUE_REQUIRED
4087          );
4088          $grade = new external_value(
4089              PARAM_INT,
4090              'New grade',
4091              VALUE_REQUIRED
4092          );
4093          $note = new external_value(
4094              PARAM_NOTAGS,
4095              'A note to attach to the evidence',
4096              VALUE_DEFAULT
4097          );
4098  
4099          $params = array(
4100              'courseid' => $courseid,
4101              'userid' => $userid,
4102              'competencyid' => $competencyid,
4103              'grade' => $grade,
4104              'note' => $note,
4105          );
4106          return new external_function_parameters($params);
4107      }
4108  
4109      /**
4110       * Grade a competency in a course.
4111       *
4112       * @param int $courseid The course id
4113       * @param int $userid The user id
4114       * @param int $competencyid The competency id
4115       * @param int $grade The new grade value
4116       * @param string $note A note to add to the evidence
4117       * @return bool
4118       */
4119      public static function grade_competency_in_course($courseid, $userid, $competencyid, $grade, $note = null) {
4120          global $USER, $PAGE, $DB;
4121  
4122          $params = self::validate_parameters(self::grade_competency_in_course_parameters(), array(
4123              'courseid' => $courseid,
4124              'userid' => $userid,
4125              'competencyid' => $competencyid,
4126              'grade' => $grade,
4127              'note' => $note
4128          ));
4129  
4130          $course = $DB->get_record('course', array('id' => $params['courseid']));
4131          $context = context_course::instance($course->id);
4132          self::validate_context($context);
4133          $output = $PAGE->get_renderer('core');
4134  
4135          $evidence = api::grade_competency_in_course(
4136                  $params['courseid'],
4137                  $params['userid'],
4138                  $params['competencyid'],
4139                  $params['grade'],
4140                  $params['note']
4141          );
4142          $competency = api::read_competency($params['competencyid']);
4143          $scale = $competency->get_scale();
4144          $exporter = new evidence_exporter($evidence, array(
4145              'actionuser' => $USER,
4146              'scale' => $scale,
4147              'usercompetency' => null,
4148              'usercompetencyplan' => null,
4149              'context' => $evidence->get_context(),
4150          ));
4151          return $exporter->export($output);
4152      }
4153  
4154      /**
4155       * Returns description of grade_competency_in_course() result value.
4156       *
4157       * @return external_value
4158       */
4159      public static function grade_competency_in_course_returns() {
4160          return evidence_exporter::get_read_structure();
4161      }
4162  
4163      /**
4164       * Returns description of unlink_plan_from_template_() parameters.
4165       *
4166       * @return external_function_parameters
4167       */
4168      public static function unlink_plan_from_template_parameters() {
4169          $planid = new external_value(
4170              PARAM_INT,
4171              'Data base record id for the plan',
4172              VALUE_REQUIRED
4173          );
4174  
4175          $params = array(
4176              'planid' => $planid,
4177          );
4178          return new external_function_parameters($params);
4179      }
4180  
4181      /**
4182       * Unlink the plan from the template.
4183       *
4184       * @param int $planid The plan id
4185       * @return bool
4186       */
4187      public static function unlink_plan_from_template($planid) {
4188          $params = self::validate_parameters(self::unlink_plan_from_template_parameters(), array(
4189              'planid' => $planid,
4190          ));
4191  
4192          $plan = new plan($params['planid']);
4193          self::validate_context($plan->get_context());
4194  
4195          return api::unlink_plan_from_template($plan);
4196      }
4197  
4198      /**
4199       * Returns description of unlink_plan_from_template_() result value.
4200       *
4201       * @return external_value
4202       */
4203      public static function unlink_plan_from_template_returns() {
4204          return new external_value(PARAM_BOOL, 'True if the unlink was successful');
4205      }
4206  
4207      /**
4208       * Returns description of template_viewed() parameters.
4209       *
4210       * @return external_function_parameters
4211       */
4212      public static function template_viewed_parameters() {
4213          $id = new external_value(
4214              PARAM_INT,
4215              'Data base record id for the template',
4216              VALUE_REQUIRED
4217          );
4218  
4219          $params = array(
4220              'id' => $id,
4221          );
4222          return new external_function_parameters($params);
4223      }
4224  
4225      /**
4226       * Log the template viewed event.
4227       *
4228       * @param int $id the template id
4229       * @return array of warnings and status result
4230       * @throws moodle_exception
4231       */
4232      public static function template_viewed($id) {
4233          $params = self::validate_parameters(self::view_book_parameters(), array(
4234              'id' => $id
4235          ));
4236  
4237          $template = api::read_template($params['id']);
4238          self::validate_context($template->get_context());
4239  
4240          return api::template_viewed($params['id']);
4241      }
4242  
4243      /**
4244       * Returns description of template_viewed() result value.
4245       *
4246       * @return external_value
4247       */
4248      public static function template_viewed_returns() {
4249          return new external_value(PARAM_BOOL, 'True if the log of the view was successful');
4250      }
4251  
4252      /**
4253       * Returns description of update_course_competency_settings() parameters.
4254       *
4255       * @return external_function_parameters
4256       */
4257      public static function update_course_competency_settings_parameters() {
4258          $courseid = new external_value(
4259              PARAM_INT,
4260              'Course id for the course to update',
4261              VALUE_REQUIRED
4262          );
4263          $pushratingstouserplans = new external_value(
4264              PARAM_BOOL,
4265              'New value of the setting',
4266              VALUE_REQUIRED
4267          );
4268          $settings = new external_single_structure(array(
4269              'pushratingstouserplans' => $pushratingstouserplans
4270          ));
4271          $params = array(
4272              'courseid' => $courseid,
4273              'settings' => $settings,
4274          );
4275          return new external_function_parameters($params);
4276      }
4277  
4278      /**
4279       * Update the course competency settings
4280       *
4281       * @param int $courseid the course id
4282       * @param stdClass $settings The list of settings (currently only pushratingstouserplans).
4283       * @throws moodle_exception
4284       */
4285      public static function update_course_competency_settings($courseid, $settings) {
4286          $params = self::validate_parameters(self::update_course_competency_settings_parameters(), array(
4287              'courseid' => $courseid,
4288              'settings' => $settings
4289          ));
4290  
4291          $context = context_course::instance($params['courseid']);
4292          self::validate_context($context);
4293          $result = api::update_course_competency_settings($params['courseid'], $params['settings']);
4294  
4295          return $result;
4296      }
4297  
4298      /**
4299       * Returns description of update_course_competency_settings() result value.
4300       *
4301       * @return external_value
4302       */
4303      public static function update_course_competency_settings_returns() {
4304          return new external_value(PARAM_BOOL, 'True if the update was successful.');
4305      }
4306  
4307      /**
4308       * Returns description of external function parameters.
4309       *
4310       * @return external_function_parameters
4311       */
4312      public static function delete_evidence_parameters() {
4313          return new external_function_parameters(array(
4314              'id' => new external_value(PARAM_INT, 'The evidence ID'),
4315          ));
4316      }
4317  
4318      /**
4319       * External function delete_evidence.
4320       *
4321       * @param int $id The evidence ID.
4322       * @return boolean
4323       */
4324      public static function delete_evidence($id) {
4325          $params = self::validate_parameters(self::delete_evidence_parameters(), array(
4326              'id' => $id
4327          ));
4328  
4329          $evidence = api::read_evidence($params['id']);
4330          $uc = api::get_user_competency_by_id($evidence->get('usercompetencyid'));
4331          self::validate_context($uc->get_context());
4332  
4333          return api::delete_evidence($evidence);
4334      }
4335  
4336      /**
4337       * Returns description of external function result value.
4338       *
4339       * @return external_function_parameters
4340       */
4341      public static function delete_evidence_returns() {
4342          return new external_value(PARAM_BOOL, 'The success');
4343      }
4344  
4345  }