From 3dd56f094c0f53dbbd7cb68d5d8f0a8c32a19950 Mon Sep 17 00:00:00 2001 From: shancds Date: Tue, 20 May 2025 14:30:58 +0530 Subject: [PATCH] feat(ratecard): add currency field to rate card queries and update logic --- .../src/controllers/ratecard-controller.ts | 10 +++---- .../src/features/finance/finance-slice.ts | 1 + .../ratecard-drawer/ratecard-drawer.tsx | 26 +++++++------------ 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/worklenz-backend/src/controllers/ratecard-controller.ts b/worklenz-backend/src/controllers/ratecard-controller.ts index 497a6869..d8e9e851 100644 --- a/worklenz-backend/src/controllers/ratecard-controller.ts +++ b/worklenz-backend/src/controllers/ratecard-controller.ts @@ -29,7 +29,7 @@ public static async get(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise< ( SELECT COALESCE(ARRAY_TO_JSON(ARRAY_AGG(ROW_TO_JSON(t))), '[]'::JSON) FROM ( - SELECT id, name, team_id, created_at, updated_at + SELECT id, name, team_id, currency, created_at, updated_at FROM finance_rate_cards WHERE team_id = $1 ${searchQuery} ORDER BY ${sortField} ${sortOrder} @@ -49,7 +49,7 @@ public static async get(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise< @HandleExceptions() public static async getById(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = ` - SELECT id, name, team_id, created_at, updated_at + SELECT id, name, team_id, currency, created_at, updated_at FROM finance_rate_cards WHERE id = $1 AND team_id = $2; `; @@ -62,11 +62,11 @@ public static async get(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise< public static async update(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = ` UPDATE finance_rate_cards - SET name = $3, updated_at = NOW() + SET name = $3, currency = $4, updated_at = NOW() WHERE id = $1 AND team_id = $2 - RETURNING id, name, team_id, created_at, updated_at; + RETURNING id, name, team_id, currency, created_at, updated_at; `; - const result = await db.query(q, [req.params.id, req.user?.team_id || null, req.body.name]); + const result = await db.query(q, [req.params.id, req.user?.team_id || null, req.body.name, req.body.currency]); const [data] = result.rows; return res.status(200).send(new ServerResponse(true, data)); } diff --git a/worklenz-frontend/src/features/finance/finance-slice.ts b/worklenz-frontend/src/features/finance/finance-slice.ts index 3cc011f0..39432d43 100644 --- a/worklenz-frontend/src/features/finance/finance-slice.ts +++ b/worklenz-frontend/src/features/finance/finance-slice.ts @@ -87,6 +87,7 @@ export const updateRateCard = createAsyncThunk( async ({ id, body }: { id: string; body: RatecardType }, { rejectWithValue }) => { try { const response = await rateCardApiService.updateRateCard(id, body); + console.log('response', response); return response.body; } catch (error) { logger.error('Update RateCard', error); diff --git a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx index f069453a..d6fc0984 100644 --- a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx +++ b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx @@ -3,14 +3,12 @@ import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useAppSelector } from '../../../hooks/useAppSelector'; import { useAppDispatch } from '../../../hooks/useAppDispatch'; -import { fetchData } from '../../../utils/fetchData'; import { fetchRateCardById, fetchRateCards, toggleRatecardDrawer, updateRateCard } from '../finance-slice'; import { RatecardType, IJobType } from '@/types/project/ratecard.types'; import { IJobTitlesViewModel } from '@/types/job.types'; import { DEFAULT_PAGE_SIZE } from '@/shared/constants'; import { jobTitlesApiService } from '@/api/settings/job-titles/job-titles.api.service'; import { DeleteOutlined } from '@ant-design/icons'; -import { rateCardApiService } from '@/api/settings/rate-cards/rate-cards.api.service'; interface PaginationType { current: number; @@ -36,20 +34,16 @@ const RatecardDrawer = ({ const { t } = useTranslation('settings/ratecard-settings'); // get drawer state from client reducer - const drawerLoading = useAppSelector(state => state.financeReducer.drawerLoading); + const drawerLoading = useAppSelector(state => state.financeReducer.isFinanceDrawerloading); const drawerRatecard = useAppSelector(state => state.financeReducer.drawerRatecard); const isDrawerOpen = useAppSelector( (state) => state.financeReducer.isRatecardDrawerOpen ); - // get currently using currency from finance reducer - const cur = useAppSelector( - (state) => state.financeReducer.currency - ).toUpperCase(); const dispatch = useAppDispatch(); const [isAddingRole, setIsAddingRole] = useState(false); const [selectedJobTitleId, setSelectedJobTitleId] = useState(undefined); const [searchQuery, setSearchQuery] = useState(''); - const [currency, setCurrency] = useState(cur); + const [currency, setCurrency] = useState('LKR'); const [name, setName] = useState('Untitled Rate Card'); const [jobTitles, setJobTitles] = useState({}); const [pagination, setPagination] = useState({ @@ -99,7 +93,7 @@ const RatecardDrawer = ({ if (type === 'update' && drawerRatecard) { setRoles(drawerRatecard.jobRolesList || []); setName(drawerRatecard.name || ''); - setCurrency(drawerRatecard.currency || cur); + setCurrency(drawerRatecard.currency || 'LKR'); } }, [drawerRatecard, type]); @@ -119,11 +113,11 @@ const RatecardDrawer = ({ const jobTitle = jobTitles.data?.find(jt => jt.id === jobTitleId); if (jobTitle) { const newRole = { - jobId: jobTitleId, + rate_card_id: jobTitleId, jobTitle: jobTitle.name || 'New Role', ratePerHour: 0, }; - setRoles([...roles, newRole]); + // setRoles([...roles, newRole]); } setIsAddingRole(false); setSelectedJobTitleId(undefined); @@ -239,13 +233,13 @@ const RatecardDrawer = ({ {t('currency')}