Prisimport¶
Prisimport-pakken henter drivstoffpriser fra leverandørenes nettsider (primært St1, valgfritt Circle K og Shell), og bruker dem til tre ting:
- oppdatere salgs-/innkjøpspriser i Visma (per kundegruppe, med påslag),
- oppdatere prislister i CO DataHost (automatstasjonene),
- 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.DataHostID → jhlCoDataHost.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
PriceAlertsSectioni App.config (Depot.Namemå matche St1-depotnavn;PriceSurchargei kroner;Excludefor å 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) viajhlst1invoice/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 |