Files
medassist-ng/backend/src/services/notifications/builders.ts
T

110 lines
3.8 KiB
TypeScript

import { getFooterPlain, getTranslations, type Language, t } from "../../i18n/translations.js";
export type StockReminderItem = {
name: string;
medsLeft: number;
daysLeft: number | null;
depletionDate: string | null;
isCritical?: boolean;
};
export type PrescriptionReminderItem = {
name: string;
remainingRefills: number;
};
function splitStockItems(items: StockReminderItem[]): {
emptyItems: StockReminderItem[];
criticalItems: StockReminderItem[];
lowItems: StockReminderItem[];
} {
const emptyItems = items.filter((item) => item.medsLeft <= 0);
const criticalItems = items.filter((item) => item.medsLeft > 0 && item.isCritical !== false);
const lowItems = items.filter((item) => item.medsLeft > 0 && item.isCritical === false);
return { emptyItems, criticalItems, lowItems };
}
export function buildStockReminderPushNotification(
items: StockReminderItem[],
language: Language
): { title: string; message: string } {
const tr = getTranslations(language);
const { emptyItems, criticalItems, lowItems } = splitStockItems(items);
const titleParts: string[] = [];
if (emptyItems.length > 0) titleParts.push(`🚨 ${emptyItems.length} ${tr.push.empty}`);
if (criticalItems.length > 0) titleParts.push(`🚨 ${criticalItems.length} ${tr.push.critical}`);
if (lowItems.length > 0) titleParts.push(`⚠️ ${lowItems.length} ${tr.push.lowStock}`);
const title = `MedAssist-ng: ${titleParts.join(", ")} - ${tr.push.reorderNow}`;
const messageParts: string[] = [];
if (emptyItems.length > 0) {
messageParts.push(`🚨 ${tr.push.emptySection}:`);
emptyItems.forEach((item) => messageParts.push(`${item.name}`));
}
if (criticalItems.length > 0) {
if (messageParts.length > 0) messageParts.push("");
messageParts.push(`🚨 ${tr.push.criticalSection}:`);
criticalItems.forEach((item) =>
messageParts.push(
`${item.name}: ${t(tr.push.pillsLeft, { count: item.medsLeft })}, ${t(tr.push.daysLeft, { count: item.daysLeft ?? 0 })}`
)
);
}
if (lowItems.length > 0) {
if (messageParts.length > 0) messageParts.push("");
messageParts.push(`⚠️ ${tr.push.lowStockSection}:`);
lowItems.forEach((item) =>
messageParts.push(
`${item.name}: ${t(tr.push.pillsLeft, { count: item.medsLeft })}, ${t(tr.push.daysLeft, { count: item.daysLeft ?? 0 })}`
)
);
}
return {
title,
message: `${messageParts.join("\n")}\n\n---\n${getFooterPlain(language)}`,
};
}
export function buildPrescriptionReminderPushNotification(
items: PrescriptionReminderItem[],
language: Language
): { title: string; message: string } {
const tr = getTranslations(language);
const emptyItems = items.filter((item) => item.remainingRefills <= 0);
const lowItems = items.filter((item) => item.remainingRefills > 0);
const titleParts: string[] = [];
if (emptyItems.length > 0) {
titleParts.push(
`🚨 ${emptyItems.length} ${emptyItems.length === 1 ? tr.prescriptionReminder.pushEmptySingle : tr.prescriptionReminder.pushEmpty}`
);
}
if (lowItems.length > 0) {
titleParts.push(
`🚨 ${lowItems.length} ${lowItems.length === 1 ? tr.prescriptionReminder.pushLowSingle : tr.prescriptionReminder.pushLow}`
);
}
const messageParts: string[] = [];
if (emptyItems.length > 0) {
messageParts.push(`🚨 ${tr.prescriptionReminder.pushEmptySection}:`);
emptyItems.forEach((item) => messageParts.push(`${item.name}`));
}
if (lowItems.length > 0) {
if (messageParts.length > 0) messageParts.push("");
messageParts.push(`🚨 ${tr.prescriptionReminder.pushLowSection}:`);
lowItems.forEach((item) =>
messageParts.push(
`${item.name}: ${t(tr.prescriptionReminder.pushRefillsLeft, { count: item.remainingRefills })}`
)
);
}
return {
title: `MedAssist-ng: ${titleParts.join(", ")} - ${tr.prescriptionReminder.pushRenewNow}`,
message: `${messageParts.join("\n")}\n\n---\n${getFooterPlain(language)}`,
};
}