Skip to content

Commit 966396e

Browse files
mchurchwardclaude
andcommitted
Phase 8 follow-up: delegate completion check through persistent layer
- Add response_record::user_has_complete_response() using record_exists_select() - Add questionnaire::user_has_submitted() delegating to response_record - Add questionnaire::completionsubmit() accessor - Add manager::response_exists() instance method delegating to response_record - Rewrite custom_completion::get_state() to use questionnaire::from_cm() and user_has_submitted() — removes raw DB calls and lib.php require_once Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 12ff84f commit 966396e

File tree

4 files changed

+52
-17
lines changed

4 files changed

+52
-17
lines changed

classes/completion/custom_completion.php

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@
2020

2121
defined('MOODLE_INTERNAL') || die();
2222

23-
require_once($CFG->dirroot . '/mod/questionnaire/lib.php');
24-
2523
use coding_exception;
2624
use core_completion\activity_custom_completion;
25+
use mod_questionnaire\questionnaire;
2726
use moodle_exception;
2827

2928
/**
@@ -44,21 +43,9 @@ class custom_completion extends activity_custom_completion {
4443
* @return int
4544
*/
4645
public function get_state(string $rule): int {
47-
global $DB;
48-
4946
$this->validate_rule($rule);
50-
$userid = $this->userid;
51-
$cm = $this->cm;
52-
53-
$questionnaire = $DB->get_record('questionnaire', ['id' => $cm->instance], '*', MUST_EXIST);
54-
55-
if ($questionnaire->completionsubmit) {
56-
$params = ['userid' => $userid, 'questionnaireid' => $questionnaire->id, 'complete' => 'y'];
57-
$status = $DB->record_exists('questionnaire_response', $params);
58-
} else {
59-
$status = false;
60-
}
61-
47+
$questionnaire = questionnaire::from_cm($this->cm);
48+
$status = $questionnaire->completionsubmit() && $questionnaire->user_has_submitted($this->userid);
6249
return $status ? COMPLETION_COMPLETE : COMPLETION_INCOMPLETE;
6350
}
6451

classes/local/db/response_record.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,18 @@ public static function get_for_questionnaire(int $questionnaireid): array {
8282
public static function get_complete_for_user(int $questionnaireid, int $userid): array {
8383
return static::get_records(['questionnaireid' => $questionnaireid, 'userid' => $userid, 'complete' => 'y']);
8484
}
85+
86+
/**
87+
* True if the given user has at least one complete response for the given questionnaire.
88+
*
89+
* @param int $questionnaireid
90+
* @param int $userid
91+
* @return bool
92+
*/
93+
public static function user_has_complete_response(int $questionnaireid, int $userid): bool {
94+
return static::record_exists_select(
95+
'questionnaireid = :questionnaireid AND userid = :userid AND complete = :complete',
96+
['questionnaireid' => $questionnaireid, 'userid' => $userid, 'complete' => 'y']
97+
);
98+
}
8599
}

classes/local/response/manager.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,19 @@ public function response_check_format($section, $formdata, $checkmissing = true,
561561

562562
// Static helpers — usable without a questionnaire instance.
563563

564+
/**
565+
* True if the given user has at least one complete response for this questionnaire.
566+
*
567+
* @param int $userid
568+
* @return bool
569+
*/
570+
public function response_exists(int $userid): bool {
571+
return \mod_questionnaire\local\db\response_record::user_has_complete_response(
572+
$this->questionnaire->id,
573+
$userid
574+
);
575+
}
576+
564577
/**
565578
* Get all responses for a given questionnaire instance id and user, without needing an instance.
566579
* @param int $instanceid The questionnaire.id value.

classes/questionnaire.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,15 @@ public function is_closed(): bool {
348348
return ($closedate > 0) ? ($closedate < time()) : false;
349349
}
350350

351+
/**
352+
* True if the questionnaire is configured to require submission for completion.
353+
*
354+
* @return bool
355+
*/
356+
public function completionsubmit(): bool {
357+
return (bool) $this->modulerecord->get('completionsubmit');
358+
}
359+
351360
/**
352361
* True if the questionnaire collects anonymous responses.
353362
*
@@ -538,6 +547,16 @@ public function user_has_saved_response(int $userid): bool {
538547
);
539548
}
540549

550+
/**
551+
* True if the given user has at least one complete (submitted) response for this questionnaire.
552+
*
553+
* @param int $userid
554+
* @return bool
555+
*/
556+
public function user_has_submitted(int $userid): bool {
557+
return \mod_questionnaire\local\db\response_record::user_has_complete_response($this->id(), $userid);
558+
}
559+
541560
/**
542561
* Count the number of complete submissions for this questionnaire.
543562
*
@@ -1794,7 +1813,9 @@ public static function coursemodule_edit_post_actions(object $data, object $cour
17941813
* @return bool True on success.
17951814
*/
17961815
public static function delete_instance(int $id): bool {
1797-
global $DB;
1816+
global $CFG, $DB;
1817+
require_once($CFG->dirroot . '/mod/questionnaire/locallib.php');
1818+
require_once($CFG->dirroot . '/mod/questionnaire/questionnaire.class.php');
17981819

17991820
if (!$questionnaire = $DB->get_record('questionnaire', ['id' => $id])) {
18001821
return false;

0 commit comments

Comments
 (0)