feat(team-accounts): enhance team account statistics and health details components with new data and improved calculations

This commit is contained in:
Danel Kungla
2025-08-25 12:24:27 +03:00
parent ee86bb8829
commit 56ffd7591e
12 changed files with 336 additions and 150 deletions

View File

@@ -1,8 +1,14 @@
import React from 'react';
import { Database } from '@/packages/supabase/src/database.types';
import Isikukood from 'isikukood';
import { Clock, TrendingUp, User } from 'lucide-react';
import { bmiFromMetric } from '~/lib/utils';
import {
bmiFromMetric,
getBmiBackgroundColor,
getBmiStatus,
} from '~/lib/utils';
import { TeamAccountStatisticsProps } from '../../_components/team-account-statistics';
@@ -14,66 +20,89 @@ interface AccountHealthDetailsField {
color?: string;
className?: string;
}>;
normStatus: NormStatus;
}
export enum NormStatus {
CRITICAL = 'CRITICAL',
WARNING = 'WARNING',
NORMAL = 'NORMAL',
iconBg: string;
}
export const getAccountHealthDetailsFields = (
memberParams: TeamAccountStatisticsProps['memberParams'],
bmiThresholds: Omit<
Database['medreport']['Tables']['bmi_thresholds']['Row'],
'id'
>[],
members: Database['medreport']['Functions']['get_account_members']['Returns'],
): AccountHealthDetailsField[] => {
const averageBMI = (
memberParams.reduce((sum, { height, weight }) => {
return bmiFromMetric(weight ?? 0, height ?? 0) + sum;
}, 0) / memberParams.length
).toFixed(0);
const avarageWeight =
memberParams.reduce((sum, r) => sum + r.weight!, 0) / memberParams.length;
const avarageHeight =
memberParams.reduce((sum, r) => sum + r.height!, 0) / memberParams.length;
const avarageAge =
members.reduce((sum, r) => {
const person = new Isikukood(r.personal_code);
return sum + person.getAge();
}, 0) / members.length;
const numberOfMaleMembers = members.filter((r) => {
const person = new Isikukood(r.personal_code);
return person.getGender() === 'male';
}).length;
const numberOfFemaleMembers = members.filter((r) => {
const person = new Isikukood(r.personal_code);
return person.getGender() === 'female';
}).length;
const averageBMI = bmiFromMetric(avarageWeight, avarageHeight);
const bmiStatus = getBmiStatus(bmiThresholds, {
age: avarageAge,
height: avarageHeight,
weight: avarageWeight,
});
const malePercentage = members.length
? (numberOfMaleMembers / members.length) * 100
: 0;
const femalePercentage = members.length
? (numberOfFemaleMembers / members.length) * 100
: 0;
return [
{
title: 'teams:healthDetails.women',
value: `50% (${memberParams.length})`,
value: `${femalePercentage}% (${numberOfFemaleMembers})`,
Icon: User,
normStatus: NormStatus.NORMAL,
iconBg: 'bg-success',
},
{
title: 'teams:healthDetails.men',
value: `50% (${memberParams.length})`,
value: `${malePercentage}% (${numberOfMaleMembers})`,
Icon: User,
normStatus: NormStatus.NORMAL,
iconBg: 'bg-success',
},
{
title: 'teams:healthDetails.avgAge',
value: '56',
value: avarageAge.toFixed(0),
Icon: Clock,
normStatus: NormStatus.NORMAL,
iconBg: 'bg-success',
},
{
title: 'teams:healthDetails.bmi',
value: averageBMI,
Icon: TrendingUp,
normStatus: NormStatus.WARNING,
iconBg: getBmiBackgroundColor(bmiStatus),
},
{
title: 'teams:healthDetails.cholesterol',
value: '6.1',
value: '-',
Icon: TrendingUp,
normStatus: NormStatus.WARNING,
iconBg: 'bg-warning',
},
{
title: 'teams:healthDetails.vitaminD',
value: '76',
value: '-',
Icon: TrendingUp,
normStatus: NormStatus.NORMAL,
iconBg: 'bg-warning',
},
{
title: 'teams:healthDetails.smokers',
value: '22%',
value: '-',
Icon: TrendingUp,
normStatus: NormStatus.CRITICAL,
iconBg: 'bg-warning',
},
];
};