From 7ddc15dd0b78cdb7daea263745fce9e91c02aa41 Mon Sep 17 00:00:00 2001 From: Steffen Jost Date: Fri, 31 Jan 2025 15:15:47 +0100 Subject: [PATCH] chore(avs): test AVSneo problems AVSneo will no longer have unique AVS CardNo: PersonSearch will return one card per company, all having the same CardNo, but possibly different colors Test shows that FRADrive will handle this just fine, provided the old AVS workaround firing several requests at once remain in place --- src/Handler/Admin/Avs.hs | 1 + src/Handler/Utils/Avs.hs | 2 ++ src/Model/Types/Avs.hs | 4 ++-- src/Utils/Avs.hs | 22 ++++++++++++---------- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Handler/Admin/Avs.hs b/src/Handler/Admin/Avs.hs index b8bd82a87..5b7083309 100644 --- a/src/Handler/Admin/Avs.hs +++ b/src/Handler/Admin/Avs.hs @@ -805,6 +805,7 @@ postAdminAvsUserR uuid = do mbContact <- try $ fmap fltrIdContact $ avsQuery $ AvsQueryContact $ Set.singleton $ AvsObjPersonId userAvsPersonId -- mbStatus <- try $ fmap fltrIdStatus $ avsQuery $ AvsQueryStatus $ Set.singleton userAvsPersonId mbStatus <- try $ queryAvsFullStatus userAvsPersonId -- TODO: delete Handler.Utils.Avs.lookupAvsUser if no longer needed -- NOTE: currently needed to provide card firms that are missing in AVS status query responses + -- $logInfoS "AVS-1" [st|Status query for #{tshow userAvsPersonId} lieferte #{tshow mbStatus} |] -- DEBUG let compsUsed :: [CompanyName] = mbStatus ^.. _Right . _Wrapped . folded . _avsStatusPersonCardStatus . folded . _avsDataFirm . _Just . to stripCI compDict <- if 1 >= length compsUsed then return mempty -- switch company only sensible if there is more than one company to choose diff --git a/src/Handler/Utils/Avs.hs b/src/Handler/Utils/Avs.hs index 338eef719..ff4309b32 100644 --- a/src/Handler/Utils/Avs.hs +++ b/src/Handler/Utils/Avs.hs @@ -163,10 +163,12 @@ lookupAvsUsers :: ( MonadThrow m, MonadHandler m, HandlerSite m ~ UniWorX ) => Set AvsPersonId -> m (Map AvsPersonId AvsDataPerson) lookupAvsUsers apis = do AvsResponseStatus statuses <- avsQuery $ AvsQueryStatus apis + -- $logInfoS "AVS-2" [st|Statuses for #{tshow apis} lieferte #{tshow statuses} |] -- DEBUG let forFoldlM = $(permuteFun [3,2,1]) foldlM forFoldlM statuses mempty $ \acc1 AvsStatusPerson{avsStatusPersonCardStatus=cards} -> forFoldlM cards acc1 $ \acc2 AvsDataPersonCard{avsDataCardNo, avsDataVersionNo} -> do AvsResponsePerson adps <- avsQuery $ def{avsPersonQueryCardNo = Just avsDataCardNo, avsPersonQueryVersionNo = Just avsDataVersionNo} + -- $logInfoS "AVS-3" [st|PersonSearch for card #{tshow $ avsCardNo avsDataCardNo}.#{avsDataVersionNo} lieferte #{tshow adps} |] -- DEBUG return $ mergeByPersonId adps acc2 diff --git a/src/Model/Types/Avs.hs b/src/Model/Types/Avs.hs index f2fa8032f..9911d748c 100644 --- a/src/Model/Types/Avs.hs +++ b/src/Model/Types/Avs.hs @@ -1,4 +1,4 @@ --- SPDX-FileCopyrightText: 2022-24 Steffen Jost +-- SPDX-FileCopyrightText: 2022-25 Steffen Jost -- -- SPDX-License-Identifier: AGPL-3.0-or-later @@ -461,7 +461,7 @@ data AvsDataPerson = AvsDataPerson , avsPersonInternalPersonalNo :: Maybe AvsInternalPersonalNo -- Fraport Personalnummer , avsPersonPersonNo :: Int -- AVS Personennummer, in menschlicher Kommunikation verwendet , avsPersonPersonID :: AvsPersonId -- Eindeutige PersonenID, wichtig für die Schnittstelle! - , avsPersonPersonCards :: Set AvsDataPersonCard + , avsPersonPersonCards :: Set AvsDataPersonCard -- WARNING: AVSneo will transmit one AvsDataPersonCards per company, having identical card-nos } deriving (Eq, Ord, Show, Generic, NFData, Binary) diff --git a/src/Utils/Avs.hs b/src/Utils/Avs.hs index 42db63e41..d7f4d32dd 100644 --- a/src/Utils/Avs.hs +++ b/src/Utils/Avs.hs @@ -83,15 +83,20 @@ mkAvsQuery _ _ _ = AvsQuery , avsQueryGetAllLicences = return . Right $ AvsResponseGetLicences mempty } where + fakeCard1 = AvsDataPersonCard True (Just $ fromGregorian 2026 5 1) Nothing AvsCardColorGelb (Set.fromList ['F','R','C']) Nothing Nothing Nothing (Just "Fraport AG") (AvsCardNo "6666") "4" + fakeCard2 = AvsDataPersonCard False (Just $ fromGregorian 2025 6 2) Nothing AvsCardColorRot (Set.fromList ['F','A' ]) Nothing Nothing Nothing (Just "N*ICE Aircraft Services & Support GmbH") (AvsCardNo "7777") "4" -- AVSneo will report multiple companies using multiple cards with same card no + fakeCard3 = AvsDataPersonCard True (Just $ fromGregorian 2028 7 3) Nothing AvsCardColorBlau mempty Nothing Nothing Nothing (Just "Fraport Facility Services GmbH") (AvsCardNo "7777") "4" + fakeCard4 = AvsDataPersonCard True (Just $ fromGregorian 2028 7 3) Nothing AvsCardColorGrün mempty Nothing Nothing Nothing (Just "Vollautomaten GmbH") (AvsCardNo "7777") "4" + fakePerson :: AvsQueryPerson -> AvsResponsePerson fakePerson = let sarah = Set.singleton $ AvsDataPerson "Sarah" "Vaupel" Nothing 2 (AvsPersonId 2) $ Set.singleton $ AvsDataPersonCard True Nothing Nothing AvsCardColorRot mempty Nothing Nothing Nothing Nothing (AvsCardNo "424242") "8" - stephan = Set.singleton $ AvsDataPerson "Stephan" "Barth" Nothing 4 (AvsPersonId 4) mempty - steffen = Set.singleton $ AvsDataPerson "Steffen" "Jost" (Just $ mkAvsInternalPersonalNo "47138") 12345678 (AvsPersonId 12345678) mempty + stephan = Set.singleton $ AvsDataPerson "Stephan" "Barth" Nothing 4 (AvsPersonId 4) $ Set.fromList [fakeCard1, fakeCard2] + steffen = Set.singleton $ AvsDataPerson "Steffen" "Jost" (Just $ mkAvsInternalPersonalNo "47138") 12345678 (AvsPersonId 12345678) $ Set.fromList [fakeCard2, fakeCard3, fakeCard4] sumpfi1 = Set.singleton $ AvsDataPerson "Heribert" "Sumpfmeier" Nothing 12345678 (AvsPersonId 12345678) mempty - sumpfi2 = Set.singleton $ AvsDataPerson "Heribert" "Sumpfmeier" Nothing 12345678 (AvsPersonId 604387) mempty - sumpfi3 = Set.singleton $ AvsDataPerson "Heribert" "Sumpfmeier" Nothing 12345678 (AvsPersonId 604591) mempty + sumpfi2 = Set.singleton $ AvsDataPerson "Heribert" "Sumpfmeier" Nothing 12345678 (AvsPersonId 12345678) $ Set.fromList [fakeCard1, fakeCard2, fakeCard3, fakeCard4] + sumpfi3 = Set.singleton $ AvsDataPerson "Heribert" "Sumpfmeier" Nothing 12345678 (AvsPersonId 12345678) mempty in \case AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "00001234"), avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson steffen AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "00001234")} -> AvsResponsePerson steffen @@ -101,15 +106,12 @@ mkAvsQuery _ _ _ = AvsQuery AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "4") , avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson $ steffen <> stephan AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "00006666"), avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson $ sumpfi1 <> sumpfi2 <> sumpfi3 AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "00007777"), avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson $ sumpfi1 <> sumpfi2 <> sumpfi3 + AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "7777"), avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson $ sumpfi1 <> sumpfi2 <> sumpfi3 AvsQueryPerson{avsPersonQueryCardNo=Just (AvsCardNo "00008888"), avsPersonQueryVersionNo=Just "4"} -> AvsResponsePerson $ sumpfi1 <> sumpfi2 <> sumpfi3 - _ -> AvsResponsePerson steffen + _ -> AvsResponsePerson $ steffen <> sumpfi1 fakeStatus :: AvsQueryStatus -> AvsResponseStatus - fakeStatus (AvsQueryStatus (Set.toList -> (api:_))) = AvsResponseStatus $ Set.singleton $ AvsStatusPerson api $ Set.fromList - [ AvsDataPersonCard True (Just $ fromGregorian 2026 5 1) Nothing AvsCardColorGelb (Set.fromList ['F','R','C']) Nothing Nothing Nothing (Just "Fraport AG") (AvsCardNo "6666") "4" - , AvsDataPersonCard False (Just $ fromGregorian 2025 6 2) Nothing AvsCardColorRot (Set.fromList ['F','A' ]) Nothing Nothing Nothing (Just "N*ICE Aircraft Services & Support GmbH") (AvsCardNo "7777") "4" - , AvsDataPersonCard True (Just $ fromGregorian 2028 7 3) Nothing AvsCardColorBlau mempty Nothing Nothing Nothing (Just "Fraport Facility Services GmbH") (AvsCardNo "8888") "4" - ] + fakeStatus (AvsQueryStatus (Set.toList -> (api:_))) = AvsResponseStatus $ Set.singleton $ AvsStatusPerson api $ Set.fromList [fakeCard1, fakeCard2, fakeCard3, fakeCard4] fakeStatus _ = AvsResponseStatus mempty fakeContact :: AvsQueryContact -> AvsResponseContact fakeContact (AvsQueryContact (Set.toList -> ((AvsObjPersonId api):_)))