Files
pedwfrontend/pages/myportal/case/[ticketnumber].js
T
Robert Bond a25ab433a6 Merged PR 2279: passed in case customer email in search and update rep logic to stop non owne...
passed in case customer email in search and update rep logic to stop non owners rasing reps on other owners cases

Related work items: #22095
2026-04-28 12:00:12 +00:00

572 lines
22 KiB
JavaScript

import useTranslation from "next-translate/useTranslation";
import Head from "next/head";
import { useRouter } from "next/router";
import { connect } from "react-redux";
import { getIP } from "../../../actions/core/logger";
import {
getPersonalAccount,
getPortalLogin
} from "../../../actions/services/accountService";
import {
getCaseMessage,
getPortalModuleDetails,
getSIPSEvents,
getSIPSMedia
} from "../../../actions/services/caseService";
import { getRepsFromBlob } from "../../../actions/services/documentService";
import {
getMyCases,
getMyLPACases,
getWatchedCases
} from "../../../actions/services/portalService";
import { getBasicSearch } from "../../../actions/services/searchService";
import { getFormCollectionByID } from "../../../components/utils";
import { getSession } from "next-auth/react";
import Breadcrumbs from "../../../components/breadcrumbs";
import Case from "../../../components/case";
import CookieBanner from "../../../components/cookieBanner";
import Footer from "../../../components/footer";
import Header from "../../../components/header";
import { getSearchDetails } from "../../../components/utils";
import {
setAccountDetails,
setContainerID,
setLoggedInUserId
} from "../../../store/accountDetails/action";
import {
setCurrentReference,
setCurrentView
} from "../../../store/currentView/action";
import { setMyCases, setMyCasesDetails } from "../../../store/myCases/action";
import {
setMyRepresentations,
setMyRepresentationsDetails,
setMySubmittedReps,
setMySubmittedRepsDetails
} from "../../../store/myRepresentations/action";
import { setSearch } from "../../../store/search/action";
import {
setSearchDetails,
setSearchResults,
setEventDetails,
setMediaDetails
} from "../../../store/searchOutput/action";
import { wrapper } from "../../../store/store";
import {
setWatchedCases,
setWatchedCasesDetails
} from "../../../store/watchedCases/action";
import ServiceBanner from "../../../components/myportal/servicebanner";
import TimeOut from "../../../components/timeout";
const CaseHome = (props) => {
const {
footerLinks,
pages,
setSearchResults,
setSearchDetails,
searchResultsObj
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
const { ticketnumber } = router.query;
return (
<div>
<Head>
<title>
Reference:{" "}
{props.currentView.caseReference.currentReference ||
props.searchResultsObj.searchResultsObj.value[0]
.title}{" "}
</title>
</Head>
<div id="page_wrapper">
<CookieBanner />
<Header serviceName="Developments of National Significance" />
<div className="govuk-width-container">
<Breadcrumbs slug={ticketnumber} props={props} />
<ServiceBanner props={props} />
<Case
props={props}
myCases={props.myCases.myCases}
myCasesDetails={props.myCases.myCasesDetails}
// directSearchResultsObj={
// props.searchResultsObj.searchResultsObj
// }
searchResultsObj={
props.searchResultsObj.searchResultsObj
}
searchDetailsObj={
props.searchResultsObj.searchDetailsObj
}
documentDetailsObj={props.documentDetailsObj}
myRepresentations={
props.myRepresentations.myRepresentations
}
watchedCases={props.watchedCases.watchedCases}
watchedCasesDetails={
props.watchedCases.watchedCasesDetails
}
awaitingSubmission={
props.awaitingSubmission.awaitingSubmission
}
caseReference={
props.currentView.caseReference.currentReference
}
ticketnumber={
props.currentView.caseReference.ticketnumber ||
router.query.ticketnumber
}
currentType={props.currentType}
appealTypeID={
props.currentView.caseReference.appealType
}
incidentid={props.currentView.caseReference.incidentid}
representationsObj={
props.searchResultsObj.representationsObj
}
showLoginCheck={true}
messagesObj={props.messagesObj}
showFilteredDocs={props.showFilteredDocs}
showMaps={props.showMaps}
eventsObj={props.searchResultsObj.eventsObj}
mediaObj={props.searchResultsObj.mediaObj}
/>
</div>
<Footer
footerLinks={footerLinks}
props={props}
ticketnumber={props.currentView.caseReference.ticketnumber}
/>
<TimeOut />
</div>
</div>
);
};
export const getServerSideProps = wrapper.getServerSideProps(
(store) => async (ctx) => {
const { query, req, res } = ctx;
getIP(req);
const { cookies } = req;
console.log(cookies);
console.log("the query :", query.ticketnumber);
console.log("viewkey: " + (query.hasOwnProperty("key") ? "yes" : "no"));
const showLoginCheck = process.env.SHOWLOGIN || false;
let thisSession = await getSession(ctx);
let loggedInUser = {};
if (thisSession) {
console.log(" has sesssion.......");
[loggedInUser] = await Promise.all([
await getPortalLogin(thisSession.user.email)
]);
loggedInUser = loggedInUser.value[0].contactid;
} else {
console.log("not has sesssion.......");
return {
redirect: {
destination: "/auth/signin",
permanent: false
}
};
}
const accountDetails = await getPersonalAccount(loggedInUser);
const lpaid =
accountDetails[
"pinswg_contact_associatedlpa@OData.Community.Display.V1.FormattedValue"
];
store.dispatch(setContainerID(thisSession.user.id));
store.dispatch(setAccountDetails(accountDetails));
store.dispatch(setLoggedInUserId(loggedInUser));
let developmentQuery = query.ticketnumber;
const pattern = /CAS-\d{5}-[A-Z0-9]{6}/;
const match = query.ticketnumber.match(pattern);
if (match) {
console.log("Match found!", match[0]);
} else {
console.log("No match.");
}
const searchResultsObj = await getBasicSearch(developmentQuery);
const searchDetailsObj = await getSearchDetails(searchResultsObj);
var eventsObj = {};
var mediaObj = {};
if (searchResultsObj.value[0].pinswg_appealcasetype == 846040002) {
eventsObj = await getSIPSEvents(
searchDetailsObj[0].value[0].pinswg_sipsid
);
store.dispatch(setEventDetails(eventsObj));
}
if (searchResultsObj.value[0].pinswg_appealcasetype == 846040002) {
mediaObj = await getSIPSMedia(searchResultsObj.value[0].incidentid);
store.dispatch(setMediaDetails(mediaObj));
}
//console.log(
// "\n======================================\n",
// searchResultsObj,
// "\n======================================\n"
// );
//console.log(
// "\n======================================\n",
// searchDetailsObj[0],
// "\n======================================\n"
// );
store.dispatch(setSearch(developmentQuery));
// console.log(
// searchResultsObj["@odata.count"] > 1 ||
// searchResultsObj["@odata.count"] < 1
// );
if (searchResultsObj["@odata.count"] < 1) {
return {
redirect: {
destination: "/404",
permanent: false
}
};
} else {
if (searchResultsObj["@odata.count"] > 1) {
return {
redirect: {
//destination: "/dns-not-found",
destination: "/404",
permanent: false
}
};
} else {
if (query.hasOwnProperty("key")) {
let whichViewKey = query.key;
switch (whichViewKey) {
case "awaitingSubmissionDetails":
store.dispatch(
setCurrentView({
"viewName": "Awaiting Submission",
"viewKey": "awaitingSubmissionDetails"
})
);
break;
case "watchedCases":
// const watchedCases = await getWatchedCases(
// loggedInUser
// );
// let showWatchedCases = (submittedArr) => {
// const required = submittedArr.value.filter(
// (el) => {
// return (
// el.pinswg_representationsubmitted ==
// null
// );
// }
// );
// let newObj = {};
// return Object.assign(newObj, {
// "@odata.count": required.length,
// "value": required,
// });
// };
// let filteredWatchedCases =
// showWatchedCases(watchedCases);
// const watchedCasesDetails = await getDetails(
// filteredWatchedCases,
// "myWatchedCases"
// );
// store.dispatch(
// setWatchedCases(filteredWatchedCases)
// );
// store.dispatch(
// setWatchedCasesDetails(watchedCasesDetails)
// );
store.dispatch(
setCurrentView({
"viewName": "Watched Cases",
"viewKey": "watchedCases"
})
);
break;
case "myCases":
const myCases =
accountDetails.pinswg_typeofinvolvement ==
846040012
? await getMyLPACases(lpaid)
: await getMyCases(loggedInUser);
const myCasesDetails = await getDetails(
myCases,
"myCases"
);
store.dispatch(setMyCases(myCases));
store.dispatch(setMyCasesDetails(myCasesDetails));
store.dispatch(
setCurrentView({
"viewName": "My Cases",
"viewKey": "myCases"
})
);
break;
case "myRepresentations":
const myRepresentations = await getRepsFromBlob(
thisSession.user.id
);
const myRepresentationsDetails = await getDetails(
myRepresentations,
"myRepresentations"
);
store.dispatch(
setMyRepresentations(myRepresentations)
);
store.dispatch(
setMyRepresentationsDetails(
myRepresentationsDetails
)
);
store.dispatch(
setCurrentView({
"viewName": "My Representations",
"viewKey": "myRepresentations"
})
);
default:
// code block
}
}
const watchedCases = await getWatchedCases(loggedInUser);
let showWatchedCases = (submittedArr) => {
const required = submittedArr.value.filter((el) => {
return el.pinswg_representationsubmitted == null;
});
let newObj = {};
return Object.assign(newObj, {
"@odata.count": required.length,
"value": required
});
};
let filteredWatchedCases = showWatchedCases(watchedCases);
const watchedCasesDetails = await getDetails(
filteredWatchedCases,
"myWatchedCases"
);
store.dispatch(setWatchedCases(filteredWatchedCases));
store.dispatch(setWatchedCasesDetails(watchedCasesDetails));
store.dispatch(setSearchResults(searchResultsObj));
store.dispatch(setSearchDetails(searchDetailsObj));
store.dispatch(
setCurrentReference({
"ticketnumber": searchResultsObj.value[0].ticketnumber,
"currentReference": searchResultsObj.value[0].title,
"currentType": "searchResultsObj",
"incidentid": searchResultsObj.value[0].incidentid,
"appealType":
searchResultsObj.value[0].pinswg_appealcasetype,
"showLoginCheck": showLoginCheck,
"appellant":
searchResultsObj?.value[0].customerid_contact
?.emailaddress1,
"specialistProcess":
searchDetailsObj[0].value[0]
.pinswg_speacialistcaseprocess != null ||
searchDetailsObj[0].value[0]
.pinswg_specialistcaseprocess != null
? searchDetailsObj[0].value[0]
.pinswg_speacialistcaseprocess ||
searchDetailsObj[0].value[0]
.pinswg_specialistcaseprocess
: ""
})
);
const mySubmittedReps = watchedCases.value.filter(
(el) => el.pinswg_representationsubmitted != null
);
const [mySubmittedRepsDetails] = await Promise.all([
getDetails(mySubmittedReps, "mySubmittedReps")
]);
store.dispatch(setMySubmittedReps(mySubmittedReps));
store.dispatch(
setMySubmittedRepsDetails(mySubmittedRepsDetails)
);
}
}
//console.log(searchResultsObj);
//console.log(loggedInUser);
return {
props: {
searchResultsObj: {
searchResultsObj: searchResultsObj,
searchDetailsObj: searchDetailsObj,
eventsObj: eventsObj,
mediaObj: mediaObj
},
currentType: "directResultsObj",
docsOffline: process.env.DOCAPI_OFFLINE || false,
messagesObj: await getCaseMessage(
searchResultsObj.value[0].incidentid
),
showFilteredDocs: process.env.SHOWFILTERDOCS || false,
showMaps: process.env.SHOWMAPS
}
};
}
);
const getDetails = (resultsObj, detailsType) => {
let detailsArr = [];
resultsObj =
detailsType == "mySubmittedReps" ? resultsObj : resultsObj.value;
if (detailsType == "myRepresentations") {
const repsObj = resultsObj.map((searchDetail, index) => {
detailsArr.push(
getCase(searchDetail["incidentID"]).then((data) => {
let caseID = "";
switch (detailsType) {
case "myCases":
caseID = data.pinswg_title;
break;
case "mySubmittedReps":
caseID =
data[
"_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
];
break;
case "awaitingSubmission":
case "myWatchedCases":
case "myRepresentations":
caseID = data.ticketnumber;
break;
default:
caseID = data.pinswg_title;
}
return getPortalModuleDetails(
getFormCollectionByID(data.pinswg_appealcasetype)
.LogicalCollectionName,
caseID
);
})
);
});
}
const detailsObj = resultsObj.map((searchDetail, index) => {
let caseID = "";
switch (detailsType) {
case "myCases":
caseID = searchDetail.pinswg_title;
break;
case "myWatchedCases":
case "mySubmittedReps":
caseID =
searchDetail[
"_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
];
break;
case "awaitingSubmission":
caseID = searchDetail.ticketnumber;
break;
case "myRepresentations":
caseID = searchDetail.casereference;
break;
default:
caseID = searchDetail.pinswg_title;
}
//console.log(detailsType, " case id : ", caseID);
searchDetail.pinswg_appealcasetype != null &&
detailsArr.push(
getPortalModuleDetails(
getFormCollectionByID(searchDetail.pinswg_appealcasetype)
.LogicalCollectionName,
caseID
// detailsType != "myWatchedCases"
// ? searchDetail.ticketnumber
// : searchDetail[
// "_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
// ]
)
);
});
let detArr = Promise.all(detailsArr);
console.log(detArr);
return detArr;
};
const mapStateToProps = (state) => {
return {
accountDetails: state.accountDetails,
currentView: state.currentView,
search: state.search,
//searchResultsObj: state.searchResultsObj,
documentDetailsObj: state.searchResultsObj.documentDetailsObj,
formData: state.formData,
appealType: state.appealType,
form: state.form,
myCases: state.myCases,
watchedCases: state.watchedCases,
myRepresentations: state.myRepresentations,
awaitingSubmission: state.awaitingSubmission,
mySubmittedReps: state.myRepresentations.mySubmittedReps
};
};
const mapDispatchToProps = (dispatch) => {
return {
setCurrentReference: (currentReference) => {
dispatch(setCurrentReference(refno));
},
// setSearchResults: (searchResults) => {
// dispatch(setSearchResults(searchResults));
// },
// setSearchDetails: (searchDetails) => {
// dispatch(setSearchDetails(searchDetails));
// },
setLoggedInUserId: (loggedInUser) => {
dispatch(setLoggedInUserId(loggedInUser));
}
};
};
export default connect(mapStateToProps, mapDispatchToProps)(CaseHome);