feat(MED-97): update benefit stats view in dashboards
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import { getSupabaseServerClient } from "@/packages/supabase/src/clients/server-client";
|
||||
import { loadAccountBenefitStatistics, loadCompanyPersonalAccountsBalanceEntries } from "./load-team-account-benefit-statistics";
|
||||
|
||||
export interface TeamAccountBenefitExpensesOverview {
|
||||
benefitAmount: number | null;
|
||||
benefitOccurrence: 'yearly' | 'monthly' | 'quarterly' | null;
|
||||
currentMonthUsageTotal: number;
|
||||
managementFee: number;
|
||||
managementFeeTotal: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
const MANAGEMENT_FEE = 5.50;
|
||||
|
||||
const MONTHS = 12;
|
||||
const QUARTERS = 4;
|
||||
|
||||
export async function loadTeamAccountBenefitExpensesOverview({
|
||||
companyId,
|
||||
employeeCount,
|
||||
}: {
|
||||
companyId: string;
|
||||
employeeCount: number;
|
||||
}): Promise<TeamAccountBenefitExpensesOverview> {
|
||||
const supabase = getSupabaseServerClient();
|
||||
const { data, error } = await supabase
|
||||
.schema('medreport')
|
||||
.from('benefit_distribution_schedule')
|
||||
.select('*')
|
||||
.eq('company_id', companyId)
|
||||
.eq('is_active', true)
|
||||
.single();
|
||||
|
||||
let benefitAmount: TeamAccountBenefitExpensesOverview['benefitAmount'] = null;
|
||||
let benefitOccurrence: TeamAccountBenefitExpensesOverview['benefitOccurrence'] = null;
|
||||
if (error) {
|
||||
console.warn('Failed to load team account benefit expenses overview');
|
||||
} else {
|
||||
benefitAmount = data.benefit_amount as TeamAccountBenefitExpensesOverview['benefitAmount'];
|
||||
benefitOccurrence = data.benefit_occurrence as TeamAccountBenefitExpensesOverview['benefitOccurrence'];
|
||||
}
|
||||
|
||||
const { purchaseEntriesTotal } = await loadCompanyPersonalAccountsBalanceEntries({ accountId: companyId });
|
||||
|
||||
return {
|
||||
benefitAmount,
|
||||
benefitOccurrence,
|
||||
currentMonthUsageTotal: purchaseEntriesTotal,
|
||||
managementFee: MANAGEMENT_FEE,
|
||||
managementFeeTotal: MANAGEMENT_FEE * employeeCount,
|
||||
total: (() => {
|
||||
if (typeof benefitAmount !== 'number') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const currentDate = new Date();
|
||||
const createdAt = new Date(data.created_at);
|
||||
const isCreatedThisYear = createdAt.getFullYear() === currentDate.getFullYear();
|
||||
if (benefitOccurrence === 'yearly') {
|
||||
return benefitAmount * employeeCount;
|
||||
} else if (benefitOccurrence === 'monthly') {
|
||||
const monthsLeft = isCreatedThisYear
|
||||
? MONTHS - createdAt.getMonth()
|
||||
: MONTHS;
|
||||
return benefitAmount * employeeCount * monthsLeft;
|
||||
} else if (benefitOccurrence === 'quarterly') {
|
||||
const quartersLeft = isCreatedThisYear
|
||||
? QUARTERS - (createdAt.getMonth() / 3)
|
||||
: QUARTERS;
|
||||
return benefitAmount * employeeCount * quartersLeft;
|
||||
}
|
||||
return 0;
|
||||
})(),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user