feat(holiday-system): implement comprehensive holiday management features

- Added holiday types and organization holidays management with CRUD operations.
- Introduced country holidays import functionality using the date-holidays npm package.
- Created database migrations for holiday types and organization holidays tables.
- Developed a holiday calendar component for visual representation and management of holidays.
- Enhanced API routes for holiday-related operations and integrated them into the admin center.
- Updated frontend localization for holiday management features.
- Implemented scripts for populating holidays in the database for 200+ countries.
This commit is contained in:
chamiakJ
2025-07-16 07:59:27 +05:30
parent 737f7cada2
commit 5214368354
16 changed files with 2181 additions and 560 deletions

View File

@@ -0,0 +1,68 @@
import { API_BASE_URL } from '@/shared/constants';
import apiClient from '../api-client';
import { IServerResponse } from '@/types/common.types';
import {
IHolidayType,
IOrganizationHoliday,
ICountryHoliday,
IAvailableCountry,
ICreateHolidayRequest,
IUpdateHolidayRequest,
IImportCountryHolidaysRequest,
IHolidayCalendarEvent,
} from '@/types/holiday/holiday.types';
const rootUrl = `${API_BASE_URL}/holidays`;
export const holidayApiService = {
// Holiday types
getHolidayTypes: async (): Promise<IServerResponse<IHolidayType[]>> => {
const response = await apiClient.get<IServerResponse<IHolidayType[]>>(`${rootUrl}/types`);
return response.data;
},
// Organization holidays
getOrganizationHolidays: async (year?: number): Promise<IServerResponse<IOrganizationHoliday[]>> => {
const params = year ? `?year=${year}` : '';
const response = await apiClient.get<IServerResponse<IOrganizationHoliday[]>>(`${rootUrl}/organization${params}`);
return response.data;
},
createOrganizationHoliday: async (data: ICreateHolidayRequest): Promise<IServerResponse<any>> => {
const response = await apiClient.post<IServerResponse<any>>(`${rootUrl}/organization`, data);
return response.data;
},
updateOrganizationHoliday: async (id: string, data: IUpdateHolidayRequest): Promise<IServerResponse<any>> => {
const response = await apiClient.put<IServerResponse<any>>(`${rootUrl}/organization/${id}`, data);
return response.data;
},
deleteOrganizationHoliday: async (id: string): Promise<IServerResponse<any>> => {
const response = await apiClient.delete<IServerResponse<any>>(`${rootUrl}/organization/${id}`);
return response.data;
},
// Country holidays
getAvailableCountries: async (): Promise<IServerResponse<IAvailableCountry[]>> => {
const response = await apiClient.get<IServerResponse<IAvailableCountry[]>>(`${rootUrl}/countries`);
return response.data;
},
getCountryHolidays: async (countryCode: string, year?: number): Promise<IServerResponse<ICountryHoliday[]>> => {
const params = year ? `?year=${year}` : '';
const response = await apiClient.get<IServerResponse<ICountryHoliday[]>>(`${rootUrl}/countries/${countryCode}${params}`);
return response.data;
},
importCountryHolidays: async (data: IImportCountryHolidaysRequest): Promise<IServerResponse<any>> => {
const response = await apiClient.post<IServerResponse<any>>(`${rootUrl}/import`, data);
return response.data;
},
// Calendar view
getHolidayCalendar: async (year: number, month: number): Promise<IServerResponse<IHolidayCalendarEvent[]>> => {
const response = await apiClient.get<IServerResponse<IHolidayCalendarEvent[]>>(`${rootUrl}/calendar?year=${year}&month=${month}`);
return response.data;
},
};