Module tasks + knowledgecenter_update aus Kundenprojekt übernehmen (bereinigt)
Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt: Knowledgecenter: - Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten - Files-Gallery-Lizenzschlüssel entfernt (config.php) - Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur, nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss), Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge - 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …) Tasks: - Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments) - Task-Definitionen und Verlinkungen geleert - Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
259
module/tasks/actions/admin/task_form_action.php
Normal file
259
module/tasks/actions/admin/task_form_action.php
Normal file
@@ -0,0 +1,259 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once dirname(dirname(__DIR__)) . '/bootstrap.php';
|
||||
|
||||
function task_cert_admin_task_form_action(): array
|
||||
{
|
||||
$auth = TaskCertAuthContext::fromGlobals();
|
||||
if (!$auth->hasPermission('r-task-cert-admin')) {
|
||||
return [
|
||||
'error' => 'Keine Berechtigung für die Aufgaben-Administration.',
|
||||
];
|
||||
}
|
||||
|
||||
$taskId = TaskCertRequest::queryInt('id', 0);
|
||||
$services = task_cert_services();
|
||||
|
||||
$task = null;
|
||||
$rules = [
|
||||
'methods' => [],
|
||||
'target_rules' => [],
|
||||
'target_overrides' => [],
|
||||
'reminder_policy' => [
|
||||
'base_mode' => 'due_date',
|
||||
'first_escalation_days' => 0,
|
||||
'step_days' => 7,
|
||||
'max_level' => 3,
|
||||
'active' => 1,
|
||||
],
|
||||
];
|
||||
|
||||
if ($taskId > 0) {
|
||||
$task = $services['taskDefinitionService']->getTaskDetail($taskId);
|
||||
if ($task === null) {
|
||||
return [
|
||||
'error' => 'Aufgabe nicht gefunden.',
|
||||
];
|
||||
}
|
||||
|
||||
$rules = $task['rules'] ?? $rules;
|
||||
}
|
||||
|
||||
$methodConfig = task_cert_normalize_method_config($rules['methods'] ?? []);
|
||||
$targetSelection = task_cert_normalize_target_selection($rules['target_rules'] ?? [], $rules['target_overrides'] ?? []);
|
||||
$targetSelection['responsible_contact_ids'] = is_array($rules['responsible_contact_ids'] ?? null)
|
||||
? array_values(array_unique(array_map('intval', $rules['responsible_contact_ids'])))
|
||||
: [];
|
||||
|
||||
$languageId = (int) ($GLOBALS['language']['id'] ?? 1);
|
||||
$lookupService = $services['lookupService'] ?? null;
|
||||
$lookup = ($lookupService instanceof TaskLookupService)
|
||||
? $lookupService->getAdminFormLookups($languageId)
|
||||
: [
|
||||
'task_categories' => [],
|
||||
'mandants' => [],
|
||||
'departments' => [],
|
||||
'roles' => [],
|
||||
'contacts' => [],
|
||||
'knowledge_posts' => [],
|
||||
];
|
||||
|
||||
$taskCategoryId = (int) (($task['task_category_id'] ?? 0));
|
||||
if ($taskCategoryId > 0) {
|
||||
$taskCategories = is_array($lookup['task_categories'] ?? null) ? $lookup['task_categories'] : [];
|
||||
$hasSelectedCategory = false;
|
||||
foreach ($taskCategories as $category) {
|
||||
if ((int) ($category['id'] ?? 0) === $taskCategoryId) {
|
||||
$hasSelectedCategory = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$hasSelectedCategory) {
|
||||
$taskCategories[] = [
|
||||
'id' => $taskCategoryId,
|
||||
'name' => 'Kategorie #' . $taskCategoryId . ' (nicht gefunden)',
|
||||
'slug' => '',
|
||||
'sort_order' => 999999,
|
||||
'active' => 0,
|
||||
];
|
||||
}
|
||||
|
||||
$lookup['task_categories'] = $taskCategories;
|
||||
}
|
||||
|
||||
return [
|
||||
'error' => null,
|
||||
'task' => $task,
|
||||
'rules' => $rules,
|
||||
'method_config' => $methodConfig,
|
||||
'target_selection' => $targetSelection,
|
||||
'lookup' => $lookup,
|
||||
'csrf_token' => TaskCertCsrf::token(),
|
||||
];
|
||||
}
|
||||
|
||||
function task_cert_normalize_method_config(array $methods): array
|
||||
{
|
||||
$types = TaskCertConstants::METHOD_TYPES;
|
||||
$enabled = array_fill_keys($types, 0);
|
||||
|
||||
$config = [
|
||||
'enabled' => $enabled,
|
||||
'knowledge_post_ids' => [],
|
||||
'form_fields' => [],
|
||||
'quiz_questions' => [],
|
||||
];
|
||||
|
||||
foreach ($methods as $method) {
|
||||
$type = (string) ($method['method_type'] ?? '');
|
||||
if (!array_key_exists($type, $config['enabled'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$config['enabled'][$type] = ((int) ($method['active'] ?? 1) === 1) ? 1 : 0;
|
||||
|
||||
if ($type === 'knowledge_read') {
|
||||
foreach (($method['knowledge_posts'] ?? []) as $post) {
|
||||
$postId = (int) ($post['knowledge_post_id'] ?? 0);
|
||||
if ($postId > 0) {
|
||||
$config['knowledge_post_ids'][] = $postId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($type === 'form_submit') {
|
||||
$fields = is_array($method['form_fields'] ?? null) ? $method['form_fields'] : [];
|
||||
foreach ($fields as $field) {
|
||||
$options = [];
|
||||
foreach ((array) ($field['options'] ?? []) as $option) {
|
||||
if (is_array($option)) {
|
||||
$value = trim((string) ($option['value'] ?? $option['label'] ?? ''));
|
||||
if ($value !== '') {
|
||||
$options[] = $value;
|
||||
}
|
||||
} else {
|
||||
$value = trim((string) $option);
|
||||
if ($value !== '') {
|
||||
$options[] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$config['form_fields'][] = [
|
||||
'field_key' => (string) ($field['field_key'] ?? ''),
|
||||
'label' => (string) ($field['label'] ?? ''),
|
||||
'field_type' => (string) ($field['field_type'] ?? 'text'),
|
||||
'is_required' => (int) ($field['is_required'] ?? 0),
|
||||
'placeholder' => (string) ($field['placeholder'] ?? ''),
|
||||
'prefill_column' => (string) ($field['prefill_column'] ?? ''),
|
||||
'options_text' => implode(', ', $options),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if ($type === 'quiz') {
|
||||
foreach ((array) ($method['quiz_questions'] ?? []) as $question) {
|
||||
$normalizedQuestion = [
|
||||
'question_text' => (string) ($question['question_text'] ?? ''),
|
||||
'option_a' => '',
|
||||
'option_b' => '',
|
||||
'option_c' => '',
|
||||
'option_d' => '',
|
||||
'correct_option' => 'a',
|
||||
];
|
||||
|
||||
$options = array_values((array) ($question['options'] ?? []));
|
||||
$letters = ['a', 'b', 'c', 'd'];
|
||||
|
||||
foreach ($letters as $index => $letter) {
|
||||
if (!isset($options[$index])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$option = $options[$index];
|
||||
$normalizedQuestion['option_' . $letter] = (string) ($option['option_text'] ?? '');
|
||||
|
||||
if ((int) ($option['is_correct'] ?? 0) === 1) {
|
||||
$normalizedQuestion['correct_option'] = $letter;
|
||||
}
|
||||
}
|
||||
|
||||
$config['quiz_questions'][] = $normalizedQuestion;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$config['knowledge_post_ids'] = array_values(array_unique(array_map('intval', $config['knowledge_post_ids'])));
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
function task_cert_normalize_target_selection(array $targetRules, array $targetOverrides): array
|
||||
{
|
||||
$selection = [
|
||||
'mandant_ids' => [],
|
||||
'department_ids' => [],
|
||||
'role_ids' => [],
|
||||
'override_include_contact_ids' => [],
|
||||
'override_exclude_contact_ids' => [],
|
||||
'override_include_reason' => '',
|
||||
'override_exclude_reason' => '',
|
||||
];
|
||||
|
||||
foreach ($targetRules as $rule) {
|
||||
$mandantId = (int) ($rule['main_mandant_id'] ?? 0);
|
||||
$departmentId = (int) ($rule['main_department_id'] ?? 0);
|
||||
$roleId = (int) ($rule['main_role_id'] ?? 0);
|
||||
|
||||
if ($mandantId > 0) {
|
||||
$selection['mandant_ids'][] = $mandantId;
|
||||
}
|
||||
|
||||
if ($departmentId > 0) {
|
||||
$selection['department_ids'][] = $departmentId;
|
||||
}
|
||||
|
||||
if ($roleId > 0) {
|
||||
$selection['role_ids'][] = $roleId;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($targetOverrides as $override) {
|
||||
$contactId = (int) ($override['main_contact_id'] ?? 0);
|
||||
if ($contactId <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$type = (string) ($override['override_type'] ?? '');
|
||||
if ($type === 'include') {
|
||||
$selection['override_include_contact_ids'][] = $contactId;
|
||||
if ($selection['override_include_reason'] === '') {
|
||||
$selection['override_include_reason'] = (string) ($override['reason'] ?? '');
|
||||
}
|
||||
}
|
||||
|
||||
if ($type === 'exclude') {
|
||||
$selection['override_exclude_contact_ids'][] = $contactId;
|
||||
if ($selection['override_exclude_reason'] === '') {
|
||||
$selection['override_exclude_reason'] = (string) ($override['reason'] ?? '');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$arrayKeys = [
|
||||
'mandant_ids',
|
||||
'department_ids',
|
||||
'role_ids',
|
||||
'override_include_contact_ids',
|
||||
'override_exclude_contact_ids',
|
||||
];
|
||||
|
||||
foreach ($arrayKeys as $key) {
|
||||
$values = is_array($selection[$key] ?? null) ? $selection[$key] : [];
|
||||
$selection[$key] = array_values(array_unique(array_map('intval', $values)));
|
||||
}
|
||||
|
||||
return $selection;
|
||||
}
|
||||
Reference in New Issue
Block a user