feat(G1,P16A,P16B): 收口主数据核心与节假日日历增强
这个提交包含在:
@@ -0,0 +1,347 @@
|
||||
import { apiRequestData } from "./http";
|
||||
|
||||
export type DocumentCategoryEntityType =
|
||||
| "reimbursement"
|
||||
| "leave"
|
||||
| "purchase_request"
|
||||
| "asset_card"
|
||||
| "general";
|
||||
|
||||
export type DocumentResetPeriod = "none" | "daily" | "monthly" | "yearly";
|
||||
export type HolidayCalendarDayType = "holiday" | "workday" | "adjusted_workday";
|
||||
|
||||
export type LegalEntityItem = {
|
||||
id: string;
|
||||
code: string;
|
||||
name: string;
|
||||
shortName: string | null;
|
||||
currencyCode: string;
|
||||
taxNo: string | null;
|
||||
enabled: boolean;
|
||||
archivedAt: string | null;
|
||||
createdAt: string | null;
|
||||
updatedAt: string | null;
|
||||
};
|
||||
|
||||
export type CostCenterItem = {
|
||||
id: string;
|
||||
legalEntityId: string;
|
||||
code: string;
|
||||
name: string;
|
||||
parentId: string | null;
|
||||
ownerEmployeeId: string | null;
|
||||
enabled: boolean;
|
||||
archivedAt: string | null;
|
||||
createdAt: string | null;
|
||||
updatedAt: string | null;
|
||||
legalEntity: {
|
||||
id: string;
|
||||
code: string;
|
||||
name: string;
|
||||
} | null;
|
||||
parent: {
|
||||
id: string;
|
||||
name: string;
|
||||
} | null;
|
||||
owner: {
|
||||
id: string;
|
||||
employeeNo: string;
|
||||
name: string;
|
||||
} | null;
|
||||
};
|
||||
|
||||
export type DocumentCategoryItem = {
|
||||
id: string;
|
||||
code: string;
|
||||
name: string;
|
||||
entityType: DocumentCategoryEntityType;
|
||||
sequencePrefix: string;
|
||||
numberLength: number;
|
||||
resetPeriod: DocumentResetPeriod;
|
||||
defaultWorkflowKey: string | null;
|
||||
enabled: boolean;
|
||||
archivedAt: string | null;
|
||||
createdAt: string | null;
|
||||
updatedAt: string | null;
|
||||
};
|
||||
|
||||
export type HolidayCalendarItem = {
|
||||
id: string;
|
||||
code: string;
|
||||
name: string;
|
||||
timezone: string;
|
||||
legalEntityId: string | null;
|
||||
enabled: boolean;
|
||||
archivedAt: string | null;
|
||||
createdAt: string | null;
|
||||
updatedAt: string | null;
|
||||
daysCount: number;
|
||||
isDefaultForLegalEntity: boolean;
|
||||
legalEntity: {
|
||||
id: string;
|
||||
code: string;
|
||||
name: string;
|
||||
} | null;
|
||||
};
|
||||
|
||||
export type HolidayCalendarDayItem = {
|
||||
id: string;
|
||||
date: string;
|
||||
dayType: HolidayCalendarDayType;
|
||||
name: string;
|
||||
note: string | null;
|
||||
createdAt: string | null;
|
||||
updatedAt: string | null;
|
||||
};
|
||||
|
||||
export type MasterDataListResponse<T> = {
|
||||
includeArchived: boolean;
|
||||
items: T[];
|
||||
};
|
||||
|
||||
function toQueryString(query: Record<string, string | boolean | undefined>) {
|
||||
const params = new URLSearchParams();
|
||||
for (const [key, value] of Object.entries(query)) {
|
||||
if (value == null || value === "") {
|
||||
continue;
|
||||
}
|
||||
params.set(key, typeof value === "boolean" ? String(value) : value);
|
||||
}
|
||||
const encoded = params.toString();
|
||||
return encoded ? `?${encoded}` : "";
|
||||
}
|
||||
|
||||
export async function fetchLegalEntities(params: { includeArchived?: boolean; enabled?: boolean } = {}) {
|
||||
return apiRequestData<MasterDataListResponse<LegalEntityItem>>(
|
||||
`/api/master-data/legal-entities${toQueryString(params as Record<string, string | boolean | undefined>)}`,
|
||||
);
|
||||
}
|
||||
|
||||
export async function createLegalEntity(payload: {
|
||||
code: string;
|
||||
name: string;
|
||||
shortName?: string | null;
|
||||
currencyCode: string;
|
||||
taxNo?: string | null;
|
||||
enabled?: boolean;
|
||||
}) {
|
||||
return apiRequestData<{ legalEntity: LegalEntityItem }>("/api/master-data/legal-entities", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
|
||||
export async function patchLegalEntity(
|
||||
legalEntityId: string,
|
||||
payload: Partial<{
|
||||
code: string;
|
||||
name: string;
|
||||
shortName: string | null;
|
||||
currencyCode: string;
|
||||
taxNo: string | null;
|
||||
enabled: boolean;
|
||||
}>,
|
||||
) {
|
||||
return apiRequestData<{ legalEntity: LegalEntityItem }>(`/api/master-data/legal-entities/${legalEntityId}`, {
|
||||
method: "PATCH",
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
|
||||
export async function archiveLegalEntity(legalEntityId: string) {
|
||||
return apiRequestData<{ legalEntity: LegalEntityItem; outcome: string }>(
|
||||
`/api/master-data/legal-entities/${legalEntityId}/archive`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({}),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function fetchCostCenters(params: {
|
||||
includeArchived?: boolean;
|
||||
enabled?: boolean;
|
||||
legalEntityId?: string;
|
||||
} = {}) {
|
||||
return apiRequestData<MasterDataListResponse<CostCenterItem>>(
|
||||
`/api/master-data/cost-centers${toQueryString(params as Record<string, string | boolean | undefined>)}`,
|
||||
);
|
||||
}
|
||||
|
||||
export async function createCostCenter(payload: {
|
||||
legalEntityId: string;
|
||||
code: string;
|
||||
name: string;
|
||||
parentId?: string | null;
|
||||
ownerEmployeeId?: string | null;
|
||||
enabled?: boolean;
|
||||
}) {
|
||||
return apiRequestData<{ costCenter: CostCenterItem }>("/api/master-data/cost-centers", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
|
||||
export async function patchCostCenter(
|
||||
costCenterId: string,
|
||||
payload: Partial<{
|
||||
legalEntityId: string;
|
||||
code: string;
|
||||
name: string;
|
||||
parentId: string | null;
|
||||
ownerEmployeeId: string | null;
|
||||
enabled: boolean;
|
||||
}>,
|
||||
) {
|
||||
return apiRequestData<{ costCenter: CostCenterItem }>(`/api/master-data/cost-centers/${costCenterId}`, {
|
||||
method: "PATCH",
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
|
||||
export async function archiveCostCenter(costCenterId: string) {
|
||||
return apiRequestData<{ costCenter: CostCenterItem; outcome: string }>(
|
||||
`/api/master-data/cost-centers/${costCenterId}/archive`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({}),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function fetchDocumentCategories(params: {
|
||||
includeArchived?: boolean;
|
||||
enabled?: boolean;
|
||||
entityType?: DocumentCategoryEntityType;
|
||||
} = {}) {
|
||||
return apiRequestData<MasterDataListResponse<DocumentCategoryItem>>(
|
||||
`/api/master-data/document-categories${toQueryString(params as Record<string, string | boolean | undefined>)}`,
|
||||
);
|
||||
}
|
||||
|
||||
export async function createDocumentCategory(payload: {
|
||||
code: string;
|
||||
name: string;
|
||||
entityType: DocumentCategoryEntityType;
|
||||
sequencePrefix: string;
|
||||
numberLength?: number;
|
||||
resetPeriod: DocumentResetPeriod;
|
||||
defaultWorkflowKey?: string | null;
|
||||
enabled?: boolean;
|
||||
}) {
|
||||
return apiRequestData<{ documentCategory: DocumentCategoryItem }>(
|
||||
"/api/master-data/document-categories",
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function patchDocumentCategory(
|
||||
documentCategoryId: string,
|
||||
payload: Partial<{
|
||||
code: string;
|
||||
name: string;
|
||||
entityType: DocumentCategoryEntityType;
|
||||
sequencePrefix: string;
|
||||
numberLength: number;
|
||||
resetPeriod: DocumentResetPeriod;
|
||||
defaultWorkflowKey: string | null;
|
||||
enabled: boolean;
|
||||
}>,
|
||||
) {
|
||||
return apiRequestData<{ documentCategory: DocumentCategoryItem }>(
|
||||
`/api/master-data/document-categories/${documentCategoryId}`,
|
||||
{
|
||||
method: "PATCH",
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function archiveDocumentCategory(documentCategoryId: string) {
|
||||
return apiRequestData<{ documentCategory: DocumentCategoryItem; outcome: string }>(
|
||||
`/api/master-data/document-categories/${documentCategoryId}/archive`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({}),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function fetchHolidayCalendars(params: {
|
||||
includeArchived?: boolean;
|
||||
enabled?: boolean;
|
||||
legalEntityId?: string;
|
||||
} = {}) {
|
||||
return apiRequestData<MasterDataListResponse<HolidayCalendarItem>>(
|
||||
`/api/master-data/holiday-calendars${toQueryString(params as Record<string, string | boolean | undefined>)}`,
|
||||
);
|
||||
}
|
||||
|
||||
export async function createHolidayCalendar(payload: {
|
||||
code: string;
|
||||
name: string;
|
||||
timezone?: string;
|
||||
legalEntityId?: string | null;
|
||||
enabled?: boolean;
|
||||
}) {
|
||||
return apiRequestData<{ holidayCalendar: HolidayCalendarItem }>("/api/master-data/holiday-calendars", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
|
||||
export async function patchHolidayCalendar(
|
||||
holidayCalendarId: string,
|
||||
payload: Partial<{
|
||||
code: string;
|
||||
name: string;
|
||||
timezone: string;
|
||||
legalEntityId: string | null;
|
||||
enabled: boolean;
|
||||
}>,
|
||||
) {
|
||||
return apiRequestData<{ holidayCalendar: HolidayCalendarItem }>(
|
||||
`/api/master-data/holiday-calendars/${holidayCalendarId}`,
|
||||
{
|
||||
method: "PATCH",
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function archiveHolidayCalendar(holidayCalendarId: string) {
|
||||
return apiRequestData<{ holidayCalendar: HolidayCalendarItem; outcome: string }>(
|
||||
`/api/master-data/holiday-calendars/${holidayCalendarId}/archive`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({}),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export async function fetchHolidayCalendarDays(holidayCalendarId: string) {
|
||||
return apiRequestData<{ items: HolidayCalendarDayItem[] }>(
|
||||
`/api/master-data/holiday-calendars/${holidayCalendarId}/days`,
|
||||
);
|
||||
}
|
||||
|
||||
export async function replaceHolidayCalendarDays(
|
||||
holidayCalendarId: string,
|
||||
items: Array<{
|
||||
date: string;
|
||||
dayType: HolidayCalendarDayType;
|
||||
name: string;
|
||||
note?: string | null;
|
||||
}>,
|
||||
) {
|
||||
return apiRequestData<{ holidayCalendarId: string; replacedCount: number }>(
|
||||
`/api/master-data/holiday-calendars/${holidayCalendarId}/days`,
|
||||
{
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ items }),
|
||||
},
|
||||
);
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户