-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathITransactionState.cs
More file actions
132 lines (116 loc) · 3.34 KB
/
ITransactionState.cs
File metadata and controls
132 lines (116 loc) · 3.34 KB
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateTest
{
public enum TransactionState
{
Created = 1,
PartialApproved = 2,
Approved = 3,
Rejected = 4
}
public interface ITransactionState
{
void Enter(Transaction trn);
void ChangeState(Transaction trn, TransactionState toState);
}
public class CreatedState : ITransactionState
{
public CreatedState(Transaction trn)
{
Enter(trn);
}
public void Enter(Transaction trn)
{
//check permissions
}
public void ChangeState(Transaction trn, TransactionState toState)
{
// next state can be PartialApproved or Rejected
switch(toState)
{
case TransactionState.PartialApproved:
trn.transactionState = new PartialApprovedState(trn);
break;
case TransactionState.Rejected:
trn.transactionState = new RejectedState(trn);
break;
default:
// wrong transition - log and/or throw exception
break;
}
}
}
public class PartialApprovedState : ITransactionState
{
public PartialApprovedState(Transaction trn)
{
Enter(trn);
}
public void Enter(Transaction trn)
{
//check permissions
}
public void ChangeState(Transaction trn, TransactionState toState)
{
// next state can be Approved or Rejected
switch(toState)
{
case TransactionState.Approved:
trn.transactionState = new ApprovedState(trn);
break;
case TransactionState.Rejected:
trn.transactionState = new RejectedState(trn);
break;
default:
// wrong transition - log and/or throw exception
break;
}
}
}
public class ApprovedState : ITransactionState
{
public ApprovedState(Transaction trn)
{
Enter(trn);
}
public void Enter(Transaction trn)
{
// check that approver group is other than first approver group
// update balance
}
public void ChangeState(Transaction trn, TransactionState toState)
{
// next state can be Rejected only
if (TransactionState.Rejected == toState)
{
// update balance back and
// go to rejected state
trn.transactionState = new RejectedState(trn);
}
else
{
// wrong transition - log and/or throw exception
}
}
}
public class RejectedState : ITransactionState
{
public RejectedState(Transaction trn)
{
Enter(trn);
}
public void Enter(Transaction trn)
{
// check permissions
}
public void ChangeState(Transaction trn, TransactionState toState)
{
// do nothing
// throw exception (?)
}
}
}