KeyBalance Opdateringer

Genereret: 2026-06-23 15:44:00

Beskrivelse
#1073 - små rettelser (23-06-26 15:43)
#1054 - Options = [ SearchServerSide ] (18-06-26 09:27)
Options = [ SearchServerSide ]
#884 - Betalingsid sættes på BS Kassekladde (18-06-26 08:13)
Betalingsid sættes på BS Kassekladde
#1052 - Rettelser ved PTD Opgradering (18-06-26 08:12)
#1053 - Rettelser til Flexpos (18-06-26 08:08)
#1017 - BS-bilag håndtering i finansposteringer (17-06-26 06:55)

Hvad er aendret

  • Nuværende BS kan tilføjes eksisterende poster.
  • Poster uden BS er synlige i en liste hvorpå der kan droppes filer. Samme er slået fra på den almindelige fiananspost - det er lidt for nemt at fejle i.
  • BankAfstemningsstatus vises i finanspost
  • Statistik er flyttet til ØKONOMI i menu. Skal måske også være en del af dem i køb og salg??
  • Kreditor er tilføjet økonomi i menu

Nye formularer (3 nye filer)
  • **FPOST_EjBS** - Viser finansposter UDEN BS-bilag. Arver drag-and-drop funktionaliteten fra FPOST, saa man kan droppe filer direkte paa poster der mangler bilag.
  • **FPostDetaljer_TilFoejBS** - Detaljevisning af en finanspost med liste over eksisterende (ikke-arkiverede) BS-bilag, saa man kan vaelge og tilknytte et bilag til posten.
  • **FP_VlgBilag** - Batch-task der tilknytter et valgt BS-bilag til en finanspost og opdaterer alle relaterede tabeller (Finanspost, Debitorpost, Kreditorpost, Maskinpost, Varepost, SagsFPost, Anlaegspost).

Finanspost.PTD - 2 nye virtuelle felter
  • BS_FilnavnAbs - opslaar filnavnet paa BS-bilaget via BSNummer
  • BankPostAfstemt - viser AFSTEMT / IKKE afstemt / UKENDT baseret paa FinPostAfstem

FPOST.PTD - omstrukturering
  • Drag-and-drop (OnDrop + Link til BS_Bilag_DokDrop) fjernet herfra og flyttet til FPOST_EjBS, der er dedikeret til poster uden bilag
  • Ny kolonne: BankPostAfstemt
  • Nye popupmenu-valg: Transaktioner, +Bilag (IKKE BS), +Ekstra (HAR BS), +Hovedbilag (HAR BS)
  • Bedre fejlbeskeder i CanExecute - skelner nu tydeligt mellem har BS og har ikke BS
  • Ny dialog-niveau action Uden BS der aabner FPOST_EjBS

FINANSKONTO.PTD
  • Ny action Uden BS paa finanskonto-billedet

FPostDetaljer.PTD
  • Tilfojet BS Bilag groupbox med billedvisning af det tilknyttede bilag

MainMenu_Ribbon.PTD
  • Debitor- og Kreditor-dialoggenveje tilfojet i menuen
  • Statistik-undermenu tilfojet/omorganiseret under Kreditor-menuen (items fjernet fra gammelt sted)

---

Kritisk vurdering


Ingen kritiske fejl identificeret - men bemaerk foelgende:

**POTENTIELT PROBLEM - bor verificeres:**
I FPOST.PTD er baade Access = [ Read ] og TaskMode = Update fjernet fra task-definitionen. Tidligere aabnede formularen eksplicit i read-only mode. Den nye adfaerd afhaenger af systemets default - bor verificeres at formularen IKKE aabner i ufrivillig redigeringstilstand, saa brugere utilsigtet kan aendre finansposter.

**Lavrisiko - kraever test:**
Statistik-menuen i MainMenu er omstruktureret - visse items er fjernet fra eet sted og tilfojet under ny Statistik-undermenu i Kreditor-sektionen. Funktionelt ingen aendring, men kraever test af at alle statistik-menupunkter stadig er tilgaengelige for brugerne.

**Ingen datarisiko:**
Alle nye tasks bruger NoOKBox/NoTriggers korrekt. FP_VlgBilag saetter BSNummer paa alle relevante poster via CanEnter(!*.BSNummer) - opdaterer altsaa kun poster der ikke allerede har et BSNummer, saa der ikke sker utilsigtet overskrivning.

#999 - Mest MIB, men også lidt rykker, samt automatisk styring af Vare.NÆSTE Købspris fra Vare.Sidsteindkøb (17-06-26 06:28)

Ændringer

  • Mest MIB hjem. Kan stadig forbedres.
  • Mails omkring Tomme finansposter
  • Løsning på NÆSTE Købspris

**MIB – Mobile/Internet Banking (samlebetaling)**
  • Udvidet `KBetForHistSamle` og `KBETALFORBETAL` med fuld understøttelse af samlebetalinger
  • Ny task `Bank_MIB_KBetOpretSamle` til oprettelse af samlede betalinger via MIB
  • Ny task `Bank_MIB_KBetStatusSamle` til statusopfølgning på samlede betalinger
  • Ny task `Bank_MIB_ConsentForny` til fornyelse af MIB-samtykke
  • Ny task `Bank_MIB_Nulstil` til nulstilling af MIB-aftaler
  • Tilpasninger i `Bank_MIB_Aftaler` og `Bank_MIB_KBetOpret`

**Rykker – forbedret fejlhåndtering**
  • Forbedret fejlcheck i `UDSKRIVRYKKER` og `UDSKRIVRYKKER_HTMLMail`
  • Bedre rykker-opsætning via autoforms i `Forms_DAN`

**Info-mails – finanskontrol**
  • Ny `MailF_FPostUD` til notifikation om finansposter uden dato
  • Ny `MailF_FinBalanceDiff` til notifikation om finansbalance-afvigelser

**Vare – Næste kostpris**
  • Ny feature: Vare.Næste Kostpris foreslås automatisk ud fra seneste indkøbspris
  • Konfiguration via `FSetup` og felt på `Vare`

#1029 - VIGTIG - Fix af fiananspost OnCreate (16-06-26 12:14)
VIGTIG - Fix af fiananspost OnCreate
+ Deb+Kreditor

+ Fakturanummerserier er nu rent virtuel så flyttede ordrer får nummerserie fra SKP ved fakturering ikke ved oprettelse. Potentiel ulempe - skift i nummerserier etc (navnet) rammer også ordre som ER oprettet
#1018 - Tmp planner (14-06-26 20:14)
Tmp planner
#932 - Merge 20260531Div to master (11-06-26 07:03)

Oversigt


Denne PR samler en række forbedringer og rettelser på tværs af ordrehåndtering, formularkort, kassekladde, fakturering og app-funktionalitet.

---

Features


**Kontrol af fakturaemail ved afslut ordre**
Der er indført validering af fakturaemail, når en ordre afsluttes. Sikrer at fakturaen kan afsendes til en gyldig adresse inden ordren lukkes.

**Forbedret formularkort**
`FormsKort.PTD` er omskrevet og forbedret markant. `FormsKort_v2.PTD` er udgået og konsolideret ind i den primære implementation.

**Forbedret dashboard-elementer for uafsluttede formularer**
Dashboard-visningerne `DASH_FormularerUA` og `DASH_FormularerUAE` er opdateret med forbedret præsentation af uafsluttede formularer.

**Nyt password-funktion har nu altid mailen med**
Password-nulstillingsprocessen inkluderer nu altid brugerens email i flowet, så det ikke er muligt at glemme at angive den.

**APP – Angiv lokation ved tilføj vare / bedre kontrol på lokation på ordreline**
I app-visningen er der tilføjet mulighed for at angive lokation ved tilføjelse af vare til en ordre. Der er desuden indført bedre kontrol på, at lokation er korrekt udfyldt på ordrelinjer.

---

Fixes


**Debitor.Ref overstyres ikke længere ved oprettelse af salgsordre**
`SOrdre.Ref` sættes nu kun, hvis den aktivt angives af brugeren. Tidligere blev debitorens reference utilsigtet overskrevet. Ved oprettelse af ordre fra debitor vises `Debitor.Ref` nu korrekt.

**CVR – OIOUBL afsendes nu korrekt**
Rettet fejl hvor CVR-nummeret ikke blev medsendt korrekt i OIOUBL-fakturaer.

**IFakturaJournal summerede ikke Netto korrekt**
Fakturajournalen summerer nu Netto korrekt på tværs af fakturalinjer.

**KasseKladdelinje – Antal omdøbt**
Feltet "antal" i KasseKladdelinje er omdøbt for at undgå tvetydighed i visning og logik.

#986 - Licens opstramning og DASH formular forbedringer (11-06-26 06:24)

Opsummering

#919 - Dublet i .Retur både i TASK og i trigger (08-06-26 19:02)
TASKCALL {
TaskRef = SBETALING_FAKTURER
...
}
TASK BogførbetalingerPerType
if SOBetaling.BetalingsType == "Kontant" then SFBetaling.Beløb = SFBetaling.Beløb - SFBetHead.Retur;

Derfor er SF Beløb allerede fratrukket retur beløbet ved kontant.
Og skal vel ikke fratrække igen i TRIGGER BetalFPOST {

if SFBetaling.BetalingsType == "Kontant" then
FinP.Netto = SFBetaling.Beløb - SOBetHead.Retur
else

}
#955 - BOOKING (08-06-26 18:39)
1. Booking på APP er lavet, det meste er helt nyt
2. Planner, åbner en temp fil ved dobbeltklik for at undgå ordre oprettes uden kundenr. mv
3. To udskrifter til sag.

Alt er næsten nyt og burde ikke påvirke eksisterende kode
#740 - Drop redundant strformat wrappers from TitleExpr / OkMsg / DialogMsg (01-06-26 21:52)

Summary


Mechanical rewrite of 1720 call sites across 795 files:

```
TitleExpr( strformat("..."; args) ) → TitleExpr( "..."; args )
okmsg( strformat("..."; args) ) → okmsg( "..."; args )
dialogmsg( strformat("..."; args) ) → dialogmsg( "..."; args )
```

Keybalance2018 [PR 737](https://dev.azure.com/KeyBalance/KeyBalance/_git/Keybalance2018/pullrequest/737) gave these three keywords an implicit-strformat inline form. Keybalance2018 [PR 739](https://dev.azure.com/KeyBalance/KeyBalance/_git/Keybalance2018/pullrequest/739) widened the OkMsg/DialogMsg placeholder detection to match `strformat` exactly (`#1`..`#9` plus `{1}`..`{N}`), making this conversion behavior-preserving for every placeholder syntax we use in this repo.

Files


  • 795 `.PTD` / `.ptd` files modified, 1720 lines changed (1720 +, 1720 −).
  • Includes 73 multi-line strformat calls whose template strings contain embedded newlines — handled with balanced-paren matching across line boundaries; embedded newlines, indentation and Danish characters are preserved byte-for-byte.
  • File encodings preserved: UTF-8 files stay UTF-8, ISO-8859 files stay ISO-8859 (the converter operates at byte level via the lossless Latin-1 codepage 28591 round-trip).
  • No grammar change, no schema change — purely call-site cleanup.

Test plan


  • [ ] After Keybalance2018 PR 739 merges, smoke-test a few converted tasks:
  • [ ] `VAREKORT` — TitleExpr renders correctly with `#1 #2` substitutions
  • [ ] `BankPost_Saldi` — TitleExpr renders correctly with `{1}` curly-brace substitution
  • [ ] An okmsg with `{1}` syntax (e.g. `VGENBESTILDAN`) — message includes the substituted value (previously the arg would have been consumed as timeout under PR 737's narrower #1..#9 rule)
  • [ ] An okmsg with explicit numeric timeout via `okmsg(strformat("..."; args); 5)` form — verify those call sites (now `okmsg("..."; args; 5)`) still auto-close after 5s
  • [ ] Verify no parser errors on full PTD reload

Related


  • Depends on: Keybalance2018 [PR 739](https://dev.azure.com/KeyBalance/KeyBalance/_git/Keybalance2018/pullrequest/739) (must merge first)
  • Follow-on to: Keybalance2018 [PR 737](https://dev.azure.com/KeyBalance/KeyBalance/_git/Keybalance2018/pullrequest/737)
#908 - Lev Stdvaregruppe styrring til skyggen (01-06-26 20:36)
Lev Stdvaregruppe styrring til skyggen
#770 - WEB_API_TokenGrp: AuthMode + DefaultUser for Entra ID on APIv3 (29-05-26 14:56)

Summary


Companion PTD changes for Keybalance2018 PR #763, which adds Microsoft Entra ID authentication to APIv3 endpoints. Defines the two new columns the server code reads.

New fields on `FILE/WEB_API_TokenGrp.PTD`


**`AuthMode`** — `BChList` choice list controlling how APIv3 calls in this group are authenticated:

| Value | Label | Behavior |
|---|---|---|
| 1 | `Statisk` (default) | Traditional API token only — backward compatible |
| 2 | `EntraID` | Microsoft Entra JWT in `Authorization` header (identity only, no Bruger lookup) |
| 3 | `Enten` | Either static token or Entra JWT accepted |
| 4 | `Begge` | Static token in `Authorization` + JWT in `X-KB-User-Token`; both must validate |

Initialised to `1` so all existing groups keep static-only behavior on upgrade.

**`DefaultUser`** — `BString(10)` that the PTD `user()` function returns when only a JWT is presented (no static token bound to a Bruger). If left blank, `user()` returns the empty string. The Entra UPN is always available via `webuser()`.

`CanEnter`/`Show` only enable `DefaultUser` for `EntraID` and `Enten` modes — it's not meaningful for `Statisk` (no JWT) or `Begge` (static token always present).

Admin dialog `TASK/WEB_API_TokenGrpKort.PTD`


Both new fields rendered in the existing "TokenSæt - TokenGruppe" group box. Dialog height bumped from 280 → 340 to fit the two extra rows.

Notes


  • `WEB_API_Token` already has `Login` and `TokenType` columns — the server PR just starts using them, no PTD change needed there.
  • Field patterns mirror established conventions: `BChList` mirrors `WEB_API_Token.TokenType`, `DefaultUser` mirrors the Bruger.Initial style from `Printers.PTD`, `Init( 1 )` mirrors `LagerSetup.PTD`.

Test plan


  • [ ] After deploying alongside Keybalance2018 PR #763, open `WEB_API_TokenGrpKort` and verify the AuthMode dropdown lists all four modes and `DefaultUser` shows/hides per mode.
  • [ ] Existing token groups continue to work with `AuthMode=Statisk` (default).
  • [ ] Setting `AuthMode=EntraID` + `DefaultUser=SUPER` and calling APIv3 with a valid JWT → PTD `user()` returns `SUPER`, `webuser()` returns the JWT UPN.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
#859 - Forkortet for lange navne (29-05-26 13:31)
Forkortet for lange navne
Bedxre displayheight
Ikke update , unødvendigt
DriftTimerNu på faktura
#886 - Tilpasninger af moms, momskort, faktura, fakturakladde og ordrebekræftelse (29-05-26 13:30)
#768 - Forlæng Summering 50 ->200 (29-05-26 13:27)
Forlæng Summering 50 ->200
Varepost - lager bogføring - MPS++
KN rabat
Vare i POrdreKort
#885 - Merge 20260527Div to master (29-05-26 10:44)
#827 - Merge 20260512-DivOpd to master (29-05-26 09:18)
#825 - DragDrop Nyt (21-05-26 12:30)
DragDrop Nyt
#837 - Forbedring af performance (21-05-26 08:09)
#818 - Planner for bedre test af ny app (17-05-26 12:43)
Planner for bedre test af ny app
#693 - Fejlrettelser (11-05-26 16:14)
#735 - OIO indlæsning af ekstra bilag (11-05-26 16:13)
Fixet overskrivning af dokumenter og dubletter ved indlæsning af flere ekstra bilag
#741 - BankSaldo - Peppol i BS - Debitorkontoudtog samlet (11-05-26 16:13)
  • BS understøtter nu Peppol i modtages. Fortolkes først som OIOUBL og så PEPPOL hvis den ikke kan fanges direkte
  • Debitorkontoudtog blev ikke mailet hvis debitor.SendEFak - Fixet
  • Bedre saldo overblik i bankafstemning

#683 - Smårettelser vareskygge (07-05-26 21:23)
Smårettelser vareskygge
#688 - OIOUBL - og bedre bogføring as MPS og VareRegulering (07-05-26 21:22)
OIOUBL - sætter BaseQuantity hvis > 1, understøtter dermed pris pr. 1000 og lignende.
Netto/Antal er tilsvarende ganget op.

Varepost, forbedret MPS bogføring, det var helt blevet væk.
#689 - SamleFaktura understøtter nu Kost og Salgspris mængde (07-05-26 21:21)
SamleFaktura understøtter nu Kost og Salgspris mængde
#704 - Convert + concat in TitleExpr/okmsg/dialogmsg to strformat (04-05-26 16:33)

Summary

  • Mechanical refactor across **818 PTD files** (**1724 chains**): replaces `"a " + var + " b"` patterns with `strformat("a #1 b"; var)` inside the direct arguments of `TitleExpr(...)`, `okmsg(...)` and `dialogmsg(...)`.
  • Concat inside nested helper calls (`getjsontag`, `string`, `char`, ...) is left as plain `+`.
  • Multi-line strings and multi-line concat chains preserved.
  • PTD flow keywords (`if`/`then`/`else`/`return`/`returnerror`/`repeat`/`until`) act as expression boundaries so chains never cross statement structure.

Files

  • 818 `.PTD` / `.ptd` files under `TASK/`, `EXTRA_PTD/TASK/` and other PTD directories.
  • No grammar, tooling, or non-PTD files touched.

How it was generated

Via `scripts/ptd_strformat.cs` in the Keybalance2018 repo (file-based C# program, no NuGet deps). The script tokenizes PTD with awareness of `"..."` strings (no escapes, may span lines), `//` line comments, `/* */` block comments, and the seven PTD flow keywords. It only touches `+` chains whose immediately-enclosing `(` belongs to one of `TitleExpr` / `okmsg` / `dialogmsg`.

Test plan

  • [ ] Spot-check a few converted files visually (e.g. `TASK/BankPost_AfstemListB.PTD`, `TASK/CRM_NyhedsmailSendProd.PTD`).
  • [ ] Build a KBA and verify a dialog with a converted `TitleExpr` renders the title correctly.
  • [ ] Trigger a path that calls `okmsg` with previously concatenated strings and confirm the message text is unchanged.
  • [ ] Run the PTD parser tests (`dotnet test Tools/PTD/KB.PTD.Parser.Tests/KB.PTD.Parser.Tests.csproj`) against the changed files if relevant.

#676 - Bedre Bogføring - MPS - Varepost->FinansLager (30-04-26 08:19)
Bedre Bogføring - MPS - Varepost->FinansLager
#682 - Diverse rettelser fundet ved PTD opgradering (30-04-26 08:19)
Diverse rettelser fundet ved PTD opgradering
#680 - Ret hvis der findes en OVLotNr (30-04-26 07:54)
Ret hvis der findes en OVLotNr
#672 - Modules tilgængelig i menu og forbedre vare-genbestilling (27-04-26 06:08)
Modules tilgængelig i menu
Forbedret vare-genbestilling - med debug
Privatadresse væk fra medarbjder
#670 - Div fix. BS Vare skal kører hvis der ER linjer :-) (23-04-26 15:31)
Div fix. BS Vare skal kører hvis der ER linjer :-)
#668 - Småting (21-04-26 14:19)
BSSordre_Opret - OrdreType først (JensenSales)
Slette trigger BankPostA_Udlign - forkert scope
Office365 - Graph get mail

#671 - autofilter og arkiv (21-04-26 11:29)
autofilter og arkiv
#669 - Ret til at køre serverside (20-04-26 16:00)
Ret til at køre serverside
#667 - Strålfors Connect - Klar (19-04-26 20:05)
Strålfors Connect Klar til brug
Unødvendigt kopier til lokal, men kørende
#666 - Fixup (17-04-26 08:32)
Fixup
#658 - ajourføring prisfiler (16-04-26 20:25)
ajourføring prisfiler
#665 - Bedre kontrol med Spærrede finanskonti etc. (16-04-26 20:24)
  • Overskrift, sum og spærrede konti = Stop
  • Bedre kontrol fra FSetup
  • Hvis spærret konto, eller ikke eksisternde i Finanspost >> Fejlkonti
  • Dimension på periodisering
#660 - OIOUBL support til ekstra bilag fra dokumentbibliotek (14-04-26 14:05)
OIOUBL support til ekstra bilag fra dokumentbibliotek
#659 - Mere infotekst på faktureringskørslen (14-04-26 05:42)
Mere infotekst på faktureringskørslen
#657 - start på afstemning mindre maskinforbedringer - HCP skal have ny mappe (13-04-26 07:41)
start på afstemning mindre maskinforbedringer - HCP skal have ny mappe
#652 - Oprydning i Transport system. (13-04-26 05:48)
Oprydning i Transport system.
Slettet et par døde integrationer, fx Winedi
DACHSER API opsat som ny type
#645 - serviceops debitor (07-04-26 07:26)
serviceops debitor
#640 - Maskinsalg FKeyName, (06-04-26 10:02)
FKeyName: Maskinfelter: Fabrikat, maskinposttype, status --> I Maskine, maskinposttype, ifakturalinje, iordrelinje, fakturalinjer, fakturaer mv.

Gennemgået og testet efterregulering (forhåbentlig med alle senarier), den burde ikke kunne løbe løbsk mere og aldrig bogfører tilbage i tid.

Opret salg, tilbud, indkøb, arb.kort, fra maskinen

Bogfør maskiner (egne biler) fra kassekladde --> Gardian, kan opsættes på mgruppe, men ellers følger det almindelige regler.
#641 - Service (06-04-26 09:50)
Serviceplanner, opsætning og miljøtillæg og hjælpematerialer