Skip to content

Commit 228e546

Browse files
authored
Merge pull request #4031 from Northeastern-Electric-Racing/string-sabo-numbers
sabo numbers can be strings
2 parents fd378f7 + e30ff46 commit 228e546

File tree

13 files changed

+35
-61
lines changed

13 files changed

+35
-61
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Reimbursement_Request" ALTER COLUMN "saboId" SET DATA TYPE TEXT;

src/backend/src/prisma/schema.prisma

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,7 @@ model Receipt {
719719
model Reimbursement_Request {
720720
reimbursementRequestId String @id @default(uuid())
721721
identifier Int
722-
saboId Int? @unique
722+
saboId String? @unique
723723
dateCreated DateTime @default(now())
724724
dateDeleted DateTime?
725725
dateOfExpense DateTime?
@@ -804,7 +804,7 @@ model Vendor {
804804
organizationId String
805805
organization Organization @relation(fields: [organizationId], references: [organizationId])
806806
username String?
807-
password String? // password is encrypted
807+
password String? // password is encrypted
808808
discountCode String?
809809
twoFactorContacts User[] @relation(name: "twoFactorContactVendors")
810810
notes String?

src/backend/src/prisma/seed-data/reimbursement-requests.seed.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ export const seedReimbursementRequests = async (
13141314
organization,
13151315
new Date('2024-07-15')
13161316
);
1317-
await ReimbursementRequestService.setSaboNumber(rr30.reimbursementRequestId, 12345, users.richieRich, organization);
1317+
await ReimbursementRequestService.setSaboNumber(rr30.reimbursementRequestId, 'abc123', users.richieRich, organization);
13181318
await ReimbursementRequestService.inputReimbursementRequestInSabo(
13191319
rr30.reimbursementRequestId,
13201320
users.richieRich,
@@ -1382,7 +1382,7 @@ export const seedReimbursementRequests = async (
13821382
organization,
13831383
new Date('2024-07-18')
13841384
);
1385-
await ReimbursementRequestService.setSaboNumber(rr31.reimbursementRequestId, 12346, users.mrKrabs, organization);
1385+
await ReimbursementRequestService.setSaboNumber(rr31.reimbursementRequestId, 'sdfkj3', users.mrKrabs, organization);
13861386
await ReimbursementRequestService.inputReimbursementRequestInSabo(
13871387
rr31.reimbursementRequestId,
13881388
users.mrKrabs,
@@ -1450,7 +1450,7 @@ export const seedReimbursementRequests = async (
14501450
organization,
14511451
new Date('2024-06-10')
14521452
);
1453-
await ReimbursementRequestService.setSaboNumber(rr32.reimbursementRequestId, 12340, users.monopolyMan, organization);
1453+
await ReimbursementRequestService.setSaboNumber(rr32.reimbursementRequestId, '324jj', users.monopolyMan, organization);
14541454
await ReimbursementRequestService.inputReimbursementRequestInSabo(
14551455
rr32.reimbursementRequestId,
14561456
users.monopolyMan,
@@ -1523,7 +1523,7 @@ export const seedReimbursementRequests = async (
15231523
organization,
15241524
new Date('2024-05-20')
15251525
);
1526-
await ReimbursementRequestService.setSaboNumber(rr33.reimbursementRequestId, 12335, users.johnBoddy, organization);
1526+
await ReimbursementRequestService.setSaboNumber(rr33.reimbursementRequestId, 'kaljf23', users.johnBoddy, organization);
15271527
await ReimbursementRequestService.inputReimbursementRequestInSabo(
15281528
rr33.reimbursementRequestId,
15291529
users.johnBoddy,
@@ -1596,7 +1596,7 @@ export const seedReimbursementRequests = async (
15961596
organization,
15971597
new Date('2024-05-08')
15981598
);
1599-
await ReimbursementRequestService.setSaboNumber(rr34.reimbursementRequestId, 12330, users.richieRich, organization);
1599+
await ReimbursementRequestService.setSaboNumber(rr34.reimbursementRequestId, 'newklajfd', users.richieRich, organization);
16001600
await ReimbursementRequestService.inputReimbursementRequestInSabo(
16011601
rr34.reimbursementRequestId,
16021602
users.richieRich,

src/backend/src/routes/reimbursement-requests.routes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,14 @@ reimbursementRequestsRouter.get('/pending-advisor/list', ReimbursementRequestCon
157157
reimbursementRequestsRouter.post(
158158
'/pending-advisor/send',
159159
body('saboNumbers').isArray(),
160-
intMinZero(body('saboNumbers.*')),
160+
nonEmptyString(body('saboNumbers.*')),
161161
validateInputs,
162162
ReimbursementRequestController.sendPendingAdvisorList
163163
);
164164

165165
reimbursementRequestsRouter.post(
166166
'/:requestId/set-sabo-number',
167-
intMinZero(body('saboNumber')),
167+
nonEmptyString(body('saboNumber')),
168168
validateInputs,
169169
ReimbursementRequestController.setSaboNumber
170170
);

src/backend/src/services/reimbursement-requests.services.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ export default class ReimbursementRequestService {
612612
* @param saboNumbers the sabo numbers of the reimbursement requests to send
613613
* @param organizationId the organization the user is currently in
614614
*/
615-
static async sendPendingAdvisorList(sender: User, saboNumbers: number[], organizationId: string) {
615+
static async sendPendingAdvisorList(sender: User, saboNumbers: string[], organizationId: string) {
616616
const organization = await prisma.organization.findUnique({
617617
where: { organizationId },
618618
include: { advisor: true }
@@ -688,7 +688,7 @@ export default class ReimbursementRequestService {
688688

689689
static async setSaboNumber(
690690
reimbursementRequestId: string,
691-
saboNumber: number,
691+
saboNumber: string,
692692
submitter: User,
693693
organization: Organization
694694
) {

src/frontend/src/apis/finance.api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export const getPendingAdvisorList = () => {
362362
* @param requestId the request ID
363363
* @param saboNumber the SABO number to set
364364
*/
365-
export const setSaboNumber = async (requestId: string, saboNumber: number) => {
365+
export const setSaboNumber = async (requestId: string, saboNumber: string) => {
366366
axios.post(apiUrls.financeSetSaboNumber(requestId), {
367367
saboNumber
368368
});
@@ -374,7 +374,7 @@ export const setSaboNumber = async (requestId: string, saboNumber: number) => {
374374
* @param saboNumbers The sabo numbers of the reimbursement requests to request approval for
375375
* @returns the response from the backend
376376
*/
377-
export const sendPendingAdvisorList = (saboNumbers: number[]) => {
377+
export const sendPendingAdvisorList = (saboNumbers: string[]) => {
378378
return axios.post(apiUrls.financeSendPendingAdvisorList(), {
379379
saboNumbers
380380
});

src/frontend/src/hooks/finance.hooks.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -794,9 +794,9 @@ export const useGetPendingAdvisorList = () => {
794794
* @returns the mutation to send the pending advisor list
795795
*/
796796
export const useSendPendingAdvisorList = () => {
797-
return useMutation<{ message: string }, Error, number[]>(
797+
return useMutation<{ message: string }, Error, string[]>(
798798
['reimbursement-requests', 'send-pending-advisor'],
799-
async (saboNumbers: number[]) => {
799+
async (saboNumbers: string[]) => {
800800
const { data } = await sendPendingAdvisorList(saboNumbers);
801801
return data;
802802
}
@@ -846,9 +846,9 @@ export const useEditRefund = (id: string) => {
846846
*/
847847
export const useSetSaboNumber = (reimbursementRequestId: string) => {
848848
const queryClient = useQueryClient();
849-
return useMutation<void, Error, { saboNumber: number }>(
849+
return useMutation<void, Error, { saboNumber: string }>(
850850
['reimbursement-requests', reimbursementRequestId],
851-
async (formData: { saboNumber: number }) => {
851+
async (formData: { saboNumber: string }) => {
852852
await setSaboNumber(reimbursementRequestId, formData.saboNumber);
853853
},
854854
{

src/frontend/src/pages/FinancePage/FinanceComponents/PendingAdvisorListModal.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ const CommaSeparatedNumbersInput = ({
1515
onChange,
1616
error
1717
}: {
18-
value: number[];
19-
onChange: (saboNumbers: number[]) => void;
18+
value: string[];
19+
onChange: (saboNumbers: string[]) => void;
2020
error: Merge<FieldError, (FieldError | undefined)[]> | undefined;
2121
}) => {
2222
const [inputValue, setInputValue] = useState<string>(value.join(', '));
@@ -25,11 +25,8 @@ const CommaSeparatedNumbersInput = ({
2525
const inputValue = e.target.value;
2626
setInputValue(inputValue);
2727

28-
// Split the input string by commas and parse each number
29-
const saboNumbers = inputValue
30-
.split(',')
31-
.map((saboNumber) => parseInt(saboNumber.trim()))
32-
.filter((num) => !isNaN(num)); // Filter out NaN values
28+
// Split the input string by commas
29+
const saboNumbers = inputValue.split(',');
3330

3431
onChange(saboNumbers);
3532
};
@@ -49,12 +46,12 @@ const CommaSeparatedNumbersInput = ({
4946
};
5047

5148
const schema = yup.object().shape({
52-
saboNumbers: yup.array().of(yup.number().required('SABO Number is required')).required('SABO Numbers are required')
49+
saboNumbers: yup.array().of(yup.string().required('SABO Number is required')).required('SABO Numbers are required')
5350
});
5451

5552
interface PendingAdvisorModalProps {
5653
open: boolean;
57-
saboNumbers: number[];
54+
saboNumbers: string[];
5855
onHide: () => void;
5956
}
6057
const PendingAdvisorModal: React.FC<PendingAdvisorModalProps> = ({ open, saboNumbers, onHide }) => {
@@ -74,7 +71,7 @@ const PendingAdvisorModal: React.FC<PendingAdvisorModalProps> = ({ open, saboNum
7471

7572
const toast = useToast();
7673

77-
const onSubmit = async (data: { saboNumbers: number[] }) => {
74+
const onSubmit = async (data: { saboNumbers: string[] }) => {
7875
try {
7976
await sendPendingAdvisorList(data.saboNumbers);
8077
} catch (error: unknown) {

src/frontend/src/pages/FinancePage/FinanceComponents/ReimbursementRequestInfo.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,7 @@ import { useLocation, useHistory, useParams } from 'react-router-dom';
33
import { useState, useEffect } from 'react';
44
import { isGuest, ReimbursementRequest } from 'shared';
55
import { ReimbursementProduct, ReimbursementStatusType } from 'shared';
6-
import {
7-
undefinedPipe,
8-
fullNamePipe,
9-
centsToDollar,
10-
datePipe,
11-
dateUndefinedPipe,
12-
formatSaboIdPipe
13-
} from '../../../utils/pipes';
6+
import { undefinedPipe, fullNamePipe, centsToDollar, datePipe, dateUndefinedPipe } from '../../../utils/pipes';
147
import {
158
createReimbursementRequestRowData,
169
cleanReimbursementRequestStatus
@@ -161,7 +154,7 @@ const ReimbursementRequestInfo = ({
161154
headerName: 'SABO ID',
162155
flex: 0.5,
163156
minWidth: 100,
164-
valueGetter: (params: any) => formatSaboIdPipe(params.row.saboId)
157+
valueGetter: (params: any) => params.row.saboId
165158
},
166159
{
167160
field: 'dateSubmitted',

src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/AddSABONumberModal.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,7 @@ import { useSetSaboNumber } from '../../../hooks/finance.hooks';
88
import { useToast } from '../../../hooks/toasts.hooks';
99

1010
const schema = yup.object({
11-
saboNumber: yup
12-
.number()
13-
.typeError('The SABO number should be a valid number')
14-
.required('The SABO number is required')
15-
.test('exact-5-digits', 'The SABO number must be exactly 5 digits', function () {
16-
const original = this.originalValue?.toString().trim();
17-
return /^\d{5}$/.test(original || '');
18-
})
11+
saboNumber: yup.string().required('The SABO number is required')
1912
});
2013

2114
interface AddSABONumberModalProps {
@@ -33,12 +26,12 @@ const AddSABONumberModal = ({ modalShow, onHide, reimbursementRequestId }: AddSA
3326
control,
3427
formState: { errors, isValid },
3528
reset
36-
} = useForm<{ saboNumber: number }>({
29+
} = useForm<{ saboNumber: string }>({
3730
resolver: yupResolver(schema),
3831
mode: 'onChange'
3932
});
4033

41-
const onSubmit = async (data: { saboNumber: number }) => {
34+
const onSubmit = async (data: { saboNumber: string }) => {
4235
try {
4336
await setSaboNumber(data);
4437
} catch (error: unknown) {

0 commit comments

Comments
 (0)