Skip to main content

create-employee-from-contract

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".

Jump to install

Source facts

Repository
JardarIversen/ainm-2026
Last source activity
March 22, 2026 at 12:32
Detected SKILL.md language
English
Stars
18
Forks
14

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
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 |
View on GitHub