Passed
Pull Request — master (#155)
by
unknown
08:39
created

DocumentWorkflow::getWorkflow()   A

Complexity

Conditions 6
Paths 5

Size

Total Lines 27
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 14
c 1
b 0
f 0
nc 5
nop 0
dl 0
loc 27
rs 9.2222
1
<?php
2
namespace EWW\Dpf\Domain\Workflow;
3
4
/*
5
 * This file is part of the TYPO3 CMS project.
6
 *
7
 * It is free software; you can redistribute it and/or modify it under
8
 * the terms of the GNU General Public License, either version 2
9
 * of the License, or any later version.
10
 *
11
 * For the full copyright and license information, please read the
12
 * LICENSE.txt file that was distributed with this source code.
13
 *
14
 * The TYPO3 project - inspiring people to share!
15
 */
16
17
use Symfony\Component\Workflow\DefinitionBuilder;
18
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
19
use Symfony\Component\Workflow\Transition;
20
use Symfony\Component\Workflow\Workflow;
21
use Symfony\Component\Workflow\Registry;
22
use Symfony\Component\EventDispatcher\EventDispatcher;
23
24
class DocumentWorkflow
25
{
26
    public const LOCAL_STATE_NONE          = 'NONE';
27
    public const LOCAL_STATE_NEW           = 'NEW';
28
    public const LOCAL_STATE_REGISTERED    = 'REGISTERED';
29
    public const LOCAL_STATE_IN_PROGRESS   = 'IN_PROGRESS';
30
    public const LOCAL_STATE_DISCARDED     = 'DISCARDED';
31
    public const LOCAL_STATE_POSTPONED     = 'POSTPONED';
32
    public const LOCAL_STATE_DELETED       = 'DELETED';
33
34
    public const REMOTE_STATE_NONE         = 'NONE';
35
    public const REMOTE_STATE_ACTIVE       = "ACTIVE";
36
    public const REMOTE_STATE_INACTIVE     = "INACTIVE";
37
    public const REMOTE_STATE_DELETED      = "DELETED";
38
39
    public const STATE_NONE_NONE            = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_NONE;
40
41
    // New
42
    public const STATE_NEW_NONE             = self::LOCAL_STATE_NEW.':'.self::REMOTE_STATE_NONE;
43
44
    // Registered
45
    public const STATE_REGISTERED_NONE      = self::LOCAL_STATE_REGISTERED.':'.self::REMOTE_STATE_NONE;
46
47
    // In progress
48
    public const STATE_IN_PROGRESS_NONE     = self::LOCAL_STATE_IN_PROGRESS.':'.self::REMOTE_STATE_NONE;
49
    public const STATE_IN_PROGRESS_ACTIVE   = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_ACTIVE;
50
    public const STATE_IN_PROGRESS_INACTIVE = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_INACTIVE;
51
    public const STATE_IN_PROGRESS_DELETED  = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_DELETED;
52
53
    // Active
54
    public const STATE_NONE_ACTIVE          = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_ACTIVE;
55
56
    // Postponed
57
    public const STATE_POSTPONED_NONE       = self::LOCAL_STATE_POSTPONED.':'.self::REMOTE_STATE_NONE;
58
    public const STATE_NONE_INACTIVE        = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_INACTIVE;
59
60
    // Discarded
61
    public const STATE_DISCARDED_NONE       = self::LOCAL_STATE_DISCARDED.':'.self::REMOTE_STATE_NONE;
62
    public const STATE_NONE_DELETED         = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_DELETED;
63
64
    public const TRANSITION_CREATE              = "CREATE_TRANSITION";
65
    public const TRANSITION_CREATE_REGISTER     = "CREATE_REGISTER_TRANSITION";
66
    public const TRANSITION_REGISTER            = "REGISTER_TRANSITION";
67
    public const TRANSITION_DISCARD             = "DISCARD_TRANSITION";
68
    public const TRANSITION_POSTPONE            = "POSTPONE_TRANSITION";
69
    public const TRANSITION_RELEASE_PUBLISH     = "RELEASE_PUBLISH_TRANSITION";
70
    public const TRANSITION_RELEASE_UPDATE      = "RELEASE_UPDATE_TRANSITION";
71
    public const TRANSITION_RELEASE_ACTIVATE    = "RELEASE_ACTIVATE_TRANSITION";
72
    public const TRANSITION_DELETE_LOCALLY      = "DELETE_LOCALLY_TRANSITION";
73
    public const TRANSITION_DELETE_WORKING_COPY = "DELETE_WORKING_COPY_TRANSITION";
74
    public const TRANSITION_DELETE_DISCARDED    = "DELETE_DISCARDED_TRANSITION";
75
76
    public const PLACES = [
77
        self::STATE_NONE_NONE,
78
        self::STATE_NEW_NONE,
79
        self::STATE_REGISTERED_NONE,
80
        self::STATE_IN_PROGRESS_NONE,
81
        self::STATE_DISCARDED_NONE,
82
        self::STATE_NONE_DELETED,
83
        self::STATE_POSTPONED_NONE,
84
        self::STATE_NONE_INACTIVE,
85
        self::STATE_NONE_ACTIVE,
86
        self::STATE_IN_PROGRESS_ACTIVE,
87
        self::STATE_IN_PROGRESS_INACTIVE,
88
        self::STATE_IN_PROGRESS_DELETED
89
    ];
90
91
    public const TRANSITIONS = [
92
        self::TRANSITION_CREATE => [
93
            "from" => [self::STATE_NONE_NONE],
94
            "to" => self::STATE_NEW_NONE
95
        ],
96
        self::TRANSITION_CREATE_REGISTER => [
97
            "from" => [self::STATE_NONE_NONE],
98
            "to" => self::STATE_REGISTERED_NONE
99
        ],
100
        self::TRANSITION_REGISTER => [
101
            "from" => [self::STATE_NEW_NONE],
102
            "to" => self::STATE_REGISTERED_NONE
103
        ],
104
        self::TRANSITION_DISCARD => [
105
            "from" => [
106
                self::STATE_REGISTERED_NONE,
107
                self::STATE_IN_PROGRESS_NONE,
108
                self::STATE_POSTPONED_NONE,
109
                self::STATE_IN_PROGRESS_ACTIVE,
110
                self::STATE_IN_PROGRESS_INACTIVE,
111
                self::STATE_IN_PROGRESS_DELETED,
112
                self::STATE_NONE_ACTIVE,
113
                self::STATE_NONE_INACTIVE,
114
                self::STATE_NONE_DELETED
115
            ],
116
            "to" => [
117
                self::STATE_DISCARDED_NONE,
118
                self::STATE_DISCARDED_NONE,
119
                self::STATE_DISCARDED_NONE,
120
                self::STATE_NONE_DELETED,
121
                self::STATE_NONE_DELETED,
122
                self::STATE_NONE_DELETED,
123
                self::STATE_NONE_DELETED,
124
                self::STATE_NONE_DELETED,
125
                self::STATE_NONE_DELETED
126
            ]
127
        ],
128
        self::TRANSITION_POSTPONE => [
129
            "from" => [
130
                self::STATE_REGISTERED_NONE,
131
                self::STATE_IN_PROGRESS_NONE,
132
                self::STATE_DISCARDED_NONE,
133
                self::STATE_IN_PROGRESS_ACTIVE,
134
                self::STATE_IN_PROGRESS_DELETED,
135
                self::STATE_IN_PROGRESS_INACTIVE,
136
                self::STATE_NONE_ACTIVE,
137
                self::STATE_NONE_DELETED,
138
                self::STATE_NONE_INACTIVE
139
            ],
140
            "to" => [
141
                self::STATE_POSTPONED_NONE,
142
                self::STATE_POSTPONED_NONE,
143
                self::STATE_POSTPONED_NONE,
144
                self::STATE_NONE_INACTIVE,
145
                self::STATE_NONE_INACTIVE,
146
                self::STATE_NONE_INACTIVE,
147
                self::STATE_NONE_INACTIVE,
148
                self::STATE_NONE_INACTIVE,
149
                self::STATE_NONE_INACTIVE
150
            ]
151
        ],
152
        self::TRANSITION_RELEASE_PUBLISH => [
153
            "from" => [
154
                self::STATE_REGISTERED_NONE,
155
                self::STATE_IN_PROGRESS_NONE,
156
                self::STATE_DISCARDED_NONE,
157
                self::STATE_POSTPONED_NONE,
158
            ],
159
            "to" => self::STATE_NONE_ACTIVE
160
        ],
161
        self::TRANSITION_RELEASE_ACTIVATE => [
162
            "from" => [
163
                self::STATE_IN_PROGRESS_ACTIVE,
164
                self::STATE_IN_PROGRESS_INACTIVE,
165
                self::STATE_IN_PROGRESS_DELETED,
166
                self::STATE_NONE_ACTIVE,
167
                self::STATE_NONE_INACTIVE,
168
                self::STATE_NONE_DELETED
169
            ],
170
            "to" => self::STATE_NONE_ACTIVE
171
        ],
172
        self::TRANSITION_DELETE_LOCALLY => [
173
            "from" => [self::STATE_NEW_NONE],
174
            "to" => self::STATE_NONE_NONE
175
        ],
176
        self::TRANSITION_DELETE_DISCARDED => [
177
            "from" => [self::STATE_DISCARDED_NONE],
178
            "to" => self::STATE_NONE_NONE
179
        ],
180
        self::TRANSITION_DELETE_WORKING_COPY => [
181
            "from" => [self::STATE_IN_PROGRESS_ACTIVE, self::STATE_IN_PROGRESS_INACTIVE, self::STATE_IN_PROGRESS_DELETED],
182
            "to" => self::STATE_NONE_NONE
183
        ],
184
    ];
185
    
186
    public static function getWorkflow()
187
    {
188
        $definitionBuilder = new DefinitionBuilder();
189
190
        $definitionBuilder->addPlaces(self::PLACES);
191
192
        foreach (self::TRANSITIONS as $transitionName => $transition) {
193
            if (!empty($transition["from"]) && !empty($transition["to"])) {
194
                foreach ($transition["from"] as $key => $fromState) {
195
                    if (is_array($transition["to"])) {
196
                        $definitionBuilder->addTransition(
197
                            new Transition($transitionName, $fromState, $transition["to"][$key])
198
                        );
199
                    } else {
200
                        $definitionBuilder->addTransition(
201
                             new Transition($transitionName, $fromState, $transition["to"])
202
                        );
203
                    }
204
                }
205
            }
206
        }
207
208
        $definition = $definitionBuilder->build();
209
210
        $marking = new MethodMarkingStore(TRUE, 'state');
211
212
        return new Workflow($definition, $marking);
213
    }
214
215
}