# Smartschool tracking

Ik ben hier uitgegaan van de bestaande tracking van Xerte, omdat wij dat op zeer korte termijn kunnen implementeren.

De tracking van Xerte wordt bijgehouden in javascript structuren. Deze state kan in zijn geheel als JSON script gestuurd worden en ook kan de state in 1 klap gezet worden op basis van een JSON string

Elke 'pagina' in Xerte kan 0 of meerdere 'interacties' bevatten

De state van een 'pagina' wordt opgeslagen in de volgende structuur:

    function InteractionTracking(page_nr, ia_nr, ia_type, ia_name)
    {
        this.page_nr = page_nr;             // Page id
        this.page_ref = page_nr+1;          // Pagina nr
        this.ia_nr = ia_nr;                 // Interactiviteit id (-1 voor de pagina zelf)
        this.ia_ref = ia_nr+1;
        this.ia_type = ia_type;             // Soort interactiviteit: 'match', 'multiplechoice', 'numeric', 'fill-in', 'text' en 'page'
        this.ia_name = ia_name;             // Naam (referentie naar de interactiviteit)
        this.state = "entered";             // Status: 'entered', 'exited'
        this.start = new Date();            // Start
        this.end = this.start;              // Einde (als state == 'exited')
        this.count = 0;                     // Hoe vaak bezocht
        this.duration = 0;                  // Tijdsduur (als state == 'exited')
        this.nrinteractions = 0;            // Aantal interactions (als ia_nr == -1, m.a.w. dit is de pagina)
        this.weighting = 0.0;               // Gewicht (voor gewogen gemiddelde)
        this.score = 0.0;                   // Score (0.0 - 100.0)
        this.result = 'unknown';            // Resultaat: 'unknown', true, false voor interactiviteit match, multiplechoice en fill-in
        this.complete = false;              // Alle interactiviteiten gedaan?
        this.correctoptions = "";           // Correcte opties (in de vorm van a,b,c) voor match, multiplechoice en fill-in
        this.correctanswer = "";            // Correcte antwoorden voor match, multiplechoice en fill-in
        this.correctfeedback = "";          // Feedback van correcte antwoord
        this.learneroptions = "";           // Gegeven antwoordopties (in de vorm van a,b,c) voor match, multiplechoice en fill-in
        this.learneranswer = "";            // Gegeven antwoorden
        this.answerfeedback = "";           // Feedback over de gegeven antwoorden
        this.id = "";                       // uid
    }

Welke velden zijn ingevuld hangt af van het type interactiviteit:

1. ### Pagina (dus ia_nr => -1)

   Twee gevallen:

   1. Geen interactiviteiten op de pagina: Score is 100 als de pagina langer dan 1 seconde bezocht is
   2. Wel interactiviteiten op de pagina: Gemiddelde score van de interactiviteiten.

2. ### match

   Wordt gebruikt bij drag en drop oefeningen.

   correctoptions en learneroptions is gevuld met een array van objecten { source, target }

3. ### multiplechoice

   Wordt gebruikt door mcq en quiz. Bij mcq is er een vraag per pagina, bij een quiz zijn er meerdere vragen op 1 pagina

   correctoptions en learneroptions zijn gevuld met indicatie van antwoorden (1, 2, 3)

   correctanswer en learneranswer zijn gevuld met een text representatie van de antwoorden

   correctfeedback en learner feedback zijn ook gevuld

4. ### fill-in

   Wordt o.a. gebruikt bij fill in the gaps

   correctoptions en learneroptions zijn niet gevuld met een array van objecten { source, target }

   correctanswer en learneranswer zijn gevuld met een text <source> --> <target>

   correctfeedback is ook gevuld

5. ### text

   wordt nog niet gebruikt, maar is bedoeld voor open vragen

De complete state wordt opgeslagen in de volgende structuur:

    function TrackingState()
    {
        this.initialised = false;           // Geïnitialiseerd?
        this.mode = "";                     // Normal is normale tracking
        this.currentid = "";                // Huidige interactie id  -> wordt gebruikt bij restore state
        this.currentpageid = "";            // Huidige pagina id -> wordt gebruikt bij restore state
        this.trackingmode = "full";         // Tracking mode: 'none', 'minimal', 'full'
        this.scoremode = 'first';           // Score mode: 'first', 'last'
        this.nrpages = 0;                   // Aantal pagina's
        this.pages_visited=0;               // Aantal pagina's bezocht. Wordt gebruikt voor completeness, maar gaat veranderen
        this.start = new Date();            // Start tijd
        this.duration_previous_attempts = 0; // Totale tijd in vorige pogingen
        this.lo_type = "pages only";        // Leer object type: 'pages only', 'interactive'
        this.lo_passed = -1.0;              // Score van 0.0 - 100.0 wanneer een object geslaagd is (standaard 55)
        this.lo_completed = "unknown";      // Compleet: 'unknown', 'incomplete' en 'completed'
        this.finished = false;              // Gestopt
        this.interactions = new Array();    // Array van InteractionTracking
    }

Ik stel het volgende voor

1. Er komt een speciaal entry point voor Smartschool, bijvoorbeeld https://<url van installatie>/smartschool.php?template_id=32. In deze call wordt er een OAuth gedaan met smartschool, om te zien welke student cq. docent is ingelogd, en de user id wordt meegegeven aan de Xerte runtime.
2. Bij het starten van het leerobject wordt er gevraagd (via webservice call) naar state (als het een resume betreft). Smartschool moet dat op een of andere manier aangeven. Het leerobject gaat dan verder waar ze gebleven waren. Hier wordt de hele JSON string meegeven die de vorige keer werd meegegeven bij het afbreken. (zie onder)
3. Afhankelijk van wat jullie willen, kan er een webservice call bij de start van een pagina maar in ieder geval bij het verlaten van de pagina gestuurd worden met een InteractionTracking object JSON
4. Bij het afsluiten een call met de status (complete, suspended) met de score of de suspend state met een TrackingState object in JSON

Ik heb nog geen webservice interface bedacht, maar REST zou verre weg het makkelijkst zijn, want die kunnen we rechtstreeks vanuit javascript gebruiken.

Ook zullen we vast hier en daar wat details moeten toevoegen over hoe we een uid aan een leerobject hangen. En zaken als publiceren en dergelijke.