StudyGroupFixtures::load()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 5
c 0
b 0
f 0
dl 0
loc 7
rs 10
ccs 0
cts 5
cp 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
3
namespace App\DataFixtures;
4
5
use App\Entity\Grade;
6
use App\Entity\Student;
7
use App\Entity\StudyGroup;
8
use App\Entity\StudyGroupMembership;
9
use App\Entity\StudyGroupType;
10
use Doctrine\Bundle\FixturesBundle\Fixture;
11
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
12
use Doctrine\Persistence\ObjectManager;
13
use Faker\Generator;
14
15
class StudyGroupFixtures extends Fixture implements DependentFixtureInterface {
16
17
    public function __construct(private Generator $generator)
18
    {
19
    }
20
21
    /**
22
     * @inheritDoc
23
     */
24
    public function load(ObjectManager $manager) {
25
        $this->loadGradeStudyGroups($manager);
26
        $this->loadInformatikAG($manager);
27
        $this->loadEFStudyGroups($manager);
28
        $this->loadQ1StudyGroups($manager);
29
30
        $manager->flush();
31
    }
32
33
    private function loadInformatikAG(ObjectManager $manager) {
34
        $studyGroup = (new StudyGroup())
35
            ->setName('Informatik AG')
36
            ->setExternalId('AG-IF')
37
            ->setType(StudyGroupType::Course);
38
39
        $grades = GradeFixtures::getSekIGradeNames();
40
        $agGrades = array_filter($grades, fn(string $name) => str_starts_with($name, '5'));
41
42
        $students = [ ];
43
44
        foreach($agGrades as $id => $gradeName) {
45
            $grade = $manager->getRepository(Grade::class)
46
                ->findOneBy([
47
                    'externalId'=> $id
48
                ]);
49
50
            $studyGroup->addGrade($grade);
51
52
            $gradeStudents = $manager->getRepository(Student::class)
53
                ->findBy([
54
                    'grade' => $grade
55
                ]);
56
57
            for($i = 0; $i < 8; $i++) {
58
                $students[] = $gradeStudents[$i];
59
            }
60
        }
61
62
        $manager->persist($studyGroup);
63
64
        // Memberships
65
        foreach($students as $student) {
66
            $membership = (new StudyGroupMembership())
67
                ->setStudent($student)
68
                ->setStudyGroup($studyGroup)
69
                ->setType('PUT');
70
71
            $manager->persist($membership);
72
        }
73
74
        $manager->persist($studyGroup);
75
    }
76
77
    private function loadEFStudyGroups(ObjectManager $manager) {
78
        $grade = $manager->getRepository(Grade::class)
79
            ->findOneBy(['externalId' => 'EF']);
80
81
        $students = $manager->getRepository(Student::class)
82
            ->findBy([
83
                'grade' => $grade
84
            ]);
85
86
        $subjects = [ 'M', 'D', 'E', 'IF', 'MU' ];
87
        $writtenSubjects = [ 'M', 'D', 'E'];
88
89
        foreach($subjects as $subject) {
90
            for ($courseNumber = 1; $courseNumber <= 3; $courseNumber++) {
91
                $name = sprintf('%s-GK%d', $subject, $courseNumber);
92
                $id = 'EF-' . $name;
93
94
                $studyGroup = (new StudyGroup())
95
                    ->setName($name)
96
                    ->setExternalId($id)
97
                    ->setType(StudyGroupType::Course);
98
99
                $studyGroup->addGrade($grade);
100
101
                $manager->persist($studyGroup);
102
103
                for ($studentIndex = $courseNumber - 1; $studentIndex < count($students); $studentIndex += 3) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
104
                    $type = in_array($subject, $writtenSubjects) ?
105
                        'GKS' :
106
                        ($this->generator->boolean ? 'GKS' : 'GKM');
107
108
                    $membership = (new StudyGroupMembership())
109
                        ->setStudyGroup($studyGroup)
110
                        ->setStudent($students[$studentIndex])
111
                        ->setType($type);
112
113
                    $studyGroup->getMemberships()
114
                        ->add($membership);
115
116
                    $manager->persist($membership);
117
                }
118
            }
119
        }
120
    }
121
122
    private function loadQ1StudyGroups(ObjectManager $manager) {
123
        $grade = $manager->getRepository(Grade::class)
124
            ->findOneBy(['externalId' => 'Q1']);
125
126
        $students = $manager->getRepository(Student::class)
127
            ->findBy([
128
                'grade' => $grade
129
            ]);
130
131
        $lkSubjects = [ 'M', 'D', 'E' ];
132
        $gkSubjects = [ 'IF', 'MU', 'L', 'F' ];
133
        $subjects = array_merge($lkSubjects, $gkSubjects);
134
135
        $studyGroups = [ ];
136
137
        foreach($subjects as $subject) {
138
            for($i = 1; $i <= 2; $i++) { // 2 Kurse pro Fach
139
                $name = sprintf(
140
                    '%s-%s%d',
141
                    $subject,
142
                    in_array($subject, $lkSubjects) ? 'LK' : 'GK',
143
                    $i
144
                );
145
                $id = 'Q1-' . $name;
146
147
                $studyGroup = (new StudyGroup())
148
                    ->setExternalId($id)
149
                    ->setName($name)
150
                    ->setType(StudyGroupType::Course);
151
                $studyGroup->addGrade($grade);
152
153
                $studyGroups[$id] = $studyGroup;
154
155
                $manager->persist($studyGroup);
156
            }
157
        }
158
159
        foreach($lkSubjects as $subject) { // Auch GKs erzeugen
160
            for($i = 1; $i <= 2; $i++) {
161
                $name = sprintf(
162
                    '%s-GK%d',
163
                    $subject,
164
                    $i
165
                );
166
                $id = 'Q1-' . $name;
167
168
                $studyGroup = (new StudyGroup())
169
                    ->setExternalId($id)
170
                    ->setName($name)
171
                    ->setType(StudyGroupType::Course);
172
                $studyGroup->addGrade($grade);
173
174
                $studyGroups[$id] = $studyGroup;
175
176
                $manager->persist($studyGroup);
177
            }
178
        }
179
180
        foreach($students as $student) {
181
            $appliedSubjects = [ ];
182
            $lks = $this->generator->randomElements($lkSubjects, 2);
0 ignored issues
show
Bug introduced by
The call to Faker\Generator::randomElements() has too few arguments starting with 'c']. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

182
            /** @scrutinizer ignore-call */ 
183
            $lks = $this->generator->randomElements($lkSubjects, 2);

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
183
184
            // LK1+LK2
185
            for($i = 0; $i < 2; $i++) {
186
                $id = sprintf(
187
                    'Q1-%s-LK%d',
188
                    $lks[$i],
189
                    $this->generator->numberBetween(1, 2)
190
                );
191
                $membership = (new StudyGroupMembership())
192
                    ->setStudyGroup($studyGroups[$id])
193
                    ->setStudent($student)
194
                    ->setType(sprintf('LK%d', $i + 1));
195
196
                $manager->persist($membership);
197
            }
198
199
            $appliedSubjects = array_merge($appliedSubjects, $lks);
200
            $availableSubjects = array_diff($subjects, $appliedSubjects);
201
            $gks = $this->generator->randomElements($availableSubjects, 2);
202
203
            for($i = 0; $i < 2; $i++) {
204
                $id = sprintf(
205
                    'Q1-%s-GK%d',
206
                    $gks[$i],
207
                    $this->generator->numberBetween(1, 2)
208
                );
209
210
                $membership = (new StudyGroupMembership())
211
                    ->setStudyGroup($studyGroups[$id])
212
                    ->setStudent($student)
213
                    ->setType(sprintf('ABI%d', $i + 3));
214
215
                $manager->persist($membership);
216
            }
217
218
            $appliedSubjects = array_merge($appliedSubjects, $gks);
219
            $availableSubjects = array_diff($subjects, $appliedSubjects);
220
            $leftOvers = $this->generator->randomElements($availableSubjects, 2);
221
222
            foreach($leftOvers as $subject) {
223
                $id = sprintf(
224
                    'Q1-%s-GK%d',
225
                    $subject,
226
                    $this->generator->numberBetween(1, 2)
227
                );
228
229
                $membership = (new StudyGroupMembership())
230
                    ->setStudyGroup($studyGroups[$id])
231
                    ->setStudent($student)
232
                    ->setType(
233
                        $this->generator->boolean ? 'GKS' : 'GKM'
234
                    );
235
236
                $manager->persist($membership);
237
            }
238
        }
239
    }
240
241
    private function loadGradeStudyGroups(ObjectManager $manager) {
242
        $grades = array_merge(
243
            GradeFixtures::getSekIGradeNames(),
244
            GradeFixtures::getSekIIGradeNames()
245
        );
246
247
        foreach($grades as $id => $name) {
248
            $studyGroup = (new StudyGroup())
249
                ->setName($name)
250
                ->setType(StudyGroupType::Grade)
251
                ->setExternalId($id);
252
253
            // Grade
254
            $grade = $manager->getRepository(Grade::class)
255
                ->findOneBy([
256
                    'externalId' => $id
257
                ]);
258
259
            $studyGroup->addGrade($grade);
260
            $manager->persist($studyGroup);
261
262
            // Memberships
263
            $students = $manager->getRepository(Student::class)
264
                ->findBy([
265
                    'grade' => $grade
266
                ]);
267
268
            foreach($students as $student) {
269
                $membership = (new StudyGroupMembership())
270
                    ->setStudyGroup($studyGroup)
271
                    ->setStudent($student)
272
                    ->setType('PUK');
273
274
                $manager->persist($membership);
275
            }
276
        }
277
    }
278
279
    /**
280
     * @inheritDoc
281
     */
282
    public function getDependencies() {
283
        return [
284
            GradeFixtures::class,
285
            SubjectFixtures::class,
286
            StudentFixtures::class
287
        ];
288
    }
289
}