diff --git a/app/caseflow_core/microservices/server/src/app.module.ts b/app/caseflow_core/microservices/server/src/app.module.ts index 81703ee74..597a16f85 100644 --- a/app/caseflow_core/microservices/server/src/app.module.ts +++ b/app/caseflow_core/microservices/server/src/app.module.ts @@ -20,6 +20,7 @@ import { CaseStatusModule } from './case_status/case_status.module'; import { CaseTypesModule } from './case_types/case_types.module'; import { NatsModule } from './nats/nats.module'; import { CaseNotesModule } from './case_notes/case_notes.module'; +import { WorkflowActivityModule } from './workflow_activities/workflow_activity.module'; /** * Summary :Keyclock settings @@ -74,7 +75,8 @@ const keyCloakOptionsProvider = { CaseStatusModule, CaseTypesModule, NatsModule, - CaseNotesModule + CaseNotesModule, + WorkflowActivityModule ], controllers: [], providers: [ diff --git a/app/caseflow_core/microservices/server/src/case_notes/case_notes.resolver.ts b/app/caseflow_core/microservices/server/src/case_notes/case_notes.resolver.ts index 7916efa61..20919c4ef 100644 --- a/app/caseflow_core/microservices/server/src/case_notes/case_notes.resolver.ts +++ b/app/caseflow_core/microservices/server/src/case_notes/case_notes.resolver.ts @@ -9,7 +9,7 @@ import { UpdateCaseNoteInput } from './dto/update-case_note.input'; export class CaseNotesResolver { constructor(private readonly caseNotesService: CaseNotesService) {} - @Mutation(() => CaseNotes) + @Mutation(() => CaseNotes, {name:'createCaseNote'}) createCaseNote(@Args('createCaseNoteInput') createCaseNoteInput: CreateCaseNoteInput) { return this.caseNotesService.create(createCaseNoteInput); } @@ -30,12 +30,12 @@ export class CaseNotesResolver { return this.caseNotesService.findByCaseId(id); } - @Mutation(() => CaseNotes) + @Mutation(() => CaseNotes, {name:'updateCaseNote'}) updateCaseNote(@Args('updateCaseNoteInput') updateCaseNoteInput: UpdateCaseNoteInput) { return this.caseNotesService.update(updateCaseNoteInput.id, updateCaseNoteInput); } - @Mutation(() => CaseNotes) + @Mutation(() => CaseNotes, {name:'removeCaseNote'}) removeCaseNote(@Args('id', { type: () => Int }) id: number) { return this.caseNotesService.remove(id); } diff --git a/app/caseflow_core/microservices/server/src/cases/entities/cases.entity.ts b/app/caseflow_core/microservices/server/src/cases/entities/cases.entity.ts index ce57ea560..b6cf954ba 100644 --- a/app/caseflow_core/microservices/server/src/cases/entities/cases.entity.ts +++ b/app/caseflow_core/microservices/server/src/cases/entities/cases.entity.ts @@ -15,6 +15,7 @@ import { CaseHistory } from '../../case_history/entities/case_history.entity'; import { CaseStatuses } from '../../case_status/entities/case_status.entity'; import { CaseTypes } from '../../case_types/entities/case_type.entity'; import { CaseNotes } from 'src/case_notes/entities/case_note.entity'; +import { WorkflowActivity } from 'src/workflow_activities/entities/workflow_activity.entity'; /** * Summary : Entity Class For External Cases @@ -115,6 +116,10 @@ export class Cases { @Field(() => [CaseNotes], { nullable: true }) casenote: CaseNotes[]; + @OneToMany(() => WorkflowActivity, (workflowactivity) => workflowactivity.case) + @Field(() => [WorkflowActivity], { nullable: true }) + workflowactivity: WorkflowActivity[]; + @Column({ nullable: true }) @Field({ nullable: true }) contactid: string; diff --git a/app/caseflow_core/microservices/server/src/schema.gql b/app/caseflow_core/microservices/server/src/schema.gql index 12b0bbfe0..44ea79e5a 100644 --- a/app/caseflow_core/microservices/server/src/schema.gql +++ b/app/caseflow_core/microservices/server/src/schema.gql @@ -87,6 +87,19 @@ type CaseNotes { case: Cases } +type WorkflowActivity { + id: ID! + taskid: String + caseid: Float + creationdate: DateTime! + userid: String! + taskname: String + formurl: String + status: String + selectedform: String + case: Cases +} + type Cases { id: ID! lobid: Int! @@ -107,6 +120,7 @@ type Cases { casestatus: CaseStatuses casestype: CaseTypes casenote: [CaseNotes!] + workflowactivity: [WorkflowActivity!] contactid: String individualid: String email: String @@ -143,6 +157,7 @@ type Query { caseNotes: [CaseNotes!]! caseNote(id: Int!): CaseNotes! caseNotesByCaseId(id: Int!): [CaseNotes!]! + workflowActivitiesByCaseId(id: Int!): [WorkflowActivity!]! } type Mutation { @@ -164,6 +179,8 @@ type Mutation { createCaseNote(createCaseNoteInput: CreateCaseNoteInput!): CaseNotes! updateCaseNote(updateCaseNoteInput: UpdateCaseNoteInput!): CaseNotes! removeCaseNote(id: Int!): CaseNotes! + createWorkflowActivity(createWorkflowActivityInput: CreateWorkflowActivityInput!): WorkflowActivity! + updateWorkflowActivity(updateWorkflowActivityInput: UpdateWorkflowActivityInput!): WorkflowActivity! } input CreateCaseInput { @@ -171,7 +188,7 @@ input CreateCaseInput { statusid: Int! typeid: Float linkedcases: [Int!] - creationdate: DateTime = "2024-03-26T01:07:20.509Z" + creationdate: DateTime = "2024-04-21T04:08:52.906Z" completiondate: DateTime lastmodificationdate: DateTime penduntildate: DateTime @@ -200,9 +217,9 @@ input UpdateCaseInput { statusid: Int! typeid: Float linkedcases: [Int!] - creationdate: DateTime = "2024-03-26T01:07:20.505Z" + creationdate: DateTime = "2024-04-21T04:08:52.902Z" completiondate: DateTime - lastmodificationdate: DateTime = "2024-03-26T01:07:20.505Z" + lastmodificationdate: DateTime = "2024-04-21T04:08:52.902Z" penduntildate: DateTime archivedate: DateTime startuserid: Int @@ -228,7 +245,7 @@ input RemoveCaseArgs { } input CreateCaseHistoryInput { - datetime: DateTime = "2024-03-26T01:07:20.519Z" + datetime: DateTime = "2024-04-21T04:08:52.912Z" outcome: String = "sucess" userid: Float caseId: [Int!]! @@ -238,7 +255,7 @@ input CreateCaseHistoryInput { } input UpdateCaseHistoryInput { - datetime: DateTime = "2024-03-26T01:07:20.519Z" + datetime: DateTime = "2024-04-21T04:08:52.912Z" outcome: String = "sucess" userid: Float caseId: [Int!] @@ -293,17 +310,33 @@ input UpdateCaseTypeInput { input CreateCaseNoteInput { caseid: Float! - creationdate: DateTime = "2024-03-26T01:07:20.621Z" + creationdate: DateTime = "2024-04-21T04:08:52.987Z" userid: Float notetext: String } input UpdateCaseNoteInput { caseid: Float - creationdate: DateTime = "2024-03-26T01:07:20.621Z" + creationdate: DateTime = "2024-04-21T04:08:52.987Z" userid: Float notetext: String id: Int! } +input CreateWorkflowActivityInput { + caseid: Float + creationdate: DateTime = "2024-04-21T04:08:52.992Z" + userid: String + taskid: String! + taskname: String + formurl: String + status: String + selectedform: String +} + +input UpdateWorkflowActivityInput { + taskid: String + status: String +} + scalar link__Import \ No newline at end of file diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/dto/create-workflow_activity.input.ts b/app/caseflow_core/microservices/server/src/workflow_activities/dto/create-workflow_activity.input.ts new file mode 100644 index 000000000..757384376 --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/dto/create-workflow_activity.input.ts @@ -0,0 +1,44 @@ +import { InputType, Field } from '@nestjs/graphql'; +import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; + + +@InputType() +export class CreateWorkflowActivityInput { + @Field({ nullable: true }) + @IsNumber() + @IsNotEmpty() + caseid: number; + + @Field({ defaultValue: new Date() }) + creationdate: Date; + + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + userid: string; + + @Field({ nullable: false }) + @IsString() + @IsNotEmpty() + taskid: string; + + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + taskname: string; + + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + formurl: string; + + @Field({ nullable: true }) + @IsString() + @Field({ nullable: true }) + status: string; + + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + selectedform: string; +} diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/dto/update-workflow_activity.input.ts b/app/caseflow_core/microservices/server/src/workflow_activities/dto/update-workflow_activity.input.ts new file mode 100644 index 000000000..2eec56c2b --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/dto/update-workflow_activity.input.ts @@ -0,0 +1,16 @@ +import { InputType, Field, Int, PartialType } from '@nestjs/graphql'; +import { IsNotEmpty, IsString } from 'class-validator'; + +@InputType() +export class UpdateWorkflowActivityInput{ + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + taskid: string; + + @Field({ nullable: true }) + @IsString() + @IsNotEmpty() + status: string; + +} diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/entities/workflow_activity.entity.ts b/app/caseflow_core/microservices/server/src/workflow_activities/entities/workflow_activity.entity.ts new file mode 100644 index 000000000..439e816e3 --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/entities/workflow_activity.entity.ts @@ -0,0 +1,50 @@ + +import { ObjectType, Field, ID } from '@nestjs/graphql'; +import { Cases } from 'src/cases/entities/cases.entity'; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +@ObjectType() +export class WorkflowActivity { + + @PrimaryGeneratedColumn() + @Field((type) => ID) + id: number; + + @Column({ nullable: true }) + @Field({ nullable: true }) + taskid: string; + + @Column({ nullable: true }) + @Field({ nullable: true }) + caseid: number; + + @Column({ nullable: true }) + @Field() + creationdate: Date; + + @Column({ nullable: true }) + @Field() + userid: string; + + @Column({ nullable: true }) + @Field({ nullable: true }) + taskname: string; + + @Column({ nullable: true }) + @Field({ nullable: true }) + formurl: string; + + @Column({ nullable: true }) + @Field({ nullable: true }) + status: string; + + @Column({ nullable: true }) + @Field({ nullable: true }) + selectedform: string; + + @ManyToOne(() => Cases, (cases) => cases.id) + @Field(() => Cases, { nullable: true }) + @JoinColumn({ name: 'id' }) + case: Cases; +} diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.resolver.ts b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.resolver.ts new file mode 100644 index 000000000..446f6952b --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.resolver.ts @@ -0,0 +1,29 @@ + +import { Resolver, Query, Mutation, Args, Int } from '@nestjs/graphql'; +import { WorkflowActivitiesService } from './workflow_activities.service'; +import { WorkflowActivity } from './entities/workflow_activity.entity'; +import { CreateWorkflowActivityInput } from './dto/create-workflow_activity.input'; +import { UpdateWorkflowActivityInput } from './dto/update-workflow_activity.input'; + +@Resolver(() => WorkflowActivity) +export class WorkflowActivityResolver { + constructor(private readonly workflowActivityService: WorkflowActivitiesService) {} + + @Mutation(() => WorkflowActivity) + createWorkflowActivity(@Args('createWorkflowActivityInput') createWorkflowActivityInput: CreateWorkflowActivityInput) { + return this.workflowActivityService.create(createWorkflowActivityInput); + } + + @Query(() => [WorkflowActivity], { name: 'workflowActivitiesByCaseId' }) + workflowActivitiesByCaseId(@Args('id', { type: () => Int }) id: number) { + return this.workflowActivityService.findByCaseId(id); + } + + @Mutation(() => WorkflowActivity) + updateWorkflowActivity(@Args('updateWorkflowActivityInput') updateWorkflowActivityInput: UpdateWorkflowActivityInput) { + return this.workflowActivityService.update(updateWorkflowActivityInput.taskid, updateWorkflowActivityInput); + } +} + + + diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.service.ts b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.service.ts new file mode 100644 index 000000000..afba510dd --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activities.service.ts @@ -0,0 +1,81 @@ +import { BadRequestException, HttpException, HttpStatus, Injectable, NotFoundException } from '@nestjs/common'; +import { CreateWorkflowActivityInput } from './dto/create-workflow_activity.input'; +import { UpdateWorkflowActivityInput } from './dto/update-workflow_activity.input'; +import { InjectRepository } from '@nestjs/typeorm'; +import { WorkflowActivity } from './entities/workflow_activity.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class WorkflowActivitiesService { + + constructor( + @InjectRepository(WorkflowActivity) + private workflowActivityRepository: Repository, + ) {} + + async create(createWorkflowActivityInput: CreateWorkflowActivityInput) { + try { + const newWorkflowActivity = + this.workflowActivityRepository.create(createWorkflowActivityInput); + const data = await this.workflowActivityRepository.save(newWorkflowActivity); + return data; + } catch (error) { + console.log(error); + throw error; + } + } + + async findByCaseId(id: number) { + try{ + + const value = await this.workflowActivityRepository.find({ + where: { + caseid: id, + }, + }); + if (value) return value; + throw new NotFoundException(`Record cannot find by id ${id}`); + + } + catch (error) { + console.log(error); + throw error; + } + } + + async update(taskid: string, updateWorkflowActivityInput: UpdateWorkflowActivityInput) { + try { + return await this.workflowActivityRepository.update({taskid:taskid}, updateWorkflowActivityInput).then(() => { + return this.findByTaskId(taskid).catch((err) => { + throw new HttpException(err.response, HttpStatus.NOT_FOUND); + }); + }); + } catch (err) { + console.log(err); + } + } + + /** + * Find One Method For Returning Specific Activity + * @param taskid + * @returns + */ + async findByTaskId(taskid: string): Promise { + try { + if (taskid) { + const value = await this.workflowActivityRepository.findOne({ + where: { + taskid: taskid + } + }); + if (value) return value; + + throw new NotFoundException(`Record cannot find by id ${taskid}`); + } + throw new BadRequestException("request doesn't have any id"); + } catch (err) { + console.log(err); + } + } + +} \ No newline at end of file diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.module.ts b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.module.ts new file mode 100644 index 000000000..d755721b2 --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { WorkflowActivitiesService } from './workflow_activities.service'; +import { WorkflowActivityResolver } from './workflow_activities.resolver'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { WorkflowActivity } from './entities/workflow_activity.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([WorkflowActivity])], + + providers: [WorkflowActivityResolver, WorkflowActivitiesService] +}) +export class WorkflowActivityModule {} diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.resolver.spec.ts b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.resolver.spec.ts new file mode 100644 index 000000000..3bc7d2bd8 --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.resolver.spec.ts @@ -0,0 +1,19 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { WorkflowActivityResolver } from './workflow_activities.resolver'; +import { WorkflowActivitiesService } from './workflow_activities.service'; + +describe('WorkflowActivityResolver', () => { + let resolver: WorkflowActivityResolver; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [WorkflowActivityResolver, WorkflowActivitiesService], + }).compile(); + + resolver = module.get(WorkflowActivitiesService); + }); + + it('should be defined', () => { + expect(resolver).toBeDefined(); + }); +}); diff --git a/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.service.spec.ts b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.service.spec.ts new file mode 100644 index 000000000..4c3628c0b --- /dev/null +++ b/app/caseflow_core/microservices/server/src/workflow_activities/workflow_activity.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { WorkflowActivitiesService } from './workflow_activities.service'; + +describe('WorkflowActivitiesService', () => { + let service: WorkflowActivitiesService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [WorkflowActivitiesService], + }).compile(); + + service = module.get(WorkflowActivitiesService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/app/caseflow_web/src/components/CaseDetails/CaseDetailData/CaseDetailData.scss b/app/caseflow_web/src/components/CaseDetails/CaseDetailData/CaseDetailData.scss index 510f4eca2..d15749513 100644 --- a/app/caseflow_web/src/components/CaseDetails/CaseDetailData/CaseDetailData.scss +++ b/app/caseflow_web/src/components/CaseDetails/CaseDetailData/CaseDetailData.scss @@ -4,6 +4,7 @@ grid-template-columns: auto auto auto; text-align: left; margin-top: 1rem; + margin-bottom: 1rem; grid-row-gap: 2rem; } diff --git a/app/caseflow_web/src/components/CaseDetails/CaseDetails.tsx b/app/caseflow_web/src/components/CaseDetails/CaseDetails.tsx index eb8fad954..860056786 100644 --- a/app/caseflow_web/src/components/CaseDetails/CaseDetails.tsx +++ b/app/caseflow_web/src/components/CaseDetails/CaseDetails.tsx @@ -78,6 +78,8 @@ import { getContactDetails, getContactsData } from "../../services/ContactServic import { setSelectedContact } from "../../reducers/newContactReducer"; import { getIndividualDetails } from "../../services/IndividualService"; import { setSelectedIndividual } from "../../reducers/newIndividualReducer"; +import { createNewWorkflowActivity, getWorkflowActivities } from "../../services/workflowActivityService"; +import RelatedWorkflowActivities from "../RelatedWorkflowActivities/RelatedWorkflowActivities"; // Formio.setProjectUrl("https://app2.aot-technologies.com/formio"); // Formio.setBaseUrl("https://app2.aot-technologies.com/formio"); @@ -92,6 +94,7 @@ const CaseDetails = () => { const selectedCase = useSelector((state: State) => state.cases.selectedCase); const selectedContact = useSelector((state: State) => state.contacts.selectedContact); const selectedIndividual = useSelector((state: State) => state.individuals.selectedIndividual); + const [workflowActivities, setWorkflowActivities] = useState([]); const userName = useSelector( (state: State) => state.auth.userDetails.userName ); @@ -171,6 +174,7 @@ const CaseDetails = () => { await fetchCaseHistory(matches[0]); findContact(output.contactid); findIndividual(output.individualid); + setWorkflowActivities(await getWorkflowActivities(matches[0])) } } async function fetchCaseHistory(id) { @@ -307,8 +311,8 @@ const CaseDetails = () => { const getForms = async () => { let type= caseTypes.find(type=> type.id == selectedCase.typeid) - //Hard coded form name for POC, should be removed for actual implemetnation - const formsList = await getFormsListByName('Case Flow POC'); + // const formsList = await getFormsListByName('Case Flow POC'); + const formsList = await getFormsListByName(type?.searchterm); setFormsList(formsList); setOpenWorkflowPopup(true); }; @@ -463,22 +467,22 @@ const CaseDetails = () => { const callBack = (err, submission) => {}; const submitForm = (data) => { - try { - const SUBJECT = "workFlowStart"; - const MESSAGE = { - eventId: String(uuidv4()), - eventRef: String(selectedCase.id), - eventOrigin: String("Caseflow"), - eventCategory: String("Caseflow"), - eventType: String(SUBJECT), - eventDateTime: String(new Date()), - eventPublisher: String(userName), - }; - publishMessage(SUBJECT, MESSAGE); - } catch (error) { - console.log(error); - } - + // try { + // const SUBJECT = "workFlowStart"; + // const MESSAGE = { + // eventId: String(uuidv4()), + // eventRef: String(selectedCase.id), + // eventOrigin: String("Caseflow"), + // eventCategory: String("Caseflow"), + // eventType: String(SUBJECT), + // eventDateTime: String(new Date()), + // eventPublisher: String(userName), + // }; + // publishMessage(SUBJECT, MESSAGE); + // } catch (error) { + // console.log(error); + // } + submitNewForm(selectedForm, data).then((res) => { let submissionData = { formId: res.form, @@ -511,6 +515,7 @@ const CaseDetails = () => { setOpenFormIOPopup(false); fetchRealtedTasks(); setSelected(0); + setWorkflowActivities(await getWorkflowActivities(selectedCase.id)) await addWorkflowCaseHistory(selectedCase.id,selectedFormDetails.title); await fetchCaseHistory(selectedCase.id); @@ -518,11 +523,14 @@ const CaseDetails = () => { return getTaksByProcessInstanceId(data.processInstanceId); } }) - .then((tasks) => { + .then(async (tasks) => { if (tasks) { let task = tasks[0]; if (task) { task.caseInstanceId = selectedCase.id; + + await createNewWorkflowActivity(selectedCase.id, task.id, task.name, selectedFormDetails.title, + FORMSFLOW_WEB_APPLICATION_URL + "/form/" + res.form + "/submission/" + res._id, 'New', userName) return updateTaksById(task.id, task); } } @@ -534,8 +542,7 @@ const CaseDetails = () => { setOpenWorkflowPopup(false); setOpenFormIOPopup(false); fetchRealtedTasks(); - - await addWorkflowCaseHistory(selectedCase.id,selectedFormDetails.title); + setWorkflowActivities(await getWorkflowActivities(selectedCase.id)) await fetchCaseHistory(selectedCase.id); } else { toast.error("Failed to start the workflow. Please try again!"); @@ -669,6 +676,25 @@ const CaseDetails = () => { ) : ( "" )} + + } + aria-controls="panel1a-content" + id="panel1a-header" + className="case-documents-head-section" + sx={{ marginBottom: 0 }} + > + + Related Workflow Activities + + + + + + } @@ -750,6 +776,28 @@ const CaseDetails = () => { fullWidth >
+
+
+ Case ID + {selectedCase.id} +
+
+ Contact name + {selectedContact.firstname+' '+selectedContact.lastname} +
+
+ Individual name + {selectedIndividual.firstname+' '+selectedIndividual.lastname} +
+
+ Issue Type + {selectedCase.issuetype} +
+
+ Issue Detials + {selectedCase.describetheissue} +
+
{ if (task &&task["id"]) { try { const SUBJECT = "CaseCreate"; - // const MESSAGE = { - // eventId: String(uuidv4()), - // eventRef: String(task.caseInstanceId), - // eventOrigin: String("Caseflow"), - // eventCategory: String("Caseflow"), - // eventType: String(SUBJECT), - // eventDateTime: String(new Date()), - // eventPublisher: String(userName), - // }; - // publishMessage(SUBJECT, MESSAGE); + const MESSAGE = { + eventId: String(uuidv4()), + eventRef: String(task.caseInstanceId), + eventOrigin: String("Caseflow"), + eventCategory: String("Caseflow"), + eventType: String(SUBJECT), + eventDateTime: String(new Date()), + eventPublisher: String(userName), + }; + publishMessage(SUBJECT, MESSAGE); } catch (error) { console.log(error); } diff --git a/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.scss b/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.scss new file mode 100644 index 000000000..8e29fa3b5 --- /dev/null +++ b/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.scss @@ -0,0 +1,27 @@ +@import "../../styles.scss"; + +.case-document-table { + padding: 0; + .caseDocumentAction-center { + background-color: #bcbcbc; + opacity: 0.3; + border-radius: 4px; + width: 24px; + height: 24px; + text-align: center; + color: black; + &:first-child { + } + } + .document-actions { + font-size: 0rem; + } +} +.no-case-doc-found { + text-align: center; +} + +.css-avy57p-MuiAccordionDetails-root, +.css-6kfpg7 { + padding-inline: 0px !important; +} diff --git a/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.tsx b/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.tsx new file mode 100644 index 000000000..caa962119 --- /dev/null +++ b/app/caseflow_web/src/components/RelatedWorkflowActivities/RelatedWorkflowActivities.tsx @@ -0,0 +1,170 @@ +import React, { useState } from "react"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableContainer from "@mui/material/TableContainer"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; +import Paper from "@mui/material/Paper"; +import "./RelatedWorkflowActivities.scss"; +import { Typography } from "@mui/material"; +import { useSelector, useDispatch } from "react-redux"; +import { store } from "../../interfaces/stateInterface"; +import moment from "moment"; +import { Link } from "@mui/material"; +import { FORMSFLOW_WEB_URL } from "../../apiManager/endpoints/config"; +import { useNavigate } from "react-router"; + +export default function RelatedWorkflowActivities({ id, activitiesList }) { + const [totalPageNo, setTotalPageNo] = useState(0); + const [pageNo, setPageNo] = useState(1); + + const dispatch = useDispatch(); + const navigate = useNavigate(); + const SelectedDocId = useSelector( + (state: store) => state.documents.seletedDocument + ); + const totalDocCount = useSelector( + (state: store) => state.cases.selectedCase.totalDocCount + ); + const userName = useSelector( + (state: store) => state.auth.userDetails.userName + ); + + return ( + <> + + {activitiesList && activitiesList.length !== 0 ? ( + + + + + Task Name + + + Creation Date + + + Form Name + + + Status + + + + + {activitiesList.map((row: any, index) => ( + + + {row.status=='New' ? + + {" "} + {row.taskname}{" "} + : row.taskname} + + + {moment(row.creationdate).format( + "YYYY-MM-DD" + )} + + + + {" "} + {row.selectedform}{" "} + + + + {row.status} + + + ))} + +
+ ) : ( + + No Workflow Activities Found ! + + )} +
+ + ); +} diff --git a/app/caseflow_web/src/graphql/workflowActivityRequests.ts b/app/caseflow_web/src/graphql/workflowActivityRequests.ts new file mode 100644 index 000000000..dec509966 --- /dev/null +++ b/app/caseflow_web/src/graphql/workflowActivityRequests.ts @@ -0,0 +1,42 @@ +import gql from "graphql-tag"; + +export const CREATE_WORKFLOW_ACTIVITY = gql` + mutation createWorkflowActivity($createWorkflowActivityInput: CreateWorkflowActivityInput!) { + createWorkflowActivity(createWorkflowActivityInput: $createWorkflowActivityInput) { + taskid + taskname + caseid + formurl + status + selectedform + creationdate + userid + } + } +`; + +export const UPDATE_WORKFLOW_ACTIVITY = gql` + mutation updateWorkflowActivity($updateWorkflowActivityInput: UpdateWorkflowActivityInput!) { + updateWorkflowActivity(updateWorkflowActivityInput: $updateWorkflowActivityInput) { + taskid, + status + } + } +`; + + +export const FETCH_WORKFLOW_ACTIVITIES_BY_CASE = gql` + query workflowActivitiesByCaseId($CaseId: Int!) { + workflowActivitiesByCaseId(id: $CaseId) { + id + taskid + taskname + caseid + formurl + status + selectedform + creationdate + userid + } + } +`; diff --git a/app/caseflow_web/src/services/formsService.ts b/app/caseflow_web/src/services/formsService.ts index e587484d0..6e9687da3 100644 --- a/app/caseflow_web/src/services/formsService.ts +++ b/app/caseflow_web/src/services/formsService.ts @@ -26,7 +26,7 @@ export const getFormsList = async () => { return output; }; export const getFormsListByName = async (name) => { - const url = `${FORM_URL}/form?formName=${name}`; + const url = `${FORM_URL}/form`; const output = await httpGETRequest(url, {}, null) .then((res) => { return res.data; diff --git a/app/caseflow_web/src/services/workflowActivityService.ts b/app/caseflow_web/src/services/workflowActivityService.ts new file mode 100644 index 000000000..9b14260de --- /dev/null +++ b/app/caseflow_web/src/services/workflowActivityService.ts @@ -0,0 +1,92 @@ +import { httpPOSTRequest, httpPUTRequest } from "../apiManager/httpRequestHandler"; +import { print } from "graphql"; + +import { GRAPHQL } from "../apiManager/endpoints"; +import { CREATE_WORKFLOW_ACTIVITY,FETCH_WORKFLOW_ACTIVITIES_BY_CASE,UPDATE_WORKFLOW_ACTIVITY } from "../graphql/workflowActivityRequests"; + + +export const createNewWorkflowActivity = async (caseId, taskId, taskName, selectedForm, formurl, status, userName) => { + const url = GRAPHQL; + + return httpPOSTRequest( + url, + { + query: print(CREATE_WORKFLOW_ACTIVITY), + variables: { + createWorkflowActivityInput: { + caseid : parseInt(caseId) , + creationdate : new Date(), + userid : userName, + taskid : taskId, + taskname : taskName, + formurl : formurl, + status: status, + selectedform : selectedForm + }, + }, + }, + null + ) + .then((res) => { + return res.data.data.createWorkflowActivity; + }) + .catch((error) => { + if (error?.response?.data) { + return { error: error }; + } else { + return { error: "something went wrong" }; + } + }); +}; + + + +export const getWorkflowActivities = async (id) => { + const url = GRAPHQL; + const output = await httpPOSTRequest( + url, + { + query: print(FETCH_WORKFLOW_ACTIVITIES_BY_CASE), + variables: { + CaseId: parseInt(id), + }, + }, + null + ) + .then((res) => { + return res.data.data.workflowActivitiesByCaseId; + }) + .catch((error) => { + console.log({ error: error }); + return {}; + }); + return output; +}; + + +export const updateWorkflowActivity = async (data) => { + const url = GRAPHQL; + return httpPUTRequest( + url, + { + query: print(UPDATE_WORKFLOW_ACTIVITY), + variables: { + updateCaseInput: { + id: data.id, + description: data.description + }, + }, + }, + null + ) + .then((res) => { + return { success: res.data }; + }) + .catch((error) => { + if (error?.response?.data) { + return { error: error }; + } else { + return { error: "something went wrong" }; + } + }); +}; diff --git a/app/caseflow_web/src/services/workflowService.ts b/app/caseflow_web/src/services/workflowService.ts index b9c87a944..8306445f1 100644 --- a/app/caseflow_web/src/services/workflowService.ts +++ b/app/caseflow_web/src/services/workflowService.ts @@ -9,7 +9,6 @@ import { print } from "graphql"; import { ADD_WORKFLOW_CASE_HISTORY } from "../graphql/caseRequests"; export const getWorkflowList = async (caseType) => { - console.log(parseInt(caseType)); const url = `${BPM_URL}/camunda/engine-rest-ext/v1/process-definition?latestVersion=true`; const output = await httpGETRequest(url, {}, null) .then((res) => { @@ -22,7 +21,6 @@ export const getWorkflowList = async (caseType) => { return output; }; export const startNewWorkflow = async (id, body) => { - console.log(parseInt(id)); const url = `${BPM_URL}/camunda/engine-rest-ext/v1/process-definition/key/${id}/start`; const output = await httpPOSTRequest(url, body, null) .then((res) => { @@ -106,7 +104,7 @@ export const addWorkflowCaseHistory = async (caseId,workflowtype="") => { query: print(ADD_WORKFLOW_CASE_HISTORY), variables: { createCaseEventInput: { - artifactId: caseId, + artifactId: parseInt(caseId), eventtypeId: 12, workflowtype:workflowtype, },