This commit is contained in:
@@ -217,6 +217,46 @@ const EventsCalendar = () => {
|
||||
return instances;
|
||||
};
|
||||
|
||||
const buildDynamicBirthdayEvents = (customerList = [], rangeFrom, rangeTo) => {
|
||||
if (!rangeFrom || !rangeTo) return [];
|
||||
const from = new Date(rangeFrom);
|
||||
const to = new Date(rangeTo);
|
||||
const startYear = from.getFullYear();
|
||||
const endYear = to.getFullYear();
|
||||
const dynamicEvents = [];
|
||||
|
||||
customerList.forEach((customer) => {
|
||||
const birthDate = `${customer?.birth_date || ''}`;
|
||||
const [month, day] = birthDate.split('/').map(Number);
|
||||
if (!month || !day) return;
|
||||
|
||||
for (let year = startYear; year <= endYear; year++) {
|
||||
const birthday = new Date(year, month - 1, day);
|
||||
if (Number.isNaN(birthday.getTime())) continue;
|
||||
if (birthday < from || birthday > to) continue;
|
||||
dynamicEvents.push({
|
||||
id: `dynamic-birthday-${customer.id}-${year}`,
|
||||
type: 'reminder',
|
||||
status: 'active',
|
||||
title: `${customer?.name}'s Birthday`,
|
||||
description: `Happy Birthday to ${customer?.name}`,
|
||||
start_time: birthday,
|
||||
stop_time: new Date(birthday.getTime() + 10 * 60 * 1000),
|
||||
color: 'member_related',
|
||||
target_type: 'customer',
|
||||
target_uuid: customer?.id,
|
||||
target_name: customer?.name,
|
||||
event_reminder_type: 'birthday',
|
||||
rrule: 'FREQ=YEARLY',
|
||||
create_by: 'system-dynamic',
|
||||
edit_by: 'system-dynamic'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return dynamicEvents;
|
||||
};
|
||||
|
||||
const eventTypeMap = {
|
||||
medicalCalendar: 'medical',
|
||||
activitiesCalendar: 'activity',
|
||||
@@ -426,11 +466,21 @@ const EventsCalendar = () => {
|
||||
}
|
||||
} else {
|
||||
// Expand recurring event rules into individual instances and merge with regular events
|
||||
const recurInstances = allEventRecurrences
|
||||
let recurInstances = allEventRecurrences
|
||||
.filter(rule => rule.type === eventTypeMap[currentTab] && rule.status === 'active')
|
||||
.flatMap(rule => expandRecurrence(rule, fromDate, toDate));
|
||||
const originalEvents = [...allEvents, ...recurInstances];
|
||||
let filteredEvents = originalEvents?.filter(item => item.type === eventTypeMap[currentTab])?.map(item => {
|
||||
let baseEvents = [...allEvents];
|
||||
if (currentTab === 'reminderDatesCalendar') {
|
||||
// Birthday reminders are rendered dynamically from customer data.
|
||||
baseEvents = baseEvents.filter((item) => item?.event_reminder_type !== 'birthday');
|
||||
recurInstances = recurInstances.filter((item) => item?.event_reminder_type !== 'birthday');
|
||||
}
|
||||
const originalEvents = [...baseEvents, ...recurInstances];
|
||||
const dynamicBirthdayEvents = currentTab === 'reminderDatesCalendar'
|
||||
? buildDynamicBirthdayEvents(customers, fromDate, toDate)
|
||||
: [];
|
||||
const mergedEvents = [...originalEvents, ...dynamicBirthdayEvents];
|
||||
let filteredEvents = mergedEvents?.filter(item => item.type === eventTypeMap[currentTab])?.map(item => {
|
||||
// For Important Dates, remap old blue/orange colors to new member_related/vehicle_maintenance
|
||||
let eventColor = item?.color;
|
||||
if (currentTab === 'reminderDatesCalendar') {
|
||||
|
||||
Reference in New Issue
Block a user