diff --git a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/ActionButtons.tsx b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/ActionButtons.tsx index b679e886..7ed9f586 100644 --- a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/ActionButtons.tsx +++ b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/ActionButtons.tsx @@ -79,10 +79,12 @@ export default function ActionButtons() { validateAtKey, data, ); - const updateRequestData = consultationSchema.validateSyncAt( - "update_request", - data, - ); + + const passed = + decisionData.passedConsultationCheck === RadioOptions.YES.value; + const updateRequestData = passed + ? {} + : consultationSchema.validateSyncAt("update_request", data); const requestBody = { form_answers: { ...decisionData, @@ -114,10 +116,12 @@ export default function ActionButtons() { "staff", getValues(), ); - const updateRequestData = consultationSchema.validateSyncAt( - "update_request", - getValues(), - ); + + const passed = + staffDecision.passedConsultationCheck === RadioOptions.YES.value; + const updateRequestData = passed + ? {} + : consultationSchema.validateSyncAt("update_request", getValues()); const requestBody = { status: SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW, @@ -141,14 +145,17 @@ export default function ActionButtons() { const handleCompletingConsultationCheck = async () => { try { setIsCompletingConsultationCheck(true); + const managerDecision = consultationSchema.validateSyncAt( "manager", getValues(), ); - const updateRequestData = consultationSchema.validateSyncAt( - "update_request", - getValues(), - ); + const noDecision = + managerDecision.passedConsultationCheck === RadioOptions.NO.value; + const updateRequestData = noDecision + ? consultationSchema.validateSyncAt("update_request", getValues()) + : {}; + const passed = managerDecision.passedConsultationCheck === RadioOptions.YES.value; const requestBody = { @@ -161,6 +168,7 @@ export default function ActionButtons() { }, type: SUBMISSION_REVIEW_ENTRY_TYPE.MANAGER_CONFIRMATION, }; + await saveSubmissionReview(requestBody); setIsCompletingConsultationCheck(false); notify.success("Consultation Check was completed"); diff --git a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/constants.ts b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/constants.ts index 07dde33e..e22e030a 100644 --- a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/constants.ts +++ b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/constants.ts @@ -1,37 +1,5 @@ import * as yup from "yup"; -export const consultationSchema = yup.object().shape({ - staff: yup.object().shape({ - passedConsultationCheck: yup - .string() - .required("Staff decision is required"), - }), - manager: yup.object().shape({ - passedConsultationCheck: yup - .string() - .required("Manager decision is required"), - }), - update_request: yup - .object() - .when( - ["staff.passedConsultationCheck", "manager.passedConsultationCheck"], - (values: string[], schema: yup.AnyObject) => { - const [staff, manager] = values; - return staff === "NO" && manager !== "YES" - ? schema.shape({ - reason: yup.string().required("Reason is required"), - submission_item_types: yup - .array() - .nullable() - .required("Submission items are required") - .of(yup.number()) - .min(1, "Please select at least one item"), - }) - : schema; - }, - ), -}); - export const RadioOptions = { YES: { label: "Yes, the holder has passed the Consultation Check", @@ -42,3 +10,41 @@ export const RadioOptions = { value: "NO", }, }; + +export const consultationSchema = yup.lazy((value) => { + const baseSchema = { + staff: yup.object().shape({ + passedConsultationCheck: yup + .string() + .required("Staff decision is required"), + }), + manager: yup.object().shape({ + passedConsultationCheck: yup + .string() + .required("Manager decision is required"), + }), + update_request: yup.object().shape({}), + }; + + const no = + value.staff.passedConsultationCheck === RadioOptions.NO.value || + value.manager.passedConsultationCheck === RadioOptions.NO.value; + + if (no) { + return yup.object().shape({ + ...baseSchema, + update_request: yup.object().shape({ + reason: yup.string().required("Reason is required"), + submission_item_types: yup + .array() + .nullable() + .required("Submission items are required") + .typeError("Submission items are required") + .of(yup.number()) + .min(1, "Please select at least one item"), + }), + }); + } + + return yup.object().shape(baseSchema); +}); diff --git a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/index.tsx b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/index.tsx index 261d08e3..3b4dfe5d 100644 --- a/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/index.tsx +++ b/submit-web/src/components/SubmissionItem/ConsultationRecord/ConsultationRecordStaffView/index.tsx @@ -15,11 +15,10 @@ export const ConsultationRecordStaffView = () => { const { projectId: accountProjectIdParam, submissionPackageId, - submissionId: submissionItemId - } = - useParams({ - from: "/staff/_staffLayout/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId", - }); + submissionId: submissionItemId, + } = useParams({ + from: "/staff/_staffLayout/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId", + }); const accountProjectId = Number(accountProjectIdParam); const submissionId = Number(submissionItemId); const { data: accountProject } = useGetAccountProjectForStaff({ @@ -31,7 +30,7 @@ export const ConsultationRecordStaffView = () => { }); const formSubmission = submissionItem?.submissions?.find( - (submission) => submission.type === SUBMISSION_TYPE.FORM + (submission) => submission.type === SUBMISSION_TYPE.FORM, ); const formData = useMemo(() => { @@ -61,14 +60,15 @@ export const ConsultationRecordStaffView = () => { ); const partiesList = - submissionPackage?.meta?.main_condition?.condition_attributes - ?.parties_required_to_be_consulted?.split(",") || []; + submissionPackage?.meta?.main_condition?.condition_attributes?.parties_required_to_be_consulted?.split( + ",", + ) || []; if (!accountProject) return ; return ( - + diff --git a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/ActionButtons.tsx b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/ActionButtons.tsx index 2531d9ab..dfc511af 100644 --- a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/ActionButtons.tsx +++ b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/ActionButtons.tsx @@ -78,10 +78,10 @@ export default function ActionButtons() { validateAtKey, data, ); - const updateRequestData = managementPlanReviewSchema.validateSyncAt( - "update_request", - data, - ); + const passed = decisionData.passedReview === RadioOptions.YES.value; + const updateRequestData = passed + ? {} + : managementPlanReviewSchema.validateSyncAt("update_request", data); const requestBody = { form_answers: { ...decisionData, @@ -114,10 +114,14 @@ export default function ActionButtons() { "staff", getValues(), ); - const updateRequestData = managementPlanReviewSchema.validateSyncAt( - "update_request", - getValues(), - ); + + const passed = staffDecision.passedReview === RadioOptions.YES.value; + const updateRequestData = passed + ? {} + : managementPlanReviewSchema.validateSyncAt( + "update_request", + getValues(), + ); const requestBody = { status: SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW, @@ -146,14 +150,18 @@ export default function ActionButtons() { "manager", getValues(), ); - const updateRequestData = managementPlanReviewSchema.validateSyncAt( - "update_request", - getValues(), - ); + const passed = [ RadioOptions.YES.value, RadioOptions.YES_DEFAULT.value, ].includes(managerDecision.passedReview); + + const updateRequestData = passed + ? {} + : managementPlanReviewSchema.validateSyncAt( + "update_request", + getValues(), + ); const requestBody = { status: passed ? SUBMISSION_REVIEW_STATUS.APPROVED @@ -164,6 +172,7 @@ export default function ActionButtons() { }, type: SUBMISSION_REVIEW_ENTRY_TYPE.MANAGER_CONFIRMATION, }; + await saveSubmissionReview(requestBody); setIsCompletingReview(false); notify.success("Review was completed"); diff --git a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/constants.ts b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/constants.ts index 76756ab0..0210d16e 100644 --- a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/constants.ts +++ b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/ManagementPlanStaffView/constants.ts @@ -1,33 +1,5 @@ import * as yup from "yup"; -export const managementPlanReviewSchema = yup.object().shape({ - staff: yup.object().shape({ - passedReview: yup.string().required("Staff decision is required"), - }), - manager: yup.object().shape({ - passedReview: yup.string().required("Manager decision is required"), - }), - update_request: yup - .object() - .when( - ["staff.passedReview", "manager.passedReview"], - (values: string[], schema: yup.AnyObject) => { - const [staff, manager] = values; - return staff === "NO" && manager !== "YES" - ? schema.shape({ - reason: yup.string().required("Reason is required"), - submission_item_types: yup - .array() - .nullable() - .required("Submission items are required") - .of(yup.number()) - .min(1, "Please select at least one item"), - }) - : schema; - }, - ), -}); - export const RadioOptions = Object.freeze({ YES: { label: "Yes, the holder passed the Management Plan Review", @@ -42,3 +14,37 @@ export const RadioOptions = Object.freeze({ value: "yes_default", }, }); + +export const managementPlanReviewSchema = yup.lazy((value) => { + const baseSchema = { + staff: yup.object().shape({ + passedReview: yup.string().required("Staff decision is required"), + }), + manager: yup.object().shape({ + passedReview: yup.string().required("Manager decision is required"), + }), + update_request: yup.object().shape({}), + }; + + const no = + value.staff.passedReview === RadioOptions.NO.value || + value.manager.passedReview === RadioOptions.NO.value; + + if (no) { + return yup.object().shape({ + ...baseSchema, + update_request: yup.object().shape({ + reason: yup.string().required("Reason is required"), + submission_item_types: yup + .array() + .nullable() + .required("Submission items are required") + .typeError("Submission items are required") + .of(yup.number()) + .min(1, "Please select at least one item"), + }), + }); + } + + return yup.object().shape(baseSchema); +});