diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index ea2dfee..0ceebaf 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -13,7 +13,7 @@ import { Filter } from "@/services/types"; import { useAppDispatch, useAppSelector } from "@/lib/hooks"; import { setFilter } from "@/lib/slice/filter"; import { format } from "date-fns"; -import { useGetFilterOptionsQuery } from "@/services/api"; +import { useGetFilterOptionsQuery, useGetOrganizationsMapQuery } from "@/services/api"; import { NeedLoginRoute } from "../RouteGuard"; import { useLocale } from "@/lib/hooks/useLocale"; import { LanguageSwitcher } from "@/components/LanguageSwitcher"; @@ -24,6 +24,7 @@ export default function DashboardLayout({children}:{children: React.ReactNode}) const pathname = usePathname(); const dispatch = useAppDispatch(); const filter = useAppSelector((state) => state.filter.filter); + const {data: orgMap } = useGetOrganizationsMapQuery(); const {data: filterOptions } = useGetFilterOptionsQuery(filter); const [region, setRegion] = React.useState(""); const { t } = useLocale(); diff --git a/src/services/api.ts b/src/services/api.ts index 68e74b5..3729190 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,11 +1,60 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' -import { AttendanceRange, AttendanceSummary, CostData, EmployeeMovement, EmployeeSummary, FilterOptions, HrCost, HrCostByJob, HrCostByOrganization, HrCostPerMonth, HrCostPerEmployee, MonthlyAttendance, MonthlyEmployee, MppRecruitment, ProductivityByAge, ProductivityByRegion, ProductivityByTenure, ResignationCategory, ResignationReason, ResignationType as ResignationType, ResignSummary, SanctionSummary, TargetTonnage, TonnageHarvestGroupEmployee, TonnageHarvestByEmployeeOrigin, TonnageHarvestByEmployeeSalary, User } from './types' +import { AttendanceRange, AttendanceSummary, CostData, EmployeeMovement, EmployeeSummary, FilterOptions, HrCost, HrCostByJob, HrCostByOrganization, HrCostPerMonth, HrCostPerEmployee, MonthlyAttendance, MonthlyEmployee, MppRecruitment, ProductivityByAge, ProductivityByRegion, ProductivityByTenure, ResignationCategory, ResignationReason, ResignationType as ResignationType, ResignSummary, SanctionSummary, TargetTonnage, TonnageHarvestGroupEmployee, TonnageHarvestByEmployeeOrigin, TonnageHarvestByEmployeeSalary, User, OrganizationMap } from './types' import { Response , Filter} from './types' import { config } from '@/config'; +const rawBaseQuery = fetchBaseQuery({ baseUrl: config.api.baseApiUrl }); +const baseQuery = async (args:any, api:any, extraOptions:any) => { + const result = await rawBaseQuery(args, api, extraOptions) + + if (result.data && typeof args === 'object' && typeof args.url === 'string') { + const url = args.url + + // Match /dashboard/* but exclude /dashboard/filter-options + const shouldTranslate = + url.startsWith('/dashboard') && !url.startsWith('/dashboard/filter-options') + + if (shouldTranslate) { + // Get cached organization map data + const orgMap = + api.getState().api.queries['getOrganizationsMap(undefined)']?.data ?? [] + + if (orgMap.length > 0) { + // Build a fast lookup table for translation + const orgLookup = Object.fromEntries( + orgMap.map((org: OrganizationMap) => [org.value, org.sap_code || org.value]) + ) + + // Helper: recursively find and translate organization_code + const translateOrgCode = (obj: any): any => { + if (Array.isArray(obj)) return obj.map(translateOrgCode) + if (obj && typeof obj === 'object') { + const newObj: Record = {} + for (const [key, val] of Object.entries(obj)) { + if (key === 'organization_code' && typeof val === 'string') { + // ✅ Find by sap_code and replace with its value + const mappedOrg = orgMap.find((org: any) => org.sap_code === val) + newObj[key] = mappedOrg?.value || val + } else { + newObj[key] = translateOrgCode(val) + } + } + return newObj + } + return obj + } + + + result.data = translateOrgCode(result.data) + } + } + } + + return result +} export const api = createApi({ - baseQuery: fetchBaseQuery({ baseUrl: config.api.baseApiUrl }), + baseQuery, endpoints: (builder) => ({ login: builder.mutation<{ user: User; @@ -35,6 +84,14 @@ export const api = createApi({ } }, }), + getOrganizationsMap: builder.query({ + query: () => '/organizations-map', + transformResponse: (response: Response) => { + if (response.status === "success") { + return response.data!; + } + }, + }), getFilterOptions: builder.query({ query: (params) => ({ url: '/dashboard/filter-options', params }), transformResponse: (response: Response) => { @@ -256,7 +313,7 @@ export const api = createApi({ }), }) -export const { useGetFilterOptionsQuery, useGetEmployeeSummaryQuery, useGetMonthlyEmployeeQuery, useGetMonthlyAttendanceQuery, +export const { useGetOrganizationsMapQuery, useGetFilterOptionsQuery, useGetEmployeeSummaryQuery, useGetMonthlyEmployeeQuery, useGetMonthlyAttendanceQuery, useGetOrganizationAttendanceQuery, useGetAttendanceRangeQuery, useGetResignSummaryQuery, useGetResignTypeQuery, useLazyGetMonthlyEmployeeQuery, useLoginMutation, useAuthCheckQuery, useGetSanctionSummaryQuery, useGetResignCategoryQuery, useGetResignReasonQuery, useGetEmployeeMovementQuery, useGetMppRecruitmentQuery, diff --git a/src/services/types.ts b/src/services/types.ts index 18fca1b..06e3391 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -204,4 +204,9 @@ export type CostData = { estate_name: string; date: string; amount: number; +} + +export type OrganizationMap = { + value: string; + sap_code: string; } \ No newline at end of file