diff --git a/app/caseflow_core/microservices/dms/src/documents/documents.controller.ts b/app/caseflow_core/microservices/dms/src/documents/documents.controller.ts index 47572dee0..37978276a 100644 --- a/app/caseflow_core/microservices/dms/src/documents/documents.controller.ts +++ b/app/caseflow_core/microservices/dms/src/documents/documents.controller.ts @@ -25,6 +25,7 @@ import { downloadDocumentSchema, updateDocumentSchema, } from 'src/validation-schemas/document_validation.schema'; +import { Binary } from 'typeorm'; @Controller('documents') export class DocumentsController { constructor( @@ -40,6 +41,7 @@ export class DocumentsController { @Headers() auth, ) { try { + let documentDetails = await this.fileService.uploadFile( file, body, @@ -51,6 +53,7 @@ export class DocumentsController { 'CREATE', documentDetails, body, + file.buffer ); const data = this.documentService.createDocument(formattedDocument); return data; @@ -85,6 +88,7 @@ export class DocumentsController { 'UPDATE', documentDetails, body, + file ); return this.documentService.update(body.id, document); } else { @@ -108,7 +112,11 @@ export class DocumentsController { let documentDetails = await this.documentService.findOne( parseInt(param.id), ); + let dms = await documentDetails.dmsprovider; + if (dms == 4) { + return res.send(new Buffer(documentDetails.file)); + } if (dms === 2) { doc_id = await documentDetails.name; } else { diff --git a/app/caseflow_core/microservices/dms/src/documents/entities/documents.entity.ts b/app/caseflow_core/microservices/dms/src/documents/entities/documents.entity.ts index cde454b4a..7198e22c5 100644 --- a/app/caseflow_core/microservices/dms/src/documents/entities/documents.entity.ts +++ b/app/caseflow_core/microservices/dms/src/documents/entities/documents.entity.ts @@ -1,9 +1,10 @@ import { Field, ObjectType, Directive, ID } from '@nestjs/graphql'; -import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, OneToMany, Binary } from 'typeorm'; //_____________________Custom Imports_____________________// import { Cases } from './cases.entity'; import { Versions } from 'src/versions/entities/version.entity'; +import { Blob } from 'buffer'; @Entity() @ObjectType() @@ -17,6 +18,9 @@ export class CaseDocuments { @Field() caseId: number; + @Column({ type: "bytea", nullable: false }) + file: Buffer; + @Column({ nullable: true }) @Field({ nullable: true }) documentref: string; @@ -63,4 +67,6 @@ export class CaseDocuments { @OneToMany(() => Versions, (versions) => versions.documents) @Field(() => [Versions], { nullable: true }) versions: Versions[]; + + } diff --git a/app/caseflow_core/microservices/dms/src/helpers/transform.service.ts b/app/caseflow_core/microservices/dms/src/helpers/transform.service.ts index 96127ad64..d876c059d 100644 --- a/app/caseflow_core/microservices/dms/src/helpers/transform.service.ts +++ b/app/caseflow_core/microservices/dms/src/helpers/transform.service.ts @@ -104,7 +104,43 @@ export class TransformService { } }; - transform = (dms, type, document, data) => { + transformDatabase = (type, data, file) => { + try { + switch (type) { + case 'CREATE': + return { + caseId: data.caseId, + documentref: '', + name: data.name, + desc: data.desc, + addedbyuserid: data.addedbyuserid, + creationdate: new Date(), + dmsprovider: 4, + latestversion: '', + isdeleted: false, + type: data?.type, + size: data?.size, + file: file, + }; + + case 'UPDATE': + return { + documentref: '', + desc: data.desc, + addedbyuserid: data.addedbyuserid, + dmsprovider: 4, + latestversion:'', + isdeleted: false, + file: file, + }; + } + } catch (error) { + console.log(error); + throw new InternalServerErrorException(); + } + }; + + transform = (dms, type, document, data, file) => { try { switch (dms) { case '1': @@ -115,6 +151,9 @@ export class TransformService { case '3': return this.transformAlfresco(type, document, data); + + case '4': + return this.transformDatabase(type, data, file); } } catch (error) { console.log(error); diff --git a/app/caseflow_core/microservices/server/src/cases/services/cases.service.ts b/app/caseflow_core/microservices/server/src/cases/services/cases.service.ts index 0012b03bc..d5ee6f020 100644 --- a/app/caseflow_core/microservices/server/src/cases/services/cases.service.ts +++ b/app/caseflow_core/microservices/server/src/cases/services/cases.service.ts @@ -1,6 +1,6 @@ import { Injectable, NotFoundException,BadRequestException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { Brackets, Repository } from 'typeorm'; import { HttpStatus } from '@nestjs/common/enums'; import { HttpException } from '@nestjs/common/exceptions'; @@ -189,8 +189,16 @@ export class CasesService { } default : const [Cases,totalCount] = await (this.caseRepository.createQueryBuilder("table") - // .where("LOWER(table.name) LIKE :title", { title: `%${ searchField.toLowerCase() }%` }) - .where('table.isdeleted = :status', {status:false}) + .where(new Brackets((qb) => { + qb.where("LOWER(table.issuetype) LIKE :issuetype", { issuetype: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.contactid) LIKE :contactid", { contactid: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.individualid) LIKE :individualid", { individualid: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.caseowner) LIKE :caseowner", { caseowner: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.city) LIKE :city", { city: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.region) LIKE :region", { region: `%${ searchField.toLowerCase() }%` }) + .orWhere("LOWER(table.phonenumber) LIKE :phonenumber", { phonenumber: `%${ searchField.toLowerCase() }%` }) + }) + ).andWhere('table.isdeleted = :status', {status:false}) .andWhere('table.creationdate >= :start_at', { start_at: fromDate}) .andWhere('table.creationdate <= :end_at', { end_at: toDate}) .orderBy({[orderBy]: orderType}).take(take).skip(skip) diff --git a/app/caseflow_web/public/config/config.js b/app/caseflow_web/public/config/config.js index 1eb9e33dd..8c02d5a8b 100644 --- a/app/caseflow_web/public/config/config.js +++ b/app/caseflow_web/public/config/config.js @@ -20,7 +20,7 @@ window["_env_"] = { // default DMS - REACT_APP_CASEFLOW_DMS:3, + REACT_APP_CASEFLOW_DMS:4, // application name APPLICATION_NAME:'caseflow.ai', diff --git a/app/caseflow_web/src/components/AdvanedSearch/advancedSearch.tsx b/app/caseflow_web/src/components/AdvanedSearch/advancedSearch.tsx index 71a98496a..331fedb1f 100644 --- a/app/caseflow_web/src/components/AdvanedSearch/advancedSearch.tsx +++ b/app/caseflow_web/src/components/AdvanedSearch/advancedSearch.tsx @@ -25,6 +25,8 @@ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { GENERIC_NAME } from "../../apiManager/endpoints/config"; +import { getContactsData } from "../../services/ContactService"; +import { getIndividualsData } from "../../services/IndividualService"; export default function AdvancedSearch() { const [searchField, setSearchField] = useState(""); @@ -37,6 +39,8 @@ export default function AdvancedSearch() { const [documentSearch, setDocumentsearch] = useState(false); const [caseSearch, setCasesearch] = useState(false); const [lobSearch, setLobsearch] = useState(false); + const [contactSearch, setContactSearch] = useState(false); + const [individualSearch, setIndividualSearch] = useState(false); const [fromDateForSearch, setFromDateForSearch] = useState(null); const [toDateForSearch, setToDateForSearch] = useState(null); const [showDate, setShowDate] = useState(false); @@ -59,8 +63,8 @@ export default function AdvancedSearch() { totalCount = totalCount + searchCaseResult.totalCount; searchCaseResult?.Cases.map((element) => { result.push({ - title: element.id + " - " + element.name, - content: element.desc, + title: element.id + " - " + element.issuetype, + content: element.individualid, subtitle: GENERIC_NAME, link: "/private/cases/" + element.id + "/details", imgIcon: require("../../assets/CasesIcon.png"), @@ -107,6 +111,38 @@ export default function AdvancedSearch() { }); }); }), + (allSearch || contactSearch) && + getContactsData( + 1, + searchField + ).then((contacts) => { + totalCount = totalCount + contacts?.totalCount; + contacts?.CaseflowContacts?.map((element) => { + result.push({ + title: element.id + " - " + element.firstname +" "+element.lastname, + content: element.phonenumber, + subtitle: "Contact", + link: "/private/contacts/" + element.id + "/details", + imgIcon: require("../../assets/ContactsIcon.png"), + }); + }); + }), + (allSearch || individualSearch) && + getIndividualsData( + 1, + searchField + ).then((individuals) => { + totalCount = totalCount + individuals?.CaseflowIndividuals?.totalCount; + individuals?.CaseflowIndividuals?.map((element) => { + result.push({ + title: element.id + " - " + element.firstname +" "+element.lastname, + content: element.phonenumber, + subtitle: "Individual", + link: "/private/individuals/" + element.id + "/details", + imgIcon: require("../../assets/AssignedIcon.png"), + }); + }); + }), ]); dispatch( @@ -118,7 +154,9 @@ export default function AdvancedSearch() { setCasesearch(false); setAllsearch(true); setDocumentsearch(false); + setContactSearch(false); setLobsearch(false); + setIndividualSearch(false); setFromDateForSearch(null); setToDateForSearch(null); setShowDate(false); @@ -134,6 +172,8 @@ export default function AdvancedSearch() { documentSearch, caseSearch, lobSearch, + contactSearch, + individualSearch, toDateForSearch, ]); @@ -180,6 +220,8 @@ export default function AdvancedSearch() { setCasesearch(false); setDocumentsearch(false); setLobsearch(false); + setIndividualSearch(false); + setContactSearch(false); } }} @@ -212,7 +254,7 @@ export default function AdvancedSearch() { } label="Documents" /> - } label="Line of Bussiness" + /> */} + { + setIndividualSearch(!individualSearch); + setAllsearch(false); + }} + /> + } + label="Individuals" + /> + { + setContactSearch(!contactSearch); + setAllsearch(false); + }} + /> + } + label="Contacts" /> { ); let searchResultCases = searchResult.Cases?.map((element) => { return { - title: element.id + " - " + element.name, - content: element.desc, + title: element.id + " - " + element.issuetype, + content: element.individualid, subtitle: GENERIC_NAME, link: "/private/cases/" + element.id + "/details", imgIcon: require("../../assets/CasesIcon.png"), @@ -77,10 +77,6 @@ const Cases = () => { }); if (searchResultCases) { - console.log({ - searchResultCases: searchResultCases, - totalCount: searchResult.totalCount, - }); dispatch( setsearchCaseResult({ searchResult: searchResultCases, diff --git a/app/caseflow_web/src/components/Dashboard/Dashboard.tsx b/app/caseflow_web/src/components/Dashboard/Dashboard.tsx index 3068e8d04..1a9d9013f 100644 --- a/app/caseflow_web/src/components/Dashboard/Dashboard.tsx +++ b/app/caseflow_web/src/components/Dashboard/Dashboard.tsx @@ -3,9 +3,12 @@ import Search from "../Search/Search"; import "./dashboard.scss"; import CaseList from "../CaseList/CaseList"; import MyTask from "../MyTask/MyTask"; -import { fetchRecentCaseList } from "../../services/CaseService"; +import { fetchRecentCaseList, searchCases } from "../../services/CaseService"; import { Typography } from "@mui/material"; import { GENERIC_NAME } from "../../apiManager/endpoints/config"; +import { useDispatch, useSelector } from "react-redux"; +import { setsearchCaseResult } from "../../reducers/newCaseReducer"; +import { State } from "../../interfaces/stateInterface"; const caseListProps = { title: "Recent " + GENERIC_NAME, @@ -17,6 +20,45 @@ const caseListProps = { const Dashboard = () => { const [recentCases, setrecentCases] = useState([]); + const [searchField, setSearchField] = useState(""); + const [searchColumn, setSearchColumn] = useState("name"); + + const dispatch = useDispatch(); + const searchResults = useSelector( + (state: State) => state.cases.searchCaseResult + ); + + const searchCasesDetails = async () => { + let searchResult = await searchCases( + searchField, + searchColumn, + 1, + "id", + true, + true, + null, + null + ); + let searchResultCases = searchResult.Cases?.map((element) => { + return { + title: element.id + " - " + element.issuetype, + content: element.individualid, + subtitle: GENERIC_NAME, + link: "/private/cases/" + element.id + "/details", + imgIcon: require("../../assets/CasesIcon.png"), + }; + }); + + if (searchResultCases) { + dispatch( + setsearchCaseResult({ + searchResult: searchResultCases, + totalCount: searchResult.totalCount, + }) + ); + } + }; + const recentCaseList = async () => { let recentCases = await fetchRecentCaseList(); recentCases = recentCases.filter((element, index) => { @@ -28,9 +70,10 @@ const Dashboard = () => { useEffect(() => { recentCaseList(); }, []); + useEffect(() => { + searchCasesDetails(); + }, [searchField, searchColumn]); - const [searchField, setSearchField] = useState(""); - const [searchColumn, setSearchColumn] = useState("name"); const [dropDownArray, setdropDownArray] = useState(["Name", "Description"]); return (
@@ -42,8 +85,7 @@ const Dashboard = () => { + setSearchColumn={setSearchColumn} dropDownValues={searchResults} >