Gå til innhold

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 2029 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:

  1. Produktets beregningsgruppe hentes fra produkttabellen (Prod).
  2. Faktoren slås opp i Vol2Std-faktortabellen på (gruppe, temperatur). Temperaturen rundes til én desimal; mangler temperatur brukes bilens registrerte lastetemperatur for dagen.
  3. 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 , 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

Relaterte sider