162 lines
4.9 KiB
TypeScript
162 lines
4.9 KiB
TypeScript
import { ApiClient } from '../../api/ApiClient';
|
|
import type {
|
|
MasterDataCategoryItem,
|
|
MasterDataItem,
|
|
MasterDataValueFormData,
|
|
} from './MasterDataTypes';
|
|
|
|
// Helper to normalize items so label and value are guaranteed
|
|
function normalizeItems(items: any[]): MasterDataItem[] {
|
|
if (!Array.isArray(items)) return [];
|
|
return items.map((item) => {
|
|
const val = item.value || item.label || item.name || item.code || '';
|
|
const lbl = item.label || item.value || item.name || item.code || '';
|
|
return {
|
|
...item,
|
|
id: item.id || val,
|
|
value: val,
|
|
label: lbl,
|
|
isActive: item.isActive !== false,
|
|
};
|
|
});
|
|
}
|
|
|
|
// ─── Lookup Tables & Categories List Endpoint ─────────────────────────────────
|
|
|
|
export function getLookupTables(): Promise<MasterDataCategoryItem[]> {
|
|
return ApiClient.get<any, MasterDataCategoryItem[]>('/master-data/lookup-tables')
|
|
.then((res) => (Array.isArray(res) ? res : []))
|
|
.catch(() => []);
|
|
}
|
|
|
|
export function getMasterCategories(): Promise<MasterDataCategoryItem[]> {
|
|
return getLookupTables()
|
|
.then((tables) => {
|
|
if (Array.isArray(tables) && tables.length > 0) return tables;
|
|
return ApiClient.get<any, MasterDataCategoryItem[]>('/master-data/categories')
|
|
.then((res) => (Array.isArray(res) ? res : []))
|
|
.catch(() => []);
|
|
})
|
|
.catch(() => []);
|
|
}
|
|
|
|
// ─── Category Values Endpoint ───────────────────────────────────────────────
|
|
|
|
export function getCategoryValues(categoryCode: string): Promise<MasterDataItem[]> {
|
|
if (!categoryCode) return Promise.resolve([]);
|
|
return ApiClient.get<any, any[]>(`/master-data/${categoryCode}`)
|
|
.then((res) => normalizeItems(res))
|
|
.catch(() => []);
|
|
}
|
|
|
|
// ─── Generic Master Data Item CRUD ──────────────────────────────────────────
|
|
|
|
export function getMasterDataByCategory(category: string): Promise<MasterDataItem[]> {
|
|
return getCategoryValues(category);
|
|
}
|
|
|
|
export function createCategoryValue(
|
|
categoryCode: string,
|
|
payload: MasterDataValueFormData,
|
|
): Promise<MasterDataItem> {
|
|
return ApiClient.post<any, MasterDataItem>(`/master-data/${categoryCode}`, {
|
|
...payload,
|
|
label: payload.value,
|
|
});
|
|
}
|
|
|
|
export function updateCategoryValue(
|
|
categoryCode: string,
|
|
id: string,
|
|
payload: Partial<MasterDataValueFormData>,
|
|
): Promise<MasterDataItem> {
|
|
return ApiClient.put<any, MasterDataItem>(`/master-data/${categoryCode}/${id}`, {
|
|
...payload,
|
|
label: payload.value || payload.label,
|
|
});
|
|
}
|
|
|
|
export function deleteCategoryValue(categoryCode: string, id: string): Promise<void> {
|
|
return ApiClient.delete<any, void>(`/master-data/${categoryCode}/${id}`);
|
|
}
|
|
|
|
// ─── Individual Category Helpers for Cohort & Policy Modules ─────────────────
|
|
|
|
export function getMembershipTiers(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('membership-tier');
|
|
}
|
|
|
|
export function getCustomerValues(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('customer-value');
|
|
}
|
|
|
|
export function getRegions(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('region');
|
|
}
|
|
|
|
export function getTripPurposes(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('trip-purpose');
|
|
}
|
|
|
|
export function getCabinClasses(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('cabin-class');
|
|
}
|
|
|
|
export function getPassengerTypes(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('passenger-type');
|
|
}
|
|
|
|
export function getAncillaryPurchases(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('ancillary-purchase');
|
|
}
|
|
|
|
export function getRevenueSegments(): Promise<MasterDataItem[]> {
|
|
return getCategoryValues('revenue-segment');
|
|
}
|
|
|
|
// ─── Fetch All Master Data at Once ──────────────────────────────────────────
|
|
|
|
export interface AllMasterData {
|
|
membershipTiers: MasterDataItem[];
|
|
customerValues: MasterDataItem[];
|
|
regions: MasterDataItem[];
|
|
tripPurposes: MasterDataItem[];
|
|
cabinClasses: MasterDataItem[];
|
|
passengerTypes: MasterDataItem[];
|
|
ancillaryPurchases: MasterDataItem[];
|
|
revenueSegments: MasterDataItem[];
|
|
}
|
|
|
|
export async function getAllMasterData(): Promise<AllMasterData> {
|
|
const [
|
|
membershipTiers,
|
|
customerValues,
|
|
regions,
|
|
tripPurposes,
|
|
cabinClasses,
|
|
passengerTypes,
|
|
ancillaryPurchases,
|
|
revenueSegments,
|
|
] = await Promise.all([
|
|
getMembershipTiers(),
|
|
getCustomerValues(),
|
|
getRegions(),
|
|
getTripPurposes(),
|
|
getCabinClasses(),
|
|
getPassengerTypes(),
|
|
getAncillaryPurchases(),
|
|
getRevenueSegments(),
|
|
]);
|
|
|
|
return {
|
|
membershipTiers,
|
|
customerValues,
|
|
regions,
|
|
tripPurposes,
|
|
cabinClasses,
|
|
passengerTypes,
|
|
ancillaryPurchases,
|
|
revenueSegments,
|
|
};
|
|
}
|