Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions src/components/KPI/PercentageDifference.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
export default function calculatePercentageDifference(currentValue, previousValue) {
if (!previousValue || previousValue === 0) {
return 0;
}
const difference = currentValue - previousValue;
const percentageDifference = (difference / previousValue) * 100;
return percentageDifference;
}

export function calculateTransactionKPI(transactions, periodStart, periodEnd) {
const currentTransactions = transactions.filter(tx => {
const txDate = new Date(tx.dateTime);
return txDate >= periodStart && txDate <= periodEnd;
});

return currentTransactions.length;
}

export function calculateAgentKPI(agents, periodStart, periodEnd) {
const currentAgentActions = agents.filter(agent => {
const actionDate = new Date(agent.actionDate);
return actionDate >= periodStart && actionDate <= periodEnd;
});

return currentAgentActions.length;
}

export function calculateCustomerKPI(customers, periodStart, periodEnd) {
const currentCustomerInteractions = customers.filter(customer => {
const interactionDate = new Date(customer.interactionDate);
return interactionDate >= periodStart && interactionDate <= periodEnd;
});

return currentCustomerInteractions.length;
}

export function calculateDisputeKPI(disputes, periodStart, periodEnd) {
const currentDisputes = disputes.filter(dispute => {
const disputeDate = new Date(dispute.dateRaised);
return disputeDate >= periodStart && disputeDate <= periodEnd;
});

return currentDisputes.length;
}
52 changes: 52 additions & 0 deletions src/components/KPI/calculatePercentageChange.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { getCurrentMonthRange } from "./timeRangeHelpers";

export default function calculatePercentageChange(
dataArray,
dateAccessorFn,
optionalFilterFn,
getCurrentRangeFn = getCurrentMonthRange,
mode = "length",
accessorFn = null
) {
const { currentRangeStart, currentRangeEnd, previousRangeStart, previousRangeEnd } = getCurrentRangeFn();

const filterData = (items, start, end) =>
items.filter(item => {
const date = new Date(dateAccessorFn(item));
return date >= start && date <= end && (!optionalFilterFn || optionalFilterFn(item));
});

const currentItems = filterData(dataArray, currentRangeStart, currentRangeEnd);
const previousItems = filterData(dataArray, previousRangeStart, previousRangeEnd);

let currentValue, previousValue, totalValue;

if (mode === "sum" && accessorFn) {
currentValue = currentItems.reduce((acc, item) => acc + accessorFn(item), 0);
previousValue = previousItems.reduce((acc, item) => acc + accessorFn(item), 0);
totalValue = dataArray.reduce((acc, item) => acc + accessorFn(item), 0);
} else {
currentValue = currentItems.length;
previousValue = previousItems.length;
totalValue = dataArray.length;
}

return previousValue === 0
? (currentValue === 0 ? 0 : Math.round((currentValue / totalValue) * 100))
: Math.round(((currentValue - previousValue) / previousValue) * 100);
}

// Function to calculate percentage of filtered data over total dataset
export function calculateFilteredPercentage(dataArray, filterFn, mode = "length", accessorFn = null) {
let totalValue, filteredValue;

if (mode === "sum" && accessorFn) {
totalValue = dataArray.reduce((acc, item) => acc + accessorFn(item), 0);
filteredValue = dataArray.filter(filterFn).reduce((acc, item) => acc + accessorFn(item), 0);
} else {
totalValue = dataArray.length;
filteredValue = dataArray.filter(filterFn).length;
}

return totalValue === 0 ? 0 : Math.round((filteredValue / totalValue) * 100);
}
53 changes: 53 additions & 0 deletions src/components/KPI/timeRangeHelpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
export function getCurrentMonthRange() {
const now = new Date();
const currentRangeStart = new Date(now.getFullYear(), now.getMonth(), 1);
const currentRangeEnd = new Date(now.getFullYear(), now.getMonth() + 1, 0);

const previousRangeStart = new Date(now.getFullYear(), now.getMonth() - 1, 1);
const previousRangeEnd = new Date(now.getFullYear(), now.getMonth(), 0);

return { currentRangeStart, currentRangeEnd, previousRangeStart, previousRangeEnd };
}

export function getCurrentWeekRange() {
const now = new Date();
const dayOfWeek = now.getDay(); // 0 (Sun) - 6 (Sat)

const currentRangeStart = new Date(now);
currentRangeStart.setDate(now.getDate() - dayOfWeek);

const currentRangeEnd = new Date(currentRangeStart);
currentRangeEnd.setDate(currentRangeStart.getDate() + 6);

const previousRangeStart = new Date(currentRangeStart);
previousRangeStart.setDate(currentRangeStart.getDate() - 7);

const previousRangeEnd = new Date(previousRangeStart);
previousRangeEnd.setDate(previousRangeStart.getDate() + 6);

return { currentRangeStart, currentRangeEnd, previousRangeStart, previousRangeEnd };
}

export function getCurrentDayRange() {
const now = new Date();
const currentRangeStart = new Date(now.setHours(0, 0, 0, 0));
const currentRangeEnd = new Date(now.setHours(23, 59, 59, 999));

const previousRangeStart = new Date(currentRangeStart);
previousRangeStart.setDate(currentRangeStart.getDate() - 1);
const previousRangeEnd = new Date(previousRangeStart);
previousRangeEnd.setHours(23, 59, 59, 999);

return { currentRangeStart, currentRangeEnd, previousRangeStart, previousRangeEnd };
}

export function getCurrentYearRange() {
const now = new Date();
const currentRangeStart = new Date(now.getFullYear(), 0, 1);
const currentRangeEnd = new Date(now.getFullYear(), 11, 31);

const previousRangeStart = new Date(now.getFullYear() - 1, 0, 1);
const previousRangeEnd = new Date(now.getFullYear() - 1, 11, 31);

return { currentRangeStart, currentRangeEnd, previousRangeStart, previousRangeEnd };
}