-
Notifications
You must be signed in to change notification settings - Fork 11
/
system_intake_status_requester.go
140 lines (123 loc) · 6.06 KB
/
system_intake_status_requester.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package resolvers
import (
"fmt"
"time"
"github.com/cmsgov/easi-app/pkg/models"
)
const noDecisionInvalidStateErrMsg = "issue calculating the requester intake status, intake is in an invalid state - step is DECISION, but decisionState is NO_DECISION"
// CalculateSystemIntakeRequesterStatus calculates the status to display in the requester view for a System Intake request,
// based on the intake's current step, the state of that step, and the overall intake state (open/closed)
func CalculateSystemIntakeRequesterStatus(intake *models.SystemIntake, currentTime time.Time) (models.SystemIntakeStatusRequester, error) {
if intake.Step == models.SystemIntakeStepDECISION && intake.DecisionState == models.SIDSNoDecision {
return "", fmt.Errorf(noDecisionInvalidStateErrMsg)
}
if intake.State == models.SystemIntakeStateCLOSED && intake.DecisionState == models.SIDSNoDecision {
return models.SISRClosed, nil
}
if intake.State == models.SystemIntakeStateCLOSED &&
intake.DecisionState != models.SIDSNoDecision &&
intake.Step != models.SystemIntakeStepDECISION {
// If an intake has a decision but is re-opened, progressed to an earlier step,
// and then closed without a decision, show closed.
return models.SISRClosed, nil
}
switch intake.Step {
case models.SystemIntakeStepINITIALFORM:
return calcSystemIntakeInitialFormStatusRequester(intake.RequestFormState)
case models.SystemIntakeStepDRAFTBIZCASE:
return calcSystemIntakeDraftBusinessCaseStatusRequester(intake.DraftBusinessCaseState)
case models.SystemIntakeStepGRTMEETING:
// this calc function doesn't use a switch statement and can't possibly return an error
return calcSystemIntakeGRTMeetingStatusRequester(intake.GRTDate, currentTime), nil
case models.SystemIntakeStepFINALBIZCASE:
return calcSystemIntakeFinalBusinessCaseStatusRequester(intake.FinalBusinessCaseState)
case models.SystemIntakeStepGRBMEETING:
// this calc function doesn't use a switch statement and can't possibly return an error
return calcSystemIntakeGRBMeetingStatusRequester(intake.GRBDate, currentTime), nil
case models.SystemIntakeStepDECISION:
return calcSystemIntakeDecisionStatusRequester(intake.DecisionState, intake.LCIDStatus(time.Now()))
default:
return "", fmt.Errorf("issue calculating the requester intake status, no valid step")
}
}
func calcSystemIntakeInitialFormStatusRequester(intakeFormState models.SystemIntakeFormState) (models.SystemIntakeStatusRequester, error) {
switch intakeFormState {
case models.SIRFSNotStarted:
return models.SISRInitialRequestFormNew, nil
case models.SIRFSInProgress:
return models.SISRInitialRequestFormInProgress, nil
case models.SIRFSEditsRequested:
return models.SISRInitialRequestFormEditsRequested, nil
case models.SIRFSSubmitted:
return models.SISRInitialRequestFormSubmitted, nil
default:
return "", fmt.Errorf("issue calculating the requester intake status, no valid intakeFormState")
}
}
func calcSystemIntakeDraftBusinessCaseStatusRequester(draftBusinessCaseState models.SystemIntakeFormState) (models.SystemIntakeStatusRequester, error) {
switch draftBusinessCaseState {
case models.SIRFSNotStarted, models.SIRFSInProgress:
return models.SISRDraftBusinessCaseInProgress, nil
case models.SIRFSEditsRequested:
return models.SISRDraftBusinessCaseEditsRequested, nil
case models.SIRFSSubmitted:
return models.SISRDraftBusinessCaseSubmitted, nil
default:
return "", fmt.Errorf("issue calculating the requester intake status, no valid draftBusinessCaseState")
}
}
func calcSystemIntakeGRTMeetingStatusRequester(grtDate *time.Time, currentTime time.Time) models.SystemIntakeStatusRequester {
if grtDate == nil || grtDate.After(currentTime) {
return models.SISRGrtMeetingReady
}
return models.SISRGrtMeetingAwaitingDecision
}
func calcSystemIntakeFinalBusinessCaseStatusRequester(finalBusinessCaseState models.SystemIntakeFormState) (models.SystemIntakeStatusRequester, error) {
switch finalBusinessCaseState {
case models.SIRFSNotStarted, models.SIRFSInProgress:
return models.SISRFinalBusinessCaseInProgress, nil
case models.SIRFSEditsRequested:
return models.SISRFinalBusinessCaseEditsRequested, nil
case models.SIRFSSubmitted:
return models.SISRFinalBusinessCaseSubmitted, nil
default:
return "", fmt.Errorf("issue calculating the requester intake status, no valid finalBusinessCaseState")
}
}
func calcSystemIntakeGRBMeetingStatusRequester(grbDate *time.Time, currentTime time.Time) models.SystemIntakeStatusRequester {
if grbDate == nil || grbDate.After(currentTime) {
return models.SISRGrbMeetingReady
}
return models.SISRGrbMeetingAwaitingDecision
}
func calcSystemIntakeDecisionStatusRequester(decisionState models.SystemIntakeDecisionState, lcidStatus *models.SystemIntakeLCIDStatus) (models.SystemIntakeStatusRequester, error) {
switch decisionState {
case models.SIDSLcidIssued:
return calcLCIDIssuedDecisionStatusRequester(lcidStatus)
case models.SIDSNotApproved:
return models.SISRNotApproved, nil
case models.SIDSNotGovernance:
return models.SISRNotGovernance, nil
case models.SIDSNoDecision:
// we shouldn't hit this case, it should be caught by the check at the start of CalculateSystemIntakeRequesterStatus(),
// but it's repeated here for clarity and to make sure we handle all possible values of decisionState in this function
return "", fmt.Errorf(noDecisionInvalidStateErrMsg)
}
return "", fmt.Errorf("issue calculating the requester intake status, no valid decisionState")
}
// calcLCIDIssuedDecisionStatusRequester checks an LCID status and appropriately converts it to a SystemIntakeStatusRequester
func calcLCIDIssuedDecisionStatusRequester(lcidStatus *models.SystemIntakeLCIDStatus) (models.SystemIntakeStatusRequester, error) {
if lcidStatus == nil {
return models.SISRLcidIssued, nil
}
if *lcidStatus == models.SystemIntakeLCIDStatusIssued {
return models.SISRLcidIssued, nil
}
if *lcidStatus == models.SystemIntakeLCIDStatusExpired {
return models.SISRLcidExpired, nil
}
if *lcidStatus == models.SystemIntakeLCIDStatusRetired {
return models.SISRLcidRetired, nil
}
return "", fmt.Errorf("invalid lcid status provided: %v", lcidStatus)
}