diff --git a/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx b/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx index c40a18844b..37e11236bc 100644 --- a/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx +++ b/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx @@ -88,7 +88,9 @@ export const PermitRowOptions = ({ navigate(routes.ERROR_ROUTES.DOCUMENT_UNAVAILABLE), ); } else if (selectedOption === PERMIT_ACTION_TYPES.VOID_REVOKE) { - navigate(`${routes.PERMITS_ROUTES.VOID(companyId, permitId)}`); + navigate(`${routes.PERMITS_ROUTES.VOID(companyId, permitId)}`, { + state: { permitActionOrigin }, + }); } else if (selectedOption === PERMIT_ACTION_TYPES.AMEND) { // Sets the companyId and permitId of the permit to be amended, // which will in turn look for any existing associated amendment applications, diff --git a/frontend/src/features/permits/hooks/useAttemptAmend.ts b/frontend/src/features/permits/hooks/useAttemptAmend.ts index 39f97faa8d..d1388d5672 100644 --- a/frontend/src/features/permits/hooks/useAttemptAmend.ts +++ b/frontend/src/features/permits/hooks/useAttemptAmend.ts @@ -60,6 +60,7 @@ export const useAttemptAmend = (permitActionOrigin: PermitActionOrigin) => { }; const { mutateAsync: deleteApplications } = useDeleteApplicationsMutation(); + const deleteAmendmentApplication = async ( companyOfAmendment: number, amendmentApplicationId: string, @@ -71,6 +72,7 @@ export const useAttemptAmend = (permitActionOrigin: PermitActionOrigin) => { }; const existingAmendmentApplicationId = existingAmendmentApplication?.permitId; + const handleStartNewAmendment = useCallback(async () => { if (existingAmendmentApplicationId) { const deleteExistingResult = await deleteAmendmentApplication( diff --git a/frontend/src/features/permits/pages/Void/FinishVoid.tsx b/frontend/src/features/permits/pages/Void/FinishVoid.tsx index efd0f44353..9116941f08 100644 --- a/frontend/src/features/permits/pages/Void/FinishVoid.tsx +++ b/frontend/src/features/permits/pages/Void/FinishVoid.tsx @@ -4,7 +4,11 @@ import { useParams } from "react-router-dom"; import { VoidPermitContext } from "./context/VoidPermitContext"; import { RefundFormData } from "../Refund/types/RefundFormData"; import { Permit } from "../../types/permit"; -import { usePermitHistoryQuery } from "../../hooks/hooks"; +import { + useAmendmentApplicationQuery, + useDeleteApplicationsMutation, + usePermitHistoryQuery, +} from "../../hooks/hooks"; import { calculateAmountForVoid } from "../../helpers/feeSummary"; import { PERMIT_REFUND_ACTIONS, RefundPage } from "../Refund/RefundPage"; import { mapToVoidRequestData } from "./helpers/mapper"; @@ -12,7 +16,10 @@ import { useVoidPermit } from "./hooks/useVoidPermit"; import { isValidTransaction } from "../../helpers/payment"; import { Nullable } from "../../../../common/types/common"; import { hasPermitsActionFailed } from "../../helpers/permitState"; -import { applyWhenNotNullable, getDefaultRequiredVal } from "../../../../common/helpers/util"; +import { + applyWhenNotNullable, + getDefaultRequiredVal, +} from "../../../../common/helpers/util"; export const FinishVoid = ({ permit, @@ -30,15 +37,12 @@ export const FinishVoid = ({ const companyId: number = getDefaultRequiredVal( 0, permit?.companyId, - applyWhenNotNullable(id => Number(id), companyIdParam), + applyWhenNotNullable((id) => Number(id), companyIdParam), ); const originalPermitId = getDefaultRequiredVal("", permit?.originalPermitId); - const permitHistoryQuery = usePermitHistoryQuery( - companyId, - originalPermitId, - ); + const permitHistoryQuery = usePermitHistoryQuery(companyId, originalPermitId); const permitHistory = getDefaultRequiredVal([], permitHistoryQuery.data); @@ -48,9 +52,10 @@ export const FinishVoid = ({ isValidTransaction(history.paymentMethodTypeCode, history.pgApproved), ); - const amountToRefund = !permit || transactionHistory.length === 0 - ? 0 - : -1 * calculateAmountForVoid(permit, transactionHistory); + const amountToRefund = + !permit || transactionHistory.length === 0 + ? 0 + : -1 * calculateAmountForVoid(permit, transactionHistory); const { mutation: voidPermitMutation, voidResults } = useVoidPermit(); @@ -64,7 +69,23 @@ export const FinishVoid = ({ } }, [voidResults]); - const handleFinish = (refundData: RefundFormData) => { + const { data: existingAmendmentApplication } = useAmendmentApplicationQuery( + companyId, + originalPermitId, + ); + + const existingAmendmentApplicationId = existingAmendmentApplication?.permitId; + + const { mutateAsync: deleteApplications } = useDeleteApplicationsMutation(); + + const handleFinish = async (refundData: RefundFormData) => { + // if there is an amendment in progress for this application, delete it. This will prevent existing application errors from the backend when attempting to complete the void transaction + if (existingAmendmentApplicationId) { + await deleteApplications({ + companyId, + applicationIds: [existingAmendmentApplicationId], + }); + } const requestData = mapToVoidRequestData( voidPermitData, refundData, diff --git a/frontend/src/features/permits/pages/Void/VoidPermit.tsx b/frontend/src/features/permits/pages/Void/VoidPermit.tsx index 9fec78ce3d..647e83ae20 100644 --- a/frontend/src/features/permits/pages/Void/VoidPermit.tsx +++ b/frontend/src/features/permits/pages/Void/VoidPermit.tsx @@ -1,4 +1,9 @@ -import { Navigate, useNavigate, useParams } from "react-router-dom"; +import { + Navigate, + useLocation, + useNavigate, + useParams, +} from "react-router-dom"; import { useState, useEffect, useMemo } from "react"; import { VoidPermitForm } from "./components/VoidPermitForm"; @@ -7,7 +12,11 @@ import { Loading } from "../../../../common/pages/Loading"; import "./VoidPermit.scss"; import { Banner } from "../../../../common/components/dashboard/components/banner/Banner"; import { VoidPermitContext } from "./context/VoidPermitContext"; -import { ERROR_ROUTES, IDIR_ROUTES } from "../../../../routes/constants"; +import { + APPLICATIONS_ROUTES, + ERROR_ROUTES, + IDIR_ROUTES, +} from "../../../../routes/constants"; import { VoidPermitFormData } from "./types/VoidPermit"; import { FinishVoid } from "./FinishVoid"; import { isPermitInactive } from "../../types/PermitStatus"; @@ -19,10 +28,12 @@ import { import { Breadcrumb } from "../../../../common/components/breadcrumb/Breadcrumb"; import { hasPermitExpired } from "../../helpers/permitState"; import { + PERMIT_ACTION_ORIGINS, SEARCH_BY_FILTERS, SEARCH_ENTITIES, } from "../../../idir/search/types/types"; import { usePermissionMatrix } from "../../../../common/authentication/PermissionMatrix"; +import { PERMIT_TABS } from "../../types/PermitTabs"; const searchRoute = `${IDIR_ROUTES.SEARCH_RESULTS}?searchEntity=${SEARCH_ENTITIES.PERMIT}` + @@ -37,6 +48,9 @@ const isVoidable = (permit: Permit) => { export const VoidPermit = () => { const navigate = useNavigate(); + const { state: stateFromNavigation } = useLocation(); + const { permitActionOrigin } = stateFromNavigation; + const { permitId: permitIdParam, companyId: companyIdParam } = useParams(); const companyId: number = applyWhenNotNullable( @@ -77,8 +91,25 @@ export const VoidPermit = () => { }; const fullSearchRoute = `${searchRoute}&searchString=${getBasePermitNumber()}`; - const goHome = () => navigate(-1); - const goHomeSuccess = () => navigate(fullSearchRoute); + const goHome = () => + permitActionOrigin === PERMIT_ACTION_ORIGINS.ACTIVE_PERMITS + ? navigate(APPLICATIONS_ROUTES.BASE, { + state: { + selectedTab: PERMIT_TABS.ACTIVE_PERMITS, + }, + }) + : // return to global permit search results + navigate(-1); + + const goHomeSuccess = () => + permitActionOrigin === PERMIT_ACTION_ORIGINS.ACTIVE_PERMITS + ? navigate(APPLICATIONS_ROUTES.BASE, { + state: { + selectedTab: PERMIT_TABS.ACTIVE_PERMITS, + }, + }) + : // return to global permit search results + navigate(fullSearchRoute); const handleFail = () => navigate(ERROR_ROUTES.UNEXPECTED); const getLinks = () =>