# CRUD methoden

Documentatie van de diverse CRUD methoden binnen de Pynter API.

# Ophalen van gebruikers

# GetAllBasicPersonInfo

Het ophalen van een **niet geanonimiseerde in dienst gebruiker** binnen Pynter via de `GetAllBasicPersonInfo` endpoint kan er als volgt uit zien:

```xml
POST /service/apiservice.asmx HTTP/1.1
Host: domein.acc.pynter.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAllBasicPersonInfo xmlns="http://tempuri.org/">
      <username>string</username>
      <password>string</password>
    </GetAllBasicPersonInfo>
  </soap12:Body>
</soap12:Envelope>
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfListOfBasicPersonInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <Success>true</Success>
    <Contents>
        <!-- Weggelaten voor leesbaarheid, zie hieronder -->
    </Contents>
</ApiResponseOfListOfBasicPersonInfo>
```

De `Contents` zal een collectie van `BasicPersonInfo` bevatten. `BasicPersonInfo` is als volgt gestructureerd:

```xml
<BasicPersonInfo>
    <!-- De unieke identificatie van de persoon binnen Pynter. -->
    <PynterId>int</PynterId>

    <!-- OPTIONEEL: Het medewerkernummer voor deze persoon afkomstig uit het provisioning systeem. Is een uniek nummer. -->
    <ExternalId>string</ExternalId>

    <!-- De voornaam. -->
    <FirstName>string</FirstName>

    <!-- OPTIONEEL: Het tussenvoegsel. -->
    <Insertion>string</Insertion>

    <!-- De achternaam exclusief tussenvoegsel. -->
    <FamilyName>string</FamilyName>

    <!-- Een zakelijk e-mailadres voor de persoon. -->
    <Email>string</Email>

    <!-- Het autorisatieniveau van de persoon. -->
    <!-- Zie de opmerking onder dit blok voor meer uitleg. -->
    <AccountLevel></AccountLevel>

    <!-- De unieke identificatie van de leidinggevende van de persoon binnen Pynter. -->
    <ManagerPynterId>int<ManagerPynterId>

    <!-- OPTIONEEL: Het medewerkernummer voor de leidinggevende afkomstig uit het provisioning systeem. Is een uniek nummer. -->
    <ManagerExternalId>string</ManagerExternalId>

    <!-- De voornaam van de leidinggevende. -->
    <ManagerFirstName>string</ManagerFirstName>

    <!-- OPTIONEEL: Het tussenvoegsel van de leidinggevende. -->
    <ManagerInsertion>string</ManagerInsertion>

    <!-- De achternaam exclusief tussenvoegsel van de leidinggevende. -->
    <ManagerFamilyName>string</ManagerFamilyName>

    <!-- De naam van de functie. -->
    <Function>string</Function>

    <!-- De naam van de divisie / locatie van de persoon. -->
    <Division>string</Division>

    <!-- Of de medewerker hun account geactiveerd heeft door in te loggen. -->
    <HasActivatedAccount>boolean</HasActivatedAccount>

    <!-- Of de medewerker uit dienst is. -->
    <IsDismissed>boolean</IsDismissed>
</BasicPersonInfo>
```

<p class="callout info">
  <a href="https://docs.pynter.nl/books/authenticatie-en-autorisatie/page/autorisatie">
    Voor meer informatie over AccountLevel kan je de pagina over Autorisatie inzien.
  </p>
</a>

# GetPersonByPynterId

Het ophalen van een gebruiker binnen Pynter via de `GetPersonByPynterId` endpoint kan er als volgt uit zien:

```xml
POST /service/apiservice.asmx HTTP/1.1
Host: domein.acc.pynter.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetPersonByPynterId xmlns="/service/ApiService.asmx">
      <username>string</username>
      <password>string</password>
      <pynterPersonId>int</pynterPersonId>
    </GetPersonByPynterId>
  </soap12:Body>
</soap12:Envelope>
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfPerson xmlns="/service/ApiService.asmx">
  <Success>boolean</Success>
  <Contents xmlns="ApiPerson"></Contents>
  <Error>string</Error>
</ApiResponseOfPerson>
```

De `Contents` zal de volgende waarden van een `ApiPerson` bevatten:

```xml
<ApiPerson>
    <!-- De unieke identificatie van de persoon binnen Pynter. -->
    <Id>int</Id>

    <!-- Het medewerkernummer voor deze persoon. Kan gebruikt worden om de persoon op te wijzigen of op te halen. Moet uniek zijn. -->
    <ExternalIdentifier>string</ExternalIdentifier>

    <!-- De voornaam. -->
    <FirstName>string</FirstName>

    <!-- OPTIONEEL: Het tussenvoegsel. -->
    <Insertion>string</Insertion>

    <!-- De achternaam exclusief tussenvoegsel. -->
    <FamilyName>string</FamilyName>

    <!-- Een zakelijk e-mailadres voor de persoon. -->
    <Email>string</Email>

    <!-- Het autorisatieniveau van de persoon. -->
    <!-- Zie de opmerking onder dit blok voor meer uitleg. -->
    <AccountLevel></AccountLevel>

    <!-- Of deze persoon een manager is of niet. -->
    <IsManager>boolean</IsManager>

    <!-- De naam van de functie. -->
    <FunctionName>string</FunctionName>

    <!-- De unieke identificatie van de functie binnen Pynter. -->
    <FunctionId>int</FunctionId>

    <!-- De naam van de divisie / locatie van de persoon. -->
    <DivisionName>string</DivisionName>

    <!-- De unieke identificatie van de divisie binnen Pynter. -->
    <DivisionId>int</DivisionId>

    <!-- De kostenplaats voor de persoon. -->
    <CostCentre>string</CostCentre>

    <!-- OPTIONEEL: De telefoonnummer. -->
    <PhoneNumber>string</PhoneNumber>

    <!-- OPTIONEEL: Wanneer het contract van kracht is. -->
    <ContractStartTime>datetime</ContractStartTime>

    <!-- OPTIONEEL: Wanneer het contract afloopt. -->
    <ContractEndTime>datetime</ContractEndTime>

    <!-- De unieke identificatie van de manager voor deze persoon binnen Pynter. -->
    <ManagerId>int</ManagerId>
</personCreate>
```

<p class="callout info">
  <a href="https://docs.pynter.nl/books/authenticatie-en-autorisatie/page/autorisatie">
    Voor meer informatie over AccountLevel kan je de pagina over Autorisatie inzien.
  </p>
</a>

# GetPersonByExternalId

Het ophalen van een gebruiker binnen Pynter via de `GetPersonByExternalId` endpoint kan er als volgt uit zien:

```xml
POST /service/apiservice.asmx HTTP/1.1
Host: domein.acc.pynter.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetPersonByExternalId xmlns="/service/ApiService.asmx">
      <username>string</username>
      <password>string</password>
      <externalId>int</externalId>
    </GetPersonByExternalId>
  </soap12:Body>
</soap12:Envelope>
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfPerson xmlns="/service/ApiService.asmx">
  <Success>boolean</Success>
  <Contents xmlns="ApiPerson"></Contents>
  <Error>string</Error>
</ApiResponseOfPerson>
```

De `Contents` zal de volgende waarden van een `ApiPerson` bevatten:

```xml
<ApiPerson>
    <!-- De unieke identificatie van de persoon binnen Pynter. -->
    <Id>int</Id>

    <!-- Het medewerkernummer voor deze persoon. Kan gebruikt worden om de persoon op te wijzigen of op te halen. Moet uniek zijn. -->
    <ExternalIdentifier>string</ExternalIdentifier>

    <!-- De voornaam. -->
    <FirstName>string</FirstName>

    <!-- OPTIONEEL: Het tussenvoegsel. -->
    <Insertion>string</Insertion>

    <!-- De achternaam exclusief tussenvoegsel. -->
    <FamilyName>string</FamilyName>

    <!-- Een zakelijk e-mailadres voor de persoon. -->
    <Email>string</Email>

    <!-- Het autorisatieniveau van de persoon. -->
    <!-- Zie de opmerking onder dit blok voor meer uitleg. -->
    <AccountLevel></AccountLevel>

    <!-- Of deze persoon een manager is of niet. -->
    <IsManager>boolean</IsManager>

    <!-- De naam van de functie. -->
    <FunctionName>string</FunctionName>

    <!-- De unieke identificatie van de functie binnen Pynter. -->
    <FunctionId>int</FunctionId>

    <!-- De naam van de divisie / locatie van de persoon. -->
    <DivisionName>string</DivisionName>

    <!-- De unieke identificatie van de divisie binnen Pynter. -->
    <DivisionId>int</DivisionId>

    <!-- De kostenplaats voor de persoon. -->
    <CostCentre>string</CostCentre>

    <!-- OPTIONEEL: De telefoonnummer. -->
    <PhoneNumber>string</PhoneNumber>

    <!-- OPTIONEEL: Wanneer het contract van kracht is. -->
    <ContractStartTime>datetime</ContractStartTime>

    <!-- OPTIONEEL: Wanneer het contract afloopt. -->
    <ContractEndTime>datetime</ContractEndTime>

    <!-- De unieke identificatie van de manager voor deze persoon binnen Pynter. -->
    <ManagerId>int</ManagerId>
</personCreate>
```

<p class="callout info">
  <a href="https://docs.pynter.nl/books/authenticatie-en-autorisatie/page/autorisatie">
    Voor meer informatie over AccountLevel kan je de pagina over Autorisatie inzien.
  </p>
</a>

# GetPersonByEmail

Het ophalen van een gebruiker binnen Pynter via de `GetPersonByEmail` endpoint kan er als volgt uit zien:

```xml
POST /service/apiservice.asmx HTTP/1.1
Host: domein.acc.pynter.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetPersonByEmail xmlns="/service/ApiService.asmx">
      <username>string</username>
      <password>string</password>
      <email>int</email>
    </GetPersonByEmail>
  </soap12:Body>
</soap12:Envelope>
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfPerson xmlns="/service/ApiService.asmx">
  <Success>boolean</Success>
  <Contents xmlns="ApiPerson"></Contents>
  <Error>string</Error>
</ApiResponseOfPerson>
```

De `Contents` zal de volgende waarden van een `ApiPerson` bevatten:

```xml
<ApiPerson>
    <!-- De unieke identificatie van de persoon binnen Pynter. -->
    <Id>int</Id>

    <!-- Het medewerkernummer voor deze persoon. Kan gebruikt worden om de persoon op te wijzigen of op te halen. Moet uniek zijn. -->
    <ExternalIdentifier>string</ExternalIdentifier>

    <!-- De voornaam. -->
    <FirstName>string</FirstName>

    <!-- OPTIONEEL: Het tussenvoegsel. -->
    <Insertion>string</Insertion>

    <!-- De achternaam exclusief tussenvoegsel. -->
    <FamilyName>string</FamilyName>

    <!-- Een zakelijk e-mailadres voor de persoon. -->
    <Email>string</Email>

    <!-- Het autorisatieniveau van de persoon. -->
    <!-- Zie de opmerking onder dit blok voor meer uitleg. -->
    <AccountLevel></AccountLevel>

    <!-- Of deze persoon een manager is of niet. -->
    <IsManager>boolean</IsManager>

    <!-- De naam van de functie. -->
    <FunctionName>string</FunctionName>

    <!-- De unieke identificatie van de functie binnen Pynter. -->
    <FunctionId>int</FunctionId>

    <!-- De naam van de divisie / locatie van de persoon. -->
    <DivisionName>string</DivisionName>

    <!-- De unieke identificatie van de divisie binnen Pynter. -->
    <DivisionId>int</DivisionId>

    <!-- De kostenplaats voor de persoon. -->
    <CostCentre>string</CostCentre>

    <!-- OPTIONEEL: De telefoonnummer. -->
    <PhoneNumber>string</PhoneNumber>

    <!-- OPTIONEEL: Wanneer het contract van kracht is. -->
    <ContractStartTime>datetime</ContractStartTime>

    <!-- OPTIONEEL: Wanneer het contract afloopt. -->
    <ContractEndTime>datetime</ContractEndTime>

    <!-- De unieke identificatie van de manager voor deze persoon binnen Pynter. -->
    <ManagerId>int</ManagerId>
</personCreate>
```

<p class="callout info">
  <a href="https://docs.pynter.nl/books/authenticatie-en-autorisatie/page/autorisatie">
    Voor meer informatie over AccountLevel kan je de pagina over Autorisatie inzien.
  </p>
</a>

# Ophalen van leervoortgang van gebruikers

# GetAllLearningPortfolioContent

`GetAllLearningPortfolioContent` kan gebruikt worden om alle leervoortgang van alle **niet geanonimiseerde in dienst gebruikers** op te halen. Elke rij in het resultaat geeft de status voor de opleiding in relatie tot de gebruiker weer. Daarnaast bevat elke rij extra informatie, zoals de trede, informatie over de opleiding en informatie over de gebruiker.

Het ophalen van de leervoortgang van een **niet geanonimiseerde in dienst gebruiker** binnen Pynter via de `GetAllLearningPortfolioContent` endpoint kan er als volgt uit zien:

```xml
POST /service/apiservice.asmx HTTP/1.1
Host: domein.acc.pynter.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAllLearningPortfolioContent xmlns="/service/ApiService.asmx">
      <username>string</username>
      <password>string</password>
    </GetAllLearningPortfolioContent>
  </soap12:Body>
</soap12:Envelope>
```

Voor extra configuratie zijn er twee optionele parameters beschikbaar:

```xml
<!-- Kan gebruikt worden om aan te geven of eerder behaalde opleidingen, die niet actief in of op het leeraanbod / thuispagina van de gebruiker staan mee worden gegeven. -->
<!-- Staat standaard op False. -->
<includeContentNotInPortfolio>bool</includeContentNotInPortfolio>

<!-- Kan gebruikt worden om aan te geven of de voortgang van inactieve trainingen mee worden gegeven. -->
<!-- Staat standaard op False. -->
<includeInactiveTrainings>bool</includeInactiveTrainings>
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponse xmlns="/service/ApiService.asmx">
  <Success>boolean</Success>
  <Contents xmlns="BasicPersonInfo"></Contents>
  <Error>string</Error>
</ApiResponse>
```

De `Contents` zal een collectie van `LearningPortfolioContentCached` bevatten. `LearningPortfolioContentCached` is als volgt gestructureerd:

```xml
<LearningPortfolioContentCached>
    <!-- De titel van de trede. -->
    <StepTitle>int</StepTitle>

    <!-- De introductie van de trede. -->
    <StepIntroduction>string</StepIntroduction>

    <!-- De volgorde index van de trede. -->
    <StepOrder>int</StepOrder>

    <!-- De titel van de training. -->
    <TrainingTitle>string</TrainingTitle>

    <!-- Of de training verplicht is. -->
    <TrainingIsMandatory>string</TrainingIsMandatory>

    <!-- OPTIONEEL: De naam van de afbeelding van de training op Pynter. -->
    <TrainingImageName>string</TrainingImageName>

    <!-- OPTIONEEL: De unieke identificatie van de persoon in het Provisioning systeem. -->
    <PersonExternalIdentifier>string</PersonExternalIdentifier>

    <!-- OPTIONEEL: De unieke identificatie van de leidinggevende van de persoon in het provisioning systeem. -->
    <ManagerExternalIdentifier>string</ManagerExternalIdentifier>

    <!-- De voornaam van de persoon. -->
    <PersonFirstName>string</PersonFirstName>

    <!-- De tussenvoegsels van de cursist. Leeg wanneer deze geen waarde heeft. -->
    <PersonNameInsertion>string</PersonNameInsertion>

    <!-- De achternaam van de cursist. -->
    <PersonFamilyName>string</PersonFamilyName>

    <!-- Het unieke identificatie nummer van de reden voor het dimmen als dit het geval is. (Alleen van toepassing als er redenen voor dimmen beschikbaar zijn voor de cursist.) -->
    <DimReasonId>int</DimReasonId>

    <!-- Of deze cursist de drempel voor het mogen openen van deze opleiding behaald heeft. -->
    <TrainingThresholdIsMet>bool</TrainingThresholdIsMet>

    <!-- Of deze cursist de opleiding handmatig toegevoegd heeft vanuit de catalogus. -->
    <TrainingIsManuallyAdded>bool</TrainingIsManuallyAdded>

    <!-- OPTIONEEL: Wanneer de cursist de opleiding voor het laatst gestart heeft. Heeft een waarde als dit van toepassing is. -->
    <TrainingStartedAt>DateTime</TrainingStartedAt>

    <!-- OPTIONEEL: Wanneer de cursist de opleiding voor het laatst afgerond heeft. Heeft een waarde als dit van toepassing is. -->
    <TrainingFinishedAt>DateTime</TrainingFinishedAt>

    <!-- Tot wanneer het behaalde resultaat geldig is voor de cursist. Geen waarde als er nog geen resultaat is of als het resultaat oneindig geldig is. -->
    <TrainingValidUntil>DateTime</TrainingValidUntil>

    <!-- De status van de persoon in relatie tot de opleiding:
      0: Niet in aanbod (intern gebruik.)
      1: Gedimd
      2: Wel in aanbod maar nog niet gestart
      3: Gestart (TrainingStartedAt kolom heeft een waarde.)
      4: Afgerond (TrainingFinishedAt kolom heeft een waarde. TrainingValidUntil kolom heeft een waarde als dit toepassing is.)
      5: Dreigt te verlopen (3 maanden van tevoren.)
      6: Verlopen
    -->
    <LearningPortfolioStatus>Status</LearningPortfolioStatus>

    <!-- Of de training in het aanbod van de gebruiker zit. Bevat alleen False waardes wanneer de optionele includeContentNotInPortfolio parameter True is. -->
    <InPortfolio>bool</InPortfolio>

    <!-- De afkomst van de training in het portfolio van de medewerker, genoteerd als bitmasker, meerde waardes zijn mogelijk:
      0 (0000 0000): De persoon heeft de training niet in hun portfolio.
      1 (0000 0001): Deze training is toegevoegd door het inschrijven op een klas of het toevoegen van een E-learning.
      2 (0000 0010): De training komt uit een leerpad.
      4 (0000 0100): De training komt uit een leerpad en is gekoppeld aan de gebruiker middels hun functie.
      8 (0000 1000): De training komt uit een leerpad en is gekoppeld aan de gebruiker middels hun locatie.
      16 (0001 0000): De training komt uit een leerpad die gekoppeld is aan een groep waar de persoon lid van is.
      32 (0010 0000): De training komt uit een leerpad die gekozen is als thema.
      64 (0100 0000): De persoon is trainer van de training en heeft deze in hun portfolio.

      Voor de waarden 4, 8, 16 en 32 zal altijd de waarde 2 (leerpad) ook aanwezig zijn.
      De waarde 2 kan dus gebruikt worden om direct te controleren of de training uit een leerpad komt.
    -->
    <Sources>int</Sources>

    <!-- Het aantal actieve trainingen waar de persoon een status voor heeft in dezelfde trede als dit resultaat waar InPortfolio gelijk is aan true. -->
    <TrainingsInPortfolioForPersonInStepCount>int</TrainingsInPortfolioForPersonInStepCount>

    <!-- Het aantal actieve trainingen die de persoon afgerond heeft in dezelfde trede als dit resultaat waar InPortfolio zowel True als False kan zijn. -->
    <TrainingsFinishedForPersonInStepCount>int</TrainingsFinishedForPersonInStepCount>

    <!-- Het aantal actieve trainingen die de persoon afgerond heeft in dezelfde trede als dit resultaat waar InPortfolio gelijk is aan True. -->
    <TrainingsInPortfolioFinishedForPersonInStepCount>int</TrainingsInPortfolioFinishedForPersonInStepCount>
</LearningPortfolioContentCached>
```

<p class="callout info">
  Training is een collectieve naam voor Opleiding en Opleidingsblok.
</a>

# GetPaginatedLearningPortfolioContent

`GetPaginatedLearningPortfolioContent` kan gebruikt worden om alle leervoortgang van alle **niet geanonimiseerde in dienst gebruikers** op te halen. Deze method is vergelijkbaar met `GetAllLearningPortfolioContent`, maar hier kan pagina-informatie worden meegegeven. Elke rij in het resultaat geeft de status voor de opleiding in relatie tot de gebruiker weer. Daarnaast bevat elke rij extra informatie, zoals de trede, informatie over de opleiding en informatie over de gebruiker.

Het ophalen van de leervoortgang van een **niet geanonimiseerde in dienst gebruiker** binnen Pynter via de `GetPaginatedLearningPortfolioContent` endpoint kan er als volgt uit zien:

<p class="callout warning">
  <strong>Let op: </strong>Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.
</p>

```http
POST /service/apiservice.asmx/GetPaginatedLearningPortfolioContent HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&size=number&index=number
```

Voor extra configuratie zijn er twee optionele parameters beschikbaar:

```xml
includeContentNotInPortfolio=true|false
includeInactiveTrainings=true|false
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfLearningPortfolioContentPaginated xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <Success>true</Success>
    <Contents>
        <TotalItems>402444</TotalItems>
        <Size>100</Size>
        <Index>1</Index>
        <TotalPages>4025</TotalPages>
        <Items></Items>
    </Contents>
</ApiResponseOfLearningPortfolioContentPaginated>
```

De `Items` zal een collectie van `LearningPortfolioContentCached` bevatten. `LearningPortfolioContentCached` is als volgt gestructureerd:

```xml
<LearningPortfolioContentCached>
    <!-- De titel van de trede. -->
    <StepTitle>int</StepTitle>

    <!-- De introductie van de trede. -->
    <StepIntroduction>string</StepIntroduction>

    <!-- De volgorde index van de trede. -->
    <StepOrder>int</StepOrder>

    <!-- De titel van de training. -->
    <TrainingTitle>string</TrainingTitle>

    <!-- Of de training verplicht is. -->
    <TrainingIsMandatory>string</TrainingIsMandatory>

    <!-- OPTIONEEL: De naam van de afbeelding van de training op Pynter. -->
    <TrainingImageName>string</TrainingImageName>

    <!-- OPTIONEEL: De unieke identificatie van de persoon in het Provisioning systeem. -->
    <PersonExternalIdentifier>string</PersonExternalIdentifier>

    <!-- OPTIONEEL: De unieke identificatie van de leidinggevende van de persoon in het provisioning systeem. -->
    <ManagerExternalIdentifier>string</ManagerExternalIdentifier>

    <!-- De voornaam van de persoon. -->
    <PersonFirstName>string</PersonFirstName>

    <!-- De tussenvoegsels van de cursist. Leeg wanneer deze geen waarde heeft. -->
    <PersonNameInsertion>string</PersonNameInsertion>

    <!-- De achternaam van de cursist. -->
    <PersonFamilyName>string</PersonFamilyName>

    <!-- Het unieke identificatie nummer van de reden voor het dimmen als dit het geval is. (Alleen van toepassing als er redenen voor dimmen beschikbaar zijn voor de cursist.) -->
    <DimReasonId>int</DimReasonId>

    <!-- Of deze cursist de drempel voor het mogen openen van deze opleiding behaald heeft. -->
    <TrainingThresholdIsMet>bool</TrainingThresholdIsMet>

    <!-- Of deze cursist de opleiding handmatig toegevoegd heeft vanuit de catalogus. -->
    <TrainingIsManuallyAdded>bool</TrainingIsManuallyAdded>

    <!-- OPTIONEEL: Wanneer de cursist de opleiding voor het laatst gestart heeft. Heeft een waarde als dit van toepassing is. -->
    <TrainingStartedAt>DateTime</TrainingStartedAt>

    <!-- OPTIONEEL: Wanneer de cursist de opleiding voor het laatst afgerond heeft. Heeft een waarde als dit van toepassing is. -->
    <TrainingFinishedAt>DateTime</TrainingFinishedAt>

    <!-- Tot wanneer het behaalde resultaat geldig is voor de cursist. Geen waarde als er nog geen resultaat is of als het resultaat oneindig geldig is. -->
    <TrainingValidUntil>DateTime</TrainingValidUntil>

    <!-- De status van de persoon in relatie tot de opleiding:
      0: Niet in aanbod (intern gebruik.)
      1: Gedimd
      2: Wel in aanbod maar nog niet gestart
      3: Gestart (TrainingStartedAt kolom heeft een waarde.)
      4: Afgerond (TrainingFinishedAt kolom heeft een waarde. TrainingValidUntil kolom heeft een waarde als dit toepassing is.)
      5: Dreigt te verlopen (3 maanden van tevoren.)
      6: Verlopen
    -->
    <LearningPortfolioStatus>Status</LearningPortfolioStatus>

    <!-- Of de training in het aanbod van de gebruiker zit. Bevat alleen False waardes wanneer de optionele includeContentNotInPortfolio parameter True is. -->
    <InPortfolio>bool</InPortfolio>

    <!-- De afkomst van de training in het portfolio van de medewerker, genoteerd als bitmasker, meerde waardes zijn mogelijk:
      0 (0000 0000): De persoon heeft de training niet in hun portfolio.
      1 (0000 0001): Deze training is toegevoegd door het inschrijven op een klas of het toevoegen van een E-learning.
      2 (0000 0010): De training komt uit een leerpad.
      4 (0000 0100): De training komt uit een leerpad en is gekoppeld aan de gebruiker middels hun functie.
      8 (0000 1000): De training komt uit een leerpad en is gekoppeld aan de gebruiker middels hun locatie.
      16 (0001 0000): De training komt uit een leerpad die gekoppeld is aan een groep waar de persoon lid van is.
      32 (0010 0000): De training komt uit een leerpad die gekozen is als thema.
      64 (0100 0000): De persoon is trainer van de training en heeft deze in hun portfolio.

      Voor de waarden 4, 8, 16 en 32 zal altijd de waarde 2 (leerpad) ook aanwezig zijn.
      De waarde 2 kan dus gebruikt worden om direct te controleren of de training uit een leerpad komt.
    -->
    <Sources>int</Sources>

    <!-- Het aantal actieve trainingen waar de persoon een status voor heeft in dezelfde trede als dit resultaat waar InPortfolio gelijk is aan true. -->
    <TrainingsInPortfolioForPersonInStepCount>int</TrainingsInPortfolioForPersonInStepCount>

    <!-- Het aantal actieve trainingen die de persoon afgerond heeft in dezelfde trede als dit resultaat waar InPortfolio zowel True als False kan zijn. -->
    <TrainingsFinishedForPersonInStepCount>int</TrainingsFinishedForPersonInStepCount>

    <!-- Het aantal actieve trainingen die de persoon afgerond heeft in dezelfde trede als dit resultaat waar InPortfolio gelijk is aan True. -->
    <TrainingsInPortfolioFinishedForPersonInStepCount>int</TrainingsInPortfolioFinishedForPersonInStepCount>
</LearningPortfolioContentCached>
```

<p class="callout info">
  Training is een collectieve naam voor Opleiding en Opleidingsblok.
</a>

# GetHistoricAbsences

Met deze method kunnen de historische absenties worden opgehaald.

<p class="callout warning">**Let op:** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```http
POST /service/apiservice.asmx/GetHistoricAbsences HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfListOfHistoricAbsenceReasonDTO xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <Success>true</Success>
    <Contents></Contents>
</ApiResponseOfListOfHistoricAbsenceReasonDTO>
```

De `Contents` zal een collectie van `HistoricAbsenceReasonDTO` bevatten. `HistoricAbsenceReasonDTO` is als volgt gestructureerd:

```xml
<HistoricAbsenceReasonDTO>
    <!-- De unieke identificatie van de persoon in het Provisioning systeem. -->
    <PersonExternalIdentifier>string</PersonExternalIdentifier>
    
    <!-- De voornaam van de persoon. -->
    <PersonFirstName>string</PersonFirstName>
  
    <!-- De tussenvoegsels van de persoon. Leeg wanneer deze geen waarde heeft. -->
    <PersonNameInsertion>string</PersonNameInsertion>
  
    <!-- De achternaam van de cursist. -->
    <PersonFamilyName>string</PersonFamilyName>
  
    <!-- De locatie van de persoon. -->
    <Location>string</Location>
  
    <!-- De divisie van de persoon. -->
    <Division>string</Division>
  
    <!-- De naam van de lichting waarvoor absentie is geregistreerd -->
    <GroupClassTitle>string</GroupClassTitle>
  
    <!-- De locatie(s) van de lichting. Als er meerdere locaties zijn, worden deze als kommagescheiden lijst weergegeven. -->
    <GroupClassLocations>string</GroupClassLocations>
  
    <!-- De datum of data van de lichting. Als er meerdere data zijn, worden deze als kommagescheiden lijst weergegeven -->
    <GroupClassDates>string</GroupClassDates>
  
    <!-- De code van de training. -->
    <TrainingCode>string</TrainingCode>
  
    <!-- Het type training. -->
    <TrainingType>string</TrainingType>
    
    <!-- De titel van de training. -->
    <TrainingTitle>string</TrainingTitle>
  
    <!-- De titel van de module. -->
    <TaskTitle>string</TaskTitle>
  
    <!-- De reden van absentie. -->
    <AbsenceReason>string</AbsenceReason>
  
    <!-- De datum date de absentie is geregistreerd. -->
    <CreationDate>datetime</CreationDate>
  
    <!-- De openbare kosten van de training. -->
    <PublicCosts>number</PublicCosts>
  
    <!-- De niet-openbare kosten van de training.  -->
    <HiddenCosts>number</HiddenCosts>
  
    <!-- De kostenplaats van de persoon. -->
    <KostenPlaats>string</KostenPlaats>
</HistoricAbsenceReasonDTO>
```

# CompletedCourses

Met deze methode kunnen alle afgeronde (voltooide) cursussen worden opgehaald, voor een opgegeven tijdsperiode.

<p class="callout warning">**Let op:** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```http
POST /service/apiservice.asmx/CompletedCourses HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&fromDate=datetime&toDate=datetime
```

- `username` (string): De gebruikersnaam van de organisatie/klant.
- `password` (string): Het bijbehorende wachtwoord.
- `fromDate` (datetime in YYYY-MM-DD format): De begindatum (inclusief) van het tijdvak waarin cursussen afgerond moeten zijn.
- `toDate` (datetime in YYYY-MM-DD format): De einddatum (inclusief) van het tijdvak waarin cursussen afgerond moeten zijn.

Bij een succesvolle aanroep ziet de response er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfDataTable xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
  <Success>true</Success>
  <Contents>
    <!-- Metadata, deze kan genegeerd worden. -->
    <xs:schema id="NewDataSet"></xs:schema>
    <diffgr:diffgram>
      <DocumentElement>
      </DocumentElement>
    </diffgr:diffgram>
  </Contents>
</ApiResponseOfDataTable>
```

De `Contents.diffgr:diffgram` bevat een `DocumentElement` waarin elke rij een afgeronde cursus representeert. De kolommen en hun betekenis zijn als volgt:

```xml
<completedCoursesTable>
  <!-- De unieke identificatie van de opleiding/module. -->
  <OpleidingsId>int</OpleidingsId>
  
  <!-- De naam van de gevolgde opleiding of module. -->
  <Opleiding>string</Opleiding>
  
  <!-- De naam van de lichting waarin de opleiding is gevolgd. -->
  <Lichting>string</Lichting>
  
  <!-- De trede waar de opleiding onder hoort. -->
  <Trede>string</Trede>
  
  <!-- Overzicht van data en tijden van contactmomenten, als kommagescheiden lijst. -->
  <Contactmomenten>string</Contactmomenten>
  
  <!-- Namen van de trainers (kommagescheiden indien meerdere). -->
  <Trainers>string</Trainers>
  
  <!-- De code van de opleiding. -->
  <Opleidingscode>string</Opleidingscode>
  
  <!-- De versie van de opleiding. -->
  <Versie>string</Versie>
  
  <!-- De status: 'Afgerond' of 'Verlopen', afhankelijk van geldigheid. -->
  <Status>string</Status>
  
  <!-- De startdatum van de opleiding. -->
  <Startdatum>datetime</Startdatum>
  
  <!-- De datum waarop de opleiding is afgerond. -->
  <Afronddatum>datetime</Afronddatum>
  
  <!-- De datum waarop de opleiding verloopt. -->
  <Verloopdatum>datetime</Verloopdatum>
  
  <!-- De voornaam van de deelnemer. -->
  <Voornaam>string</Voornaam>
  
  <!-- De achternaam en eventuele tussenvoegsels van de deelnemer. -->
  <Achternaam>string</Achternaam>
  
  <!-- Het externe personeelsnummer van de deelnemer. -->
  <Personeelsnummer>string</Personeelsnummer>
  
  <!-- De locatie van de deelnemer. -->
  <Locatie>string</Locatie>
  
  <!-- De divisie van de deelnemer. -->
  <Divisie>string</Divisie>
  
  <!-- De functietitel van de deelnemer. -->
  <Functie>string</Functie>
  
  <!-- Het e-mailadres van de deelnemer. -->
  <Email>string</Email>
  
  <!-- Volledige naam van de leidinggevende van de deelnemer. -->
  <Leidinggevende>string</Leidinggevende>
  
  <!-- De kostenplaats van de deelnemer. -->
  <Kostenplaats>string</Kostenplaats>
  
  <!-- De kosten van deelname aan de opleiding. -->
  <Kosten>string</Kosten>
  
  <!-- De wijze van betaling (indien bekend). -->
  <Betaling>string</Betaling>
  
  <!-- 'Ja' als de deelnemer uit dienst is, anders 'Nee'. -->
  <Uit_dienst>string</Uit_dienst>
  
  <!-- De datum van inschrijving voor de opleiding. -->
  <Inschrijfdatum>datetime</Inschrijfdatum>
  
  <!-- De datum van de laatste wijziging van de registratie. -->
  <Mutatiedatum>datetime</Mutatiedatum>
  
  <!-- De datum van annulering (indien van toepassing). -->
  <Annuleringsdatum>datetime</Annuleringsdatum>
  
  <!-- Als de inschrijving is geannuleerd staat hier de reden van annuleren. Mogelijke waarden:
    * Reden onbekend
    * Geweigerd door planner
    * Geweigerd door leidinggevende
    * Geannuleerd door medewerker
    * Geannuleerd door planner
    * Omgepland door medewerker
    * Omgepland door planner
    * Omgepland door teaminschrijving
    * Medewerker uit dienst
    * Overgeplaatst van wachtlijst
   -->
  <Geannuleerd_door>string</Geannuleerd_door>
  
  <!-- Reden van annulering wanneer er hierboven voor "Geannuleerd door X" gekozen is. ('No show', 'Afgemeld', of leeg). -->
  <Annuleringsreden>string</Annuleringsreden>
  
  <!-- 'Ja', 'Nee' of 'N.v.t.' afhankelijk van behaalde certificering. -->
  <Certificaat_behaald>string</Certificaat_behaald>
  
  <!-- 'Ja' als de opleiding verplicht was, anders 'Nee'. -->
  <Verplicht>string</Verplicht>
  
  <!-- 'Intern' of 'Extern' afhankelijk van het type dienstverband. -->
  <Medewerkertype>string</Medewerkertype>
  
  <!-- Altijd '100%' voor afgeronde modules. -->
  <Percentage_gereed>string</Percentage_gereed>
</completedCoursesTable>
```

# GetPersonAgenda

Met deze method kan de Pynter-agenda van een gebruiker worden opgehaald. Hierin staat trainingen met een of meer fysieke trainingsdagen.

<p class="callout warning">****Let op:**** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```
POST /service/apiservice.asmx/GetPersonAgenda HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&identifier=string
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfListOfAgendaDTO>
  <Succes>true</Succes>
  <Contents></Contents>
</ApiResponseOfListOfAgendaDTO>
```

`Contents` bevat een of meer keer een `AgendaDTO` object. `AgendaDTO` is als volgt gestructureerd:

```xml
<AgendaDTO>
  <!-- De unieke ID van het agenda-item. -->
  <id>int</id>
  
  <!-- De naam van het agenda-item. -->
  <agendaItem>string</agendaItem>
  
  <!-- De datum van het agenda-item in het format dd MMMM yyyy, bijvoorbeeld "28 januari 2025". -->
  <agendaDatum>string</agendaDatum>

  <!-- De unieke ID van de lichting waar dit agenda-item onderdeel van is. -->
  <classID>int</classID>

  <!-- Het personeelsnummer van de medewerker. -->
  <externalIdentifier>string</externalIdentifier>
  
  <!-- De inschrijvingsstatus van het agenda-item.
    0: Aangemeld
       De medewerker is aangemeld voor het agenda-item, maar wacht nog op goedkeuring en/of planning.
    1: Goedgekeurd door leidinggevende
       De leidinggevende heeft de aanmelding goedgekeurd, maar de planner nog niet.
    2: Afgewezen
       De aanmelding is afgekeurd of geannuleerd.
    3: Ingepland
       De medewerker is ingeschreven.
  -->
  <State>int</State>

  <!-- Is de bijbehorende lichting geannuleerd Ja/Nee. -->
  <Cancelled>boolean</Cancelled>
  
  <!-- Ongebruikt. Heeft altijd de waarde "training". -->
  <type>string</type>
  
  <!-- Ongebruikt. Heeft altijd de waarde "#". -->
  <agendaHyperlink>string</agendaHyperlink>

  <!-- Ongebruikt. Heeft altijd de waarde "".  -->
  <agendaTarget>string</agendaTarget>
</AgendaDTO>
```

# StartedCourses

Met deze method kan informatie worden opgehaald over de inschrijvingsstatus van alle medewerkers.

<p class="callout warning">****Let op:**** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```
POST /service/apiservice.asmx/StartedCourses HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&fromDate=string&tillDate=string
```

fromDate en tillDate geven het tijdsbereik van de inschrijvingen aan, en moeten in het format "yyyy-MM-dd" worden opgegeven, bijvoorbeeld "2025-01-01". Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfDataTable>
  <Success>true</Success>
  <Contents>
    <!-- Metadata, deze kan genegeerd worden. -->
    <xs:schema id="NewDataSet"></xs:schema>
    <diffgr:diffgram>
      <DocumentElement>
      </DocumentElement>
    </diffgr:diffgram>
  </Contents>
</ApiResponseOfDataTable>
```

De `Contents.diffgr:diffgram` bevat een `DocumentElement` met daarin elementen van type `startedCoursesTable`. Elk element geeft de inschrijvingsstatus van een medewerker weer. De inhoud van `startedCoursesTable` is als volgt opgebouwd:

```xml
<startedCoursesTable>
  <!-- De naam van de opleiding. -->
  <Opleiding>string</Opleiding>

  <!-- De unieke ID van de opleiding. -->
  <OpleidingsId>int</OpleidingsId>

  <!-- Of de opleiding verplicht is. Mogelijke waarden: "Ja", "Nee" -->
  <Verplicht>string</Verplicht>

  <!-- De naam van de lichting. -->
  <Lichting>string</Lichting>

  <!-- De naam van de trede waar de opleiding onder zit. -->
  <Trede>string</Trede>

  <!-- De contactmomenten van de opleiding. 
    Kommagescheiden waarden in het format d-M-yyyy hh:mm-hh:hh, bijvoorbeeld "5-2-2025 10:00-11:00, 11-2-2025 10:00-11:00"
  -->
  <Contactmomenten>string</Contactmomenten>

  <!-- Alle trainers die bij de opleiding betrokken zijn. Kommagescheiden waarden, bijvoorbeeld "Jan de Vries, Maria de Jong" -->
  <Trainers>string</Trainers>

  <!-- De in Pynter instelbare opleidingscode. Vaak gebruikt om een eigen identificatiesysteem toe te passen in Pynter. -->
  <Opleidingscode>string</Opleidingscode>

  <!-- De versie van de opleiding. -->
  <Versie>string</Versie>

  <!-- De status van de opleiding. Mogelijke waarden:
    "Goedgekeurd"
    "Gestart"
    "Geannuleerd (te laat)"
    "Ingepland"
    "In aanbod"
  -->
  <Status>string</Status>

  <!-- De datum dat de medewerker is gestart aan de opleiding, in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Startdatum>string</Startdatum>

  <!-- De datum dat de medewerker de opleiding heeft afgerond, in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Afronddatum>string</Afronddatum>

  <!-- De datum dat de opleiding voor de medewerker verloopt, in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Verloopdatum>string</Verloopdatum>

  <!-- De voornaam van de medewerker. -->
  <Voornaam>string</Voornaam>

  <!-- De achternaam van de medewerker, in het format "[Achternaam], [tussenvoegsel]", bijvoorbeeld "Vries, de". -->
  <Achternaam>string</Achternaam>

  <!-- Het personeelsnummer van de medewerker. -->
  <Personeelsnummer>string</Personeelsnummer>

  <!-- De locatie van de medewerker. -->
  <Locatie>string</Locatie>

  <!-- De divisie van de medewerker. -->
  <Divisie>string</Divisie>

  <!-- De functie van de medewerker. -->
  <Functie>string</Functie>

  <!-- Het e-mailadres van de medewerker. -->
  <Email>string</Email>

  <!-- De volledige naam van de leidinggevende van de medewerker. -->
  <Leidinggevende>string</Leidinggevende>

  <!-- De kostenplaats van de medewerker. -->
  <Kostenplaats>string</Kostenplaats>

  <!-- De kosten voor de opleiding. -->
  <Kosten>string</Kosten>

  <!-- Ongebruikt. Altijd leeg. -->
  <Betaling>string</Betaling>

  <!-- Of de medewerker uit dienst is. Mogelijke waarden: "Ja", "Nee" -->
  <Uit_x0020_dienst>string</Uit_x0020_dienst>

  <!-- De datum dat de medewerker zich heeft ingeschreven voor de opleiding, in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Inschrijfdatum>string</Inschrijfdatum>

  <!-- De datum dat er voor het laatst iets is veranderd aan de inschrijving, in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Mutatiedatum>string</Mutatiedatum>

  <!-- De datum dat de inschrijving voor de opleiding is geannuleerd (indien van toepassing), in het format d-M-yyyy, bijvoorbeeld 23-02-2025. -->
  <Annuleringsdatum>string</Annuleringsdatum>

  <!-- De reden van annuleren (indien van toepassing). Mogelijke waarden:
    Reden onbekend
    Geweigerd door planner
    Geweigerd door leidinggevende
    Geannuleerd door medewerker
    Geannuleerd door planner
    Omgepland door medewerker
    Omgepland door planner
    Omgepland door teaminschrijving
    Medewerker uit dienst
    Overgeplaatst van wachtlijst
  -->
  <Geannuleerd_x0020_door>string</Geannuleerd_x0020_door>

  <!-- De reden van annuleren (indien van toepassing). Mogelijke waarden: "No show", "Afgemeld". -->
  <Annuleringsreden>string</Annuleringsreden>

  <!-- Of de medewerker met het afronden van de opleiding een certificaat. Mogelijke waarden: "Nee", "N.v.t.". -->
  <Certificaat_x0020_behaald>string</Certificaat_x0020_behaald>

  <!-- Het medewerkerstype. Mogelijke waarden: "Intern", "Extern". -->
  <Medewerkertype>string</Medewerkertype>

  <!-- Het percentage dat de medewerker de training heeft afgerond, in het format "X%", bijvoorbeeld "100%" of "12%". Wanneer dit niet van toepassing is wordt er "N.v.t." teruggegeven. -->
  <Percentage_x0020_gereed>string</Percentage_x0020_gereed>
</startedCoursesTable>
```

# Ophalen van leeraanbod

# GetClasses, GetClassesFilteredByDate en GetClassesFilteredByTraining

Met deze methods kan informatie over lichtingen worden opgehaald. Het format van het resultaat is voor alledrie de methods hetzelfde. De methods verschillen in de manier waarop gefilterd kan worden:

- `GetClasses` geeft de volledige lijst van lichtingen terug;
- `GetClassesFilteredByDate` geeft de mogelijkheid om lichtingen met een startdatum binnen een bepaald datumbereik op te halen;
- `GetClassesFilteredByTraining` geeft de mogelijkheid om de lichtingen van een bepaalde opleiding of opleidingsblok op te halen.

<p class="callout warning">****Let op:**** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

##### GetClasses

```
POST /service/apiservice.asmx/GetClasses HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&includeArchived=boolean
```

De `includeArchived` parameter geeft aan of gearchiveerde lichtingen ook opgehaald moeten worden.

##### GetClassesFilteredByDate

```
POST /service/apiservice.asmx/GetClassesFilteredByDate HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&fromDate=datetime&toDate=datetime&includeArchived=boolean
```

De `fromDate` en `toDate` parameters geven een datumbereik aan. Het filteren gebeurt aan de hand van de startdatum van de lichting, en is inclusief. Een request met `fromDate = 2025-04-28` en `toDate = 2025-05-07` bevat dus alle lichtingen die op 28 april 2025 of later en vóór of op 7 mei 2025 beginnen.

##### GetClassesFilteredByTraining

```
POST /service/apiservice.asmx/GetClassesFilteredByTraining HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&trainingId=number&trainingType=trainingtype&includeArchived=boolean
```

De `trainingId` en `trainingType` parameters kunnen samen gebruikt worden om te filteren op opleidingen. De `trainingType` parameter kan de volgende waarden hebben:

- `0` of `Learning`: Reguliere opleidingen
- `1` of `Longterm`: Opleidingsblokken

Let op: als je de tekstversie van de `trainingType` gebruikt is deze hoofdlettergevoelig!

Bij het succesvol aanroepen ziet een response er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfListOfTrainingClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <Success>true</Success>
    <Contents>
      // Meerdere TrainingClass objecten
    </Contents>
</ApiResponseOfListOfTrainingClass>
```

Het TrainingClass object is als volgt gestructureerd:

```xml
<TrainingClass>
  <!-- De unieke ID van de lichting. -->
  <Id>number</Id>
  
  <!-- De naam van de lichting. -->
  <Name>string</Name>
  
  <!-- Het maximale aantal inschrijvingen voor de lichting. Als er geen maximum is, wordt hier null teruggegeven. -->
  <MaximumEnrollments>number</MaximumEnrollments>
  
  <!-- Het minimum aantal inschrijvingen voor de lichting. Als er geen minimum is, wordt hier null teruggegeven. -->
  <MinimumEnrollments>number</MinimumEnrollments>
  
  <!-- Of de lichting geannuleerd is. -->
  <IsCancelled>boolean</IsCancelled>
  
  <!-- Of de lichting gearchiveerd is. -->
  <IsArchived>boolean</IsArchived>
  
  <!-- Of de lichting zichtbaar is in de opleidingscatalogus. -->
  <IsVisibleInCatalog>true</IsVisibleInCatalog>
  
  <!-- Of de lichting zichtbaar is in de opleidingskalender. -->
  <IsVisibleInCalendar>true</IsVisibleInCalendar>
  
  <!-- Of de opleiding getoond moet worden op externe websites. -->
  <VisibleExternally>true</VisibleExternally>
  
  <!-- Of medewerkers zich kunnen inschrijven voor een wachtlijst wanneer het maximum aantal deelnemers is bereikt. -->
  <HasWaitingList>false</HasWaitingList>
  
  <!-- Het maximale aantal inschrijvignen voor de wachtlijst. Als er geen maximum is, wordt hier null teruggegeven. -->
  <MaximumWaitingListEnrollments>number</MaximumWaitingListEnrollments>
  
  <!-- De trainingsdata die bij deze lichting horen. -->
  <Dates>
    <TrainingClassDate>
      
      <!-- De unieke ID van deze trainingsdag. -->
      <Id>number</Id>
      
      <!-- De datum van deze trainingsdag in ISO 8601 format (YYYY-MM-DD). -->
      <Date>date</Date>
      
      <!-- De starttijd van deze trainingsdag in ISO8601 format (HH:MM:SS). -->
      <StartsAt>time</StartsAt>
      
      <!-- De eindtijd van deze trainingsdag in ISO8601 format (HH:MM:SS). -->
      <EndsAt>time</EndsAt>
      
      <!-- De locatie van deze trainingsdag. -->
      <Location>
        
        <!-- De naam van deze trainigsdag. -->
        <Name>string</Name>
        
        <!-- Het adres van deze trainingsdag. -->
        <Address>string</Address>
      </Location>
      
      <!-- De IDs van de trainers voor deze opleiding. -->
      <TrainerIds/>
    </TrainingClassDate>
  </Dates>

  <!-- De ids van de gebruikers die voor deze lichting zijn ingeschreven. -->
  <Enrollments/>

  <!-- De IDs van de gebruikers die voor de wachtlijst van deze training zijn ingeschreven. -->
  <WaitingListEnrollments/>

  <!-- Informatie over de opleiding waar deze lichting onderdeel van is -->
  <Training>
    <!-- De unieke ID van de opleiding -->
    <Id>number</Id>
    
    <!-- Het opleidingstype van de opleiding. "Learning" voor reguliere opleidingen, "Longterm" voor opleidingsblokken. -->
    <Type>trainingType</Type>
    
    <!-- De naam van de opleiding -->
    <Name>string</Name>
  </Training>
</TrainingClass>
```

# GetClass

Met deze method kan informatie worden opgehaald over een lichting.

<p class="callout warning">****Let op:**** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```
POST /service/apiservice.asmx/GetClass HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string&classId=number
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfGroupClass>
  <Success>true</Success>
  <Contents></Contents>
</ApiResponseOfGroupClass>
```

De `Contents` bevat de volgende velden:

```xml
<!-- De unieke ID van de lichting. -->
<Id>number</Id>

<!-- De unieke ID van de groep die bij de lichting hoort. -->
<GroupId>number</GroupId>

<!-- De naam van de lichting. -->
<ClassName>string</ClassName>

<!-- Of de lichting zichtbaar is in de catalogus. -->
<IsVisibleCatalog>boolean</IsVisibleCatalog>

<!-- Of de lichting zichtbaar is in de kalender. -->
<IsVisibleCalendar>string</IsVisibleCalendar>

<!-- Of de lichting extern wordt aangeboden. -->
<OfferExternally>boolean</OfferExternally>

<!-- Het minimale aantal inschrijvingen voor de lichting. Kan ook leeg zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<MinPersons>number</MinPersons>

<!-- Het maximale aantal inschrijvingen voor de lichting. Kan ook leeg zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<MaxPersons>number</MaxPersons>

<!-- De memo voor de lichting. Hier kan extra informatie voor beheerders worden ingevuld. Deze is niet zichtbaar voor medewerkers. Dit eld bevat HTML. -->
<Memo>string</Memo>

<!-- Of de memo in de rapportage getoond moet worden. -->
<ShowMemoInReport>boolean</ShowMemoInReport>

<!-- Of de lichting gearchiveerd is. -->
<Archived>boolean</Archived>

<!-- Of de lichting geannuleerd is. -->
<Cancelled>boolean</Cancelled>

<!-- Of alleen medewerkers in een bepaalde divisie zich mogen inschrijven voor deze lichting. -->
<FilterByDivision>boolean</FilterByDivision>

<!-- Of deze lichting een wachtlijst heeft. -->
<HasWaitingList>boolean</HasWaitingList>

<!-- Het maximale aantal inschrijvingen voor de wachtlijst. Kan ook leeg (= onbeperkt) zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<WaitingListCapacity>number</WaitingListCapacity>

<!-- De uiterlijke datum dat medewerkers hun inschrijving kunnen aanpassen. Kan ook leeg zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<EditDeadline>datetime</EditDeadline>

<!-- De uiterlijke datum dat medewerkers zich voor de lichting kunnen inschrijgen. Kan ook leeg zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<RegistrationDeadline>datetime</RegistrationDeadline>

<!-- Het aantal dagen voor de eerste datum van de training voordat de medewerker toegang krijgt tot de inhoud van de opleiding. Kan ook leeg zijn, in dat geval heeft het XML-element de attribute xsi:nil="true". -->
<LockDaysTillStart>datetime</LockDaysTillStart>

<!-- De manier waarop de opleiding wordt afgerond. Mogelijke waarden: "Normal", "Stream", "ETicket". -->
<CompletionType>int</CompletionType>

<!-- Of de training nog in de bewerkmodus staat. -->
<IsUnderConstruction>boolean</IsUnderConstruction>

<!-- Lijst van data voor de lichting. Zie hieronder. -->
<Data />

<!-- Lijst van medewerkers die voor de lichting zijn ingeschreven. Deze informatie wordt in dit API-endpoint niet meegegeven. -->
<Members/>

<!-- Lijst van edities voor PE-online. Deze informatie wordt in dit API-endpoint niet meegegeven. -->
<Editions/>

<!-- Lijst van divisies die zich voor deze lichting kunnen inschrijven. Deze informatie wordt in dit API-endpoint niet meegegeven. -->
<GroupClassDivisions/>

<!-- Lijst van wachtlijstingschrijvingen. Deze informatie wordt in dit API-endpoint niet meegegeven. -->
<WaitingListEnrollments/>
```

Het `Data`-veld bevat de contactmomenten van de lichting. Hierin zitten een of meer elementen van het type `GroupClassDate`. Hierin zitten de volgende velden:

```xml
<!-- De unieke ID van het contactmoment. -->
<Id>number</Id>

<!-- De unieke ID van de lichting. -->
<ClassId>number</ClassId>

<!-- De datum van het contactmoment. -->
<Date>datetime</Date>

<!-- De starttijd van het contactmoment. -->
<From>string</From>

<!-- De eindtijd van het contactmoment -->
<Till>string</Till>

<!-- De naam van de locatie van het contactmoment. -->
<LocationName>string</LocationName>

<!-- Het adres van de locatie van het contactmoment. -->
<LocationAddress>string</LocationAddress>

<!-- De unieke ID van de PE-Online meeting. -->
<MeetingId>number</MeetingId>

<!-- De unieke ID van een module, indien gekoppeld. -->
<TaskId>number</TaskId>

<!-- Of er een stream beschikbaar is voor dit contactmoment. -->
<StreamAvailable>boolean</StreamAvailable>

<!-- De unieke code waarmee de stream gejoind kan worden. -->
<StreamPassword>string</StreamPassword>

<!-- Extra informatie die op het E-Ticket getoond wordt. -->
<EticketInformation>string</EticketInformation>

<!-- De unieke ID van de TopDesk-reservering, indien relevant. -->
<ReservationId>number</ReservationId>

<!-- Trainers voor dit contactmoment. Dit element wordt in deze API endpoint niet teruggegeven. -->
<Trainers />

<!-- Locaties voor TopDesk. Dit element wordt in deze API endpoint niet teruggegeven. -->
<TopDeskLocations />

<!-- Meetings voor PE-Online. Dit element wordt in deze API endpoint niet teruggegeven. -->
<Meetings />
```

# GetCatalog

Met deze method kan de inhoud van de catalogus worden opgehaald.

<p class="callout warning">**Let op:** Gebruik geen GET-requests. Deze worden in plaintext verstuurd, en zijn dus niet veilig.</p>

```
POST /service/apiservice.asmx/GetCatalog HTTP/1.1
Host: domein.pynter.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string
```

Bij het succesvol aanroepen ziet een respons er als volgt uit:

```xml
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<ApiResponseOfListOfCatalogItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <Success>true</Success>
    <Contents></Contents>
</ApiResponseOfListOfCatalogItem>
```

De `Contents` zal een collectie van `CatalogItem` bevatten. `CatalogItem` is als volgt gestructureerd:

```xml
<CatalogItem>
  <!-- De naam van een trede. -->
  <Title>string</Title>

  <!-- De categorieen in een trede. -->
  <CatSubject>

    <!-- Een categorie in een trede. Hier kunnen er meerdere van zijn. -->
    <CatSubject>

      <!-- De titel van een categorie in een trede. -->
      <Subject>string</Subject>

      <!-- De trainingen in deze categorie. -->
      <CatTrainingInfo>

        <!-- Een training in de categorie. Hier kunnen er meerdere van zijn. -->
        <CatTrainingInfo>

          <!-- De titel van de opleiding -->
          <Title>string</Title>

          <!-- URL naar de afbeelding van de training, als er een is ingesteld. -->
          <Image>string</Image>

          <!-- Beschrijving vna de opleiding. Bevat HTML-opmaak. -->
          <Description>string</Description>

          <!-- Unieke ID van de opleiding -->
          <Id>number</Id>

          <!-- Kosten -->
          <costs>string</costs>

          <!-- De trainers voor deze opleiding. -->
          <Trainers>
            
            <!-- Informatie over een trainer. Hier kunnen er meerdere van zijn. -->
            <UserInfo>

              <!-- Unieke ID van de trainer. -->
              <Id>number</Id>

              <!-- Volledige naam van de trainer in de vorm "Voornaam van Achternaam". -->
              <Name>string</Name>

              <!-- Emailadres van de trainer -->
              <EmailAddress>string</EmailAddress>
            </UserInfo>
          </Trainers>

          <!-- Als de opleiding fysieke opleidingsmomenten heeft worden deze hier neergezet. -->
          <TrainingData>

            <!-- Informatie over een opleidingslichting. Hier kunnen er meerdere van zijn. -->
            <TrainingData>

              <!-- De unieke ID van de lichting. -->
              <subscriptionId>number</subscriptionId>
            
              <!-- De unieke ID van de groep. -->
              <groupId>number</groupId>
            
              <!-- De naam van de lichting. -->
              <ClassName>string</ClassName>
            
              <!-- De datum van de lichting. -->
              <Date>string</Date>
            
              <!-- Het tijdstip van de lichting. -->
              <Time>string</Time>
            
              <!-- De locatie van de lichting. -->
              <Location>string</Location>
            
              <!-- Het adres van de locatie. -->
              <Adress>string</Adress>
            
              <!-- Het aantal beschikbare plaatsen. -->
              <AvailablePlaces>number</AvailablePlaces>
            
              <!-- Geeft aan of er een wachtlijst is. -->
              <HasWaitingList>boolean</HasWaitingList>

              <!-- De lichtingspecifieke trainers. -->
              <Trainers>
                    
                <!-- Informatie over een trainer. Hier kunnen er meerdere van zijn. -->
                <UserInfo>
    
                  <!-- Unieke ID van de trainer. -->
                  <Id>number</Id>
    
                  <!-- Volledige naam van de trainer in de vorm "Voornaam van Achternaam". -->
                  <Name>string</Name>
    
                  <!-- Emailadres van de trainer -->
                  <EmailAddress>string</EmailAddress>
                  
                </UserInfo>
                
              </Trainers>
              
            </TrainingData> 
            
          </TrainingData>

          <!-- Dit element is altijd leeg. -->
          <Sites />

          <!-- Dit element is altijd leeg. -->
          <RelatedTrainings />
          
        </CatTrainingInfo>
        
      </CatTrainingInfo>
      
    </CatSubject>
  </CatSubject>
</CatalogItem>
```