Flyt: Lasting → levering → avstemming¶
Denne siden beskriver hvordan bilens beholdning føres i Visma Business — fra
lasting på depot, via levering hos kunde, til avviksnullstilling — helt ned til
tabell- og feltnivå. All beholdningsføring skjer som transaksjonsrader i
Visma-tabellen FreeInf2; bilens beholdning er til enhver tid summen av disse.
Hovedflyt¶
flowchart TD
A[Sjåfør registrerer LAGRE LASTING<br/>liter + temperatur + depot] --> B[Omregning til standardliter]
B --> C[FreeInf2: Gr = 10<br/>+ std.liter på bilen]
D[Sjåfør ferdigmelder ordre] --> E[Omregning til standardliter]
E --> F[FreeInf2: Gr = 20<br/>− std.liter fra bilen]
G[Lossing til automat / lagertank /<br/>annen bil — Egne tanker] --> H[To transaksjoner:<br/>− fra kilde, + til mål]
C --> I[Bilens beholdning<br/>= sum av Val1 per bil og produkt]
F --> I
H --> I
I --> J{Dagen slutt:<br/>DIFF ≠ 0?}
J -- Ja --> K[NULLSTILL AVVIK<br/>FreeInf2: InfCatNo = 90]
J -- Nei --> L[Beholdning avstemt]
K --> L
classDef sjafor fill:#cfe2ff,stroke:#3b6db5
classDef system fill:#f8d7da,stroke:#b53b46
class A,D,G,K sjafor
class B,C,E,F,H,I,L system
Blått = sjåfør, rødt = automatikk i systemet.
Transaksjonstyper¶
Hver rad i FreeInf2 klassifiseres med gruppe (InfCatNo) og type (Gr):
InfCatNo (gruppe) |
Betydning |
|---|---|
10 |
Beholdningsendring |
90 |
Avviksnullstilling |
Gr (type) |
Hendelse | Fortegn på mengde |
|---|---|---|
10 |
Lasting på depot | + |
11 |
Lasting fra lagertank til bil | + |
12 |
Lasting fra annen bil | + |
20 |
Levering på ordre | − |
21 |
Lossing til automat (autogass) | − |
22 |
Lossing til lagertank | − |
23 |
Lossing til bil | − |
90 |
Avvik/nullstilling | ± |
Fortegnsregelen håndheves i koden: typene 20–29 tvinges negative, lasting på
depot og avvik beholder fortegnet sitt, alle andre tvinges positive.
Operasjonene i Egne tanker (lossing til automat/lagertank, lasting fra lagertank, overføring bil-til-bil) skriver alltid to transaksjoner — én negativ fra kilden og én positiv til målet — slik at totalbeholdningen er uendret.
Omregning til standardliter¶
Alle mengder føres i standardliter (15 °C) i Val1, med faktisk volum og
temperatur ved siden av:
- Produktets beregningsgruppe hentes fra produkttabellen (
Prod). - Faktoren slås opp i Vol2Std-faktortabellen på (gruppe, temperatur). Temperaturen rundes til én desimal; mangler temperatur brukes bilens registrerte lastetemperatur for dagen.
standardliter = round(faktisk volum × faktor, 0).
Per bil styrer flagget «konverter til standardliter» om omregningen gjøres.
Innstillingen Volume2Standard per selskap (Web.config) styrer hva appen viser.
Samspill mellom bruker og system¶
sequenceDiagram
autonumber
actor S as Sjåfør
participant App as Connect-app
participant API as Connect API
participant V as jhlVismaAPI
participant DB as Visma Business DB
S->>App: LAGRE LASTING (liter, temp, depot)
App->>API: POST /User/SaveTransactions<br/>(InventoryList, LoadingTemp, StdLitre, DepotNo)
API->>V: CalculateVol2Std per produkt
V->>DB: SELECT faktor (produktgruppe, temp)
DB-->>V: faktor
API->>V: Inventory.AddTransaction(transaksjoner)
V->>DB: IF NOT EXISTS(...) INSERT INTO FreeInf2<br/>(InfCatNo=10, Gr=10, Val1=+std.liter, R9=bil, R11=depot)
DB-->>V: PK (eller −1 ved duplikat)
V-->>API: OK
API-->>App: 200 OK
App-->>S: Lasting registrert
Note over S,DB: Senere samme dag
S->>App: NULLSTILL AVVIK (+ kommentar)
App->>API: POST /User/SaveDeviations
API->>API: Kontroller avvik mot selskapets grense
alt Avvik innenfor grensen
API->>V: Inventory.AddTransaction (Deviation)
V->>DB: INSERT FreeInf2 (InfCatNo=90, Gr=90,<br/>Val1 = motpost slik at beholdning = 0)
API-->>App: OK — beholdning nullstilt
else Avvik over grensen
API-->>App: Avvist, med grenseverdi i svaret
end
Datalag: FreeInf2 kolonne for kolonne¶
INSERT-en i jhlVismaAPI InventoryController.AddTransaction skriver disse
kolonnene (tabellnavnet er konfigurerbart via VismaInventoryTable, standard
FreeInf2):
| Kolonne | Innhold |
|---|---|
PK |
Løpenummer: (SELECT ISNULL(MAX(pk),0)+1 FROM FreeInf2) |
InfCatNo |
Transaksjonsgruppe: 10 beholdningsendring, 90 avvik |
Gr |
Transaksjonstype (se tabellen over) |
Emp |
Ansattnummer (sjåfør) |
R9 |
Bil (truck-ID) — beholdningen summeres per denne |
R10 |
Tankstasjon/automat (ved egne tanker-operasjoner) |
R11 |
Depot |
OrdNo / OrdLnNo |
Ordre- og linjenummer (kun ved levering, Gr = 20) |
ProdNo |
Lagerprodukt. Kan avvike fra solgt produkt: enkelte produkter er konfigurert til å trekke fra et annet produkts beholdning |
Txt2 |
Solgt produkt (originalt produktnr.) |
Val1 |
Mengde i standardliter — negativ ved Gr 20–29 |
Val2 |
Faktisk volum (liter ved målt temperatur) |
Val3 |
Temperatur (°C) — 15 hvis ikke angitt |
Val4 |
Tanknummer |
Txt1 |
Kommentar — inkluderer GPS-posisjon ved levering, eller «GPS: Sjåfør valgte å ikke sende GPS» |
Dt1 |
Transaksjonsdato (yyyyMMdd) |
CreDt / CreTm |
Opprettet dato/klokkeslett (ved «Autolasting» brukes transaksjonsdatoen) |
Duplikatvern¶
Før hver INSERT kjøres en eksistenssjekk, slik at samme transaksjon ikke føres
to ganger (f.eks. ved nettverks-retry fra appen):
IF NOT EXISTS (SELECT pk FROM FreeInf2
WHERE InfCatNo = @gruppe AND Gr = @type AND Emp = @ansatt
AND R9 = @bil AND R10 = @tankstasjon
AND OrdNo = @ordrenr AND OrdLnNo = @linjenr
AND ProdNo = @produkt AND Val1 = @mengde
AND Dt1 = @dato AND Val4 = @tanknr AND CreTm = @klokkeslett)
BEGIN
INSERT INTO FreeInf2 (...) OUTPUT Inserted.PK VALUES (...)
END
ELSE BEGIN SELECT -1 END
Avstemming¶
Bilens beholdning per produkt = SUM(Val1) over alle rader med bilens R9.
Kolonnene NÅ, I ORDRE og DIFF i Beholdning-skjermbildet beregnes fra
disse radene pluss dagens ordrelinjer. Automatstasjoner som er koblet mot
CO DataHost får i tillegg transaksjonene videresendt dit automatisk.
(Verifisert i jhlVismaAPI InventoryController.cs (AddTransaction,
AddOrderDeliveredTransaction), Enums.cs (TransactionType,
TransactionGroup), Helpers.cs (CalculateVol2Std) og
UserController.cs
(SaveTransactions, EgneAddTransaction, SaveDeviations).)
Avvik og reversering¶
| Situasjon | Håndtering | Teknisk kontroll |
|---|---|---|
| Lasting registrert dobbelt | Stoppes av duplikatvernet | IF NOT EXISTS returnerer −1 |
| Feil temperatur registrert | Korriger med ny lasting med negative liter (krever kommentar) | Negativ Val1-rad med Txt1 = forklaring |
| Feil produkt lastet | Konverter produkt i Beholdning | To FreeInf2-rader: − fra feil produkt, + på riktig |
| Avvik over selskapets grense ved nullstilling | Avvises — leder må involveres | Grensen returneres i API-svaret |
| Beholdning i app stemmer ikke med Visma | Kontroller transaksjonsradene per bil | SELECT ... FROM FreeInf2 WHERE R9 = @bil AND ProdNo = @produkt ORDER BY Dt1 |