feat(MED-97): update benefit stats view in dashboards

This commit is contained in:
2025-09-26 13:47:32 +03:00
parent fdc2e3e064
commit 1aeee0bc30
23 changed files with 518 additions and 374 deletions

View File

@@ -1,50 +1,19 @@
import { useMemo } from 'react';
import { Database } from '@/packages/supabase/src/database.types';
'use client';
import { Trans } from '@kit/ui/makerkit/trans';
import { Separator } from '@kit/ui/separator';
import { formatCurrency } from '@/packages/shared/src/utils';
import { useTranslation } from 'react-i18next';
import { TeamAccountBenefitExpensesOverview } from '../../_lib/server/load-team-account-benefit-expenses-overview';
const YearlyExpensesOverview = ({
employeeCount = 0,
companyParams,
expensesOverview,
}: {
employeeCount?: number;
companyParams: Database['medreport']['Tables']['company_params']['Row'];
expensesOverview: TeamAccountBenefitExpensesOverview;
}) => {
const monthlyExpensePerEmployee = useMemo(() => {
if (!companyParams.benefit_amount) {
return '0.00';
}
switch (companyParams.benefit_occurance) {
case 'yearly':
return (companyParams.benefit_amount / 12).toFixed(2);
case 'quarterly':
return (companyParams.benefit_amount / 3).toFixed(2);
case 'monthly':
return companyParams.benefit_amount.toFixed(2);
default:
return '0.00';
}
}, [companyParams]);
const maxYearlyExpensePerEmployee = useMemo(() => {
if (!companyParams.benefit_amount) {
return '0.00';
}
switch (companyParams.benefit_occurance) {
case 'yearly':
return companyParams.benefit_amount.toFixed(2);
case 'quarterly':
return (companyParams.benefit_amount * 3).toFixed(2);
case 'monthly':
return (companyParams.benefit_amount * 12).toFixed(2);
default:
return '0.00';
}
}, [companyParams]);
const { i18n: { language } } = useTranslation();
return (
<div className="border-border rounded-lg border p-6">
@@ -53,41 +22,56 @@ const YearlyExpensesOverview = ({
</h5>
<div className="mt-5 flex justify-between">
<p className="text-sm font-medium">
<Trans i18nKey="billing:expensesOverview.monthly" />
<Trans i18nKey="billing:expensesOverview.employeeCount" />
</p>
<span className="text-primary text-sm font-bold">
{monthlyExpensePerEmployee}
{employeeCount}
</span>
</div>
<div className="mt-3 flex justify-between">
<p className="text-sm font-medium">
<Trans i18nKey="billing:expensesOverview.yearly" />
</p>
<span className="text-sm font-medium">
{maxYearlyExpensePerEmployee}
</span>
</div>
<div className="mt-5 mb-3 flex justify-between">
<p className="text-sm font-medium">
<Trans
i18nKey="billing:expensesOverview.total"
values={{ employeeCount: employeeCount || 0 }}
i18nKey="billing:expensesOverview.managementFeeTotal"
values={{
managementFee: formatCurrency({
value: expensesOverview.managementFee,
locale: language,
currencyCode: 'EUR',
}),
}}
/>
</p>
<span className="text-sm font-medium">
{(Number(maxYearlyExpensePerEmployee) * employeeCount).toFixed(2)}
{formatCurrency({
value: expensesOverview.managementFeeTotal,
locale: language,
currencyCode: 'EUR',
})}
</span>
</div>
<div className="mt-3 mb-4 flex justify-between">
<p className="text-sm font-medium">
<Trans i18nKey="billing:expensesOverview.currentMonthUsageTotal" />
</p>
<span className="text-sm font-medium">
{formatCurrency({
value: expensesOverview.currentMonthUsageTotal,
locale: language,
currencyCode: 'EUR',
})}
</span>
</div>
<Separator />
<div className="mt-4 flex justify-between">
<p className="font-semibold">
<Trans i18nKey="billing:expensesOverview.sum" />
<Trans i18nKey="billing:expensesOverview.total" />
</p>
<span className="font-semibold">
{companyParams.benefit_amount
? companyParams.benefit_amount * employeeCount
: 0}{' '}
{formatCurrency({
value: expensesOverview.total,
locale: language,
currencyCode: 'EUR',
})}
</span>
</div>
</div>