Skip to content

Commit 85f7b13

Browse files
Andre TurnerCarsonF
authored andcommitted
Engagement Workflow v2
1 parent 640c90c commit 85f7b13

30 files changed

+1131
-609
lines changed

dbschema/engagement-workflow.esdl

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module Engagement {
2+
type WorkflowEvent extending Project::ContextAware {
3+
required engagement: default::Engagement {
4+
readonly := true;
5+
on target delete delete source;
6+
};
7+
required who: default::Actor {
8+
readonly := true;
9+
default := global default::currentActor;
10+
};
11+
required at: datetime {
12+
readonly := true;
13+
default := datetime_of_statement();
14+
};
15+
transitionKey: uuid {
16+
readonly := true;
17+
};
18+
required to: Status {
19+
readonly := true;
20+
};
21+
notes: default::RichText {
22+
readonly := true;
23+
};
24+
25+
trigger setEngagementStatus after insert for all do (
26+
update default::Engagement
27+
filter default::Engagement in __new__.engagement
28+
set {
29+
status := default::Engagement.latestWorkflowEvent.to ?? Engagement::Status.InDevelopment
30+
}
31+
);
32+
trigger refreshEngagementStatus after delete for all do (
33+
update default::Engagement
34+
filter default::Engagement in __old__.engagement
35+
set {
36+
status := default::Engagement.latestWorkflowEvent.to ?? Engagement::Status.InDevelopment
37+
}
38+
);
39+
}
40+
41+
scalar type Status extending enum<
42+
InDevelopment,
43+
DidNotDevelop,
44+
Rejected,
45+
46+
Active,
47+
ActiveChangedPlan,
48+
49+
DiscussingTermination,
50+
DiscussingReactivation,
51+
DiscussingChangeToPlan,
52+
DiscussingSuspension,
53+
Suspended,
54+
55+
FinalizingCompletion,
56+
Terminated,
57+
Completed,
58+
59+
# deprecated / legacy
60+
Converted,
61+
Unapproved,
62+
Transferred,
63+
NotRenewed,
64+
>;
65+
}

dbschema/engagement.esdl

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ module default {
33
required status: Engagement::Status {
44
default := Engagement::Status.InDevelopment;
55
}
6+
latestWorkflowEvent := (select .workflowEvents order by .at desc limit 1);
7+
workflowEvents := .<engagement[is Engagement::WorkflowEvent];
8+
trigger assertMatchingLatestWorkflowEvent after insert, update for each do (
9+
assert(
10+
__new__.latestWorkflowEvent.to ?= __new__.status
11+
or (not exists __new__.latestWorkflowEvent and __new__.status = Engagement::Status.InDevelopment),
12+
message := "Engagement status must match the latest workflow event"
13+
)
14+
);
615
statusModifiedAt: datetime {
716
rewrite update using (datetime_of_statement() if .status != __old__.status else .statusModifiedAt);
817
}
@@ -141,31 +150,6 @@ module default {
141150
}
142151

143152
module Engagement {
144-
scalar type Status extending enum<
145-
InDevelopment,
146-
DidNotDevelop,
147-
Rejected,
148-
149-
Active,
150-
151-
DiscussingTermination,
152-
DiscussingReactivation,
153-
DiscussingChangeToPlan,
154-
DiscussingSuspension,
155-
156-
FinalizingCompletion,
157-
ActiveChangedPlan,
158-
Suspended,
159-
160-
Terminated,
161-
Completed,
162-
163-
# deprecated / legacy
164-
Converted,
165-
Unapproved,
166-
Transferred,
167-
NotRenewed,
168-
>;
169153

170154
scalar type InternPosition extending enum<
171155
ConsultantInTraining,

dbschema/migrations/00012-m1pqxkv.edgeql

Lines changed: 68 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/authorization/policies/by-role/controller.policy.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@ import { Policy, Role } from '../util';
33
// NOTE: There could be other permissions for this role from other policies
44
@Policy(Role.Controller, (r) => [
55
// keep multiline format
6+
r.EngagementWorkflowEvent.read.transitions(
7+
'Reject',
8+
'End Development',
9+
'Approve to Active',
10+
'Approve Change to Plan',
11+
'Will Not Change Plan',
12+
'Discussing Change to Plan -> Discussing Suspension',
13+
).execute,
614
r.Organization.delete,
715
r.Partner.delete,
816
r.ProjectWorkflowEvent.read.transitions(

src/components/authorization/policies/by-role/financial-analyst.policy.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ export const projectTransitions = () =>
3131
]),
3232
r.LanguageEngagement.specifically((p) => p.paratextRegistryId.none),
3333
),
34+
r.EngagementWorkflowEvent.read.transitions(
35+
'Not Ready for Completion',
36+
'Complete',
37+
).execute,
3438
r.FieldRegion.read,
3539
r.FieldZone.read,
3640
r.FinancialReport.edit,

src/components/authorization/policies/by-role/project-manager.policy.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,23 @@ export const momentumProjectsTransitions = () =>
8282
p.paratextRegistryId.when(member).read,
8383
]),
8484
),
85+
r.EngagementWorkflowEvent.read.transitions(
86+
'Discuss Change To Plan',
87+
'Discuss Suspension',
88+
'Discuss Termination',
89+
'Finalize Completion',
90+
'Approve Change to Plan',
91+
'Will Not Change Plan',
92+
'Discussing Change to Plan -> Discussing Suspension',
93+
'Will Not Suspend',
94+
'Approve Suspension',
95+
'Approve Reactivation',
96+
'Discuss Reactivation',
97+
'End Termination Discussion',
98+
'Approve Termination',
99+
'Not Ready for Completion',
100+
'Complete',
101+
).execute,
85102
r.EthnologueLanguage.read,
86103
r.FieldRegion.read,
87104
r.FieldZone.read,

src/components/engagement/engagement-status.resolver.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/components/engagement/engagement.module.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@ import { LanguageModule } from '../language/language.module';
66
import { LocationModule } from '../location/location.module';
77
import { ProductModule } from '../product/product.module';
88
import { ProjectModule } from '../project/project.module';
9-
import { EngagementStatusResolver } from './engagement-status.resolver';
109
import { EngagementLoader } from './engagement.loader';
1110
import { EngagementRepository } from './engagement.repository';
1211
import { EngagementResolver } from './engagement.resolver';
13-
import { EngagementRules } from './engagement.rules';
1412
import { EngagementService } from './engagement.service';
1513
import * as handlers from './handlers';
1614
import { InternshipEngagementResolver } from './internship-engagement.resolver';
1715
import { InternshipPositionResolver } from './internship-position.resolver';
1816
import { LanguageEngagementResolver } from './language-engagement.resolver';
1917
import { FixNullMethodologiesMigration } from './migrations/fix-null-methodologies.migration';
2018
import { EngagementProductConnectionResolver } from './product-connection.resolver';
19+
import { EngagementWorkflowModule } from './workflow/engagement-workflow.module';
2120

2221
@Module({
2322
imports: [
@@ -28,15 +27,14 @@ import { EngagementProductConnectionResolver } from './product-connection.resolv
2827
forwardRef(() => LanguageModule),
2928
forwardRef(() => LocationModule),
3029
forwardRef(() => ProjectModule),
30+
EngagementWorkflowModule,
3131
],
3232
providers: [
3333
EngagementResolver,
3434
LanguageEngagementResolver,
3535
InternshipEngagementResolver,
36-
EngagementStatusResolver,
3736
InternshipPositionResolver,
3837
EngagementProductConnectionResolver,
39-
EngagementRules,
4038
EngagementService,
4139
EngagementRepository,
4240
EngagementLoader,

0 commit comments

Comments
 (0)