started work on scheduling
Some checks failed
PHPUnit / test (push) Has been cancelled

This commit is contained in:
2026-07-01 10:07:20 +02:00
parent 70dca17451
commit c5c61f22ad
13 changed files with 414 additions and 4 deletions

View File

@ -514,11 +514,13 @@ if ($fetchClients) {
}
require_once __DIR__ . '/../lib/program_sessions.php';
require_once __DIR__ . '/../lib/session_schedule.php';
$clients = array_map(function ($code) use ($completions, $pdo) {
return [
'clientCode' => $code,
'completedQuestionnaires' => $completions[$code] ?? [],
'programProgress' => qdb_client_program_progress($pdo, $code),
'nextSessionSchedule' => qdb_get_client_session_schedule($pdo, $code),
];
}, $clientCodes);

View File

@ -0,0 +1,56 @@
<?php
$tokenRec = require_valid_token();
if ($method !== 'POST') {
json_error('METHOD_NOT_ALLOWED', 'Method not allowed', 405);
}
$body = read_json_body();
require_fields($body, ['clientCode', 'scheduledDate', 'programCycleNumber', 'programSessionNumber']);
$clientCode = trim((string)$body['clientCode']);
$scheduledDate = trim((string)$body['scheduledDate']);
$programCycleNumber = max(1, (int)$body['programCycleNumber']);
$programSessionNumber = max(1, (int)$body['programSessionNumber']);
$programSessionID = isset($body['programSessionID'])
? trim((string)$body['programSessionID'])
: null;
if ($programSessionID === '') {
$programSessionID = null;
}
try {
$opened = qdb_open_write_or_fail();
[$pdo, $tmpDb, $lockFp] = $opened;
require_role(['coach'], $tokenRec);
[$rbacClause, $rbacParams] = rbac_client_filter($tokenRec, 'cl');
$clStmt = $pdo->prepare(
"SELECT cl.clientCode FROM client cl WHERE cl.clientCode = :cc AND ($rbacClause)"
);
$clStmt->execute(array_merge([':cc' => $clientCode], $rbacParams));
if (!$clStmt->fetch()) {
qdb_discard($tmpDb, $lockFp);
json_error('NOT_FOUND', 'Client not found or not authorized', 404);
}
require_once __DIR__ . '/../lib/session_schedule.php';
qdb_upsert_client_session_schedule(
$pdo,
$clientCode,
$scheduledDate,
$programCycleNumber,
$programSessionNumber,
$programSessionID
);
qdb_save($tmpDb, $lockFp);
json_success([
'scheduled' => true,
'schedule' => qdb_get_client_session_schedule($pdo, $clientCode),
]);
} catch (Throwable $e) {
qdb_handler_fail($e, 'Save session schedule', null, $tmpDb ?? null, $lockFp ?? null);
}

View File

@ -19,7 +19,14 @@ case 'GET':
INNER JOIN client cl ON cl.clientCode = cq.clientCode
WHERE cq.questionnaireID = q.questionnaireID
AND $rbacClause
) AS completedCount
) AS completedCount,
(
SELECT COUNT(*)
FROM questionnaire_submission qs
INNER JOIN client cl ON cl.clientCode = qs.clientCode
WHERE qs.questionnaireID = q.questionnaireID
AND $rbacClause
) AS submissionCount
FROM questionnaire q
LEFT JOIN question qu ON qu.questionnaireID = q.questionnaireID
GROUP BY q.questionnaireID
@ -33,6 +40,7 @@ case 'GET':
$r['showPoints'] = (int)$r['showPoints'];
$r['questionCount'] = (int)$r['questionCount'];
$r['completedCount'] = (int)$r['completedCount'];
$r['submissionCount'] = (int)$r['submissionCount'];
$r['conditionJson'] = $r['conditionJson'] ?: '{}';
}
unset($r);

31
handlers/schedule.php Normal file
View File

@ -0,0 +1,31 @@
<?php
$tokenRec = require_valid_token_web();
require_role(['admin', 'supervisor'], $tokenRec);
if ($method !== 'GET') {
json_error('METHOD_NOT_ALLOWED', 'Method not allowed', 405);
}
try {
$opened = qdb_open_read_or_fail();
[$pdo, $tmpDb, $lockFp] = $opened;
require_once __DIR__ . '/../lib/session_schedule.php';
$entries = qdb_list_session_schedules_scoped($pdo, $tokenRec);
$byDate = [];
foreach ($entries as $entry) {
$date = $entry['scheduledDate'];
$byDate[$date][] = $entry;
}
qdb_discard($tmpDb, $lockFp);
json_success([
'entries' => $entries,
'byDate' => $byDate,
]);
} catch (Throwable $e) {
qdb_handler_fail($e, 'Load schedule', null, $tmpDb ?? null, $lockFp ?? null);
}