/**
  * Executes the allocation
  *
  * @return workshopplus_allocation_result
  */
 public function execute()
 {
     global $DB;
     $result = new workshopplus_allocation_result($this);
     // make sure the workshopplus itself is at the expected state
     if ($this->workshopplus->phase != workshopplus::PHASE_SUBMISSION) {
         $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfailedphase', 'workshopplusallocation_scheduled'));
         return $result;
     }
     if (empty($this->workshopplus->submissionend)) {
         $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfaileddeadline', 'workshopplusallocation_scheduled'));
         return $result;
     }
     if ($this->workshopplus->submissionend > time()) {
         $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultvoiddeadline', 'workshopplusallocation_scheduled'));
         return $result;
     }
     $current = $DB->get_record('workshopplusallocation_scheduled', array('workshopplusid' => $this->workshopplus->id, 'enabled' => 1), '*', IGNORE_MISSING);
     if ($current === false) {
         $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfailedconfig', 'workshopplusallocation_scheduled'));
         return $result;
     }
     if (!$current->enabled) {
         $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultdisabled', 'workshopplusallocation_scheduled'));
         return $result;
     }
     if (!is_null($current->timeallocated) and $current->timeallocated >= $this->workshopplus->submissionend) {
         $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultvoidexecuted', 'workshopplusallocation_scheduled'));
         return $result;
     }
     // so now we know that we are after the submissions deadline and either the scheduled allocation was not
     // executed yet or it was but the submissions deadline has been prolonged (and hence we should repeat the
     // allocations)
     $settings = workshopplus_random_allocator_setting::instance_from_text($current->settings);
     $randomallocator = $this->workshopplus->allocator_instance('random');
     $randomallocator->execute($settings, $result);
     // store the result in the instance's table
     $update = new stdClass();
     $update->id = $current->id;
     $update->timeallocated = $result->get_timeend();
     $update->resultstatus = $result->get_status();
     $update->resultmessage = $result->get_message();
     $update->resultlog = json_encode($result->get_logs());
     $DB->update_record('workshopplusallocation_scheduled', $update);
     return $result;
 }