-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Insurance-Example-Model.cml
281 lines (228 loc) · 6.51 KB
/
Insurance-Example-Model.cml
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
/* Example Context Map written with 'ContextMapper DSL' */
ContextMap InsuranceContextMap {
type = SYSTEM_LANDSCAPE
state = TO_BE
/* Add bounded contexts to this context map: */
contains CustomerManagementContext
contains CustomerSelfServiceContext
contains PrintingContext
contains PolicyManagementContext
contains RiskManagementContext
contains DebtCollection
/* Define the context relationships: */
CustomerSelfServiceContext [D,C]<-[U,S] CustomerManagementContext : Customer_Frontend_Backend_Relationship { // Relationship name is optional
exposedAggregates = Customers
}
CustomerManagementContext [D,ACL]<-[U,OHS,PL] PrintingContext {
implementationTechnology = "SOAP"
downstreamRights = INFLUENCER
exposedAggregates = Printing
}
PrintingContext [U,OHS,PL]->[D,ACL] PolicyManagementContext {
implementationTechnology = "SOAP"
exposedAggregates = Printing
}
RiskManagementContext [P]<->[P] PolicyManagementContext {
implementationTechnology = "RabbitMQ"
}
PolicyManagementContext [D,CF]<-[U,OHS,PL] CustomerManagementContext {
implementationTechnology = "RESTfulHTTP"
exposedAggregates = Customers
}
RiskManagementContext [D,CF]<-[U,OHS,PL] CustomerManagementContext {
implementationTechnology = "RESTfulHTTP"
exposedAggregates = Customers
}
DebtCollection [D,ACL]<-[U,OHS,PL] PrintingContext {
implementationTechnology = "SOAP"
exposedAggregates = Printing
}
PolicyManagementContext [SK]<->[SK] DebtCollection {
implementationTechnology = "Shared Java Library, Communication over RESTful HTTP"
}
}
/* Bounded Context Definitions */
BoundedContext CustomerManagementContext implements CustomerManagementDomain {
type = FEATURE
domainVisionStatement = "The customer management context is responsible for managing all the data of the insurance companies customers."
implementationTechnology = "Java, JEE Application"
responsibilities = "Customers, Addresses"
Aggregate Customers {
Entity Customer {
aggregateRoot
- SocialInsuranceNumber sin
String firstname
String lastname
- List<Address> addresses
def AddressId createAddress(@Address address);
def boolean changeCustomer(String firstname, String lastname);
}
Entity Address {
String street
int postalCode
String city
}
ValueObject SocialInsuranceNumber {
String sin key
}
}
}
BoundedContext CustomerSelfServiceContext implements CustomerManagementDomain {
type = APPLICATION
domainVisionStatement = "This context represents a web application which allows the customer to login and change basic data records like the address."
responsibilities = "AddressChange"
implementationTechnology = "PHP Web Application"
Aggregate CustomerFrontend {
Entity CustomerAddressChange {
aggregateRoot
- UserAccount issuer
- Address changedAddress
}
}
Aggregate Acounts {
Entity UserAccount {
aggregateRoot
String username
- Customer accountCustomer
}
}
}
BoundedContext PrintingContext implements PrintingDomain {
type = SYSTEM
responsibilities = "Document Printing"
domainVisionStatement = "An external system which provides printing services to the other Bounded Contexts."
Aggregate Printing {
Entity PrintingJob {
aggregateRoot
int printingId
- Document document
- Template template
def PrintStatus printJob(PrintingId printingId);
}
Entity Document {
DomainObject source
String template
}
}
Aggregate Templating {
Entity Template {
aggregateRoot
int templateId
String templateName
}
}
}
BoundedContext PolicyManagementContext implements PolicyManagementDomain {
type = FEATURE
domainVisionStatement = "This bounded context manages the contracts and policies of the customers."
responsibilities = "Offers, Contracts, Policies"
implementationTechnology = "Java, Spring App"
Aggregate Offers {
owner ContractsTeam
Entity Offer {
aggregateRoot
int offerId
- Customer client
- List<Product> products
BigDecimal price
}
}
Aggregate Products {
owner ProductsTeam
Entity Product {
aggregateRoot
- ProductId identifier
String productName
}
ValueObject ProductId {
int productId key
}
}
Aggregate Contract {
owner ContractsTeam
Entity Contract {
aggregateRoot
- ContractId identifier
- Customer client
- List<Product> products
}
ValueObject ContractId {
int contractId key
}
Entity Policy {
int policyNr
- Contract contract
BigDecimal price
}
}
}
BoundedContext RiskManagementContext implements RiskManagementDomain {
type = FEATURE
domainVisionStatement = "Uses data from PolicyManagement context to calculate risks."
responsibilities = "Customer Risk Calculation"
implementationTechnology = "Java, Spring App"
Aggregate Risks {
Entity CustomerRiskFactor {
aggregateRoot
int totalRiskFactor
- List<Risk> risks
- Customer client
}
ValueObject Risk {
int likelihood
String risk
}
}
}
BoundedContext DebtCollection implements DebtsDomain {
type = FEATURE
domainVisionStatement = "The debt collection context is responsible for the financial income of the insurance company (the debts) which depend on the corresponding contracts and policies."
responsibilities = "Debts, Dunning"
implementationTechnology = "JEE"
Aggregate Debts {
Entity Debt {
aggregateRoot
int debtNr
- Policy policy
Date creationDate
Date paymentDate
Date paymentDeadline
BigDecimal price
PaymentStatus status
- List<Dunning> dunnigs
}
Entity Dunning {
int dunningNr
- Debt debt
Date dunningDate
Date paymentDeadline
}
}
}
/* Teams: */
BoundedContext CustomersTeam { type TEAM }
BoundedContext ContractsTeam { type TEAM }
BoundedContext ProductsTeam { type TEAM }
/* Domain & Subdomain Definitions */
Domain InsuranceDomain {
Subdomain CustomerManagementDomain {
type = CORE_DOMAIN
domainVisionStatement = "Subdomain managing everything customer-related."
}
Subdomain PolicyManagementDomain {
type = CORE_DOMAIN
domainVisionStatement = "Subdomain managing contracts and policies."
}
Subdomain PrintingDomain {
type = SUPPORTING_DOMAIN
domainVisionStatement = "Service (external system) to solve printing for all kinds of documents (debts, policies, etc.)"
}
Subdomain RiskManagementDomain {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Subdomain supporting everything which relates to risk management."
}
Subdomain DebtsDomain {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Subomain including everything related to the incoming money (debts, dunning, etc.)"
}
}