original_string: public static function complete_plan($planorid) {
          global $DB;
          static::require_enabled();
  
          $plan = $planorid;
          if (!is_object($planorid)) {
              $plan = new plan($planorid);
          }
  
          // Validate that the plan can be managed.
          if (!$plan->can_manage()) {
              throw new required_capability_exception($plan->get_context(), 'moodle/competency:planmanage', 'nopermissions', '');
          }
  
          // Check if the plan was already completed.
          if ($plan->get('status') == plan::STATUS_COMPLETE) {
              throw new coding_exception('The plan is already completed.');
          }
  
          $originalstatus = $plan->get('status');
          $plan->set('status', plan::STATUS_COMPLETE);
  
          // The user should also be able to manage the plan when it's completed.
          if (!$plan->can_manage()) {
              throw new required_capability_exception($plan->get_context(), 'moodle/competency:planmanage', 'nopermissions', '');
          }
  
          // Put back original status because archive needs it to extract competencies from the right table.
          $plan->set('status', $originalstatus);
  
          // Do the things.
          $transaction = $DB->start_delegated_transaction();
          self::archive_user_competencies_in_plan($plan);
          $plan->set('status', plan::STATUS_COMPLETE);
          $success = $plan->update();
  
          if (!$success) {
              $transaction->rollback(new moodle_exception('The plan could not be updated.'));
              return $success;
          }
  
          $transaction->allow_commit();
  
          // Trigger updated event.
          \core\event\competency_plan_completed::create_from_plan($plan)->trigger();
  
          return $success;
      }
code: public static function complete_plan($planorid) {
          global $DB;
          static::require_enabled();
  
          $plan = $planorid;
          if (!is_object($planorid)) {
              $plan = new plan($planorid);
          }
  
          // Validate that the plan can be managed.
          if (!$plan->can_manage()) {
              throw new required_capability_exception($plan->get_context(), 'moodle/competency:planmanage', 'nopermissions', '');
          }
  
          // Check if the plan was already completed.
          if ($plan->get('status') == plan::STATUS_COMPLETE) {
              throw new coding_exception('The plan is already completed.');
          }
  
          $originalstatus = $plan->get('status');
          $plan->set('status', plan::STATUS_COMPLETE);
  
          // The user should also be able to manage the plan when it's completed.
          if (!$plan->can_manage()) {
              throw new required_capability_exception($plan->get_context(), 'moodle/competency:planmanage', 'nopermissions', '');
          }
  
          // Put back original status because archive needs it to extract competencies from the right table.
          $plan->set('status', $originalstatus);
  
          // Do the things.
          $transaction = $DB->start_delegated_transaction();
          self::archive_user_competencies_in_plan($plan);
          $plan->set('status', plan::STATUS_COMPLETE);
          $success = $plan->update();
  
          if (!$success) {
              $transaction->rollback(new moodle_exception('The plan could not be updated.'));
              return $success;
          }
  
          $transaction->allow_commit();
  
          // Trigger updated event.
          \core\event\competency_plan_completed::create_from_plan($plan)->trigger();
  
          return $success;
      }
code_tokens: public static function complete_plan ( $ planorid ) { global $ DB ; static :: require_enabled ( ) ; $ plan = $ planorid ; if ( ! is_object ( $ planorid ) ) { $ plan = new plan ( $ planorid ) ; } // Validate that the plan can be managed. if ( ! $ plan -> can_manage ( ) ) { throw new required_capability_exception ( $ plan -> get_context ( ) , 'moodle/competency:planmanage' , 'nopermissions' , '' ) ; } // Check if the plan was already completed. if ( $ plan -> get ( 'status' ) == plan :: STATUS_COMPLETE ) { throw new coding_exception ( 'The plan is already completed.' ) ; } $ originalstatus = $ plan -> get ( 'status' ) ; $ plan -> set ( 'status' , plan :: STATUS_COMPLETE ) ; // The user should also be able to manage the plan when it's completed. if ( ! $ plan -> can_manage ( ) ) { throw new required_capability_exception ( $ plan -> get_context ( ) , 'moodle/competency:planmanage' , 'nopermissions' , '' ) ; } // Put back original status because archive needs it to extract competencies from the right table. $ plan -> set ( 'status' , $ originalstatus ) ; // Do the things. $ transaction = $ DB -> start_delegated_transaction ( ) ; self :: archive_user_competencies_in_plan ( $ plan ) ; $ plan -> set ( 'status' , plan :: STATUS_COMPLETE ) ; $ success = $ plan -> update ( ) ; if ( ! $ success ) { $ transaction -> rollback ( new moodle_exception ( 'The plan could not be updated.' ) ) ; return $ success ; } $ transaction -> allow_commit ( ) ; // Trigger updated event. \ core \ event \ competency_plan_completed :: create_from_plan ( $ plan ) -> trigger ( ) ; return $ success ; }
docstring: Complete a plan.
  
  @param int|plan $planorid The plan, or its ID.
  @return bool
docstring_tokens: Complete a plan .