Gå til innhold

Prisimport

Prisimport-pakken henter drivstoffpriser fra leverandørenes nettsider (primært St1, valgfritt Circle K og Shell), og bruker dem til tre ting:

  1. oppdatere salgs-/innkjøpspriser i Visma (per kundegruppe, med påslag),
  2. oppdatere prislister i CO DataHost (automatstasjonene),
  3. sende prisvarsel på e-post til kunder som abonnerer.

Selve nettskrapingen ligger i biblioteket St1FuelpriceScrape (St1FuelpriceScrapper.Data); orkestreringen og prisberegningen ligger i konsollen (Program.cs), og prislisteskrivingen mot DataHost i jhlCoDataHost.

Flyt

flowchart TD
    subgraph kilder["Leverandørpriser (web)"]
        ST1[St1 B2B Mine sider]
        CK[Circle K]
        SHELL[Shell]
    end
    ST1 --> SCR[St1FuelpriceScrape.GetDepots → List<Depot>]
    CK -. valgfritt .-> SCR
    SHELL -. valgfritt .-> SCR
    SCR --> PREP[SyncSt1Prices_Prepare<br/>marginberegning per kundegruppe/depot]
    PREP -->|St1Price_UpdateVisma=1| VISMA[UpdateProductPrices → Visma]
    PREP -->|St1Price_UpdateDatahost=1| DH[CoDataHostAPI.AddToPricelist → DataHost]
    SCR --> ALERT[PriceAlerts<br/>påslag pr depot/produkt] --> MAIL[E-post til abonnentkunder]
    SCR --> WM[(StrFVar St1Priser:<br/>SistInnlest / Teller / Varsling)]

    classDef sys fill:#f8d7da,stroke:#b53b46
    class SCR,PREP,VISMA,DH,ALERT,MAIL,WM sys

1. Prisskraping fra leverandør — -p

RunSt1PriceCheck() initialiserer St1FuelpriceScrape med innlogging fra App.config og kaller GetDepots(), som returnerer en liste av depoter med produkter og dagens pris.

Kilde Styres av Innhold
St1 B2B «Mine sider bedrift» St1Price_Username / St1Price_Password Leveringssteder + priser per depot/produkt
Circle K St1Price_UpdateSalespriceFromCK (0/1) Veiledende utsalgspris (matches på ExternalProdctNo2)
Shell St1Price_UpdateSalespriceFromShell (0/1) Veiledende utsalgspris (matches på ExternalProdctNo3)

Hver Depot har DepotName, DepotNo, CompanyNo og en produktliste (ProductNo, TodaysPrice, pris uten mva). Finnes samme produkt flere ganger på et depot, brukes høyeste dagspris.

Depot- og produktnavn må matche eksakt

St1-depotnavnet må matche oppsettet (App.config / VismaProduct), og produktene kobles via ExternalProdctNo (St1), ExternalProdctNo2 (Circle K) og ExternalProdctNo3 (Shell) på Visma-produktet. Treffer ikke navnet, logges «not found» og prisen hoppes over.

2. Prisoppdatering i Visma

SyncSt1Prices_Prepare() regner ut priser per kundegruppe og kaller vbs.BasicData.UpdateProductPrices(). Påslagene ligger på Visma-produktet (VismaProduct, bl.a. InternalListPriceAddition, DatahostPriceAddition).

Kundegruppe Pris
10 (intern) innkjøpspris = St1-pris; salgspris = St1-pris + InternalListPriceAddition
20 salgspris justert (Rotterdam-fratrekk)
30 listepris
40 (ukespris) settes lørdag: max(dagspris, forrige ukes snitt) + ukespåslag
50 (ekstern) innkjøpspris = St1-pris

PriceStructure styrer granularitet: Normal (alle depot samlet), Company (per selskap, R3), Depot (per depot, R11) — eller kombinasjoner. Styres av St1Price_UpdateVisma.

3. Prislisteoppdatering i DataHost — -k

UpdateDatahostPricelist() skraper på nytt (GetDepots()) og kaller SyncSt1Prices_Init(PriceStructure.Normal, …). Prisene mappes til DataHost via VismaProduct.DataHostIDjhlCoDataHost.Models.Prices.Product.PartNo, med påslag salgspris + DatahostPriceAddition, og postes til DataHost:

POST {DataHost_API}{clientID}/pricelists/pricelistcode/{kode}/prices

(CoDataHostAPI.AddToPricelist). Prisliste-kodene og hvilke depot som inngår hentes fra StrFVar (NmSp='DataHost', Pricelist_‹ID› / PricelistDepot_‹ID›) og/eller DataHost_PricelistsToUpdate / DataHost_PricelistsDepots i App.config. Aktiveres med St1Price_UpdateDatahost=1.

4. Prisvarsel til kunder — --pricealert

PriceAlerts(VBClient) sender e-post til kunder når dagens priser er hentet.

sequenceDiagram
    autonumber
    participant CM as ConnectMonitor
    participant DB as StrFVar / Visma
    participant K as Kunder
    CM->>DB: Allerede varslet i dag? (St1Priser/Varsling)
    CM->>DB: Ble St1-priser hentet i dag? (St1Priser/SistInnlest)
    alt begge OK
        CM->>DB: Hent kundegrupper (SendPriceAlert=true, gyldig e-post)
        CM->>K: E-post pr depot/produkt med konfigurert påslag
        CM->>DB: Sett Varsling = i dag
    end
  • Påslag og e-posttekst per depot/produkt defineres i PriceAlertsSection i App.config (Depot.Name må matche St1-depotnavn; PriceSurcharge i kroner; Exclude for å holde ut produkter).
  • Frekvensstyring: kunden får varsel etter sin frekvens (daglig, mandag, …).
  • Testmodus: StrFVar St1Priser/Varsling_test_modus (sender til test-adresse).

Vannmerker (StrFVar)

NmSp VarNm Betydning
St1Priser SistInnlest Sist vellykkede prisinnhenting (yyyyMMdd)
St1Priser Teller Retry-teller; e-post til St1Price_SendErrorsTo ved 4. mislykkede forsøk
St1Priser Varsling Sist prisvarsel sendt (yyyyMMdd)
St1Priser Depot_‹ID› / Selskap_‹ID› Depot-/selskapsspesifikk prisdato
ConnectMonitor PrisvarslingV2 Sist kjørte prisvarsling v2

Konfignøkler (App.config) — navn

St1Price_Username · St1Price_Password · St1Price_UpdateVisma · St1Price_UpdateDatahost · St1Price_UpdateSalespriceFromCK · St1Price_UpdateSalespriceFromShell · St1Price_WaitUntilClock (når jobben gir opp dagen) · St1Price_SendErrorsTo · DataHost_API / DataHost_User / DataHost_Pwd · DataHost_PricelistsToUpdate / DataHost_PricelistsDepots · PriceAlertsSection (egen XML-seksjon).

Hemmeligheter hører ikke hjemme i git

St1- og DataHost-innlogging ligger i App.config på tjenermaskinen. Hold reelle brukernavn/passord ute av kildekontroll.

Relasjon til andre jobber

  • St1-fakturaimport (-i) er en annen jobb: den leser St1-fakturaer fra e-post (IMAP) via jhlst1invoice/InvoiceReader — ikke priser. Se Økonomi-synk.
  • Hedge/innkjøp (CreateGasHedgeOrders) bruker priser, men er ordrelogikk, ikke prisimport.

Feilsøking

Symptom Sjekk
Ingen priser oppdatert Logg «Depos found: 0» (skraper feilet); St1-innlogging; St1Priser/Teller (retry); jobben venter til St1Price_WaitUntilClock
Produkt får ikke ny pris Mangler ExternalProdctNo(2/3) på Visma-produktet, eller depotnavn matcher ikke
DataHost-prisliste ikke oppdatert St1Price_UpdateDatahost=1? Riktig Pricelist_‹ID›/PricelistDepot_‹ID›? DataHost-API-feil i logg
Prisvarsel kom ikke St1Priser/Varsling (allerede sendt i dag?) og St1Priser/SistInnlest (ble priser hentet?); kundens SendPriceAlert + e-post

Relaterte sider