Passed
Push — master ( cacbf1...74b6c9 )
by
unknown
34:14
created

expandOptionsWithSubmittedData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 2
dl 0
loc 16
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerFeature\Zed\SelfServicePortal\Communication\Asset\Form\DataProvider;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\CompanyBusinessUnitCriteriaFilterTransfer;
12
use Generated\Shared\Transfer\CompanyCriteriaFilterTransfer;
13
use Generated\Shared\Transfer\SspAssetConditionsTransfer;
14
use Generated\Shared\Transfer\SspAssetCriteriaTransfer;
15
use Generated\Shared\Transfer\SspAssetIncludeTransfer;
16
use Generated\Shared\Transfer\SspAssetTransfer;
17
use Spryker\Service\UtilText\Model\Url\Url;
18
use Spryker\Zed\Company\Business\CompanyFacadeInterface;
19
use Spryker\Zed\CompanyBusinessUnit\Business\CompanyBusinessUnitFacadeInterface;
20
use SprykerFeature\Zed\SelfServicePortal\Business\SelfServicePortalFacadeInterface;
21
use SprykerFeature\Zed\SelfServicePortal\Communication\Asset\Form\SspAssetForm;
22
use SprykerFeature\Zed\SelfServicePortal\SelfServicePortalConfig;
23
24
class SspAssetFormDataProvider
25
{
26
    /**
27
     * @uses \SprykerFeature\Yves\SelfServicePortal\Plugin\Router\SelfServicePortalPageRouteProviderPlugin::ROUTE_NAME_ASSET_VIEW_IMAGE
28
     *
29
     * @var string
30
     */
31
    protected const ROUTE_NAME_ASSET_VIEW_IMAGE = 'asset-image';
32
33
    public function __construct(
34
        protected SelfServicePortalFacadeInterface $sspAssetManagementFacade,
35
        protected SelfServicePortalConfig $config,
36
        protected CompanyBusinessUnitFacadeInterface $companyBusinessUnitFacade,
37
        protected CompanyFacadeInterface $companyFacade
38
    ) {
39
    }
40
41
    public function getData(int $sspAssetId): ?SspAssetTransfer
42
    {
43
        $sspAssetCollectionTransfer = $this->sspAssetManagementFacade->getSspAssetCollection(
44
            (new SspAssetCriteriaTransfer())
45
                ->setSspAssetConditions(
46
                    (new SspAssetConditionsTransfer())
47
                        ->addIdSspAsset($sspAssetId),
48
                )
49
                ->setInclude(
50
                    (new SspAssetIncludeTransfer())
51
                        ->setWithOwnerCompanyBusinessUnit(true)
52
                        ->setWithAssignedBusinessUnits(true),
53
                ),
54
        );
55
56
        if ($sspAssetCollectionTransfer->getSspAssets()->count() === 0) {
57
            return null;
58
        }
59
60
        return $sspAssetCollectionTransfer->getSspAssets()->getIterator()->current();
61
    }
62
63
    /**
64
     * @param \Generated\Shared\Transfer\SspAssetTransfer $sspAssetTransfer
65
     *
66
     * @return array<string, mixed>
67
     */
68
    public function getOptions(SspAssetTransfer $sspAssetTransfer): array
69
    {
70
        $assignedBusinessUnits = $this->getAssignedBusinessUnits($sspAssetTransfer->getBusinessUnitAssignments());
71
        $assignedCompanies = $this->getAssignedCompanies($sspAssetTransfer->getBusinessUnitAssignments());
72
73
        $companyBusinessUnitOwnerTransfer = $sspAssetTransfer->getCompanyBusinessUnit();
74
75
        return [
76
            SspAssetForm::OPTION_ORIGINAL_IMAGE_URL => $this->getAssetImageUrl($sspAssetTransfer),
77
            SspAssetForm::OPTION_COMPANY_ASSIGMENT_OPTIONS => $assignedCompanies,
78
            SspAssetForm::OPTION_BUSINESS_UNIT_ASSIGMENT_OPTIONS => $assignedBusinessUnits,
79
            SspAssetForm::OPTION_STATUS_OPTIONS => array_flip($this->config->getAssetStatuses()),
80
            SspAssetForm::OPTION_BUSINESS_UNIT_OWNER => $companyBusinessUnitOwnerTransfer ? [sprintf('%s - %s (ID: %s)', $companyBusinessUnitOwnerTransfer->getCompanyOrFail()->getNameOrFail(), $companyBusinessUnitOwnerTransfer->getNameOrFail(), $companyBusinessUnitOwnerTransfer->getIdCompanyBusinessUnitOrFail()) => $companyBusinessUnitOwnerTransfer->getIdCompanyBusinessUnitOrFail()] : [],
81
        ];
82
    }
83
84
    /**
85
     * @param array<string, mixed> $options
86
     * @param array<string, mixed> $submittedFormData
87
     *
88
     * @return array<string, mixed>
89
     */
90
    public function expandOptionsWithSubmittedData(array $options, array $submittedFormData): array
91
    {
92
        $assignedBusinessUnitIds = $this->extractAssignedBusinessUnitIds($submittedFormData);
93
        $businessUnitOwnerId = $this->extractAndValidateBusinessUnitOwnerId($submittedFormData, $assignedBusinessUnitIds);
94
95
        $assignedBusinessUnitOptions = $this->buildBusinessUnitOptions($assignedBusinessUnitIds);
96
        $assignedCompanyOptions = $this->buildCompanyOptions($submittedFormData);
97
        $businessUnitOwnerOptions = $this->buildBusinessUnitOwnerOptions($businessUnitOwnerId, $assignedBusinessUnitIds);
98
99
        $expandedFormOptions = [
100
            SspAssetForm::OPTION_BUSINESS_UNIT_ASSIGMENT_OPTIONS => $assignedBusinessUnitOptions,
101
            SspAssetForm::OPTION_BUSINESS_UNIT_OWNER => $businessUnitOwnerOptions,
102
            SspAssetForm::OPTION_COMPANY_ASSIGMENT_OPTIONS => $assignedCompanyOptions,
103
        ];
104
105
        return array_merge($options, $expandedFormOptions);
106
    }
107
108
    /**
109
     * @param array<string, mixed> $submittedFormData
110
     *
111
     * @return array<int>
112
     */
113
    protected function extractAssignedBusinessUnitIds(array $submittedFormData): array
114
    {
115
        if (!isset($submittedFormData[SspAssetForm::FIELD_ASSIGNED_BUSINESS_UNITS])) {
116
            return [];
117
        }
118
119
        return array_map('intval', $submittedFormData[SspAssetForm::FIELD_ASSIGNED_BUSINESS_UNITS]);
120
    }
121
122
    /**
123
     * @param array<string, mixed> $submittedFormData
124
     * @param array<int> $assignedBusinessUnitIds
125
     *
126
     * @return int|null
127
     */
128
    protected function extractAndValidateBusinessUnitOwnerId(array $submittedFormData, array $assignedBusinessUnitIds): ?int
129
    {
130
        if (!isset($submittedFormData[SspAssetForm::FIELD_BUSINESS_UNIT_OWNER])) {
131
            return null;
132
        }
133
134
        $businessUnitOwnerId = $submittedFormData[SspAssetForm::FIELD_BUSINESS_UNIT_OWNER];
135
136
        return in_array($businessUnitOwnerId, $assignedBusinessUnitIds) ? $businessUnitOwnerId : null;
137
    }
138
139
    /**
140
     * @param array<int> $assignedBusinessUnitIds
141
     *
142
     * @return array<string, int>
143
     */
144
    protected function buildBusinessUnitOptions(array $assignedBusinessUnitIds): array
145
    {
146
        if (!$assignedBusinessUnitIds) {
147
            return [];
148
        }
149
150
        $companyBusinessUnitCollectionTransfer = $this->companyBusinessUnitFacade->getCompanyBusinessUnitCollection(
151
            (new CompanyBusinessUnitCriteriaFilterTransfer())->setCompanyBusinessUnitIds($assignedBusinessUnitIds),
152
        );
153
154
        $assignedBusinessUnitOptions = [];
155
        foreach ($companyBusinessUnitCollectionTransfer->getCompanyBusinessUnits() as $companyBusinessUnitTransfer) {
156
            $assignedBusinessUnitOptions[sprintf(
157
                '%s - %s (ID: %s)',
158
                $companyBusinessUnitTransfer->getCompanyOrFail()->getNameOrFail(),
159
                $companyBusinessUnitTransfer->getNameOrFail(),
160
                $companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail(),
161
            )] = $companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail();
162
        }
163
164
        return $assignedBusinessUnitOptions;
165
    }
166
167
    /**
168
     * @param array<string, mixed> $submittedFormData
169
     *
170
     * @return array<string, int>
171
     */
172
    protected function buildCompanyOptions(array $submittedFormData): array
173
    {
174
        $assignedCompanyIds = [];
175
        if (isset($submittedFormData[SspAssetForm::FIELD_ASSIGNED_COMPANIES])) {
176
            $assignedCompanyIds = array_map('intval', $submittedFormData[SspAssetForm::FIELD_ASSIGNED_COMPANIES]);
177
        }
178
179
        if (!$assignedCompanyIds) {
180
            return [];
181
        }
182
183
        $companyCollectionTransfer = $this->companyFacade->getCompanyCollection(
184
            (new CompanyCriteriaFilterTransfer())->setCompanyIds($assignedCompanyIds),
185
        );
186
187
        $assignedCompanyOptions = [];
188
        foreach ($companyCollectionTransfer->getCompanies() as $companyTransfer) {
189
            $assignedCompanyOptions[sprintf(
190
                '%s (ID: %s)',
191
                $companyTransfer->getNameOrFail(),
192
                $companyTransfer->getIdCompanyOrFail(),
193
            )] = $companyTransfer->getIdCompanyOrFail();
194
        }
195
196
        return $assignedCompanyOptions;
197
    }
198
199
    /**
200
     * @param int|null $businessUnitOwnerId
201
     * @param array<int> $assignedBusinessUnitIds
202
     *
203
     * @return array<string, int>
204
     */
205
    protected function buildBusinessUnitOwnerOptions(?int $businessUnitOwnerId, array $assignedBusinessUnitIds): array
206
    {
207
        if (!$businessUnitOwnerId || !$assignedBusinessUnitIds) {
208
            return [];
209
        }
210
211
        $companyBusinessUnitCollectionTransfer = $this->companyBusinessUnitFacade->getCompanyBusinessUnitCollection(
212
            (new CompanyBusinessUnitCriteriaFilterTransfer())->setCompanyBusinessUnitIds($assignedBusinessUnitIds),
213
        );
214
215
        foreach ($companyBusinessUnitCollectionTransfer->getCompanyBusinessUnits() as $companyBusinessUnitTransfer) {
216
            if ($companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail() === $businessUnitOwnerId) {
217
                $businessUnitOwnerKey = sprintf(
218
                    '%s - %s (ID: %s)',
219
                    $companyBusinessUnitTransfer->getCompanyOrFail()->getNameOrFail(),
220
                    $companyBusinessUnitTransfer->getNameOrFail(),
221
                    $companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail(),
222
                );
223
224
                return [$businessUnitOwnerKey => $businessUnitOwnerId];
225
            }
226
        }
227
228
        return [];
229
    }
230
231
    public function getAssetImageUrl(SspAssetTransfer $sspAssetTransfer): ?string
232
    {
233
        if ($sspAssetTransfer->getImage()) {
234
            return Url::generate(static::ROUTE_NAME_ASSET_VIEW_IMAGE, ['ssp-asset-reference' => $sspAssetTransfer->getReferenceOrFail()])->build();
235
        }
236
237
        if ($sspAssetTransfer->getExternalImageUrl()) {
238
            return $sspAssetTransfer->getExternalImageUrl();
239
        }
240
241
        return null;
242
    }
243
244
    /**
245
     * @param \ArrayObject<\Generated\Shared\Transfer\SspAssetBusinessUnitAssignmentTransfer> $sspAssetAssignmentTransfers
246
     *
247
     * @return array<string, int>
248
     */
249
    protected function getAssignedBusinessUnits(ArrayObject $sspAssetAssignmentTransfers): array
250
    {
251
        $assignedBusinessUnits = [];
252
        foreach ($sspAssetAssignmentTransfers as $sspAssetAssignmentTransfer) {
253
            $companyBusinessUnitTransfer = $sspAssetAssignmentTransfer->getCompanyBusinessUnit();
254
            if ($companyBusinessUnitTransfer) {
255
                $assignedBusinessUnits[sprintf(
256
                    '%s - %s (ID: %s)',
257
                    $companyBusinessUnitTransfer->getCompanyOrFail()->getNameOrFail(),
258
                    $companyBusinessUnitTransfer->getNameOrFail(),
259
                    $companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail(),
260
                )] = $companyBusinessUnitTransfer->getIdCompanyBusinessUnitOrFail();
261
            }
262
        }
263
264
        return $assignedBusinessUnits;
265
    }
266
267
    /**
268
     * @param \ArrayObject<\Generated\Shared\Transfer\SspAssetBusinessUnitAssignmentTransfer> $sspAssetAssignmentTransfers
269
     *
270
     * @return array<string, int>
271
     */
272
    protected function getAssignedCompanies(ArrayObject $sspAssetAssignmentTransfers): array
273
    {
274
        $assignedCompanies = [];
275
        foreach ($sspAssetAssignmentTransfers as $sspAssetAssignmentTransfer) {
276
            $companyBusinessUnitTransfer = $sspAssetAssignmentTransfer->getCompanyBusinessUnit();
277
            if ($companyBusinessUnitTransfer) {
278
                $companyTransfer = $companyBusinessUnitTransfer->getCompanyOrFail();
279
280
                $assignedCompanies[sprintf(
281
                    '%s (ID: %s)',
282
                    $companyTransfer->getNameOrFail(),
283
                    $companyTransfer->getIdCompanyOrFail(),
284
                )] = $companyTransfer->getIdCompanyOrFail();
285
            }
286
        }
287
288
        return $assignedCompanies;
289
    }
290
}
291