Ferieaflos

# 🏖️ Guide: Feriegodkendelse i Keybalance BS

## Hvad er feriegodkendelse?

Når en godkender er fraværende (ferie, sygdom, andet), skal systemet
automatisk finde en anden person der kan godkende bilag i deres sted.
Dette håndteres af **BS_Bilag_GodkAflosBestem**-tasken, som gennemgår
en prioriteret kæde af mulige afløsere.

---

## 📋 Forudsætninger

Før feriegodkendelse kan fungere, skal følgende være sat op:

### 1. Ferieafløser-tabel (`BS_Bilag_GodkAflos`)
Hver godkender kan have én eller flere afløsere registreret med:

| Felt | Beskrivelse |
|------|-------------|
| `Godkender` | Den fraværende godkenders initialer |
| `NyGodkender` | Afløserens initialer |
| `NyGodkenderArt` | Type af afløser (0 = normal medarbejder) |
| `StartDato` | Første dag afløsningen gælder |
| `SlutDato` | Sidste dag afløsningen gælder |
| `Tekst` | Beskrivelse / note om afløsningen |

### 2. Medarbejder-tabel (`Medarbejder`)
Hver medarbejder kan have en **baggodkender** sat op via feltet:

| Felt | Beskrivelse |
|------|-------------|
| `GodkendAf` | Initialer på den der normalt godkender denne persons bilag |

---

## 🔄 Sådan fungerer kæden trin for trin

Systemet forsøger at finde en gyldig godkender i følgende prioriterede
rækkefølge. Så snart en gyldig godkender findes, stoppes søgningen.

---

### Trin 1 — Hent den registrerede ferieafløser

Systemet slår op i `BS_Bilag_GodkAflos` og finder den afløser
(`NyGodkender`) der er registreret for den fraværende godkender.
Godkender (fraværende) → NyGodkender (afløser fra tabel)
**Regler:**
- Afløseren skal have en gyldig post i tabellen
- `StartDato` skal være ≤ dags dato
- `SlutDato` skal være ≥ dags dato

---

### Trin 2 — Tjek om afløseren selv er fraværende (`TjekNyGodk`)

Inden afløseren accepteres, tjekkes det om **afløseren selv** har en
aktiv ferieregistrering i `BS_Bilag_GodkAflos`.
NyGodkender → har de selv en aktiv ferie-post? → JA: nulstil afløser
**Regler:**
- Hvis afløseren også er fraværende i dag → afløseren afvises (`$NyGodk = ""`)
- Teksten opdateres med en note om at afløseren selv er fraværende

---

### Trin 3 — Tjek om afløseren allerede har godkendt (`TjekAnsvar`)

Systemet tjekker i `BS_Bilag_Godkend` om den fundne afløser allerede
har godkendt det pågældende bilag.
NyGodkender → har de allerede godkendt dette bilag? → JA: nulstil afløser
**Regler:**
- Status skal være `Godkendt`, `SysGodkendt` eller `DelGodkendt`
- `GodkendtDato` skal være udfyldt
- Hvis ja → afløseren afvises (`$NyGodk = ""`)

---

### Trin 4 — Forsøg med afløserens baggodkender (1. niveau)

Hvis afløseren fra trin 1-3 ikke kunne bruges, forsøger systemet at
finde **afløserens egen baggodkender** via `Medarbejder.GodkendAf`.
NyGodkender (afvist) → Medarbejder.GodkendAf → ny kandidat
**Regler:**
- Slår op på den *originale* godkenders (`BSGODAF.Godkender`) baggodkender
- Teksten opdateres: *"Forsøger opr. godkenders baggodkender"*
- Kandidaten sendes igen igennem Trin 2 og Trin 3

---

### Trin 5 — Forsøg med ferieafløserens baggodkender (2. niveau)

Hvis trin 4 heller ikke gav en gyldig godkender, forsøger systemet
**ferieafløserens** (`#NyGodkender`) baggodkender.
NyGodkender (original afløser) → Medarbejder.GodkendAf → ny kandidat
**Regler:**
- Slår op på den registrerede afløsers baggodkender
- Teksten opdateres: *"Forsøger ferieafløsers baggodkender"*
- Kandidaten sendes igen igennem Trin 2 og Trin 3

---

### Trin 6 — Fallback: Tilbage til den oprindelige godkender

Hvis **ingen** af ovenstående trin gav en gyldig afløser, falder
systemet tilbage til den **oprindelige fraværende godkender**.
Alle afløsere afvist → tilbage til BSGODAF.Godkender
**Regler:**
- `#NyGodkender` sættes til den originale godkenders initialer
- `#FallBack` sættes til `true` (signal til kaldende task)
- Teksten sættes til:
  *"OutOfOffice -> fallback til oprindelig (ingen kunne håndtere)"*

> ⚠️ **Bemærk:** Fallback betyder at bilaget stadig kræver godkendelse
> — det er blot sendt tilbage til den person der egentlig er fraværende.
> Det er op til den kaldende proces at håndtere dette scenarie.

---

## 📊 Flowdiagram
Start: Hent afløser fra BS_Bilag_GodkAflos │ ▼ Er afløser fundet? ├─ NEJ ──────────────────────────────────────────┐ └─ JA │ │ │ ▼ │ Er afløser selv fraværende? (TjekNyGodk) │ ├─ JA: afvis afløser │ └─ NEJ │ │ │ ▼ │ Har afløser allerede godkendt? (TjekAnsvar) │ ├─ JA: afvis afløser │ └─ NEJ → ✅ Brug denne afløser │ │ Ingen afløser fundet endnu? │ │ │ ▼ │ Forsøg opr. godkenders baggodkender │ → TjekNyGodk + TjekAnsvar │ └─ Fundet → ✅ Brug denne │ │ Stadig ingen? │ │ │ ▼ │ Forsøg ferieafløserens baggodkender │ → TjekNyGodk + TjekAnsvar │ └─ Fundet → ✅ Brug denne │ │ Stadig ingen? ◄──────────────────────────────────┘ │ ▼ ⚠️ FALLBACK: Tilbage til original godkender (#FallBack = true)
---

## 📤 Output-parametre

Når tasken er færdig, returneres følgende parametre til den kaldende
process:

| Parameter | Type | Beskrivelse |
|-----------|------|-------------|
| `#NyGodkender` | String | Initialer på den valgte godkender |
| `#NyGodkenderArt` | UShort | Type af godkender (0 = normal) |
| `#Tekst` | String | Log over hvad systemet forsøgte |
| `#FallBack` | Bool | `true` hvis ingen afløser kunne findes |

---

## ⚙️ Konfigurationstips

### Sådan registrerer du en ferieafløser

1. Gå til tabellen **BS_Bilag_GodkAflos**
2. Opret en ny post med:
   - `Godkender` = den fraværendes initialer
   - `NyGodkender` = afløserens initialer
   - `StartDato` = første feriedag
   - `SlutDato` = sidste feriedag
3. Gem posten

### Sådan sætter du en baggodkender op

1. Gå til **Medarbejder**-stamkortet
2. Find den relevante medarbejder
3. Udfyld feltet `GodkendAf` med initialer på baggodkenderen
4. Gem

---

## ❓ Ofte stillede spørgsmål

**Q: Hvad sker der hvis afløseren også er på ferie?**
> Systemet opdager dette automatisk og forsøger næste niveau i kæden.

**Q: Kan der være cirkulære referencer? (A → B → A)**
> Den nuværende implementation beskytter ikke eksplicit mod cirkulære
> kæder. Sørg for at baggodkendere ikke peger tilbage på hinanden.

**Q: Hvad betyder `#FallBack = true`?**
> Det betyder at systemet ikke fandt nogen tilgængelig afløser, og
> bilaget er tildelt den originale (fraværende) godkender. Den kaldende
> process bør håndtere dette — f.eks. ved at sende en advarsel.

**Q: Hvad er `NyGodkenderArt`?**
> Det er en klassifikation af godkendertypen. Værdien `0` bruges som
> signal om at søgningen stadig er i gang. En anden værdi betyder at
> godkenderen er af en særlig type (f.eks. systemgodkender), og
> søgningen stoppes.

---

*Sidst opdateret: baseret på BS_Bilag_GodkAflosBestem task-kode*