-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathReconEngineOverviewSummaryStackedBarGraphs.res
More file actions
92 lines (82 loc) · 3.6 KB
/
ReconEngineOverviewSummaryStackedBarGraphs.res
File metadata and controls
92 lines (82 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
open Typography
open ReconEngineRulesTypes
module RuleWiseStackedBarGraph = {
@react.component
let make = (~rule: rulePayload) => {
open CurrencyFormatUtils
open LogicUtils
let getTransactions = ReconEngineHooks.useGetTransactions()
let (allTransactionsData, setAllTransactionsData) = React.useState(_ => [])
let isMiniLaptopView = MatchMedia.useScreenSizeChecker(~screenSize="1600")
let {filterValueJson, filterValue} = React.useContext(FilterContext.filterContext)
let (screenState, setScreenState) = React.useState(_ => PageLoaderWrapper.Loading)
let getAllTransactionsData = async _ => {
try {
setScreenState(_ => PageLoaderWrapper.Loading)
let baseQueryString = ReconEngineFilterUtils.buildQueryStringFromFilters(~filterValueJson)
let queryString = if baseQueryString->isNonEmptyString {
`${baseQueryString}&rule_id=${rule.rule_id}&status=posted_auto,posted_manual,posted_force,expected,partially_reconciled,over_amount_mismatch,over_amount_expected,under_amount_mismatch,under_amount_expected,data_mismatch`
} else {
`rule_id=${rule.rule_id}&status=posted_auto,posted_manual,posted_force,expected,partially_reconciled,over_amount_mismatch,over_amount_expected,under_amount_mismatch,under_amount_expected,data_mismatch`
}
let transactionsData = await getTransactions(~queryParameters=Some(queryString))
setAllTransactionsData(_ => transactionsData)
setScreenState(_ => PageLoaderWrapper.Success)
} catch {
| _ => setScreenState(_ => PageLoaderWrapper.Custom)
}
}
let (postedCount, mismatchedCount, expectedCount) = React.useMemo(() => {
ReconEngineOverviewUtils.calculateTransactionCounts(allTransactionsData)
}, [allTransactionsData])
let totalTransactions = postedCount + mismatchedCount + expectedCount
let reconciliationPercentage =
totalTransactions > 0
? postedCount->Int.toFloat /. totalTransactions->Int.toFloat *. 100.0
: 0.0
let stackedBarGraphData = React.useMemo(() => {
ReconEngineOverviewSummaryUtils.getSummaryStackedBarGraphData(
~postedCount,
~mismatchedCount,
~expectedCount,
)
}, [postedCount, mismatchedCount, expectedCount])
React.useEffect(() => {
if !(filterValue->isEmptyDict) {
getAllTransactionsData()->ignore
}
None
}, [filterValue])
<PageLoaderWrapper
screenState
customUI={<NewAnalyticsHelper.NoData height="h-44" message="No data available." />}
customLoader={<Shimmer styleClass="h-44 w-full rounded-xl" />}>
<div
key={rule.rule_id}
className="flex flex-col space-y-2 items-start border rounded-xl border-nd_gray-150 px-4 pt-3 pb-4">
<p className={`text-nd_gray-500 ${body.sm.medium}`}> {rule.rule_name->React.string} </p>
<p className={`text-nd_gray-800 ${heading.md.semibold}`}>
{`${reconciliationPercentage->valueFormatter(Rate)}`->React.string}
</p>
<div className="w-full">
<StackedBarGraph
options={StackedBarGraphUtils.getStackedBarGraphOptions(
stackedBarGraphData,
~yMax=totalTransactions,
~labelItemDistance={isMiniLaptopView ? 45 : 80},
~pointWidth=12,
)}
/>
</div>
</div>
</PageLoaderWrapper>
}
}
@react.component
let make = (~reconRulesList: array<rulePayload>) => {
<div className="grid gap-6 grid-cols-1 lg:grid-cols-2">
{reconRulesList
->Array.map(rule => <RuleWiseStackedBarGraph rule key={rule.rule_id} />)
->React.array}
</div>
}