change price logic on the ,rule engine ui, auto generate the contrat

This commit is contained in:
marshal
2026-06-08 10:04:23 +03:00
parent 4993453993
commit 88df20be6b
76 changed files with 4907 additions and 225 deletions

View File

@@ -35,6 +35,8 @@ import {
type RejectStepPayload,
} from "./bookings.service";
import type { BookingDetail } from "@/types/booking";
import type { IOverviewDashboard, OverviewRange } from "@/types/overview";
import { overviewService } from "./overview.service";
export const api = {
fileUploadSettings: {
@@ -233,6 +235,20 @@ export const api = {
() => ruleEngineService.getApprovalChain(),
() => QUERY_KEYS.RULE_ENGINE.chain,
),
reorder: endpoint<
{ resource: RuleEngineResourceSlug; payload: { ids: string[]; requiresDirectorApproval?: boolean } },
void
>("rule-engine", "reorder", ({ resource, payload }) =>
ruleEngineService.reorder(resource, payload),
),
moveOrder: endpoint<
{ resource: RuleEngineResourceSlug; id: string; direction: "up" | "down" },
void
>("rule-engine", "moveOrder", ({ resource, id, direction }) =>
ruleEngineService.moveOrder(resource, id, direction),
),
},
bookings: {
@@ -329,4 +345,12 @@ export const api = {
({ id, reason }) => bookingsService.cancel(id, reason),
),
},
overview: {
get: endpoint<{ range?: OverviewRange }, IOverviewDashboard>(
"overview",
"get",
({ range }) => overviewService.getDashboard(range),
),
},
};

View File

@@ -0,0 +1,56 @@
import { api as client } from "../auth/http";
import { unwrap } from "@/utils/endpoint";
import { URL_CONSTANTS } from "@/constants/URLS";
import type {
IOverviewBillingTab,
IOverviewBookingsTab,
IOverviewCustomersTab,
IOverviewDashboard,
IOverviewOperationsTab,
IOverviewStaffTab,
OverviewRange,
} from "@/types/overview";
const O = URL_CONSTANTS.OVERVIEW;
export const overviewService = {
getDashboard: async (range?: OverviewRange): Promise<IOverviewDashboard> => {
const response = await client.get<IOverviewDashboard>(O.BASE, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getBookingsTab: async (range?: OverviewRange): Promise<IOverviewBookingsTab> => {
const response = await client.get<IOverviewBookingsTab>(O.BOOKINGS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getBillingTab: async (range?: OverviewRange): Promise<IOverviewBillingTab> => {
const response = await client.get<IOverviewBillingTab>(O.BILLING, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getOperationsTab: async (): Promise<IOverviewOperationsTab> => {
const response = await client.get<IOverviewOperationsTab>(O.OPERATIONS);
return unwrap(response);
},
getCustomersTab: async (range?: OverviewRange): Promise<IOverviewCustomersTab> => {
const response = await client.get<IOverviewCustomersTab>(O.CUSTOMERS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getStaffTab: async (range?: OverviewRange): Promise<IOverviewStaffTab> => {
const response = await client.get<IOverviewStaffTab>(O.STAFF, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
};

View File

@@ -14,6 +14,14 @@ export interface RuleEngineListParams {
pageSize?: number;
isActive?: boolean;
status?: string;
sortBy?: string;
sortOrder?: "ASC" | "DESC";
requiresDirectorApproval?: boolean;
}
export interface RuleEngineReorderPayload {
ids: string[];
requiresDirectorApproval?: boolean;
}
const RESOURCE_BASE: Record<RuleEngineResourceSlug, string> = {
@@ -59,25 +67,39 @@ const byIdPath = (resource: RuleEngineResourceSlug, id: string): string => {
}
};
const defaultMeta = (dataLength: number, page = 1, pageSize = 20): RuleEngineListMeta => ({
const defaultMeta = (dataLength: number, page = 1, pageSize = 10): RuleEngineListMeta => ({
total: dataLength,
page,
pageSize,
totalPages: Math.max(1, Math.ceil(dataLength / pageSize)),
});
const isPaginatedListResult = <T extends RuleEngineRecord>(
value: unknown,
): value is RuleEngineListResult<T> =>
Boolean(value) &&
typeof value === "object" &&
"data" in value &&
Array.isArray((value as RuleEngineListResult<T>).data);
const normalizeList = <T extends RuleEngineRecord>(
payload: unknown,
page = 1,
pageSize = 20,
pageSize = 10,
): RuleEngineListResult<T> => {
if (isPaginatedListResult<T>(payload)) {
return {
data: payload.data,
meta: payload.meta ?? defaultMeta(payload.data.length, page, pageSize),
};
}
const body = unwrap(payload as { data: unknown }) as unknown;
if (body && typeof body === "object" && "data" in body && Array.isArray((body as RuleEngineListResult<T>).data)) {
const typed = body as RuleEngineListResult<T>;
if (isPaginatedListResult<T>(body)) {
return {
data: typed.data,
meta: typed.meta ?? defaultMeta(typed.data.length, page, pageSize),
data: body.data,
meta: body.meta ?? defaultMeta(body.data.length, page, pageSize),
};
}
@@ -98,7 +120,7 @@ export const ruleEngineService = {
params?: RuleEngineListParams,
): Promise<RuleEngineListResult<T>> => {
const page = params?.page ?? 1;
const pageSize = params?.pageSize ?? 20;
const pageSize = params?.pageSize ?? 10;
const response = await client.get(RESOURCE_BASE[resource], {
params: {
page,
@@ -106,6 +128,9 @@ export const ruleEngineService = {
search: params?.search,
isActive: params?.isActive,
status: params?.status,
sortBy: params?.sortBy,
sortOrder: params?.sortOrder,
requiresDirectorApproval: params?.requiresDirectorApproval,
},
});
return normalizeList<T>(response.data, page, pageSize);
@@ -140,6 +165,21 @@ export const ruleEngineService = {
await client.delete(byIdPath(resource, id));
},
reorder: async (
resource: RuleEngineResourceSlug,
payload: RuleEngineReorderPayload,
): Promise<void> => {
await client.post(`${RESOURCE_BASE[resource]}/reorder`, payload);
},
moveOrder: async (
resource: RuleEngineResourceSlug,
id: string,
direction: "up" | "down",
): Promise<void> => {
await client.post(`${byIdPath(resource, id)}/move-order`, { direction });
},
submitRate: async <T extends RuleEngineRecord>(id: string): Promise<T> => {
const response = await client.post(URL_CONSTANTS.RULE_ENGINE.RATE_SUBMIT(id));
return normalizeEntity<T>(response.data);