Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.55% covered (success)
96.55%
28 / 29
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
DuplicationFormDTOTransformer
96.55% covered (success)
96.55%
28 / 29
75.00% covered (warning)
75.00%
3 / 4
12
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 toModelObject
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
5.01
 addTargetCollectivitiesPerCollectivity
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
 addTargetCollectivitiesPerType
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3declare(strict_types=1);
4
5namespace App\Domain\Admin\Transformer;
6
7use App\Domain\Admin\Dictionary\DuplicationTargetOptionDictionary;
8use App\Domain\Admin\DTO\DuplicationFormDTO;
9use App\Domain\Admin\Hydrator\DuplicationHydrator;
10use App\Domain\Admin\Model\DuplicatedObject;
11use App\Domain\Admin\Model\Duplication;
12use App\Domain\User\Repository as UserRepository;
13
14class DuplicationFormDTOTransformer
15{
16    /**
17     * @var UserRepository\Collectivity
18     */
19    private $collectivityRepository;
20
21    /**
22     * @var DuplicationHydrator
23     */
24    private $hydrator;
25
26    /**
27     * DuplicationDTOTransformer constructor.
28     */
29    public function __construct(
30        UserRepository\Collectivity $collectivityRepository,
31        DuplicationHydrator $hydrator,
32    ) {
33        $this->collectivityRepository = $collectivityRepository;
34        $this->hydrator               = $hydrator;
35    }
36
37    /**
38     * Transform a DuplicationFormDTO to a Duplication object model.
39     *
40     * @throws \Exception
41     */
42    public function toModelObject(DuplicationFormDTO $formDTO): Duplication
43    {
44        $model = new Duplication(
45            $formDTO->getType(),
46            $formDTO->getSourceCollectivity(),
47            []
48        );
49
50        foreach ($formDTO->getData() as $data) {
51            $model->addDataId($data);
52        }
53
54        switch ($formDTO->getTargetOption()) {
55            case DuplicationTargetOptionDictionary::KEY_PER_COLLECTIVITY:
56                $this->addTargetCollectivitiesPerCollectivity($formDTO, $model);
57                break;
58            case DuplicationTargetOptionDictionary::KEY_PER_TYPE:
59                $this->addTargetCollectivitiesPerType($formDTO, $model);
60                break;
61            default:
62                throw new \RuntimeException('Unable to read target collectivities for provided target option ' . $formDTO->getTargetOption());
63        }
64
65        $this->hydrator->hydrate($model);
66
67        return $model;
68    }
69
70    /**
71     * Add target collectivities formatted from "PER COLLECTIVITY" target options.
72     */
73    protected function addTargetCollectivitiesPerCollectivity(DuplicationFormDTO $formDTO, Duplication $model): void
74    {
75        foreach ($formDTO->getTargetCollectivities() as $collectivity) {
76            foreach ($model->getDataIds() as $id) {
77                $model->addDuplicatedObjet(new DuplicatedObject($model, $collectivity, $id));
78            }
79        }
80    }
81
82    /**
83     * Add target collectivities formatted from "PER TYPE" target options.
84     */
85    protected function addTargetCollectivitiesPerType(DuplicationFormDTO $formDTO, Duplication $model): void
86    {
87        $collectivities = $this->collectivityRepository->findByTypes(
88            $formDTO->getTargetCollectivityTypes(),
89            $formDTO->getSourceCollectivity()
90        );
91
92        foreach ($collectivities as $collectivity) {
93            foreach ($model->getDataIds() as $id) {
94                $model->addDuplicatedObjet(new DuplicatedObject($model, $collectivity, $id));
95            }
96        }
97    }
98}