-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: refunds success distribution (#1935)
- Loading branch information
1 parent
8f7bd7d
commit fdab784
Showing
5 changed files
with
296 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
139 changes: 139 additions & 0 deletions
139
...ytics/NewRefundsAnalytics/SuccessfulRefundsDistribution/SuccessfulRefundsDistribution.res
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
open NewAnalyticsTypes | ||
open NewAnalyticsHelper | ||
open NewRefundsAnalyticsEntity | ||
open BarGraphTypes | ||
open SuccessfulRefundsDistributionUtils | ||
open SuccessfulRefundsDistributionTypes | ||
|
||
module TableModule = { | ||
@react.component | ||
let make = (~data, ~className="") => { | ||
let (offset, setOffset) = React.useState(_ => 0) | ||
let defaultSort: Table.sortedObject = { | ||
key: "", | ||
order: Table.INC, | ||
} | ||
|
||
let visibleColumns = [Connector, Refunds_Success_Rate] | ||
let tableData = getTableData(data) | ||
|
||
<div className> | ||
<LoadedTable | ||
visibleColumns | ||
title=" " | ||
hideTitle=true | ||
actualData={tableData} | ||
entity=successfulRefundsDistributionTableEntity | ||
resultsPerPage=10 | ||
totalResults={tableData->Array.length} | ||
offset | ||
setOffset | ||
defaultSort | ||
currrentFetchCount={tableData->Array.length} | ||
tableLocalFilter=false | ||
tableheadingClass=tableBorderClass | ||
tableBorderClass | ||
ignoreHeaderBg=true | ||
tableDataBorderClass=tableBorderClass | ||
isAnalyticsModule=true | ||
/> | ||
</div> | ||
} | ||
} | ||
|
||
module SuccessfulRefundsDistributionHeader = { | ||
@react.component | ||
let make = (~viewType, ~setViewType) => { | ||
let setViewType = value => { | ||
setViewType(_ => value) | ||
} | ||
|
||
<div className="w-full px-8 pt-3 pb-3 flex justify-end"> | ||
<div className="flex gap-2"> | ||
<TabSwitch viewType setViewType /> | ||
</div> | ||
</div> | ||
} | ||
} | ||
|
||
@react.component | ||
let make = ( | ||
~entity: moduleEntity, | ||
~chartEntity: chartEntity<barGraphPayload, barGraphOptions, JSON.t>, | ||
) => { | ||
open LogicUtils | ||
open APIUtils | ||
let getURL = useGetURL() | ||
let updateDetails = useUpdateMethod() | ||
let {filterValueJson} = React.useContext(FilterContext.filterContext) | ||
let (screenState, setScreenState) = React.useState(_ => PageLoaderWrapper.Loading) | ||
let (refundsDistribution, setrefundsDistribution) = React.useState(_ => JSON.Encode.array([])) | ||
let (viewType, setViewType) = React.useState(_ => Graph) | ||
let startTimeVal = filterValueJson->getString("startTime", "") | ||
let endTimeVal = filterValueJson->getString("endTime", "") | ||
|
||
let getRefundsDistribution = async () => { | ||
setScreenState(_ => PageLoaderWrapper.Loading) | ||
try { | ||
let url = getURL( | ||
~entityName=ANALYTICS_REFUNDS, | ||
~methodType=Post, | ||
~id=Some((entity.domain: domain :> string)), | ||
) | ||
|
||
let body = NewAnalyticsUtils.requestBody( | ||
~startTime=startTimeVal, | ||
~endTime=endTimeVal, | ||
~delta=entity.requestBodyConfig.delta, | ||
~metrics=entity.requestBodyConfig.metrics, | ||
~groupByNames=[Connector->getStringFromVariant]->Some, | ||
) | ||
|
||
let response = await updateDetails(url, body, Post) | ||
|
||
let responseData = | ||
response->getDictFromJsonObject->getArrayFromDict("queryData", [])->modifyQuery | ||
|
||
if responseData->Array.length > 0 { | ||
setrefundsDistribution(_ => responseData->JSON.Encode.array) | ||
setScreenState(_ => PageLoaderWrapper.Success) | ||
} else { | ||
setScreenState(_ => PageLoaderWrapper.Custom) | ||
} | ||
} catch { | ||
| _ => setScreenState(_ => PageLoaderWrapper.Custom) | ||
} | ||
} | ||
|
||
React.useEffect(() => { | ||
if startTimeVal->isNonEmptyString && endTimeVal->isNonEmptyString { | ||
getRefundsDistribution()->ignore | ||
} | ||
None | ||
}, [startTimeVal, endTimeVal]) | ||
|
||
let params = { | ||
data: refundsDistribution, | ||
xKey: Refunds_Success_Rate->getStringFromVariant, | ||
yKey: Connector->getStringFromVariant, | ||
} | ||
|
||
<div> | ||
<ModuleHeader title={entity.title} /> | ||
<Card> | ||
<PageLoaderWrapper | ||
screenState customLoader={<Shimmer layoutId=entity.title />} customUI={<NoData />}> | ||
<SuccessfulRefundsDistributionHeader viewType setViewType /> | ||
<div className="mb-5"> | ||
{switch viewType { | ||
| Graph => | ||
<BarGraph | ||
entity={chartEntity} object={chartEntity.getObjects(~params)} className="mr-3" | ||
/> | ||
| Table => <TableModule data={refundsDistribution} className="mx-7" /> | ||
}} | ||
</div> | ||
</PageLoaderWrapper> | ||
</Card> | ||
</div> | ||
} |
12 changes: 12 additions & 0 deletions
12
.../NewRefundsAnalytics/SuccessfulRefundsDistribution/SuccessfulRefundsDistributionTypes.res
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
type successfulRefundsDistributionTypes = | ||
| Refunds_Success_Rate | ||
| Refund_Count | ||
| Refund_Success_Count | ||
| Connector | ||
|
||
type successfulRefundsDistributionObject = { | ||
refund_count: int, | ||
refund_success_count: int, | ||
refunds_success_rate: float, | ||
connector: string, | ||
} |
108 changes: 108 additions & 0 deletions
108
.../NewRefundsAnalytics/SuccessfulRefundsDistribution/SuccessfulRefundsDistributionUtils.res
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
open NewAnalyticsUtils | ||
open LogicUtils | ||
open SuccessfulRefundsDistributionTypes | ||
|
||
let getStringFromVariant = value => { | ||
switch value { | ||
| Refunds_Success_Rate => "refunds_success_rate" | ||
| Refund_Count => "refund_count" | ||
| Refund_Success_Count => "refund_success_count" | ||
| Connector => "connector" | ||
} | ||
} | ||
|
||
let successfulRefundsDistributionMapper = ( | ||
~params: NewAnalyticsTypes.getObjects<JSON.t>, | ||
): BarGraphTypes.barGraphPayload => { | ||
open BarGraphTypes | ||
let {data, xKey, yKey} = params | ||
let categories = [data]->JSON.Encode.array->getCategories(0, yKey) | ||
|
||
let barGraphData = getBarGraphObj( | ||
~array=data->getArrayFromJson([]), | ||
~key=xKey, | ||
~name=xKey->snakeToTitle, | ||
~color=barGreenColor, | ||
) | ||
|
||
let title = { | ||
text: "", | ||
} | ||
|
||
let tooltipFormatter = bargraphTooltipFormatter( | ||
~title="Successful Refunds Distribution", | ||
~metricType=Rate, | ||
) | ||
|
||
{ | ||
categories, | ||
data: [barGraphData], | ||
title, | ||
tooltipFormatter, | ||
} | ||
} | ||
|
||
let tableItemToObjMapper: Dict.t<JSON.t> => successfulRefundsDistributionObject = dict => { | ||
{ | ||
refund_count: dict->getInt(Refund_Count->getStringFromVariant, 0), | ||
refund_success_count: dict->getInt(Refund_Success_Count->getStringFromVariant, 0), | ||
refunds_success_rate: dict->getFloat(Refunds_Success_Rate->getStringFromVariant, 0.0), | ||
connector: dict->getString(Connector->getStringFromVariant, ""), | ||
} | ||
} | ||
|
||
let getObjects: JSON.t => array<successfulRefundsDistributionObject> = json => { | ||
json | ||
->LogicUtils.getArrayFromJson([]) | ||
->Array.map(item => { | ||
tableItemToObjMapper(item->getDictFromJsonObject) | ||
}) | ||
} | ||
|
||
let getHeading = colType => { | ||
switch colType { | ||
| Refunds_Success_Rate => | ||
Table.makeHeaderInfo( | ||
~key=Refunds_Success_Rate->getStringFromVariant, | ||
~title="Refunds Success Rate", | ||
~dataType=TextType, | ||
) | ||
| Connector => | ||
Table.makeHeaderInfo( | ||
~key=Connector->getStringFromVariant, | ||
~title="Connector", | ||
~dataType=TextType, | ||
) | ||
| _ => Table.makeHeaderInfo(~key="", ~title="", ~dataType=TextType) | ||
} | ||
} | ||
|
||
let getCell = (obj, colType): Table.cell => { | ||
switch colType { | ||
| Refunds_Success_Rate => Text(obj.refunds_success_rate->valueFormatter(Rate)) | ||
| Connector => Text(obj.connector) | ||
| _ => Text("") | ||
} | ||
} | ||
|
||
let getTableData = json => { | ||
json->getArrayDataFromJson(tableItemToObjMapper)->Array.map(Nullable.make) | ||
} | ||
|
||
let modifyQuery = query => { | ||
query->Array.map(value => { | ||
let valueDict = value->getDictFromJsonObject | ||
let refund_count = valueDict->getInt(Refund_Count->getStringFromVariant, 0)->Int.toFloat | ||
let refund_success_count = | ||
valueDict->getInt(Refund_Success_Count->getStringFromVariant, 0)->Int.toFloat | ||
|
||
let refunds_success_rate = refund_success_count /. refund_count *. 100.0 | ||
|
||
valueDict->Dict.set( | ||
Refunds_Success_Rate->getStringFromVariant, | ||
refunds_success_rate->JSON.Encode.float, | ||
) | ||
|
||
valueDict->JSON.Encode.object | ||
}) | ||
} |