From 05865ca94a2f3071e872ae5adb7a5cf45c166e88 Mon Sep 17 00:00:00 2001 From: Erwin Gronek Date: Tue, 21 Jan 2025 10:54:02 +0100 Subject: [PATCH] wip --- .../dto/proposal/conditional-approval.dto.ts | 10 ++++++-- .../proposal/dto/proposal/proposal.dto.ts | 5 +++- .../proposal/dto/set-uac-approval.dto.ts | 4 ++++ .../proposal/enums/location-state.enum.ts | 1 + .../proposal/schema/proposal.schema.ts | 3 +++ .../sub-schema/conditional-approval.schema.ts | 13 +++++++++-- .../services/proposal-contracting.service.ts | 22 +++++++++++++----- .../services/status-change.service.ts | 2 +- .../proposal/utils/add-location-vote.util.ts | 23 ++++++++++++------- .../proposal-filter/diz/diz-filter.util.ts | 12 +++++++--- 10 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/modules/proposal/dto/proposal/conditional-approval.dto.ts b/src/modules/proposal/dto/proposal/conditional-approval.dto.ts index 953a612..3498788 100644 --- a/src/modules/proposal/dto/proposal/conditional-approval.dto.ts +++ b/src/modules/proposal/dto/proposal/conditional-approval.dto.ts @@ -10,14 +10,20 @@ export class ConditionalApprovalGetDto { @Expose() isAccepted: boolean; + @Expose() + isDizAccepted: boolean; + @Expose() isContractSigned?: boolean; @Expose() dataAmount: number; - @Expose({ groups: [Role.FdpgMember] }) - uploadId: string; + @Expose({ groups: [Role.FdpgMember, Role.DizMember] }) + uploadId?: string; + + @Expose() + conditionalReasoning?: string; @ExposeId() _id: string; diff --git a/src/modules/proposal/dto/proposal/proposal.dto.ts b/src/modules/proposal/dto/proposal/proposal.dto.ts index f62a4e1..2502b85 100644 --- a/src/modules/proposal/dto/proposal/proposal.dto.ts +++ b/src/modules/proposal/dto/proposal/proposal.dto.ts @@ -208,6 +208,9 @@ export class ProposalGetDto extends ProposalBaseDto { @Expose({ groups: [Role.FdpgMember, Role.Researcher] }) uacApprovedLocations: MiiLocation[]; + @Expose({ groups: [Role.FdpgMember, Role.Researcher] }) + dizConditionApprovedLocations: MiiLocation[]; + @Expose({ groups: [Role.FdpgMember, Role.Researcher] }) requestedButExcludedLocations: MiiLocation[]; @@ -218,7 +221,7 @@ export class ProposalGetDto extends ProposalBaseDto { // Conditional and UAC approval are stored additionally to the "flow-arrays" and are persistent - @Expose({ groups: [Role.FdpgMember, Role.Researcher] }) + @Expose({ groups: [Role.FdpgMember, Role.Researcher, Role.DizMember] }) @Type(() => ConditionalApprovalGetDto) conditionalApprovals: ConditionalApprovalGetDto[]; diff --git a/src/modules/proposal/dto/set-uac-approval.dto.ts b/src/modules/proposal/dto/set-uac-approval.dto.ts index 148c0f6..a1375e4 100644 --- a/src/modules/proposal/dto/set-uac-approval.dto.ts +++ b/src/modules/proposal/dto/set-uac-approval.dto.ts @@ -23,6 +23,10 @@ export class SetUacApprovalDto { }) dataAmount?: number; + @Expose() + @MaxLength(10_000) + conditionReasoning?: string; + @Expose() @ValidateIf((obj: SetUacApprovalDto) => obj.value === false) @IsNotEmptyString() diff --git a/src/modules/proposal/enums/location-state.enum.ts b/src/modules/proposal/enums/location-state.enum.ts index 4f91739..868eeaa 100644 --- a/src/modules/proposal/enums/location-state.enum.ts +++ b/src/modules/proposal/enums/location-state.enum.ts @@ -2,6 +2,7 @@ export enum LocationState { IsDizCheck = 'DIZ_CHECK', DizApproved = 'DIZ_APPROVED', UacApproved = 'UAC_APPROVED', + DizConditionApproved = 'DIZ_CONDITION_APPROVED', SignedContract = 'SIGNED_CONTRACT', SignedContractAndContractingDone = 'SIGNED_CONTRACT_AND_CONTRACTING_DONE', RequestedButExcluded = 'REQUESTED_BUT_EXCLUDED', diff --git a/src/modules/proposal/schema/proposal.schema.ts b/src/modules/proposal/schema/proposal.schema.ts index 21bd159..fe21221 100644 --- a/src/modules/proposal/schema/proposal.schema.ts +++ b/src/modules/proposal/schema/proposal.schema.ts @@ -170,6 +170,9 @@ export class Proposal { @Prop([String]) uacApprovedLocations: MiiLocation[]; + @Prop([String]) + dizConditionApprovedLocations: MiiLocation[]; + @Prop([String]) requestedButExcludedLocations: MiiLocation[]; diff --git a/src/modules/proposal/schema/sub-schema/conditional-approval.schema.ts b/src/modules/proposal/schema/sub-schema/conditional-approval.schema.ts index d86cb1a..0609ba0 100644 --- a/src/modules/proposal/schema/sub-schema/conditional-approval.schema.ts +++ b/src/modules/proposal/schema/sub-schema/conditional-approval.schema.ts @@ -15,6 +15,12 @@ export class ConditionalApproval { }) isAccepted: boolean; + @Prop({ + type: Boolean, + default: false, + }) + isDizAccepted: boolean; + @Prop() isContractSigned: boolean; @@ -22,10 +28,13 @@ export class ConditionalApproval { dataAmount: number; @Prop() - uploadId: string; + uploadId?: string; + + @Prop() + conditionalReasoning?: string; @Prop() - fdpgTaskId: string; + fdpgTaskId?: string; _id: string; diff --git a/src/modules/proposal/services/proposal-contracting.service.ts b/src/modules/proposal/services/proposal-contracting.service.ts index 2b7e9b0..bc8f8f3 100644 --- a/src/modules/proposal/services/proposal-contracting.service.ts +++ b/src/modules/proposal/services/proposal-contracting.service.ts @@ -72,14 +72,24 @@ export class ProposalContractingService { const toBeUpdated = await this.proposalCrudService.findDocument(proposalId, user, undefined, true); validateUacApproval(toBeUpdated, user); - const hasCondition = !!file?.buffer && vote.value; + const hasCondition = vote.value && (!!file?.buffer || !!vote.conditionReasoning); if (hasCondition) { - const blobName = getBlobName(toBeUpdated.id, UseCaseUpload.ContractCondition); - await this.storageService.uploadFile(blobName, file, user); - const upload = new UploadDto(blobName, file, UseCaseUpload.ContractCondition, user); - addUpload(toBeUpdated, upload); - addUacApprovalWithCondition(toBeUpdated, user.miiLocation, upload, vote); + const upload: UploadDto | undefined = await (async () => { + if (!!file?.buffer) { + const blobName = getBlobName(toBeUpdated.id, UseCaseUpload.ContractCondition); + await this.storageService.uploadFile(blobName, file, user); + const upload = new UploadDto(blobName, file, UseCaseUpload.ContractCondition, user); + addUpload(toBeUpdated, upload); + return upload; + } else { + return; + } + })(); + + console.log({ upload }); + + addUacApprovalWithCondition(toBeUpdated, user.miiLocation, vote, upload, vote.conditionReasoning); } else { addUacApproval(toBeUpdated, user, vote); } diff --git a/src/modules/proposal/services/status-change.service.ts b/src/modules/proposal/services/status-change.service.ts index 4ad0f0d..b285892 100644 --- a/src/modules/proposal/services/status-change.service.ts +++ b/src/modules/proposal/services/status-change.service.ts @@ -70,7 +70,7 @@ export class StatusChangeService { proposalAfterChanges.statusChangeToLocationCheckAt = new Date(); - scheduleTypesToRemove.push(ScheduleType.ReminderFdpgCheck); + //scheduleTypesToRemove.push(ScheduleType.ReminderFdpgCheck); scheduleTypesToAdd.push( ScheduleType.ReminderLocationCheck1, ScheduleType.ReminderLocationCheck2, diff --git a/src/modules/proposal/utils/add-location-vote.util.ts b/src/modules/proposal/utils/add-location-vote.util.ts index 74e539f..e5bba47 100644 --- a/src/modules/proposal/utils/add-location-vote.util.ts +++ b/src/modules/proposal/utils/add-location-vote.util.ts @@ -48,11 +48,13 @@ export const addUacApproval = (proposal: Proposal, user: IRequestUser, vote: Set proposal.uacApprovals.push(uacApproval as UacApproval); proposal.totalPromisedDataAmount = (proposal.totalPromisedDataAmount ?? 0) + (vote.dataAmount ?? 0); + /* const isDataAmountReached = proposal.totalPromisedDataAmount >= (proposal.requestedData.desiredDataAmount ?? 0); if (isDataAmountReached) { addFdpgTaskAndReturnId(proposal, FdpgTaskType.DataAmountReached); } + */ } else { proposal.requestedButExcludedLocations.push(user.miiLocation); proposal.declineReasons = [ @@ -78,10 +80,11 @@ export const addUacApproval = (proposal: Proposal, user: IRequestUser, vote: Set export const addUacApprovalWithCondition = ( proposal: Proposal, location: MiiLocation, - upload: UploadDto, vote: SetUacApprovalDto, + upload?: UploadDto, + conditionalReasoning?: string, ) => { - const fdpgTaskId = addFdpgTaskAndReturnId(proposal, FdpgTaskType.ConditionApproval); + //const fdpgTaskId = addFdpgTaskAndReturnId(proposal, FdpgTaskType.ConditionApproval); const conditionalApproval: Omit< ConditionalApproval, @@ -92,9 +95,13 @@ export const addUacApprovalWithCondition = ( uploadId: upload._id, dataAmount: vote.dataAmount, isContractSigned: false, - fdpgTaskId, + conditionalReasoning: conditionalReasoning, + isDizAccepted: false, + //fdpgTaskId, }; + console.log({ conditionalApproval }); + if (proposal.conditionalApprovals) { proposal.conditionalApprovals.push(conditionalApproval as ConditionalApproval); } else { @@ -111,12 +118,12 @@ export const addUacApprovalWithCondition = ( proposal.requestedButExcludedLocations.push(location); } - const isUacApprovalComplete = + /*const isUacApprovalComplete = proposal.uacApprovedLocations.length + proposal.requestedButExcludedLocations.length === proposal.numberOfRequestedLocations; if (isUacApprovalComplete) { addFdpgTaskAndReturnId(proposal, FdpgTaskType.UacApprovalComplete); - } + }*/ }; export const addUacConditionReview = ( @@ -129,7 +136,7 @@ export const addUacConditionReview = ( condition.reviewedAt = new Date(); condition.reviewedByOwnerId = user.userId; - removeFdpgTask(proposal, condition.fdpgTaskId); + //removeFdpgTask(proposal, condition.fdpgTaskId); clearLocationsVotes(proposal, condition.location); if (vote === true) { @@ -137,10 +144,10 @@ export const addUacConditionReview = ( // Flow proposal.uacApprovedLocations.push(condition.location); - const isDataAmountReached = proposal.totalPromisedDataAmount >= (proposal.requestedData.desiredDataAmount ?? 0); + /*const isDataAmountReached = proposal.totalPromisedDataAmount >= (proposal.requestedData.desiredDataAmount ?? 0); if (isDataAmountReached) { addFdpgTaskAndReturnId(proposal, FdpgTaskType.DataAmountReached); - } + } */ } else { // Flow proposal.requestedButExcludedLocations.push(condition.location); diff --git a/src/modules/proposal/utils/proposal-filter/diz/diz-filter.util.ts b/src/modules/proposal/utils/proposal-filter/diz/diz-filter.util.ts index 9b6b70b..e5d3066 100644 --- a/src/modules/proposal/utils/proposal-filter/diz/diz-filter.util.ts +++ b/src/modules/proposal/utils/proposal-filter/diz/diz-filter.util.ts @@ -34,8 +34,14 @@ export const getFilterForDiz = (panelQuery: PanelQuery, user: IRequestUser): Fil const getFilterForRequested = (user: IRequestUser): FilterQuery => { return { - status: ProposalStatus.LocationCheck, - openDizChecks: user.miiLocation, + $and: [ + { + status: ProposalStatus.LocationCheck, + }, + { + $or: [{ openDizChecks: user.miiLocation }, { uacApprovedLocations: user.miiLocation }], + }, + ], }; }; @@ -47,7 +53,7 @@ const getFilterForPending = (user: IRequestUser): FilterQuery => { $in: [ProposalStatus.LocationCheck, ProposalStatus.Contracting], }, }, - { $or: [{ dizApprovedLocations: user.miiLocation }, { uacApprovedLocations: user.miiLocation }] }, + { $or: [{ dizApprovedLocations: user.miiLocation }] }, ], }; };