From f939da1301dd537330b5a66d157fe38b8c2ea8b3 Mon Sep 17 00:00:00 2001 From: stuebinm Date: Thu, 9 Mar 2023 21:14:54 +0100 Subject: vdv 452: apply some corrections --- vdv-server/VDV452.hs | 95 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 35 deletions(-) (limited to 'vdv-server/VDV452.hs') diff --git a/vdv-server/VDV452.hs b/vdv-server/VDV452.hs index e8840ce..0d24934 100644 --- a/vdv-server/VDV452.hs +++ b/vdv-server/VDV452.hs @@ -1,16 +1,41 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | module VDV452 where + +import qualified Data.Text as T +import Data.ByteString (ByteString) import Data.Time (Day) import Data.Text (Text) -import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber), Longitude, Latitude) -import Data.ByteString (ByteString) - +import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), Longitude, Latitude) + +newtype BereichNr = BereichNr Int + deriving newtype ÖPNVEncode +newtype LineVariant = LineVariant Text + deriving newtype ÖPNVEncode +newtype SteigNr = SteigNr Int + deriving newtype ÖPNVEncode +newtype OrtRefOrt = OrtRefOrt Int + deriving newtype ÖPNVEncode + +-- see mail correspondence with Mentz, 2023-03-06 +data OrtNr = OrtNr { ortRef :: OrtRefOrt, steigNr :: SteigNr } +instance ÖPNVEncode OrtNr where + encode (OrtNr (OrtRefOrt ort) (SteigNr steig)) = + encode (ort * 100 + steig) + +-- | this should technically be in its own file VDV432.hs +-- prefix enthält alle Felder bis Bereich-ID; SteigNr ist die Mast-ID +-- Halteposition wird hier nicht benutzt. +data DHID = DHID Text SteigNr +instance ÖPNVEncode DHID where + encode (DHID prefix (SteigNr steig)) = + encode (prefix <> ":" <> (T.pack . show) steig) -- | 993 data BasisVerGueltigkeit = BasisVerGueltigkeit @@ -24,7 +49,7 @@ instance ÖPNVDatum BasisVerGueltigkeit where tableName _ = "BASIS_VER_GUELTIGKEIT" tableNumber _ = 993 tableSchema _ = - [ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit) + [ ("VER_GUELTIGKEIT", ÖNum 8, F . basisVerGueltigkeit) , ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)] -- | 485 @@ -136,8 +161,8 @@ instance ÖPNVDatum MengeOrtTyp where data RecHp = RecHp { rechpBasisVersion :: Int , rechpOnrTypNr :: OrtTypNr - , rechpOrtNr :: Int - , rechpHaltepunktNr :: Int + , rechpOrtNr :: OrtNr + , rechpHaltepunktNr :: SteigNr , rechpZusatzInfo :: Text } @@ -156,7 +181,7 @@ data RecOm = RecOm { recomBasisVersion :: Int , recomOnrTypNr :: OnrTypNr -- ^ nur 3..4 - , recomOrtNr :: Int + , recomOrtNr :: OrtNr , recomOrmKuerzel :: Text , recomOrmacode :: Int , recomOrmText :: Text @@ -178,13 +203,13 @@ instance ÖPNVDatum RecOm where data RecOrt = RecOrt { recortBasisVersion :: Int , recortOnrTypNr :: OnrTypNr - , recortOrtNr :: Int + , recortOrtNr :: OrtNr , recortOrtName :: Text , recortHastNrLokal :: Int , recortHstNrNational :: Int - , recortHstNrInternational :: Text + , recortHstNrInternational :: DHID -- these only if recortOnrTypNr = 1 or 2 - , recortOrtRefOrt :: Int + , recortOrtRefOrt :: OrtRefOrt , recortOrtRefOrtTyp :: OrtTypNr , recortOrtRefOrtLangNr :: Maybe Int , recortOrtRefOrtKuerzel :: Text @@ -266,7 +291,7 @@ instance ÖPNVDatum ZulVerkehsbetrieb where -- | 333 data MengeBereich = MengeBereich { mengebereichBasisVersion :: Int - , mengebereichBereichNr :: Int + , mengebereichBereichNr :: BereichNr , mengebereichStrBereich :: Text , mengebereichBereichText :: Text } @@ -374,13 +399,13 @@ instance ÖPNVDatum RecZnr where -- 299 data RecSel = RecSel { recselBasisVersion :: Int - , recselBereichNr :: Int + , recselBereichNr :: BereichNr -- ^ fremdschlüssel MangeBereich , recselOnrTypNr :: OnrTypNr -- ^ fremdschlüssel MengeOnrTyp - , recselOrtNr :: Int + , recselOrtNr :: OrtNr -- ^ fremdschlüssel RecOrt - , recselSelZiel :: Int + , recselSelZiel :: OrtNr , recselSelZielTyp :: OrtTypNr , recselSelLaenge :: Int } @@ -404,9 +429,9 @@ instance ÖPNVDatum RecSel where -- honestly i hope this one's optional data RecSelZp = RecSelZp { recselzpBasisVersion :: Int - , recselzpBereichNr :: Int + , recselzpBereichNr :: BereichNr , recselzpOnrTypNr :: OrtTypNr - , recselzpOrtNr :: Int + , recselzpOrtNr :: OrtNr , recselzpSelZiel :: Int , recselzpSelZielTyp :: OrtTypNr , recselzpZpOnr :: Int @@ -458,7 +483,7 @@ data OrtHztf = OrtHztf { orthztfBasisVersion :: Int , orthztfFgrNr :: Int , orthztfOnrTypNr :: OrtTypNr - , orthztfOrtNr :: Int + , orthztfOrtNr :: OrtNr , orthztfHpHzt :: Int } @@ -477,11 +502,11 @@ instance ÖPNVDatum OrtHztf where -- nie als fremdschlüssel benutzt, ist optional data SelFztFeld = SelFztFeld { selfztBasisVersion :: Int - , selfztBereichNr :: Int + , selfztBereichNr :: BereichNr , selfztFgrNr :: Int , selfztOnrTypNr :: OrtTypNr - , selfztOrtNr :: Int - , selfztSelZiel :: Int + , selfztOrtNr :: OrtNr + , selfztSelZiel :: OrtNr , selfztSelZielTyp :: OrtTypNr , selfztSelFzt :: Int } @@ -503,9 +528,9 @@ instance ÖPNVDatum SelFztFeld where -- | 225: keine ahnung, irgendwas halt data RecUeb = RecUeb { recuebBasisVersion :: Int - , recuebBereichNr :: Int + , recuebBereichNr :: BereichNr , recuebOnrTypNr :: OrtTypNr - , recuebOrtNr :: Int + , recuebOrtNr :: OrtNr , recuebZielTyp :: OrtTypNr , recuebZiel :: Int , recuebLaenge :: Int @@ -528,10 +553,10 @@ instance ÖPNVDatum RecUeb where -- nirgendwo anders benutzt, ist wohl optional data UebFzt = UebFzt { uebfztBasisVersion :: Int - , uebfztBereichNr :: Int + , uebfztBereichNr :: BereichNr , uebfztFgrNr :: Int , uebfztOnrTypNr :: OrtTypNr - , uebfztOrtNr :: Int + , uebfztOrtNr :: OrtNr , uebfztZielTyp :: OrtTypNr , uebfztZiel :: Int , uebfztFahrzeit :: Int @@ -601,7 +626,7 @@ data FlZoneOrt = FlZoneOrt , flzoneTypNr :: Int , flzoneNr :: Int , flzoneOnrTypNr :: OnrTypNr - , flzoneOrtNr :: Int + , flzoneOrtNr :: OrtNr } instance ÖPNVDatum FlZoneOrt where @@ -643,10 +668,10 @@ instance ÖPNVDatum MengeFlaechenZoneTyp where -- nirgendwo fremdschlüssel, optional data SelFztFeldZp = SelFztFeldZp { selfztfeldBasisVersion :: Int - , selfztfeldBereichNr :: Int + , selfztfeldBereichNr :: BereichNr , selfztfeldFgrNr :: Int , selfztfeldOnrTypNr :: OrtTypNr - , selfztfeldOrtNr :: Int + , selfztfeldOrtNr :: OrtNr , selfztfeldSelZiel :: Int , selfztfeldSelZielTyp :: Int -- this one can only be 1 or 2?? @@ -681,9 +706,9 @@ data LidVerlauf = LidVerlauf { verlaufBasisVersion :: Int , verlaufLfdNr :: Int , verlaufNr :: Int - , verlaufStrLiVar :: Text + , verlaufStrLiVar :: LineVariant , verlaufOnrTypNr :: OrtTypNr - , verlaufOrtNr :: Int + , verlaufOrtNr :: OrtNr , verlaufZnrNr :: Int , verlaufAnrNr :: Maybe Int , verlaufEinfangbereich :: Int @@ -720,11 +745,11 @@ instance ÖPNVDatum LidVerlauf where data RecLid = RecLid { reclidBasisVersion :: Int , reclidLiNr :: Int - , reclidStrLiVar :: Text + , reclidStrLiVar :: LineVariant , reclidRoutenNr :: Int , reclidLiRiNr :: Int -- ^ 1..2 - , reclidBereichNr :: Int + , reclidBereichNr :: BereichNr , reclidLiKuerzel :: Text , reclidLidname :: Text , reclidRoutenArt :: Fahrtart @@ -763,7 +788,7 @@ data RecFrt = RecFrt , recfrtLiKuNr :: Maybe Int , recfrtFahrtartNr :: Fahrtart , recfrtFgrNr :: Int - , recfrtStrLiVar :: Text + , recfrtStrLiVar :: LineVariant , recfrtUmUid :: Maybe Int , recfrtZugNr :: Int , recfrtDurchbiFrtStart :: Bool @@ -799,7 +824,7 @@ data RecFrtHzt = RecFrtHzt { recfrthztBasisVersion :: Int , recfrthztFid :: Int , recfrthztOnrTypNr :: OrtTypNr - , recfrthztOrtNr :: Int + , recfrthztOrtNr :: OrtNr , recfrthztZeit :: Int } @@ -855,7 +880,7 @@ data Einzelanschluss = Einzelanschluss , einzelZubLiRiNr :: Richtung , einzelZubOrtRefOrt :: Int , einzelZubOnrTypNr :: Maybe OnrTypNr - , einzelZubOrtNr :: Maybe Int + , einzelZubOrtNr :: Maybe OrtNr , einzelVonOrtRefOrt :: Maybe Int , einzelLinienId :: Text , einzelRichtungsId :: Text -- cgit v1.2.3