aboutsummaryrefslogtreecommitdiff
path: root/src/graduation-common.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/graduation-common.ts')
-rw-r--r--src/graduation-common.ts258
1 files changed, 29 insertions, 229 deletions
diff --git a/src/graduation-common.ts b/src/graduation-common.ts
index 2c0fb69..bb74dc1 100644
--- a/src/graduation-common.ts
+++ b/src/graduation-common.ts
@@ -29,14 +29,14 @@ class GraduationChange {
change: string,
reason: string,
coach: string,
- context: any,
+ context?: any,
) {
this.date = date;
this.studentId = studentId;
this.change = change;
this.reason = reason;
this.coach = coach;
- this.context = context;
+ this.context = context || {};
}
dbFields() {
@@ -61,46 +61,24 @@ class GraduationChange {
);
}
- static newObservationRequest() {
- return new GraduationChange(new Date(), -1, "ObservationRequest", "", "", "");
+ static newLevelChange(level: number, reason?: string, coach?: string) {
+ const ctx = { level: level };
+ return new GraduationChange(new Date(), -1, "LevelChange", reason || "", coach || "", ctx);
}
- static newObservationStart() {
- return new GraduationChange(new Date(), -1, "ObservationStart", "", "", "");
+ static newGreenPointChange(mandatory: boolean, reason?: string, coach?: string) {
+ const ctx = { mandatory: mandatory };
+ return new GraduationChange(new Date(), -1, "Grün", reason || "", coach || "", ctx);
}
- static newObservationEnd(reason: string, success: boolean) {
- return new GraduationChange(
- new Date(),
- -1,
- "ObservationEnd",
- reason,
- "",
- JSON.stringify(success),
- );
- }
-
- static newObservationChange(observation: Observation) {
- return new GraduationChange(
- observation.date,
- -1,
- "Observation",
- "",
- "",
- JSON.stringify(observation.status),
- );
- }
-
- static newGreenPointChange(reason: string, coach: string) {
- return new GraduationChange(new Date(), -1, "Grün", reason, coach, "");
- }
-
- static newOrangePointChange(reason: string, coach: string) {
- return new GraduationChange(new Date(), -1, "Orange", reason, coach, "");
+ static newOrangePointChange(mandatory: boolean, reason?: string, coach?: string) {
+ const ctx = { mandatory: mandatory };
+ return new GraduationChange(new Date(), -1, "Orange", reason || "", coach || "", ctx);
}
- static newRedPointChange(reason: string, coach: string) {
- return new GraduationChange(new Date(), -1, "Rot", reason, coach, "");
+ static newRedPointChange(mandatory: boolean, reason?: string, coach?: string) {
+ const ctx = { mandatory: mandatory };
+ return new GraduationChange(new Date(), -1, "Rot", reason || "", coach || "", ctx);
}
}
@@ -109,10 +87,8 @@ class Graduation {
green: number;
orange: number;
red: number;
+ mandatory: number;
level: number;
- observationRequested: Date | null;
- observation: ObservationPeriod | null;
- pastObservations: Array<ObservationPeriod>;
changes: Array<GraduationChange>;
constructor(
@@ -120,10 +96,8 @@ class Graduation {
green: number,
orange: number,
red: number,
+ mandatory: number,
level: number,
- observationRequested: Date | null,
- observation: ObservationPeriod | null,
- pastObservations: Array<ObservationPeriod>,
changes: Array<GraduationChange>,
) {
this.student = student;
@@ -131,9 +105,7 @@ class Graduation {
this.orange = orange;
this.red = red;
this.level = level;
- this.observationRequested = observationRequested;
- this.observation = observation;
- this.pastObservations = pastObservations;
+ this.mandatory = mandatory;
this.changes = changes;
student.graduation = this;
@@ -143,10 +115,8 @@ class Graduation {
let green = 0;
let orange = 0;
let red = 0;
+ let mandatory = 0;
let level = 1;
- let openObservationRequest = null;
- let observationPeriod = null;
- let pastObservations = [];
// The parsing logic assumes that changes are ordered chronologically
changes.sort((a, b) => a.date.valueOf() - b.date.valueOf());
@@ -165,39 +135,6 @@ class Graduation {
red++;
break;
- case "ObservationRequest":
- openObservationRequest = change.date;
- break;
-
- case "ObservationStart":
- console.assert(openObservationRequest === null, "No request for observation start");
-
- observationPeriod = new ObservationPeriod(change.date);
- openObservationRequest = null;
- break;
-
- case "ObservationEnd":
- if (observationPeriod === null) {
- console.error("No active observation period");
- continue;
- }
- observationPeriod.finishPeriod(change.context.success);
- if (change.context.success) {
- level++;
- }
- pastObservations.push(observationPeriod);
- observationPeriod = null;
- break;
-
- case "Observation":
- if (observationPeriod === null) {
- console.error("No active observation period");
- continue;
- }
- const observation = Observation.fromChange(change);
- observationPeriod.addObservation(observation);
- break;
-
case "LevelChange":
level = change.context.level;
break;
@@ -205,18 +142,12 @@ class Graduation {
default:
throw new Error(`Unexpected change: ${change}`);
}
+
+ if (change.context.mandatory) {
+ mandatory++;
+ }
}
- return new Graduation(
- student,
- green,
- orange,
- red,
- level,
- openObservationRequest,
- observationPeriod,
- pastObservations,
- changes,
- );
+ return new Graduation(student, green, orange, red, mandatory, level, changes);
}
addChange(change: GraduationChange) {
@@ -229,50 +160,6 @@ class Graduation {
}
/**
- * Request observation
- */
- async requestObservation() {
- const request = GraduationChange.newObservationRequest();
- this.observationRequested = request.date;
- const db = await getGraduationDb();
- await db.saveEntry(JSON.stringify(request.dbFields()));
- }
-
- /**
- * Start an observation
- */
- async startObservation() {
- if (this.observationRequested === null) {
- console.error("No observation requested");
- return;
- }
- this.observationRequested = null;
- this.observation = new ObservationPeriod(new Date());
- return submitGraduationChange(this, GraduationChange.newObservationStart());
- }
-
- /**
- * End an observation
- */
- async endObservation(reason: string, success: boolean) {
- if (this.observation === null) {
- console.error("No active observation");
- return;
- }
- this.observation.end = new Date();
- this.pastObservations.push(this.observation);
- this.observation = null;
- return submitGraduationChange(this, GraduationChange.newObservationEnd(reason, success));
- }
-
- /**
- * Return if the student is in observation.
- */
- isObserved() {
- return Boolean(this.observation);
- }
-
- /**
* Return the URI of the icon representing the graduation level.
*/
getIcon() {
@@ -285,83 +172,12 @@ class Graduation {
getLevelName() {
return LEVEL_NAMES[this.level - 1];
}
-}
-
-class ObservationPeriod {
- start: Date;
- end: Date | null;
- observations: Array<Observation>;
- success = false;
-
- constructor(start: Date) {
- this.start = start;
- this.end = null;
- this.observations = [];
- }
- finishPeriod(success: boolean) {
- this.end = new Date();
- this.success = success;
- }
-
- ended() {
- return Boolean(this.end);
- }
-
- ready() {
- if (this.observations.length < 10) return false;
-
- // at least 10 observation on different days
- let days = new Map();
- for (const observation of this.observations) {
- const d = observation.date;
- days.set(`${d.getFullYear()}${d.getMonth()}${d.getDate()}`, true);
- }
- return days.size >= 10;
- }
-
- getObservationsSums() {
- let sums = Array(OBSERVATION_TYPES.length)
- .fill(null)
- .map(() => ({ yes: 0, no: 0 }));
- for (const observation of this.observations) {
- for (let i = 0; i < sums.length; i++) {
- if (observation.status[i]) {
- if (observation.status[i] === "yes") sums[i].yes++;
- else sums[i].no++;
- }
- }
- }
- return sums;
- }
-
- addObservation(observation: Observation) {
- this.observations.push(observation);
- }
-}
-
-const OBSERVATION_TYPES = [
- "Arbeitet konzentriert an Aufgaben",
- "Arbeitet zunehmend selbstständig",
- "Führt das Logbuch zuverlässig",
- "Bringt Material mit",
- "Hält Regeln ein",
- "Geht verantwortungsvoll mit Materialien und LernRaum um",
- "Nimmt Rückmeldungen an und setzt sie um",
-];
-
-class Observation {
- date: Date;
- status: Array<string>;
-
- constructor(date: Date, status: Array<string>) {
- console.assert(status.length == OBSERVATION_TYPES.length, "invalid observation status");
- this.date = date;
- this.status = status;
- }
-
- static fromChange(change: GraduationChange) {
- return new Observation(change.date, JSON.parse(change.context));
+ /**
+ * Return the combined value of all points.
+ */
+ getNettoPoints(): number {
+ return this.green - this.orange - this.red;
}
}
@@ -371,20 +187,4 @@ async function submitGraduationChange(graduation: Graduation, change: Graduation
return db.saveEntry(JSON.stringify(change.dbFields()));
}
-async function submitObservation(graduation: Graduation, observation: Observation) {
- if (graduation.observation === null) throw new Error("no active observation");
- graduation.observation.addObservation(observation);
- await submitGraduationChange(graduation, GraduationChange.newObservationChange(observation));
-}
-
-export {
- LEVEL_NAMES,
- LEVEL_IMAGES,
- GraduationChange,
- Graduation,
- submitGraduationChange,
- submitObservation,
- OBSERVATION_TYPES,
- Observation,
- ObservationPeriod,
-};
+export { LEVEL_NAMES, LEVEL_IMAGES, GraduationChange, Graduation, submitGraduationChange };