Skip to content
Merged
4 changes: 4 additions & 0 deletions docs/ap/hr/transformasjoner/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Transformasjoner",
"position": 1
}
42 changes: 42 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_ansettelsesdato.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# sap_10_ansettelsesdato

## Formål
Henter ansettelsesdato fra PA0041 ved å søke gjennom 24 datotype/dato-kolonnepar. Prioriterer datotype '01' for HVL, deretter 'VB' for alle institusjoner.

## Datakilder
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **PA0041** | Datoer knyttet til ansatte | Ingen | Hovedtabell med 24 datotype/dato-kolonnepar |
| **PA0001** | Hovedstillingsdata | medarbeidergruppe_kode != '8' (i final select) | Sekundærtabell for datointervaller, brukes til å filtrere bort perioder med MG=8 |

## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| **dato_ansettelse** | COALESCE over 24 kolonnepar: først dato_type='01' (kun HVL), deretter dato_type='VB' |

## Transformasjonslogikk

### 1. Datointervallgenerering
Kombinerer historikk fra følgende tabeller:
- **Hovedtabell:** PA0041 definerer gyldige datointervaller per ansatt
- **Sekundærtabell:** PA0001 bidrar med datogrenser fra stillingsdata
- **Nøkkelkolonner:** ansatt_nummer

### 2. Tabellkoblinger
Etter datointervallgenerering kobles følgende tabeller:
- **PA0041** (alias `t`): Left join med datooverlapp
- **PA0001** (alias `hovedstillinger`): Left join med datooverlapp

### 3. Filtrering
- Ekskluderer rader der medarbeidergruppe_kode = '8' (ekstern tilsettingstype)
- Beholder rader uten match i PA0001 (null)

### 4. Ansettelsesdato-logikk
Bruker COALESCE over betingede uttrykk for å finne første gyldige ansettelsesdato:

**HVL:**
1. Sjekker dato_type_1 til dato_type_24 for verdi '01' – returnerer tilhørende dato
2. Sjekker dato_type_1 til dato_type_24 for verdi 'VB' – returnerer tilhørende dato

**Andre institusjoner:**
1. Sjekker dato_type_1 til dato_type_24 for verdi 'VB' – returnerer tilhørende dato
31 changes: 31 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_fodselsdager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# sap_10_fodselsdager

## Formål
Genererer en liste over alle fødselsdager for hver ansatt fra 1990 til neste år. Brukes til å skape datobrudd i `sap_20_stillinger*` slik at alder beregnes korrekt i alle datointervaller.

## Datakilde
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **PA0002** | Persondata | `DISTINCT` på `ansatt_nummer` og `dato_fodt` | Grunnlagstabell med fødselsdatoer |


## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| **dato_fodselsdag** | `add_months(dato_fodt, (aar - year(dato_fodt)) * 12)` — Beregner fødselsdagen for hvert år i perioden 1990 til neste år |

## Transformasjonslogikk (PySpark)
### 1. Load source data
Laster `pa0002` fra `silver_sap`.

### 2. Create unique list of birth dates
Henter `DISTINCT` kombinasjoner av `ansatt_nummer` og `dato_fodt` fra PA0002.

### 3. Create year dimension
år fra 1990 til neste år.

### 4. Transform data
Cross join unike fødselsdatoer med årsdimensjon og beregner fødselsdagen for hvert år.

### 5. Write to target
Skriver resultatet til `transformation_hr.sap_10_fodselsdager` med `overwrite` og `overwriteSchema`.
34 changes: 34 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_fravaerstyper.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# sap_10_fravaerstyper

## Formål
Bygger en komplett oversikt over fraværstyper med tilhørende tekster, SAP-kategorier og BOTs egendefinerte kategorier/indikatorer. Brukes som oppslagstabell i fraværsanalyser.

## Datakilde
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **T554S** | Fraværstyper med historikk | Siste versjon per `fravaerstype_kode` basert på `dato_til DESC` | Grunnlagstabell |
| **T554T** | Tekster for fraværstyper | — | Tilfører `fravaerstype_navn` |
| **T5A4O** | SAP fraværskategorier | — | Tilfører `fravaerskategori_kode` og `fravaerskategori_navn` |
| **fravaerskategorier** | BOT egendefinerte kategorier | — | Tilfører hovedkategorier, underkategorier og indikatorer |

## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| Alle kategori- og indikatorkolonner | `coalesce(kilde, 'Ukjent')` — Defaulter til `Ukjent` dersom verdi mangler |
| **fravaerskategori_kode** | `coalesce(kilde, '-1')` — Defaulter til `-1` dersom verdi mangler |

## Transformasjonslogikk (PySpark)
### 1. Load source data
Laster `t554s`, `t554t`, `t5a4o` og `fravaerskategorier` fra `silver_sap`.

### 2. Get latest version of T554S
Bruker `row_number()` partisjonert på `fravaerstype_kode`, sortert på `dato_til DESC`, og filtrerer på `rn = 1`.

### 3. Join with texts from T554T
Left join med `t554t` på `fravaerstype_kode` og `zx_institusjonskode` for å hente `fravaerstype_navn`.

### 4. Create final result with categories
Left join med `t5a4o` på `fravaerskategori_kode` for SAP-kategorier, og left join med `fravaerskategorier` på `fravaerstype_kode` for BOTs egendefinerte kategorier og indikatorer.

### 5. Write to target
Skriver resultatet til `transformation_hr.sap_10_fravaerstyper` med `overwrite` og `overwriteSchema`.
118 changes: 118 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_grunnlonn_pa0001.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# sap_10_grunnlonn_pa0001

## Formål
Beregner grunnlønn knyttet til stillinger i PA0001 basert på logikk for hovedtariffperiodene. Håndterer tre perioder:
- 01.05.2020–30.04.2022
- 01.05.2022–30.04.2024
- 01.05.2024 og fremover (gjeldende)

## Datakilder
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **PA0008** | Direkte registrert lønn | Ingen | Hovedtabell som definerer lønn med tarifftype, tariffområde, tariffgruppe, lønnstrinn og beløp |
| **T510** | Satser for bl.a. lønnstrinn | Pensjonistavtaler OR (lonnart_kode='1000', tariffavtale_kode='3') | Tilfører standardiserte lønnssatser basert på tariffkombinasjon |
| **T512T** | Tekster knyttet til lønnarter | Ingen | Legger til tekst for hver lønnartkode i PA0008 |
| **YHR_PSRCL** | Stigejusteringsprosent | lonnart_kode='108A' | Legger til stigeprosent for ansiennitetsberegning |
| **T530F** | Tekst knyttet til lønnsendringsårsak | infotype_kode='0008' | Legger til tekstbeskrivelse for lønnsendring |

## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| **belop_grunnlonn** | Beregning basert på logikk knyttet til hver hovedtariffperiode |
| **endring_aarsak_lonn_kode** | Hentes fra endring_aarsak_kode i PA0008 |
| **endring_aarsak_lonn_tekst** | Hentes fra endring_aarsak_tekst i T530F |
| **lonnart** | Kombinasjon av alle 40 lønnartkoder i PA0008 med navn fra T512T, separert med komma |

## Transformasjonslogikk

### 1. Datointervallgenerering
Kombinerer historikk fra følgende tabeller:
- **Hovedtabell:** PA0008 definerer gyldige datointervaller per ansatt
- **Sekundærtabell:** T510 (med forretningsnøkler fra PA0008) bidrar med datogrenser fra lønnssatser
- **Nøkkelkolonner:** ansatt_nummer

### 2. Forretningsnøkler til sekundærtabeller
T510 mangler ansatt_nummer og må berikes før datointervallgenerering:
- Joines mot PA0008 på tarifftype, tariffområde, tariffgruppe, lønnstrinn og datooverlapp
- Returnerer ansatt_nummer + dato_fra/dato_til for bruk i combine_date_intervals

### 3. Tabellkoblinger
Etter datointervallgenerering kobles følgende tabeller:
- **PA0008**: Hovedtabell med datooverlapp
- **T510**: Lønnssatser med tariffnøkkel og datooverlapp
- **YHR_PSRCL**: Stigeprosent med tariffnøkkel og lonnart_kode='108A'
- **T530F**: Endringsårsaktekst med infotype_kode='0008'
- **T512T**: 40 koblinger for lønnarttekster

### 4. Grunnlønnsberegning per hovedtariffperiode
Beregningen av belop_grunnlonn avhenger av hvilken hovedtariffperiode intervallet faller i.

**Hjelpeuttrykk:**
- `belop_sum`: Sum av belop_1 til belop_40 fra PA0008
- `has_lonnstrinn` / `no_lonnstrinn`: Sjekker om lønnstrinn er registrert
- `stige_multiplier`: Beregner (1 + stige.prosent/100) for ansiennitetslogikk

#### Hovedtariffperiode 01.05.2020–30.04.2022
| Tarifftype | Område | Gruppe | Formel |
|------------|--------|--------|--------|
| 71 | Alle | Alle | COALESCE(satser.belop, 0) + COALESCE(belop_sum, 0) |
| 72 | Alle | Med lønnstrinn | satser.belop |
| 72 | Alle | Uten lønnstrinn | belop_sum |
| 73 | 91 | Alle | belop_sum |
| 73 | 95 | Alle | belop_sum * stige_multiplier |
| 74 | 90 | PERS | satser.belop |
| 75 | 90 | INDIVID | belop_sum * 12 |
| 75 | 90 | UARB | satser.belop |
| 75 | 90 | PENSJAVT | satser.belop * 1950 |
| 76 | AA | %HLÆ% | satser.belop |
| 76 | AA | IND% | belop_sum * 12 |

#### Hovedtariffperiode 01.05.2022–30.04.2024
| Tarifftype | Område | Gruppe | Formel |
|------------|--------|--------|--------|
| 71 | 91, 95 | Alle | COALESCE(satser.belop, 0) + COALESCE(belop_sum, 0) |
| 72 | Alle | Med lønnstrinn | satser.belop |
| 72 | Alle | Uten lønnstrinn | belop_sum |
| 73 | 91 | Alle | belop_sum |
| 73 | 95 | Alle | belop_sum * stige_multiplier |
| 74 | 90 | PERS | satser.belop |
| 75 | 90 | INDIVID | belop_sum * 12 |
| 75 | 90 | UARB | satser.belop |
| 75 | 90 | PENSJAVT | satser.belop * 1950 |
| 76 | AA | %HLÆ% | satser.belop |
| 76 | AA | IND% | belop_sum * 12 |

(samme som forrige med unntak av tarifftype 71 som er begrenset til område 91 og 95)

#### Hovedtariffperiode 01.05.2024 og fremover (gjeldende)
Samme logikk som 2022–2024.

### 5. T510 filtrering (lønnssatser)

**Pensjonistavtaler:**
- lonnart_kode = ''
- tariffavtale_kode = '1'
- tarifftype_kode = '75'
- tariffomraade_kode = '90'
- tariffgruppe_kode = 'PENSJAVT'

**Alle andre:**
- lonnart_kode = '1000'
- tariffavtale_kode = '3'
- Ikke pensjonistavtaler

**Merk:** Dersom DFØ rydder i pensjonistoppsettet, kan logikken forenkles til kun tariffavtale='3' og lonnart='1000'.

### 6. Lønnarttekster (T512T)
- 40 separate koblinger (l1-l40) for hver lonnart_kode_1 til lonnart_kode_40
- Kombineres til én kolonne med concat_ws og array_compact for å fjerne tomme verdier

## Tarifftype-forklaring
| Tarifftype | Betydning |
|------------|-----------|
| 71 | Statlig tariffavtale |
| 72 | Tariffavtale med lønnstrinn |
| 73 | Tariffavtale med ansiennitet/stigeprosent |
| 74 | Personlig avtale |
| 75 | Spesielle avtaler (individuelle, uten arbeid, pensjonister) |
| 76 | Andre avtaler (høgskolelærere, individuelle) |
72 changes: 72 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_kommunikasjonsinformasjon.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# sap_10_kommunikasjonsinformasjon

## Formål
Henter kommunikasjonsinformasjon for ansatte fra PA0105 og PA9052. Inneholder brukernavn, e-postadresser og telefonnumre (jobb og privat). Kun siste gjeldende versjon per ansatt; ingen historikk.

## Datakilder
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **PA0105** | Kommunikasjonsinformasjon | Siste rad per `kommunikasjonstype_kode` (`ROW_NUMBER` på `dato_til DESC`) | Grunnlagstabell for brukernavn, e-post og telefon |
| **PA9052** | Mobilnummer | Siste rad per `deltype_kode` (`ROW_NUMBER` på `dato_til DESC`) | Overstyrer mobilnummer registrert i PA0105 |

## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| **brukernavn_feide** | `LOWER(kommunikasjon_id_lang)` hvor `kommunikasjonstype_kode = '9020'` |
| **brukernavn_dfo** | `kommunikasjon_id` hvor `kommunikasjonstype_kode = '0001'` |
| **epost_jobb** | `LOWER(kommunikasjon_id_lang)` hvor `kommunikasjonstype_kode = '0010'` |
| **epost_privat** | `LOWER(kommunikasjon_id_lang)` hvor `kommunikasjonstype_kode = '0030'` |
| **telefon_fast_jobb** | `kommunikasjon_id_lang` hvor `kommunikasjonstype_kode = '0020'` |
| **telefon_mobil_jobb** | `COALESCE(PA9052.telefon_mobil, PA0105.kommunikasjon_id)` for jobb (PA9052 `deltype_kode = '0001'`, PA0105 `kommunikasjonstype_kode = '9003'`) |
| **telefon_mobil_privat** | `COALESCE(PA9052.telefon_mobil, PA0105.kommunikasjon_id)` for privat (PA9052 `deltype_kode = '0002'`, PA0105 `kommunikasjonstype_kode = '9004'`) |
| **telefon_mobil (PA9052)** | `CONCAT(retning_tegn, retning_nummer, telefon_nummer)` |

## Transformasjonslogikk

### 1. PA0105 – Kommunikasjonsinformasjon
- Henter all kommunikasjonsinformasjon fra PA0105
- `ROW_NUMBER()` partisjonert på `ansatt_nummer` og `kommunikasjonstype_kode`
- Sortert på `dato_til DESC` for å hente siste gjeldende rad
- Kun rader med `rn = 1` beholdes

**Kommunikasjonstyper fra PA0105**
| kommunikasjonstype_kode | Betydning | Kolonne |
|-------------------------|-----------|---------|
| 9020 | Feide-brukernavn | brukernavn_feide |
| 0001 | DFØ-brukernavn | brukernavn_dfo |
| 0010 | E-post jobb | epost_jobb |
| 0030 | E-post privat | epost_privat |
| 0020 | Fasttelefon jobb | telefon_fast_jobb |
| 9003 | Mobil jobb (fallback) | telefon_mobil_jobb |
| 9004 | Mobil privat (fallback) | telefon_mobil_privat |

### 2. PA9052 – Mobilnummer (overstyrt)
- Henter mobilnummer fra PA9052
- `ROW_NUMBER()` partisjonert på `ansatt_nummer` og `deltype_kode`
- Sortert på `dato_til DESC`
- Bygger komplett nummer: `CONCAT(retning_tegn, retning_nummer, telefon_nummer)`
- Kun rader med `rn = 1` beholdes

**Deltyper fra PA9052**
| deltype_kode | Betydning | Kolonne |
|--------------|-----------|---------|
| 0001 | Mobil jobb | telefon_mobil_jobb |
| 0002 | Mobil privat | telefon_mobil_privat |

### 3. Prioritering av mobilnummer
- PA9052 prioriteres over PA0105
- `COALESCE(PA9052.telefon_mobil, PA0105.kommunikasjon_id)`
- Hvis PA9052 har verdi → bruk denne
- Ellers → bruk PA0105-fallback

### 4. Pivot-struktur med LEFT JOIN
- Starter med alle unike ansatte fra PA0105
- LEFT JOIN mot PA0105 én gang per kommunikasjonstype (7 ganger)
- LEFT JOIN mot PA9052 to ganger (jobb og privat mobil)
- Filtrerer på `rn = 1` i alle join-operasjoner
- `SELECT DISTINCT` sikrer én rad per ansatt

### 5. Ingen datointervaller
- Tabellen er punkt-i-tid (ingen `dato_fra` / `dato_til`)
- Kun siste gjeldende kommunikasjonsinformasjon per ansatt
- Direkte SELECT med flere LEFT JOIN
41 changes: 41 additions & 0 deletions docs/ap/hr/transformasjoner/sap_10_kontering_overstyrt_pa0509.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# sap_10_kontering_overstyrt_pa0509

## Formål
Henter overstyrt kontering for tilleggsstillinger basert på ASSHR og ASSOB. Brukes når det er satt overstyrt kontering (infotype 0509) i SAP.

## Datakilder
| Tabell | Formål | Filtre | Rolle |
|--------|--------|--------|-------|
| **ASSHR** | HR-tilordninger | `infotype_kode = '0509'` | Grunnlagstabell med datointervaller for overstyrt kontering |
| **ASSOB** | Konteringsobjekter | Ingen | Beriker med koststed, delprosjekt og arbeidspakke/bygg |

## Kalkulerte kolonner
| Kolonne | Formel / Logikk |
|---------|-----------------|
| **prosent_kontering** | `lit(1).cast("decimal(5,2)")` — settes til 1 (100%) siden ASSHR/ASSOB ikke har delt kontering |

## Transformasjonslogikk (PySpark)

### 1. Load source data
Laster `asshr` fra `silver_sap` filtrert på `infotype_kode = '0509'` og `assob`.

### 2. Join ASSHR med ASSOB
Joiner ASSHR med ASSOB på:
- `ansatt_nummer`
- `pd_sekvens_nummer`

Henter konteringsinformasjon:
- `koststed_kode`
- `delprosjekt_nummer`
- `arbeidspakke_bygg_nummer`

### 3. Select final columns
Filtrerer ut rader hvor `pd_sekvens_nummer` er NULL og velger:
- `ansatt_nummer`
- `dato_fra`, `dato_til`
- `koststed_kode`, `delprosjekt_nummer`, `arbeidspakke_bygg_nummer`
- `prosent_kontering` (hardkodet til 1)
- Metadata-kolonner (`zx_*`)

### 4. Write to target
Skriver resultatet til `transformation_hr.sap_10_kontering_overstyrt_pa0509` med `overwrite` og `overwriteSchema`.
Loading
Loading