Skip to content

Commit 1cdaa34

Browse files
Ritankar BoseRitankar Bose
authored andcommitted
Added challan service provider
1 parent 8a6ba99 commit 1cdaa34

8 files changed

Lines changed: 151 additions & 0 deletions

File tree

lib/mobility-core/mobility-core.cabal

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ library
6969
Kernel.External.Call.TataClickToCall.Types
7070
Kernel.External.Call.Twillio.Config
7171
Kernel.External.Call.Types
72+
Kernel.External.ChallanSearch.Interface
73+
Kernel.External.ChallanSearch.Interface.Signzy
74+
Kernel.External.ChallanSearch.Interface.Types
75+
Kernel.External.ChallanSearch.Signzy.API
76+
Kernel.External.ChallanSearch.Signzy.Config
77+
Kernel.External.ChallanSearch.Signzy.Types
78+
Kernel.External.ChallanSearch.Types
7279
Kernel.External.Encryption
7380
Kernel.External.EventTracking
7481
Kernel.External.EventTracking.Interface
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Kernel.External.ChallanSearch.Interface
2+
( module Kernel.External.ChallanSearch.Interface,
3+
module Reexport,
4+
)
5+
where
6+
7+
import Kernel.External.ChallanSearch.Interface.Signzy as CIS
8+
import Kernel.External.ChallanSearch.Interface.Types as Reexport
9+
import Kernel.Prelude
10+
import Kernel.Tools.Metrics.CoreMetrics (CoreMetrics)
11+
import Kernel.Types.Common
12+
import Kernel.Utils.Servant.Client
13+
14+
getPendingChallanCount :: (EncFlow m r, CoreMetrics m, Log m, HasRequestId r, MonadReader r m) => ChallanSearchServiceConfig -> PendingChallanReq -> m PendingChallanResp
15+
getPendingChallanCount serviceConfig req = case serviceConfig of
16+
SignzyChallanSearch cfg -> CIS.signzyChallanSearch cfg req
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module Kernel.External.ChallanSearch.Interface.Signzy (signzyChallanSearch) where
2+
3+
import qualified Data.Text as T
4+
import Kernel.External.ChallanSearch.Interface.Types as CIT
5+
import Kernel.External.ChallanSearch.Signzy.API as CSA
6+
import Kernel.External.ChallanSearch.Signzy.Config as CSC
7+
import Kernel.External.ChallanSearch.Signzy.Types as CST
8+
import Kernel.External.Encryption
9+
import Kernel.Prelude
10+
import Kernel.Tools.Metrics.CoreMetrics (CoreMetrics)
11+
import Kernel.Types.Common
12+
import Kernel.Utils.Logging (logInfo)
13+
import Kernel.Utils.Servant.Client
14+
15+
signzyChallanSearch :: (EncFlow m r, CoreMetrics m, Log m, HasRequestId r, MonadReader r m) => CSC.SignzyChallanSearchCfg -> CIT.PendingChallanReq -> m CIT.PendingChallanResp
16+
signzyChallanSearch cfg req = do
17+
apiKey <- decrypt cfg.apiKey
18+
let signzyReq = CST.ChallanSearchReq {vehicleNumber = req.vehicleNumber, paymentCheck = True}
19+
signzyResp <- CSA.challanSearch cfg.url apiKey signzyReq
20+
let pendingChallans = filter isPending signzyResp.result.challanDetails
21+
logInfo $ "Signzy challan search for " <> req.vehicleNumber <> ": found " <> show (length pendingChallans) <> " pending out of " <> show (length signzyResp.result.challanDetails) <> " total challans"
22+
pure $ CIT.PendingChallanResp {pendingChallanCount = length pendingChallans}
23+
where
24+
isPending :: CST.ChallanDetail -> Bool
25+
isPending detail = T.toLower detail.challanStatus == "pending"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Kernel.External.ChallanSearch.Interface.Types
2+
( module Kernel.External.ChallanSearch.Interface.Types,
3+
)
4+
where
5+
6+
import Kernel.External.ChallanSearch.Signzy.Config as Signzy
7+
import Kernel.Prelude
8+
9+
data ChallanSearchServiceConfig = SignzyChallanSearch Signzy.SignzyChallanSearchCfg
10+
deriving (Show, Eq, Generic, FromJSON, ToJSON)
11+
12+
newtype PendingChallanReq = PendingChallanReq
13+
{ vehicleNumber :: Text
14+
}
15+
deriving (Show, Generic, ToJSON, FromJSON)
16+
17+
newtype PendingChallanResp = PendingChallanResp
18+
{ pendingChallanCount :: Int
19+
}
20+
deriving (Show, Generic, ToJSON, FromJSON)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module Kernel.External.ChallanSearch.Signzy.API where
2+
3+
import EulerHS.Types (EulerClient, client)
4+
import Kernel.External.ChallanSearch.Signzy.Types as CST
5+
import Kernel.Prelude
6+
import Kernel.Tools.Metrics.CoreMetrics (CoreMetrics)
7+
import Kernel.Types.Common
8+
import Kernel.Types.Error
9+
import Kernel.Utils.Common
10+
import Servant hiding (throwError)
11+
12+
type SignzyChallanSearchAPI =
13+
"api" :> "v3" :> "vehicle" :> "challan-search"
14+
:> Header "Authorization" Text
15+
:> ReqBody '[JSON] CST.ChallanSearchReq
16+
:> Post '[JSON] CST.ChallanSearchResp
17+
18+
challanSearchClient :: Maybe Text -> CST.ChallanSearchReq -> EulerClient CST.ChallanSearchResp
19+
challanSearchClient = client (Proxy :: Proxy SignzyChallanSearchAPI)
20+
21+
challanSearch :: (CoreMetrics m, MonadFlow m, Log m, HasRequestId r, MonadReader r m) => BaseUrl -> Text -> CST.ChallanSearchReq -> m CST.ChallanSearchResp
22+
challanSearch url apiKey req = do
23+
callAPI url (challanSearchClient (Just apiKey) req) "signzyChallanSearch" (Proxy :: Proxy SignzyChallanSearchAPI)
24+
>>= fromEitherM (ExternalAPICallError (Just "SIGNZY_CHALLAN_SEARCH_ERROR") url)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module Kernel.External.ChallanSearch.Signzy.Config where
2+
3+
import Kernel.External.Encryption
4+
import Kernel.Prelude
5+
6+
data SignzyChallanSearchCfg = SignzyChallanSearchCfg
7+
{ url :: BaseUrl,
8+
apiKey :: EncryptedField 'AsEncrypted Text
9+
}
10+
deriving (Show, Eq, Generic, ToJSON, FromJSON)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module Kernel.External.ChallanSearch.Signzy.Types where
2+
3+
import Kernel.Prelude
4+
5+
data ChallanSearchReq = ChallanSearchReq
6+
{ vehicleNumber :: Text,
7+
paymentCheck :: Bool
8+
}
9+
deriving (Show, Generic, ToJSON, FromJSON)
10+
11+
newtype ChallanSearchResp = ChallanSearchResp
12+
{ result :: ChallanSearchResult
13+
}
14+
deriving (Show, Generic, ToJSON, FromJSON)
15+
16+
data ChallanSearchResult = ChallanSearchResult
17+
{ regNo :: Text,
18+
message :: Text,
19+
status_code :: Int,
20+
challanDetails :: [ChallanDetail],
21+
successfulSources :: [Text],
22+
failedSources :: [Text]
23+
}
24+
deriving (Show, Generic, ToJSON, FromJSON)
25+
26+
data ChallanDetail = ChallanDetail
27+
{ number :: Int,
28+
challanNumber :: Text,
29+
rto :: Text,
30+
accusedName :: Text,
31+
amount :: Text,
32+
challanStatus :: Text
33+
}
34+
deriving (Show, Generic, ToJSON, FromJSON)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{-# LANGUAGE TemplateHaskell #-}
2+
3+
module Kernel.External.ChallanSearch.Types
4+
( module Kernel.External.ChallanSearch.Types,
5+
)
6+
where
7+
8+
import Data.OpenApi hiding (email)
9+
import EulerHS.Prelude
10+
import Kernel.Beam.Lib.UtilsTH (mkBeamInstancesForEnumAndList)
11+
12+
data ChallanSearchService = Signzy
13+
deriving (Show, Read, Eq, Ord, Generic, ToJSON, FromJSON, ToSchema, ToParamSchema)
14+
15+
$(mkBeamInstancesForEnumAndList ''ChallanSearchService)

0 commit comments

Comments
 (0)