additional erstbetreuer/zweitbetreuer name parts fetch & columns default invisible, columns next/prev termin header filter & custom sort func, list header filter for qgate 1/2 status assistenz & mitarbeiter, change all "Assessor" and "Assesor" phrasen to "Reviewer"

This commit is contained in:
Johann Hoffmann
2026-02-24 15:58:44 +01:00
parent 6c8eb9ac38
commit 1e827fffee
9 changed files with 450 additions and 78 deletions
@@ -1222,7 +1222,7 @@ class Abgabe extends FHCAPI_Controller
$email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id);
if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
@@ -1235,7 +1235,7 @@ class Abgabe extends FHCAPI_Controller
if(!$mailres)
{
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
}
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
@@ -1255,14 +1255,14 @@ class Abgabe extends FHCAPI_Controller
if (!$tokenGenRes)
{
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general');
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
}
$begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id));
if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
{
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general');
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
}
$begutachterMitToken = $begutachterMitTokenRetval[0];
@@ -1296,7 +1296,7 @@ class Abgabe extends FHCAPI_Controller
if (!$mailres)
{
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
}
}
@@ -354,8 +354,10 @@ class Projektarbeit_model extends DB_Model
student_person.nachname as student_nachname,
tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
betreuer_benutzer.uid as betreuer_benutzer_uid,
betreuer_person.titelpre as betreuer_titelpre,
betreuer_person.vorname as betreuer_vorname,
betreuer_person.nachname as betreuer_nachname,
betreuer_person.titelpost as betreuer_titelpost,
lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -415,6 +417,50 @@ class Projektarbeit_model extends DB_Model
LIMIT 1
)
as zweitbetreuer_full_name,
(
SELECT titelpre
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_titelpre,
(
SELECT vorname
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_vorname,
(
SELECT nachname
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_nachname,
(
SELECT titelpost
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_titelpost,
(
SELECT
COALESCE(tbl_studienplan.orgform_kurzbz,
@@ -640,7 +640,7 @@ export const AbgabeMitarbeiterDetail = {
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t('abgabetool/c4zieldatumv2') )}}</div>
<div class="col-8 col-md-9">
<VueDatePicker
v-model="newTermin.datum"
@@ -698,8 +698,8 @@ export const AbgabeMitarbeiterDetail = {
<p> {{getProjektarbeitStudent}}</p>
<p> {{getProjektarbeitTitel}}</p>
<template v-if="assistenzMode">
<p v-if="projektarbeit?.erstbetreuer_full_name"> {{ projektarbeit.betreuerart ? $capitalize($p.t('abgabetool/c4betrart' + projektarbeit.betreuerart)) : $capitalize( $p.t('abgabetool/c4betreuer') )}}: {{projektarbeit?.erstbetreuer_full_name}}</p>
<p v-if="projektarbeit?.zweitbetreuer_full_name"> {{ projektarbeit?.zweitbetreuer_betreuerart_kurzbz ? $capitalize($p.t('abgabetool/c4betrart' + projektarbeit.zweitbetreuer_betreuerart_kurzbz)) : $capitalize( $p.t('abgabetool/c4zweitbetreuer') )}}: {{projektarbeit?.zweitbetreuer_full_name}}</p>
<p v-if="projektarbeit?.erstbetreuer_full_name"> {{ projektarbeit.betreuerart ? $capitalize($p.t('abgabetool/c4betrart' + projektarbeit.betreuerart)) : $capitalize( $p.t('abgabetool/c4betreuerv2') )}}: {{projektarbeit?.erstbetreuer_full_name}}</p>
<p v-if="projektarbeit?.zweitbetreuer_full_name"> {{ projektarbeit?.zweitbetreuer_betreuerart_kurzbz ? $capitalize($p.t('abgabetool/c4betrart' + projektarbeit.zweitbetreuer_betreuerart_kurzbz)) : $capitalize( $p.t('abgabetool/c4zweitbetreuerv2') )}}: {{projektarbeit?.zweitbetreuer_full_name}}</p>
</template>
<template v-else>
<p v-if="projektarbeit?.betreuer"> {{$capitalize($p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz))}}: {{projektarbeit?.betreuer?.first}}</p>
@@ -796,7 +796,7 @@ export const AbgabeMitarbeiterDetail = {
</div>
<div class="row mt-2">
<div class="col-12 col-md-3 align-content-center">
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatumv2') )}}</div>
<div class="row fw-light" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4abgabeuntil2359') )}}</div>
</div>
<div class="col-12 col-md-9">
@@ -334,7 +334,7 @@ export const AbgabeStudentDetail = {
<div class="col-8">
<p> {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}</p>
<p> {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}</p>
<p> {{$capitalize( $p.t('abgabetool/c4betreuer') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}</p>
<p> {{$capitalize( $p.t('abgabetool/c4betreuerv2') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}</p>
</div>
<div class="col-4">
<p>{{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }}
@@ -414,7 +414,7 @@ export const AbgabeStudentDetail = {
<div class="row mt-2">
<div class="col-12 col-md-3 align-content-center">
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatumv2') )}}</div>
<div class="row fw-light" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4abgabeuntil2359') )}}</div>
</div>
<div class="col-12 col-md-9">
@@ -9,6 +9,7 @@ import AbgabeterminStatusLegende from "./StatusLegende.js";
import FhcOverlay from "../../Overlay/FhcOverlay.js";
import { splitMailsHelper } from "../../../helpers/EmailHelpers.js"
import { getDateStyleClass} from "./getDateStyleClass.js";
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export const AbgabetoolAssistenz = {
name: "AbgabetoolAssistenz",
@@ -179,7 +180,7 @@ export const AbgabetoolAssistenz = {
// frozen: true,
// width: 40
// },
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', headerFilter: false, headerSort: false, formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
@@ -191,15 +192,41 @@ export const AbgabetoolAssistenz = {
formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuer'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuer'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), headerFilter: true, field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), headerFilter: true, field: 'nextTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))), headerFilter: true, field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))), headerFilter: true, field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerv2'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPre'))), field: 'betreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerVorname'))), field: 'betreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerNachname'))), field: 'betreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPost'))), field: 'betreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerv2'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPre'))), field: 'zweitbetreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerVorname'))), field: 'zweitbetreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerNachname'))), field: 'zweitbetreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPost'))), field: 'zweitbetreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))),
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
],
persistence: false,
persistenceID: "abgabetool_2025_12"
persistenceID: "abgabetool_2026_02"
},
abgabeTableEventHandlers: [
{
@@ -220,6 +247,67 @@ export const AbgabetoolAssistenz = {
]};
},
methods: {
getQGateStatusList() {
return [
this.$p.t('abgabetool/c4keinTerminVorhanden'),
this.$p.t('abgabetool/c4positivBenotet'),
this.$p.t('abgabetool/c4negativBenotet'),
this.$p.t('abgabetool/c4notYetGraded'),
this.$p.t('abgabetool/c4notSubmitted'),
this.$p.t('abgabetool/c4notHappenedYet')
]
},
sortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {
if (a === null || typeof a === "undefined") return 1;
if (b === null || typeof b === "undefined") return -1;
// try to handle the prev/next interpretation consistently
// can only make this wrong UX whise so whatever
if(column._column.field == 'prevTermin') {
return Math.abs(b.diffMs) - Math.abs(a.diffMs)
} else if (column._column.field == 'nextTermin') {
return Math.abs(a.diffMs) - Math.abs(b.diffMs)
}
// just in case someone reuses this
return Math.abs(b.diffMs) - Math.abs(a.diffMs)
},
headerFilterTerminCol(filterVal, rowVal) {
if (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {
return false;
}
const rowDate = rowVal.luxonDate;
const toLuxon = (val) => {
if (!val) return null;
let dt;
if (val instanceof Date) {
dt = luxon.DateTime.fromJSDate(val);
} else if (typeof val === "string") {
dt = luxon.DateTime.fromISO(val);
} else { // fallback
dt = luxon.DateTime.fromMillis(Number(val));
}
return dt.isValid ? dt : null;
};
const von = toLuxon(filterVal[0]);
const bis = toLuxon(filterVal[1]);
// specific day
if (von && !bis) {
return rowDate.hasSame(von, "day");
}
// range case
if (von && bis) {
return rowDate >= von.startOf("day") && rowDate <= bis.endOf("day");
}
return false
},
sammelMailStudent(param) {
const emails = this.selectedData
@@ -389,6 +477,7 @@ export const AbgabetoolAssistenz = {
termin.dateStyle = getDateStyleClass(termin, this.notenOptions)
const date = luxon.DateTime.fromISO(termin.datum).endOf('day')
termin.luxonDate = date
termin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past
if (termin.diffMs < 0) {
@@ -951,7 +1040,7 @@ export const AbgabetoolAssistenz = {
if(this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER) {
menu.push({
label: this.$p.t('abgabetool/c4sendEmailBetreuerv2', [this.uniqueBetreuerEmailCount]),
label: this.$p.t('abgabetool/c4sendEmailBetreuerv3', [this.uniqueBetreuerEmailCount]),
command: this.sammelMailBetreuer
})
}
@@ -1130,7 +1219,7 @@ export const AbgabetoolAssistenz = {
<div class="row mt-2">
<div class="col-12 col-md-3 align-content-center">
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatumv2') )}}</div>
</div>
<div class="col-12 col-md-9">
<VueDatePicker
@@ -1265,7 +1354,7 @@ export const AbgabetoolAssistenz = {
<template #opposite="slotProps">
<div class="row g-1">
<div class="col-5 fw-semibold text-end">
{{ $capitalize($p.t('abgabetool/c4zieldatum')) }}:
{{ $capitalize($p.t('abgabetool/c4zieldatumv2')) }}:
</div>
<div class="col-7">
{{ formatDate(slotProps.item.datum) }}
@@ -5,6 +5,7 @@ import VueDatePicker from '../../vueDatepicker.js.php';
import ApiAbgabe from '../../../api/factory/abgabe.js'
import FhcOverlay from "../../Overlay/FhcOverlay.js";
import { getDateStyleClass } from "./getDateStyleClass.js";
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export const AbgabetoolMitarbeiter = {
name: "AbgabetoolMitarbeiter",
@@ -136,7 +137,7 @@ export const AbgabetoolMitarbeiter = {
width: 50,
cssClass: 'sticky-col'
},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, headerFilter: false, headerSort: false, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4kontakt'))), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false, visible: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
@@ -145,14 +146,28 @@ export const AbgabetoolMitarbeiter = {
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerart'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), headerFilter: true, field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), headerFilter: true, field: 'nextTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))), headerFilter: true, field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))), headerFilter: true, field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false}
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerartv2'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), field: 'prevTermin',
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false}
],
persistence: false,
persistenceID: 'abgabeTableBetreuer2026-02-18'
persistenceID: 'abgabeTableBetreuer2026-02-24'
},
abgabeTableEventHandlers: [{
event: "tableBuilt",
@@ -188,6 +203,67 @@ export const AbgabetoolMitarbeiter = {
]};
},
methods: {
getQGateStatusList() {
return [
this.$p.t('abgabetool/c4keinTerminVorhanden'),
this.$p.t('abgabetool/c4positivBenotet'),
this.$p.t('abgabetool/c4negativBenotet'),
this.$p.t('abgabetool/c4notYetGraded'),
this.$p.t('abgabetool/c4notSubmitted'),
this.$p.t('abgabetool/c4notHappenedYet')
]
},
sortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {
if (a === null || typeof a === "undefined") return 1;
if (b === null || typeof b === "undefined") return -1;
// try to handle the prev/next interpretation consistently
// can only make this wrong UX whise so whatever
if(column._column.field == 'prevTermin') {
return Math.abs(b.diffMs) - Math.abs(a.diffMs)
} else if (column._column.field == 'nextTermin') {
return Math.abs(a.diffMs) - Math.abs(b.diffMs)
}
// just in case someone reuses this
return Math.abs(b.diffMs) - Math.abs(a.diffMs)
},
headerFilterTerminCol(filterVal, rowVal) {
if (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {
return false;
}
const rowDate = rowVal.luxonDate;
const toLuxon = (val) => {
if (!val) return null;
let dt;
if (val instanceof Date) {
dt = luxon.DateTime.fromJSDate(val);
} else if (typeof val === "string") {
dt = luxon.DateTime.fromISO(val);
} else { // fallback
dt = luxon.DateTime.fromMillis(Number(val));
}
return dt.isValid ? dt : null;
};
const von = toLuxon(filterVal[0]);
const bis = toLuxon(filterVal[1]);
// specific day
if (von && !bis) {
return rowDate.hasSame(von, "day");
}
// range case
if (von && bis) {
return rowDate >= von.startOf("day") && rowDate <= bis.endOf("day");
}
return false
},
loadState() {
return JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || "null");
},
@@ -370,6 +446,7 @@ export const AbgabetoolMitarbeiter = {
termin.dateStyle = getDateStyleClass(termin, this.notenOptions)
const date = luxon.DateTime.fromISO(termin.datum).endOf('day')
termin.luxonDate = date
termin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past
if (termin.diffMs < 0) {
@@ -806,7 +883,7 @@ export const AbgabetoolMitarbeiter = {
<div class="row mt-2">
<div class="col-12 col-md-3 align-content-center">
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatumv2') )}}</div>
</div>
<div class="col-12 col-md-9">
<VueDatePicker
@@ -356,11 +356,11 @@ export const AbgabetoolStudent = {
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4beurteilung') )}}</div>
<div class="col-8 col-md-9">
<button v-if="projektarbeit.beurteilung1" @click="handleDownloadBeurteilung1(projektarbeit)" class="btn btn-primary">
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungErstbetreuer') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungErstbetreuerv2') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
</button>
<a v-else>{{$capitalize( $p.t('abgabetool/c4nobeurteilungVorhanden') )}}</a>
<button v-if="projektarbeit.beurteilung2" @click="handleDownloadBeurteilung2(projektarbeit)" class="btn btn-primary" style="margin-left: 4px;">
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungZweitbetreuer') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungZweitbetreuerv2') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
</button>
</div>
</div>
@@ -379,13 +379,13 @@ export const AbgabetoolStudent = {
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit?.betreuerart_kurzbz ? $capitalize( $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) ) : $capitalize( $p.t('abgabetool/c4betreuer') ) }}</div>
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit?.betreuerart_kurzbz ? $capitalize( $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) ) : $capitalize( $p.t('abgabetool/c4betreuerv2') ) }}</div>
<div class="col-8 col-md-9">
{{ projektarbeit.betreuerart_kurzbz ? projektarbeit.betreuer : '' }}
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4betreuerEmailKontakt') )}}</div>
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4betreuerEmailKontaktv2') )}}</div>
<div class="col-8 col-md-9">
<a :href="getMailLink(projektarbeit)"><i class="fa fa-envelope" style="color:#00649C"></i></a>
</div>
@@ -34,7 +34,7 @@ export const DeadlineOverview = {
layout: 'fitColumns',
placeholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),
columns: [
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatum'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatumv2'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbz'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},
+203 -43
View File
@@ -10872,7 +10872,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'First Assessor',
'text' => 'First Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -11512,7 +11512,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'The second assessors assessment has been submitted and is part of the final grade.',
'text' => 'The second reviwers assessment has been submitted and is part of the final grade.',
'description' => '',
'insertvon' => 'system'
)
@@ -11692,7 +11692,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Second Assessor',
'text' => 'Second Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -11712,7 +11712,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Assessor',
'text' => 'Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -12092,7 +12092,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'To assessment of second assessor',
'text' => 'To assessment of second reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -12112,7 +12112,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'The assessment of the second assessor is not available yet.',
'text' => 'The assessment of the second reviewer is not available yet.',
'description' => '',
'insertvon' => 'system'
)
@@ -12192,7 +12192,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Send token to Second Assessor',
'text' => 'Send token to Second Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -12310,7 +12310,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Sending only possible after completion of assessment by Second Assessor',
'text' => 'Sending only possible after completion of assessment by Second Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -12550,7 +12550,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Assessor grade',
'text' => 'Reviewer grade',
'description' => '',
'insertvon' => 'system'
)
@@ -12570,7 +12570,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Assessor',
'text' => 'Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -12610,7 +12610,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Assessor type',
'text' => 'Reviewer type',
'description' => '',
'insertvon' => 'system'
)
@@ -12630,7 +12630,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'secondary assessor',
'text' => 'secondary reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -43359,7 +43359,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4betreuer',
'phrase' => 'c4betreuerv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -43370,7 +43370,7 @@ array(
),
array(
'sprache' => 'English',
'text' => "Assessor",
'text' => "Reviewer",
'description' => '',
'insertvon' => 'system'
)
@@ -43639,7 +43639,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zieldatum',
'phrase' => 'c4zieldatumv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -43650,7 +43650,7 @@ array(
),
array(
'sprache' => 'English',
'text' => "Target date",
'text' => "Deadline",
'description' => '',
'insertvon' => 'system'
)
@@ -44190,7 +44190,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Assessor type',
'text' => 'Reviewer type',
'description' => '',
'insertvon' => 'system'
)
@@ -44955,7 +44955,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4betreuerEmailKontakt',
'phrase' => 'c4betreuerEmailKontaktv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -44966,7 +44966,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Email Assessor',
'text' => 'Email Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -44995,7 +44995,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4downloadBeurteilungErstbetreuer',
'phrase' => 'c4downloadBeurteilungErstbetreuerv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45006,7 +45006,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Download evaluation of first assesor',
'text' => 'Download evaluation of first reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -45015,7 +45015,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4downloadBeurteilungZweitbetreuer',
'phrase' => 'c4downloadBeurteilungZweitbetreuerv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45026,7 +45026,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Download evaluation of second assesor',
'text' => 'Download evaluation of second reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -45450,7 +45450,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4erstbetreuer',
'phrase' => 'c4erstbetreuerv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45461,7 +45461,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'First Assessor',
'text' => 'First Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -45470,7 +45470,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zweitbetreuer',
'phrase' => 'c4zweitbetreuerv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45481,7 +45481,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Second Assessor',
'text' => 'Second Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -45550,7 +45550,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4sendEmailBetreuerv2',
'phrase' => 'c4sendEmailBetreuerv3',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45561,7 +45561,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Send Email to {0} assessors',
'text' => 'Send Email to {0} reviewers',
'description' => '',
'insertvon' => 'system'
)
@@ -45650,7 +45650,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4fehlerMailBegutachter',
'phrase' => 'c4fehlerMailBegutachterv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45661,7 +45661,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Error sending E-Mail to first Assessor!',
'text' => 'Error sending E-Mail to first Reviewer!',
'description' => '',
'insertvon' => 'system'
)
@@ -45670,7 +45670,7 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4fehlerMailZweitBegutachter',
'phrase' => 'c4fehlerMailZweitBegutachterv2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -45681,7 +45681,7 @@ array(
),
array(
'sprache' => 'English',
'text' => 'Error sending E-Mail to second Assessor!',
'text' => 'Error sending E-Mail to second Reviewer!',
'description' => '',
'insertvon' => 'system'
)
@@ -46413,6 +46413,166 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4erstbetreuerTitelPre',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ErstbetreuerIn Titel Pre',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'First Reviewer Title Pre',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4erstbetreuerVorname',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ErstbetreuerIn Vorname',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'First Reviewer First Name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4erstbetreuerNachname',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ErstbetreuerIn Nachname',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'First Reviewer Last Name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4erstbetreuerTitelPost',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ErstbetreuerIn Titel Post',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'First Reviewer Title Post',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zweitbetreuerTitelPre',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ZweitbetreuerIn Titel Pre',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Second Reviewer Title Pre',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zweitbetreuerVorname',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ZweitbetreuerIn Vorname',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Second Reviewer First Name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zweitbetreuerNachname',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ZweitbetreuerIn Nachname',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Second Reviewer Last Name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4zweitbetreuerTitelPost',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ZweitbetreuerIn Titel Post',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Second Reviewer Title Post',
'description' => '',
'insertvon' => 'system'
)
)
),
// ABGABETOOL PHRASEN END
array(
'app' => 'core',
@@ -54221,7 +54381,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'assessor',
'text' => 'reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -54241,7 +54401,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Assessor',
'text' => 'Reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -54261,7 +54421,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'assessor type',
'text' => 'reviewer type',
'description' => '',
'insertvon' => 'system'
)
@@ -54461,7 +54621,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Deleting not possible, assessors were already assigned to this projekt work',
'text' => 'Deleting not possible, reviewers were already assigned to this projekt work',
'description' => '',
'insertvon' => 'system'
)
@@ -54501,7 +54661,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Invalid project assessors',
'text' => 'Invalid project reviewers',
'description' => '',
'insertvon' => 'system'
)
@@ -54521,7 +54681,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Deleting not possible, project assessor has a contract already',
'text' => 'Deleting not possible, project reviewer has a contract already',
'description' => '',
'insertvon' => 'system'
)
@@ -54961,7 +55121,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Edit assessor',
'text' => 'Edit reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -54981,7 +55141,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'Save assessor',
'text' => 'Save reviewer',
'description' => '',
'insertvon' => 'system'
)
@@ -55121,7 +55281,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'project assessor short name',
'text' => 'project reviewer short name',
'description' => '',
'insertvon' => 'system'
)
@@ -55161,7 +55321,7 @@ I have been informed that I am under no obligation to consent to the transmissio
),
array(
'sprache' => 'English',
'text' => 'This project assessor is already assigned',
'text' => 'This project reviewer is already assigned',
'description' => '',
'insertvon' => 'system'
)