This commit is contained in:
@ -16,6 +16,7 @@ const QDB_DEV_GLASS_POINTS = [
|
||||
|
||||
require_once __DIR__ . '/app_answers.php';
|
||||
require_once __DIR__ . '/submissions.php';
|
||||
require_once __DIR__ . '/scoring.php';
|
||||
|
||||
/**
|
||||
* @return array{imported: array, skipped: array, errors: string[]}
|
||||
@ -36,6 +37,7 @@ function qdb_import_dev_fixture(PDO $pdo, array $fixture): array
|
||||
'completions' => 0,
|
||||
'submissions' => 0,
|
||||
'answers' => 0,
|
||||
'scoringRecomputed' => 0,
|
||||
];
|
||||
$skipped = [
|
||||
'admins' => 0,
|
||||
@ -48,6 +50,7 @@ function qdb_import_dev_fixture(PDO $pdo, array $fixture): array
|
||||
|
||||
$coachIdByUsername = [];
|
||||
$supervisorIdByUsername = [];
|
||||
$affectedClients = [];
|
||||
|
||||
$hash = password_hash($password, PASSWORD_DEFAULT);
|
||||
$now = time();
|
||||
@ -218,9 +221,23 @@ function qdb_import_dev_fixture(PDO $pdo, array $fixture): array
|
||||
}
|
||||
|
||||
$imported['completions']++;
|
||||
$affectedClients[$clientCode] = true;
|
||||
$variant++;
|
||||
}
|
||||
|
||||
$upperPrefix = strtoupper(rtrim($prefix, '_'));
|
||||
$devClientStmt = $pdo->prepare('SELECT clientCode FROM client WHERE clientCode LIKE :pfx');
|
||||
$devClientStmt->execute([':pfx' => $upperPrefix . '%']);
|
||||
foreach ($devClientStmt->fetchAll(PDO::FETCH_COLUMN) as $cc) {
|
||||
$affectedClients[(string)$cc] = true;
|
||||
}
|
||||
if ($affectedClients !== []) {
|
||||
$imported['scoringRecomputed'] = qdb_recompute_scores_for_clients(
|
||||
$pdo,
|
||||
array_keys($affectedClients)
|
||||
);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
} catch (Throwable $e) {
|
||||
if ($pdo->inTransaction()) {
|
||||
|
||||
@ -534,27 +534,52 @@ function qdb_backfill_glass_score_rules(PDO $pdo): int {
|
||||
return $count;
|
||||
}
|
||||
|
||||
function qdb_recompute_all_questionnaire_scores(PDO $pdo): int {
|
||||
$stmt = $pdo->query(
|
||||
"SELECT clientCode, questionnaireID FROM completed_questionnaire WHERE status = 'completed'"
|
||||
);
|
||||
/**
|
||||
* Recompute questionnaire sumPoints and scoring-profile results for specific clients.
|
||||
*
|
||||
* @param list<string> $clientCodes
|
||||
*/
|
||||
function qdb_recompute_scores_for_clients(PDO $pdo, array $clientCodes): int {
|
||||
$clientCodes = array_values(array_unique(array_filter(
|
||||
$clientCodes,
|
||||
static fn($cc) => is_string($cc) && trim($cc) !== ''
|
||||
)));
|
||||
if ($clientCodes === []) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$n = 0;
|
||||
$qnStmt = $pdo->prepare(
|
||||
"SELECT questionnaireID FROM completed_questionnaire
|
||||
WHERE clientCode = :cc AND status = 'completed'"
|
||||
);
|
||||
$upd = $pdo->prepare(
|
||||
'UPDATE completed_questionnaire SET sumPoints = :sp WHERE clientCode = :cc AND questionnaireID = :qn'
|
||||
);
|
||||
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
||||
$score = qdb_compute_questionnaire_score($pdo, $row['clientCode'], $row['questionnaireID']);
|
||||
$upd->execute([
|
||||
':sp' => $score,
|
||||
':cc' => $row['clientCode'],
|
||||
':qn' => $row['questionnaireID'],
|
||||
]);
|
||||
qdb_recompute_profile_scores_for_client($pdo, $row['clientCode']);
|
||||
$n++;
|
||||
foreach ($clientCodes as $clientCode) {
|
||||
$qnStmt->execute([':cc' => $clientCode]);
|
||||
foreach ($qnStmt->fetchAll(PDO::FETCH_COLUMN) as $qnID) {
|
||||
$score = qdb_compute_questionnaire_score($pdo, $clientCode, (string)$qnID);
|
||||
$upd->execute([
|
||||
':sp' => $score,
|
||||
':cc' => $clientCode,
|
||||
':qn' => $qnID,
|
||||
]);
|
||||
$n++;
|
||||
}
|
||||
qdb_recompute_profile_scores_for_client($pdo, $clientCode);
|
||||
}
|
||||
return $n;
|
||||
}
|
||||
|
||||
function qdb_recompute_all_questionnaire_scores(PDO $pdo): int {
|
||||
$stmt = $pdo->query(
|
||||
"SELECT DISTINCT clientCode FROM completed_questionnaire WHERE status = 'completed'"
|
||||
);
|
||||
$clientCodes = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
return qdb_recompute_scores_for_clients($pdo, $clientCodes);
|
||||
}
|
||||
|
||||
function qdb_seed_default_rhs_scoring_profile(PDO $pdo): ?string {
|
||||
foreach (qdb_list_scoring_profiles($pdo) as $p) {
|
||||
if ($p['name'] === 'RHS Index') {
|
||||
|
||||
Reference in New Issue
Block a user