{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} -- | module VDV452 where import Data.Time (Day) import Data.Text (Text) import VDV451 (ÖPNVEncode, ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber)) -- | 993 data BasisVerGueltigkeit = BasisVerGueltigkeit { basisVerGueltigkeit :: Day -- ^ Primärschlüssel , basisBasisVersion :: Int -- ^ Fremdschlüssel von MengeBasisVersionen } instance ÖPNVDatum BasisVerGueltigkeit where tableName _ = "BASIS_VER_GUELTIGKEIT" tableSchema _ = [ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit) , ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)] -- | 485 data MengeBasisVersionen = MengeBasisVersionen { mengeBasisVersion :: Int -- ^ Primärschlüssel , mengeBasisVersionText :: Text -- ^ Beschreibung der allgemeinen Version } instance ÖPNVDatum MengeBasisVersionen where tableName _ = "MENGE_BASIS_VERSIONEN" tableSchema _ = [ ("BASIS_VERSION", ÖNum 9, F . mengeBasisVersion) , ("BASIS_VERSION_TEXT", ÖChar 40, F . mengeBasisVersionText)] -- | 348 data Firmenkalender = Firmenkalender { firmenkalenderBasisVersion :: Integer -- ^ Fremdschlüssel von MengeBasisVersionen , firmenkalenderBetriebstag :: Day , firmenkalenderBetriebstagText :: Text , firmenkalenderTagesArtNr :: Int -- TODO this is probably en enum } data MengeTagesart = MengeTagesart { tagesartBasisVersion :: Integer -- ^ P1, Fremdschlüssel von MengeBasisVersionen , tagesartTagesartNr :: Int -- ^ P2 , tagesartTagesartText :: Text } ---- Ortsdaten data OnrTypNr = OnrHaltepunkt | OnrBetriebshofpunkt | OnrOrtsmarke | OnrLSAPunkt | OnrRoutenzwischenpunkt | OnrBetriebspunkt | OnrGrenzpunkt data MengeOnrTyp = MengeOnrTyp { onrtypBasisVersion :: Integer , onrtypTypNr :: OnrTypNr , onrStrTyp :: Text -- TODO: this might be an enum? , onrTypText :: Text } data OrtTypNr = OrtHaltestelle | OrtBetriebshof data MengeOrtTyp = MengeOrtTyp { orttypBasisVersion :: Integer , orttypTypNr :: OrtTypNr , orttypText :: Text } data RecHp = RecHp { rechpBasisVersion :: Integer , rechpOnrTypNr :: OrtTypNr , rechpOrtNr :: Integer , rechpHaltepunktNr :: Int , rechpZusatzInfo :: Text } data RecOm = RecOm { recomBasisVersion :: Integer , recomOnrTypNr :: OnrTypNr -- ^ nur 3..4 , recomOrtNr :: Integer , recomOrmKuerzel :: Text , recomOrmacode :: Int , recOrmText :: Text } -- | these are encoded in a horrible format newtype Longitude = Longitude Int newtype Latitude = Latitude Int -- | tatsächliche Ortsbeschreibung data RecOrt = RecOrt { recortBasisVersion :: Integer , recortOnrTypNr :: OnrTypNr , recortOrtNr :: Integer , recortOrtName :: Text , recortHastNrLokal :: Int , recortHstNrNational :: Integer , recortHstNrInternational :: Text -- these only if recortOnrTypNr = 1 or 2 , recortOrtRefOrt :: Int , recortOrtRefOrtTyp :: OrtTypNr , recortOrtRefOrtLangNr :: Maybe Int , recortOrtRefOrtKuerzel :: Text , recortOrtRefOrtName :: Text , recortZoneWabeNr :: Maybe Int --- these are entirely optional , recortOrtPosLaenge :: Longitude , rocortOrtPosBreite :: Latitude , recortPosHoehe :: Int , recortOrtRichtung :: Int } -- Betriebsdaten data Fahrzeug = Fahrzeug { fzgBasisVersion :: Integer , fzgNr :: Int , fzgTypNr :: Maybe Int , fzgPolKenn :: Text , fzgUnternehmen :: Maybe Int -- ^ fremdschlüssel ZulVerkehsbetrieb , fzgFIN :: Text } data ZulVerkehsbetrieb = ZulVerkehsbetrieb { zulBasisVersion :: Integer , zulUnternehmen :: Int , zulAbkUnternehmen :: Text , zulBetriebsgebietBez :: Text } -- | 333 data MengeBereich = MengeBereich { mengebereichBasisVersion :: Integer , mengebereichBereichNr :: Text , mengebereichStrBereich :: Text , mengebereichBereichText :: Text } -- | 293 data MengeFzgTyp = MengeFzgTyp { fzgtypBasisVersion :: Integer , fzgtypFzgTypNr :: Int , fzgtypFzgLaenge :: Int -- ^ given in metres , fzgtypBreite :: Int -- ^ given in centimetres , fzgtypHoehe :: Int -- ^ given in centimetres , fzgtypGewicht :: Integer -- ^ kilograms , fzgtypSitz :: Integer , fzgtypSteh :: Integer , fzgtypText :: Text , fzgtypSonderPlatz :: Integer , fzgtypStrFzgTyp :: Text -- ^ kursbezeichnung des fahrzeugtyps -- , fzgtypBatterieTypNr :: Maybe Int -- -- this one is optional, but the others maybe not? -- -- fremdschlüssel MengeBatterieTyp -- , fzgtypVerbrauchDistanz :: Int -- , fzgtypVerbrauchZeit :: Int } -- | 996: Aufzählung von Fahrzeug-Ansagetexten -- this one seems to be optional data RecAnr = RecAnr { recanrBasisVersion :: Integer , recanrAnrNr :: Int , recanrAnrKuerzel :: Text , recanrAnrText :: Text } -- | 995: Aufzählung der am Fahrzeug angezeigten Fahrtziele -- this one is probably optional as well data RecZnr = RecZnr { recznrBasisVersion :: Integer , recznrZnrNr :: Integer , recznrKuerzel :: Text , recznrFahrerkurztext :: Text , recznrSeitentext :: Text , recznrZnrText :: Text , recznrCode :: Text } ------- Netzdaten -- 299 data RecSel = RecSel { recselBasisVersion :: Integer , recselBereichNr :: Int -- ^ fremdschlüssel MangeBereich , recselOnrTypNr :: OnrTypNr -- ^ fremdschlüssel MengeOnrTyp , recselOrtNr :: Integer -- ^ fremdschlüssel RecOrt , recselSelZiel :: Integer , recselSelZielTyp :: OrtTypNr , recselSelLaenge :: Integer } -- | 995: definition von zwischenpunkten -- honestly i hope this one's optional data RecSelZp = RecSelZp { recselzpBasisVersion :: Integer , recselzpBereichNr :: Int , recselzpOnrTypNr :: OrtTypNr , recselzpOrtNr :: Integer , recselzpSelZiel :: Integer , recselzpSelZielTyp :: OrtTypNr , recselzpZpOnr :: Integer , recselzpZpTyp :: Int -- this one only takes values 3..7??? , recselzpSelZpLaenge :: Maybe Int , recselzpZpLfdNr :: Maybe Integer } -- | 222: Fahrzeitgruppen (whatever that is) -- seems to be optional? data MengeFgr = MengeFgr { mengefgrBasisVersion :: Integer , mengefgrFgrNr :: Integer , mengefgrText :: Text , mengefgrTypNr :: Int } --- | 999: Angabe von Haltezeiten je Fahrzeitgruppe und Ort -- definitely optional, which is a good thing because -- i don't know what it's even for data OrtHztf = OrtHztf { orthztfBasisVersion :: Integer , orthztfFgrNr :: Integer , orthztfOnrTypNr :: OrtTypNr , orthztfOrtNr :: Integer , orthztfHpHzt :: Int } -- | 282: für streckenabschnitte planmäßig vorgesehen Fahrzeit -- nie als fremdschlüssel benutzt, ist optional data SelFztFeld = SelFztFeld { selfztBasisVersion :: Integer , selfztBereichNr :: Int , selfztFgrNr :: Integer , selfztOnrTypNr :: OrtTypNr , selfztOrtNr :: Integer , selfztSelZiel :: Integer , selfztSelZielTyp :: OrtTypNr , selfztSelFzt :: Int } -- | 225: keine ahnung, irgendwas halt data RecUeb = RecUeb { recuebBasisVersion :: Integer , recuebBereichNr :: Int , recuebOnrTypNr :: OrtTypNr , recuebOrtNr :: Integer , recuebUebZielTyp :: OrtTypNr , recuebZiel :: Integer , recuebLaenge :: Int } -- | 247 -- nirgendwo anders benutzt, ist wohl optional data UebFzt = UebFzt { uebfztBasisVersion :: Integer , uebfztBereichNr :: Int , uebfztFgrNr :: Integer , uebfztOnrTypNr :: OrtTypNr , uebfztOrtNr :: Integer , uebZielTyp :: OrtTypNr , uebZiel :: Integer , uebFahrzeit :: Int } data Fahrtart = Normalfahrt | Betriebshofausfahrt | Betriebshofeinfahrt | Zufahrt -- | 332: Aufzählung von Fahrtarten data MengeFahrtart = MengeFahrtart { fahrtartBasisVersion :: Integer , fahrtartNr :: Fahrtart , fahrtartStrFahrtart :: Text } -- | 571: Beschreibung von Flächenzonen data FlaechenZone = FlaechenZone { flaechenBasisVersion :: Integer , flaechenZoneTypNr :: Int , flaechenZoneNr :: Integer , flaechenZoneKuerzel :: Text , flaechenZoneName :: Text , flaechenZoneAmtlicheNr :: Text } -- | 539: Zuordnung der Orte zu Flächenzonen -- nirgendwo referenziert, ist optional data FlZoneOrt = FlZoneOrt { flzoneortBasisVersion :: Integer , flzoneortTypNr :: Int , flzoneortNr :: Integer , flzoneortOnrTypNr :: OnrTypNr , flzoneortOrtNr :: Integer } -- TODO: this probably has more fields? data ZoneTypNr = Gebietskörperschaft | Verkehrszonen -- | 572: Typen von Flächenzonen (Gebietskörperschaft) data MengeFlaechenZoneTyp = MengeFlaechenZoneTyp { flaechenzoneBasisVeresion :: Integer , flaechenzoneZoneTypNr :: ZoneTypNr , flaechenzoneTypText :: Text } -- | 540 -- nirgendwo fremdschlüssel, optional data SelFztFeldZp = SelFztFeldZp { selfztfeldBasisVersion :: Integer , selfztfeldBereichnr :: Int , selfztfeldFgrNr :: Integer , selfztfeldOnrTypNr :: OrtTypNr , selfztfeldOrtNr :: Integer , selfztfeldSelZiel :: Integer , selfztfeldSelZielTyp :: Int -- this one can only be 1 or 2?? , selfztfeldZpOnr :: Integer , selfztfeldZpTyp :: Int -- this one must always be 7??? , selfztfeldSelFztZp :: Int } ---- Liniendaten -- | 246: Linienverlauf als aufzählung von halten -- nirgendwo sonst fremdschlüssel data LidVerlauf = LidVerlauf { verlaufBasisVersion :: Integer , verlaufLfdNr :: Integer , verlaufNr :: Int , verlaufStrLiVar :: Text , verlaufOnrTypNr :: OrtTypNr , verlaufOrtNr :: Integer , verlaufZnrNr :: Int , verlaufAnrNr :: Maybe Int , verlaufEinfangbereich :: Int , verlaufLiKnoten :: Bool , verlaufProduktiv :: Bool , verlaufEinsteigeverbot :: Bool , verlaufAussteigeverbot :: Bool , verlaufInnerortsverbot :: Bool , verlaufBedarfshalt :: Bool } -- | 226 data RecLid = RecLid { reclidBasisVersion :: Integer , reclidLiNr :: Int , reclidStrLiVar :: Text , reclidRoutenNr :: Int , reclidLiRiNr :: Int -- ^ 1..2 , reclidBereichNr :: Int , reclidLiKuerzel :: Text , reclidLidname :: Text , reclidRoutenArt :: Fahrtart , reclidLinienCode :: Maybe Integer , reclidLinienId :: Text -- ^ this one might just be a byte array?? } ------ Fahrplandaten -- | 715 data RecFrt = RecFrt { recfrtBasisVersion :: Integer , recfrtFid :: Integer , recfrtStart :: Int , recfrtLiNr :: Int , recfrtTagesartNr :: Int , recfrtLiKuNr :: Int , recfrtFahrtartNr :: Fahrtart , recfrtFgrNr :: Integer , recfrtUmUid :: Maybe Integer , recfrtZugNr :: Integer , recfrtDurchbiFrtStart :: Bool , recfrtDurchbiFrtEnde :: Bool , recfrtFahrtBezeichner :: Text , recfrtZielEnergieMenge :: Integer } -- | 308: Fahrtabhängiges Warten am Haltepunkt (e.g. Anschlusssicherung) -- nicht in fremdschlüsseln erwähnt, optional data RecFrtHzt = RecFrtHzt { recfrthztBasisVersion :: Integer , recfrthztFid :: Integer , recfrthztOnrTypNr :: OrtTypNr , recfrthztOrtNr :: Integer , recfrthztZeit :: Int } -- | 310: Fahrzeugumläufe data RecUmlauf = RecUmlauf { umlaufBasisVersion :: Integer , umlaufTagesartNr :: Int , umlaufUmUid :: Int , umlaufAnfOrt :: Int , umlaufAnfOnrTyp :: OrtTypNr , umlaufEndOrt :: Int , umlaufEndOnrTyp :: OrtTypNr , umlaufFzgTypNr :: Maybe Int } -- TODO: ÖPNV DM 4.1 UMS_Z_RI Bezeichner der Linien-Richtung data Richtung ------ Anschlussdaten data Einzelanschluss = Einzelanschluss { einzelBasisVersion :: Integer , einzelBasisEinanNr :: Int , einzelBasisAnschlussName :: Text , einzelBasisAnschlussGruppe :: Text , einzelLeitstellenkennung :: Int , einzelZubLiNr :: Int , einzelZubLiRiNr :: Richtung , einzelZubOrtRefOrt :: Int , einzelZubOnrTypNr :: Maybe OnrTypNr , einzelZubOrtNr :: Maybe Int , einzelVonOrtRefOrt :: Maybe Int , einzelLinienId :: Text , einzelRichtungsId :: Text , einzelAsbid :: Text , einzelAbbLiNr :: Int , einzelAbbLiRiNr :: Int , einzelAbbOrtRefOrt :: Int , einzelAbbOnrTypNr :: Maybe OnrTypNr , einzelNachOrtRefOrt :: Maybe Int } data RecUms = RecUms { recumsBasisVersion :: Integer , recumsEinanNr :: Int , recumsTagesartNr :: Int , recumsUmsBeginn :: Int , recumsUmsEnde :: Int , recumsUmsMin :: Int , recumsUmsMax :: Int , recumsMaxVerzMan :: Int , recumsMaxVerzAuto :: Int }