- 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:
```json
POST /department
{"name": "<field 7>"}
```
Fresh sandboxes have 0 divisions. Create one:
```json
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:
```json
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 |
GitHubで見る