| name | create_employee_from_contract |
| tier | 3 |
| task | T19 |
| description | This skill creates an employee from a PDF EMPLOYMENT CONTRACT (arbeidskontrakt) with FULL details including national identity number (personnummer), STYRK occupation code (stillingskode), email, bank account, salary type, and department. Use this when the prompt mentions "personnummer", "stillingskode", "numéro d'identité", "código de profesión", "Personalausweisnummer". Do NOT use for offer letters (tilbudsbrev) — those have fewer fields and need standard working hours instead. Keywords include "employment contract", "arbeidskontrakt", "contrat de travail", "Arbeitsvertrag", "contrato de trabajo", "contrato de trabalho". |
Create Employee from PDF Contract
6 API calls.
Step 1: Read the PDF and find these 13 fields
| # | Look for | Example value |
|---|
| 1 | First name (arbeidstaker) | William |
| 2 | Last name | Johnson |
| 3 | Date of birth (fødselsdato) | 20.02.1990 |
| 4 | National ID (personnummer) | 20029047368 |
| 5 | Email (e-post) | william.johnson@example.org |
| 6 | Bank account (bankkonto) | 64387484939 |
| 7 | Department (avdeling) | Markedsføring |
| 8 | STYRK code (stillingskode) | 3323 |
| 9 | Employment form (ansettelsesform) | Fast stilling |
| 10 | Salary type (lønnstype) | Fastlønn |
| 11 | Percentage (stillingsprosent) | 80.0 |
| 12 | Annual salary (årslønn) | 920000 |
| 13 | Start date (tiltredelse) | 11.11.2026 |
All 13 fields MUST be found before proceeding. Convert dates DD.MM.YYYY → YYYY-MM-DD.
Call 1: GET /department
GET /department?fields=id,name&count=20
Call 2: GET /salary/settings
GET /salary/settings
Municipality ID is needed to create a division.
Call 3: POST /department (if needed) + POST /division
If the PDF's department is not in Call 1 results:
POST /department
{"name": "<field 7>"}
Fresh sandboxes have 0 divisions. Create one:
POST /division
{"name": "Hovedkontor", "organizationNumber": "999999999", "startDate": "2026-01-01", "municipality": {"id": "<from Call 2>"}, "municipalityDate": "2026-01-01"}
Call 4: GET /employee/employment/occupationCode
Tripletex uses 7-digit codes where the first 4 digits are the STYRK code. The code parameter does substring search (NOT prefix!). Results are sorted by name, NOT code.
CRITICAL: Searching code=4110 returns codes CONTAINING "4110" anywhere — most results will NOT start with "4110". You MUST use a more specific search.
Step A — search with STYRK + "1" appended:
GET /employee/employment/occupationCode?code=<field 8>1&count=100&fields=id,code,nameNO
Example: STYRK 4110 → search code=41101. This narrows results to codes like 4110101, 4110102 etc. — guaranteed to start with the correct 4-digit STYRK.
Pick the FIRST result whose code starts with <field 8>. This is your occupation code.
Step B (only if Step A returned 0 results):
GET /employee/employment/occupationCode?code=<field 8>&count=100&fields=id,code,nameNO
Scan ALL results. Pick one whose code starts with <field 8> (exact 4-digit match). If NONE start with the 4-digit STYRK, pick one starting with the first 3 digits, then 2 digits. Last resort: pick FIRST result.
You MUST always set occupationCode. NEVER omit it. NEVER send {}. Always {"id": <number>}.
Call 5: POST /employee
Every field from the PDF goes here:
POST /employee
{
"firstName": "<field 1>",
"lastName": "<field 2>",
"dateOfBirth": "<field 3 as YYYY-MM-DD>",
"nationalIdentityNumber": "<field 4>",
"email": "<field 5>",
"bankAccountNumber": "<field 6>",
"userType": "NO_ACCESS",
"department": {"id": "<from Call 1 or 3>"},
"employments": [{
"startDate": "<field 13 as YYYY-MM-DD>",
"division": {"id": "<from Call 3 POST /division>"},
"isMainEmployer": true,
"taxDeductionCode": "loennFraHovedarbeidsgiver",
"employmentDetails": [{
"date": "<field 13 as YYYY-MM-DD>",
"employmentType": "ORDINARY",
"employmentForm": "PERMANENT",
"remunerationType": "MONTHLY_WAGE",
"occupationCode": {"id": "<from Call 4>"},
"percentageOfFullTimeEquivalent": "<field 11>",
"annualSalary": "<field 12>",
"workingHoursScheme": "NOT_SHIFT",
"payrollTaxMunicipalityId": {"id": "<municipality_id_from_Call_2>"}
}]
}]
}
| POST field | Source |
|---|
| firstName, lastName | PDF fields 1-2 |
| dateOfBirth | PDF field 3 (converted) |
| nationalIdentityNumber | PDF field 4 |
| email | PDF field 5 |
| bankAccountNumber | PDF field 6 |
| department.id | Call 1 or 3 |
| division.id | Call 3 POST /division |
| occupationCode.id | Call 4 (REQUIRED) |
| percentageOfFullTimeEquivalent | PDF field 11 |
| annualSalary | PDF field 12 |
| startDate + date | PDF field 13 (converted) |
| payrollTaxMunicipalityId | Call 2 salary/settings municipality |